[TVChannel] getChannelList body
authorPrzemyslaw Ciezkowski <p.ciezkowski@samsung.com>
Thu, 18 Dec 2014 11:13:25 +0000 (12:13 +0100)
committerPawel Andruszkiewicz <p.andruszkie@samsung.com>
Mon, 2 Feb 2015 11:13:01 +0000 (20:13 +0900)
[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 <p.ciezkowski@samsung.com>
src/tvchannel/tvchannel_instance.cc
src/tvchannel/tvchannel_instance.h
src/tvchannel/tvchannel_manager.cc
src/tvchannel/tvchannel_manager.h

index 5e2d11a60597cfdaa052176f6794e60bdd662806..9202a638eecd1750fee2151bcdf55cc835cfe461 100644 (file)
@@ -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<int32_t>(args.get("major").get<double>());
     data->minor = static_cast<int32_t>(args.get("minor").get<double>());
     data->callbackId = args.get("callbackId").get<double>();
-    common::TaskQueue::GetInstance().Queue<TVChannelManager::FindChannelData>(
+    TaskQueue::GetInstance().Queue<TVChannelManager::FindChannelData>(
         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<void(std::shared_ptr<TVChannelManager::GetChannelListData>)>
+        asyncWork = std::bind(
+            &TVChannelManager::getChannelList,
+            TVChannelManager::getInstance(),
+            std::placeholders::_1);
+    std::function<void(std::shared_ptr<TVChannelManager::GetChannelListData>)>
+        afterWork = std::bind(
+            &TVChannelInstance::getChannelListResult,
+            this,
+            std::placeholders::_1);
+    std::shared_ptr<TVChannelManager::GetChannelListData> data(
+        new TVChannelManager::GetChannelListData());
+    if (args.contains("tuneMode")) {
+        data->tuneMode = stringToNavigatorMode(
+            args.get("tuneMode").get<std::string>());
+    }
+    if (args.contains("nStart")) {
+        data->nStart = static_cast<int32_t>(args.get("nStart").get<double>());
+        data->nStartSet = true;
+    }
+    if (args.contains("number")) {
+        data->number = static_cast<int32_t>(args.get("number").get<double>());
+        data->numberSet = true;
+    }
+    data->callbackId = args.get("callbackId").get<double>();
+    TaskQueue::GetInstance().Queue<TVChannelManager::GetChannelListData>(
+        asyncWork,
+        afterWork,
+        data);
+    picojson::value result;
+    ReportSuccess(result, out);
+}
+
+void TVChannelInstance::getChannelListResult(
+    const std::shared_ptr<TVChannelManager::GetChannelListData>& 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<ChannelInfo>(*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
index 743bf79560b4333416cf3142a840a3c002346c8e..a0496e943666d78c71865ac4935a1cdffb5cbfd2 100644 (file)
@@ -32,6 +32,9 @@ class TVChannelInstance:
     void findChannel(const picojson::value& args, picojson::object& out);
     void findChannelResult(
         const std::shared_ptr<TVChannelManager::FindChannelData>& data);
+    void getChannelList(const picojson::value& args, picojson::object& out);
+    void getChannelListResult(
+        const std::shared_ptr<TVChannelManager::GetChannelListData>& data);
     picojson::value channelInfoToJson(
         const std::unique_ptr<ChannelInfo> &pChannel);
     picojson::value programInfoToJson(
index 49b5ddce00d3e41c9bce31f922c6a2ec9d106c64..2dc9208a79263ccb7c1dc16a04eab4be0df8aaf3 100644 (file)
@@ -378,6 +378,67 @@ void TVChannelManager::findChannel(
     }
 }
 
+void TVChannelManager::getChannelList(
+    const std::shared_ptr<GetChannelListData>& 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<TCCriteriaHelper> 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<TCServiceData*> 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();
 }
index 365dd28a43abb33ad05e3f641e2c85f4c34c4bab..adf76ffc25cda8e3e41c78e0efdd50ff3f4c8bc2 100644 (file)
@@ -88,6 +88,25 @@ class TVChannelManager {
 
     void findChannel(const std::shared_ptr<FindChannelData>& data);
 
+    struct GetChannelListData {
+        NavigatorMode tuneMode;
+        bool nStartSet;
+        bool numberSet;
+        std::shared_ptr<common::PlatformException> error;
+        int32_t nStart;
+        int32_t number;
+        double callbackId;
+        std::list<ChannelInfo*> channels;
+
+        GetChannelListData() :
+            tuneMode(NOT_DEFINED),
+            nStartSet(false),
+            numberSet(false) {
+        }
+    };
+
+    void getChannelList(const std::shared_ptr<GetChannelListData>& data);
+
  private:
     EventListener* m_listener;
     //  Not copyable, assignable, movable