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

KHTML

  • sources
  • kde-4.12
  • kdelibs
  • 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 
89 class JSStackFrame;
90 
91 typedef QMap< int, KJavaKIOJob* > KIOJobMap;
92 typedef QMap< int, JSStackFrame* > JSStack;
93 
94 class JSStackFrame {
95 public:
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 
111 int JSStackFrame::counter = 0;
112 
113 class KJavaAppletServerPrivate
114 {
115 friend class KJavaAppletServer;
116 private:
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 
133 static KJavaAppletServer* self = 0;
134 
135 KJavaAppletServer::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 
155 KJavaAppletServer::~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 
165 QString KJavaAppletServer::getAppletLabel()
166 {
167  if( self )
168  return self->appletLabel();
169  else
170  return QString();
171 }
172 
173 QString KJavaAppletServer::appletLabel()
174 {
175  return d->appletLabel;
176 }
177 
178 KJavaAppletServer* 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 
190 void 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 
209 void KJavaAppletServer::checkShutdown()
210 {
211  if( self->d->counter == 0 )
212  {
213  delete self;
214  self = 0;
215  }
216 }
217 
218 void 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 
316 void 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 
328 void 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 
339 bool 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 
397 void 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 
407 void 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 
417 void 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 
427 void 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 
437 void KJavaAppletServer::showConsole() {
438  if ( d->javaProcessFailed ) return;
439  QStringList args;
440  process->send( KJAS_SHOW_CONSOLE, args );
441 }
442 
443 void 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 
452 void 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 
461 void KJavaAppletServer::quit()
462 {
463  const QStringList args;
464 
465  process->send( KJAS_SHUTDOWN_SERVER, args );
466  process->waitForFinished( 10000 );
467 }
468 
469 void 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 
711 void KJavaAppletServer::killTimers()
712 {
713  QAbstractEventDispatcher::instance()->unregisterTimers(this);
714 }
715 
716 void 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 
725 void KJavaAppletServer::timerEvent(QTimerEvent *) {
726  endWaitForReturnData();
727  kDebug(6100) << "KJavaAppletServer::timerEvent timeout";
728 }
729 
730 void 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 
742 bool 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 
752 bool 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 
763 bool 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 
773 void KJavaAppletServer::derefObject( QStringList & args ) {
774  process->send( KJAS_DEREF_OBJECT, args );
775 }
776 
777 bool KJavaAppletServer::usingKIO() {
778  return d->useKIO;
779 }
780 
781 
782 PermissionDialog::PermissionDialog( QWidget* parent )
783  : QObject(parent), m_button("no")
784 {}
785 
786 QString 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->setDefault( true );
812  buttonLayout->addWidget( no );
813 
814  QPushButton* const reject = new QPushButton( i18n("&Reject All"), dialog );
815  buttonLayout->addWidget( reject );
816 
817  QPushButton* const yes = new QPushButton( i18n("&Yes"), dialog );
818  buttonLayout->addWidget( yes );
819 
820  QPushButton* const grant = new QPushButton( i18n("&Grant All"), dialog );
821  buttonLayout->addWidget( grant );
822  dialogLayout->addLayout( buttonLayout );
823  dialog->resize( dialog->minimumSizeHint() );
824  //clearWState( WState_Polished );
825 
826  connect( no, SIGNAL(clicked()), this, SLOT(clicked()) );
827  connect( reject, SIGNAL(clicked()), this, SLOT(clicked()) );
828  connect( yes, SIGNAL(clicked()), this, SLOT(clicked()) );
829  connect( grant, SIGNAL(clicked()), this, SLOT(clicked()) );
830 
831  dialog->exec();
832  delete dialog;
833 
834  return m_button;
835 }
836 
837 PermissionDialog::~PermissionDialog()
838 {}
839 
840 void PermissionDialog::clicked()
841 {
842  m_button = sender()->objectName();
843  static_cast<const QWidget*>(sender())->parentWidget()->close();
844 }
845 
846 #include "kjavaappletserver.moc"
KJavaAppletServer::KJavaAppletServer
KJavaAppletServer()
Create the applet server.
Definition: kjavaappletserver.cpp:135
KJAS_DEREF_OBJECT
#define KJAS_DEREF_OBJECT
Definition: kjavaappletserver.cpp:76
i18n
QString i18n(const char *text)
KConfigGroup::readPathEntry
QString readPathEntry(const QString &pKey, const QString &aDefault) const
kjavaappletserver.h
KJavaAppletServer::killTimers
void killTimers()
Definition: kjavaappletserver.cpp:711
KJAS_CREATE_CONTEXT
#define KJAS_CREATE_CONTEXT
Definition: kjavaappletserver.cpp:58
KJAS_GET_URLDATA
#define KJAS_GET_URLDATA
Definition: kjavaappletserver.cpp:69
kdebug.h
KJAS_SHUTDOWN_SERVER
#define KJAS_SHUTDOWN_SERVER
Definition: kjavaappletserver.cpp:71
KJavaAppletServer::checkShutdown
void checkShutdown()
Definition: kjavaappletserver.cpp:209
KJavaProcess::startJava
bool startJava()
Invoke the JVM with the parameters that have been set.
Definition: kjavaprocess.cpp:76
KSSLCertificate::validate
KSSLValidation validate()
KJavaAppletServer::usingKIO
bool usingKIO()
Definition: kjavaappletserver.cpp:777
KJAS_STOP_APPLET
#define KJAS_STOP_APPLET
Definition: kjavaappletserver.cpp:63
QDialog
group
KJavaUploader::start
void start()
Definition: kjavadownloader.cpp:211
d
#define d
Definition: khtmlfind.cpp:42
KJavaAppletServer::waitForReturnData
void waitForReturnData(JSStackFrame *)
Definition: kjavaappletserver.cpp:730
KJavaAppletServer::createContext
void createContext(int contextId, KJavaAppletContext *context)
Create an applet context with the specified id.
Definition: kjavaappletserver.cpp:316
ksslcertificate.h
KStandardDirs::locate
static QString locate(const char *type, const QString &filename, const KComponentData &cData=KGlobal::mainComponent())
kconfig.h
KJAS_SHOW_URLINFRAME
#define KJAS_SHOW_URLINFRAME
Definition: kjavaappletserver.cpp:66
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
KJAS_URLDATA
#define KJAS_URLDATA
Definition: kjavaappletserver.cpp:70
QWidget
KJavaAppletServer::removeDataJob
void removeDataJob(int loaderID)
Removes KJavaDownloader from the list (deletes it too).
Definition: kjavaappletserver.cpp:452
QPushButton
kError
static QDebug kError(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
KSSLCertificate
KConfig::group
KConfigGroup group(const QByteArray &group)
KJAS_AUDIOCLIP_STOP
#define KJAS_AUDIOCLIP_STOP
Definition: kjavaappletserver.cpp:79
KJavaAppletServer::stopApplet
void stopApplet(int contextId, int appletId)
Stop the specified applet.
Definition: kjavaappletserver.cpp:427
QString
KJAS_PUT_MEMBER
#define KJAS_PUT_MEMBER
Definition: kjavaappletserver.cpp:75
QObject
kDebug
static QDebug kDebug(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
KSSLCertificate::getSubject
QString getSubject() const
klocale.h
KJavaProcess::setMainClass
void setMainClass(const QString &clazzName)
The class to be called when startJava() is called.
Definition: kjavaprocess.cpp:102
KJAS_AUDIOCLIP_LOOP
#define KJAS_AUDIOCLIP_LOOP
Definition: kjavaappletserver.cpp:78
KUrl
KJAS_PUT_URLDATA
#define KJAS_PUT_URLDATA
Definition: kjavaappletserver.cpp:83
KJavaUploader
Definition: kjavadownloader.h:73
KProtocolManager::useProxy
static bool useProxy()
config
KSharedConfigPtr config()
kprotocolmanager.h
KSSLCertChain::setChain
void setChain(void *stack_of_x509)
KSSLCertChain
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
KJavaAppletServer::appletLabel
QString appletLabel()
Definition: kjavaappletserver.cpp:173
KSSLCertificate::verifyText
static QString verifyText(KSSLValidation x)
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
KJAS_GET_MEMBER
#define KJAS_GET_MEMBER
Definition: kjavaappletserver.cpp:73
PermissionDialog::exec
QString exec(const QString &cert, const QString &perm)
Definition: kjavaappletserver.cpp:786
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, and then writes it standard out.
Definition: kjavaprocess.cpp:164
kjavaprocess.h
KJavaAppletServer::initApplet
void initApplet(int contextId, int appletId)
This should be called by the KJavaAppletWidget.
Definition: kjavaappletserver.cpp:397
KJavaAppletServer::derefObject
void derefObject(QStringList &args)
Definition: kjavaappletserver.cpp:773
QStringList
KJAS_DESTROY_CONTEXT
#define KJAS_DESTROY_CONTEXT
Definition: kjavaappletserver.cpp:59
KJavaDownloader
Definition: kjavadownloader.h:53
KJAS_RESIZE_APPLET
#define KJAS_RESIZE_APPLET
Definition: kjavaappletserver.cpp:68
KJavaAppletServer::showConsole
void showConsole()
Show java console.
Definition: kjavaappletserver.cpp:437
KJAS_APPLET_FAILED
#define KJAS_APPLET_FAILED
Definition: kjavaappletserver.cpp:81
PermissionDialog::~PermissionDialog
~PermissionDialog()
Definition: kjavaappletserver.cpp:837
KJavaAppletServer
Definition: kjavaappletserver.h:42
KJAS_DATA_COMMAND
#define KJAS_DATA_COMMAND
Definition: kjavaappletserver.cpp:82
KSSL
PermissionDialog
Definition: kjavaappletserver.h:165
KSSLCertificate::isSigner
bool isSigner()
KJAS_PUT_DATA
#define KJAS_PUT_DATA
Definition: kjavaappletserver.cpp:84
KJavaAppletServer::putMember
bool putMember(QStringList &args)
Definition: kjavaappletserver.cpp:752
KJavaProcess::setClasspath
void setClasspath(const QString &classpath)
This will set the classpath the Java process will use.
Definition: kjavaprocess.cpp:91
KJAS_CALL_MEMBER
#define KJAS_CALL_MEMBER
Definition: kjavaappletserver.cpp:74
KJavaAppletServer::setupJava
void setupJava(KJavaProcess *p)
Definition: kjavaappletserver.cpp:218
KJavaAppletServer::~KJavaAppletServer
~KJavaAppletServer()
Definition: kjavaappletserver.cpp:155
KProtocolManager::proxyForUrl
static QString proxyForUrl(const KUrl &url)
KJavaAppletServer::getMember
bool getMember(QStringList &args, QStringList &ret_args)
Definition: kjavaappletserver.cpp:742
KIOJobMap
QMap< int, KJavaKIOJob * > KIOJobMap
Definition: kjavaappletserver.cpp:89
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
ok
KGuiItem ok()
KJAS_SHOW_CONSOLE
#define KJAS_SHOW_CONSOLE
Definition: kjavaappletserver.cpp:86
job.h
KJavaAppletServer::destroyContext
void destroyContext(int contextId)
Destroy the applet context with the specified id.
Definition: kjavaappletserver.cpp:328
KConfigGroup
KSSLCertificate::fromString
static KSSLCertificate * fromString(const QByteArray &cert)
KJavaAppletServer::endWaitForReturnData
void endWaitForReturnData()
Definition: kjavaappletserver.cpp:716
KConfig
KJAS_SHOW_DOCUMENT
#define KJAS_SHOW_DOCUMENT
Definition: kjavaappletserver.cpp:65
self
static KJavaAppletServer * self
Definition: kjavaappletserver.cpp:133
KJavaProcess::setJVMPath
void setJVMPath(const QString &path)
Used to specify the path to the Java executable to be run.
Definition: kjavaprocess.cpp:86
dir
QString dir(const QString &fileClass)
KJAS_DESTROY_APPLET
#define KJAS_DESTROY_APPLET
Definition: kjavaappletserver.cpp:61
KSSLCertChain::isValid
bool isValid()
kstandarddirs.h
QLabel
no
KGuiItem no()
KSSL::doesSSLWork
static bool doesSSLWork()
KJAS_AUDIOCLIP_PLAY
#define KJAS_AUDIOCLIP_PLAY
Definition: kjavaappletserver.cpp:77
KJavaAppletContext::processCmd
void processCmd(QString cmd, QStringList args)
use this for applet call backs, the AppletServer calls this directly.
Definition: kjavaappletcontext.cpp:131
KJavaAppletServer::startApplet
void startApplet(int contextId, int appletId)
Start the specified applet.
Definition: kjavaappletserver.cpp:417
KJavaAppletServer::process
KJavaProcess * process
Definition: kjavaappletserver.h:151
QSize
browserextension.h
KJavaAppletContext
Definition: kjavaappletcontext.h:45
PermissionDialog::PermissionDialog
PermissionDialog(QWidget *)
Definition: kjavaappletserver.cpp:782
KJAS_APPLET_STATE
#define KJAS_APPLET_STATE
Definition: kjavaappletserver.cpp:80
KJAS_START_APPLET
#define KJAS_START_APPLET
Definition: kjavaappletserver.cpp:62
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::callMember
bool callMember(QStringList &args, QStringList &ret_args)
Definition: kjavaappletserver.cpp:763
KJavaAppletServer::quit
void quit()
Shut down the KJAS server.
Definition: kjavaappletserver.cpp:461
KJAS_SECURITY_CONFIRM
#define KJAS_SECURITY_CONFIRM
Definition: kjavaappletserver.cpp:85
KJavaAppletServer::timerEvent
void timerEvent(QTimerEvent *)
Definition: kjavaappletserver.cpp:725
KJavaAppletServer::slotJavaRequest
void slotJavaRequest(const QByteArray &qb)
Definition: kjavaappletserver.cpp:469
KJavaProcess::setExtraArgs
void setExtraArgs(const QString &args)
Extra flags passed to the JVM.
Definition: kjavaprocess.cpp:107
KJAS_JAVASCRIPT_EVENT
#define KJAS_JAVASCRIPT_EVENT
Definition: kjavaappletserver.cpp:72
KJavaProcess
Definition: kjavaprocess.h:41
KConfigGroup::readEntry
T readEntry(const QString &key, const T &aDefault) const
ksslcertchain.h
kjavadownloader.h
KJAS_CREATE_APPLET
#define KJAS_CREATE_APPLET
Definition: kjavaappletserver.cpp:60
yes
KGuiItem yes()
KJavaAppletServer::allocateJavaServer
static KJavaAppletServer * allocateJavaServer()
A factory method that returns the default server.
Definition: kjavaappletserver.cpp:178
KJAS_INIT_APPLET
#define KJAS_INIT_APPLET
Definition: kjavaappletserver.cpp:64
JSStack
QMap< int, JSStackFrame * > JSStack
Definition: kjavaappletserver.cpp:92
QMap< int, KJavaKIOJob * >
kconfiggroup.h
kjavaappletcontext.h
KJavaAppletServer::destroyApplet
void destroyApplet(int contextId, int appletId)
Destroy an applet in the specified context with the specified id.
Definition: kjavaappletserver.cpp:407
KJAS_SHOW_STATUS
#define KJAS_SHOW_STATUS
Definition: kjavaappletserver.cpp:67
QList
kssl.h
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:51:22 by doxygen 1.8.7 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 API Reference

Skip menu "kdelibs 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
  • kjsembed
  •   WTF
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Nepomuk-Core
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver

Search



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