[TVChannel] getProgramList body
authorPrzemyslaw Ciezkowski <p.ciezkowski@samsung.com>
Thu, 18 Dec 2014 14:30:04 +0000 (15:30 +0100)
committerPawel Andruszkiewicz <p.andruszkie@samsung.com>
Mon, 2 Feb 2015 11:13:40 +0000 (20:13 +0900)
[Verification]
tizen.tvchannel.getProgramList(tizen.tvchannel.getCurrentChannel("MAIN"),
    tizen.time.getCurrentDateTime(),
    function(){console.log("succ", arguments);},
    function(e){console.log("err", e);});

Change-Id: I7f97bf8ef2661a757f4f93f53a5b27f1bad07334
Signed-off-by: Przemyslaw Ciezkowski <p.ciezkowski@samsung.com>
src/tvchannel/tvchannel_api.js
src/tvchannel/tvchannel_instance.cc
src/tvchannel/tvchannel_instance.h
src/tvchannel/tvchannel_manager.cc
src/tvchannel/tvchannel_manager.h

index e36054be10190bbdca4ca703a32ca01c458913ce..fc71a63c156ce0c4710c7bdef68f25456ed3c020 100644 (file)
@@ -378,8 +378,8 @@ TVChannelManager.prototype.getProgramList = function(channelInfo,
     }
   ]);
   native.call('TVChannelManager_getProgramList', {
-    channelInfo: args.channelInfo,
-    startTime: args.startTime,
+    channelId: args.channelInfo._serviceId,
+    startTime: args.startTime.getTime(),
     duration: args.duration
   }, function(msg) {
     if (msg.error) {
index 9202a638eecd1750fee2151bcdf55cc835cfe461..84492b814cd8b7b8c999eedb046e24528906cc6a 100644 (file)
@@ -33,6 +33,10 @@ TVChannelInstance::TVChannelInstance() {
         std::bind(&TVChannelInstance::getChannelList, this,
             std::placeholders::_1,
             std::placeholders::_2));
+    RegisterHandler("TVChannelManager_getProgramList",
+        std::bind(&TVChannelInstance::getProgramList, this,
+            std::placeholders::_1,
+            std::placeholders::_2));
     RegisterHandler("TVChannelManager_tune",
         std::bind(&TVChannelInstance::tune, this, std::placeholders::_1,
             std::placeholders::_2));
@@ -143,7 +147,11 @@ picojson::value TVChannelInstance::channelInfoToJson(
     channel.insert(
         std::make_pair("serviceName",
             picojson::value(pChannel->getServiceName())));
-
+    // internal property
+    channel.insert(
+        std::make_pair("_serviceId",
+            picojson::value(
+                static_cast<double>(pChannel->getServiceID()))));
     return picojson::value(channel);
 }
 
@@ -347,5 +355,59 @@ void TVChannelInstance::getChannelListResult(
     PostMessage(result.serialize().c_str());
 }
 
+void TVChannelInstance::getProgramList(
+    const picojson::value& args, picojson::object& out) {
+    LOGD("Enter");
+    std::function<void(std::shared_ptr<TVChannelManager::GetProgramListData>)>
+        asyncWork = std::bind(
+            &TVChannelManager::getProgramList,
+            TVChannelManager::getInstance(),
+            std::placeholders::_1);
+    std::function<void(std::shared_ptr<TVChannelManager::GetProgramListData>)>
+        afterWork = std::bind(
+            &TVChannelInstance::getProgramListResult,
+            this,
+            std::placeholders::_1);
+    std::shared_ptr<TVChannelManager::GetProgramListData> data(
+        new TVChannelManager::GetProgramListData());
+    data->channelId = static_cast<u_int64_t>(
+        args.get("channelId").get<double>());
+    data->startTime = static_cast<u_int32_t>(
+        args.get("startTime").get<double>());
+    if (args.contains("duration")) {
+        data->duration =
+            static_cast<u_int32_t>(args.get("duration").get<double>());
+    } else {
+         data->duration = UINT32_MAX;
+    }
+    data->callbackId = args.get("callbackId").get<double>();
+    TaskQueue::GetInstance().Queue<TVChannelManager::GetProgramListData>(
+        asyncWork,
+        afterWork,
+        data);
+    picojson::value result;
+    ReportSuccess(result, out);
+}
+
+void TVChannelInstance::getProgramListResult(
+    const std::shared_ptr<TVChannelManager::GetProgramListData>& data) {
+    picojson::value::object dict;
+    dict["callbackId"] = picojson::value(data->callbackId);
+    if (data->error) {
+        dict["error"] = data->error->ToJSON();
+    } else {
+        picojson::value::array programs;
+        auto it = data->programs.begin();
+        for (; it != data->programs.end(); ++it) {
+            programs.push_back(programInfoToJson(
+                std::unique_ptr<ProgramInfo>(*it)));
+        }
+        data->programs.clear();
+        dict["programInfos"] = picojson::value(programs);
+    }
+    picojson::value result(dict);
+    PostMessage(result.serialize().c_str());
+}
+
 }  // namespace tvchannel
 }  // namespace extension
index a0496e943666d78c71865ac4935a1cdffb5cbfd2..e8b1688bb83f372b952488878aa9378a0e9785f4 100644 (file)
@@ -39,6 +39,9 @@ class TVChannelInstance:
         const std::unique_ptr<ChannelInfo> &pChannel);
     picojson::value programInfoToJson(
         const std::unique_ptr<ProgramInfo> &pProgram);
