From: ByungWoo Lee Date: Tue, 24 Feb 2015 04:08:18 +0000 (+0900) Subject: [Package] Remove existed listener when changing listener X-Git-Tag: submit/tizen_tv/20150603.064601~1^2~373^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f7fc61e1ff1de418a432568dd6c3240a5d5ac1bc;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [Package] Remove existed listener when changing listener Change-Id: I253af74977066aea0cad85fe25dac4d72bbf9835 --- diff --git a/src/package/package_api.js b/src/package/package_api.js index 95c0e3ad..9fc90bb9 100644 --- a/src/package/package_api.js +++ b/src/package/package_api.js @@ -6,11 +6,24 @@ var types_ = validator_.Types; var callbackId = 0; var callbacks = {}; +var infoEventListenerId = -1; + +function invokeListener(result) { + if (result.listener === 'infoEvent') { + var listener = callbacks[infoEventListenerId]; + listener(result); + } +} extension.setMessageListener(function(json) { var result = JSON.parse(json); - var callback = callbacks[result['callbackId']]; - callback(result); + + if (result.hasOwnProperty('listener')) { + invokeListener(result); + } else { + var callback = callbacks[result['callbackId']]; + callback(result); + } }); function nextCallbackId() { @@ -41,7 +54,6 @@ function callNative(cmd, args) { } } - function callNativeWithCallback(cmd, args, callback) { if (callback) { var id = nextCallbackId(); @@ -208,8 +220,8 @@ PackageManager.prototype.getPackageInfo = function() { } try { - var resultObject = callNative('PackageManager_getPackageInfo', nativeParam); - return PackageInformation(resultObject); + var syncResult = callNative('PackageManager_getPackageInfo', nativeParam); + return PackageInformation(syncResult); } catch (e) { throw e; } @@ -234,14 +246,20 @@ PackageManager.prototype.setPackageInfoEventListener = function(eventCallback) { function(result) { if (result.status == 'installed') { args.eventCallback.oninstalled(PackageInformation(result.info)); - } - if (result.status == 'updated') { + } else if (result.status == 'updated') { args.eventCallback.onupdated(PackageInformation(result.info)); - } - if (result.status == 'uninstalled') { + } else if (result.status == 'uninstalled') { args.eventCallback.onuninstalled(result.id); } }); + + if (infoEventListenerId === -1) { + infoEventListenerId = nativeParam.callbackId; + } else { + delete callbacks[infoEventListenerId]; + infoEventListenerId = nativeParam.callbackId; + } + } catch (e) { throw e; } @@ -253,8 +271,9 @@ PackageManager.prototype.unsetPackageInfoEventListener = function() { try { var syncResult = callNative('PackageManager_unsetPackageInfoEventListener', nativeParam); - if (typeof syncResult != 'boolean') { - delete callbacks[syncResult]; + if (syncResult === true) { + delete callbacks[infoEventListenerId]; + infoEventListenerId = -1; } } catch (e) { throw e; diff --git a/src/package/package_info_provider.cc b/src/package/package_info_provider.cc index 27c17519..76423a4b 100644 --- a/src/package/package_info_provider.cc +++ b/src/package/package_info_provider.cc @@ -35,7 +35,8 @@ static int PackageInfoGetListCb( } picojson::object object_info; - if ( PackageInfoProvider::GetPackageInfo(info, object_info) ) { + if ( PackageInfoProvider::ConvertToPackageToObject( + info, object_info) ) { array_data->push_back(picojson::value(object_info)); } @@ -102,7 +103,7 @@ void PackageInfoProvider::GetPackageInfo( } picojson::object object_info; - if ( !GetPackageInfo(info, object_info) ) { + if ( !ConvertToPackageToObject(info, object_info) ) { LoggerE("Failed to convert pkginfo to object"); REPORT_ERROR(out, UnknownException( "The package information cannot be retrieved " \ @@ -132,7 +133,7 @@ static bool PackageAppInfoCb( return true; } -bool PackageInfoProvider:: GetPackageInfo( +bool PackageInfoProvider:: ConvertToPackageToObject( const pkgmgrinfo_pkginfo_h info, picojson::object& out) { int ret = 0; diff --git a/src/package/package_info_provider.h b/src/package/package_info_provider.h index 9e91afa2..f2f9be3a 100644 --- a/src/package/package_info_provider.h +++ b/src/package/package_info_provider.h @@ -36,8 +36,9 @@ class PackageInfoProvider { static void GetPackageInfo(picojson::object& out); static void GetPackageInfo(const char* package_id, picojson::object& out); - static bool GetPackageInfo(const pkgmgrinfo_pkginfo_h info, - picojson::object& out); + + static bool ConvertToPackageToObject( + const pkgmgrinfo_pkginfo_h info, picojson::object& out); private: static bool GetCurrentPackageId(char** package_id); diff --git a/src/package/package_instance.cc b/src/package/package_instance.cc index 0c802c53..20c5767d 100644 --- a/src/package/package_instance.cc +++ b/src/package/package_instance.cc @@ -144,6 +144,8 @@ static void PackageListenerCb( } picojson::object param; + param["listener"] = picojson::value("infoEvent"); + if ( event_type == PACKAGE_MANAGER_EVENT_TYPE_INSTALL && event_state == PACKAGE_MANAGER_EVENT_STATE_COMPLETED ) { LoggerD("[Installed]"); @@ -219,7 +221,7 @@ PackageInstance::PackageInstance() { manager_ = NULL; } - listener_id_ = -1; + is_package_info_listener_set_ = false; using std::placeholders::_1; using std::placeholders::_2; @@ -418,8 +420,6 @@ void PackageInstance::PackageManagerGetpackageinfo( void PackageInstance::InvokeListener(picojson::object& param) { LoggerD("Enter"); - - param["callbackId"] = picojson::value(static_cast(listener_id_)); picojson::value result = picojson::value(param); PostMessage(result.serialize().c_str()); } @@ -441,6 +441,12 @@ void PackageInstance:: return; */ + if ( is_package_info_listener_set_ ) { + LoggerD("Already set"); + ReportSuccess(out); + return; + } + if ( !manager_ ) { LoggerE("package_manager_h is NULL"); ReportError( @@ -461,7 +467,7 @@ void PackageInstance:: return; } - listener_id_ = callback_id; + is_package_info_listener_set_ = true; ReportSuccess(out); } @@ -478,7 +484,7 @@ void PackageInstance:: return; */ - if ( listener_id_ == -1 ) { + if ( !is_package_info_listener_set_ ) { LoggerD("Listener is not set"); ReportSuccess(out); return; @@ -503,8 +509,8 @@ void PackageInstance:: return; } - ReportSuccess(picojson::value(static_cast(listener_id_)), out); - listener_id_ = -1; + is_package_info_listener_set_ = false; + ReportSuccess(out); } void PackageInstance::InvokeErrorCallbackAsync( diff --git a/src/package/package_instance.h b/src/package/package_instance.h index 59736d72..334330d6 100644 --- a/src/package/package_instance.h +++ b/src/package/package_instance.h @@ -27,7 +27,7 @@ class PackageInstance : public common::ParsedInstance { private: package_manager_request_h request_; package_manager_h manager_; - int listener_id_; + bool is_package_info_listener_set_; std::map callbacks_map_; // void RegisterCallback(int request_id, int callback_id);