[TVChannel] Listeners cpp implementation
authorPrzemyslaw Ciezkowski <p.ciezkowski@samsung.com>
Wed, 17 Dec 2014 12:51:00 +0000 (13:51 +0100)
committerPawel Andruszkiewicz <p.andruszkie@samsung.com>
Mon, 2 Feb 2015 11:07:56 +0000 (20:07 +0900)
Change-Id: I3e624ca03ddf0ecd1c2929737664344fd16581d7
Signed-off-by: Przemyslaw Ciezkowski <p.ciezkowski@samsung.com>
src/tvchannel/tvchannel_api.js
src/tvchannel/tvchannel_instance.cc
src/tvchannel/tvchannel_instance.h
src/tvchannel/tvchannel_manager.cc
src/tvchannel/tvchannel_manager.h

index 8a38d6a5c12ce35f54da54d9cc5386015e85fcfb..e36054be10190bbdca4ca703a32ca01c458913ce 100644 (file)
@@ -81,7 +81,7 @@ ListenerManager.prototype.onListenerCalled = function(msg) {
   var channel = new ChannelInfo(msg.channel);
   for (var key in this.listeners) {
     if (this.listeners.hasOwnProperty(key)) {
-      this.listeners[key](channel);
+      this.listeners[key](channel, msg.windowType);
     }
   }
 };
index e916eaab37e24c6c6d7e00cb1cc3ea8ac41c5b31..9c06d2d4fd1771b5254e061ccc8fb6fa07fe6a77 100644 (file)
@@ -4,11 +4,9 @@
 
 #include "tvchannel/tvchannel_instance.h"
 #include <functional>
-#include <memory>
 #include "common/logger.h"
 #include "tizen/tizen.h"
 #include "common/picojson.h"
-#include "tvchannel/tvchannel_manager.h"
 #include "tvchannel/channel_info.h"
 #include "tvchannel/program_info.h"
 
@@ -25,6 +23,7 @@ TVChannelInstance::TVChannelInstance() {
         std::bind(&TVChannelInstance::getCurrentProgram, this,
             std::placeholders::_1,
             std::placeholders::_2));
