From: Przemyslaw Ciezkowski Date: Wed, 17 Dec 2014 12:51:00 +0000 (+0100) Subject: [TVChannel] Listeners cpp implementation X-Git-Tag: submit/tizen_tv/20150603.064601~1^2~514 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=533d8992f0f50746c30a2fc97e7722730c87acf6;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [TVChannel] Listeners cpp implementation Change-Id: I3e624ca03ddf0ecd1c2929737664344fd16581d7 Signed-off-by: Przemyslaw Ciezkowski --- 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