[Systeminfo] Fix unregister callback functions 97/158197/2
authorJakub Skowron <j.skowron@samsung.com>
Mon, 30 Oct 2017 11:22:11 +0000 (12:22 +0100)
committerJakub Skowron <j.skowron@samsung.com>
Mon, 30 Oct 2017 11:22:11 +0000 (12:22 +0100)
Ensure all callbacks are unregistered, even in case
of previous error in unregister function.

[Verification] TCT Tests: 100% Pass

Change-Id: If0bc0342b77985ecfa09c99111298c7d62e51dab

src/systeminfo/systeminfo_manager.cc

index aa8586ca55b7490f2a638546b988d5100df9a47f..abbac1865ec5a6e473526137ebe96fa3bfd19744 100644 (file)
@@ -304,16 +304,17 @@ class SysteminfoManager::TapiManager {
 
     std::lock_guard<std::mutex> lock(mutex_);
 
+    PlatformResult first_error = PlatformResult{ErrorCode::NO_ERROR};
     for (const auto& h : handles_) {
       for (const auto& n : kNotifications) {
         auto result = SysteminfoUtils::UnregisterTapiChangeCallback(h, n);
-        if (!result) {
-          return result;
+        if (!result && first_error) {
+          first_error = result;
         }
       }
     }
 
-    return PlatformResult{ErrorCode::NO_ERROR};
+    return first_error;
   }
 
   PlatformResult GetNetworkType(std::size_t index, int* network_type) {
@@ -507,15 +508,15 @@ SysteminfoManager::~SysteminfoManager() {
     UnregisterNetworkListener();
   }
   if (IsListenerRegistered(kPropertyIdWifiNetwork)) {
-    registered_listeners_.erase(kPropertyIdWifiNetwork) /*HACK*/;
+    registered_listeners_.erase(kPropertyIdWifiNetwork);
     UnregisterWifiNetworkListener();
   }
   if (IsListenerRegistered(kPropertyIdEthernetNetwork)) {
-    registered_listeners_.erase(kPropertyIdEthernetNetwork) /*HACK*/;
+    registered_listeners_.erase(kPropertyIdEthernetNetwork);
     UnregisterEthernetNetworkListener();
   }
   if (IsListenerRegistered(kPropertyIdCellularNetwork)) {
-    registered_listeners_.erase(kPropertyIdCellularNetwork) /*HACK*/;
+    registered_listeners_.erase(kPropertyIdCellularNetwork);
     UnregisterCellularNetworkListener();
   }
   if (IsListenerRegistered(kPropertyIdPeripheral)) {
@@ -949,17 +950,25 @@ PlatformResult SysteminfoManager::RegisterBatteryListener() {
   PlatformResult ret = PlatformResult(ErrorCode::NO_ERROR);
   CHECK_LISTENER_ERROR(SysteminfoUtils::RegisterVconfCallback(VCONFKEY_SYSMAN_BATTERY_CAPACITY,
                                                               OnBatteryChangedCb, this))
-  CHECK_LISTENER_ERROR(SysteminfoUtils::RegisterVconfCallback(VCONFKEY_SYSMAN_BATTERY_CHARGE_NOW,
-                                                              OnBatteryChangedCb, this))
+  ret = SysteminfoUtils::RegisterVconfCallback(VCONFKEY_SYSMAN_BATTERY_CHARGE_NOW,
+                                               OnBatteryChangedCb, this);
+  if (ret.IsError()) {
+    SysteminfoUtils::UnregisterVconfCallback(VCONFKEY_SYSMAN_BATTERY_CAPACITY, OnBatteryChangedCb);
+    return ret;
+  }
   LoggerD("Added callback for BATTERY");
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
 PlatformResult SysteminfoManager::UnregisterBatteryListener() {
   LoggerD("Entered");
-  PlatformResult ret = PlatformResult(ErrorCode::NO_ERROR);
-  CHECK_LISTENER_ERROR(SysteminfoUtils::UnregisterVconfCallback(VCONFKEY_SYSMAN_BATTERY_CAPACITY,
-                                                                OnBatteryChangedCb))
+  PlatformResult ret = SysteminfoUtils::UnregisterVconfCallback(VCONFKEY_SYSMAN_BATTERY_CAPACITY,
+                                                                OnBatteryChangedCb);
+  if (ret.IsError()) {
+    SysteminfoUtils::UnregisterVconfCallback(VCONFKEY_SYSMAN_BATTERY_CHARGE_NOW,
+                                             OnBatteryChangedCb);
+    return ret;
+  }
   CHECK_LISTENER_ERROR(SysteminfoUtils::UnregisterVconfCallback(VCONFKEY_SYSMAN_BATTERY_CHARGE_NOW,
                                                                 OnBatteryChangedCb))
   LoggerD("Removed callback for BATTERY");
@@ -996,12 +1005,13 @@ PlatformResult SysteminfoManager::RegisterStorageListener() {
 
 PlatformResult SysteminfoManager::UnregisterStorageListener() {
   LoggerD("Entered");
+  g_source_remove(storage_event_id_);
+  storage_event_id_ = 0;
+
   PlatformResult ret = PlatformResult(ErrorCode::NO_ERROR);
   CHECK_LISTENER_ERROR(
       SysteminfoUtils::UnregisterVconfCallback(VCONFKEY_SYSMAN_MMC_STATUS, OnMmcChangedCb))
 
-  g_source_remove(storage_event_id_);
-  storage_event_id_ = 0;
   LoggerD("Removed callback for STORAGE");
   return PlatformResult(ErrorCode::NO_ERROR);
 }
@@ -1034,6 +1044,8 @@ PlatformResult SysteminfoManager::RegisterDeviceOrientationListener() {
       sensord_register_event(GetSensorHandle(), AUTO_ROTATION_EVENT_CHANGE_STATE,
                              BASE_GATHERING_INTERVAL, 0, OnDeviceOrientationChangedCb, this);
   if (!sensor_ret) {
+    SysteminfoUtils::UnregisterVconfCallback(
+        VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, OnDeviceAutoRotationChangedCb);
     return LogAndCreateResult(
         ErrorCode::UNKNOWN_ERR, "Failed to register orientation change event listener",
         ("sensord_register_event returned false"));
@@ -1045,15 +1057,17 @@ PlatformResult SysteminfoManager::RegisterDeviceOrientationListener() {
 
 PlatformResult SysteminfoManager::UnregisterDeviceOrientationListener() {
   LoggerD("Entered");
-  PlatformResult ret = PlatformResult(ErrorCode::NO_ERROR);
-  CHECK_LISTENER_ERROR(SysteminfoUtils::UnregisterVconfCallback(
-      VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, OnDeviceAutoRotationChangedCb))
   bool sensor_ret = sensord_unregister_event(GetSensorHandle(), AUTO_ROTATION_EVENT_CHANGE_STATE);
   if (!sensor_ret) {
+    SysteminfoUtils::UnregisterVconfCallback(
+        VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, OnDeviceAutoRotationChangedCb);
     return LogAndCreateResult(
         ErrorCode::UNKNOWN_ERR, "Failed to unregister orientation change event listener",
         ("sensord_unregister_event returned false"));
   }
+  PlatformResult ret = PlatformResult(ErrorCode::NO_ERROR);
+  CHECK_LISTENER_ERROR(SysteminfoUtils::UnregisterVconfCallback(
+      VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, OnDeviceAutoRotationChangedCb))
 
   LoggerD("Removed callback for DEVICE_ORIENTATION");
   return PlatformResult(ErrorCode::NO_ERROR);
@@ -1064,17 +1078,23 @@ PlatformResult SysteminfoManager::RegisterLocaleListener() {
   PlatformResult ret = PlatformResult(ErrorCode::NO_ERROR);
   CHECK_LISTENER_ERROR(
       SysteminfoUtils::RegisterVconfCallback(VCONFKEY_REGIONFORMAT, OnLocaleChangedCb, this))
-  CHECK_LISTENER_ERROR(
-      SysteminfoUtils::RegisterVconfCallback(VCONFKEY_LANGSET, OnLocaleChangedCb, this))
+  ret = SysteminfoUtils::RegisterVconfCallback(VCONFKEY_LANGSET, OnLocaleChangedCb, this);
+  if (ret.IsError()) {
+    SysteminfoUtils::UnregisterVconfCallback(VCONFKEY_REGIONFORMAT, OnLocaleChangedCb);
+    return ret;
+  }
   LoggerD("Added callback for LOCALE");
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
 PlatformResult SysteminfoManager::UnregisterLocaleListener() {
   LoggerD("Entered");
-  PlatformResult ret = PlatformResult(ErrorCode::NO_ERROR);
-  CHECK_LISTENER_ERROR(
-      SysteminfoUtils::UnregisterVconfCallback(VCONFKEY_REGIONFORMAT, OnLocaleChangedCb))
+  PlatformResult ret =
+      SysteminfoUtils::UnregisterVconfCallback(VCONFKEY_REGIONFORMAT, OnLocaleChangedCb);
+  if (ret.IsError()) {
+    SysteminfoUtils::UnregisterVconfCallback(VCONFKEY_LANGSET, OnLocaleChangedCb);
+    return ret;
+  }
   CHECK_LISTENER_ERROR(
       SysteminfoUtils::UnregisterVconfCallback(VCONFKEY_LANGSET, OnLocaleChangedCb))
 
@@ -1202,10 +1222,16 @@ PlatformResult SysteminfoManager::UnregisterCellularNetworkListener() {
 
   // if there is no other ip-relateded listeners left, unregister
   if (!IsListenerRegistered(kPropertyIdCellularNetwork)) {
-    PlatformResult ret = PlatformResult(ErrorCode::NO_ERROR);
-    CHECK_LISTENER_ERROR(SysteminfoUtils::UnregisterVconfCallback(VCONFKEY_TELEPHONY_FLIGHT_MODE,
-                                                                  OnCellularNetworkValueChangedCb))
-
+    PlatformResult ret =
+        SysteminfoUtils::UnregisterVconfCallback(VCONFKEY_TELEPHONY_FLIGHT_MODE,
+                                                 OnCellularNetworkValueChangedCb);
+    if (ret.IsError()) {
+      tapi_manager_->UnregisterCallbacks();
+      if (IsIpChangeCallbackNotRegistered()) {
+        UnregisterIpChangeCallback();
+      }
+      return ret;
+    }
     CHECK_LISTENER_ERROR(tapi_manager_->UnregisterCallbacks());
   }