From 92cb43d956f0d6f02ca9d7a43233fe4f43e9701a Mon Sep 17 00:00:00 2001
From: Przemyslaw Ciezkowski
Date: Thu, 18 Dec 2014 12:13:25 +0100
Subject: [PATCH] [TVChannel] getChannelList body
[Verification]
tizen.tvchannel.getChannelList(function(){console.log("success", arguments);},
function(e){console.log("err", e);}, "ALL", 0, 10);
Change-Id: I1e90486047c2248e2fd884eadcf3e43ebeebdb26
Signed-off-by: Przemyslaw Ciezkowski
---
src/tvchannel/tvchannel_instance.cc | 73 ++++++++++++++++++++++++++++-
src/tvchannel/tvchannel_instance.h | 3 ++
src/tvchannel/tvchannel_manager.cc | 61 ++++++++++++++++++++++++
src/tvchannel/tvchannel_manager.h | 19 ++++++++
4 files changed, 155 insertions(+), 1 deletion(-)
diff --git a/src/tvchannel/tvchannel_instance.cc b/src/tvchannel/tvchannel_instance.cc
index 5e2d11a6..9202a638 100644
--- a/src/tvchannel/tvchannel_instance.cc
+++ b/src/tvchannel/tvchannel_instance.cc
@@ -15,6 +15,8 @@
namespace extension {
namespace tvchannel {
+using common::TaskQueue;
+
TVChannelInstance::TVChannelInstance() {
LOGD("Entered");
RegisterSyncHandler("TVChannelManager_getCurrentChannel",
@@ -27,6 +29,10 @@ TVChannelInstance::TVChannelInstance() {
std::bind(&TVChannelInstance::findChannel, this,
std::placeholders::_1,
std::placeholders::_2));
+ RegisterHandler("TVChannelManager_getChannelList",
+ std::bind(&TVChannelInstance::getChannelList, this,
+ std::placeholders::_1,
+ std::placeholders::_2));
RegisterHandler("TVChannelManager_tune",
std::bind(&TVChannelInstance::tune, this, std::placeholders::_1,
std::placeholders::_2));
@@ -247,7 +253,7 @@ void TVChannelInstance::findChannel(const picojson::value& args,
data->major = static_cast(args.get("major").get());
data->minor = static_cast(args.get("minor").get());
data->callbackId = args.get("callbackId").get();
- common::TaskQueue::GetInstance().Queue(
+ TaskQueue::GetInstance().Queue(
asyncWork,
afterWork,
data);
@@ -276,5 +282,70 @@ void TVChannelInstance::findChannelResult(
PostMessage(result.serialize().c_str());
}
+void TVChannelInstance::getChannelList(const picojson::value& args,
+ picojson::object& out) {
+ LOGD("Enter");
+ std::function)>
+ asyncWork = std::bind(
+ &TVChannelManager::getChannelList,
+ TVChannelManager::getInstance(),
+ std::placeholders::_1);
+ std::function)>
+ afterWork = std::bind(
+ &TVChannelInstance::getChannelListResult,
+ this,
+ std::placeholders::_1);
+ std::shared_ptr data(
+ new TVChannelManager::GetChannelListData());
+ if (args.contains("tuneMode")) {
+ data->tuneMode = stringToNavigatorMode(
+ args.get("tuneMode").get());
+ }
+ if (args.contains("nStart")) {
+ data->nStart = static_cast(args.get("nStart").get());
+ data->nStartSet = true;
+ }
+ if (args.contains("number")) {
+ data->number = static_cast(args.get("number").get());
+ data->numberSet = true;
+ }
+ data->callbackId = args.get("callbackId").get();
+ TaskQueue::GetInstance().Queue(
+ asyncWork,
+ afterWork,
+ data);
+ picojson::value result;
+ ReportSuccess(result, out);
+}
+
+void TVChannelInstance::getChannelListResult(
+ const std::shared_ptr& data) {
+ picojson::value::object dict;
+ dict["callbackId"] = picojson::value(data->callbackId);
+ if (data->error) {
+ dict["error"] = data->error->ToJSON();
+ } else {
+ picojson::value::array channels;
+ int32_t start = data->nStartSet ? data->nStart : 0;
+ int32_t number = data->numberSet ? data->number : data->channels.size();
+ int32_t i = 0;
+ auto it = data->channels.begin();
+ for (; it != data->channels.end(); ++it) {
+ // add only limited rows by start and number
+ if (i >= start && i < start + number) {
+ channels.push_back(channelInfoToJson(
+ std::unique_ptr(*it)));
+ } else {
+ delete *it;
+ }
+ ++i;
+ }
+ data->channels.clear();
+ dict["channelInfos"] = picojson::value(channels);
+ }
+ picojson::value result(dict);
+ PostMessage(result.serialize().c_str());
+}
+
} // namespace tvchannel
} // namespace extension
diff --git a/src/tvchannel/tvchannel_instance.h b/src/tvchannel/tvchannel_instance.h
index 743bf795..a0496e94 100644
--- a/src/tvchannel/tvchannel_instance.h
+++ b/src/tvchannel/tvchannel_instance.h
@@ -32,6 +32,9 @@ class TVChannelInstance:
void findChannel(const picojson::value& args, picojson::object& out);
void findChannelResult(
const std::shared_ptr& data);
+ void getChannelList(const picojson::value& args, picojson::object& out);
+ void getChannelListResult(
+ const std::shared_ptr& data);
picojson::value channelInfoToJson(
const std::unique_ptr &pChannel);
picojson::value programInfoToJson(
diff --git a/src/tvchannel/tvchannel_manager.cc b/src/tvchannel/tvchannel_manager.cc
index 49b5ddce..2dc9208a 100644
--- a/src/tvchannel/tvchannel_manager.cc
+++ b/src/tvchannel/tvchannel_manager.cc
@@ -378,6 +378,67 @@ void TVChannelManager::findChannel(
}
}
+void TVChannelManager::getChannelList(
+ const std::shared_ptr& data) {
+ LOGD("Enter");
+ try {
+ IServiceNavigation* navigation =
+ getNavigation(getProfile(WindowType::MAIN), 0);
+
+ ENavigationMode naviMode = NAVIGATION_MODE_ALL;
+ switch (data->tuneMode) {
+ case DIGITAL:
+ naviMode = NAVIGATION_MODE_DIGITAL;
+ break;
+ case ANALOG:
+ naviMode = NAVIGATION_MODE_ANALOG;
+ break;
+ case FAVORITE:
+ naviMode = NAVIGATION_MODE_FAVORITES;
+ break;
+ default:
+ naviMode = NAVIGATION_MODE_ALL;
+ }
+ std::unique_ptr criteria = getBasicCriteria(
+ getTvMode(navigation), naviMode);
+ criteria->Fetch(SERVICE_ID);
+ criteria->Fetch(MAJOR);
+ criteria->Fetch(MINOR);
+ criteria->Fetch(PROGRAM_NUMBER);
+ criteria->Fetch(CHANNEL_NUMBER);
+ criteria->Fetch(CHANNEL_TYPE);
+ criteria->Fetch(SERVICE_NAME);
+ criteria->Fetch(SOURCE_ID);
+ criteria->Fetch(TRANSPORT_STREAM_ID);
+ criteria->Fetch(ORIGINAL_NETWORK_ID);
+ criteria->Fetch(LCN);
+ if (NAVIGATION_MODE_FAVORITES == naviMode) {
+ criteria->WhereNot(FAVORITE_ID, 0);
+ }
+
+ std::list resultServices;
+ int ret = m_pService->FindServiceList(*criteria, resultServices);
+ if (TV_SERVICE_API_METHOD_FAILURE == ret) {
+ LOGE("Failed to find channels: %d", ret);
+ throw common::NotFoundException("Failed to find channels");
+ }
+ LOGD("Found channels: %d", resultServices.size());
+ auto it = resultServices.begin();
+ for (; it != resultServices.end(); ++it) {
+ ChannelInfo *channelInfo = new ChannelInfo();
+ channelInfo->fromApiData(*(*it));
+ data->channels.push_back(channelInfo);
+ delete (*it);
+ }
+ resultServices.clear();
+ } catch (common::PlatformException& e) {
+ data->error.reset(new common::PlatformException(e.name(), e.message()));
+ } catch (...) {
+ data->error.reset(
+ new common::UnknownException("Couldn't find channels"));
+ }
+}
+
TVChannelManager::~TVChannelManager() {
TVServiceAPI::Destroy();
}
diff --git a/src/tvchannel/tvchannel_manager.h b/src/tvchannel/tvchannel_manager.h
index 365dd28a..adf76ffc 100644
--- a/src/tvchannel/tvchannel_manager.h
+++ b/src/tvchannel/tvchannel_manager.h
@@ -88,6 +88,25 @@ class TVChannelManager {
void findChannel(const std::shared_ptr& data);
+ struct GetChannelListData {
+ NavigatorMode tuneMode;
+ bool nStartSet;
+ bool numberSet;
+ std::shared_ptr error;
+ int32_t nStart;
+ int32_t number;
+ double callbackId;
+ std::list channels;
+
+ GetChannelListData() :
+ tuneMode(NOT_DEFINED),
+ nStartSet(false),
+ numberSet(false) {
+ }
+ };
+
+ void getChannelList(const std::shared_ptr& data);
+
private:
EventListener* m_listener;
// Not copyable, assignable, movable
--
2.34.1