From fc57924356998fe56729ec7ec2bfaf1f48773110 Mon Sep 17 00:00:00 2001 From: Jakub Skowron Date: Mon, 30 Oct 2017 12:22:11 +0100 Subject: [PATCH] [Systeminfo] Fix unregister callback functions 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 | 76 +++++++++++++++++++--------- 1 file changed, 51 insertions(+), 25 deletions(-) diff --git a/src/systeminfo/systeminfo_manager.cc b/src/systeminfo/systeminfo_manager.cc index aa8586ca..abbac186 100644 --- a/src/systeminfo/systeminfo_manager.cc +++ b/src/systeminfo/systeminfo_manager.cc @@ -304,16 +304,17 @@ class SysteminfoManager::TapiManager { std::lock_guard 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()); } -- 2.34.1