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));
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);
}
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
#include <iconv.h>
#include <stdint.h>
#include <functional>
+#include <map>
#include "tvchannel/channel_info.h"
#include "tvchannel/program_info.h"
#include "common/logger.h"
}
}
+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();
}
#include "tvchannel/types.h"
#include "tvchannel/tune_option.h"
#include "common/platform_exception.h"
+#include "tvchannel/program_info.h"
namespace common {
class PlatformException;
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