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);
}
}
};
#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"
std::bind(&TVChannelInstance::getCurrentProgram, this,
std::placeholders::_1,
std::placeholders::_2));
+ TVChannelManager::getInstance()->registerListener(this);
}
TVChannelInstance::~TVChannelInstance() {
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",
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()
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
#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();
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
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;
// 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;
EProfile getProfile(WindowType windowType);
TCServiceId getCurrentChannelId(std::string const& _windowType);
+ static int signalListener(ESignalType type, TSSignalData data, void*);
};
} // namespace tvchannel