[Package] Remove existed listener when changing listener
authorByungWoo Lee <bw1212.lee@samsung.com>
Tue, 24 Feb 2015 04:08:18 +0000 (13:08 +0900)
committerByungWoo Lee <bw1212.lee@samsung.com>
Tue, 24 Feb 2015 05:18:34 +0000 (14:18 +0900)
Change-Id: I253af74977066aea0cad85fe25dac4d72bbf9835

src/package/package_api.js
src/package/package_info_provider.cc
src/package/package_info_provider.h
src/package/package_instance.cc
src/package/package_instance.h

index 95c0e3ad0383e6b7e2442a6a167ebfe8768154eb..9fc90bb93f068de0d9464415029db47df052bceb 100644 (file)
@@ -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;
index 27c17519ba09bef0b948bd2fb81730299ac4d131..76423a4b3b69872c2c1a67adbeb70b5b0e001b59 100644 (file)
@@ -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;
 
index 9e91afa257dddbefe4cb6ab9d547e367045b5092..f2f9be3a7991c9d0d65324c135f4d5d8011d3fdd 100644 (file)
@@ -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);
index 0c802c5389e89f2db52dd7b7bcad47c8a6c8cbe2..20c5767d649ce7f8900e9e25a1efa1dbb2da90b3 100644 (file)
@@ -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<double>(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<double>(listener_id_)), out);
-  listener_id_ = -1;
+  is_package_info_listener_set_ = false;
+  ReportSuccess(out);
 }
 
 void PackageInstance::InvokeErrorCallbackAsync(
index 59736d7204c66ad59e4f37ac41a0e88134c527d7..334330d6bad979234bd267f51637c85c3d65f77e 100644 (file)
@@ -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<int, int> callbacks_map_;  // <request_id, callbackId>
 
   void RegisterCallback(int request_id, int callback_id);