[TVChannel] findChannel body
authorPrzemyslaw Ciezkowski <p.ciezkowski@samsung.com>
Wed, 17 Dec 2014 17:12:10 +0000 (18:12 +0100)
committerPawel Andruszkiewicz <p.andruszkie@samsung.com>
Mon, 2 Feb 2015 11:12:28 +0000 (20:12 +0900)
[Verification]
tizen.tvchannel.findChannel(5, 65535, function(){console.log(arguments);});

Change-Id: Idb3989e7ae3af515fab6098620ffec6aaa6a6d3c
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 bff3953c017952d2d1531ee222467cfb2a867a34..5e2d11a60597cfdaa052176f6794e60bdd662806 100644 (file)
@@ -23,6 +23,10 @@ TVChannelInstance::TVChannelInstance() {
     RegisterSyncHandler("TVChannelManager_getCurrentProgram",
         std::bind(&TVChannelInstance::getCurrentProgram, this,
             std::placeholders::_1, std::placeholders::_2));
+    RegisterHandler("TVChannelManager_findChannel",
+        std::bind(&TVChannelInstance::findChannel, this,
+            std::placeholders::_1,
+            std::placeholders::_2));
     RegisterHandler("TVChannelManager_tune",
         std::bind(&TVChannelInstance::tune, this, std::placeholders::_1,
             std::placeholders::_2));
@@ -225,5 +229,52 @@ void TVChannelInstance::onNoSignal(double callbackId) {
     }
 }
 
-}  //  namespace tvchannel
-}  //  namespace extension
+void TVChannelInstance::findChannel(const picojson::value& args,
+    picojson::object& out) {
+    LOGD("Enter");
+    std::function<void(std::shared_ptr<TVChannelManager::FindChannelData>)>
+        asyncWork = std::bind(
+            &TVChannelManager::findChannel,
+            TVChannelManager::getInstance(),
+            std::placeholders::_1);
+    std::function<void(std::shared_ptr<TVChannelManager::FindChannelData>)>
+        afterWork = std::bind(
+            &TVChannelInstance::findChannelResult,
+            this,
+            std::placeholders::_1);
+    std::shared_ptr<TVChannelManager::FindChannelData> data(
+        new TVChannelManager::FindChannelData());
+    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>(
+        asyncWork,
+        afterWork,
+        data);
+    picojson::value result;
+    ReportSuccess(result, out);
+}
+
+void TVChannelInstance::findChannelResult(
+    const std::shared_ptr<TVChannelManager::FindChannelData>& data) {
+    LOGD("Enter");
+    picojson::value::object dict;
+    dict["callbackId"] = picojson::value(data->callbackId);
+    if (data->error) {
+        dict["error"] = data->error->ToJSON();
+    } else {
+        picojson::value::array channels;
+        auto it = data->channels.begin();
+        for (; it != data->channels.end(); ++it) {
+            channels.push_back(channelInfoToJson(
+                std::unique_ptr<ChannelInfo>(*it)));
+        }
+        data->channels.clear();
+        dict["channelInfos"] = picojson::value(channels);
+    }
+    picojson::value result(dict);
+    PostMessage(result.serialize().c_str());
+}
+
+}  // namespace tvchannel
+}  // namespace extension
index 24fcecbc21134ec68a4ddaf3062a8c140365e806..743bf79560b4333416cf3142a840a3c002346c8e 100644 (file)
@@ -29,6 +29,9 @@ class TVChannelInstance:
     virtual void onChannelChange(double callbackId);
     virtual void onEPGReceived(double callbackId);
     virtual void onNoSignal(double callbackId);
+    void findChannel(const picojson::value& args, picojson::object& out);
+    void findChannelResult(
+        const std::shared_ptr<TVChannelManager::FindChannelData>& data);
     picojson::value channelInfoToJson(
         const std::unique_ptr<ChannelInfo> &pChannel);
     picojson::value programInfoToJson(
index 14a2f2bb9a0ca785405985a94758421677c855a8..49b5ddce00d3e41c9bce31f922c6a2ec9d106c64 100644 (file)
@@ -9,7 +9,8 @@
 #include "tvchannel/channel_info.h"
 #include "tvchannel/program_info.h"
 #include "common/logger.h"
-#include "common/platform_exception.h"
+#include "common/task-queue.h"
+#include <NavigationModeHelper.h>
 
 namespace extension {
 namespace tvchannel {
@@ -331,5 +332,56 @@ void TVChannelManager::ucs2utf8(char *out, size_t out_len, char *in,
     iconv_close(cd);
 }
 
+void TVChannelManager::findChannel(
+    const std::shared_ptr<FindChannelData>& data) {
+    LOGD("Enter");
+    try {
+        IServiceNavigation* navigation =
+            getNavigation(getProfile(WindowType::MAIN), 0);
+
+        std::unique_ptr<TCCriteriaHelper> criteria = getBasicCriteria(
+            getTvMode(navigation), NAVIGATION_MODE_ALL);
+        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);
+        criteria->Where(MAJOR, static_cast<int>(data->major));
+        criteria->Where(MINOR, static_cast<int>(data->minor));
+
+        std::list<TCServiceData*> resultServices;
+        int ret = m_pService->FindServiceList(*criteria, resultServices);
+        if (TV_SERVICE_API_METHOD_FAILURE == ret) {
+            LOGE("Failed to find channel: %d", ret);
+            throw common::NotFoundException("Failed to find channel");
+        }
+        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();
+}
+
+
 }  // namespace tvchannel
 }  // namespace extension
index e7b2f40eae93e9859197d2c798d428e19abfee32..365dd28a43abb33ad05e3f641e2c85f4c34c4bab 100644 (file)
@@ -9,11 +9,13 @@
 #include <memory>
 #include <mutex>
 #include <map>
+#include <list>
 #include <TVServiceAPI.h>
 #include <ServiceNavigationDataType.h>
 #include <NavigationModeHelper.h>
 #include "tvchannel/types.h"
 #include "tvchannel/tune_option.h"
+#include "common/platform_exception.h"
 
 namespace common {
 class PlatformException;
@@ -76,10 +78,21 @@ class TVChannelManager {
 
     IService* getService();
 
+    struct FindChannelData {
+        std::shared_ptr<common::PlatformException> error;
+        int32_t major;
+        int32_t minor;
+        double callbackId;
+        std::list<ChannelInfo*> channels;
+    };
+
+    void findChannel(const std::shared_ptr<FindChannelData>& data);
+
  private:
     EventListener* m_listener;
     //  Not copyable, assignable, movable
     TVChannelManager();
+    ~TVChannelManager();
     TVChannelManager(TVChannelManager const&) = delete;
     void operator=(TVChannelManager const&) = delete;
     TVChannelManager(TVChannelManager &&) = delete;