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