00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <config.h>
00023 #include "kjavaappletserver.h"
00024 #include "kjavaappletcontext.h"
00025 #include "kjavaprocess.h"
00026 #include "kjavadownloader.h"
00027
00028 #include <kdebug.h>
00029 #include <kconfig.h>
00030 #include <klocale.h>
00031 #include <kparts/browserextension.h>
00032 #include <kapplication.h>
00033 #include <kstandarddirs.h>
00034
00035 #include <kio/job.h>
00036 #include <kio/kprotocolmanager.h>
00037 #include <ksslcertificate.h>
00038 #include <ksslcertchain.h>
00039 #include <kssl.h>
00040
00041 #include <qtimer.h>
00042 #include <qguardedptr.h>
00043 #include <qvaluelist.h>
00044 #include <qptrlist.h>
00045 #include <qdir.h>
00046 #include <qeventloop.h>
00047 #include <qapplication.h>
00048 #include <qlabel.h>
00049 #include <qdialog.h>
00050 #include <qpushbutton.h>
00051 #include <qlayout.h>
00052 #include <qregexp.h>
00053
00054 #include <stdlib.h>
00055 #include <assert.h>
00056
00057 #define KJAS_CREATE_CONTEXT (char)1
00058 #define KJAS_DESTROY_CONTEXT (char)2
00059 #define KJAS_CREATE_APPLET (char)3
00060 #define KJAS_DESTROY_APPLET (char)4
00061 #define KJAS_START_APPLET (char)5
00062 #define KJAS_STOP_APPLET (char)6
00063 #define KJAS_INIT_APPLET (char)7
00064 #define KJAS_SHOW_DOCUMENT (char)8
00065 #define KJAS_SHOW_URLINFRAME (char)9
00066 #define KJAS_SHOW_STATUS (char)10
00067 #define KJAS_RESIZE_APPLET (char)11
00068 #define KJAS_GET_URLDATA (char)12
00069 #define KJAS_URLDATA (char)13
00070 #define KJAS_SHUTDOWN_SERVER (char)14
00071 #define KJAS_JAVASCRIPT_EVENT (char)15
00072 #define KJAS_GET_MEMBER (char)16
00073 #define KJAS_CALL_MEMBER (char)17
00074 #define KJAS_PUT_MEMBER (char)18
00075 #define KJAS_DEREF_OBJECT (char)19
00076 #define KJAS_AUDIOCLIP_PLAY (char)20
00077 #define KJAS_AUDIOCLIP_LOOP (char)21
00078 #define KJAS_AUDIOCLIP_STOP (char)22
00079 #define KJAS_APPLET_STATE (char)23
00080 #define KJAS_APPLET_FAILED (char)24
00081 #define KJAS_DATA_COMMAND (char)25
00082 #define KJAS_PUT_URLDATA (char)26
00083 #define KJAS_PUT_DATA (char)27
00084 #define KJAS_SECURITY_CONFIRM (char)28
00085
00086
00087 class JSStackFrame;
00088
00089 typedef QMap< int, KJavaKIOJob* > KIOJobMap;
00090 typedef QMap< int, JSStackFrame* > JSStack;
00091
00092 class JSStackFrame {
00093 public:
00094 JSStackFrame(JSStack & stack, QStringList & a)
00095 : jsstack(stack), args(a), ticket(counter++), ready(false), exit (false) {
00096 jsstack.insert( ticket, this );
00097 }
00098 ~JSStackFrame() {
00099 jsstack.erase( ticket );
00100 }
00101 JSStack & jsstack;
00102 QStringList & args;
00103 int ticket;
00104 bool ready : 1;
00105 bool exit : 1;
00106 static int counter;
00107 };
00108
00109 int JSStackFrame::counter = 0;
00110
00111 class KJavaAppletServerPrivate
00112 {
00113 friend class KJavaAppletServer;
00114 private:
00115 KJavaAppletServerPrivate() : kssl( 0L ) {}
00116 ~KJavaAppletServerPrivate() {
00117 delete kssl;
00118 }
00119 int counter;
00120 QMap< int, QGuardedPtr<KJavaAppletContext> > contexts;
00121 QString appletLabel;
00122 JSStack jsstack;
00123 KIOJobMap kiojobs;
00124 bool javaProcessFailed;
00125 bool useKIO;
00126 KSSL * kssl;
00127
00128
00129 };
00130
00131 static KJavaAppletServer* self = 0;
00132
00133 KJavaAppletServer::KJavaAppletServer()
00134 {
00135 d = new KJavaAppletServerPrivate;
00136 process = new KJavaProcess();
00137
00138 connect( process, SIGNAL(received(const QByteArray&)),
00139 this, SLOT(slotJavaRequest(const QByteArray&)) );
00140
00141 setupJava( process );
00142
00143 if( process->startJava() ) {
00144 d->appletLabel = i18n( "Loading Applet" );
00145 d->javaProcessFailed = false;
00146 }
00147 else {
00148 d->appletLabel = i18n( "Error: java executable not found" );
00149 d->javaProcessFailed = true;
00150 }
00151 }
00152
00153 KJavaAppletServer::~KJavaAppletServer()
00154 {
00155 quit();
00156
00157 delete process;
00158 delete d;
00159 }
00160
00161 QString KJavaAppletServer::getAppletLabel()
00162 {
00163 if( self )
00164 return self->appletLabel();
00165 else
00166 return QString::null;
00167 }
00168
00169 QString KJavaAppletServer::appletLabel()
00170 {
00171 return d->appletLabel;
00172 }
00173
00174 KJavaAppletServer* KJavaAppletServer::allocateJavaServer()
00175 {
00176 if( self == 0 )
00177 {
00178 self = new KJavaAppletServer();
00179 self->d->counter = 0;
00180 }
00181
00182 ++(self->d->counter);
00183 return self;
00184 }
00185
00186 void KJavaAppletServer::freeJavaServer()
00187 {
00188 --(self->d->counter);
00189
00190 if( self->d->counter == 0 )
00191 {
00192
00193
00194
00195 KConfig config( "konquerorrc", true );
00196 config.setGroup( "Java/JavaScript Settings" );
00197 if( config.readBoolEntry( "ShutdownAppletServer", true ) )
00198 {
00199 const int value = config.readNumEntry( "AppletServerTimeout", 60 );
00200 QTimer::singleShot( value*1000, self, SLOT( checkShutdown() ) );
00201 }
00202 }
00203 }
00204
00205 void KJavaAppletServer::checkShutdown()
00206 {
00207 if( self->d->counter == 0 )
00208 {
00209 delete self;
00210 self = 0;
00211 }
00212 }
00213
00214 void KJavaAppletServer::setupJava( KJavaProcess *p )
00215 {
00216 KConfig config ( "konquerorrc", true );
00217 config.setGroup( "Java/JavaScript Settings" );
00218
00219 QString jvm_path = "java";
00220
00221 QString jPath = config.readPathEntry( "JavaPath" );
00222 if ( !jPath.isEmpty() && jPath != "java" )
00223 {
00224
00225 if( jPath[jPath.length()-1] == '/' )
00226 jPath.remove(jPath.length()-1, 1);
00227
00228 QDir dir( jPath );
00229 if( dir.exists( "bin/java" ) )
00230 {
00231 jvm_path = jPath + "/bin/java";
00232 }
00233 else if (dir.exists( "/jre/bin/java" ) )
00234 {
00235 jvm_path = jPath + "/jre/bin/java";
00236 }
00237 else if( QFile::exists(jPath) )
00238 {
00239
00240 jvm_path = jPath;
00241 }
00242 }
00243
00244
00245 p->setJVMPath( jvm_path );
00246
00247
00248 QString kjava_class = locate("data", "kjava/kjava.jar");
00249 kdDebug(6100) << "kjava_class = " << kjava_class << endl;
00250 if( kjava_class.isNull() )
00251 return;
00252
00253 QDir dir( kjava_class );
00254 dir.cdUp();
00255 kdDebug(6100) << "dir = " << dir.absPath() << endl;
00256
00257 const QStringList entries = dir.entryList( "*.jar" );
00258 kdDebug(6100) << "entries = " << entries.join( ":" ) << endl;
00259
00260 QString classes;
00261 {
00262 QStringList::ConstIterator it = entries.begin();
00263 const QStringList::ConstIterator itEnd = entries.end();
00264 for( ; it != itEnd; ++it )
00265 {
00266 if( !classes.isEmpty() )
00267 classes += ":";
00268 classes += dir.absFilePath( *it );
00269 }
00270 }
00271 p->setClasspath( classes );
00272
00273
00274 const QString extraArgs = config.readEntry( "JavaArgs" );
00275 p->setExtraArgs( extraArgs );
00276
00277 if( config.readBoolEntry( "ShowJavaConsole", false) )
00278 {
00279 p->setSystemProperty( "kjas.showConsole", QString::null );
00280 }
00281
00282 if( config.readBoolEntry( "UseSecurityManager", true ) )
00283 {
00284 QString class_file = locate( "data", "kjava/kjava.policy" );
00285 p->setSystemProperty( "java.security.policy", class_file );
00286
00287 p->setSystemProperty( "java.security.manager",
00288 "org.kde.kjas.server.KJASSecurityManager" );
00289 }
00290
00291 d->useKIO = config.readBoolEntry( "UseKio", false);
00292 if( d->useKIO )
00293 {
00294 p->setSystemProperty( "kjas.useKio", QString::null );
00295 }
00296
00297
00298 if( KProtocolManager::useProxy() )
00299 {
00300
00301
00302
00303
00304 const KURL dummyURL( "http://www.kde.org/" );
00305 const QString httpProxy = KProtocolManager::proxyForURL(dummyURL);
00306 kdDebug(6100) << "httpProxy is " << httpProxy << endl;
00307
00308 const KURL url( httpProxy );
00309 p->setSystemProperty( "http.proxyHost", url.host() );
00310 p->setSystemProperty( "http.proxyPort", QString::number( url.port() ) );
00311 }
00312
00313
00314 p->setMainClass( "org.kde.kjas.server.Main" );
00315 }
00316
00317 void KJavaAppletServer::createContext( int contextId, KJavaAppletContext* context )
00318 {
00319
00320 if ( d->javaProcessFailed ) return;
00321
00322 d->contexts.insert( contextId, context );
00323
00324 QStringList args;
00325 args.append( QString::number( contextId ) );
00326 process->send( KJAS_CREATE_CONTEXT, args );
00327 }
00328
00329 void KJavaAppletServer::destroyContext( int contextId )
00330 {
00331
00332 if ( d->javaProcessFailed ) return;
00333 d->contexts.remove( contextId );
00334
00335 QStringList args;
00336 args.append( QString::number( contextId ) );
00337 process->send( KJAS_DESTROY_CONTEXT, args );
00338 }
00339
00340 bool KJavaAppletServer::createApplet( int contextId, int appletId,
00341 const QString & name, const QString & clazzName,
00342 const QString & baseURL, const QString & user,
00343 const QString & password, const QString & authname,
00344 const QString & codeBase, const QString & jarFile,
00345 QSize size, const QMap<QString,QString>& params,
00346 const QString & windowTitle )
00347 {
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358 if ( d->javaProcessFailed ) return false;
00359
00360 QStringList args;
00361 args.append( QString::number( contextId ) );
00362 args.append( QString::number( appletId ) );
00363
00364
00365 args.append( name );
00366 args.append( clazzName );
00367 args.append( baseURL );
00368 args.append( user );
00369 args.append( password );
00370 args.append( authname );
00371 args.append( codeBase );
00372 args.append( jarFile );
00373
00374 args.append( QString::number( size.width() ) );
00375 args.append( QString::number( size.height() ) );
00376
00377 args.append( windowTitle );
00378
00379
00380 const int num = params.count();
00381 const QString num_params = QString("%1").arg( num, 8 );
00382 args.append( num_params );
00383
00384 QMap< QString, QString >::ConstIterator it = params.begin();
00385 const QMap< QString, QString >::ConstIterator itEnd = params.end();
00386
00387 for( ; it != itEnd; ++it )
00388 {
00389 args.append( it.key() );
00390 args.append( it.data() );
00391 }
00392
00393 process->send( KJAS_CREATE_APPLET, args );
00394
00395 return true;
00396 }
00397
00398 void KJavaAppletServer::initApplet( int contextId, int appletId )
00399 {
00400 if ( d->javaProcessFailed ) return;
00401 QStringList args;
00402 args.append( QString::number( contextId ) );
00403 args.append( QString::number( appletId ) );
00404
00405 process->send( KJAS_INIT_APPLET, args );
00406 }
00407
00408 void KJavaAppletServer::destroyApplet( int contextId, int appletId )
00409 {
00410 if ( d->javaProcessFailed ) return;
00411 QStringList args;
00412 args.append( QString::number(contextId) );
00413 args.append( QString::number(appletId) );
00414
00415 process->send( KJAS_DESTROY_APPLET, args );
00416 }
00417
00418 void KJavaAppletServer::startApplet( int contextId, int appletId )
00419 {
00420 if ( d->javaProcessFailed ) return;
00421 QStringList args;
00422 args.append( QString::number(contextId) );
00423 args.append( QString::number(appletId) );
00424
00425 process->send( KJAS_START_APPLET, args );
00426 }
00427
00428 void KJavaAppletServer::stopApplet( int contextId, int appletId )
00429 {
00430 if ( d->javaProcessFailed ) return;
00431 QStringList args;
00432 args.append( QString::number(contextId) );
00433 args.append( QString::number(appletId) );
00434
00435 process->send( KJAS_STOP_APPLET, args );
00436 }
00437
00438 void KJavaAppletServer::sendURLData( int loaderID, int code, const QByteArray& data )
00439 {
00440 QStringList args;
00441 args.append( QString::number(loaderID) );
00442 args.append( QString::number(code) );
00443
00444 process->send( KJAS_URLDATA, args, data );
00445 }
00446
00447 void KJavaAppletServer::removeDataJob( int loaderID )
00448 {
00449 const KIOJobMap::iterator it = d->kiojobs.find( loaderID );
00450 if (it != d->kiojobs.end()) {
00451 it.data()->deleteLater();
00452 d->kiojobs.erase( it );
00453 }
00454 }
00455
00456 void KJavaAppletServer::quit()
00457 {
00458 const QStringList args;
00459
00460 process->send( KJAS_SHUTDOWN_SERVER, args );
00461 process->flushBuffers();
00462 process->wait( 10 );
00463 }
00464
00465 void KJavaAppletServer::slotJavaRequest( const QByteArray& qb )
00466 {
00467
00468
00469 QString cmd;
00470 QStringList args;
00471 int index = 0;
00472 const int qb_size = qb.size();
00473
00474
00475 const char cmd_code = qb[ index++ ];
00476 ++index;
00477
00478
00479 QString contextID;
00480 while( qb[index] != 0 && index < qb_size )
00481 {
00482 contextID += qb[ index++ ];
00483 }
00484 bool ok;
00485 const int ID_num = contextID.toInt( &ok );
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498 ++index;
00499
00500 if (cmd_code == KJAS_PUT_DATA) {
00501
00502 if (ok) {
00503 KIOJobMap::iterator it = d->kiojobs.find( ID_num );
00504 if (ok && it != d->kiojobs.end()) {
00505 QByteArray qba;
00506 qba.setRawData(qb.data() + index, qb.size() - index - 1);
00507 it.data()->data(qba);
00508 qba.resetRawData(qb.data() + index, qb.size() - index - 1);
00509 }
00510 kdDebug(6100) << "PutData(" << ID_num << ") size=" << qb.size() - index << endl;
00511 } else
00512 kdError(6100) << "PutData error " << ok << endl;
00513 return;
00514 }
00515
00516 while( index < qb_size )
00517 {
00518 int sep_pos = qb.find( 0, index );
00519 if (sep_pos < 0) {
00520 kdError(6100) << "Missing separation byte" << endl;
00521 sep_pos = qb_size;
00522 }
00523
00524 args.append( QString::fromLocal8Bit( qb.data() + index, sep_pos - index ) );
00525 index = sep_pos + 1;
00526 }
00527
00528
00529 switch( cmd_code )
00530 {
00531 case KJAS_SHOW_DOCUMENT:
00532 cmd = QString::fromLatin1( "showdocument" );
00533 break;
00534
00535 case KJAS_SHOW_URLINFRAME:
00536 cmd = QString::fromLatin1( "showurlinframe" );
00537 break;
00538
00539 case KJAS_SHOW_STATUS:
00540 cmd = QString::fromLatin1( "showstatus" );
00541 break;
00542
00543 case KJAS_RESIZE_APPLET:
00544 cmd = QString::fromLatin1( "resizeapplet" );
00545 break;
00546
00547 case KJAS_GET_URLDATA:
00548 if (ok && !args.empty() ) {
00549 d->kiojobs.insert(ID_num, new KJavaDownloader(ID_num, args.first()));
00550 kdDebug(6100) << "GetURLData(" << ID_num << ") url=" << args.first() << endl;
00551 } else
00552 kdError(6100) << "GetURLData error " << ok << " args:" << args.size() << endl;
00553 return;
00554 case KJAS_PUT_URLDATA:
00555 if (ok && !args.empty()) {
00556 KJavaUploader* const job = new KJavaUploader(ID_num, args.first());
00557 d->kiojobs.insert(ID_num, job);
00558 job->start();
00559 kdDebug(6100) << "PutURLData(" << ID_num << ") url=" << args.first() << endl;
00560 } else
00561 kdError(6100) << "PutURLData error " << ok << " args:" << args.size() << endl;
00562 return;
00563 case KJAS_DATA_COMMAND:
00564 if (ok && !args.empty()) {
00565 const int cmd = args.first().toInt( &ok );
00566 KIOJobMap::iterator it = d->kiojobs.find( ID_num );
00567 if (ok && it != d->kiojobs.end())
00568 it.data()->jobCommand( cmd );
00569 kdDebug(6100) << "KIO Data command: " << ID_num << " " << args.first() << endl;
00570 } else
00571 kdError(6100) << "KIO Data command error " << ok << " args:" << args.size() << endl;
00572 return;
00573 case KJAS_JAVASCRIPT_EVENT:
00574 cmd = QString::fromLatin1( "JS_Event" );
00575 kdDebug(6100) << "Javascript request: "<< contextID
00576 << " code: " << args[0] << endl;
00577 break;
00578 case KJAS_GET_MEMBER:
00579 case KJAS_PUT_MEMBER:
00580 case KJAS_CALL_MEMBER: {
00581 const int ticket = args[0].toInt();
00582 JSStack::iterator it = d->jsstack.find(ticket);
00583 if (it != d->jsstack.end()) {
00584 kdDebug(6100) << "slotJavaRequest: " << ticket << endl;
00585 args.pop_front();
00586 it.data()->args.operator=(args);
00587 it.data()->ready = true;
00588 it.data()->exit = true;
00589 } else
00590 kdDebug(6100) << "Error: Missed return member data" << endl;
00591 return;
00592 }
00593 case KJAS_AUDIOCLIP_PLAY:
00594 cmd = QString::fromLatin1( "audioclip_play" );
00595 kdDebug(6100) << "Audio Play: url=" << args[0] << endl;
00596 break;
00597 case KJAS_AUDIOCLIP_LOOP:
00598 cmd = QString::fromLatin1( "audioclip_loop" );
00599 kdDebug(6100) << "Audio Loop: url=" << args[0] << endl;
00600 break;
00601 case KJAS_AUDIOCLIP_STOP:
00602 cmd = QString::fromLatin1( "audioclip_stop" );
00603 kdDebug(6100) << "Audio Stop: url=" << args[0] << endl;
00604 break;
00605 case KJAS_APPLET_STATE:
00606 kdDebug(6100) << "Applet State Notification for Applet " << args[0] << ". New state=" << args[1] << endl;
00607 cmd = QString::fromLatin1( "AppletStateNotification" );
00608 break;
00609 case KJAS_APPLET_FAILED:
00610 kdDebug(6100) << "Applet " << args[0] << " Failed: " << args[1] << endl;
00611 cmd = QString::fromLatin1( "AppletFailed" );
00612 break;
00613 case KJAS_SECURITY_CONFIRM: {
00614 if (KSSL::doesSSLWork() && !d->kssl)
00615 d->kssl = new KSSL;
00616 QStringList sl;
00617 QCString answer( "invalid" );
00618
00619 if (!d->kssl) {
00620 answer = "nossl";
00621 } else if (args.size() > 2) {
00622 const int certsnr = args[1].toInt();
00623 QString text;
00624 QPtrList<KSSLCertificate> certs;
00625 certs.setAutoDelete( true );
00626 for (int i = certsnr; i >= 0; --i) {
00627 KSSLCertificate * cert = KSSLCertificate::fromString(args[i+2].ascii());
00628 if (cert) {
00629 certs.prepend(cert);
00630 if (cert->isSigner())
00631 text += i18n("Signed by (validation: ");
00632 else
00633 text += i18n("Certificate (validation: ");
00634 switch (cert->validate()) {
00635 case KSSLCertificate::Ok:
00636 text += i18n("Ok"); break;
00637 case KSSLCertificate::NoCARoot:
00638 text += i18n("NoCARoot"); break;
00639 case KSSLCertificate::InvalidPurpose:
00640 text += i18n("InvalidPurpose"); break;
00641 case KSSLCertificate::PathLengthExceeded:
00642 text += i18n("PathLengthExceeded"); break;
00643 case KSSLCertificate::InvalidCA:
00644 text += i18n("InvalidCA"); break;
00645 case KSSLCertificate::Expired:
00646 text += i18n("Expired"); break;
00647 case KSSLCertificate::SelfSigned:
00648 text += i18n("SelfSigned"); break;
00649 case KSSLCertificate::ErrorReadingRoot:
00650 text += i18n("ErrorReadingRoot"); break;
00651 case KSSLCertificate::Revoked:
00652 text += i18n("Revoked"); break;
00653 case KSSLCertificate::Untrusted:
00654 text += i18n("Untrusted"); break;
00655 case KSSLCertificate::SignatureFailed:
00656 text += i18n("SignatureFailed"); break;
00657 case KSSLCertificate::Rejected:
00658 text += i18n("Rejected"); break;
00659 case KSSLCertificate::PrivateKeyFailed:
00660 text += i18n("PrivateKeyFailed"); break;
00661 case KSSLCertificate::InvalidHost:
00662 text += i18n("InvalidHost"); break;
00663 case KSSLCertificate::Unknown:
00664 default:
00665 text += i18n("Unknown"); break;
00666 }
00667 text += QString(")\n");
00668 QString subject = cert->getSubject() + QChar('\n');
00669 QRegExp reg(QString("/[A-Z]+="));
00670 int pos = 0;
00671 while ((pos = subject.find(reg, pos)) > -1)
00672 subject.replace(pos, 1, QString("\n "));
00673 text += subject.mid(1);
00674 }
00675 }
00676 kdDebug(6100) << "Security confirm " << args.first() << certs.count() << endl;
00677 if ( !certs.isEmpty() ) {
00678 KSSLCertChain chain;
00679 chain.setChain( certs );
00680 if ( chain.isValid() )
00681 answer = PermissionDialog( qApp->activeWindow() ).exec( text, args[0] );
00682 }
00683 }
00684 sl.push_front( QString(answer) );
00685 sl.push_front( QString::number(ID_num) );
00686 process->send( KJAS_SECURITY_CONFIRM, sl );
00687 return;
00688 }
00689 default:
00690 return;
00691 break;
00692 }
00693
00694
00695 if( !ok )
00696 {
00697 kdError(6100) << "could not parse out contextID to call command on" << endl;
00698 return;
00699 }
00700
00701 KJavaAppletContext* const context = d->contexts[ ID_num ];
00702 if( context )
00703 context->processCmd( cmd, args );
00704 else if (cmd != "AppletStateNotification")
00705 kdError(6100) << "no context object for this id" << endl;
00706 }
00707
00708 void KJavaAppletServer::endWaitForReturnData() {
00709 kdDebug(6100) << "KJavaAppletServer::endWaitForReturnData" << endl;
00710 killTimers();
00711 JSStack::iterator it = d->jsstack.begin();
00712 JSStack::iterator itEnd = d->jsstack.end();
00713 for (; it != itEnd; ++it)
00714 it.data()->exit = true;
00715 }
00716
00717 void KJavaAppletServer::timerEvent(QTimerEvent *) {
00718 endWaitForReturnData();
00719 kdDebug(6100) << "KJavaAppletServer::timerEvent timeout" << endl;
00720 }
00721
00722 void KJavaAppletServer::waitForReturnData(JSStackFrame * frame) {
00723 kdDebug(6100) << ">KJavaAppletServer::waitForReturnData" << endl;
00724 killTimers();
00725 startTimer(15000);
00726 while (!frame->exit)
00727 kapp->eventLoop()->processEvents (QEventLoop::AllEvents | QEventLoop::WaitForMore);
00728 if (d->jsstack.size() <= 1)
00729 killTimers();
00730 kdDebug(6100) << "<KJavaAppletServer::waitForReturnData stacksize:" << d->jsstack.size() << endl;
00731 }
00732
00733 bool KJavaAppletServer::getMember(QStringList & args, QStringList & ret_args) {
00734 JSStackFrame frame( d->jsstack, ret_args );
00735 args.push_front( QString::number(frame.ticket) );
00736
00737 process->send( KJAS_GET_MEMBER, args );
00738 waitForReturnData( &frame );
00739
00740 return frame.ready;
00741 }
00742
00743 bool KJavaAppletServer::putMember( QStringList & args ) {
00744 QStringList ret_args;
00745 JSStackFrame frame( d->jsstack, ret_args );
00746 args.push_front( QString::number(frame.ticket) );
00747
00748 process->send( KJAS_PUT_MEMBER, args );
00749 waitForReturnData( &frame );
00750
00751 return frame.ready && ret_args.count() > 0 && ret_args[0].toInt();
00752 }
00753
00754 bool KJavaAppletServer::callMember(QStringList & args, QStringList & ret_args) {
00755 JSStackFrame frame( d->jsstack, ret_args );
00756 args.push_front( QString::number(frame.ticket) );
00757
00758 process->send( KJAS_CALL_MEMBER, args );
00759 waitForReturnData( &frame );
00760
00761 return frame.ready;
00762 }
00763
00764 void KJavaAppletServer::derefObject( QStringList & args ) {
00765 process->send( KJAS_DEREF_OBJECT, args );
00766 }
00767
00768 bool KJavaAppletServer::usingKIO() {
00769 return d->useKIO;
00770 }
00771
00772
00773 PermissionDialog::PermissionDialog( QWidget* parent )
00774 : QObject(parent), m_button("no")
00775 {}
00776
00777 QCString PermissionDialog::exec( const QString & cert, const QString & perm ) {
00778 QGuardedPtr<QDialog> dialog = new QDialog( static_cast<QWidget*>(parent()), "PermissionDialog");
00779
00780 dialog->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1, (QSizePolicy::SizeType)1, 0, 0, dialog->sizePolicy().hasHeightForWidth() ) );
00781 dialog->setModal( true );
00782 dialog->setCaption( i18n("Security Alert") );
00783
00784 QVBoxLayout* const dialogLayout = new QVBoxLayout( dialog, 11, 6, "dialogLayout");
00785
00786 dialogLayout->addWidget( new QLabel( i18n("Do you grant Java applet with certificate(s):"), dialog ) );
00787 dialogLayout->addWidget( new QLabel( cert, dialog, "message" ) );
00788 dialogLayout->addWidget( new QLabel( i18n("the following permission"), dialog, "message" ) );
00789 dialogLayout->addWidget( new QLabel( perm, dialog, "message" ) );
00790 QSpacerItem* const spacer2 = new QSpacerItem( 20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding );
00791 dialogLayout->addItem( spacer2 );
00792
00793 QHBoxLayout* const buttonLayout = new QHBoxLayout( 0, 0, 6, "buttonLayout");
00794
00795 QPushButton* const no = new QPushButton( i18n("&No"), dialog, "no" );
00796 no->setDefault( true );
00797 buttonLayout->addWidget( no );
00798
00799 QPushButton* const reject = new QPushButton( i18n("&Reject All"), dialog, "reject" );
00800 buttonLayout->addWidget( reject );
00801
00802 QPushButton* const yes = new QPushButton( i18n("&Yes"), dialog, "yes" );
00803 buttonLayout->addWidget( yes );
00804
00805 QPushButton* const grant = new QPushButton( i18n("&Grant All"), dialog, "grant" );
00806 buttonLayout->addWidget( grant );
00807 dialogLayout->addLayout( buttonLayout );
00808 dialog->resize( dialog->minimumSizeHint() );
00809
00810
00811 connect( no, SIGNAL( clicked() ), this, SLOT( clicked() ) );
00812 connect( reject, SIGNAL( clicked() ), this, SLOT( clicked() ) );
00813 connect( yes, SIGNAL( clicked() ), this, SLOT( clicked() ) );
00814 connect( grant, SIGNAL( clicked() ), this, SLOT( clicked() ) );
00815
00816 dialog->exec();
00817 delete dialog;
00818
00819 return m_button;
00820 }
00821
00822 PermissionDialog::~PermissionDialog()
00823 {}
00824
00825 void PermissionDialog::clicked()
00826 {
00827 m_button = sender()->name();
00828 static_cast<const QWidget*>(sender())->parentWidget()->close();
00829 }
00830
00831 #include "kjavaappletserver.moc"