From a39086067c99ab691f704017ff853250469aa91a Mon Sep 17 00:00:00 2001 From: Stefan Radomski Date: Wed, 8 Jan 2014 04:15:10 +0100 Subject: Updated IM invoker for latest libpurple --- CMakeLists.txt | 5 +- contrib/cmake/FindGObject.cmake | 52 ++++ contrib/dom/scripts/CodeGeneratorArabicaJSC.pm | 1 + src/uscxml/DOMUtils.cpp | 40 ++- src/uscxml/DOMUtils.h | 1 + src/uscxml/Message.h | 1 + .../ecmascript/JavaScriptCore/JSCDataModel.cpp | 8 + .../ecmascript/JavaScriptCore/dom/JSCArrayBuffer.h | 1 + .../JavaScriptCore/dom/JSCArrayBufferView.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCAttr.h | 1 + .../JavaScriptCore/dom/JSCCDATASection.h | 1 + .../JavaScriptCore/dom/JSCCharacterData.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCComment.h | 1 + .../JavaScriptCore/dom/JSCDOMImplementation.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCDataView.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCDocument.h | 1 + .../JavaScriptCore/dom/JSCDocumentFragment.h | 1 + .../JavaScriptCore/dom/JSCDocumentType.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCElement.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCEntity.h | 1 + .../JavaScriptCore/dom/JSCEntityReference.h | 1 + .../JavaScriptCore/dom/JSCFloat32Array.h | 1 + .../JavaScriptCore/dom/JSCFloat64Array.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCInt16Array.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCInt32Array.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCInt8Array.h | 1 + .../JavaScriptCore/dom/JSCNamedNodeMap.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCNode.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCNodeList.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCNodeSet.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCNotation.h | 1 + .../JavaScriptCore/dom/JSCProcessingInstruction.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCSCXMLEvent.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCStorage.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCText.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCUint16Array.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCUint32Array.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCUint8Array.h | 1 + .../JavaScriptCore/dom/JSCUint8ClampedArray.h | 1 + .../ecmascript/JavaScriptCore/dom/JSCXPathResult.h | 1 + src/uscxml/plugins/invoker/im/IMInvoker.cpp | 332 +++++++++++++++------ src/uscxml/plugins/invoker/im/IMInvoker.h | 4 +- test/samples/uscxml/test-instant-messaging.scxml | 27 +- 43 files changed, 395 insertions(+), 109 deletions(-) create mode 100644 contrib/cmake/FindGObject.cmake 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 +# Copyright (c) 2006, Tim Beaulen +# +# 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& node) return xPath; } +std::list > DOMUtils::getElementsByType(const Arabica::DOM::Node& root, Arabica::DOM::Node_base::Type type) { + std::list > result; + std::list > stack; + std::list >::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 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()); 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& node); + static std::list > getElementsByType(const Arabica::DOM::Node& root, Arabica::DOM::Node_base::Type type); }; class ScriptEntityResolver : public Arabica::SAX::EntityResolver { 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 Data(T value) : atom(toStr(value)), type(INTERPRETED) {} + template Data(T value, Type type_) : atom(toStr(value)), type(type_) {} explicit Data(const Arabica::DOM::Node& 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(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::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 #include "uscxml/UUID.h" +#include "uscxml/DOMUtils.h" #include #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 IMInvoker::create(InterpreterImpl* interpreter) { boost::shared_ptr invoker = boost::shared_ptr(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("") + + std::string("") + + message + + std::string("") + + std::string("")); + 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 > 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 @@ + - + + + + + - + + - - Hey There! + + here]]> -- cgit v0.12