00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <klocale.h>
00024
00025 #include <kstandarddirs.h>
00026 #include <kconfig.h>
00027 #include <kdebug.h>
00028
00029 #include <kio/kprotocolmanager.h>
00030 #include "kjs_navigator.h"
00031 #include "kjs/lookup.h"
00032 #include "kjs_binding.h"
00033 #include "khtml_part.h"
00034 #include <sys/utsname.h>
00035 #include "kjs_navigator.lut.h"
00036
00037 using namespace KJS;
00038
00039 namespace KJS {
00040
00041
00042
00043 class PluginBase : public ObjectImp {
00044 public:
00045 PluginBase(ExecState *exec);
00046 virtual ~PluginBase();
00047
00048 struct MimeClassInfo;
00049 struct PluginInfo;
00050
00051 struct MimeClassInfo {
00052 QString type;
00053 QString desc;
00054 QString suffixes;
00055 PluginInfo *plugin;
00056 };
00057
00058 struct PluginInfo {
00059 QString name;
00060 QString file;
00061 QString desc;
00062 QPtrList<MimeClassInfo> mimes;
00063 };
00064
00065 static QPtrList<PluginInfo> *plugins;
00066 static QPtrList<MimeClassInfo> *mimes;
00067
00068 private:
00069 static int m_refCount;
00070 };
00071
00072
00073 class Plugins : public PluginBase {
00074 public:
00075 Plugins(ExecState *exec) : PluginBase(exec) {};
00076 virtual Value get(ExecState *exec, const UString &propertyName) const;
00077 virtual const ClassInfo* classInfo() const { return &info; }
00078 static const ClassInfo info;
00079 private:
00080 };
00081 const ClassInfo Plugins::info = { "PluginArray", 0, 0, 0 };
00082
00083
00084 class MimeTypes : public PluginBase {
00085 public:
00086 MimeTypes(ExecState *exec) : PluginBase(exec) { };
00087 virtual Value get(ExecState *exec, const UString &propertyName) const;
00088 virtual const ClassInfo* classInfo() const { return &info; }
00089 static const ClassInfo info;
00090 private:
00091 };
00092 const ClassInfo MimeTypes::info = { "MimeTypeArray", 0, 0, 0 };
00093
00094
00095 class Plugin : public PluginBase {
00096 public:
00097 Plugin( ExecState *exec, PluginBase::PluginInfo *info )
00098 : PluginBase( exec )
00099 { m_info = info; };
00100 virtual Value get(ExecState *exec, const UString &propertyName) const;
00101 virtual const ClassInfo* classInfo() const { return &info; }
00102 static const ClassInfo info;
00103 private:
00104 PluginBase::PluginInfo *m_info;
00105 };
00106 const ClassInfo Plugin::info = { "Plugin", 0, 0, 0 };
00107
00108
00109 class MimeType : public PluginBase {
00110 public:
00111 MimeType( ExecState *exec, PluginBase::MimeClassInfo *info )
00112 : PluginBase( exec )
00113 { m_info = info; };
00114 virtual Value get(ExecState *exec, const UString &propertyName) const;
00115 virtual const ClassInfo* classInfo() const { return &info; }
00116 static const ClassInfo info;
00117 private:
00118 PluginBase::MimeClassInfo *m_info;
00119 };
00120 const ClassInfo MimeType::info = { "MimeType", 0, 0, 0 };
00121
00122 };
00123
00124
00125 QPtrList<PluginBase::PluginInfo> *KJS::PluginBase::plugins = 0;
00126 QPtrList<PluginBase::MimeClassInfo> *KJS::PluginBase::mimes = 0;
00127 int KJS::PluginBase::m_refCount = 0;
00128
00129 const ClassInfo Navigator::info = { "Navigator", 0, &NavigatorTable, 0 };
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 IMPLEMENT_PROTOFUNC_DOM(NavigatorFunc)
00148
00149 Navigator::Navigator(ExecState *exec, KHTMLPart *p)
00150 : ObjectImp(exec->interpreter()->builtinObjectPrototype()), m_part(p) { }
00151
00152 Value Navigator::get(ExecState *exec, const UString &propertyName) const
00153 {
00154 #ifdef KJS_VERBOSE
00155 kdDebug(6070) << "Navigator::get " << propertyName.ascii() << endl;
00156 #endif
00157 return lookupGet<NavigatorFunc,Navigator,ObjectImp>(exec,propertyName,&NavigatorTable,this);
00158 }
00159
00160 Value Navigator::getValueProperty(ExecState *exec, int token) const
00161 {
00162 KURL url = m_part->url();
00163 QString userAgent = KProtocolManager::userAgentForHost(url.host());
00164 switch (token) {
00165 case AppCodeName:
00166 return String("Mozilla");
00167 case AppName:
00168
00169 if (userAgent.find(QString::fromLatin1("Mozilla")) >= 0 &&
00170 userAgent.find(QString::fromLatin1("compatible")) == -1)
00171 {
00172
00173 return String("Netscape");
00174 }
00175 if (userAgent.find(QString::fromLatin1("Microsoft")) >= 0 ||
00176 userAgent.find(QString::fromLatin1("MSIE")) >= 0)
00177 {
00178
00179 return String("Microsoft Internet Explorer");
00180 }
00181
00182 return String("Konqueror");
00183 case AppVersion:
00184
00185 return String(userAgent.mid(userAgent.find('/') + 1));
00186 case Product:
00187 return String("Konqueror/khtml");
00188 case Vendor:
00189 return String("KDE");
00190 case Language:
00191 case UserLanguage:
00192 return String(KGlobal::locale()->language());
00193 case UserAgent:
00194 return String(userAgent);
00195 case Platform:
00196
00197 if ( (userAgent.find(QString::fromLatin1("Win"),0,false)>=0) )
00198 return String(QString::fromLatin1("Win32"));
00199 else if ( (userAgent.find(QString::fromLatin1("Macintosh"),0,false)>=0) ||
00200 (userAgent.find(QString::fromLatin1("Mac_PowerPC"),0,false)>=0) )
00201 return String(QString::fromLatin1("MacPPC"));
00202 else
00203 {
00204 struct utsname name;
00205 int ret = uname(&name);
00206 if ( ret >= 0 )
00207 return String(QString::fromLatin1("%1 %1 X11").arg(name.sysname).arg(name.machine));
00208 else
00209 return String(QString::fromLatin1("Unix X11"));
00210 }
00211 case _Plugins:
00212 return Value(new Plugins(exec));
00213 case _MimeTypes:
00214 return Value(new MimeTypes(exec));
00215 case CookieEnabled:
00216 return Boolean(true);
00217 default:
00218 kdWarning() << "Unhandled token in DOMEvent::getValueProperty : " << token << endl;
00219 return Value();
00220 }
00221 }
00222
00223
00224
00225 PluginBase::PluginBase(ExecState *exec)
00226 : ObjectImp(exec->interpreter()->builtinObjectPrototype() )
00227 {
00228 if ( !plugins ) {
00229 plugins = new QPtrList<PluginInfo>;
00230 mimes = new QPtrList<MimeClassInfo>;
00231 plugins->setAutoDelete( true );
00232 mimes->setAutoDelete( true );
00233
00234
00235 KConfig c(KGlobal::dirs()->saveLocation("data","nsplugins")+"/pluginsinfo");
00236 unsigned num = (unsigned int)c.readNumEntry("number");
00237 for ( unsigned n=0; n<num; n++ ) {
00238
00239 c.setGroup( QString::number(n) );
00240 PluginInfo *plugin = new PluginInfo;
00241
00242 plugin->name = c.readEntry("name");
00243 plugin->file = c.readEntry("file");
00244 plugin->desc = c.readEntry("description");
00245
00246
00247
00248 plugins->append( plugin );
00249
00250
00251 QStringList types = QStringList::split( ';', c.readEntry("mime") );
00252 QStringList::Iterator type;
00253 for ( type=types.begin(); type!=types.end(); ++type ) {
00254
00255
00256 QStringList tokens = QStringList::split(':', *type, TRUE);
00257 if ( tokens.count() < 3 )
00258 continue;
00259
00260 MimeClassInfo *mime = new MimeClassInfo;
00261 QStringList::Iterator token = tokens.begin();
00262 mime->type = (*token).lower();
00263
00264 ++token;
00265
00266 mime->suffixes = *token;
00267 ++token;
00268
00269 mime->desc = *token;
00270 ++token;
00271
00272 mime->plugin = plugin;
00273
00274 mimes->append( mime );
00275 plugin->mimes.append( mime );
00276 }
00277 }
00278 }
00279
00280 m_refCount++;
00281 }
00282
00283 PluginBase::~PluginBase()
00284 {
00285 m_refCount--;
00286 if ( m_refCount==0 ) {
00287 delete plugins;
00288 delete mimes;
00289 plugins = 0;
00290 mimes = 0;
00291 }
00292 }
00293
00294
00295
00296 IMPLEMENT_PROTOFUNC_DOM(PluginsFunc)
00297
00298 Value Plugins::get(ExecState *exec, const UString &propertyName) const
00299 {
00300 #ifdef KJS_VERBOSE
00301 kdDebug(6070) << "Plugins::get " << propertyName.qstring() << endl;
00302 #endif
00303 if (propertyName == "refresh")
00304 return lookupOrCreateFunction<PluginsFunc>(exec,propertyName,this,0,0,DontDelete|Function);
00305 else if ( propertyName =="length" )
00306 return Number(plugins->count());
00307 else {
00308
00309
00310 bool ok;
00311 unsigned int i = propertyName.toULong(&ok);
00312 if( ok && i<plugins->count() )
00313 return Value( new Plugin( exec, plugins->at(i) ) );
00314
00315
00316 for ( PluginInfo *pl = plugins->first(); pl!=0; pl = plugins->next() ) {
00317 if ( pl->name==propertyName.string() )
00318 return Value( new Plugin( exec, pl ) );
00319 }
00320 }
00321
00322 return PluginBase::get(exec, propertyName);
00323 }
00324
00325
00326
00327 Value MimeTypes::get(ExecState *exec, const UString &propertyName) const
00328 {
00329 #ifdef KJS_VERBOSE
00330 kdDebug(6070) << "MimeTypes::get " << propertyName.qstring() << endl;
00331 #endif
00332 if( propertyName=="length" )
00333 return Number( mimes->count() );
00334 else {
00335
00336
00337 bool ok;
00338 unsigned int i = propertyName.toULong(&ok);
00339 if( ok && i<mimes->count() )
00340 return Value( new MimeType( exec, mimes->at(i) ) );
00341
00342
00343
00344 for ( MimeClassInfo *m=mimes->first(); m!=0; m=mimes->next() ) {
00345
00346 if ( m->type == propertyName.string() )
00347 return Value( new MimeType( exec, m ) );
00348 }
00349 }
00350
00351 return PluginBase::get(exec, propertyName);
00352 }
00353
00354
00355
00356
00357 Value Plugin::get(ExecState *exec, const UString &propertyName) const
00358 {
00359 #ifdef KJS_VERBOSE
00360 kdDebug(6070) << "Plugin::get " << propertyName.qstring() << endl;
00361 #endif
00362 if ( propertyName=="name" )
00363 return String( m_info->name );
00364 else if ( propertyName == "filename" )
00365 return String( m_info->file );
00366 else if ( propertyName == "description" )
00367 return String( m_info->desc );
00368 else if ( propertyName == "length" )
00369 return Number( m_info->mimes.count() );
00370 else {
00371
00372
00373 bool ok;
00374 unsigned int i = propertyName.toULong(&ok);
00375
00376 if( ok && i<m_info->mimes.count() )
00377 {
00378
00379 return Value(new MimeType(exec, m_info->mimes.at(i)));
00380 }
00381
00382
00383 for ( PluginBase::MimeClassInfo *m=m_info->mimes.first();
00384 m!=0; m=m_info->mimes.next() ) {
00385 if ( m->type==propertyName.string() )
00386 return Value(new MimeType(exec, m));
00387 }
00388
00389 }
00390
00391 return ObjectImp::get(exec,propertyName);
00392 }
00393
00394
00395
00396
00397 Value MimeType::get(ExecState *exec, const UString &propertyName) const
00398 {
00399 #ifdef KJS_VERBOSE
00400 kdDebug(6070) << "MimeType::get " << propertyName.qstring() << endl;
00401 #endif
00402 if ( propertyName == "type" )
00403 return String( m_info->type );
00404 else if ( propertyName == "suffixes" )
00405 return String( m_info->suffixes );
00406 else if ( propertyName == "description" )
00407 return String( m_info->desc );
00408 else if ( propertyName == "enabledPlugin" )
00409 return Value(new Plugin(exec, m_info->plugin));
00410
00411 return ObjectImp::get(exec,propertyName);
00412 }
00413
00414
00415 Value PluginsFunc::tryCall(ExecState *, Object &, const List &)
00416 {
00417 return Undefined();
00418 }
00419
00420
00421 Value NavigatorFunc::tryCall(ExecState *exec, Object &thisObj, const List &)
00422 {
00423 KJS_CHECK_THIS( KJS::Navigator, thisObj );
00424 Navigator *nav = static_cast<Navigator *>(thisObj.imp());
00425
00426 return Boolean(nav->part()->javaEnabled());
00427 }