From: Pawel Andruszkiewicz Date: Thu, 9 Apr 2015 10:14:24 +0000 (+0200) Subject: [FMRadio] Allow to create multiple instances of RadioInstance class. X-Git-Tag: submit/tizen_tv/20150603.064601~1^2~171 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0f54eca41a573ee5342498316bf8e90201b447fc;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [FMRadio] Allow to create multiple instances of RadioInstance class. Change-Id: I2afba9bbc266d942da7c1f5a8f7f26f7ad70ccf5 --- diff --git a/src/radio/radio_extension.cc b/src/radio/radio_extension.cc index 664873e4..bd4ae064 100644 --- a/src/radio/radio_extension.cc +++ b/src/radio/radio_extension.cc @@ -24,5 +24,5 @@ RadioExtension::~RadioExtension() { } common::Instance* RadioExtension::CreateInstance() { - return &extension::radio::RadioInstance::getInstance(); + return new extension::radio::RadioInstance(); } diff --git a/src/radio/radio_instance.cc b/src/radio/radio_instance.cc index cd282e6d..6fd237cc 100644 --- a/src/radio/radio_instance.cc +++ b/src/radio/radio_instance.cc @@ -10,15 +10,14 @@ #include "common/logger.h" -#include "radio/radio_manager.h" - namespace extension { namespace radio { using namespace common; using namespace extension::radio; -RadioInstance::RadioInstance() { +RadioInstance::RadioInstance() + : manager_(*this) { using std::placeholders::_1; using std::placeholders::_2; @@ -52,69 +51,60 @@ RadioInstance::RadioInstance() { RadioInstance::~RadioInstance() { } -RadioInstance& RadioInstance::getInstance() { - static RadioInstance instance; - return instance; -} - void RadioInstance::MuteGetter(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); - ReportSuccess(picojson::value(FMRadioManager::GetInstance()->IsMuted()), out); + ReportSuccess(picojson::value(manager_.IsMuted()), out); } void RadioInstance::MuteSetter(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); - FMRadioManager::GetInstance()->SetMute(args.get("mute").get()); + manager_.SetMute(args.get("mute").get()); ReportSuccess(out); } void RadioInstance::AntennaGetter(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); - ReportSuccess(picojson::value(FMRadioManager::GetInstance()->HasAntenna()), - out); + ReportSuccess(picojson::value(manager_.HasAntenna()), out); } void RadioInstance::StateGetter(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); - ReportSuccess(picojson::value(FMRadioManager::GetInstance()->GetState()), - out); + ReportSuccess(picojson::value(manager_.GetState()), out); } void RadioInstance::FrequencyGetter(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); - ReportSuccess(picojson::value(FMRadioManager::GetInstance()->GetFrequency()), - out); + ReportSuccess(picojson::value(manager_.GetFrequency()), out); } void RadioInstance::SignalStrengthGetter(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); - ReportSuccess(picojson::value(FMRadioManager::GetInstance()->GetSignalStrength()), - out); + ReportSuccess(picojson::value(manager_.GetSignalStrength()), out); } void RadioInstance::SeekUp(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); - FMRadioManager::GetInstance()->SeekUp(args.get("callbackId").get()); + manager_.SeekUp(args.get("callbackId").get()); ReportSuccess(out); } void RadioInstance::SeekDown(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); - FMRadioManager::GetInstance()->SeekDown(args.get("callbackId").get()); + manager_.SeekDown(args.get("callbackId").get()); ReportSuccess(out); } void RadioInstance::Start(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); - PlatformResult result = FMRadioManager::GetInstance()->Start(args.get("frequency").get()); + PlatformResult result = manager_.Start(args.get("frequency").get()); if (result) { ReportSuccess(out); @@ -126,7 +116,7 @@ void RadioInstance::Start(const picojson::value& args, picojson::object& out) { void RadioInstance::Stop(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); - PlatformResult result = FMRadioManager::GetInstance()->Stop(); + PlatformResult result = manager_.Stop(); if (result) { ReportSuccess(out); @@ -138,14 +128,14 @@ void RadioInstance::Stop(const picojson::value& args, picojson::object& out) { void RadioInstance::ScanStart(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); - FMRadioManager::GetInstance()->ScanStart(args.get("callbackId").get()); + manager_.ScanStart(args.get("callbackId").get()); ReportSuccess(out); } void RadioInstance::ScanStop(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); - FMRadioManager::GetInstance()->ScanStop(args.get("callbackId").get()); + manager_.ScanStop(args.get("callbackId").get()); ReportSuccess(out); } @@ -153,7 +143,7 @@ void RadioInstance::SetFMRadioInterruptedListener(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); - PlatformResult result = FMRadioManager::GetInstance()->SetFMRadioInterruptedListener(); + PlatformResult result = manager_.SetFMRadioInterruptedListener(); if (result) { ReportSuccess(out); @@ -166,7 +156,7 @@ void RadioInstance::UnsetFMRadioInterruptedListener(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); - PlatformResult result = FMRadioManager::GetInstance()->UnsetFMRadioInterruptedListener(); + PlatformResult result = manager_.UnsetFMRadioInterruptedListener(); if (result) { ReportSuccess(out); @@ -179,7 +169,7 @@ void RadioInstance::SetAntennaChangeListener(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); - PlatformResult result = FMRadioManager::GetInstance()->SetAntennaChangeListener(); + PlatformResult result = manager_.SetAntennaChangeListener(); if (result) { ReportSuccess(out); @@ -192,7 +182,7 @@ void RadioInstance::UnsetAntennaChangeListener(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); - PlatformResult result = FMRadioManager::GetInstance()->UnsetAntennaChangeListener(); + PlatformResult result = manager_.UnsetAntennaChangeListener(); if (result) { ReportSuccess(out); diff --git a/src/radio/radio_instance.h b/src/radio/radio_instance.h index 448f11c1..cf686e37 100644 --- a/src/radio/radio_instance.h +++ b/src/radio/radio_instance.h @@ -8,6 +8,8 @@ #include "common/extension.h" #include "common/picojson.h" +#include "radio/radio_manager.h" + namespace extension { namespace radio { @@ -16,8 +18,6 @@ class RadioInstance : public common::ParsedInstance { RadioInstance(); virtual ~RadioInstance(); - static RadioInstance& getInstance(); - private: void MuteGetter(const picojson::value& args, picojson::object& out); void MuteSetter(const picojson::value& args, picojson::object& out); @@ -35,6 +35,8 @@ class RadioInstance : public common::ParsedInstance { void UnsetFMRadioInterruptedListener(const picojson::value& args, picojson::object& out); void SetAntennaChangeListener(const picojson::value& args, picojson::object& out); void UnsetAntennaChangeListener(const picojson::value& args, picojson::object& out); + + FMRadioManager manager_; }; } // namespace radio diff --git a/src/radio/radio_manager.cc b/src/radio/radio_manager.cc index 1e3e08a2..aca429e6 100755 --- a/src/radio/radio_manager.cc +++ b/src/radio/radio_manager.cc @@ -14,6 +14,8 @@ #include "common/logger.h" #include "common/extension.h" +#include "radio/radio_instance.h" + using namespace common; using namespace std; @@ -34,31 +36,6 @@ static void AddCallbackID(double callbackId, picojson::object* obj) { obj->insert(std::make_pair("callbackId", picojson::value(callbackId))); } -static void PostResultSuccess(double callbackId, picojson::value* event) { - auto& obj = event->get(); - - tools::ReportSuccess(obj); - AddCallbackID(callbackId, &obj); - - RadioInstance::getInstance().PostMessage(event->serialize().c_str()); -} - -static void PostResultSuccess(double callbackId) { - picojson::value event{picojson::object()}; - - PostResultSuccess(callbackId, &event); -} - -static void PostResultFailure(double callbackId, const PlatformResult& result) { - picojson::value event{picojson::object()}; - auto& obj = event.get(); - - tools::ReportError(result, &obj); - AddCallbackID(callbackId, &obj); - - RadioInstance::getInstance().PostMessage(event.serialize().c_str()); -} - PlatformResult GetPlatformResult(const std::string& str, int err) { LoggerD("Enter"); @@ -116,43 +93,53 @@ double ToMHz(int frequency) { return static_cast(frequency) / 1000.0; } +struct RadioData { + explicit RadioData(FMRadioManager& manager) + : manager_(manager), + callback_id_(0.0) { + } + + FMRadioManager& manager_; + double callback_id_; +}; + +struct RadioScanData : public RadioData { + using RadioData::RadioData; + std::vector frequencies_; +}; + void RadioSeekCallback(int frequency, void* user_data) { LoggerD("Enter"); - double* id = static_cast(user_data); + RadioData* data = static_cast(user_data); + PlatformResult result = data->manager_.SetFrequency(ToMHz(frequency)); - PlatformResult result = FMRadioManager::GetInstance()->SetFrequency(ToMHz(frequency)); if (result) { - PostResultSuccess(*id); + data->manager_.PostResultSuccess(data->callback_id_); } else { - PostResultFailure(*id, result); + data->manager_.PostResultFailure(data->callback_id_, result); } - delete id; + delete data; } -struct ScanData { - double callback_id_; - std::vector frequencies_; -}; - void ScanStartCallback(int frequency, void* user_data) { LoggerD("Enter"); - ScanData* data = static_cast(user_data); + RadioScanData* data = static_cast(user_data); data->frequencies_.push_back(frequency); picojson::value event{picojson::object()}; auto& obj = event.get(); obj.insert(std::make_pair("frequency", picojson::value(ToMHz(frequency)))); obj.insert(std::make_pair("listenerId", picojson::value("FMRadio_Onfrequencyfound"))); - RadioInstance::getInstance().PostMessage(event.serialize().c_str()); + data->manager_.PostMessage(event.serialize()); } void ScanCompleteCallback(void* user_data) { LoggerD("Enter"); - ScanData* data = static_cast(user_data); + RadioScanData* data = static_cast(user_data); picojson::value event{picojson::object()}; auto& obj = event.get(); @@ -164,17 +151,17 @@ void ScanCompleteCallback(void* user_data) { } obj.insert(std::make_pair("frequencies", picojson::value(frequencies))); - PostResultSuccess(data->callback_id_, &event); + data->manager_.PostResultSuccess(data->callback_id_, &event); delete data; } void ScanStopCallback(void *user_data) { LoggerD("Enter"); - double* callback_id = static_cast(user_data); + RadioData* data = static_cast(user_data); - PostResultSuccess(*callback_id); - delete callback_id; + data->manager_.PostResultSuccess(data->callback_id_); + delete data; } void RadioInterruptedCallback(radio_interrupted_code_e code, void *user_data) { @@ -193,7 +180,8 @@ void RadioInterruptedCallback(radio_interrupted_code_e code, void *user_data) { obj.insert(std::make_pair("reason", picojson::value(TranslateInterruptedCode(code)))); } - RadioInstance::getInstance().PostMessage(event.serialize().c_str()); + FMRadioManager* manager = static_cast(user_data); + manager->PostMessage(event.serialize()); } @@ -212,7 +200,8 @@ void RadioAntennaCallback(runtime_info_key_e key, void* user_data) { obj.insert(std::make_pair("connected", picojson::value(connected))); obj.insert(std::make_pair("listenerId", picojson::value("FMRadio_Antenna"))); - RadioInstance::getInstance().PostMessage(event.serialize().c_str()); + FMRadioManager* manager = static_cast(user_data); + manager->PostMessage(event.serialize()); } } // namespace @@ -309,8 +298,9 @@ double FMRadioManager::GetSignalStrength() { } } -FMRadioManager::FMRadioManager() - : radio_instance_(nullptr) { +FMRadioManager::FMRadioManager(RadioInstance& instance) + : instance_(instance), + radio_instance_(nullptr) { LoggerD("Enter"); const auto err = radio_create(&radio_instance_); @@ -335,13 +325,6 @@ FMRadioManager::~FMRadioManager() { } } -FMRadioManager* FMRadioManager::GetInstance() { - LoggerD("Enter"); - - static FMRadioManager instance; - return &instance; -} - PlatformResult FMRadioManager::Start(double frequency) { LoggerD("Enter, frequency: %f", frequency); @@ -363,7 +346,8 @@ PlatformResult FMRadioManager::Stop() { void FMRadioManager::SeekUp(double callback_id) { LoggerD("Enter"); - double* user_data = new double(callback_id); + RadioData* user_data = new RadioData(*this); + user_data->callback_id_ = callback_id; const auto err = radio_seek_up(radio_instance_, RadioSeekCallback, user_data); @@ -376,7 +360,8 @@ void FMRadioManager::SeekUp(double callback_id) { void FMRadioManager::SeekDown(double callback_id) { LoggerD("Enter"); - double* user_data = new double(callback_id); + RadioData* user_data = new RadioData(*this); + user_data->callback_id_ = callback_id; const auto err = radio_seek_down(radio_instance_, RadioSeekCallback, user_data); @@ -389,7 +374,7 @@ void FMRadioManager::SeekDown(double callback_id) { void FMRadioManager::ScanStart(double callback_id) { LoggerD("Enter"); - ScanData* user_data = new ScanData(); + RadioScanData* user_data = new RadioScanData(*this); user_data->callback_id_ = callback_id; auto err = radio_set_scan_completed_cb(radio_instance_, ScanCompleteCallback, @@ -412,7 +397,8 @@ void FMRadioManager::ScanStart(double callback_id) { void FMRadioManager::ScanStop(double callback_id) { LoggerD("Enter"); - double* user_data = new double(callback_id); + RadioScanData* user_data = new RadioScanData(*this); + user_data->callback_id_ = callback_id; auto err = radio_unset_scan_completed_cb(radio_instance_); if (RADIO_ERROR_NONE != err) { @@ -434,7 +420,7 @@ common::PlatformResult FMRadioManager::SetFMRadioInterruptedListener() { const auto err = radio_set_interrupted_cb(radio_instance_, RadioInterruptedCallback, - nullptr); + this); return CheckError("radio_set_interrupted_cb", err); } @@ -451,7 +437,7 @@ common::PlatformResult FMRadioManager::SetAntennaChangeListener() { const auto err = runtime_info_set_changed_cb( RUNTIME_INFO_KEY_AUDIO_JACK_CONNECTED, RadioAntennaCallback, - nullptr); + this); return CheckError("runtime_info_set_changed_cb", err); } @@ -462,6 +448,35 @@ common::PlatformResult FMRadioManager::UnsetAntennaChangeListener() { return CheckError("runtime_info_unset_changed_cb", err); } +void FMRadioManager::PostMessage(const std::string& msg) const { + instance_.PostMessage(msg.c_str()); +} + +void FMRadioManager::PostResultSuccess(double callbackId, picojson::value* event) const { + auto& obj = event->get(); + + tools::ReportSuccess(obj); + AddCallbackID(callbackId, &obj); + + PostMessage(event->serialize()); +} + +void FMRadioManager::PostResultSuccess(double callbackId) const { + picojson::value event{picojson::object()}; + + PostResultSuccess(callbackId, &event); +} + +void FMRadioManager::PostResultFailure(double callbackId, const PlatformResult& result) const { + picojson::value event{picojson::object()}; + auto& obj = event.get(); + + tools::ReportError(result, &obj); + AddCallbackID(callbackId, &obj); + + PostMessage(event.serialize()); +} + } // namespace radio } // namespace extension diff --git a/src/radio/radio_manager.h b/src/radio/radio_manager.h index 911a8c1c..ecf16522 100755 --- a/src/radio/radio_manager.h +++ b/src/radio/radio_manager.h @@ -15,14 +15,15 @@ #include "common/picojson.h" #include "common/platform_result.h" -#include "radio_instance.h" - namespace extension { namespace radio { +class RadioInstance; + class FMRadioManager { public: - static FMRadioManager* GetInstance(); + explicit FMRadioManager(RadioInstance& instance); + ~FMRadioManager(); common::PlatformResult Start(double freq); common::PlatformResult Stop(); @@ -43,10 +44,13 @@ class FMRadioManager { bool HasAntenna(); const char* GetState(); - private: - FMRadioManager(); - ~FMRadioManager(); + void PostMessage(const std::string& msg) const; + void PostResultSuccess(double callbackId, picojson::value* event) const; + void PostResultSuccess(double callbackId) const; + void PostResultFailure(double callbackId, const common::PlatformResult& result) const; + private: + RadioInstance& instance_; radio_h radio_instance_; };