+    void getProgramList(const picojson::value& args, picojson::object& out);
+    void getProgramListResult(
+        const std::shared_ptr<TVChannelManager::GetProgramListData>& data);
     void tune(picojson::value const& args,
         picojson::object& out);
     void tuneTask(std::shared_ptr<TVChannelManager::TuneData> const& _tuneData);
index 2dc9208a79263ccb7c1dc16a04eab4be0df8aaf3..f9ab7568170193c353947a7904b6bc66b299438d 100644 (file)
@@ -6,6 +6,7 @@
 #include <iconv.h>
 #include <stdint.h>
 #include <functional>
+#include <map>
 #include "tvchannel/channel_info.h"
 #include "tvchannel/program_info.h"
 #include "common/logger.h"
@@ -439,6 +440,43 @@ void TVChannelManager::getChannelList(
     }
 }
 
+void TVChannelManager::getProgramList(
+    const std::shared_ptr<GetProgramListData>& data) {
+    LOGD("Enter");
+    try {
+        IServiceGuide* guide;
+        int ret = TVServiceAPI::CreateServiceGuide(&guide);
+        if (TV_SERVICE_API_SUCCESS != ret) {
+            LOGE("Failed to create service guide: %d", ret);
+            throw common::UnknownException("Failed to create service guide");
+        }
+
+        std::map<unsigned int, TCProgramData*> programList;
+        ret = guide->GetProgramList(data->channelId,
+            data->startTime, data->duration, programList);
+        if (TV_SERVICE_API_METHOD_FAILURE == ret) {
+            LOGE("Failed to get program list.");
+            throw common::NotFoundException("Failed to get program list.");
+        }
+        LOGD("Found programs: %d", programList.size());
+
+        auto it = programList.begin();
+        for (; it != programList.end(); ++it) {
+            ProgramInfo *programInfo = new ProgramInfo();
+            programInfo->fromApiData(*(it->second));
+            data->programs.push_back(programInfo);
+            delete it->second;
+        }
+        programList.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 adf76ffc25cda8e3e41c78e0efdd50ff3f4c8bc2..a3639178f00d6c90ebf177f2ea413b803e84c5f1 100644 (file)
@@ -16,6 +16,7 @@
 #include "tvchannel/types.h"
 #include "tvchannel/tune_option.h"
 #include "common/platform_exception.h"
+#include "tvchannel/program_info.h"
 
 namespace common {
 class PlatformException;
@@ -107,6 +108,17 @@ class TVChannelManager {
 
     void getChannelList(const std::shared_ptr<GetChannelListData>& data);
 
+    struct GetProgramListData {
+        TCServiceId channelId;
+        u_int32_t startTime;
+        u_int32_t duration;
+        std::shared_ptr<common::PlatformException> error;
+        double callbackId;
+        std::list<ProgramInfo*> programs;
+    };
+
+    void getProgramList(const std::shared_ptr<GetProgramListData>& data);
+
  private:
     EventListener* m_listener;
     //  Not copyable, assignable, movable