[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdelibs/kparts
From:       Maks Orlovich <maksim () kde ! org>
Date:       2010-05-12 0:43:14
Message-ID: 20100512004314.D3F6EAC8B3 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1125702 by orlovich:

- Make sure we don't deref root
- Implement eval...



 M  +57 -0     scriptableextension.cpp  


--- trunk/KDE/kdelibs/kparts/scriptableextension.cpp #1125701:1125702
@@ -20,6 +20,7 @@
 #include "scriptableextension.h"
 #include "scriptableextension_p.h"
 #include <kglobal.h>
+#include <kdebug.h>
 #include <QDBusMetaType>
 
 namespace KParts {
@@ -202,6 +203,15 @@
 // LiveConnectExtension -> ScriptableExtension adapter. We use
 // lc object IDs as our own object IDs.
 // ----------------------------------------------------------------------------
+ScriptableLiveConnectExtension::ScriptableLiveConnectExtension(QObject* p, \
LiveConnectExtension* old): +        ScriptableExtension(p), wrapee(old)
+{
+    connect(wrapee,
+            SIGNAL(partEvent(const unsigned long, const QString &, const \
KParts::LiveConnectExtension::ArgList &)), +            this,
+            SLOT(liveConnectEvent(const unsigned long, const QString&, const \
KParts::LiveConnectExtension::ArgList &))); +}
+
 QVariant ScriptableLiveConnectExtension::rootObject()
 {
     // Plugin root is always LC object #0.
@@ -342,11 +352,58 @@
 {
     int newRC = --refCounts[objId];
     if (!newRC) {
+        if (objId != 0)
         wrapee->unregister((unsigned long)objId);
         refCounts.remove(objId);
     }
 }
 
+void ScriptableLiveConnectExtension::liveConnectEvent(const unsigned long, const \
QString& event, +                                                      const \
LiveConnectExtension::ArgList& args) +{
+    // We want to evaluate in the enclosure's context.
+    QVariant enclosure = enclosingObject();
+    if (!enclosure.canConvert<Object>()) {
+        kDebug(1000) << "No enclosure, can't evaluate";
+        return;
+    }
+
+    Object enclosureObj = enclosure.value<Object>();    
+
+    if (!host()->isScriptLanguageSupported(ECMAScript)) {
+        kDebug(1000) << "Host can't evaluate ECMAScript";
+    }
+
+    // Compute a string to evaluate. We ned to escape a lot of stuff
+    // since we're composing a bunch of strings into one.
+    QString script;
+    script.sprintf("%s(", event.toLatin1().constData());
+
+    LiveConnectExtension::ArgList::const_iterator i = args.begin();
+    const LiveConnectExtension::ArgList::const_iterator argsBegin = i;
+    const LiveConnectExtension::ArgList::const_iterator argsEnd = args.end();
+
+    for ( ; i != argsEnd; ++i) {
+        if (i != argsBegin)
+            script += ",";
+        if ((*i).first == KParts::LiveConnectExtension::TypeString) {
+            script += "\"";
+            script += QString((*i).second).replace('\\', "\\\\").replace('"', \
"\\\""); +            script += "\"";
+        } else
+            script += (*i).second;
+    }
+    script += ")";
+
+    kDebug(1000) << script;
+
+    // Ask host to evaluate.
+    host()->evaluateScript(this, enclosureObj.objId, script);
+}
+
+// hash functions
+// ----------------------------------------------------------------------------
+
 unsigned int qHash(const KParts::ScriptableExtension::Object& o)
 {
     return qHash(qMakePair(o.owner, o.objId));


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic