summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2014-01-08 03:15:10 (GMT)
committerStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2014-01-08 03:15:10 (GMT)
commita39086067c99ab691f704017ff853250469aa91a (patch)
tree7e7ad0598f5cdfc477aa08f9b833afb8cdf3b2ac
parent9629ef3f969e31dfd19efa27e62487fc46610416 (diff)
downloaduscxml-a39086067c99ab691f704017ff853250469aa91a.zip
uscxml-a39086067c99ab691f704017ff853250469aa91a.tar.gz
uscxml-a39086067c99ab691f704017ff853250469aa91a.tar.bz2
Updated IM invoker for latest libpurple
-rw-r--r--CMakeLists.txt5
-rw-r--r--contrib/cmake/FindGObject.cmake52
-rw-r--r--contrib/dom/scripts/CodeGeneratorArabicaJSC.pm1
-rw-r--r--src/uscxml/DOMUtils.cpp40
-rw-r--r--src/uscxml/DOMUtils.h1
-rw-r--r--src/uscxml/Message.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp8
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCArrayBuffer.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCArrayBufferView.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCAttr.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCCDATASection.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCCharacterData.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCComment.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDOMImplementation.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDataView.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDocument.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDocumentFragment.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDocumentType.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCElement.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCEntity.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCEntityReference.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCFloat32Array.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCFloat64Array.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCInt16Array.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCInt32Array.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCInt8Array.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNamedNodeMap.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNode.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNodeList.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNodeSet.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNotation.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCProcessingInstruction.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCSCXMLEvent.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCStorage.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCText.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint16Array.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint32Array.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint8Array.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint8ClampedArray.h1
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCXPathResult.h1
-rw-r--r--src/uscxml/plugins/invoker/im/IMInvoker.cpp332
-rw-r--r--src/uscxml/plugins/invoker/im/IMInvoker.h4
-rw-r--r--test/samples/uscxml/test-instant-messaging.scxml27
43 files changed, 395 insertions, 109 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8d0f671..4b05df3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -692,13 +692,16 @@ find_package(LibPurple)
if (LIBPURPLE_FOUND)
find_package(ICONV)
find_package(GLIB2)
- if (GLIB2_FOUND AND ICONV_FOUND)
+ find_package(GObject)
+ if (GLIB2_FOUND AND ICONV_FOUND AND GOBJECT_FOUND)
include_directories (${LIBPURPLE_INCLUDE_DIR})
list (APPEND USCXML_OPT_LIBS ${LIBPURPLE_LIBRARY})
include_directories (${GLIB2_INCLUDE_DIRS})
list (APPEND USCXML_OPT_LIBS ${GLIB2_LIBRARIES})
include_directories (${ICONV_INCLUDE_DIR})
list (APPEND USCXML_OPT_LIBS ${ICONV_LIBRARIES})
+ include_directories (${GOBJECT_INCLUDE_DIR})
+ list (APPEND USCXML_OPT_LIBS ${GOBJECT_LIBRARIES})
else()
set(LIBPURPLE_FOUND OFF)
endif()
diff --git a/contrib/cmake/FindGObject.cmake b/contrib/cmake/FindGObject.cmake
new file mode 100644
index 0000000..1107c10
--- /dev/null
+++ b/contrib/cmake/FindGObject.cmake
@@ -0,0 +1,52 @@
+# - Try to find GObject
+# Once done this will define
+#
+# GOBJECT_FOUND - system has GObject
+# GOBJECT_INCLUDE_DIR - the GObject include directory
+# GOBJECT_LIBRARIES - the libraries needed to use GObject
+# GOBJECT_DEFINITIONS - Compiler switches required for using GObject
+
+# Copyright (c) 2011, Raphael Kubo da Costa <kubito@gmail.com>
+# Copyright (c) 2006, Tim Beaulen <tbscope@gmail.com>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+FIND_PACKAGE(PkgConfig)
+PKG_CHECK_MODULES(PC_GOBJECT gobject-2.0)
+SET(GOBJECT_DEFINITIONS ${PC_GOBJECT_CFLAGS_OTHER})
+
+FIND_PATH(GOBJECT_INCLUDE_DIR gobject.h
+ HINTS
+ ${PC_GOBJECT_INCLUDEDIR}
+ ${PC_GOBJECT_INCLUDE_DIRS}
+ PATH_SUFFIXES glib-2.0/gobject/
+ )
+
+FIND_LIBRARY(_GObjectLibs NAMES gobject-2.0
+ HINTS
+ ${PC_GOBJECT_LIBDIR}
+ ${PC_GOBJECT_LIBRARY_DIRS}
+ )
+FIND_LIBRARY(_GModuleLibs NAMES gmodule-2.0
+ HINTS
+ ${PC_GOBJECT_LIBDIR}
+ ${PC_GOBJECT_LIBRARY_DIRS}
+ )
+FIND_LIBRARY(_GThreadLibs NAMES gthread-2.0
+ HINTS
+ ${PC_GOBJECT_LIBDIR}
+ ${PC_GOBJECT_LIBRARY_DIRS}
+ )
+FIND_LIBRARY(_GLibs NAMES glib-2.0
+ HINTS
+ ${PC_GOBJECT_LIBDIR}
+ ${PC_GOBJECT_LIBRARY_DIRS}
+ )
+
+SET( GOBJECT_LIBRARIES ${_GObjectLibs} ${_GModuleLibs} ${_GThreadLibs} ${_GLibs} )
+
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(GOBJECT DEFAULT_MSG GOBJECT_LIBRARIES GOBJECT_INCLUDE_DIR)
+
+MARK_AS_ADVANCED(GOBJECT_INCLUDE_DIR _GObjectLibs _GModuleLibs _GThreadLibs _GLibs) \ No newline at end of file
diff --git a/contrib/dom/scripts/CodeGeneratorArabicaJSC.pm b/contrib/dom/scripts/CodeGeneratorArabicaJSC.pm
index 27ad7a7..64004d0 100644
--- a/contrib/dom/scripts/CodeGeneratorArabicaJSC.pm
+++ b/contrib/dom/scripts/CodeGeneratorArabicaJSC.pm
@@ -242,6 +242,7 @@ END
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
END
+ push(@headerContent, " classDef.className = \"${interfaceName}\";\n");
if ($extensions->{'CustomIndexedGetter'}) {
push(@headerContent, " classDef.hasProperty = hasPropertyCustomCallback;\n");
push(@headerContent, " classDef.getProperty = getPropertyCustomCallback;\n");
diff --git a/src/uscxml/DOMUtils.cpp b/src/uscxml/DOMUtils.cpp
index e54099e..c38b087 100644
--- a/src/uscxml/DOMUtils.cpp
+++ b/src/uscxml/DOMUtils.cpp
@@ -67,6 +67,42 @@ std::string DOMUtils::xPathForNode(const Arabica::DOM::Node<std::string>& node)
return xPath;
}
+std::list<Arabica::DOM::Node<std::string> > DOMUtils::getElementsByType(const Arabica::DOM::Node<std::string>& root, Arabica::DOM::Node_base::Type type) {
+ std::list<Arabica::DOM::Node<std::string> > result;
+ std::list<Arabica::DOM::Node<std::string> > stack;
+ std::list<Arabica::DOM::Node<std::string> >::iterator stackIter;
+
+ if (!root)
+ return result;
+
+ stack.push_back(root);
+ while(stack.size() > 0) {
+// for(stackIter = stack.begin(); stackIter != stack.end(); stackIter++) {
+// std::cout << stackIter->getNodeType() << " " << stackIter->getLocalName() << " " << stackIter->getNodeValue() << std::endl;
+// }
+// std::cout << std::endl;
+
+ Arabica::DOM::Node<std::string> currNode = stack.back();
+ if (currNode.hasChildNodes()) {
+ stack.push_back(currNode.getFirstChild());
+ continue;
+ }
+
+ // roll back stack and pop everyone without next sibling
+ do {
+ currNode = stack.back();
+ if (currNode.getNodeType() == type)
+ result.push_back(currNode);
+ stack.pop_back();
+ if (currNode.getNextSibling()) {
+ stack.push_back(currNode.getNextSibling());
+ break;
+ }
+ } while(stack.size() > 0);
+ }
+ return result;
+}
+
NameSpacingParser NameSpacingParser::fromXML(const std::string& xml) {
std::stringstream* ss = new std::stringstream();
(*ss) << xml;
@@ -81,8 +117,8 @@ NameSpacingParser NameSpacingParser::fromInputSource(Arabica::SAX::InputSource<s
NameSpacingParser parser;
if(!parser.parse(source) || !parser.getDocument().hasChildNodes()) {
if(parser._errorHandler.errorsReported()) {
- LOG(ERROR) << "could not parse input:";
- LOG(ERROR) << parser._errorHandler.errors() << std::endl;
+// LOG(ERROR) << "could not parse input:";
+// LOG(ERROR) << parser._errorHandler.errors() << std::endl;
} else {
Arabica::SAX::InputSourceResolver resolver(source, Arabica::default_string_adaptor<std::string>());
if (!resolver.resolve()) {
diff --git a/src/uscxml/DOMUtils.h b/src/uscxml/DOMUtils.h
index 103296b..731b332 100644
--- a/src/uscxml/DOMUtils.h
+++ b/src/uscxml/DOMUtils.h
@@ -36,6 +36,7 @@ namespace uscxml {
class USCXML_API DOMUtils {
public:
static std::string xPathForNode(const Arabica::DOM::Node<std::string>& node);
+ static std::list<Arabica::DOM::Node<std::string> > getElementsByType(const Arabica::DOM::Node<std::string>& root, Arabica::DOM::Node_base::Type type);
};
class ScriptEntityResolver : public Arabica::SAX::EntityResolver<std::string> {
diff --git a/src/uscxml/Message.h b/src/uscxml/Message.h
index 5f6703e..c444cad 100644
--- a/src/uscxml/Message.h
+++ b/src/uscxml/Message.h
@@ -81,6 +81,7 @@ public:
}
}
template <typename T> Data(T value) : atom(toStr(value)), type(INTERPRETED) {}
+ template <typename T> Data(T value, Type type_) : atom(toStr(value)), type(type_) {}
explicit Data(const Arabica::DOM::Node<std::string>& dom);
virtual ~Data() {}
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp
index 9827b91..ad2952a 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp
@@ -286,6 +286,14 @@ Data JSCDataModel::getStringAsData(const std::string& content) {
JSValueRef JSCDataModel::getDataAsValue(const Data& data) {
JSValueRef exception = NULL;
+ if (data.node) {
+ JSCNode::JSCNodePrivate* privData = new JSCNode::JSCNodePrivate();
+ privData->nativeObj = new Node<std::string>(data.node);
+ privData->dom = _dom;
+
+ JSObjectRef value = JSObjectMake(_ctx, JSCNode::getTmpl(), privData);
+ return value;
+ }
if (data.compound.size() > 0) {
JSObjectRef value = JSObjectMake(_ctx, 0, 0);
std::map<std::string, Data>::const_iterator compoundIter = data.compound.begin();
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCArrayBuffer.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCArrayBuffer.h
index 6a6c02a..cd2147f 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCArrayBuffer.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCArrayBuffer.h
@@ -59,6 +59,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "ArrayBuffer";
classDef.callAsConstructor = jsConstructor;
Tmpl = JSClassCreate(&classDef);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCArrayBufferView.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCArrayBufferView.h
index 11f4ee4..a6910a1 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCArrayBufferView.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCArrayBufferView.h
@@ -54,6 +54,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "ArrayBufferView";
Tmpl = JSClassCreate(&classDef);
JSClassRetain(Tmpl);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCAttr.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCAttr.h
index 3c4ff56..adcb6bc 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCAttr.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCAttr.h
@@ -56,6 +56,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "Attr";
classDef.parentClass = JSCNode::getTmpl();
Tmpl = JSClassCreate(&classDef);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCCDATASection.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCCDATASection.h
index 3e642a2..32ef4bc 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCCDATASection.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCCDATASection.h
@@ -51,6 +51,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "CDATASection";
classDef.parentClass = JSCText::getTmpl();
Tmpl = JSClassCreate(&classDef);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCCharacterData.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCCharacterData.h
index 7e9f672..b351fa2 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCCharacterData.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCCharacterData.h
@@ -59,6 +59,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "CharacterData";
classDef.parentClass = JSCNode::getTmpl();
Tmpl = JSClassCreate(&classDef);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCComment.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCComment.h
index d6f84c7..38a7822 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCComment.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCComment.h
@@ -51,6 +51,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "Comment";
classDef.parentClass = JSCCharacterData::getTmpl();
Tmpl = JSClassCreate(&classDef);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDOMImplementation.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDOMImplementation.h
index bfb691f..4c39d93 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDOMImplementation.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDOMImplementation.h
@@ -53,6 +53,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "DOMImplementation";
Tmpl = JSClassCreate(&classDef);
JSClassRetain(Tmpl);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDataView.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDataView.h
index 1b66076..6593068 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDataView.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDataView.h
@@ -69,6 +69,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "DataView";
classDef.callAsConstructor = jsConstructor;
classDef.parentClass = JSCArrayBufferView::getTmpl();
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDocument.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDocument.h
index c4c0185..f6b167e 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDocument.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDocument.h
@@ -70,6 +70,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "Document";
classDef.parentClass = JSCNode::getTmpl();
Tmpl = JSClassCreate(&classDef);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDocumentFragment.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDocumentFragment.h
index 6e8187e..6beed81 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDocumentFragment.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDocumentFragment.h
@@ -51,6 +51,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "DocumentFragment";
classDef.parentClass = JSCNode::getTmpl();
Tmpl = JSClassCreate(&classDef);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDocumentType.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDocumentType.h
index 4b98ca6..d2077cf 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDocumentType.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCDocumentType.h
@@ -57,6 +57,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "DocumentType";
classDef.parentClass = JSCNode::getTmpl();
Tmpl = JSClassCreate(&classDef);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCElement.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCElement.h
index 834ceb7..eab3696 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCElement.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCElement.h
@@ -67,6 +67,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "Element";
classDef.parentClass = JSCNode::getTmpl();
Tmpl = JSClassCreate(&classDef);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCEntity.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCEntity.h
index fe70846..c61510f 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCEntity.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCEntity.h
@@ -54,6 +54,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "Entity";
classDef.parentClass = JSCNode::getTmpl();
Tmpl = JSClassCreate(&classDef);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCEntityReference.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCEntityReference.h
index 89a7c44..9ed8980 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCEntityReference.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCEntityReference.h
@@ -51,6 +51,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "EntityReference";
classDef.parentClass = JSCNode::getTmpl();
Tmpl = JSClassCreate(&classDef);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCFloat32Array.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCFloat32Array.h
index 567c673..0e7bbf9 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCFloat32Array.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCFloat32Array.h
@@ -61,6 +61,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "Float32Array";
classDef.hasProperty = hasPropertyCustomCallback;
classDef.getProperty = getPropertyCustomCallback;
classDef.setProperty = setPropertyCustomCallback;
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCFloat64Array.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCFloat64Array.h
index 07b1b48..82f1f72 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCFloat64Array.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCFloat64Array.h
@@ -61,6 +61,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "Float64Array";
classDef.hasProperty = hasPropertyCustomCallback;
classDef.getProperty = getPropertyCustomCallback;
classDef.setProperty = setPropertyCustomCallback;
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCInt16Array.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCInt16Array.h
index 232ae65..f56c7b9 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCInt16Array.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCInt16Array.h
@@ -61,6 +61,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "Int16Array";
classDef.hasProperty = hasPropertyCustomCallback;
classDef.getProperty = getPropertyCustomCallback;
classDef.setProperty = setPropertyCustomCallback;
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCInt32Array.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCInt32Array.h
index 2c86dde..76bda20 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCInt32Array.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCInt32Array.h
@@ -61,6 +61,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "Int32Array";
classDef.hasProperty = hasPropertyCustomCallback;
classDef.getProperty = getPropertyCustomCallback;
classDef.setProperty = setPropertyCustomCallback;
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCInt8Array.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCInt8Array.h
index 834ba1d..b46d4cb 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCInt8Array.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCInt8Array.h
@@ -61,6 +61,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "Int8Array";
classDef.hasProperty = hasPropertyCustomCallback;
classDef.getProperty = getPropertyCustomCallback;
classDef.setProperty = setPropertyCustomCallback;
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNamedNodeMap.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNamedNodeMap.h
index aa4876f..5b2f6d9 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNamedNodeMap.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNamedNodeMap.h
@@ -58,6 +58,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "NamedNodeMap";
Tmpl = JSClassCreate(&classDef);
JSClassRetain(Tmpl);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNode.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNode.h
index ced6bc3..91daa79 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNode.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNode.h
@@ -87,6 +87,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "Node";
Tmpl = JSClassCreate(&classDef);
JSClassRetain(Tmpl);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNodeList.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNodeList.h
index ec6a73c..2b5b3bc 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNodeList.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNodeList.h
@@ -54,6 +54,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "NodeList";
classDef.hasProperty = hasPropertyCustomCallback;
classDef.getProperty = getPropertyCustomCallback;
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNodeSet.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNodeSet.h
index 8b56cc2..a384ade 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNodeSet.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNodeSet.h
@@ -55,6 +55,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "NodeSet";
classDef.hasProperty = hasPropertyCustomCallback;
classDef.getProperty = getPropertyCustomCallback;
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNotation.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNotation.h
index 1e68f30..5238bbc 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNotation.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCNotation.h
@@ -53,6 +53,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "Notation";
classDef.parentClass = JSCNode::getTmpl();
Tmpl = JSClassCreate(&classDef);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCProcessingInstruction.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCProcessingInstruction.h
index 2defbc5..fbee5fd 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCProcessingInstruction.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCProcessingInstruction.h
@@ -54,6 +54,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "ProcessingInstruction";
classDef.parentClass = JSCNode::getTmpl();
Tmpl = JSClassCreate(&classDef);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCSCXMLEvent.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCSCXMLEvent.h
index 1b3726a..1d8021d 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCSCXMLEvent.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCSCXMLEvent.h
@@ -61,6 +61,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "SCXMLEvent";
Tmpl = JSClassCreate(&classDef);
JSClassRetain(Tmpl);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCStorage.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCStorage.h
index faa2f8b..dfb66b8 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCStorage.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCStorage.h
@@ -56,6 +56,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "Storage";
Tmpl = JSClassCreate(&classDef);
JSClassRetain(Tmpl);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCText.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCText.h
index 0b440a1..7ca23cb 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCText.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCText.h
@@ -52,6 +52,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "Text";
classDef.parentClass = JSCCharacterData::getTmpl();
Tmpl = JSClassCreate(&classDef);
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint16Array.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint16Array.h
index 8f534ea..19ff639 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint16Array.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint16Array.h
@@ -61,6 +61,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "Uint16Array";
classDef.hasProperty = hasPropertyCustomCallback;
classDef.getProperty = getPropertyCustomCallback;
classDef.setProperty = setPropertyCustomCallback;
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint32Array.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint32Array.h
index 50d2c2f..5d6e371 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint32Array.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint32Array.h
@@ -61,6 +61,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "Uint32Array";
classDef.hasProperty = hasPropertyCustomCallback;
classDef.getProperty = getPropertyCustomCallback;
classDef.setProperty = setPropertyCustomCallback;
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint8Array.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint8Array.h
index 10532e5..af9e79f 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint8Array.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint8Array.h
@@ -61,6 +61,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "Uint8Array";
classDef.hasProperty = hasPropertyCustomCallback;
classDef.getProperty = getPropertyCustomCallback;
classDef.setProperty = setPropertyCustomCallback;
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint8ClampedArray.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint8ClampedArray.h
index 4a9b83f..1558e48 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint8ClampedArray.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCUint8ClampedArray.h
@@ -61,6 +61,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "Uint8ClampedArray";
classDef.hasProperty = hasPropertyCustomCallback;
classDef.getProperty = getPropertyCustomCallback;
classDef.setProperty = setPropertyCustomCallback;
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCXPathResult.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCXPathResult.h
index fe37edf..e145dc1 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCXPathResult.h
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/dom/JSCXPathResult.h
@@ -58,6 +58,7 @@ public:
classDef.staticValues = staticValues;
classDef.staticFunctions = staticFunctions;
classDef.finalize = jsDestructor;
+ classDef.className = "XPathResult";
Tmpl = JSClassCreate(&classDef);
JSClassRetain(Tmpl);
diff --git a/src/uscxml/plugins/invoker/im/IMInvoker.cpp b/src/uscxml/plugins/invoker/im/IMInvoker.cpp
index 9c10bf2..981f2fe 100644
--- a/src/uscxml/plugins/invoker/im/IMInvoker.cpp
+++ b/src/uscxml/plugins/invoker/im/IMInvoker.cpp
@@ -20,6 +20,7 @@
#include "IMInvoker.h"
#include <glog/logging.h>
#include "uscxml/UUID.h"
+#include "uscxml/DOMUtils.h"
#include <boost/algorithm/string.hpp>
#ifdef BUILD_AS_PLUGINS
@@ -162,6 +163,7 @@ PurpleNotifyUiOps IMInvoker::_uiNotifyOps = {
NULL
};
+#if 0
PurplePrivacyUiOps IMInvoker::_uiPrivacyOps = {
purplePermitAdded,
purplePermitRemoved,
@@ -172,6 +174,7 @@ PurplePrivacyUiOps IMInvoker::_uiPrivacyOps = {
NULL,
NULL
};
+#endif
PurpleRequestFeature IMInvoker::_features;
PurpleRequestUiOps IMInvoker::_uiRequestOps = {
@@ -304,9 +307,13 @@ void IMInvoker::initLibPurple(void *userdata, const std::string event) {
if (plugin->info->major_version) pluginData.compound["majorVersion"] = Data(toStr(plugin->info->major_version), Data::VERBATIM);
if (plugin->info->minor_version) pluginData.compound["minorVersion"] = Data(toStr(plugin->info->minor_version), Data::VERBATIM);
- if (plugin->info->type == PURPLE_PLUGIN_PROTOCOL)
+ if (plugin->info->type == PURPLE_PLUGIN_PROTOCOL) {
_pluginData.compound["protocol"].compound[plugin->info->id] = pluginData;
-
+ } else if (plugin->info->type == PURPLE_PLUGIN_STANDARD) {
+// _pluginData.compound["standard"].compound[plugin->info->id] = pluginData;
+ } else if (plugin->info->type == PURPLE_PLUGIN_LOADER) {
+// _pluginData.compound["loader"].compound[plugin->info->id] = pluginData;
+ }
}
_initMutex.unlock();
@@ -340,9 +347,15 @@ void IMInvoker::signedOnCB(PurpleConnection *gc, gpointer null) {
void IMInvoker::conversationCreatedCB(PurpleConversation *conv, void *data) {}
void IMInvoker::chatJoinedCB(PurpleConversation *conv, void *data) {}
void IMInvoker::chatJoinFailedCB(PurpleConnection *gc, GHashTable *components) {}
-void IMInvoker::buddyTypingCB(PurpleAccount *account, const char *name, void *data) {}
-void IMInvoker::buddyTypedCB(PurpleAccount *account, const char *name, void *data) {}
-void IMInvoker::buddyTypingStoppedCB(PurpleAccount *account, const char *name, void *data) {}
+void IMInvoker::buddyTypingCB(PurpleAccount *account, const char *name, void *data) {
+ std::cout << "buddyTypingCB" << std::endl;
+}
+void IMInvoker::buddyTypedCB(PurpleAccount *account, const char *name, void *data) {
+ std::cout << "buddyTypedCB" << std::endl;
+}
+void IMInvoker::buddyTypingStoppedCB(PurpleAccount *account, const char *name, void *data) {
+ std::cout << "buddyTypingStoppedCB" << std::endl;
+}
void IMInvoker::buddyEventCB(PurpleBuddy *buddy, PurpleBuddyEvent event) {
if (!buddy)
@@ -434,15 +447,16 @@ Data IMInvoker::statusToData(PurpleStatus *status) {
const char* statusName = purple_status_get_name(status);
if (statusName) data.compound["name"] = Data(statusName, Data::VERBATIM);
- PurpleStatusType* statusType = purple_status_get_type(status);
+ PurpleStatusType* statusType = purple_status_get_status_type(status);
GList *statusAttrElem;
+ PurpleStatusAttribute* statusAttr;
GList *statusAttrList = purple_status_type_get_attrs(statusType);
- PurpleStatusAttr* statusAttr;
+
for(statusAttrElem = statusAttrList; statusAttrElem; statusAttrElem = statusAttrElem->next) {
- statusAttr = (PurpleStatusAttr*)statusAttrElem->data;
- const char* statusAttrId = purple_status_attr_get_id(statusAttr);
- PurpleValue* statusValue = purple_status_get_attr_value(status, statusAttrId);
+ statusAttr = (PurpleStatusAttribute*)statusAttrElem->data;
+ const char* statusAttrId = purple_status_attribute_get_id(statusAttr);
+ GValue* statusValue = purple_status_get_attr_value(status, statusAttrId);
if (statusValue) {
data.compound[statusAttrId] = purpleValueToData(statusValue);
}
@@ -502,57 +516,56 @@ Data IMInvoker::buddyToData(PurpleBuddy *buddy) {
return data;
}
-Data IMInvoker::purpleValueToData(PurpleValue* value) {
+Data IMInvoker::purpleValueToData(GValue* value) {
Data data;
- switch (purple_value_get_type(value)) {
- case PURPLE_TYPE_BOOLEAN:
- if (purple_value_get_boolean(value))
- data = Data("true");
- data = Data("false");
- break;
- case PURPLE_TYPE_STRING:
- if (purple_value_get_string(value)) {
- data = Data(purple_value_get_string(value), Data::VERBATIM);
+
+ if (false) {
+ } else if (g_type_check_value_holds(value, G_TYPE_CHAR)) {
+ data = Data(g_value_get_schar(value), Data::VERBATIM);
+
+ } else if (g_type_check_value_holds(value, G_TYPE_UCHAR)) {
+ data = Data(g_value_get_uchar(value), Data::VERBATIM);
+
+ } else if (g_type_check_value_holds(value, G_TYPE_BOOLEAN)) {
+ data = Data(g_value_get_boolean(value));
+
+ } else if (g_type_check_value_holds(value, G_TYPE_INT)) {
+ data = Data(g_value_get_int(value));
+
+ } else if (g_type_check_value_holds(value, G_TYPE_UINT)) {
+ data = Data(g_value_get_uint(value));
+
+ } else if (g_type_check_value_holds(value, G_TYPE_LONG)) {
+ data = Data(g_value_get_long(value));
+
+ } else if (g_type_check_value_holds(value, G_TYPE_ULONG)) {
+ data = Data(g_value_get_ulong(value));
+
+ } else if (g_type_check_value_holds(value, G_TYPE_INT64)) {
+ data = Data(g_value_get_int64(value));
+
+ } else if (g_type_check_value_holds(value, G_TYPE_FLOAT)) {
+ data = Data(g_value_get_float(value));
+
+ } else if (g_type_check_value_holds(value, G_TYPE_DOUBLE)) {
+ data = Data(g_value_get_double(value));
+
+ } else if (g_type_check_value_holds(value, G_TYPE_STRING)) {
+ const gchar* tmp = g_value_get_string(value);
+ if (tmp == NULL) {
+ data = Data("", Data::VERBATIM);
+ } else {
+ data = Data(g_value_get_string(value), Data::VERBATIM);
}
- break;
- case PURPLE_TYPE_CHAR:
- Data(purple_value_get_char(value));
- break;
- case PURPLE_TYPE_UCHAR:
- Data(purple_value_get_uchar(value));
- break;
- case PURPLE_TYPE_SHORT:
- Data(purple_value_get_short(value));
- break;
- case PURPLE_TYPE_USHORT:
- Data(purple_value_get_ushort(value));
- break;
- case PURPLE_TYPE_INT:
- Data(purple_value_get_int(value));
- break;
- case PURPLE_TYPE_UINT:
- Data(purple_value_get_uint(value));
- break;
- case PURPLE_TYPE_LONG:
- Data(purple_value_get_long(value));
- break;
- case PURPLE_TYPE_ULONG:
- Data(purple_value_get_ulong(value));
- break;
- case PURPLE_TYPE_INT64:
- Data(purple_value_get_int64(value));
- break;
- case PURPLE_TYPE_UINT64:
- Data(purple_value_get_uint64(value));
- break;
- case PURPLE_TYPE_OBJECT:
- case PURPLE_TYPE_POINTER:
- case PURPLE_TYPE_ENUM:
- case PURPLE_TYPE_BOXED:
- case PURPLE_TYPE_UNKNOWN:
- case PURPLE_TYPE_SUBTYPE:
+
+ } else if (g_type_check_value_holds(value, G_TYPE_OBJECT) ||
+ g_type_check_value_holds(value, G_TYPE_PARAM) ||
+ g_type_check_value_holds(value, G_TYPE_POINTER) ||
+ g_type_check_value_holds(value, G_TYPE_FLAGS) ||
+ g_type_check_value_holds(value, G_TYPE_ENUM)) {
LOG(ERROR) << "purple thingy not supported";
- break;
+ } else {
+ LOG(ERROR) << "purple thingy unknown";
}
return data;
}
@@ -567,20 +580,20 @@ IMInvoker::IMInvoker() {
// make sure to have the shebang initialized when we leave
_initCond.wait(_initMutex);
}
-
}
IMInvoker::~IMInvoker() {
if (_account) {
_accountMutex.lock();
_accountInstances.erase(_account);
- purple_account_destroy(_account);
+// purple_account_destroy(_account);
_accountMutex.unlock();
}
};
boost::shared_ptr<InvokerImpl> IMInvoker::create(InterpreterImpl* interpreter) {
boost::shared_ptr<IMInvoker> invoker = boost::shared_ptr<IMInvoker>(new IMInvoker());
+ invoker->_dataModelVars.compound["plugins"] = _pluginData;
return invoker;
}
@@ -603,27 +616,36 @@ void IMInvoker::send(void *userdata, const std::string event) {
// we are in the thread that manages all of libpurple
EventContext* ctx = (EventContext*)userdata;
+ if (!ctx)
+ return;
+
+ if (!ctx->instance || !ctx->instance->_account) {
+ ctx->instance->returnErrorExecution("No account available");
+ delete(ctx);
+ return;
+ }
+
if (iequals(ctx->sendReq.name, "im.send")) {
- if (ctx->instance->_account) {
- std::string receiver;
- Event::getParam(ctx->sendReq.params, "receiver", receiver);
+ std::string receiver;
+ Event::getParam(ctx->sendReq.params, "receiver", receiver);
- Data data;
- Event::getParam(ctx->sendReq.params, "data", data);
+ Data data;
+ Event::getParam(ctx->sendReq.params, "data", data);
- // purple_conv_im_send
- PurpleConversation* conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, ctx->instance->_account, receiver.c_str());
- purple_conv_im_send(purple_conversation_get_im_data(conv), ctx->sendReq.content.c_str());
+ PurpleIMConversation* conv = purple_im_conversation_new(ctx->instance->_account, receiver.c_str());
+ if (ctx->sendReq.content.length() > 0)
+ purple_conversation_send(PURPLE_CONVERSATION(conv), ctx->sendReq.content.c_str());
- if (data.binary) {
- PurpleConnection *gc = purple_account_get_connection(ctx->instance->_account);
- PurplePlugin *prpl;
- PurplePluginProtocolInfo *prpl_info;
+#if 0
+ if (data.binary) {
+ PurpleConnection *gc = purple_account_get_connection(ctx->instance->_account);
+ PurplePlugin *prpl;
+ PurplePluginProtocolInfo *prpl_info;
- if (gc) {
- prpl = purple_connection_get_prpl(gc);
- prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+ if (gc) {
+ prpl = purple_connection_get_prpl(gc);
+ prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
// if (prpl_info && prpl_info->new_xfer) {
// PurpleXfer* xfer = (prpl_info->new_xfer)(purple_account_get_connection(ctx->instance->_account), receiver.c_str());
@@ -633,22 +655,43 @@ void IMInvoker::send(void *userdata, const std::string event) {
// purple_xfer_request_accepted(xfer, "/Users/sradomski/Documents/W3C Standards.pdf");
// }
- //Set the filename
+ //Set the filename
// purple_xfer_set_local_filename(xfer, [[fileTransfer localFilename] UTF8String]);
// purple_xfer_set_filename(xfer, [[[fileTransfer localFilename] lastPathComponent] UTF8String]);
// xfer->ui_data
// purple_xfer_request(xfer);
- serv_send_file(gc, "sradomski@localhost", "/Users/sradomski/Documents/W3C Standards.pdf");
+ serv_send_file(gc, "sradomski@localhost", "/Users/sradomski/Documents/W3C Standards.pdf");
// if (prpl_info->send_file && (prpl_info->can_receive_file && prpl_info->can_receive_file(gc, receiver.c_str()))) {
// prpl_info->send_file(gc, receiver.c_str(), "/Users/sradomski/Documents/W3C Standards.pdf");
// }
// prpl_info->send_raw(gc, data.binary->data, data.binary->size);
- }
-
}
+
+ }
+#endif
+ } else if (iequals(ctx->sendReq.name, "im.buddy.add")) {
+ std::string buddyName;
+ Event::getParam(ctx->sendReq.params, "name", buddyName);
+
+ std::string reqMsg;
+ Event::getParam(ctx->sendReq.params, "msg", reqMsg);
+
+ PurpleBuddy* buddy = purple_buddy_new(ctx->instance->_account, buddyName.c_str(), NULL);
+ purple_blist_add_buddy(buddy, NULL, NULL, NULL);
+ purple_account_add_buddy(ctx->instance->_account, buddy, reqMsg.c_str());
+
+ } else if (iequals(ctx->sendReq.name, "im.buddy.remove")) {
+ std::string buddyName;
+ Event::getParam(ctx->sendReq.params, "name", buddyName);
+
+ PurpleBuddy* buddy = purple_blist_find_buddy(ctx->instance->_account, buddyName.c_str());
+ if (PURPLE_IS_BUDDY(buddy)) {
+ purple_account_remove_buddy(ctx->instance->_account, buddy, purple_buddy_get_group(buddy));
+ purple_blist_remove_buddy(buddy);
}
}
+
delete(ctx);
}
@@ -683,6 +726,17 @@ void IMInvoker::invoke(void *userdata, const std::string event) {
purple_account_set_password(instance->_account, password.c_str(), NULL, NULL);
purple_account_set_enabled(instance->_account, "uscxml", true);
+ GSList* buddies = purple_blist_get_buddies();
+ GSList *cur;
+ for (cur = buddies; cur; cur = cur->next) {
+ std::string buddyName = purple_buddy_get_name((PurpleBuddy *)cur->data);
+ Data buddyData = buddyToData((PurpleBuddy *)cur->data);
+ instance->_dataModelVars.compound["buddies"].compound[buddyName] = buddyData;
+ }
+ g_slist_free(buddies);
+
+
+
delete(ctx);
_accountMutex.unlock();
}
@@ -858,20 +912,106 @@ void IMInvoker::accountCloseRequest(void *ui_handle) {
//libpurple conversation operations
void IMInvoker::purpleCreateConversation(PurpleConversation *conv) {}
void IMInvoker::purpleDestroyConversation(PurpleConversation *conv) {}
-void IMInvoker::purpleWriteChat(PurpleConversation *conv, const char *who, const char *message, PurpleMessageFlags flags, time_t mtime) {}
-void IMInvoker::purpleWriteIm(PurpleConversation *conv, const char *who, const char *message, PurpleMessageFlags flags, time_t mtime) {}
+void IMInvoker::purpleWriteChat(PurpleConversation *conv, const char *who, const char *message, PurpleMessageFlags flags, time_t mtime) {
+ std::cout << "purpleWriteChat" << std::endl;
+}
+void IMInvoker::purpleWriteIm(PurpleConversation *conv, const char *who, const char *message, PurpleMessageFlags flags, time_t mtime) {
+ std::cout << "purpleWriteIm" << std::endl;
+}
void IMInvoker::purpleWriteConv(PurpleConversation *conv, const char *name, const char *alias, const char *message, PurpleMessageFlags flags, time_t mtime) {
- const char *who;
+
+ GET_INSTANCE_IN_CALLBACK(purple_conversation_get_account(conv));
+ if (inst == NULL)
+ return;
+
+ Event msgRcvdEv;
+ if (flags & PURPLE_MESSAGE_SEND)
+ msgRcvdEv.name = "im.send.conv";
+ if (flags & PURPLE_MESSAGE_RECV)
+ msgRcvdEv.name = "im.rcvd.conv";
+
if (alias && *alias)
- who = alias;
- else if (name && *name)
- who = name;
- else
- who = NULL;
+ msgRcvdEv.data.compound["alias"] = Data(alias, Data::VERBATIM);
+ if (name && *name)
+ msgRcvdEv.data.compound["name"] = Data(name, Data::VERBATIM);
+
+ msgRcvdEv.data.compound["conversation"] = Data(purple_conversation_get_name(conv), Data::VERBATIM);
+ msgRcvdEv.data.compound["timestamp"] = Data(mtime);
+ msgRcvdEv.data.compound["time"] = Data(purple_utf8_strftime("%T", localtime(&mtime)), Data::VERBATIM);
+ msgRcvdEv.data.compound["date"] = Data(purple_utf8_strftime("%F", localtime(&mtime)), Data::VERBATIM);
+ msgRcvdEv.data.compound["datetime"] = Data(purple_utf8_strftime("%c", localtime(&mtime)), Data::VERBATIM);
+
+ msgRcvdEv.data.compound["raw"] = Data(message, Data::VERBATIM);
+ if (flags & PURPLE_MESSAGE_RAW) {
+ msgRcvdEv.data.compound["message"] = Data(message, Data::VERBATIM);
+ } else {
+ bool successParse = false; // unfortunate code layout as parsers operator= is private :(
+ std::string origErrors;
+
+ // try to parse as XHTML
+ {
+ NameSpacingParser parser = NameSpacingParser::fromXML(message);
+ if (!parser.errorsReported()) {
+ msgRcvdEv.data.compound["message"].node = parser.getDocument().getDocumentElement();
+ successParse = true;
+ } else {
+ origErrors = parser.errors();
+ }
+ }
+
+ // try again with added XHTML tags
+ if (!successParse) {
+ NameSpacingParser parser = NameSpacingParser::fromXML(std::string("<html xmlns='http://jabber.org/protocol/xhtml-im'>") +
+ std::string("<body xmlns='http://www.w3.org/1999/xhtml'>") +
+ message +
+ std::string("</body>") +
+ std::string("</html>"));
+ if (!parser.errorsReported()) {
+ msgRcvdEv.data.compound["message"].node = parser.getDocument().getDocumentElement();
+ successParse = true;
+ } else {
+ LOG(ERROR) << "Cannot parse message as XHTML: " << origErrors << std::endl << message;
+ }
+ }
+
+ if (successParse) {
+ // prepare stripped message content
+ std::list<Arabica::DOM::Node<std::string> > texts = DOMUtils::getElementsByType(msgRcvdEv.data.compound["message"].node, Arabica::DOM::Node_base::TEXT_NODE);
+ std::stringstream ssTexts;
+ std::string seperator;
+ while(texts.size() > 0) {
+ ssTexts << seperator << texts.front().getNodeValue();
+ texts.pop_front();
+ if (ssTexts.str().length() > 0 && isspace(ssTexts.str()[ssTexts.str().length() - 1])) {
+ seperator = "";
+ } else {
+ seperator = " ";
+ }
+ }
+
+ msgRcvdEv.data.compound["stripped"] = Data(ssTexts.str(), Data::VERBATIM);
+ }
+ // erase for now as JS dump croaks on dom nodes with cycles
+ msgRcvdEv.data.compound.erase("message");
+ }
- printf("(%s) %s %s: %s\n", purple_conversation_get_name(conv),
- purple_utf8_strftime("(%H:%M:%S)", localtime(&mtime)),
- who, message);
+ msgRcvdEv.data.compound["flags"].compound["send"] = Data((bool)(flags & PURPLE_MESSAGE_SEND));
+ msgRcvdEv.data.compound["flags"].compound["rcvd"] = Data((bool)(flags & PURPLE_MESSAGE_RECV));
+ msgRcvdEv.data.compound["flags"].compound["system"] = Data((bool)(flags & PURPLE_MESSAGE_SYSTEM));
+ msgRcvdEv.data.compound["flags"].compound["auoresponse"] = Data((bool)(flags & PURPLE_MESSAGE_AUTO_RESP));
+ msgRcvdEv.data.compound["flags"].compound["activeonly"] = Data((bool)(flags & PURPLE_MESSAGE_ACTIVE_ONLY));
+ msgRcvdEv.data.compound["flags"].compound["containsnick"] = Data((bool)(flags & PURPLE_MESSAGE_NICK));
+ msgRcvdEv.data.compound["flags"].compound["nolog"] = Data((bool)(flags & PURPLE_MESSAGE_NO_LOG));
+ msgRcvdEv.data.compound["flags"].compound["whisper"] = Data((bool)(flags & PURPLE_MESSAGE_WHISPER));
+ msgRcvdEv.data.compound["flags"].compound["error"] = Data((bool)(flags & PURPLE_MESSAGE_ERROR));
+ msgRcvdEv.data.compound["flags"].compound["delayed"] = Data((bool)(flags & PURPLE_MESSAGE_DELAYED));
+ msgRcvdEv.data.compound["flags"].compound["raw"] = Data((bool)(flags & PURPLE_MESSAGE_RAW));
+ msgRcvdEv.data.compound["flags"].compound["images"] = Data((bool)(flags & PURPLE_MESSAGE_IMAGES));
+ msgRcvdEv.data.compound["flags"].compound["notify"] = Data((bool)(flags & PURPLE_MESSAGE_NOTIFY));
+ msgRcvdEv.data.compound["flags"].compound["nolinkify"] = Data((bool)(flags & PURPLE_MESSAGE_NO_LINKIFY));
+ msgRcvdEv.data.compound["flags"].compound["invisible"] = Data((bool)(flags & PURPLE_MESSAGE_INVISIBLE));
+
+ inst->returnEvent(msgRcvdEv);
}
void IMInvoker::purpleChatAddUsers(PurpleConversation *conv, GList *cbuddies, gboolean new_arrivals) {}
void IMInvoker::purpleChatRenameUser(PurpleConversation *conv, const char *old_name, const char *new_name, const char *new_alias) {}
@@ -1026,14 +1166,14 @@ void* IMInvoker::purpleRequestFile(const char *title, const char *filename,
PurpleRequestCommonParameters *cpar, void *user_data) {
// click ok
PurpleXfer *xfer = (PurpleXfer *)user_data;
- PurpleXferType xferType = purple_xfer_get_type(xfer);
- if (xferType == PURPLE_XFER_RECEIVE) {
+ PurpleXferType xferType = purple_xfer_get_xfer_type(xfer);
+ if (xferType == PURPLE_XFER_TYPE_RECEIVE) {
((PurpleRequestFileCb)ok_cb)(user_data, filename);
- } else if (xferType == PURPLE_XFER_SEND) {
- if (xfer->local_filename != NULL && xfer->filename != NULL) {
- ((PurpleRequestFileCb)ok_cb)(user_data, xfer->local_filename);
+ } else if (xferType == PURPLE_XFER_TYPE_SEND) {
+ if (purple_xfer_get_local_filename(xfer) != NULL && purple_xfer_get_filename(xfer) != NULL) {
+ ((PurpleRequestFileCb)ok_cb)(user_data, purple_xfer_get_local_filename(xfer));
} else {
- ((PurpleRequestFileCb)cancel_cb)(user_data, xfer->local_filename);
+ ((PurpleRequestFileCb)cancel_cb)(user_data, purple_xfer_get_local_filename(xfer));
}
}
return NULL;
diff --git a/src/uscxml/plugins/invoker/im/IMInvoker.h b/src/uscxml/plugins/invoker/im/IMInvoker.h
index 25cbdd3..2198cc3 100644
--- a/src/uscxml/plugins/invoker/im/IMInvoker.h
+++ b/src/uscxml/plugins/invoker/im/IMInvoker.h
@@ -79,7 +79,7 @@ private:
static Data buddyToData(PurpleBuddy *buddy);
static Data statusToData(PurpleStatus *status);
- static Data purpleValueToData(PurpleValue* value);
+ static Data purpleValueToData(GValue* value);
static PurpleAccountUiOps _uiAccountOps;
static PurpleEventLoopUiOps _uiEventLoopOps;
@@ -88,7 +88,7 @@ private:
static PurpleBlistUiOps _uiBuddyOps;
static PurpleXferUiOps _uiXferOps;
static PurpleNotifyUiOps _uiNotifyOps;
- static PurplePrivacyUiOps _uiPrivacyOps;
+// static PurplePrivacyUiOps _uiPrivacyOps;
static PurpleRequestUiOps _uiRequestOps;
static PurpleConnectionUiOps _uiConnectOps;
static PurpleWhiteboardUiOps _uiWhiteboardOps;
diff --git a/test/samples/uscxml/test-instant-messaging.scxml b/test/samples/uscxml/test-instant-messaging.scxml
index 588b2b7..e7f8555 100644
--- a/test/samples/uscxml/test-instant-messaging.scxml
+++ b/test/samples/uscxml/test-instant-messaging.scxml
@@ -12,30 +12,41 @@
<script src="http://uscxml.tk.informatik.tu-darmstadt.de/scripts/dump.js" />
<state id="idle">
<onentry>
- <send event="dump" delay="100ms" />
+ <!-- <send event="dump" delay="100ms" /> -->
</onentry>
<invoke type="instant-messaging" id="im">
<param name="username" expr="'uscxml@localhost'" />
- <param name="password" expr="'password'" />
+ <param name="password" expr="'uscxml'" />
<param name="protocol" expr="'prpl-jabber'" />
<finalize>
- <script>print("-----------------\n"); dump(_event);</script>
+ <script>
+ print("-----------------\n");
+ dump(_event);</script>
</finalize>
</invoke>
- <state id="dump">
+ <!-- <state id="dump">
<transition event="dump" target="dump">
<send event="dump" delay="1000ms" />
<script>//dump(_invokers['im']);</script>
</transition>
- </state>
+ </state> -->
+
+ <transition event="im.buddy.status.changed">
+ <!-- <script>print("\n\n"); dump(_invokers['im']);</script> -->
+ </transition>
- <transition event="im.buddy.status.changed" cond="_event.data.name === 'sradomski@localhost'">
+ <transition event="im.signed.on">
+ <!-- <send target="#_im" event="im.buddy.add">
+ <param name="name" expr="'sradomski@localhost'" />
+ <param name="msg" expr="'Please add me as a contact!'" />
+ </send>
+ <script>print("\n\n"); dump(_invokers['im']);</script> -->
<send target="#_im" event="im.send">
<param name="receiver" expr="'sradomski@localhost'" />
- <param name="data" expr="someBinaryData" />
- <content>Hey There!</content>
+ <param name="data" expr="someBinaryData" /> <!-- Unsupported :( -->
+ <content><![CDATA[Have a look <a href="http://www.heise.de">here</a>]]></content>
</send>
</transition>