• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.14.38 API Reference
  • KDE Home
  • Contact Us
 

KHTML

  • khtml
  • java
kjavaappletserver.cpp
Go to the documentation of this file.
1/* This file is part of the KDE project
2 *
3 * Copyright (C) 2000 Richard Moore <rich@kde.org>
4 * 2000 Wynn Wilkes <wynnw@caldera.com>
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
15 *
16 * You should have received a copy of the GNU Library General Public License
17 * along with this library; see the file COPYING.LIB. If not, write to
18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
20 */
21
22#include "kjavaappletserver.h"
23
24#include "kjavaappletcontext.h"
25#include "kjavaprocess.h"
26#include "kjavadownloader.h"
27
28#include <config.h>
29
30#include <kdebug.h>
31#include <kconfig.h>
32#include <kconfiggroup.h>
33#include <klocale.h>
34#include <kparts/browserextension.h>
35#include <kstandarddirs.h>
36
37#include <kio/job.h>
38#include <kio/kprotocolmanager.h>
39#include <ksslcertificate.h>
40#include <ksslcertchain.h>
41#include <kssl.h>
42
43#include <QtCore/QTimer>
44#include <QtCore/QPointer>
45#include <QtCore/QDir>
46#include <QtCore/QEventLoop>
47#include <QtGui/QApplication>
48#include <QtGui/QLabel>
49#include <QtGui/QDialog>
50#include <QtGui/QPushButton>
51#include <QtGui/QLayout>
52#include <QtCore/QRegExp>
53
54#include <stdlib.h>
55#include <assert.h>
56#include <QtCore/QAbstractEventDispatcher>
57
58#define KJAS_CREATE_CONTEXT (char)1
59#define KJAS_DESTROY_CONTEXT (char)2
60#define KJAS_CREATE_APPLET (char)3
61#define KJAS_DESTROY_APPLET (char)4
62#define KJAS_START_APPLET (char)5
63#define KJAS_STOP_APPLET (char)6
64#define KJAS_INIT_APPLET (char)7
65#define KJAS_SHOW_DOCUMENT (char)8
66#define KJAS_SHOW_URLINFRAME (char)9
67#define KJAS_SHOW_STATUS (char)10
68#define KJAS_RESIZE_APPLET (char)11
69#define KJAS_GET_URLDATA (char)12
70#define KJAS_URLDATA (char)13
71#define KJAS_SHUTDOWN_SERVER (char)14
72#define KJAS_JAVASCRIPT_EVENT (char)15
73#define KJAS_GET_MEMBER (char)16
74#define KJAS_CALL_MEMBER (char)17
75#define KJAS_PUT_MEMBER (char)18
76#define KJAS_DEREF_OBJECT (char)19
77#define KJAS_AUDIOCLIP_PLAY (char)20
78#define KJAS_AUDIOCLIP_LOOP (char)21
79#define KJAS_AUDIOCLIP_STOP (char)22
80#define KJAS_APPLET_STATE (char)23
81#define KJAS_APPLET_FAILED (char)24
82#define KJAS_DATA_COMMAND (char)25
83#define KJAS_PUT_URLDATA (char)26
84#define KJAS_PUT_DATA (char)27
85#define KJAS_SECURITY_CONFIRM (char)28
86#define KJAS_SHOW_CONSOLE (char)29
87
88
89class JSStackFrame;
90
91typedef QMap< int, KJavaKIOJob* > KIOJobMap;
92typedef QMap< int, JSStackFrame* > JSStack;
93
94class JSStackFrame {
95public:
96 JSStackFrame(JSStack & stack, QStringList & a)
97 : jsstack(stack), args(a), ticket(counter++), ready(false), exit (false) {
98 jsstack.insert( ticket, this );
99 }
100 ~JSStackFrame() {
101 jsstack.remove( ticket );
102 }
103 JSStack & jsstack;
104 QStringList & args;
105 int ticket;
106 bool ready : 1;
107 bool exit : 1;
108 static int counter;
109};
110
111int JSStackFrame::counter = 0;
112
113class KJavaAppletServerPrivate
114{
115friend class KJavaAppletServer;
116private:
117 KJavaAppletServerPrivate() : kssl( 0L ) {}
118 ~KJavaAppletServerPrivate() {
119 delete kssl;
120 }
121 int counter;
122 QMap< int, QPointer<KJavaAppletContext> > contexts;
123 QString appletLabel;
124 JSStack jsstack;
125 KIOJobMap kiojobs;
126 bool javaProcessFailed;
127 bool useKIO;
128 KSSL * kssl;
129 //int locked_context;
130 //QValueList<QByteArray> java_requests;
131};
132
133static KJavaAppletServer* self = 0;
134
135KJavaAppletServer::KJavaAppletServer()
136 : d(new KJavaAppletServerPrivate)
137{
138 process = new KJavaProcess();
139
140 connect( process, SIGNAL(received(QByteArray)),
141 this, SLOT(slotJavaRequest(QByteArray)) );
142
143 setupJava( process );
144
145 if( process->startJava() ) {
146 d->appletLabel = i18n( "Loading Applet" );
147 d->javaProcessFailed = false;
148 }
149 else {
150 d->appletLabel = i18n( "Error: java executable not found" );
151 d->javaProcessFailed = true;
152 }
153}
154
155KJavaAppletServer::~KJavaAppletServer()
156{
157 disconnect(process, 0, 0, 0); // first disconnect from process.
158 quit();
159
160 delete process;
161 process = 0;
162 delete d;
163}
164
165QString KJavaAppletServer::getAppletLabel()
166{
167 if( self )
168 return self->appletLabel();
169 else
170 return QString();
171}
172
173QString KJavaAppletServer::appletLabel()
174{
175 return d->appletLabel;
176}
177
178KJavaAppletServer* KJavaAppletServer::allocateJavaServer()
179{
180 if( self == 0 )
181 {
182 self = new KJavaAppletServer();
183 self->d->counter = 0;
184 }
185
186 ++(self->d->counter);
187 return self;
188}
189
190void KJavaAppletServer::freeJavaServer()
191{
192 --(self->d->counter);
193
194 if( self->d->counter == 0 )
195 {
196 //instead of immediately quitting here, set a timer to kill us
197 //if there are still no servers- give us one minute
198 //this is to prevent repeated loading and unloading of the jvm
199 KConfig config( "konquerorrc" );
200 KConfigGroup group = config.group( "Java/JavaScript Settings" );
201 if( group.readEntry( "ShutdownAppletServer", true ) )
202 {
203 const int value = group.readEntry( "AppletServerTimeout", 60 );
204 QTimer::singleShot( value*1000, self, SLOT(checkShutdown()) );
205 }
206 }
207}
208
209void KJavaAppletServer::checkShutdown()
210{
211 if( self->d->counter == 0 )
212 {
213 delete self;
214 self = 0;
215 }
216}
217
218void KJavaAppletServer::setupJava( KJavaProcess *p )
219{
220 KConfig configFile ( "konquerorrc" );
221 KConfigGroup config(&configFile, "Java/JavaScript Settings" );
222
223 QString jvm_path = "java";
224
225 QString jPath = config.readPathEntry( "JavaPath", QString() );
226 if ( !jPath.isEmpty() && jPath != "java" )
227 {
228 // Cut off trailing slash if any
229 if( jPath[jPath.length()-1] == '/' )
230 jPath.remove(jPath.length()-1, 1);
231
232 QDir dir( jPath );
233 if( dir.exists( "bin/java" ) )
234 {
235 jvm_path = jPath + "/bin/java";
236 }
237 else if (dir.exists( "/jre/bin/java" ) )
238 {
239 jvm_path = jPath + "/jre/bin/java";
240 }
241 else if( QFile::exists(jPath) )
242 {
243 //check here to see if they entered the whole path the java exe
244 jvm_path = jPath;
245 }
246 }
247
248 //check to see if jvm_path is valid and set d->appletLabel accordingly
249 p->setJVMPath( jvm_path );
250
251 // Prepare classpath variable
252 QString kjava_class = KStandardDirs::locate("data", "kjava/kjava.jar");
253 kDebug(6100) << "kjava_class = " << kjava_class;
254 if( kjava_class.isNull() ) // Should not happen
255 return;
256
257 QDir dir( kjava_class );
258 dir.cdUp();
259 kDebug(6100) << "dir = " << dir.absolutePath();
260
261 const QStringList entries = dir.entryList(QDir::nameFiltersFromString( "*.jar" ));
262 kDebug(6100) << "entries = " << entries.join( ":" );
263
264 QString classes;
265 {
266 QStringList::ConstIterator it = entries.begin();
267 const QStringList::ConstIterator itEnd = entries.end();
268 for( ; it != itEnd; ++it )
269 {
270 if( !classes.isEmpty() )
271 classes += ':';
272 classes += dir.absoluteFilePath( *it );
273 }
274 }
275 p->setClasspath( classes );
276
277 // Fix all the extra arguments
278 const QString extraArgs = config.readEntry( "JavaArgs" );
279 p->setExtraArgs( extraArgs );
280
281 if( config.readEntry( "UseSecurityManager", true ) )
282 {
283 QString class_file = KStandardDirs::locate( "data", "kjava/kjava.policy" );
284 p->setSystemProperty( "java.security.policy", class_file );
285
286 p->setSystemProperty( "java.security.manager",
287 "org.kde.kjas.server.KJASSecurityManager" );
288 }
289
290 d->useKIO = config.readEntry("UseKio", false);
291 if( d->useKIO )
292 {
293 p->setSystemProperty( "kjas.useKio", QString() );
294 }
295
296 //check for http proxies...
297 if( KProtocolManager::useProxy() )
298 {
299 // only proxyForUrl honors automatic proxy scripts
300 // we do not know the applet url here so we just use a dummy url
301 // this is a workaround for now
302 // FIXME
303 const KUrl dummyURL( "http://www.kde.org/" );
304 const QString httpProxy = KProtocolManager::proxyForUrl(dummyURL);
305 kDebug(6100) << "httpProxy is " << httpProxy;
306
307 const KUrl url( httpProxy );
308 p->setSystemProperty( "http.proxyHost", url.host() );
309 p->setSystemProperty( "http.proxyPort", QString::number( url.port() ) );
310 }
311
312 //set the main class to run
313 p->setMainClass( "org.kde.kjas.server.Main" );
314}
315
316void KJavaAppletServer::createContext( int contextId, KJavaAppletContext* context )
317{
318// kDebug(6100) << "createContext: " << contextId;
319 if ( d->javaProcessFailed ) return;
320
321 d->contexts.insert( contextId, context );
322
323 QStringList args;
324 args.append( QString::number( contextId ) );
325 process->send( KJAS_CREATE_CONTEXT, args );
326}
327
328void KJavaAppletServer::destroyContext( int contextId )
329{
330// kDebug(6100) << "destroyContext: " << contextId;
331 if ( d->javaProcessFailed ) return;
332 d->contexts.remove( contextId );
333
334 QStringList args;
335 args.append( QString::number( contextId ) );
336 process->send( KJAS_DESTROY_CONTEXT, args );
337}
338
339bool KJavaAppletServer::createApplet( int contextId, int appletId,
340 const QString & name, const QString & clazzName,
341 const QString & baseURL, const QString & user,
342 const QString & password, const QString & authname,
343 const QString & codeBase, const QString & jarFile,
344 QSize size, const QMap<QString,QString>& params,
345 const QString & windowTitle )
346{
347// kDebug(6100) << "createApplet: contextId = " << contextId << endl
348// << " appletId = " << appletId << endl
349// << " name = " << name << endl
350// << " clazzName = " << clazzName << endl
351// << " baseURL = " << baseURL << endl
352// << " codeBase = " << codeBase << endl
353// << " jarFile = " << jarFile << endl
354// << " width = " << size.width() << endl
355// << " height = " << size.height() << endl;
356
357 if ( d->javaProcessFailed ) return false;
358
359 QStringList args;
360 args.append( QString::number( contextId ) );
361 args.append( QString::number( appletId ) );
362
363 //it's ok if these are empty strings, I take care of it later...
364 args.append( name );
365 args.append( clazzName );
366 args.append( baseURL );
367 args.append( user );
368 args.append( password );
369 args.append( authname );
370 args.append( codeBase );
371 args.append( jarFile );
372
373 args.append( QString::number( size.width() ) );
374 args.append( QString::number( size.height() ) );
375
376 args.append( windowTitle );
377
378 //add on the number of parameter pairs...
379 const int num = params.count();
380 const QString num_params = QString("%1").arg( num, 8 );
381 args.append( num_params );
382
383 QMap< QString, QString >::ConstIterator it = params.begin();
384 const QMap< QString, QString >::ConstIterator itEnd = params.end();
385
386 for( ; it != itEnd; ++it )
387 {
388 args.append( it.key() );
389 args.append( it.value() );
390 }
391
392 process->send( KJAS_CREATE_APPLET, args );
393
394 return true;
395}
396
397void KJavaAppletServer::initApplet( int contextId, int appletId )
398{
399 if ( d->javaProcessFailed ) return;
400 QStringList args;
401 args.append( QString::number( contextId ) );
402 args.append( QString::number( appletId ) );
403
404 process->send( KJAS_INIT_APPLET, args );
405}
406
407void KJavaAppletServer::destroyApplet( int contextId, int appletId )
408{
409 if ( d->javaProcessFailed ) return;
410 QStringList args;
411 args.append( QString::number(contextId) );
412 args.append( QString::number(appletId) );
413
414 process->send( KJAS_DESTROY_APPLET, args );
415}
416
417void KJavaAppletServer::startApplet( int contextId, int appletId )
418{
419 if ( d->javaProcessFailed ) return;
420 QStringList args;
421 args.append( QString::number(contextId) );
422 args.append( QString::number(appletId) );
423
424 process->send( KJAS_START_APPLET, args );
425}
426
427void KJavaAppletServer::stopApplet( int contextId, int appletId )
428{
429 if ( d->javaProcessFailed ) return;
430 QStringList args;
431 args.append( QString::number(contextId) );
432 args.append( QString::number(appletId) );
433
434 process->send( KJAS_STOP_APPLET, args );
435}
436
437void KJavaAppletServer::showConsole() {
438 if ( d->javaProcessFailed ) return;
439 QStringList args;
440 process->send( KJAS_SHOW_CONSOLE, args );
441}
442
443void KJavaAppletServer::sendURLData( int loaderID, int code, const QByteArray& data )
444{
445 QStringList args;
446 args.append( QString::number(loaderID) );
447 args.append( QString::number(code) );
448
449 process->send( KJAS_URLDATA, args, data );
450}
451
452void KJavaAppletServer::removeDataJob( int loaderID )
453{
454 const KIOJobMap::iterator it = d->kiojobs.find( loaderID );
455 if (it != d->kiojobs.end()) {
456 it.value()->deleteLater();
457 d->kiojobs.erase( it );
458 }
459}
460
461void KJavaAppletServer::quit()
462{
463 const QStringList args;
464
465 process->send( KJAS_SHUTDOWN_SERVER, args );
466 process->waitForFinished( 10000 );
467}
468
469void KJavaAppletServer::slotJavaRequest( const QByteArray& qb )
470{
471 // qb should be one command only without the length string,
472 // we parse out the command and it's meaning here...
473 QString cmd;
474 QStringList args;
475 int index = 0;
476 const int qb_size = qb.size();
477
478 //get the command code
479 const char cmd_code = qb[ index++ ];
480 ++index; //skip the next sep
481
482 //get contextID
483 QString contextID;
484 while( index < qb_size && qb[index] != 0 )
485 {
486 contextID += qb[ index++ ];
487 }
488 bool ok;
489 const int ID_num = contextID.toInt( &ok ); // context id or kio job id
490 /*if (d->locked_context > -1 &&
491 ID_num != d->locked_context &&
492 (cmd_code == KJAS_JAVASCRIPT_EVENT ||
493 cmd_code == KJAS_APPLET_STATE ||
494 cmd_code == KJAS_APPLET_FAILED))
495 {
496 / * Don't allow requests from other contexts if we're waiting
497 * on a return value that can trigger JavaScript events
498 * /
499 d->java_requests.push_back(qb);
500 return;
501 }*/
502 ++index; //skip the sep
503
504 if (cmd_code == KJAS_PUT_DATA) {
505 // rest of the data is for kio put
506 if (ok) {
507 KIOJobMap::iterator it = d->kiojobs.find( ID_num );
508 if (ok && it != d->kiojobs.end()) {
509 QByteArray qba;
510 qba = QByteArray::fromRawData(qb.data() + index, qb.size() - index - 1);
511 it.value()->data(qba);
512 qba = QByteArray::fromRawData(qb.data() + index, qb.size() - index - 1);
513 }
514 kDebug(6100) << "PutData(" << ID_num << ") size=" << qb.size() - index;
515 } else
516 kError(6100) << "PutData error " << ok << endl;
517 return;
518 }
519 //now parse out the arguments
520 while( index < qb_size )
521 {
522 int sep_pos = qb.indexOf( (char) 0, index );
523 if (sep_pos < 0) {
524 kError(6100) << "Missing separation byte" << endl;
525 sep_pos = qb_size;
526 }
527 //kDebug(6100) << "KJavaAppletServer::slotJavaRequest: "<< QString::fromLocal8Bit( qb.data() + index, sep_pos - index );
528 args.append( QString::fromLocal8Bit( qb.data() + index, sep_pos - index ) );
529 index = sep_pos + 1; //skip the sep
530 }
531 //here I should find the context and call the method directly
532 //instead of emitting signals
533 switch( cmd_code )
534 {
535 case KJAS_SHOW_DOCUMENT:
536 cmd = QLatin1String( "showdocument" );
537 break;
538
539 case KJAS_SHOW_URLINFRAME:
540 cmd = QLatin1String( "showurlinframe" );
541 break;
542
543 case KJAS_SHOW_STATUS:
544 cmd = QLatin1String( "showstatus" );
545 break;
546
547 case KJAS_RESIZE_APPLET:
548 cmd = QLatin1String( "resizeapplet" );
549 break;
550
551 case KJAS_GET_URLDATA:
552 if (ok && !args.empty() ) {
553 d->kiojobs.insert(ID_num, new KJavaDownloader(ID_num, args.first()));
554 kDebug(6100) << "GetURLData(" << ID_num << ") url=" << args.first();
555 } else
556 kError(6100) << "GetURLData error " << ok << " args:" << args.size() << endl;
557 return;
558 case KJAS_PUT_URLDATA:
559 if (ok && !args.empty()) {
560 KJavaUploader* const job = new KJavaUploader(ID_num, args.first());
561 d->kiojobs.insert(ID_num, job);
562 job->start();
563 kDebug(6100) << "PutURLData(" << ID_num << ") url=" << args.first();
564 } else
565 kError(6100) << "PutURLData error " << ok << " args:" << args.size() << endl;
566 return;
567 case KJAS_DATA_COMMAND:
568 if (ok && !args.empty()) {
569 const int cmd = args.first().toInt( &ok );
570 KIOJobMap::iterator it = d->kiojobs.find( ID_num );
571 if (ok && it != d->kiojobs.end())
572 it.value()->jobCommand( cmd );
573 kDebug(6100) << "KIO Data command: " << ID_num << " " << args.first();
574 } else
575 kError(6100) << "KIO Data command error " << ok << " args:" << args.size() << endl;
576 return;
577 case KJAS_JAVASCRIPT_EVENT:
578 cmd = QLatin1String( "JS_Event" );
579
580 if(!args.empty()) {
581 kDebug(6100) << "Javascript request: "<< contextID
582 << " code: " << args[0] << endl;
583 } else {
584 kError(6100) << "Expected args not to be empty!" << endl;
585 }
586
587 break;
588 case KJAS_GET_MEMBER:
589 case KJAS_PUT_MEMBER:
590 case KJAS_CALL_MEMBER: {
591 if(!args.empty()) {
592 const int ticket = args[0].toInt();
593 JSStack::iterator it = d->jsstack.find(ticket);
594 if (it != d->jsstack.end()) {
595 kDebug(6100) << "slotJavaRequest: " << ticket;
596 args.pop_front();
597 it.value()->args.operator=(args); // just in case ..
598 it.value()->ready = true;
599 it.value()->exit = true;
600 } else
601 kDebug(6100) << "Error: Missed return member data";
602 } else {
603 kError(6100) << "Expected args not to be empty!" << endl;
604 }
605 return;
606 }
607 case KJAS_AUDIOCLIP_PLAY:
608 cmd = QLatin1String( "audioclip_play" );
609 if(!args.empty())
610 kDebug(6100) << "Audio Play: url=" << args[0];
611 else
612 kError(6100) << "Expected args not to be empty!" << endl;
613
614 break;
615 case KJAS_AUDIOCLIP_LOOP:
616 cmd = QLatin1String( "audioclip_loop" );
617 if(!args.empty())
618 kDebug(6100) << "Audio Loop: url=" << args[0];
619 else
620 kError(6100) << "Expected args not to be empty!" << endl;
621
622 break;
623 case KJAS_AUDIOCLIP_STOP:
624 cmd = QLatin1String( "audioclip_stop" );
625 if(!args.empty())
626 kDebug(6100) << "Audio Stop: url=" << args[0];
627 else
628 kError(6100) << "Expected args not to be empty!" << endl;
629
630 break;
631 case KJAS_APPLET_STATE:
632 if(args.size() > 1)
633 kDebug(6100) << "Applet State Notification for Applet " << args[0] << ". New state=" << args[1];
634 else
635 kError(6100) << "Expected args not to be empty!" << endl;
636
637 cmd = QLatin1String( "AppletStateNotification" );
638 break;
639 case KJAS_APPLET_FAILED:
640 if(args.size() > 1)
641 kDebug(6100) << "Applet " << args[0] << " Failed: " << args[1];
642 else
643 kError(6100) << "Expected args not to be empty!" << endl;
644
645 cmd = QLatin1String( "AppletFailed" );
646 break;
647 case KJAS_SECURITY_CONFIRM: {
648 if (KSSL::doesSSLWork() && !d->kssl)
649 d->kssl = new KSSL;
650 QStringList sl;
651 QString answer( "invalid" );
652
653 if (!d->kssl) {
654 answer = "nossl";
655 } else if (args.size() > 2) {
656 const int certsnr = args[1].toInt();
657 Q_ASSERT(args.size() > certsnr + 1);
658 QString text;
659 QList<KSSLCertificate *> certs;
660 for (int i = certsnr - 1; i >= 0; --i) {
661 const QByteArray &arg = args[i + 2].toLatin1();
662 KSSLCertificate * cert = KSSLCertificate::fromString(arg.constData());
663 if (cert) {
664 certs.prepend(cert);
665 if (cert->isSigner())
666 text += i18n("Signed by (validation: %1)", KSSLCertificate::verifyText(cert->validate()));
667 else
668 text += i18n("Certificate (validation: %1)", KSSLCertificate::verifyText(cert->validate()));
669 text += "\n";
670 QString subject = cert->getSubject() + QChar('\n');
671 QRegExp reg(QString("/[A-Z]+="));
672 int pos = 0;
673 while ((pos = subject.indexOf(reg, pos)) > -1)
674 subject.replace(pos, 1, QString("\n "));
675 text += subject.mid(1);
676 }
677 }
678 kDebug(6100) << "Security confirm " << args.first() << certs.count();
679 if ( !certs.isEmpty() ) {
680 KSSLCertChain chain;
681 chain.setChain( certs );
682 if ( chain.isValid() )
683 answer = PermissionDialog( qApp->activeWindow() ).exec( text, args[0] );
684 }
685 qDeleteAll(certs);
686 }
687 sl.push_front( answer );
688 sl.push_front( QString::number(ID_num) );
689 process->send( KJAS_SECURITY_CONFIRM, sl );
690 return;
691 }
692 default:
693 return;
694 break;
695 }
696
697
698 if( !ok )
699 {
700 kError(6100) << "could not parse out contextID to call command on" << endl;
701 return;
702 }
703
704 KJavaAppletContext* const context = d->contexts[ ID_num ];
705 if( context )
706 context->processCmd( cmd, args );
707 else if (cmd != "AppletStateNotification")
708 kError(6100) << "no context object for this id" << endl;
709}
710
711void KJavaAppletServer::killTimers()
712{
713 QAbstractEventDispatcher::instance()->unregisterTimers(this);
714}
715
716void KJavaAppletServer::endWaitForReturnData() {
717 kDebug(6100) << "KJavaAppletServer::endWaitForReturnData";
718 killTimers();
719 JSStack::iterator it = d->jsstack.begin();
720 JSStack::iterator itEnd = d->jsstack.end();
721 for (; it != itEnd; ++it)
722 it.value()->exit = true;
723}
724
725void KJavaAppletServer::timerEvent(QTimerEvent *) {
726 endWaitForReturnData();
727 kDebug(6100) << "KJavaAppletServer::timerEvent timeout";
728}
729
730void KJavaAppletServer::waitForReturnData(JSStackFrame * frame) {
731 kDebug(6100) << ">KJavaAppletServer::waitForReturnData";
732 killTimers();
733 startTimer(15000);
734 while (!frame->exit) {
735 QAbstractEventDispatcher::instance()->processEvents (QEventLoop::AllEvents | QEventLoop::WaitForMoreEvents);
736 }
737 if (d->jsstack.size() <= 1)
738 killTimers();
739 kDebug(6100) << "<KJavaAppletServer::waitForReturnData stacksize:" << d->jsstack.size();
740}
741
742bool KJavaAppletServer::getMember(QStringList & args, QStringList & ret_args) {
743 JSStackFrame frame( d->jsstack, ret_args );
744 args.push_front( QString::number(frame.ticket) );
745
746 process->send( KJAS_GET_MEMBER, args );
747 waitForReturnData( &frame );
748
749 return frame.ready;
750}
751
752bool KJavaAppletServer::putMember( QStringList & args ) {
753 QStringList ret_args;
754 JSStackFrame frame( d->jsstack, ret_args );
755 args.push_front( QString::number(frame.ticket) );
756
757 process->send( KJAS_PUT_MEMBER, args );
758 waitForReturnData( &frame );
759
760 return frame.ready && ret_args.count() > 0 && ret_args[0].toInt();
761}
762
763bool KJavaAppletServer::callMember(QStringList & args, QStringList & ret_args) {
764 JSStackFrame frame( d->jsstack, ret_args );
765 args.push_front( QString::number(frame.ticket) );
766
767 process->send( KJAS_CALL_MEMBER, args );
768 waitForReturnData( &frame );
769
770 return frame.ready;
771}
772
773void KJavaAppletServer::derefObject( QStringList & args ) {
774 process->send( KJAS_DEREF_OBJECT, args );
775}
776
777bool KJavaAppletServer::usingKIO() {
778 return d->useKIO;
779}
780
781
782PermissionDialog::PermissionDialog( QWidget* parent )
783 : QObject(parent), m_button("no")
784{}
785
786QString PermissionDialog::exec( const QString & cert, const QString & perm ) {
787 QPointer<QDialog> dialog = new QDialog( static_cast<QWidget*>(parent()) );
788
789 dialog->setObjectName("PermissionDialog");
790 QSizePolicy sizeplcy( QSizePolicy::Minimum, QSizePolicy::Minimum);
791 sizeplcy.setHeightForWidth(dialog->sizePolicy().hasHeightForWidth());
792 dialog->setSizePolicy(sizeplcy);
793 dialog->setModal( true );
794 dialog->setWindowTitle( i18n("Security Alert") );
795
796 QVBoxLayout* const dialogLayout = new QVBoxLayout( dialog );
797 dialogLayout->setObjectName("dialogLayout");
798
799 dialogLayout->addWidget( new QLabel( i18n("Do you grant Java applet with certificate(s):"), dialog ) );
800 dialogLayout->addWidget( new QLabel( cert, dialog ) );
801 dialogLayout->addWidget( new QLabel( i18n("the following permission"), dialog ) );
802 dialogLayout->addWidget( new QLabel( perm, dialog ) );
803 QSpacerItem* const spacer2 = new QSpacerItem( 20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding );
804 dialogLayout->addItem( spacer2 );
805
806 QHBoxLayout* const buttonLayout = new QHBoxLayout();
807 buttonLayout->setMargin(0);
808 buttonLayout->setObjectName("buttonLayout");
809
810 QPushButton* const no = new QPushButton( i18n("&No"), dialog );
811 no->setObjectName( "no" );
812 no->setDefault( true );
813 buttonLayout->addWidget( no );
814
815 QPushButton* const reject = new QPushButton( i18n("&Reject All"), dialog );
816 reject->setObjectName( "reject" );
817 buttonLayout->addWidget( reject );
818
819 QPushButton* const yes = new QPushButton( i18n("&Yes"), dialog );
820 yes->setObjectName( "yes" );
821 buttonLayout->addWidget( yes );
822
823 QPushButton* const grant = new QPushButton( i18n("&Grant All"), dialog );
824 grant->setObjectName( "grant" );
825 buttonLayout->addWidget( grant );
826 dialogLayout->addLayout( buttonLayout );
827 dialog->resize( dialog->minimumSizeHint() );
828 //clearWState( WState_Polished );
829
830 connect( no, SIGNAL(clicked()), this, SLOT(clicked()) );
831 connect( reject, SIGNAL(clicked()), this, SLOT(clicked()) );
832 connect( yes, SIGNAL(clicked()), this, SLOT(clicked()) );
833 connect( grant, SIGNAL(clicked()), this, SLOT(clicked()) );
834
835 dialog->exec();
836 delete dialog;
837
838 return m_button;
839}
840
841PermissionDialog::~PermissionDialog()
842{}
843
844void PermissionDialog::clicked()
845{
846 m_button = sender()->objectName();
847 static_cast<const QWidget*>(sender())->parentWidget()->close();
848}
849
850#include "kjavaappletserver.moc"
browserextension.h
KConfigGroup
KConfig
KJavaAppletContext
Definition: kjavaappletcontext.h:46
KJavaAppletContext::processCmd
void processCmd(QString cmd, QStringList args)
use this for applet call backs, the AppletServer calls this directly.
Definition: kjavaappletcontext.cpp:131
KJavaAppletServer
Definition: kjavaappletserver.h:43
KJavaAppletServer::checkShutdown
void checkShutdown()
Definition: kjavaappletserver.cpp:209
KJavaAppletServer::usingKIO
bool usingKIO()
Definition: kjavaappletserver.cpp:777
KJavaAppletServer::setupJava
void setupJava(KJavaProcess *p)
Definition: kjavaappletserver.cpp:218
KJavaAppletServer::freeJavaServer
static void freeJavaServer()
When you are done using your reference to the AppletServer, you must dereference it by calling freeJa...
Definition: kjavaappletserver.cpp:190
KJavaAppletServer::endWaitForReturnData
void endWaitForReturnData()
Definition: kjavaappletserver.cpp:716
KJavaAppletServer::getAppletLabel
static QString getAppletLabel()
This allows the KJavaAppletWidget to display some feedback in a QLabel while the applet is being load...
Definition: kjavaappletserver.cpp:165
KJavaAppletServer::process
KJavaProcess * process
Definition: kjavaappletserver.h:151
KJavaAppletServer::quit
void quit()
Shut down the KJAS server.
Definition: kjavaappletserver.cpp:461
KJavaAppletServer::callMember
bool callMember(QStringList &args, QStringList &ret_args)
Definition: kjavaappletserver.cpp:763
KJavaAppletServer::killTimers
void killTimers()
Definition: kjavaappletserver.cpp:711
KJavaAppletServer::createContext
void createContext(int contextId, KJavaAppletContext *context)
Create an applet context with the specified id.
Definition: kjavaappletserver.cpp:316
KJavaAppletServer::removeDataJob
void removeDataJob(int loaderID)
Removes KJavaDownloader from the list (deletes it too).
Definition: kjavaappletserver.cpp:452
KJavaAppletServer::waitForReturnData
void waitForReturnData(JSStackFrame *)
Definition: kjavaappletserver.cpp:730
KJavaAppletServer::allocateJavaServer
static KJavaAppletServer * allocateJavaServer()
A factory method that returns the default server.
Definition: kjavaappletserver.cpp:178
KJavaAppletServer::derefObject
void derefObject(QStringList &args)
Definition: kjavaappletserver.cpp:773
KJavaAppletServer::putMember
bool putMember(QStringList &args)
Definition: kjavaappletserver.cpp:752
KJavaAppletServer::createApplet
bool createApplet(int contextId, int appletId, const QString &name, const QString &clazzName, const QString &baseURL, const QString &user, const QString &password, const QString &authname, const QString &codeBase, const QString &jarFile, QSize size, const QMap< QString, QString > &params, const QString &windowTitle)
Create an applet in the specified context with the specified id.
Definition: kjavaappletserver.cpp:339
KJavaAppletServer::appletLabel
QString appletLabel()
Definition: kjavaappletserver.cpp:173
KJavaAppletServer::destroyApplet
void destroyApplet(int contextId, int appletId)
Destroy an applet in the specified context with the specified id.
Definition: kjavaappletserver.cpp:407
KJavaAppletServer::sendURLData
void sendURLData(int loaderID, int code, const QByteArray &data)
Send data we got back from a KJavaDownloader back to the appropriate class loader.
Definition: kjavaappletserver.cpp:443
KJavaAppletServer::initApplet
void initApplet(int contextId, int appletId)
This should be called by the KJavaAppletWidget.
Definition: kjavaappletserver.cpp:397
KJavaAppletServer::~KJavaAppletServer
~KJavaAppletServer()
Definition: kjavaappletserver.cpp:155
KJavaAppletServer::startApplet
void startApplet(int contextId, int appletId)
Start the specified applet.
Definition: kjavaappletserver.cpp:417
KJavaAppletServer::timerEvent
void timerEvent(QTimerEvent *)
Definition: kjavaappletserver.cpp:725
KJavaAppletServer::slotJavaRequest
void slotJavaRequest(const QByteArray &qb)
Definition: kjavaappletserver.cpp:469
KJavaAppletServer::stopApplet
void stopApplet(int contextId, int appletId)
Stop the specified applet.
Definition: kjavaappletserver.cpp:427
KJavaAppletServer::KJavaAppletServer
KJavaAppletServer()
Create the applet server.
Definition: kjavaappletserver.cpp:135
KJavaAppletServer::showConsole
void showConsole()
Show java console.
Definition: kjavaappletserver.cpp:437
KJavaAppletServer::getMember
bool getMember(QStringList &args, QStringList &ret_args)
Definition: kjavaappletserver.cpp:742
KJavaAppletServer::destroyContext
void destroyContext(int contextId)
Destroy the applet context with the specified id.
Definition: kjavaappletserver.cpp:328
KJavaDownloader
Definition: kjavadownloader.h:54
KJavaProcess
Definition: kjavaprocess.h:42
KJavaProcess::setClasspath
void setClasspath(const QString &classpath)
This will set the classpath the Java process will use.
Definition: kjavaprocess.cpp:91
KJavaProcess::setJVMPath
void setJVMPath(const QString &path)
Used to specify the path to the Java executable to be run.
Definition: kjavaprocess.cpp:86
KJavaProcess::send
void send(char cmd_code, const QStringList &args)
Sends a command to the KJAS Applet Server by building a QByteArray out of the data,...
Definition: kjavaprocess.cpp:164
KJavaProcess::setMainClass
void setMainClass(const QString &clazzName)
The class to be called when startJava() is called.
Definition: kjavaprocess.cpp:102
KJavaProcess::setSystemProperty
void setSystemProperty(const QString &name, const QString &value)
Set a property on the java command line as -Dname=value, or -Dname if value is QString().
Definition: kjavaprocess.cpp:96
KJavaProcess::startJava
bool startJava()
Invoke the JVM with the parameters that have been set.
Definition: kjavaprocess.cpp:76
KJavaProcess::setExtraArgs
void setExtraArgs(const QString &args)
Extra flags passed to the JVM.
Definition: kjavaprocess.cpp:107
KJavaUploader
Definition: kjavadownloader.h:74
KJavaUploader::start
void start()
Definition: kjavadownloader.cpp:211
KProtocolManager::useProxy
static bool useProxy()
KProtocolManager::proxyForUrl
static QString proxyForUrl(const KUrl &url)
KSSLCertChain
KSSLCertChain::isValid
bool isValid()
KSSLCertChain::setChain
void setChain(const QList< KSSLCertificate * > &chain)
KSSLCertificate
KSSLCertificate::verifyText
static QString verifyText(KSSLValidation x)
KSSLCertificate::getSubject
QString getSubject() const
KSSLCertificate::validate
KSSLValidation validate()
KSSLCertificate::fromString
static KSSLCertificate * fromString(const QByteArray &cert)
KSSLCertificate::isSigner
bool isSigner()
KSSL
KSSL::doesSSLWork
static bool doesSSLWork()
KStandardDirs::locate
static QString locate(const char *type, const QString &filename, const KComponentData &cData=KGlobal::mainComponent())
KUrl
PermissionDialog
Definition: kjavaappletserver.h:166
PermissionDialog::~PermissionDialog
~PermissionDialog()
Definition: kjavaappletserver.cpp:841
PermissionDialog::exec
QString exec(const QString &cert, const QString &perm)
Definition: kjavaappletserver.cpp:786
PermissionDialog::PermissionDialog
PermissionDialog(QWidget *)
Definition: kjavaappletserver.cpp:782
QDialog
QLabel
QList
QMap
QObject
QPushButton
QWidget
kDebug
#define kDebug
job.h
kconfig.h
kconfiggroup.h
kdebug.h
d
#define d
Definition: khtmlfind.cpp:42
kjavaappletcontext.h
KJAS_GET_MEMBER
#define KJAS_GET_MEMBER
Definition: kjavaappletserver.cpp:73
KJAS_APPLET_STATE
#define KJAS_APPLET_STATE
Definition: kjavaappletserver.cpp:80
KJAS_DESTROY_CONTEXT
#define KJAS_DESTROY_CONTEXT
Definition: kjavaappletserver.cpp:59
KJAS_CREATE_CONTEXT
#define KJAS_CREATE_CONTEXT
Definition: kjavaappletserver.cpp:58
KJAS_PUT_DATA
#define KJAS_PUT_DATA
Definition: kjavaappletserver.cpp:84
KJAS_DATA_COMMAND
#define KJAS_DATA_COMMAND
Definition: kjavaappletserver.cpp:82
JSStack
QMap< int, JSStackFrame * > JSStack
Definition: kjavaappletserver.cpp:92
KJAS_SHOW_CONSOLE
#define KJAS_SHOW_CONSOLE
Definition: kjavaappletserver.cpp:86
KJAS_SHOW_DOCUMENT
#define KJAS_SHOW_DOCUMENT
Definition: kjavaappletserver.cpp:65
KJAS_PUT_MEMBER
#define KJAS_PUT_MEMBER
Definition: kjavaappletserver.cpp:75
KJAS_RESIZE_APPLET
#define KJAS_RESIZE_APPLET
Definition: kjavaappletserver.cpp:68
KJAS_DESTROY_APPLET
#define KJAS_DESTROY_APPLET
Definition: kjavaappletserver.cpp:61
KJAS_GET_URLDATA
#define KJAS_GET_URLDATA
Definition: kjavaappletserver.cpp:69
KJAS_SHUTDOWN_SERVER
#define KJAS_SHUTDOWN_SERVER
Definition: kjavaappletserver.cpp:71
KJAS_AUDIOCLIP_LOOP
#define KJAS_AUDIOCLIP_LOOP
Definition: kjavaappletserver.cpp:78
self
static KJavaAppletServer * self
Definition: kjavaappletserver.cpp:133
KJAS_AUDIOCLIP_PLAY
#define KJAS_AUDIOCLIP_PLAY
Definition: kjavaappletserver.cpp:77
KJAS_APPLET_FAILED
#define KJAS_APPLET_FAILED
Definition: kjavaappletserver.cpp:81
KJAS_DEREF_OBJECT
#define KJAS_DEREF_OBJECT
Definition: kjavaappletserver.cpp:76
KJAS_SHOW_STATUS
#define KJAS_SHOW_STATUS
Definition: kjavaappletserver.cpp:67
KJAS_AUDIOCLIP_STOP
#define KJAS_AUDIOCLIP_STOP
Definition: kjavaappletserver.cpp:79
KJAS_PUT_URLDATA
#define KJAS_PUT_URLDATA
Definition: kjavaappletserver.cpp:83
KJAS_INIT_APPLET
#define KJAS_INIT_APPLET
Definition: kjavaappletserver.cpp:64
KJAS_SECURITY_CONFIRM
#define KJAS_SECURITY_CONFIRM
Definition: kjavaappletserver.cpp:85
KIOJobMap
QMap< int, KJavaKIOJob * > KIOJobMap
Definition: kjavaappletserver.cpp:91
KJAS_CALL_MEMBER
#define KJAS_CALL_MEMBER
Definition: kjavaappletserver.cpp:74
KJAS_STOP_APPLET
#define KJAS_STOP_APPLET
Definition: kjavaappletserver.cpp:63
KJAS_JAVASCRIPT_EVENT
#define KJAS_JAVASCRIPT_EVENT
Definition: kjavaappletserver.cpp:72
KJAS_SHOW_URLINFRAME
#define KJAS_SHOW_URLINFRAME
Definition: kjavaappletserver.cpp:66
KJAS_CREATE_APPLET
#define KJAS_CREATE_APPLET
Definition: kjavaappletserver.cpp:60
KJAS_URLDATA
#define KJAS_URLDATA
Definition: kjavaappletserver.cpp:70
KJAS_START_APPLET
#define KJAS_START_APPLET
Definition: kjavaappletserver.cpp:62
kjavaappletserver.h
kjavadownloader.h
kjavaprocess.h
klocale.h
i18n
QString i18n(const char *text)
kprotocolmanager.h
kssl.h
ksslcertchain.h
ksslcertificate.h
kstandarddirs.h
config
KSharedConfigPtr config()
group
group
dir
QString dir(const QString &fileClass)
name
const char * name(StandardAction id)
yes
KGuiItem yes()
no
KGuiItem no()
ok
KGuiItem ok()
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KHTML

Skip menu "KHTML"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdelibs-4.14.38 API Reference

Skip menu "kdelibs-4.14.38 API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal