Update wrt-plugins-common_0.3.53
[framework/web/wrt-plugins-common.git] / src / js-overlay / js_overlay_addEventListener.cpp
  *
  * @file       AddEventListenerSupport.cpp
  * @author     Grzegorz Krawczyk (g.krawczyk@samsung.com)
+ * @author     Yunchan Cho (yunchan.cho@samsung.com)
  * @version    0.1
  * @brief
  */
 
-#include "AddEventListenerSupport.h"
 
 #include <string>
 #include <dpl/log/log.h>
 #include <dpl/foreach.h>
 #include <CommonsJavaScript/Converter.h>
+#include <js_overlay_addEventListener.h>
+#include <js_overlay_types.h>
 #include "JSStorageEvent.h"
+#include "JSTizenServiceEvent.h"
 
 namespace WrtPlugins {
 namespace W3C {
@@ -38,12 +41,25 @@ AddEventListenerSupport::IFramesListeners
 
 JSContextRef AddEventListenerSupport::m_context = NULL;
 
-void AddEventListenerSupport::initializeContext(JSContextRef context)
+void AddEventListenerSupport::initialize(JSContextRef context)
 {
     if(!m_context) m_context = context;
 }
 
-bool AddEventListenerSupport::isInitialized() {return m_context!=NULL;}
+void AddEventListenerSupport::deinitialize()
+{
+    if(!m_context) {
+        LogDebug("Not yet initialized");
+    }
+
+    m_listeners.clear();
+    m_context = NULL;
+}
+
+bool AddEventListenerSupport::isInitialized() 
+{
+    return m_context!=NULL;
+}
 
 JSValueRef AddEventListenerSupport::
 AddEventListener(JSContextRef context,
@@ -64,8 +80,10 @@ AddEventListener(JSContextRef context,
 
     std::string eventName = WrtDeviceApis::CommonsJavaScript::
         Converter(context).toString(arguments[0]);
+    LogDebug("Event name: " << eventName);
 
-    if(eventName != "storage"){
+    if(eventName != "storage" &&
+            eventName != "appservice"){
         LogDebug("Event type not supported");
         return JSValueMakeUndefined(context);
     }
@@ -81,17 +99,32 @@ AddEventListener(JSContextRef context,
         return JSValueMakeUndefined(context);
     }
     //add object to Listeners
-    CallbackData data = {objectCb, thisObject};
-    getIFrameListeners(thisObject)->push_back(data);
+    
+    //set event information according to each event type
+    if(eventName == "storage") {
+        CallbackData data = {
+            StorageCustomEvent,
+            objectCb, 
+            thisObject};
+        getIFrameListeners(thisObject)->push_back(data);
+    } else if (eventName == "appservice") {
+        CallbackData data = {
+            ServiceCustomEvent,
+            objectCb, 
+            thisObject};
+        getIFrameListeners(thisObject)->push_back(data);
+    }
 
     return JSValueMakeUndefined(context);
 }
 
-void AddEventListenerSupport::CallListenersFromDifferentIFrames(
+void AddEventListenerSupport::
+CallStorageListenersFromDifferentIFrames(
     JSObjectRef iframe,
     const WrtDeviceApis::StorageEvent::Api::IStorageEventPtr& event)
 {
     LogDebug("Invoked callbacks");
+    LogInfo("Context: " << m_context);
 
     FOREACH(it, m_listeners)
     {
@@ -113,18 +146,63 @@ void AddEventListenerSupport::CallListenersFromDifferentIFrames(
         {
             LogDebug("Call");
 
+            if (listener->eventType ==
+                    StorageCustomEvent)
+            {
+                JSObjectCallAsFunction(
+                    m_context,
+                    listener->object,
+                    NULL,
+                    argc,
+                    argv,
+                    NULL);
+            }
+        }
+
+        JSValueUnprotect(m_context, eventObject);
+    }
+
+    LogDebug("Done");
+};
+
+void AddEventListenerSupport::
+CallServiceListenersFromIFrame(JSObjectRef iframe,
+    const WrtDeviceApis::TizenServiceEvent::Api::ITizenServiceEventPtr& event)
+{
+    using namespace WrtPlugins::Tizen;
+    LogDebug("Invoked callbacks");
+
+    IFramesListeners::iterator it = m_listeners.find(iframe);
+    if (it == m_listeners.end()) {
+        LogDebug("This frame object not existed");
+        return;
+    }
+
+    auto eventPriv = 
+        new JSTizenServiceEventPrivateObject(m_context, event);
+
+    JSObjectRef eventObject =
+        JSObjectMake(m_context, JSTizenServiceEvent::getClassRef(), eventPriv);
+    const size_t argc = 1;
+    JSValueRef argv[argc] = {eventObject};
+
+    JSValueProtect(m_context, eventObject);
+    FOREACH(listener, *it->second)
+    {
+        if (listener->eventType ==
+                ServiceCustomEvent)
+        {
+            LogDebug("Call");
             JSObjectCallAsFunction(
                 m_context,
                 listener->object,
-                NULL,
+                iframe,
                 argc,
                 argv,
                 NULL);
         }
-
-        JSValueUnprotect(m_context, eventObject);
     }
-
+    JSValueUnprotect(m_context, eventObject);
     LogDebug("Done");
 };