From 533d8992f0f50746c30a2fc97e7722730c87acf6 Mon Sep 17 00:00:00 2001
From: Przemyslaw Ciezkowski
Date: Wed, 17 Dec 2014 13:51:00 +0100
Subject: [PATCH] [TVChannel] Listeners cpp implementation
Change-Id: I3e624ca03ddf0ecd1c2929737664344fd16581d7
Signed-off-by: Przemyslaw Ciezkowski
---
src/tvchannel/tvchannel_api.js | 2 +-
src/tvchannel/tvchannel_instance.cc | 31 +++++++++++++++++++++++-----
src/tvchannel/tvchannel_instance.h | 10 +++++++--
src/tvchannel/tvchannel_manager.cc | 32 +++++++++++++++++++++++++++++
src/tvchannel/tvchannel_manager.h | 11 +++++++++-
5 files changed, 77 insertions(+), 9 deletions(-)
diff --git a/src/tvchannel/tvchannel_api.js b/src/tvchannel/tvchannel_api.js
index 8a38d6a5..e36054be 100644
--- a/src/tvchannel/tvchannel_api.js
+++ b/src/tvchannel/tvchannel_api.js
@@ -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);
}
}
};
diff --git a/src/tvchannel/tvchannel_instance.cc b/src/tvchannel/tvchannel_instance.cc
index e916eaab..9c06d2d4 100644
--- a/src/tvchannel/tvchannel_instance.cc
+++ b/src/tvchannel/tvchannel_instance.cc
@@ -4,11 +4,9 @@
#include "tvchannel/tvchannel_instance.h"
#include
-#include
#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());
+ picojson::value v = channelInfoToJson(pChannel);
+ ReportSuccess(v, out);
+}
+
+picojson::value TVChannelInstance::channelInfoToJson(
+ const std::unique_ptr &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 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 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
diff --git a/src/tvchannel/tvchannel_instance.h b/src/tvchannel/tvchannel_instance.h
index 8dcd8e38..cd852ef8 100644
--- a/src/tvchannel/tvchannel_instance.h
+++ b/src/tvchannel/tvchannel_instance.h
@@ -6,16 +6,19 @@
#define SRC_TVCHANNEL_TVCHANNEL_INSTANCE_H_
#include
+#include
#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 &pChannel);
};
} // namespace tvchannel
diff --git a/src/tvchannel/tvchannel_manager.cc b/src/tvchannel/tvchannel_manager.cc
index a1322d97..57b15eda 100644
--- a/src/tvchannel/tvchannel_manager.cc
+++ b/src/tvchannel/tvchannel_manager.cc
@@ -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;
diff --git a/src/tvchannel/tvchannel_manager.h b/src/tvchannel/tvchannel_manager.h
index a35eb4d6..e1796960 100644
--- a/src/tvchannel/tvchannel_manager.h
+++ b/src/tvchannel/tvchannel_manager.h
@@ -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 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
--
2.34.1