+    TVChannelManager::getInstance()->registerListener(this);
 }
 
 TVChannelInstance::~TVChannelInstance() {
@@ -36,6 +35,12 @@ void TVChannelInstance::getCurrentChannel(picojson::value const& args,
     std::unique_ptr< ChannelInfo > pChannel = TVChannelManager::getInstance()->getCurrentChannel(
         args.get("windowType").get<std::string>());
 
+    picojson::value v = channelInfoToJson(pChannel);
+    ReportSuccess(v, out);
+}
+
+picojson::value TVChannelInstance::channelInfoToJson(
+    const std::unique_ptr<ChannelInfo> &pChannel) {
     picojson::value::object channel;
     channel.insert(
         std::make_pair("major",
@@ -71,11 +76,10 @@ void TVChannelInstance::getCurrentChannel(picojson::value const& args,
         std::make_pair("serviceName",
             picojson::value(pChannel->getServiceName())));
 
-    picojson::value v(channel);
-
-    ReportSuccess(v, out);
+    return picojson::value(channel);
 }
 
+
 void TVChannelInstance::getCurrentProgram(const picojson::value& args,
     picojson::object& out) {
     std::unique_ptr<ProgramInfo> pInfo(TVChannelManager::getInstance()
@@ -104,6 +108,23 @@ void TVChannelInstance::getCurrentProgram(const picojson::value& args,
     ReportSuccess(result, out);
 }
 
+void TVChannelInstance::onChannelChange() {
+    LOGD("Enter");
+    try {
+        picojson::value::object dict;
+        std::unique_ptr<ChannelInfo> pChannel = TVChannelManager::getInstance()
+            ->getCurrentChannel("MAIN");
+        dict["listenerId"] = picojson::value("ChannelChanged");
+        dict["channel"] = channelInfoToJson(pChannel);
+        dict["windowType"] = picojson::value("MAIN");
+        picojson::value result(dict);
+        PostMessage(result.serialize().c_str());
+    } catch (common::PlatformException& e) {
+        LOGW("Failed to post message: %s", e.message().c_str());
+    } catch (...) {
+        LOGW("Failed to post message, unknown error");
+    }
+}
 
 }  // namespace tvchannel
 }  // namespace extension
index 8dcd8e38842b2cd546d44ce96b4c0419462ad400..cd852ef8c0b5aae6036c8b1991452309d53eec16 100644 (file)
@@ -6,16 +6,19 @@
 #define SRC_TVCHANNEL_TVCHANNEL_INSTANCE_H_
 
 #include <string>
+#include <memory>
 
 #include "common/extension.h"
 #include "common/picojson.h"
-
+#include "tvchannel/tvchannel_manager.h"
 #include "tvchannel/tvchannel_extension.h"
 
 namespace extension {
 namespace tvchannel {
 
-class TVChannelInstance: public common::ParsedInstance {
+class TVChannelInstance:
+        public common::ParsedInstance,
+        public EventListener {
  public:
     TVChannelInstance();
     virtual ~TVChannelInstance();
@@ -23,6 +26,9 @@ class TVChannelInstance: public common::ParsedInstance {
  private:
     void getCurrentChannel(const picojson::value& args, picojson::object& out);
     void getCurrentProgram(const picojson::value& args, picojson::object& out);
+    virtual void onChannelChange();
+    picojson::value channelInfoToJson(
+        const std::unique_ptr<ChannelInfo> &pChannel);
 };
 
 }  // namespace tvchannel
index a1322d97979c84d2ce9954c07f477180182e519e..57b15eda37af999fd9684c7dbeefdc7022e8e167 100644 (file)
@@ -131,6 +131,38 @@ ProgramInfo* TVChannelManager::getCurrentProgram(
     return program;
 }
 
+void TVChannelManager::registerListener(EventListener* listener) {
+    LOGD("Enter");
+    m_listener = listener;
+    ISignalSubscriber* subscriber;
+    int ret = TVServiceAPI::CreateSignalSubscriber(signalListener, &subscriber);
+    if (TV_SERVICE_API_SUCCESS != ret) {
+        LOGW("Failed to create tvs-api SignalSubscriber");
+        return;
+    }
+    ret = subscriber->Subscribe(SIGNAL_TUNE_SUCCESS);
+    if (TV_SERVICE_API_METHOD_SUCCESS != ret) {
+        LOGW("Failed to add listener: SIGNAL_TUNE_SUCCESS");
+    }
+}
+
+int TVChannelManager::signalListener(ESignalType type,
+    TSSignalData data, void*) {
+    LOGD("Enter: %d", type);
+    if (!getInstance()->m_listener) {
+        LOGE("Listener is empty, ignoring message");
+        return 0;
+    }
+    switch (type) {
+        case SIGNAL_TUNE_SUCCESS:
+            getInstance()->m_listener->onChannelChange();
+            break;
+        default:
+            LOGW("Unrecognized event type");
+    }
+    return 0;
+}
+
 void TVChannelManager::ucs2utf8(char *out, size_t out_len, char *in,
         size_t in_len) {
     iconv_t cd;
index a35eb4d6522bd535a93047050b10db53a7394c21..e1796960b6bd02269edf99420135625e93ef6dd1 100644 (file)
@@ -24,15 +24,23 @@ static const int TV_SERVICE_API_METHOD_FAILURE = -1;
 //  You need to check error return in function/method docs and use correct
 //  constant
 
+class EventListener {
+ public:
+    virtual void onChannelChange() = 0;
+};
+
 class TVChannelManager {
  public:
     static TVChannelManager* getInstance();
     std::unique_ptr<ChannelInfo> getCurrentChannel(std::string const& _windowType);
     ProgramInfo* getCurrentProgram(std::string const& _windowType);
     static void ucs2utf8(char *out, size_t out_len, char *in, size_t in_len);
+    void registerListener(EventListener* listener);
  private:
+    EventListener* m_listener;
     //  Not copyable, assignable, movable
-    TVChannelManager() {
+    TVChannelManager():
+        m_listener(NULL) {
     }
     TVChannelManager(TVChannelManager const&) = delete;
     void operator=(TVChannelManager const&) = delete;
@@ -40,6 +48,7 @@ class TVChannelManager {
 
     EProfile getProfile(WindowType windowType);
     TCServiceId getCurrentChannelId(std::string const& _windowType);
+    static int signalListener(ESignalType type, TSSignalData data, void*);
 };
 
 }  // namespace tvchannel