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"