[Systeminfo] Module reorganization, next part
authorPiotr Kosko <p.kosko@samsung.com>
Thu, 27 Aug 2015 14:45:51 +0000 (16:45 +0200)
committerPiotr Kosko <p.kosko@samsung.com>
Tue, 8 Sep 2015 08:31:22 +0000 (10:31 +0200)
[Feature] Implementation of getters was changed to use specialized classes.
  Listeners implementation was temporarly disabled.

[Verification] Code compiles without errors.
  Getters checked in chrome console and work fine.

Change-Id: I63cc9c21d0be1057375f349edf44b24b6cc4024a
Signed-off-by: Piotr Kosko <p.kosko@samsung.com>
src/systeminfo/systeminfo-utils.cpp
src/systeminfo/systeminfo-utils.h
src/systeminfo/systeminfo.gyp
src/systeminfo/systeminfo_instance.cc
src/systeminfo/systeminfo_manager.cc
src/systeminfo/systeminfo_manager.h
src/systeminfo/systeminfo_properties_manager.cc
src/systeminfo/systeminfo_properties_manager.h
src/systeminfo/systeminfo_sim_details_manager.cc [new file with mode: 0644]
src/systeminfo/systeminfo_sim_details_manager.h [new file with mode: 0644]

index 7aef3f58516c3f10c8a7c3c8031f70bd49f898d9..1a3480449d367a3f44887e58fb1f10cc1ad9318a 100644 (file)
@@ -57,7 +57,6 @@ const int MEMORY_TO_BYTE = 1024;
 const int BASE_GATHERING_INTERVAL = 100;
 const double DISPLAY_INCH_TO_MILLIMETER = 2.54;
 
-const int kTapiMaxHandle = 2;
 const int kDefaultPropertyCount = 1;
 
 }  // namespace
@@ -138,15 +137,6 @@ const int kWifiSignalStrengthDivideValue = 100;
 const unsigned short kMccDivider = 100;
 const char* kConnectionOff = "OFF";
 const char* kConnectionOn = "ON";
-//Sim
-const char* kSimStatusAbsent = "ABSENT";
-const char* kSimStatusInitializing = "INITIALIZING";
-const char* kSimStatusReady = "READY";
-const char* kSimStatusPinRequired = "PIN_REQUIRED";
-const char* kSimStatusPukRequired = "PUK_REQUIRED";
-const char* kSimStatusSimLocked = "SIM_LOCKED";
-const char* kSimStatusNetworkLocked = "NETWORK_LOCKED";
-const char* kSimStatusUnknown = "UNKNOWN";
 
 static std::string parseWifiNetworkError(int error) {
   switch (error) {
@@ -172,252 +162,6 @@ static std::string parseWifiNetworkError(int error) {
 
 }
 
-/////////////////////////// SimDetailsManager ////////////////////////////////
-
-class SimDetailsManager {
- private:
-  unsigned short mcc_;
-  unsigned short mnc_;
-  std::string operator_name_;
-  std::string msin_;
-  std::string state_;
-  std::string msisdn_;
-  std::string iccid_;
-  std::string spn_;
-
-  picojson::object* sim_result_obj_;
-  unsigned short to_process_;
-  std::mutex sim_to_process_mutex_;
-  std::mutex sim_info_mutex_;
-  long sim_count_;
-
-  void ResetSimHolder(picojson::object* out);
-  void FetchSimState(TapiHandle *tapi_handle);
-  PlatformResult FetchSimSyncProps(TapiHandle *tapi_handle);
-  void ReturnSimToJS();
-
- public:
-  SimDetailsManager();
-
-  PlatformResult GatherSimInformation(TapiHandle* handle, picojson::object* out);
-  long GetSimCount(TapiHandle **tapi_handle);
-  void TryReturn();
-
-  void set_operator_name(const std::string& name)
-  {
-    std::lock_guard<std::mutex> lock(sim_to_process_mutex_);
-    operator_name_ = name;
-    --to_process_;
-    LoggerD("Operator name: %s", operator_name_.c_str());
-  };
-  void set_msisdn(const std::string& msisdn)
-  {
-    std::lock_guard<std::mutex> lock(sim_to_process_mutex_);
-    this->msisdn_ = msisdn;
-    --to_process_;
-    LoggerD("MSISDN number: %s", this->msisdn_.c_str());
-  };
-  void set_spn(const std::string& spn)
-  {
-    std::lock_guard<std::mutex> lock(sim_to_process_mutex_);
-    this->spn_ = spn;
-    --to_process_;
-    LoggerD("SPN value: %s", this->spn_.c_str());
-  };
-};
-
-SimDetailsManager::SimDetailsManager():
-            mcc_(0),
-            mnc_(0),
-            operator_name_(""),
-            msin_(""),
-            state_(""),
-            msisdn_(""),
-            iccid_(""),
-            spn_(""),
-            sim_result_obj_(nullptr),
-            to_process_(0),
-            sim_count_(0)
-{
-}
-
-PlatformResult SimDetailsManager::GatherSimInformation(TapiHandle* handle, picojson::object* out)
-{
-  std::lock_guard<std::mutex> first_lock_sim(sim_info_mutex_);
-  ResetSimHolder(out);
-
-  FetchSimState(handle);
-  if (kSimStatusReady == state_) {
-    PlatformResult ret = FetchSimSyncProps(handle);
-    if (ret.IsError()) {
-      return ret;
-    }
-    {
-      //All props should be fetched synchronously, but sync function does not work
-      std::lock_guard<std::mutex> lock_to_process(sim_to_process_mutex_);
-      //would be deleted on } ending bracket
-      int result = tel_get_sim_cphs_netname(handle, SimCphsValueCallback, nullptr);
-      if (TAPI_API_SUCCESS == result) {
-        ++to_process_;
-      } else {
-        LoggerE("Failed getting cphs netname: %d", result);
-      }
-
-      result = tel_get_sim_msisdn(handle, SimMsisdnValueCallback, nullptr);
-      if (TAPI_API_SUCCESS == result) {
-        ++to_process_;
-      } else {
-        LoggerE("Failed getting msisdn: %d", result);
-      }
-
-      result = tel_get_sim_spn(handle, SimSpnValueCallback, nullptr);
-      if (TAPI_API_SUCCESS == result) {
-        ++to_process_;
-      } else {
-        LoggerE("Failed getting spn: %d", result);
-      }
-    }
-    //prevent returning not filled result
-    std::lock_guard<std::mutex> lock_sim(sim_info_mutex_);
-    //result will come from callbacks
-    return PlatformResult(ErrorCode::NO_ERROR);
-  }
-  //if sim state is not READY return default values and don't wait for callbacks
-  TryReturn();
-  return PlatformResult(ErrorCode::NO_ERROR);
-}
-
-void SimDetailsManager::FetchSimState(TapiHandle *tapi_handle)
-{
-  LoggerD("Entered");
-  if (nullptr == tapi_handle) {
-    LoggerE("Tapi handle is null");
-    state_ = kSimStatusUnknown;
-  } else {
-    int card_changed = 0;
-    TelSimCardStatus_t sim_card_state;
-    int error = tel_get_sim_init_info(tapi_handle, &sim_card_state, &card_changed);
-    if (TAPI_API_SUCCESS == error) {
-      switch (sim_card_state) {
-        case TAPI_SIM_STATUS_CARD_NOT_PRESENT:
-        case TAPI_SIM_STATUS_CARD_REMOVED:
-          state_ = kSimStatusAbsent;
-          break;
-        case TAPI_SIM_STATUS_SIM_INITIALIZING:
-          state_ = kSimStatusInitializing;
-          break;
-        case TAPI_SIM_STATUS_SIM_INIT_COMPLETED:
-          state_ = kSimStatusReady;
-          break;
-        case TAPI_SIM_STATUS_SIM_PIN_REQUIRED:
-          state_ = kSimStatusPinRequired;
-          break;
-        case TAPI_SIM_STATUS_SIM_PUK_REQUIRED:
-          state_ = kSimStatusPukRequired;
-          break;
-        case TAPI_SIM_STATUS_SIM_LOCK_REQUIRED:
-        case TAPI_SIM_STATUS_CARD_BLOCKED:
-          state_ = kSimStatusSimLocked;
-          break;
-        case TAPI_SIM_STATUS_SIM_NCK_REQUIRED:
-        case TAPI_SIM_STATUS_SIM_NSCK_REQUIRED:
-          state_ = kSimStatusNetworkLocked;
-          break;
-        default:
-          state_ = kSimStatusUnknown;
-          break;
-      }
-    }
-  }
-}
-
-PlatformResult SimDetailsManager::FetchSimSyncProps(TapiHandle *tapi_handle)
-{
-  LoggerD("Entered");
-  TelSimImsiInfo_t imsi;
-  int error = tel_get_sim_imsi(tapi_handle, &imsi);
-  if (TAPI_API_SUCCESS == error) {
-    LoggerD("mcc: %s, mnc: %s, msin: %s", imsi.szMcc, imsi.szMnc, imsi.szMsin);
-    mcc_ = std::stoul(imsi.szMcc);
-    mnc_ = std::stoul(imsi.szMnc);
-    msin_ = imsi.szMsin;
-  }
-  else {
-    LoggerE("Failed to get sim imsi: %d", error);
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to get sim imsi");
-  }
-
-  //TODO add code for iccid value fetching, when proper API would be ready
-  iccid_ = "";
-  return PlatformResult(ErrorCode::NO_ERROR);
-}
-
-void SimDetailsManager::ResetSimHolder(picojson::object* out){
-  sim_result_obj_ = out;
-  to_process_ = 0;
-  mcc_ = 0;
-  mnc_ = 0;
-  operator_name_ = "";
-  msin_ = "";
-  state_ = "";
-  msisdn_ = "";
-  iccid_ = "";
-  spn_ = "";
-}
-
-void SimDetailsManager::ReturnSimToJS(){
-  LoggerD("Entered");
-  if (nullptr != sim_result_obj_) {
-    sim_result_obj_->insert(std::make_pair("state", picojson::value(state_)));
-    sim_result_obj_->insert(std::make_pair("operatorName", picojson::value(operator_name_)));
-    sim_result_obj_->insert(std::make_pair("msisdn", picojson::value(msisdn_)));
-    sim_result_obj_->insert(std::make_pair("iccid", picojson::value(iccid_)));
-    sim_result_obj_->insert(std::make_pair("mcc", picojson::value(std::to_string(mcc_))));
-    sim_result_obj_->insert(std::make_pair("mnc", picojson::value(std::to_string(mnc_))));
-    sim_result_obj_->insert(std::make_pair("msin", picojson::value(msin_)));
-    sim_result_obj_->insert(std::make_pair("spn", picojson::value(spn_)));
-    //everything returned, clear pointer
-    sim_result_obj_ = nullptr;
-  } else {
-    LoggerE("No sim returned JSON object pointer is null");
-  }
-}
-
-long SimDetailsManager::GetSimCount(TapiHandle **tapi_handle){
-  if (0 != sim_count_){
-    LoggerD("Sim counted already");
-  } else {
-    LoggerD("Gathering sim count");
-    char **cp_list = tel_get_cp_name_list();
-    if (cp_list != NULL) {
-      while (cp_list[sim_count_]) {
-        tapi_handle[sim_count_] = tel_init(cp_list[sim_count_]);
-        if (tapi_handle[sim_count_] == NULL) {
-          LoggerE("Failed to connect with tapi, handle is null");
-          break;
-        }
-        sim_count_++;
-        LoggerD("%d modem: %s", sim_count_, cp_list[sim_count_]);
-      }
-    } else {
-      LoggerE("Failed to get cp list");
-      sim_count_ = kTapiMaxHandle;
-    }
-    g_strfreev(cp_list);
-  }
-  return sim_count_;
-}
-
-void SimDetailsManager::TryReturn(){
-  if (0 == to_process_){
-    LoggerD("Returning property to JS");
-    ReturnSimToJS();
-    sim_info_mutex_.unlock();
-  } else {
-    LoggerD("Not ready yet - waiting");
-  }
-}
-
 /////////////////////////// SystemInfoListeners ////////////////////////////////
 
 class SystemInfoListeners {
@@ -963,36 +707,6 @@ PlatformResult CheckIfEthernetNetworkSupported()
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-common::PlatformResult CheckTelephonySupport() {
-  bool supported = false;
-  PlatformResult ret = SystemInfoDeviceCapability::GetValueBool(
-    "tizen.org/feature/network.telephony", &supported);
-  if (ret.IsError()) {
-    return ret;
-  }
-  if (!supported) {
-    LoggerD("Telephony is not supported on this device");
-    return PlatformResult(ErrorCode::NOT_SUPPORTED_ERR,
-        "Telephony is not supported on this device");
-  }
-  return PlatformResult(ErrorCode::NO_ERROR);
-}
-
-common::PlatformResult CheckCameraFlashSupport() {
-  bool supported = false;
-  PlatformResult ret = SystemInfoDeviceCapability::GetValueBool(
-    "tizen.org/feature/camera.back.flash", &supported);
-  if (ret.IsError()) {
-    return ret;
-  }
-  if (!supported) {
-    LoggerD("Back-facing camera with a flash is not supported on this device");
-    return PlatformResult(ErrorCode::NOT_SUPPORTED_ERR,
-        "Back-facing camera with a flash is not supported on this device");
-  }
-  return PlatformResult(ErrorCode::NO_ERROR);
-}
-
 PlatformResult SystemInfoListeners::RegisterEthernetNetworkListener(const SysteminfoUtilsCallback& callback,
                                                                     SysteminfoInstance& instance)
 {
@@ -1038,7 +752,7 @@ PlatformResult SystemInfoListeners::RegisterCellularNetworkListener(const System
                                                                     SysteminfoInstance& instance)
 {
   LoggerD("Entered");
-  PlatformResult ret = CheckTelephonySupport();
+  PlatformResult ret = SysteminfoUtils::CheckTelephonySupport();
   if (ret.IsError()) {
       return ret;
   }
@@ -1218,52 +932,52 @@ void SystemInfoListeners::OnCpuChangedCallback(void* event_ptr)
 {
   LoggerD("");
   picojson::value result = picojson::value(picojson::object());
-  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdCpu, false, result);
-  if (ret.IsSuccess()) {
-    if (m_cpu_load == m_last_cpu_load) {
-      return;
-    }
-    if (nullptr != m_cpu_listener) {
-      SysteminfoInstance* instance = static_cast<SysteminfoInstance*>(event_ptr);
-      m_last_cpu_load = m_cpu_load;
-      m_cpu_listener(*instance);
-    }
-  }
+//  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdCpu, false, result);
+//  if (ret.IsSuccess()) {
+//    if (m_cpu_load == m_last_cpu_load) {
+//      return;
+//    }
+//    if (nullptr != m_cpu_listener) {
+//      SysteminfoInstance* instance = static_cast<SysteminfoInstance*>(event_ptr);
+//      m_last_cpu_load = m_cpu_load;
+//      m_cpu_listener(*instance);
+//    }
+//  }
 }
 
 void SystemInfoListeners::OnStorageChangedCallback(void* event_ptr)
 {
   LoggerD("");
   picojson::value result = picojson::value(picojson::object());
-  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdStorage, false, result);
-  if (ret.IsSuccess()) {
-    if (m_available_capacity_internal == m_last_available_capacity_internal) {
-      return;
-    }
-
-    if (nullptr != m_storage_listener) {
-      SysteminfoInstance* instance = static_cast<SysteminfoInstance*>(event_ptr);
-      m_last_available_capacity_internal = m_available_capacity_internal;
-      m_storage_listener(*instance);
-    }
-  }
+//  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdStorage, false, result);
+//  if (ret.IsSuccess()) {
+//    if (m_available_capacity_internal == m_last_available_capacity_internal) {
+//      return;
+//    }
+//
+//    if (nullptr != m_storage_listener) {
+//      SysteminfoInstance* instance = static_cast<SysteminfoInstance*>(event_ptr);
+//      m_last_available_capacity_internal = m_available_capacity_internal;
+//      m_storage_listener(*instance);
+//    }
+//  }
 }
 
 void SystemInfoListeners::OnMmcChangedCallback(keynode_t* /*node*/, void* event_ptr)
 {
   LoggerD("");
   picojson::value result = picojson::value(picojson::object());
-  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdStorage, false, result);
-  if (ret.IsSuccess()) {
-    if (m_available_capacity_mmc == m_last_available_capacity_mmc) {
-      return;
-    }
-    if (nullptr != m_storage_listener) {
-      SysteminfoInstance* instance = static_cast<SysteminfoInstance*>(event_ptr);
-      m_last_available_capacity_mmc = m_available_capacity_mmc;
-      m_storage_listener(*instance);
-    }
-  }
+//  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdStorage, false, result);
+//  if (ret.IsSuccess()) {
+//    if (m_available_capacity_mmc == m_last_available_capacity_mmc) {
+//      return;
+//    }
+//    if (nullptr != m_storage_listener) {
+//      SysteminfoInstance* instance = static_cast<SysteminfoInstance*>(event_ptr);
+//      m_last_available_capacity_mmc = m_available_capacity_mmc;
+//      m_storage_listener(*instance);
+//    }
+//  }
 }
 
 
@@ -1588,703 +1302,215 @@ void OnWifiLevelChangedCb (wifi_rssi_level_e rssi_level, void *user_data)
 }
 
 /////////////////////////// SysteminfoUtils ////////////////////////////////
-
-static PlatformResult GetRuntimeInfoString(system_settings_key_e key, std::string& platform_string) {
-  char* platform_c_string;
-  int err = system_settings_get_value_string(key, &platform_c_string);
-  if (SYSTEM_SETTINGS_ERROR_NONE == err) {
-    if (nullptr != platform_c_string) {
-      platform_string = platform_c_string;
-      free(platform_c_string);
-      return PlatformResult(ErrorCode::NO_ERROR);
-    }
-  }
-  const std::string error_msg = "Error when retrieving system setting information: "
-      + std::to_string(err);
-  LoggerE("%s", error_msg.c_str());
-  return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
-}
-
-PlatformResult GetVconfInt(const char *key, int &value) {
-  if (0 == vconf_get_int(key, &value)) {
-    LoggerD("value[%s]: %d", key, value);
-    return PlatformResult(ErrorCode::NO_ERROR);
-  }
-  const std::string error_msg = "Could not get " + std::string(key);
-  LoggerD("%s",error_msg.c_str());
-  return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
+PlatformResult SysteminfoUtils::RegisterBatteryListener(const SysteminfoUtilsCallback& callback,
+                                                        SysteminfoInstance& instance)
+{
+  return system_info_listeners.RegisterBatteryListener(callback, instance);
 }
 
-PlatformResult SysteminfoUtils::GetTotalMemory(long long& result)
+PlatformResult SysteminfoUtils::UnregisterBatteryListener()
 {
-  LoggerD("Entered");
-
-  unsigned int value = 0;
+  return system_info_listeners.UnregisterBatteryListener();
+}
 
-  int ret = device_memory_get_total(&value);
-  if (ret != DEVICE_ERROR_NONE) {
-    std::string log_msg = "Failed to get total memory: " + std::to_string(ret);
-    LoggerE("%s", log_msg.c_str());
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-  }
 
-  result = static_cast<long long>(value*MEMORY_TO_BYTE);
-  return PlatformResult(ErrorCode::NO_ERROR);
+PlatformResult SysteminfoUtils::RegisterCpuListener(const SysteminfoUtilsCallback& callback,
+                                                    SysteminfoInstance& instance)
+{
+  return system_info_listeners.RegisterCpuListener(callback, instance);
 }
 
-PlatformResult SysteminfoUtils::GetAvailableMemory(long long& result)
+PlatformResult SysteminfoUtils::UnregisterCpuListener()
 {
-  LoggerD("Entered");
-
-  unsigned int value = 0;
+  return system_info_listeners.UnregisterCpuListener();
+}
 
-  int ret = device_memory_get_available(&value);
-  if (ret != DEVICE_ERROR_NONE) {
-    std::string log_msg = "Failed to get total memory: " + std::to_string(ret);
-    LoggerE("%s", log_msg.c_str());
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-  }
 
-  result = static_cast<long long>(value*MEMORY_TO_BYTE);
-  return PlatformResult(ErrorCode::NO_ERROR);
+PlatformResult SysteminfoUtils::RegisterStorageListener(const SysteminfoUtilsCallback& callback,
+                                                        SysteminfoInstance& instance)
+{
+  return system_info_listeners.RegisterStorageListener(callback, instance);
 }
 
-PlatformResult SysteminfoUtils::GetCount(const std::string& property, unsigned long& count)
+PlatformResult SysteminfoUtils::UnregisterStorageListener()
 {
-  LoggerD("Enter");
-
-  if ("BATTERY" == property || "CPU" == property || "STORAGE" == property ||
-      "DISPLAY" == property || "DEVICE_ORIENTATION" == property ||
-      "BUILD" == property || "LOCALE" == property || "NETWORK" == property ||
-      "WIFI_NETWORK" == property || "PERIPHERAL" == property ||
-      "MEMORY" == property) {
-    count = kDefaultPropertyCount;
-  } else if ("CELLULAR_NETWORK" == property) {
-    PlatformResult ret = CheckTelephonySupport();
-    if (ret.IsError()) {
-      count = 0;
-    } else {
-      count = sim_mgr.GetSimCount(system_info_listeners.GetTapiHandles());
-    }
-  } else if ("SIM" == property) {
-    PlatformResult ret = CheckTelephonySupport();
-    if (ret.IsError()) {
-      count = 0;
-    } else {
-      count = sim_mgr.GetSimCount(system_info_listeners.GetTapiHandles());
-    }
-  } else if ("CAMERA_FLASH" == property) {
-    count = system_info_listeners.GetCameraTypesCount();
-  } else if ("ETHERNET_NETWORK" == property) {
-    PlatformResult ret = CheckIfEthernetNetworkSupported();
-    if (ret.IsError()) count = 0;
-    else count = kDefaultPropertyCount;
-  } else {
-    LoggerD("Property with given id is not supported");
-    return PlatformResult(ErrorCode::NOT_SUPPORTED_ERR, "Property with given id is not supported");
-  }
-  return PlatformResult(ErrorCode::NO_ERROR);
+  return system_info_listeners.UnregisterStorageListener();
 }
 
-PlatformResult SysteminfoUtils::ReportProperty(const std::string& property, int index,
-                                               picojson::object& res_obj) {
-  if ("BATTERY" == property){
-    return ReportBattery(res_obj);
-  } else if ("CPU" == property) {
-    return ReportCpu(res_obj);
-  } else if ("STORAGE" == property) {
-    return ReportStorage(res_obj);
-  } else if ("DISPLAY" == property) {
-    return ReportDisplay(res_obj);
-  } else if ("DEVICE_ORIENTATION" == property) {
-    return ReportDeviceOrientation(res_obj);
-  } else if ("BUILD" == property) {
-    return ReportBuild(res_obj);
-  } else if ("LOCALE" == property) {
-    return ReportLocale(res_obj);
-  } else if ("NETWORK" == property) {
-    return ReportNetwork(res_obj);
-  } else if ("WIFI_NETWORK" == property) {
-    return ReportWifiNetwork(res_obj);
-  } else if ("ETHERNET_NETWORK" == property) {
-    return ReportEthernetNetwork(res_obj);
-  } else if ("CELLULAR_NETWORK" == property) {
-    return ReportCellularNetwork(res_obj, index);
-  } else if ("SIM" == property) {
-    return ReportSim(res_obj, index);
-  } else if ("PERIPHERAL" == property) {
-    return ReportPeripheral(res_obj);
-  } else if ("MEMORY" == property) {
-    return ReportMemory(res_obj);
-  } else if ("CAMERA_FLASH" == property) {
-    return ReportCameraFlash(res_obj, index);
-  }
-  LoggerD("Property with given id is not supported");
-  return PlatformResult(ErrorCode::NOT_SUPPORTED_ERR, "Property with given id is not supported");
-}
-
-PlatformResult SysteminfoUtils::GetPropertyValue(const std::string& property, bool is_array_type,
-                                                  picojson::value& res)
-{
-  LoggerD("Entered getPropertyValue");
-
-  if (!is_array_type) {
-    picojson::object& res_obj = res.get<picojson::object>();
-    return ReportProperty(property, 0, res_obj);
-  } else {
-    picojson::object& array_result_obj = res.get<picojson::object>();
-    picojson::array& array = array_result_obj.insert(
-        std::make_pair("array", picojson::value(picojson::array()))).
-            first->second.get<picojson::array>();
-
-    unsigned long property_count = 0;
-    PlatformResult ret = SysteminfoUtils::GetCount(property, property_count);
-    if (ret.IsError()){
-      return ret;
-    }
-
-    LoggerD("property name: %s", property.c_str());
-    LoggerD("available property count: %d", property_count);
-    for (size_t i = 0; i < property_count; i++) {
-      picojson::value result = picojson::value(picojson::object());
-      picojson::object& result_obj = result.get<picojson::object>();
-
-      ret = ReportProperty(property, i, result_obj);
-      if (ret.IsError()){
-        return ret;
-      }
-      array.push_back(result);
-    }
-    if (property_count == 0) {
-      return PlatformResult(ErrorCode::NOT_SUPPORTED_ERR, "Property with given id is not supported");
-    }
-  }
-
-  return PlatformResult(ErrorCode::NO_ERROR);
+PlatformResult SysteminfoUtils::RegisterDisplayListener(const SysteminfoUtilsCallback& callback,
+                                                        SysteminfoInstance& instance)
+{
+  return system_info_listeners.RegisterDisplayListener(callback, instance);
 }
 
-PlatformResult SysteminfoUtils::ReportBattery(picojson::object& out) {
-  int value = 0;
-  int ret = vconf_get_int(VCONFKEY_SYSMAN_BATTERY_CAPACITY, &value);
-  if (kVconfErrorNone != ret) {
-    std::string log_msg = "Platform error while getting battery detail: ";
-    LoggerE("%s%d", log_msg.c_str(), ret);
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, (log_msg + std::to_string(ret)));
-  }
+PlatformResult SysteminfoUtils::UnregisterDisplayListener()
+{
+  return system_info_listeners.UnregisterDisplayListener();
+}
 
-  out.insert(std::make_pair("level", picojson::value(static_cast<double>(value)/kRemainingBatteryChargeMax)));
-  value = 0;
-  ret = vconf_get_int(VCONFKEY_SYSMAN_BATTERY_CHARGE_NOW, &value);
-  if (kVconfErrorNone != ret) {
-    std::string log_msg =  "Platform error while getting battery charging: ";
-    LoggerE("%s%d",log_msg.c_str(), ret);
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, (log_msg + std::to_string(ret)));
-  }
-  out.insert(std::make_pair("isCharging", picojson::value(0 != value)));
-  return PlatformResult(ErrorCode::NO_ERROR);
+PlatformResult SysteminfoUtils::RegisterDeviceOrientationListener(const SysteminfoUtilsCallback& callback,
+                                                                  SysteminfoInstance& instance)
+{
+  return system_info_listeners.RegisterDeviceOrientationListener(callback, instance);
 }
-//TODO maybe make two functions later onGSourceFunc
-PlatformResult SysteminfoUtils::ReportCpu(picojson::object& out) {
-  LoggerD("Entered");
-  static CpuInfo cpu_info;
-  FILE *fp = nullptr;
-  fp = fopen("/proc/stat", "r");
-  if (nullptr == fp) {
-    std::string error_msg("Can not open /proc/stat for reading");
-    LoggerE( "%s", error_msg.c_str() );
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
-  }
-
-  long long usr = 0;
-  long long system = 0;
-  long long nice = 0;
-  long long idle = 0;
-  double load = 0;
-
-  int read_ret = fscanf( fp, "%*s %lld %lld %lld %lld", &usr, &system, &nice, &idle);
-  fclose(fp);
-
-  if (4 == read_ret) {
-    long long total = usr + nice + system + idle - cpu_info.usr - cpu_info.nice -
-        cpu_info.system - cpu_info.idle;
-    long long diff_idle = idle - cpu_info.idle;
-    if (( total > 0LL ) && ( diff_idle > 0LL )) {
-      load = static_cast< double >( diff_idle ) * 100LL / total;
-      cpu_info.usr = usr;
-      cpu_info.system = system;
-      cpu_info.nice = nice;
-      cpu_info.idle = idle;
-      cpu_info.load = load;
-    } else {
-      LoggerW("Cannot calculate cpu load, previous value returned");
-      load = cpu_info.load;
-    }
-  } else {
-    std::string error_msg( "Could not read /proc/stat" );
-    LoggerE( "%s", error_msg.c_str() );
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
-  }
 
-  system_info_listeners.SetCpuInfoLoad(cpu_info.load);
+PlatformResult SysteminfoUtils::UnregisterDeviceOrientationListener()
+{
+  return system_info_listeners.UnregisterDeviceOrientationListener();
+}
 
-  load = 100 - load;
-  LoggerD("Cpu load : %f", load );
-  out.insert(std::make_pair("load", picojson::value(load / 100.0)));
-  return PlatformResult(ErrorCode::NO_ERROR);
+PlatformResult SysteminfoUtils::RegisterLocaleListener(const SysteminfoUtilsCallback& callback,
+                                                       SysteminfoInstance& instance)
+{
+  return system_info_listeners.RegisterLocaleListener(callback, instance);
 }
 
-PlatformResult SysteminfoUtils::ReportDisplay(picojson::object& out) {
-  int screenWidth = 0;
-  int screenHeight = 0;
-  int dotsPerInchWidth = 0;
-  int dotsPerInchHeight = 0;
-  double physicalWidth = 0;
-  double physicalHeight = 0;
-  double scaledBrightness;
-
-  // FETCH RESOLUTION
-  if (SYSTEM_INFO_ERROR_NONE != system_info_get_platform_int(
-      "tizen.org/feature/screen.width", &screenWidth)) {
-    LoggerE("Cannot get value of screen width");
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get value of screen width");
-  }
-  if (SYSTEM_INFO_ERROR_NONE != system_info_get_platform_int(
-      "tizen.org/feature/screen.height", &screenHeight)) {
-    LoggerE("Cannot get value of screen height");
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get value of screen height");
-  }
-
-  //FETCH DOTS PER INCH
-  int dots_per_inch=0;
-  if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_int(
-      "tizen.org/feature/screen.dpi", &dots_per_inch)) {
-    dotsPerInchWidth = dots_per_inch;
-    dotsPerInchHeight = dots_per_inch;
-  } else {
-    LoggerE("Cannot get 'tizen.org/feature/screen.dpi' value");
-    return PlatformResult(ErrorCode::UNKNOWN_ERR,
-                          "Cannot get 'tizen.org/feature/screen.dpi' value");
-  }
+PlatformResult SysteminfoUtils::UnregisterLocaleListener()
+{
+  return system_info_listeners.UnregisterLocaleListener();
+}
 
-  //FETCH PHYSICAL WIDTH
-  if (dotsPerInchWidth != 0 && screenWidth != 0) {
-    physicalWidth = (screenWidth / dotsPerInchWidth) * DISPLAY_INCH_TO_MILLIMETER;
-  } else {
-    std::string log_msg = "Failed to get physical screen width value";
-    LoggerE("%s, screenWidth : %d, dotsPerInchWidth: %d", log_msg.c_str(),
-         screenWidth, dotsPerInchWidth);
-  }
+PlatformResult SysteminfoUtils::RegisterNetworkListener(const SysteminfoUtilsCallback& callback,
+                                                        SysteminfoInstance& instance)
+{
+  return system_info_listeners.RegisterNetworkListener(callback, instance);
+}
 
-  //FETCH PHYSICAL HEIGHT
-  if (dotsPerInchHeight != 0 && screenHeight != 0) {
-    physicalHeight = (screenHeight / dotsPerInchHeight) * DISPLAY_INCH_TO_MILLIMETER;
-  } else {
-    std::string log_msg = "Failed to get physical screen height value";
-    LoggerE("%s, screenHeight : %d, dotsPerInchHeight: %d", log_msg.c_str(),
-         screenHeight, dotsPerInchHeight);
-  }
+PlatformResult SysteminfoUtils::UnregisterNetworkListener()
+{
+  return system_info_listeners.UnregisterNetworkListener();
+}
 
-  //FETCH BRIGHTNESS
-  int brightness;
-  if (kVconfErrorNone == vconf_get_int(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, &brightness)) {
-    scaledBrightness = static_cast<double>(brightness)/kDisplayBrightnessDivideValue;
-  } else {
-    LoggerE("Cannot get brightness value of display");
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get brightness value of display");
-  }
+PlatformResult SysteminfoUtils::RegisterWifiNetworkListener(const SysteminfoUtilsCallback& callback,
+                                                            SysteminfoInstance& instance)
+{
+  return system_info_listeners.RegisterWifiNetworkListener(callback, instance);
+}
 
-  out.insert(std::make_pair("resolutionWidth", picojson::value(std::to_string(screenWidth))));
-  out.insert(std::make_pair("resolutionHeight", picojson::value(std::to_string(screenHeight))));
-  out.insert(std::make_pair("dotsPerInchWidth", picojson::value(std::to_string(dotsPerInchWidth))));
-  out.insert(std::make_pair("dotsPerInchHeight", picojson::value(std::to_string(dotsPerInchHeight))));
-  out.insert(std::make_pair("physicalWidth", picojson::value(std::to_string(physicalWidth))));
-  out.insert(std::make_pair("physicalHeight", picojson::value(std::to_string(physicalHeight))));
-  out.insert(std::make_pair("brightness", picojson::value(scaledBrightness)));
-  return PlatformResult(ErrorCode::NO_ERROR);
+PlatformResult SysteminfoUtils::UnregisterWifiNetworkListener()
+{
+  return system_info_listeners.UnregisterWifiNetworkListener();
 }
 
-static PlatformResult FetchIsAutoRotation(bool* result)
+PlatformResult SysteminfoUtils::RegisterEthernetNetworkListener(const SysteminfoUtilsCallback& callback,
+                                                                SysteminfoInstance& instance)
 {
   LoggerD("Entered");
-  int is_auto_rotation = 0;
+  return system_info_listeners.RegisterEthernetNetworkListener(callback, instance);
+}
 
-  if ( 0 == vconf_get_bool(
-      VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, &is_auto_rotation)) {
-    if (is_auto_rotation) {
-      *result = true;
-    } else {
-      *result = false;
-    }
-    return PlatformResult(ErrorCode::NO_ERROR);
-  }
-  else {
-    LoggerE("VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL check failed");
-    return PlatformResult(ErrorCode::UNKNOWN_ERR,
-                          "VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL check failed");
-  }
-}
-
-static PlatformResult FetchStatus(std::string* result)
+PlatformResult SysteminfoUtils::UnregisterEthernetNetworkListener()
 {
   LoggerD("Entered");
-  int rotation = 0;
-  std::string status = kOrientationPortraitPrimary;
-
-  sensor_data_t data;
-  bool ret = sensord_get_data(system_info_listeners.GetSensorHandle(),
-                             AUTO_ROTATION_BASE_DATA_SET, &data);
-  if (ret) {
-    LoggerD("size of the data value array:%d", data.value_count);
-    if (data.value_count > 0 ) {
-      rotation = data.values[0];
-      LoggerD("rotation is: %d", rotation);
-    } else {
-      LoggerE("Failed to get data : the size of array is 0. Default rotation would be returned.");
-    }
-  } else {
-    LoggerE("Failed to get data(sensord_get_data). Default rotation would be returned.");
-  }
-
-
-  switch (rotation) {
-    case AUTO_ROTATION_DEGREE_UNKNOWN:
-    case AUTO_ROTATION_DEGREE_0:
-      LoggerD("AUTO_ROTATION_DEGREE_0");
-      status = kOrientationPortraitPrimary;
-      break;
-    case AUTO_ROTATION_DEGREE_90:
-      LoggerD("AUTO_ROTATION_DEGREE_90");
-      status = kOrientationLandscapePrimary;
-      break;
-    case AUTO_ROTATION_DEGREE_180:
-      LoggerD("AUTO_ROTATION_DEGREE_180");
-      status = kOrientationPortraitSecondary;
-      break;
-    case AUTO_ROTATION_DEGREE_270:
-      LoggerD("AUTO_ROTATION_DEGREE_270");
-      status = kOrientationLandscapeSecondary;
-      break;
-    default:
-      LoggerE("Received unexpected data: %u", rotation);
-      return PlatformResult(ErrorCode::UNKNOWN_ERR, "Received unexpected data");
-  }
-  *result = status;
-  return PlatformResult(ErrorCode::NO_ERROR);
+  return system_info_listeners.UnregisterEthernetNetworkListener();
 }
 
-PlatformResult SysteminfoUtils::ReportDeviceOrientation(picojson::object& out) {
-  bool is_auto_rotation = false;
-  std::string status = "";
-
-  PlatformResult ret = FetchIsAutoRotation(&is_auto_rotation);
-  if (ret.IsError()) return ret;
-
-  ret = FetchStatus(&status);
-  if (ret.IsError()) return ret;
-
-  out.insert(std::make_pair("isAutoRotation", picojson::value(is_auto_rotation)));
-  out.insert(std::make_pair("status", picojson::value(status)));
-  return PlatformResult(ErrorCode::NO_ERROR);
+PlatformResult SysteminfoUtils::RegisterCellularNetworkListener(const SysteminfoUtilsCallback& callback,
+                                                                SysteminfoInstance& instance)
+{
+  return system_info_listeners.RegisterCellularNetworkListener(callback, instance);
 }
 
-PlatformResult SysteminfoUtils::ReportBuild(picojson::object& out) {
-  std::string model = "";
-  PlatformResult ret = SystemInfoDeviceCapability::GetValueString(
-      "tizen.org/system/model_name", &model);
-  if (ret.IsError()) {
-    return ret;
-  }
-  std::string manufacturer = "";
-  ret = SystemInfoDeviceCapability::GetValueString(
-      "tizen.org/system/manufacturer", &manufacturer);
-  if (ret.IsError()) {
-    return ret;
-  }
-  std::string buildVersion = "";
-  ret = SystemInfoDeviceCapability::GetValueString(
-      "tizen.org/system/build.string", &buildVersion);
-  if (ret.IsError()) {
-    return ret;
-  }
-
-  out.insert(std::make_pair("model", picojson::value(model)));
-  out.insert(std::make_pair("manufacturer", picojson::value(manufacturer)));
-  out.insert(std::make_pair("buildVersion", picojson::value(buildVersion)));
-  return PlatformResult(ErrorCode::NO_ERROR);
+PlatformResult SysteminfoUtils::UnregisterCellularNetworkListener()
+{
+  return system_info_listeners.UnregisterCellularNetworkListener();
 }
 
-PlatformResult SysteminfoUtils::ReportLocale(picojson::object& out) {
-  std::string str_language = "";
-  PlatformResult ret = GetRuntimeInfoString(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, str_language);
-  if (ret.IsError()) {
-    return ret;
-  }
+PlatformResult SysteminfoUtils::RegisterPeripheralListener(const SysteminfoUtilsCallback& callback,
+                                                           SysteminfoInstance& instance)
+{
+  return system_info_listeners.RegisterPeripheralListener(callback, instance);
+}
 
-  std::string str_country = "";
-  ret = GetRuntimeInfoString(SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY, str_country);
-  if (ret.IsError()) {
-    return ret;
-  }
+PlatformResult SysteminfoUtils::UnregisterPeripheralListener()
+{
+  return system_info_listeners.UnregisterPeripheralListener();
+}
 
-  out.insert(std::make_pair("language", picojson::value(str_language)));
-  out.insert(std::make_pair("country", picojson::value(str_country)));
-  return PlatformResult(ErrorCode::NO_ERROR);
+PlatformResult SysteminfoUtils::RegisterMemoryListener(const SysteminfoUtilsCallback& callback,
+                                                       SysteminfoInstance& instance)
+{
+  return system_info_listeners.RegisterMemoryListener(callback, instance);
 }
 
-static PlatformResult GetNetworkTypeString(NetworkType type, std::string& type_string)
-{
-  switch (type) {
-    case kNone:
-      type_string = kNetworkTypeNone;
-      break;
-    case kType2G:
-      type_string = kNetworkType2G;
-      break;
-    case kType2_5G:
-      type_string = kNetworkType2_5G;
-      break;
-    case kType3G:
-      type_string = kNetworkType3G;
-      break;
-    case kType4G:
-      type_string = kNetworkType4G;
-      break;
-    case kWifi:
-      type_string = kNetworkTypeWifi;
-      break;
-    case kEthernet:
-      type_string = kNetworkTypeEthernet;
-      break;
-    case kUnknown:
-      type_string = kNetworkTypeUnknown;
-      break;
-    default:
-      LoggerE("Incorrect type: %d", type);
-      return PlatformResult(ErrorCode::TYPE_MISMATCH_ERR, "Incorrect type");
-  }
-  return PlatformResult(ErrorCode::NO_ERROR);
+PlatformResult SysteminfoUtils::UnregisterMemoryListener()
+{
+  return system_info_listeners.UnregisterMemoryListener();
 }
 
-PlatformResult SysteminfoUtils::ReportNetwork(picojson::object& out) {
-  connection_h connection_handle = nullptr;
-  connection_type_e connection_type = CONNECTION_TYPE_DISCONNECTED;
-  int networkType = 0;
-  NetworkType type = kNone;
+PlatformResult SysteminfoUtils::RegisterCameraFlashListener(const SysteminfoUtilsCallback& callback,
+                                                       SysteminfoInstance& instance)
+{
+  return system_info_listeners.RegisterCameraFlashListener(callback, instance);
+}
 
-  //connection must be created in every call, in other case error occurs
-  int error = connection_create(&connection_handle);
-  if (CONNECTION_ERROR_NONE != error) {
-    std::string log_msg = "Cannot create connection: " + std::to_string(error);
-    LoggerE("%s", log_msg.c_str());
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-  }
-  std::unique_ptr<std::remove_pointer<connection_h>::type, int(*)(connection_h)>
-  connection_handle_ptr(connection_handle, &connection_destroy);
-  // automatically release the memory
+PlatformResult SysteminfoUtils::UnregisterCameraFlashListener()
+{
+  return system_info_listeners.UnregisterCameraFlashListener();
+}
 
-  error = connection_get_type(connection_handle, &connection_type);
-  if (CONNECTION_ERROR_NONE != error) {
-    std::string log_msg = "Cannot get connection type: " + std::to_string(error);
-    LoggerE("%s", log_msg.c_str());
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+PlatformResult SysteminfoUtils::GetVconfInt(const char *key, int *value) {
+  if (0 == vconf_get_int(key, value)) {
+    LoggerD("value[%s]: %d", key, *value);
+    return PlatformResult(ErrorCode::NO_ERROR);
   }
+  const std::string error_msg = "Could not get " + std::string(key);
+  LoggerD("%s",error_msg.c_str());
+  return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
+}
 
-  switch (connection_type) {
-    case CONNECTION_TYPE_DISCONNECTED :
-      type = kNone;
-      break;
-    case CONNECTION_TYPE_WIFI :
-      type =  kWifi;
-      break;
-    case CONNECTION_TYPE_CELLULAR :
-      if (vconf_get_int(VCONFKEY_TELEPHONY_SVCTYPE, &networkType) == 0) {
-        if (networkType < VCONFKEY_TELEPHONY_SVCTYPE_2G) {
-          type =  kNone;
-        } else if (networkType == VCONFKEY_TELEPHONY_SVCTYPE_2G) {
-          type =  kType2G;
-        } else if (networkType == VCONFKEY_TELEPHONY_SVCTYPE_2G
-            || networkType == VCONFKEY_TELEPHONY_SVCTYPE_2_5G_EDGE) {
-          type =  kType2_5G;
-        } else if (networkType == VCONFKEY_TELEPHONY_SVCTYPE_3G
-            || networkType == VCONFKEY_TELEPHONY_SVCTYPE_HSDPA) {
-          type =  kType3G;
-        } else if (networkType == VCONFKEY_TELEPHONY_SVCTYPE_LTE) {
-          type =  kType4G;
-        } else {
-          type =  kNone;
-        }
-      }
-      break;
-    case CONNECTION_TYPE_ETHERNET :
-      type =  kEthernet;
-      break;
-    default:
-      LoggerE("Incorrect type: %d", connection_type);
-      return PlatformResult(ErrorCode::UNKNOWN_ERR, "Incorrect type");
-  }
-  std::string type_str = "";
-  PlatformResult ret = GetNetworkTypeString(type, type_str);
-  if(ret.IsError()) {
-    return ret;
+PlatformResult SysteminfoUtils::GetRuntimeInfoString(system_settings_key_e key, std::string* platform_string) {
+  char* platform_c_string;
+  int err = system_settings_get_value_string(key, &platform_c_string);
+  if (SYSTEM_SETTINGS_ERROR_NONE == err) {
+    if (nullptr != platform_c_string) {
+      *platform_string = platform_c_string;
+      free(platform_c_string);
+      return PlatformResult(ErrorCode::NO_ERROR);
+    }
   }
-  out.insert(std::make_pair("networkType", picojson::value(type_str)));
-  return PlatformResult(ErrorCode::NO_ERROR);
+  const std::string error_msg = "Error when retrieving system setting information: "
+      + std::to_string(err);
+  LoggerE("%s", error_msg.c_str());
+  return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
 }
 
-static PlatformResult GetIps(wifi_ap_h wifi_ap_handle, std::string* ip_addr_str,
-                   std::string* ipv6_addr_str){
-  //getting ipv4 address
-  char* ip_addr = nullptr;
-  int error = wifi_ap_get_ip_address(wifi_ap_handle,
-                                     WIFI_ADDRESS_FAMILY_IPV4,
-                                     &ip_addr);
-  if (WIFI_ERROR_NONE != error) {
-    LoggerE("Failed to get ip address: %d", error);
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get ip address");
+PlatformResult SysteminfoUtils::CheckTelephonySupport() {
+  bool supported = false;
+  PlatformResult ret = SystemInfoDeviceCapability::GetValueBool(
+    "tizen.org/feature/network.telephony", &supported);
+  if (ret.IsError()) {
+    return ret;
   }
-  *ip_addr_str = ip_addr;
-  free(ip_addr);
-
-  //getting ipv6 address
-  ip_addr = nullptr;
-  error = wifi_ap_get_ip_address(wifi_ap_handle,
-                                 WIFI_ADDRESS_FAMILY_IPV6,
-                                 &ip_addr);
-  if (WIFI_ERROR_NONE != error) {
-    LoggerE("Failed to get ipv6 address: %d", error);
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get ipv6 address");
+  if (!supported) {
+    LoggerD("Telephony is not supported on this device");
+    return PlatformResult(ErrorCode::NOT_SUPPORTED_ERR,
+        "Telephony is not supported on this device");
   }
-  *ipv6_addr_str = ip_addr;
-  free(ip_addr);
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-PlatformResult SysteminfoUtils::ReportWifiNetwork(picojson::object& out) {
-  LoggerD("Entered");
-
-  bool result_status = false;
-  std::string result_ssid;
-  std::string result_ip_address;
-  std::string result_ipv6_address;
-  std::string result_mac_address;
-  double result_signal_strength = 0;
-
-  // wifi_initialize() must be called in each thread
-  int error = wifi_initialize();
-  if (WIFI_ERROR_NONE != error) {
-    std::string log_msg = "Initialize failed: " + parseWifiNetworkError(error);
-    LoggerE("%s", log_msg.c_str());
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-  } else {
-    LoggerD("WIFI initializatino succeed");
+PlatformResult SysteminfoUtils::CheckCameraFlashSupport() {
+  bool supported = false;
+  PlatformResult ret = SystemInfoDeviceCapability::GetValueBool(
+    "tizen.org/feature/camera.back.flash", &supported);
+  if (ret.IsError()) {
+    return ret;
   }
-  SCOPE_EXIT {
-    wifi_deinitialize();
-  };
-
-  wifi_ap_h wifi_ap_handle = nullptr;
-  error = wifi_get_connected_ap(&wifi_ap_handle);
-  if (WIFI_ERROR_NONE != error) {
-    LoggerD("Error while wifi_get_connnected_ap: %s", parseWifiNetworkError(error).c_str());
-    // in case of no connection, ignore error and leave status as false
-    if (WIFI_ERROR_NO_CONNECTION != error) {
-      std::string log_msg = "Cannot get connected access point handle: " + parseWifiNetworkError(error);
-      LoggerE("%s", log_msg.c_str());
-      return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-    }
-  } else {
-    //if getting connected AP succeed, set status on true
-    result_status = true;
-  }
-
-  if (result_status) {
-    std::unique_ptr<std::remove_pointer<wifi_ap_h>::type, int(*)(wifi_ap_h)>
-    wifi_ap_handle_ptr(wifi_ap_handle, &wifi_ap_destroy);
-    // automatically release the memory
-
-    //gathering mac address
-    char* mac = nullptr;
-    error = wifi_get_mac_address(&mac);
-    if (WIFI_ERROR_NONE == error && nullptr != mac) {
-      SLoggerD("MAC address fetched: %s", mac);
-      result_mac_address = mac;
-      free(mac);
-    } else {
-      std::string log_msg = "Failed to get mac address: " + parseWifiNetworkError(error);
-      LoggerE("%s", log_msg.c_str());
-      return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-    }
-
-    //refreshing access point information
-    error = wifi_ap_refresh(wifi_ap_handle);
-    if (WIFI_ERROR_NONE != error) {
-      std::string log_msg = "Failed to refresh access point information: " + parseWifiNetworkError(error);
-      LoggerE("%s", log_msg.c_str());
-      return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-    }
-
-    //gathering ssid
-    char* essid = nullptr;
-    error = wifi_ap_get_essid(wifi_ap_handle, &essid);
-    if (WIFI_ERROR_NONE == error) {
-      result_ssid = essid;
-      free(essid);
-    } else {
-      std::string log_msg = "Failed to get network ssid: " + parseWifiNetworkError(error);
-      LoggerE("%s", log_msg.c_str());
-      return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-    }
-
-    //gathering ips
-    PlatformResult ret = GetIps(wifi_ap_handle, &result_ip_address, &result_ipv6_address);
-    if (ret.IsError()) {
-      return ret;
-    }
-
-    //gathering strength
-    wifi_rssi_level_e rssi_level = system_info_listeners.GetWifiLevel();
-    // this mean that level was not initialized or wifi not connected
-    if (WIFI_RSSI_LEVEL_0 == rssi_level) {
-      // so try to gather rssi level with dedicated function
-      int rssi = 0;
-      error = wifi_ap_get_rssi(wifi_ap_handle, &rssi);
-      if (WIFI_ERROR_NONE == error) {
-        result_signal_strength = ((double) abs(rssi))/kWifiSignalStrengthDivideValue;
-      } else {
-        std::string log_msg = "Failed to get signal strength: " + parseWifiNetworkError(error);
-        LoggerE("%s", log_msg.c_str());
-        return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-      }
-    } else {
-      result_signal_strength = ((double) rssi_level)/WIFI_RSSI_LEVEL_4;
-    }
+  if (!supported) {
+    LoggerD("Back-facing camera with a flash is not supported on this device");
+    return PlatformResult(ErrorCode::NOT_SUPPORTED_ERR,
+        "Back-facing camera with a flash is not supported on this device");
   }
-  //building result object
-  out.insert(std::make_pair("status", picojson::value(result_status ? kWifiStatusOn : kWifiStatusOff)));
-  out.insert(std::make_pair("ssid", picojson::value(result_ssid)));
-  out.insert(std::make_pair("ipAddress", picojson::value(result_ip_address)));
-  out.insert(std::make_pair("ipv6Address", picojson::value(result_ipv6_address)));
-  out.insert(std::make_pair("macAddress", picojson::value(result_mac_address)));
-  out.insert(std::make_pair("signalStrength", picojson::value(std::to_string(result_signal_strength))));
-
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-PlatformResult SysteminfoUtils::ReportEthernetNetwork(picojson::object& out) {
+PlatformResult SysteminfoUtils::CheckIfEthernetNetworkSupported()
+{
   LoggerD("Entered");
-
-  std::string result_cable;
-  std::string result_status;
-  std::string result_ip_address;
-  std::string result_ipv6_address;
-  std::string result_mac_address;
-
   connection_h connection_handle = nullptr;
   connection_ethernet_state_e connection_state = CONNECTION_ETHERNET_STATE_DEACTIVATED;
-  connection_type_e connection_type = CONNECTION_TYPE_DISCONNECTED;
-  connection_profile_h profile_handle = nullptr;
 
-  // connection must be created in every call, in other case error occurs
   int error = connection_create(&connection_handle);
   if (CONNECTION_ERROR_NONE != error) {
     std::string log_msg = "Cannot create connection: " + std::to_string(error);
@@ -2292,620 +1518,50 @@ PlatformResult SysteminfoUtils::ReportEthernetNetwork(picojson::object& out) {
     return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
   }
   std::unique_ptr<std::remove_pointer<connection_h>::type, int (*)(connection_h)> connection_handle_ptr(
-      connection_handle, &connection_destroy);  // automatically release the memory
+    connection_handle, &connection_destroy);  // automatically release the memory
 
   error = connection_get_ethernet_state(connection_handle, &connection_state);
-  if (CONNECTION_ERROR_NONE != error) {
-    if (CONNECTION_ERROR_NOT_SUPPORTED == error) {
-      std::string log_msg = "Cannot get ethernet connection state: Not supported";
-      LoggerE("%s", log_msg.c_str());
-      return PlatformResult(ErrorCode::NOT_SUPPORTED_ERR, log_msg);
-    }
-    std::string log_msg = "Cannot get ethernet connection state: " + std::to_string(error);
-    LoggerE("%s", log_msg.c_str());
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-  }
-
-  switch (connection_state) {
-    case CONNECTION_ETHERNET_STATE_DEACTIVATED:
-      result_status = "DEACTIVATED";
-      break;
-
-    case CONNECTION_ETHERNET_STATE_DISCONNECTED:
-      result_status = "DISCONNECTED";
-      break;
-
-    case CONNECTION_ETHERNET_STATE_CONNECTED:
-      result_status = "CONNECTED";
-      break;
-
-    default:
-      result_status = "UNKNOWN";
-      break;
-  }
-
-  connection_ethernet_cable_state_e cable_state = CONNECTION_ETHERNET_CABLE_DETACHED;
-  error = connection_get_ethernet_cable_state(connection_handle, &cable_state);
-  if (CONNECTION_ERROR_NONE != error) {
-    std::string log_msg = "Cannot get ethernet cable state: " + std::to_string(error);
-    LoggerE("%s", log_msg.c_str());
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-  }
-
-  switch (cable_state) {
-    case CONNECTION_ETHERNET_CABLE_DETACHED:
-      result_cable = "DETACHED";
-      break;
-
-    case CONNECTION_ETHERNET_CABLE_ATTACHED:
-      result_cable = "ATTACHED";
-      break;
-
-    default:
-      result_cable = "UNKNOWN";
-      break;
-  }
-
-  char* mac = nullptr;
-  error = connection_get_mac_address(connection_handle, CONNECTION_TYPE_ETHERNET, &mac);
-  if (CONNECTION_ERROR_NONE == error && nullptr != mac) {
-    SLoggerD("MAC address fetched: %s", mac);
-    result_mac_address = mac;
-    free(mac);
-  } else {
-    std::string log_msg = "Failed to get mac address: " + std::to_string(error);
-    LoggerE("%s", log_msg.c_str());
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-  }
-
-  error = connection_get_type(connection_handle, &connection_type);
-  if (CONNECTION_ERROR_NONE != error) {
-    std::string log_msg = "Cannot get connection type: " + std::to_string(error);
+  if (CONNECTION_ERROR_NOT_SUPPORTED == error) {
+    std::string log_msg = "Cannot get ethernet connection state: Not supported";
     LoggerE("%s", log_msg.c_str());
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-  }
-
-  if (CONNECTION_TYPE_ETHERNET == connection_type) {
-    //gathering profile
-    error = connection_get_current_profile(connection_handle, &profile_handle);
-    if (CONNECTION_ERROR_NONE != error) {
-      std::string log_msg = "Cannot get connection profile: " + std::to_string(error);
-      LoggerE("%s", log_msg.c_str());
-      return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-    }
-    std::unique_ptr<std::remove_pointer<connection_profile_h>::type,
-        int (*)(connection_profile_h)> profile_handle_ptr(
-        profile_handle, &connection_profile_destroy); // automatically release the memory
-
-    //gathering ips
-    PlatformResult ret = GetIps(profile_handle, &result_ip_address, &result_ipv6_address);
-    if (ret.IsError()) {
-      return ret;
-    }
-  } else {
-    LoggerD("Connection type = %d. ETHERNET is disabled", connection_type);
+    return PlatformResult(ErrorCode::NOT_SUPPORTED_ERR, log_msg);
   }
-
-  out.insert(std::make_pair("cable", picojson::value(result_cable)));
-  out.insert(std::make_pair("status", picojson::value(result_status)));
-  out.insert(std::make_pair("ipAddress", picojson::value(result_ip_address)));
-  out.insert(std::make_pair("ipv6Address", picojson::value(result_ipv6_address)));
-  out.insert(std::make_pair("macAddress", picojson::value(result_mac_address)));
-
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-static PlatformResult FetchBasicSimProperties(TapiHandle *tapi_handle,
-    unsigned short *result_mcc,
-    unsigned short *result_mnc,
-    unsigned short *result_cell_id,
-    unsigned short *result_lac,
-    bool *result_is_roaming,
-    bool *result_is_flight_mode)
+PlatformResult SysteminfoUtils::GetTotalMemory(long long* result)
 {
   LoggerD("Entered");
-  int result_value = 0;
-  int tapi_res = TAPI_API_SUCCESS;
-  tapi_res = tel_get_property_int(tapi_handle, TAPI_PROP_NETWORK_PLMN, &result_value);
-  if (TAPI_API_SUCCESS != tapi_res) {
-    std::string error_msg = "Cannot get mcc value, error: " + std::to_string(tapi_res);
-    LoggerE("%s", error_msg.c_str());
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
-  }
-  *result_mcc = static_cast<unsigned short>(result_value) / kMccDivider;
-  *result_mnc = static_cast<unsigned short>(result_value) % kMccDivider;
-
-  tapi_res = tel_get_property_int(tapi_handle, TAPI_PROP_NETWORK_CELLID, &result_value);
-  if (TAPI_API_SUCCESS != tapi_res) {
-    std::string error_msg = "Cannot get cell_id value, error: " + std::to_string(tapi_res);
-    LoggerE("%s", error_msg.c_str());
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
-  }
-  *result_cell_id = static_cast<unsigned short>(result_value);
-
-  tapi_res = tel_get_property_int(tapi_handle, TAPI_PROP_NETWORK_LAC, &result_value);
-  if (TAPI_API_SUCCESS != tapi_res) {
-    std::string error_msg = "Cannot get lac value, error: " + std::to_string(tapi_res);
-    LoggerE("%s", error_msg.c_str());
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
-  }
-  *result_lac = static_cast<unsigned short>(result_value);
-
-  tapi_res = tel_get_property_int(tapi_handle, TAPI_PROP_NETWORK_ROAMING_STATUS, &result_value);
-  if (TAPI_API_SUCCESS != tapi_res) {
-    std::string error_msg = "Cannot get is_roaming value, error: " + std::to_string(tapi_res);
-    LoggerE("%s", error_msg.c_str());
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
-  }
-  *result_is_roaming = (0 != result_value) ? true : false;
-
-  if (0 != vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &result_value)) {
-    LoggerE("Cannot get is_flight_mode value");
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get is_flight_mode value");
-  }
-  *result_is_flight_mode = (0 != result_value) ? true : false;
-  return PlatformResult(ErrorCode::NO_ERROR);
-}
 
-static PlatformResult FetchConnection(TapiHandle *tapi_handle, std::string* result_status,
-                            std::string* result_apn, std::string* result_ip_address,
-                            std::string* result_ipv6_address, std::string* result_imei)
-{
-  LoggerD("Entered");
-  connection_type_e connection_type = CONNECTION_TYPE_DISCONNECTED;
-  connection_profile_h profile_handle = nullptr;
-  connection_h connection_handle = nullptr;
+  unsigned int value = 0;
 
-  //connection must be created in every call, in other case error occurs
-  int error = connection_create(&connection_handle);
-  if (CONNECTION_ERROR_NONE != error) {
-    std::string log_msg = "Cannot create connection: " + std::to_string(error);
+  int ret = device_memory_get_total(&value);
+  if (ret != DEVICE_ERROR_NONE) {
+    std::string log_msg = "Failed to get total memory: " + std::to_string(ret);
     LoggerE("%s", log_msg.c_str());
     return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
   }
-  std::unique_ptr<std::remove_pointer<connection_h>::type, int(*)(connection_h)>
-  connection_handle_ptr(connection_handle, &connection_destroy);
-  // automatically release the memory
-
-  error = connection_get_type(connection_handle, &connection_type);
-  if (CONNECTION_ERROR_NONE != error) {
-    LoggerE("Failed to get connection type: %d", error);
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get connection type");
-  }
-
-  char* apn = nullptr;
-  if (CONNECTION_TYPE_CELLULAR == connection_type) {
-    *result_status = kConnectionOn;
-
-    error = connection_get_current_profile(connection_handle,
-                                           &profile_handle);
-    std::unique_ptr
-    <std::remove_pointer<connection_profile_h>::type, int(*)(connection_profile_h)>
-    profile_handle_ptr(profile_handle, &connection_profile_destroy);
-    // automatically release the memory
-    if (CONNECTION_ERROR_NONE != error) {
-      LoggerE("Failed to get profile: %d", error);
-      return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get profile");
-    }
-
-    error = connection_profile_get_cellular_apn(profile_handle, &apn);
-    if (CONNECTION_ERROR_NONE != error) {
-      LoggerE("Failed to get apn name: %d", error);
-      return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get apn name");
-    }
-    *result_apn = apn;
-    free(apn);
-
-    PlatformResult ret = GetIps(profile_handle, result_ip_address, result_ipv6_address);
-    if (ret.IsError()) {
-      return ret;
-    }
-  } else {
-    *result_status = kConnectionOff;
-
-    //According to previous implementation in case of error
-    //don't throw exception here
-    error = connection_get_default_cellular_service_profile(
-        connection_handle,
-        CONNECTION_CELLULAR_SERVICE_TYPE_INTERNET,
-        &profile_handle);
-    std::unique_ptr
-    <std::remove_pointer<connection_profile_h>::type, int(*)(connection_profile_h)>
-    profile_handle_ptr(profile_handle, &connection_profile_destroy);
-    // automatically release the memory
-    if (CONNECTION_ERROR_NONE == error) {
-      error = connection_profile_get_cellular_apn(profile_handle, &apn);
-      if (CONNECTION_ERROR_NONE == error) {
-        *result_apn = apn;
-        free(apn);
-      } else {
-        LoggerE("Failed to get default apn name: %d. Failing silently",
-             error);
-      }
-    } else {
-      LoggerE("Failed to get default profile: %d. Failing silently",
-           error);
-    }
-  }
 
-  char* imei = nullptr;
-  imei = tel_get_misc_me_imei_sync(tapi_handle);
-  if (nullptr != imei) {
-    *result_imei = imei;
-    free(imei);
-  } else {
-    LoggerE("Failed to get imei, nullptr pointer. Setting empty value.");
-    *result_imei = "";
-  }
+  *result = static_cast<long long>(value*MEMORY_TO_BYTE);
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-PlatformResult SysteminfoUtils::ReportCellularNetwork(picojson::object& out, unsigned long count) {
-  PlatformResult ret = CheckTelephonySupport();
-  if (ret.IsError()) {
-    return ret;
-  }
-  std::string result_status;
-  std::string result_apn;
-  std::string result_ip_address;
-  std::string result_ipv6_address;
-  unsigned short result_mcc;
-  unsigned short result_mnc;
-  unsigned short result_cell_id;
-  unsigned short result_lac;
-  bool result_is_roaming;
-  bool result_is_flight_mode;
-  std::string result_imei;
-
-  //gathering vconf-based values
-  ret = FetchBasicSimProperties(system_info_listeners.GetTapiHandles()[count], &result_mcc,
-                           &result_mnc, &result_cell_id, &result_lac,
-                           &result_is_roaming, &result_is_flight_mode);
-  if (ret.IsError()) {
-    return ret;
-  }
-  //gathering connection informations
-  ret = FetchConnection(system_info_listeners.GetTapiHandles()[count],
-                  &result_status, &result_apn, &result_ip_address, &result_ipv6_address, &result_imei);
-  if (ret.IsError()) {
-    return ret;
-  }
-
-  out.insert(std::make_pair("status", picojson::value(result_status)));
-  out.insert(std::make_pair("apn", picojson::value(result_apn)));
-  out.insert(std::make_pair("ipAddress", picojson::value(result_ip_address)));
-  out.insert(std::make_pair("ipv6Address", picojson::value(result_ipv6_address)));
-  out.insert(std::make_pair("mcc", picojson::value(std::to_string(result_mcc))));
-  out.insert(std::make_pair("mnc", picojson::value(std::to_string(result_mnc))));
-  out.insert(std::make_pair("cellId", picojson::value(std::to_string(result_cell_id))));
-  out.insert(std::make_pair("lac", picojson::value(std::to_string(result_lac))));
-  out.insert(std::make_pair("isRoaming", picojson::value(result_is_roaming)));
-  out.insert(std::make_pair("isFligthMode", picojson::value(result_is_flight_mode)));
-  out.insert(std::make_pair("imei", picojson::value(result_imei)));
-  return PlatformResult(ErrorCode::NO_ERROR);
-}
-
-void SimCphsValueCallback(TapiHandle */*handle*/, int result, void *data, void */*user_data*/)
-{
-  LoggerD("Entered");
-  TelSimAccessResult_t access_rt = static_cast<TelSimAccessResult_t>(result);
-  TelSimCphsNetName_t *cphs_info = static_cast<TelSimCphsNetName_t*>(data);
-
-  std::string result_operator;
-  if (TAPI_SIM_ACCESS_SUCCESS == access_rt) {
-    std::stringstream s;
-    s << cphs_info->full_name;
-    if (s.str().empty()) {
-      s << cphs_info->short_name;
-    }
-    result_operator = s.str();
-  } else {
-    LoggerW("Failed to retrieve cphs_info: %d", access_rt);
-  }
-  sim_mgr.set_operator_name(result_operator);
-  sim_mgr.TryReturn();
-}
-
-void SimMsisdnValueCallback(TapiHandle */*handle*/, int result, void *data, void */*user_data*/)
-{
-  LoggerD("Entered");
-  TelSimAccessResult_t access_rt = static_cast<TelSimAccessResult_t>(result);
-  TelSimMsisdnList_t *msisdn_info = static_cast<TelSimMsisdnList_t*>(data);
-
-  std::string result_msisdn;
-  if (TAPI_SIM_ACCESS_SUCCESS == access_rt) {
-    if (msisdn_info->count > 0) {
-      if (strlen(msisdn_info->list[0].num) > 0) {
-        result_msisdn = msisdn_info->list[0].num;
-      } else {
-        LoggerW("MSISDN number empty");
-      }
-    } else {
-      LoggerW("msisdn_info list empty");
-    }
-  } else {
-    LoggerW("Failed to retrieve msisdn_: %d", access_rt);
-  }
-
-  sim_mgr.set_msisdn(result_msisdn);
-  sim_mgr.TryReturn();
-}
-
-void SimSpnValueCallback(TapiHandle */*handle*/, int result, void *data, void */*user_data*/)
+PlatformResult SysteminfoUtils::GetAvailableMemory(long long* result)
 {
   LoggerD("Entered");
-  TelSimAccessResult_t access_rt = static_cast<TelSimAccessResult_t>(result);
-  TelSimSpn_t *spn_info = static_cast<TelSimSpn_t*>(data);
-
-  std::string result_spn;
-  if (TAPI_SIM_ACCESS_SUCCESS == access_rt) {
-    result_spn = (char *)spn_info->spn;
-  } else {
-    LoggerW("Failed to retrieve spn_: %d", access_rt);
-  }
-
-  sim_mgr.set_spn(result_spn);
-  sim_mgr.TryReturn();
-}
-
-PlatformResult SysteminfoUtils::ReportSim(picojson::object& out, unsigned long count) {
-  PlatformResult ret = CheckTelephonySupport();
-  if (ret.IsError()) {
-    return ret;
-  }
-  return sim_mgr.GatherSimInformation(
-      system_info_listeners.GetTapiHandles()[count], &out);
-}
-
-PlatformResult SysteminfoUtils::ReportPeripheral(picojson::object& out) {
-
-/*  int wireless_display_status = 0;
-  PlatformResult ret = GetVconfInt(VCONFKEY_MIRACAST_WFD_SOURCE_STATUS, wireless_display_status);
-  if (ret.IsSuccess()) {
-    if (VCONFKEY_MIRACAST_WFD_SOURCE_ON == wireless_display_status) {
-      out.insert(std::make_pair(kVideoOutputString, picojson::value(true)));
-      return PlatformResult(ErrorCode::NO_ERROR);
-    }
-  }*/
-  int hdmi_status = 0;
-  PlatformResult ret = GetVconfInt(VCONFKEY_SYSMAN_HDMI, hdmi_status);
-  if (ret.IsSuccess()) {
-    if (VCONFKEY_SYSMAN_HDMI_CONNECTED == hdmi_status) {
-      out.insert(std::make_pair(kVideoOutputString, picojson::value(true)));
-      return PlatformResult(ErrorCode::NO_ERROR);
-    }
-  }
-
-  out.insert(std::make_pair(kVideoOutputString, picojson::value(false)));
-  return PlatformResult(ErrorCode::NO_ERROR);
-}
-
-PlatformResult SysteminfoUtils::ReportMemory(picojson::object& out) {
-  std::string state = MEMORY_STATE_NORMAL;
-  int status = 0;
-  PlatformResult ret = GetVconfInt(VCONFKEY_SYSMAN_LOW_MEMORY, status);
-  if (ret.IsSuccess()) {
-    switch (status) {
-      case VCONFKEY_SYSMAN_LOW_MEMORY_SOFT_WARNING:
-      case VCONFKEY_SYSMAN_LOW_MEMORY_HARD_WARNING:
-        state = MEMORY_STATE_WARNING;
-        break;
-      case VCONFKEY_SYSMAN_LOW_MEMORY_NORMAL:
-      default:
-        state = MEMORY_STATE_NORMAL;
-    }
-  }
-
-  out.insert(std::make_pair("state", picojson::value(state)));
-  return PlatformResult(ErrorCode::NO_ERROR);
-}
-
-static void CreateStorageInfo(const std::string& type, struct statfs& fs, picojson::object* out) {
-  out->insert(std::make_pair("type", picojson::value(type)));
-  out->insert(std::make_pair("capacity", picojson::value(std::to_string(
-      static_cast<unsigned long long>(fs.f_bsize) *
-      static_cast<unsigned long long>(fs.f_blocks)))));
-  out->insert(std::make_pair("availableCapacity", picojson::value(std::to_string(
-      static_cast<unsigned long long>(fs.f_bsize) *
-      static_cast<unsigned long long>(fs.f_bavail)))));
-  bool isRemovable = (type == kTypeInternal) ? false : true;
-  out->insert(std::make_pair("isRemovable", picojson::value(isRemovable)));
-}
-
-PlatformResult SysteminfoUtils::ReportStorage(picojson::object& out) {
-  int sdcardState = 0;
-  struct statfs fs;
-
-  picojson::value result = picojson::value(picojson::array());
-
-  picojson::array& array = result.get<picojson::array>();
-  array.push_back(picojson::value(picojson::object()));
-  picojson::object& internal_obj = array.back().get<picojson::object>();
-
-  if (statfs(kStorageInternalPath, &fs) < 0) {
-    LoggerE("There are no storage units detected");
-    return PlatformResult(ErrorCode::UNKNOWN_ERR, "There are no storage units detected");
-  }
-  CreateStorageInfo(kTypeInternal, fs, &internal_obj);
-  system_info_listeners.SetAvailableCapacityInternal(fs.f_bavail);
 
-  if (0 == vconf_get_int(VCONFKEY_SYSMAN_MMC_STATUS, &sdcardState)) {
-    if (VCONFKEY_SYSMAN_MMC_MOUNTED == sdcardState){
-      if (statfs(kStorageSdcardPath, &fs) < 0) {
-        LoggerE("MMC mounted, but not accessible");
-        return PlatformResult(ErrorCode::UNKNOWN_ERR, "MMC mounted, but not accessible");
-      }
-      array.push_back(picojson::value(picojson::object()));
-      picojson::object& external_obj = array.back().get<picojson::object>();
-      CreateStorageInfo(kTypeMmc, fs, &external_obj);
-      system_info_listeners.SetAvailableCapacityMmc(fs.f_bavail);
-    }
-  }
-
-  out.insert(std::make_pair("storages", picojson::value(result)));
-  return PlatformResult(ErrorCode::NO_ERROR);
-}
-PlatformResult SysteminfoUtils::ReportCameraFlash(picojson::object& out,
-                                                  unsigned long index) {
+  unsigned int value = 0;
 
-  if (index < system_info_listeners.GetCameraTypesCount()) {
-    std::string camera = system_info_listeners.GetCameraTypes(index);
-    out.insert(std::make_pair("camera", picojson::value(camera)));
-  } else {
-    return PlatformResult(
-        ErrorCode::NOT_SUPPORTED_ERR,
-        "Camera is not supported on this device");
+  int ret = device_memory_get_available(&value);
+  if (ret != DEVICE_ERROR_NONE) {
+    std::string log_msg = "Failed to get total memory: " + std::to_string(ret);
+    LoggerE("%s", log_msg.c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
   }
 
+  *result = static_cast<long long>(value*MEMORY_TO_BYTE);
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-PlatformResult SysteminfoUtils::RegisterBatteryListener(const SysteminfoUtilsCallback& callback,
-                                                        SysteminfoInstance& instance)
-{
-  return system_info_listeners.RegisterBatteryListener(callback, instance);
-}
-
-PlatformResult SysteminfoUtils::UnregisterBatteryListener()
-{
-  return system_info_listeners.UnregisterBatteryListener();
-}
-
-
-PlatformResult SysteminfoUtils::RegisterCpuListener(const SysteminfoUtilsCallback& callback,
-                                                    SysteminfoInstance& instance)
-{
-  return system_info_listeners.RegisterCpuListener(callback, instance);
-}
-
-PlatformResult SysteminfoUtils::UnregisterCpuListener()
-{
-  return system_info_listeners.UnregisterCpuListener();
-}
-
-
-PlatformResult SysteminfoUtils::RegisterStorageListener(const SysteminfoUtilsCallback& callback,
-                                                        SysteminfoInstance& instance)
-{
-  return system_info_listeners.RegisterStorageListener(callback, instance);
-}
-
-PlatformResult SysteminfoUtils::UnregisterStorageListener()
-{
-  return system_info_listeners.UnregisterStorageListener();
-}
-
-PlatformResult SysteminfoUtils::RegisterDisplayListener(const SysteminfoUtilsCallback& callback,
-                                                        SysteminfoInstance& instance)
-{
-  return system_info_listeners.RegisterDisplayListener(callback, instance);
-}
-
-PlatformResult SysteminfoUtils::UnregisterDisplayListener()
-{
-  return system_info_listeners.UnregisterDisplayListener();
-}
-
-PlatformResult SysteminfoUtils::RegisterDeviceOrientationListener(const SysteminfoUtilsCallback& callback,
-                                                                  SysteminfoInstance& instance)
-{
-  return system_info_listeners.RegisterDeviceOrientationListener(callback, instance);
-}
-
-PlatformResult SysteminfoUtils::UnregisterDeviceOrientationListener()
-{
-  return system_info_listeners.UnregisterDeviceOrientationListener();
-}
-
-PlatformResult SysteminfoUtils::RegisterLocaleListener(const SysteminfoUtilsCallback& callback,
-                                                       SysteminfoInstance& instance)
-{
-  return system_info_listeners.RegisterLocaleListener(callback, instance);
-}
-
-PlatformResult SysteminfoUtils::UnregisterLocaleListener()
-{
-  return system_info_listeners.UnregisterLocaleListener();
-}
-
-PlatformResult SysteminfoUtils::RegisterNetworkListener(const SysteminfoUtilsCallback& callback,
-                                                        SysteminfoInstance& instance)
-{
-  return system_info_listeners.RegisterNetworkListener(callback, instance);
-}
-
-PlatformResult SysteminfoUtils::UnregisterNetworkListener()
-{
-  return system_info_listeners.UnregisterNetworkListener();
-}
-
-PlatformResult SysteminfoUtils::RegisterWifiNetworkListener(const SysteminfoUtilsCallback& callback,
-                                                            SysteminfoInstance& instance)
-{
-  return system_info_listeners.RegisterWifiNetworkListener(callback, instance);
-}
-
-PlatformResult SysteminfoUtils::UnregisterWifiNetworkListener()
-{
-  return system_info_listeners.UnregisterWifiNetworkListener();
-}
-
-PlatformResult SysteminfoUtils::RegisterEthernetNetworkListener(const SysteminfoUtilsCallback& callback,
-                                                                SysteminfoInstance& instance)
-{
-  LoggerD("Entered");
-  return system_info_listeners.RegisterEthernetNetworkListener(callback, instance);
-}
-
-PlatformResult SysteminfoUtils::UnregisterEthernetNetworkListener()
-{
-  LoggerD("Entered");
-  return system_info_listeners.UnregisterEthernetNetworkListener();
-}
-
-PlatformResult SysteminfoUtils::RegisterCellularNetworkListener(const SysteminfoUtilsCallback& callback,
-                                                                SysteminfoInstance& instance)
-{
-  return system_info_listeners.RegisterCellularNetworkListener(callback, instance);
-}
-
-PlatformResult SysteminfoUtils::UnregisterCellularNetworkListener()
-{
-  return system_info_listeners.UnregisterCellularNetworkListener();
-}
-
-PlatformResult SysteminfoUtils::RegisterPeripheralListener(const SysteminfoUtilsCallback& callback,
-                                                           SysteminfoInstance& instance)
-{
-  return system_info_listeners.RegisterPeripheralListener(callback, instance);
-}
-
-PlatformResult SysteminfoUtils::UnregisterPeripheralListener()
-{
-  return system_info_listeners.UnregisterPeripheralListener();
-}
-
-PlatformResult SysteminfoUtils::RegisterMemoryListener(const SysteminfoUtilsCallback& callback,
-                                                       SysteminfoInstance& instance)
-{
-  return system_info_listeners.RegisterMemoryListener(callback, instance);
-}
-
-PlatformResult SysteminfoUtils::UnregisterMemoryListener()
-{
-  return system_info_listeners.UnregisterMemoryListener();
-}
-
-PlatformResult SysteminfoUtils::RegisterCameraFlashListener(const SysteminfoUtilsCallback& callback,
-                                                       SysteminfoInstance& instance)
-{
-  return system_info_listeners.RegisterCameraFlashListener(callback, instance);
-}
-
-PlatformResult SysteminfoUtils::UnregisterCameraFlashListener()
-{
-  return system_info_listeners.UnregisterCameraFlashListener();
-}
-
 } // namespace systeminfo
 } // namespace webapi
index 19060b8f2186ca0224c1066eebcaa83088ec6bb9..2f7a034dbd7587cd75de5ac6f8c095afbd4b5c5b 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <string>
 #include <functional>
+#include <system_settings.h>
 #include "common/picojson.h"
 #include "common/platform_result.h"
 #include "systeminfo/systeminfo_device_capability.h"
@@ -40,11 +41,14 @@ typedef std::function<void(SysteminfoInstance& instance)> SysteminfoUtilsCallbac
 
 class SysteminfoUtils {
  public:
-  static common::PlatformResult GetTotalMemory(long long& result);
-  static common::PlatformResult GetAvailableMemory(long long& result);
-  static common::PlatformResult GetCount(const std::string& property, unsigned long& ret);
-  static common::PlatformResult GetPropertyValue(
-      const std::string& prop, bool is_array_type, picojson::value& res);
+  static common::PlatformResult GetVconfInt(const char *key, int *value);
+  static common::PlatformResult GetRuntimeInfoString(system_settings_key_e key,
+                                                     std::string* platform_string);
+  static common::PlatformResult CheckTelephonySupport();
+  static common::PlatformResult CheckCameraFlashSupport();
+  static common::PlatformResult CheckIfEthernetNetworkSupported();
+  static common::PlatformResult GetTotalMemory(long long* result);
+  static common::PlatformResult GetAvailableMemory(long long* result);
 
   static common::PlatformResult RegisterBatteryListener(const SysteminfoUtilsCallback& callback,
                                                         SysteminfoInstance& instance);
@@ -87,26 +91,6 @@ class SysteminfoUtils {
   static common::PlatformResult UnregisterCameraFlashListener();
 
  private:
-  static common::PlatformResult ReportProperty(const std::string& property, int index,
-                                               picojson::object& res_obj);
-  static common::PlatformResult ReportBattery(picojson::object& out);
-  static common::PlatformResult ReportCpu(picojson::object& out);
-
-  static common::PlatformResult ReportDisplay(picojson::object& out);
-  static common::PlatformResult ReportDeviceOrientation(picojson::object& out);
-
-  static common::PlatformResult ReportBuild(picojson::object& out);
-  static common::PlatformResult ReportLocale(picojson::object& out);
-  static common::PlatformResult ReportNetwork(picojson::object& out);
-  static common::PlatformResult ReportWifiNetwork(picojson::object& out);
-  static common::PlatformResult ReportEthernetNetwork(picojson::object& out);
-  static common::PlatformResult ReportCellularNetwork(picojson::object& out, unsigned long count);
-  static common::PlatformResult ReportSim(picojson::object& out, unsigned long count);
-  static common::PlatformResult ReportPeripheral(picojson::object& out);
-  static common::PlatformResult ReportMemory(picojson::object& out);
-  static common::PlatformResult ReportCameraFlash(picojson::object& out, unsigned long count);
-
-  static common::PlatformResult ReportStorage(picojson::object& out);
 };
 
 typedef unsigned char byte;
index a4ffa45d4b8f4562b7f56cf68b49d4c6aa22ff11..0180fc704d5197bd17835c2804504632e42d238f 100644 (file)
@@ -23,6 +23,8 @@
         'systeminfo_device_capability.h',
         'systeminfo_properties_manager.cc',
         'systeminfo_properties_manager.h',
+        'systeminfo_sim_details_manager.cc',
+        'systeminfo_sim_details_manager.h',
       ],
       'includes': [
         '../common/pkg-config.gypi',
index b5a7a62a664597fc48ca77b7d3e4fd2bb8595bc7..f6541e1f32f3612fa0e8d3edad56b27fea7eb07c 100644 (file)
@@ -31,8 +31,9 @@
 namespace extension {
 namespace systeminfo {
 
-using namespace common;
-using namespace extension::systeminfo;
+using common::PlatformResult;
+using common::ErrorCode;
+using common::TypeMismatchException;
 
 //Callback functions declarations
 static void OnBatteryChangedCallback(SysteminfoInstance& instance);
@@ -178,33 +179,7 @@ void SysteminfoInstance::GetPropertyValue(const picojson::value& args, picojson:
 
 void SysteminfoInstance::GetPropertyValueArray(const picojson::value& args, picojson::object& out) {
   LoggerD("Enter");
-  CHECK_EXIST(args, "callbackId", out)
-  CHECK_EXIST(args, "property", out)
-  const double callback_id = args.get("callbackId").get<double>();
-  const std::string& prop_id = args.get("property").get<std::string>();
-  LoggerD("Getting property arrray with id: %s ", prop_id.c_str());
-
-  auto get = [this, prop_id, callback_id](const std::shared_ptr<picojson::value>& response) -> void {
-    LoggerD("Getting");
-    picojson::value result = picojson::value(picojson::object());
-    PlatformResult ret = SysteminfoUtils::GetPropertyValue(prop_id, true, result);
-    if (ret.IsError()) {
-      LoggerE("Failed: GetPropertyValue()");
-      ReportError(ret,&(response->get<picojson::object>()));
-      return;
-    }
-    ReportSuccess(result, response->get<picojson::object>());
-  };
-
-  auto get_response = [this, callback_id](const std::shared_ptr<picojson::value>& response) -> void {
-    LoggerD("Getting response");
-    picojson::object& obj = response->get<picojson::object>();
-    obj.insert(std::make_pair("callbackId", picojson::value(callback_id)));
-    Instance::PostMessage(this, response->serialize().c_str());
-  };
-
-  TaskQueue::GetInstance().Queue<picojson::value>
-  (get, get_response, std::shared_ptr<picojson::value>(new picojson::value(picojson::object())));
+  manager_.GetPropertyValueArray(args, &out);
 }
 
 void SysteminfoInstance::AddPropertyValueChangeListener(const picojson::value& args, picojson::object& out) {
@@ -261,66 +236,6 @@ void SysteminfoInstance::AddPropertyValueChangeListener(const picojson::value& a
   ReportError(ret, &out);
 }
 
-void SysteminfoInstance::GetTotalMemory(const picojson::value& args, picojson::object& out) {
-  LoggerD("Enter");
-  picojson::value result = picojson::value(picojson::object());
-  picojson::object& result_obj = result.get<picojson::object>();
-
-  long long return_value = 0;
-  PlatformResult ret = SysteminfoUtils::GetTotalMemory(return_value);
-  if (ret.IsError()) {
-    LoggerD("Error");
-    ReportError(ret, &out);
-    return;
-  }
-  result_obj.insert(std::make_pair("totalMemory",
-                                   picojson::value(static_cast<double>(return_value))));
-
-  ReportSuccess(result, out);
-  LoggerD("Success");
-}
-
-void SysteminfoInstance::GetAvailableMemory(const picojson::value& args, picojson::object& out) {
-  LoggerD("Enter");
-  picojson::value result = picojson::value(picojson::object());
-  picojson::object& result_obj = result.get<picojson::object>();
-
-  long long return_value = 0;
-  PlatformResult ret = SysteminfoUtils::GetAvailableMemory(return_value);
-  if (ret.IsError()) {
-    LoggerD("Error");
-    ReportError(ret, &out);
-    return;
-  }
-  result_obj.insert(std::make_pair("availableMemory",
-                                   picojson::value(static_cast<double>(return_value))));
-
-  ReportSuccess(result, out);
-  LoggerD("Success");
-}
-
-void SysteminfoInstance::GetCount(const picojson::value& args, picojson::object& out) {
-
-  LoggerD("Enter");
-  CHECK_EXIST(args, "property", out)
-  const std::string& property = args.get("property").get<std::string>();
-  LoggerD("Getting count of property with id: %s ", property.c_str());
-
-  picojson::value result = picojson::value(picojson::object());
-  picojson::object& result_obj = result.get<picojson::object>();
-  unsigned long count = 0;
-  PlatformResult ret = SysteminfoUtils::GetCount(property, count);
-  if (ret.IsError()) {
-    LoggerE("Failed: GetCount()");
-    ReportError(ret, &out);
-    return;
-  }
-  result_obj.insert(std::make_pair("count", picojson::value(static_cast<double>(count))));
-
-  ReportSuccess(result, out);
-  LoggerD("Success");
-}
-
 void SysteminfoInstance::RemovePropertyValueChangeListener(const picojson::value& args, picojson::object& out) {
   LoggerD("Enter");
 
@@ -375,9 +290,20 @@ void SysteminfoInstance::RemovePropertyValueChangeListener(const picojson::value
   ReportError(ret, &out);
 }
 
-static void ReportSuccess(const picojson::value& result, picojson::object& out) {
-  out.insert(std::make_pair("status", picojson::value("success")));
-  out.insert(std::make_pair("result",  picojson::value(result)));
+void SysteminfoInstance::GetTotalMemory(const picojson::value& args, picojson::object& out) {
+  LoggerD("Enter");
+  manager_.GetTotalMemory(args, &out);
+}
+
+void SysteminfoInstance::GetAvailableMemory(const picojson::value& args, picojson::object& out) {
+  LoggerD("Enter");
+  manager_.GetAvailableMemory(args, &out);
+}
+
+void SysteminfoInstance::GetCount(const picojson::value& args, picojson::object& out) {
+
+  LoggerD("Enter");
+  manager_.GetCount(args, &out);
 }
 
 void SysteminfoInstance::SetBrightness(const picojson::value& args, picojson::object& out) {
@@ -437,11 +363,11 @@ void OnBatteryChangedCallback(SysteminfoInstance& instance)
   response->get<picojson::object>()[kListenerIdString] = picojson::value(kListenerConstValue);
 
   picojson::value result = picojson::value(picojson::object());
-  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdBattery, true, result);
-  if (ret.IsSuccess()) {
-    ReportSuccess(result,response->get<picojson::object>());
-    Instance::PostMessage(&instance, response->serialize().c_str());
-  }
+//  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdBattery, true, result);
+//  if (ret.IsSuccess()) {
+//    ReportSuccess(result,response->get<picojson::object>());
+//    Instance::PostMessage(&instance, response->serialize().c_str());
+//  }
 }
 
 void OnCpuChangedCallback(SysteminfoInstance& instance)
@@ -453,11 +379,11 @@ void OnCpuChangedCallback(SysteminfoInstance& instance)
   response->get<picojson::object>()[kListenerIdString] = picojson::value(kListenerConstValue);
 
   picojson::value result = picojson::value(picojson::object());
-  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdCpu, true, result);
-  if (ret.IsSuccess()) {
-    ReportSuccess(result,response->get<picojson::object>());
-    Instance::PostMessage(&instance, response->serialize().c_str());
-  }
+//  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdCpu, true, result);
+//  if (ret.IsSuccess()) {
+//    ReportSuccess(result,response->get<picojson::object>());
+//    Instance::PostMessage(&instance, response->serialize().c_str());
+//  }
 }
 
 void OnStorageChangedCallback(SysteminfoInstance& instance)
@@ -469,11 +395,11 @@ void OnStorageChangedCallback(SysteminfoInstance& instance)
   response->get<picojson::object>()[kListenerIdString] = picojson::value(kListenerConstValue);
 
   picojson::value result = picojson::value(picojson::object());
-  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdStorage, true, result);
-  if (ret.IsSuccess()) {
-    ReportSuccess(result,response->get<picojson::object>());
-    Instance::PostMessage(&instance, response->serialize().c_str());
-  }
+//  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdStorage, true, result);
+//  if (ret.IsSuccess()) {
+//    ReportSuccess(result,response->get<picojson::object>());
+//    Instance::PostMessage(&instance, response->serialize().c_str());
+//  }
 }
 
 void OnDisplayChangedCallback(SysteminfoInstance& instance)
@@ -485,11 +411,11 @@ void OnDisplayChangedCallback(SysteminfoInstance& instance)
   response->get<picojson::object>()[kListenerIdString] = picojson::value(kListenerConstValue);
 
   picojson::value result = picojson::value(picojson::object());
-  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdDisplay, true, result);
-  if (ret.IsSuccess()) {
-    ReportSuccess(result,response->get<picojson::object>());
-    Instance::PostMessage(&instance, response->serialize().c_str());
-  }
+//  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdDisplay, true, result);
+//  if (ret.IsSuccess()) {
+//    ReportSuccess(result,response->get<picojson::object>());
+//    Instance::PostMessage(&instance, response->serialize().c_str());
+//  }
 }
 
 void OnDeviceOrientationChangedCallback(SysteminfoInstance& instance)
@@ -501,11 +427,11 @@ void OnDeviceOrientationChangedCallback(SysteminfoInstance& instance)
   response->get<picojson::object>()[kListenerIdString] = picojson::value(kListenerConstValue);
 
   picojson::value result = picojson::value(picojson::object());
-  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdDeviceOrientation, true, result);
-  if (ret.IsSuccess()) {
-    ReportSuccess(result,response->get<picojson::object>());
-    Instance::PostMessage(&instance, response->serialize().c_str());
-  }
+//  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdDeviceOrientation, true, result);
+//  if (ret.IsSuccess()) {
+//    ReportSuccess(result,response->get<picojson::object>());
+//    Instance::PostMessage(&instance, response->serialize().c_str());
+//  }
 }
 
 void OnLocaleChangedCallback(SysteminfoInstance& instance)
@@ -517,11 +443,11 @@ void OnLocaleChangedCallback(SysteminfoInstance& instance)
   response->get<picojson::object>()[kListenerIdString] = picojson::value(kListenerConstValue);
 
   picojson::value result = picojson::value(picojson::object());
-  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdLocale, true, result);
-  if (ret.IsSuccess()) {
-    ReportSuccess(result,response->get<picojson::object>());
-    Instance::PostMessage(&instance, response->serialize().c_str());
-  }
+//  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdLocale, true, result);
+//  if (ret.IsSuccess()) {
+//    ReportSuccess(result,response->get<picojson::object>());
+//    Instance::PostMessage(&instance, response->serialize().c_str());
+//  }
 }
 
 void OnNetworkChangedCallback(SysteminfoInstance& instance)
@@ -533,11 +459,11 @@ void OnNetworkChangedCallback(SysteminfoInstance& instance)
   response->get<picojson::object>()[kListenerIdString] = picojson::value(kListenerConstValue);
 
   picojson::value result = picojson::value(picojson::object());
-  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdNetwork, true, result);
-  if (ret.IsSuccess()) {
-    ReportSuccess(result,response->get<picojson::object>());
-    Instance::PostMessage(&instance, response->serialize().c_str());
-  }
+//  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdNetwork, true, result);
+//  if (ret.IsSuccess()) {
+//    ReportSuccess(result,response->get<picojson::object>());
+//    Instance::PostMessage(&instance, response->serialize().c_str());
+//  }
 }
 
 void OnWifiNetworkChangedCallback(SysteminfoInstance& instance)
@@ -549,11 +475,11 @@ void OnWifiNetworkChangedCallback(SysteminfoInstance& instance)
   response->get<picojson::object>()[kListenerIdString] = picojson::value(kListenerConstValue);
 
   picojson::value result = picojson::value(picojson::object());
-  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdWifiNetwork, true, result);
-  if (ret.IsSuccess()) {
-    ReportSuccess(result,response->get<picojson::object>());
-    Instance::PostMessage(&instance, response->serialize().c_str());
-  }
+//  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdWifiNetwork, true, result);
+//  if (ret.IsSuccess()) {
+//    ReportSuccess(result,response->get<picojson::object>());
+//    Instance::PostMessage(&instance, response->serialize().c_str());
+//  }
 }
 
 void OnEthernetNetworkChangedCallback(SysteminfoInstance& instance)
@@ -565,11 +491,11 @@ void OnEthernetNetworkChangedCallback(SysteminfoInstance& instance)
   response->get<picojson::object>()[kListenerIdString] = picojson::value(kListenerConstValue);
 
   picojson::value result = picojson::value(picojson::object());
-  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdEthernetNetwork, true, result);
-  if (ret.IsSuccess()) {
-    ReportSuccess(result,response->get<picojson::object>());
-    Instance::PostMessage(&instance, response->serialize().c_str());
-  }
+//  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdEthernetNetwork, true, result);
+//  if (ret.IsSuccess()) {
+//    ReportSuccess(result,response->get<picojson::object>());
+//    Instance::PostMessage(&instance, response->serialize().c_str());
+//  }
 }
 
 void OnCellularNetworkChangedCallback(SysteminfoInstance& instance)
@@ -581,11 +507,11 @@ void OnCellularNetworkChangedCallback(SysteminfoInstance& instance)
   response->get<picojson::object>()[kListenerIdString] = picojson::value(kListenerConstValue);
 
   picojson::value result = picojson::value(picojson::object());
-  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdCellularNetwork, true, result);
-  if (ret.IsSuccess()) {
-    ReportSuccess(result,response->get<picojson::object>());
-    Instance::PostMessage(&instance, response->serialize().c_str());
-  }
+//  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdCellularNetwork, true, result);
+//  if (ret.IsSuccess()) {
+//    ReportSuccess(result,response->get<picojson::object>());
+//    Instance::PostMessage(&instance, response->serialize().c_str());
+//  }
 }
 
 void OnPeripheralChangedCallback(SysteminfoInstance& instance)
@@ -597,11 +523,11 @@ void OnPeripheralChangedCallback(SysteminfoInstance& instance)
   response->get<picojson::object>()[kListenerIdString] = picojson::value(kListenerConstValue);
 
   picojson::value result = picojson::value(picojson::object());
-  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdPeripheral, true, result);
-  if (ret.IsSuccess()) {
-    ReportSuccess(result,response->get<picojson::object>());
-    Instance::PostMessage(&instance, response->serialize().c_str());
-  }
+//  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdPeripheral, true, result);
+//  if (ret.IsSuccess()) {
+//    ReportSuccess(result,response->get<picojson::object>());
+//    Instance::PostMessage(&instance, response->serialize().c_str());
+//  }
 }
 
 void OnMemoryChangedCallback(SysteminfoInstance& instance)
@@ -613,11 +539,11 @@ void OnMemoryChangedCallback(SysteminfoInstance& instance)
   response->get<picojson::object>()[kListenerIdString] = picojson::value(kListenerConstValue);
 
   picojson::value result = picojson::value(picojson::object());
-  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdMemory, true, result);
-  if (ret.IsSuccess()) {
-    ReportSuccess(result,response->get<picojson::object>());
-    Instance::PostMessage(&instance, response->serialize().c_str());
-  }
+//  PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdMemory, true, result);
+//  if (ret.IsSuccess()) {
+//    ReportSuccess(result,response->get<picojson::object>());
+//    Instance::PostMessage(&instance, response->serialize().c_str());
+//  }
 }
 
 void OnBrigthnessChangedCallback(SysteminfoInstance &instance)
@@ -629,11 +555,11 @@ void OnBrigthnessChangedCallback(SysteminfoInstance &instance)
     response->get<picojson::object>()[kListenerIdString] = picojson::value(kListenerConstValue);
 
     picojson::value result = picojson::value(picojson::object());
-    PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdCameraFlash, true, result);
-    if (ret.IsSuccess()) {
-      ReportSuccess(result,response->get<picojson::object>());
-      Instance::PostMessage(&instance, response->serialize().c_str());
-    }
+//    PlatformResult ret = SysteminfoUtils::GetPropertyValue(kPropertyIdCameraFlash, true, result);
+//    if (ret.IsSuccess()) {
+//      ReportSuccess(result,response->get<picojson::object>());
+//      Instance::PostMessage(&instance, response->serialize().c_str());
+//    }
 }
 
 } // namespace systeminfo
index 020fa1255245c43b3d353ee1021238b8e8603f37..307f2b9e1146173f2671b8efe3129ea1d00235e3 100644 (file)
 #include <functional>
 #include <memory>
 
+#include <device.h>
+#include <sensor_internal.h>
+
 #include "systeminfo/systeminfo_instance.h"
 #include "systeminfo/systeminfo_device_capability.h"
+#include "systeminfo/systeminfo-utils.h"
 #include "common/logger.h"
 #include "common/converter.h"
 #include "common/task-queue.h"
@@ -37,6 +41,8 @@ namespace extension {
 namespace systeminfo {
 
 namespace {
+const int kDefaultPropertyCount = 1;
+
 #define CHECK_EXIST(args, name, out) \
   if (!args.contains(name)) {\
     ReportError(TypeMismatchException(name" is required argument"), *out);\
@@ -86,11 +92,51 @@ namespace {
 } //namespace
 
 SysteminfoManager::SysteminfoManager(SysteminfoInstance* instance)
-    : instance_(instance){
+    : instance_(instance),
+      prop_manager_(*this),
+      sensor_handle_(-1),
+      wifi_level_(WIFI_RSSI_LEVEL_0),
+      cpu_load_(0),
+      available_capacity_internal_(0),
+      available_capacity_mmc_(0),
+      sim_count_(0),
+      tapi_handles_{nullptr} {
+  LoggerD("Entered");
+    int error = wifi_initialize();
+    if (WIFI_ERROR_NONE != error) {
+      std::string log_msg = "Initialize failed: " + std::string(get_error_message(error));
+      LoggerE("%s", log_msg.c_str());
+    } else {
+      LoggerD("WIFI initialization succeed");
+    }
+
+    //TODO
+//    error = wifi_set_rssi_level_changed_cb(OnWifiLevelChangedCb, nullptr);
+//    if (WIFI_ERROR_NONE != error) {
+//      std::string log_msg = "Setting wifi listener failed: " + parseWifiNetworkError(error);
+//      LoggerE("%s", log_msg.c_str());
+//    } else {
+//      LoggerD("Setting wifi listener succeed");
+//    }
+    InitCameraTypes();
 }
 
 SysteminfoManager::~SysteminfoManager() {
   LoggerD("Enter");
+  DisconnectSensor(sensor_handle_);
+
+
+  unsigned int i = 0;
+  while(tapi_handles_[i]) {
+    tel_deinit(tapi_handles_[i]);
+    i++;
+  }
+//TODO
+//  if (nullptr != m_connection_handle) {
+//    connection_destroy(m_connection_handle);
+//  }
+
+  wifi_deinitialize();
 }
 
 void SysteminfoManager::GetCapabilities(const picojson::value& args, picojson::object* out) {
@@ -233,27 +279,87 @@ void SysteminfoManager::GetPropertyValueArray(const picojson::value& args, picoj
   const std::string& prop_id = args.get("property").get<std::string>();
   LoggerD("Getting property arrray with id: %s ", prop_id.c_str());
 
-//  auto get = [this, prop_id, callback_id](const std::shared_ptr<picojson::value>& response) -> void {
-//    LoggerD("Getting");
-//    picojson::value result = picojson::value(picojson::object());
-//    PlatformResult ret = SysteminfoUtils::GetPropertyValue(prop_id, true, result);
-//    if (ret.IsError()) {
-//      LoggerE("Failed: GetPropertyValue()");
-//      ReportError(ret,&(response->get<picojson::object>()));
-//      return;
-//    }
-//    ReportSuccess(result, response->get<picojson::object>());
-//  };
-//
-//  auto get_response = [this, callback_id](const std::shared_ptr<picojson::value>& response) -> void {
-//    LoggerD("Getting response");
-//    picojson::object& obj = response->get<picojson::object>();
-//    obj.insert(std::make_pair("callbackId", picojson::value(callback_id)));
-//    PostMessage(response->serialize().c_str());
-//  };
-//
-//  TaskQueue::GetInstance().Queue<picojson::value>
-//  (get, get_response, std::shared_ptr<picojson::value>(new picojson::value(picojson::object())));
+  auto get = [this, prop_id, callback_id](const std::shared_ptr<picojson::value>& response) -> void {
+    LoggerD("Getting");
+    picojson::value result = picojson::value(picojson::object());
+
+    PlatformResult ret = prop_manager_.GetPropertyValue(prop_id, true, &result);
+    if (ret.IsError()) {
+      LoggerE("Failed: GetPropertyValue()");
+      ReportError(ret,&(response->get<picojson::object>()));
+      return;
+    }
+    ReportSuccess(result, response->get<picojson::object>());
+  };
+
+  auto get_response = [this, callback_id](const std::shared_ptr<picojson::value>& response) -> void {
+    LoggerD("Getting response");
+    picojson::object& obj = response->get<picojson::object>();
+    obj.insert(std::make_pair("callbackId", picojson::value(callback_id)));
+    Instance::PostMessage(instance_, response->serialize().c_str());
+  };
+
+  TaskQueue::GetInstance().Queue<picojson::value>
+  (get, get_response, std::shared_ptr<picojson::value>(new picojson::value(picojson::object())));
+}
+
+void SysteminfoManager::GetTotalMemory(const picojson::value& args, picojson::object* out) {
+  LoggerD("Enter");
+  picojson::value result = picojson::value(picojson::object());
+  picojson::object& result_obj = result.get<picojson::object>();
+
+  long long return_value = 0;
+  PlatformResult ret = SysteminfoUtils::GetTotalMemory(&return_value);
+  if (ret.IsError()) {
+    LoggerD("Error");
+    ReportError(ret, out);
+    return;
+  }
+  result_obj.insert(std::make_pair("totalMemory",
+                                   picojson::value(static_cast<double>(return_value))));
+
+  ReportSuccess(result, *out);
+  LoggerD("Success");
+}
+
+void SysteminfoManager::GetAvailableMemory(const picojson::value& args, picojson::object* out) {
+  LoggerD("Enter");
+  picojson::value result = picojson::value(picojson::object());
+  picojson::object& result_obj = result.get<picojson::object>();
+
+  long long return_value = 0;
+  PlatformResult ret = SysteminfoUtils::GetAvailableMemory(&return_value);
+  if (ret.IsError()) {
+    LoggerD("Error");
+    ReportError(ret, out);
+    return;
+  }
+  result_obj.insert(std::make_pair("availableMemory",
+                                   picojson::value(static_cast<double>(return_value))));
+
+  ReportSuccess(result, *out);
+  LoggerD("Success");
+}
+
+void SysteminfoManager::GetCount(const picojson::value& args, picojson::object* out) {
+  LoggerD("Enter");
+  CHECK_EXIST(args, "property", out)
+  const std::string& property = args.get("property").get<std::string>();
+  LoggerD("Getting count of property with id: %s ", property.c_str());
+
+  picojson::value result = picojson::value(picojson::object());
+  picojson::object& result_obj = result.get<picojson::object>();
+  unsigned long count = 0;
+  PlatformResult ret = GetPropertyCount(property, &count);
+  if (ret.IsError()) {
+    LoggerE("Failed: GetCount()");
+    ReportError(ret, out);
+    return;
+  }
+  result_obj.insert(std::make_pair("count", picojson::value(static_cast<double>(count))));
+
+  ReportSuccess(result, *out);
+  LoggerD("Success");
 }
 
 void SysteminfoManager::AddPropertyValueChangeListener(const picojson::value& args, picojson::object* out) {
@@ -310,66 +416,6 @@ void SysteminfoManager::AddPropertyValueChangeListener(const picojson::value& ar
 //  ReportError(ret, &out);
 }
 
-void SysteminfoManager::GetTotalMemory(const picojson::value& args, picojson::object* out) {
-  LoggerD("Enter");
-  picojson::value result = picojson::value(picojson::object());
-  picojson::object& result_obj = result.get<picojson::object>();
-
-  long long return_value = 0;
-//  PlatformResult ret = SysteminfoUtils::GetTotalMemory(return_value);
-//  if (ret.IsError()) {
-//    LoggerD("Error");
-//    ReportError(ret, &out);
-//    return;
-//  }
-//  result_obj.insert(std::make_pair("totalMemory",
-//                                   picojson::value(static_cast<double>(return_value))));
-//
-//  ReportSuccess(result, out);
-//  LoggerD("Success");
-}
-
-void SysteminfoManager::GetAvailableMemory(const picojson::value& args, picojson::object* out) {
-  LoggerD("Enter");
-  picojson::value result = picojson::value(picojson::object());
-  picojson::object& result_obj = result.get<picojson::object>();
-
-  long long return_value = 0;
-//  PlatformResult ret = SysteminfoUtils::GetAvailableMemory(return_value);
-//  if (ret.IsError()) {
-//    LoggerD("Error");
-//    ReportError(ret, &out);
-//    return;
-//  }
-//  result_obj.insert(std::make_pair("availableMemory",
-//                                   picojson::value(static_cast<double>(return_value))));
-//
-//  ReportSuccess(result, out);
-//  LoggerD("Success");
-}
-
-void SysteminfoManager::GetCount(const picojson::value& args, picojson::object* out) {
-
-  LoggerD("Enter");
-  CHECK_EXIST(args, "property", out)
-  const std::string& property = args.get("property").get<std::string>();
-  LoggerD("Getting count of property with id: %s ", property.c_str());
-
-  picojson::value result = picojson::value(picojson::object());
-  picojson::object& result_obj = result.get<picojson::object>();
-  unsigned long count = 0;
-//  PlatformResult ret = SysteminfoUtils::GetCount(property, count);
-//  if (ret.IsError()) {
-//    LoggerE("Failed: GetCount()");
-//    ReportError(ret, &out);
-//    return;
-//  }
-//  result_obj.insert(std::make_pair("count", picojson::value(static_cast<double>(count))));
-//
-//  ReportSuccess(result, out);
-//  LoggerD("Success");
-}
-
 void SysteminfoManager::RemovePropertyValueChangeListener(const picojson::value& args, picojson::object* out) {
   LoggerD("Enter");
 
@@ -430,39 +476,218 @@ void SysteminfoManager::SetBrightness(const picojson::value& args, picojson::obj
   CHECK_EXIST(args, "brightness", out)
 
   const double brightness = args.get("brightness").get<double>();
-//  int result = device_flash_set_brightness(brightness);
-//  if (result != DEVICE_ERROR_NONE) {
-//    LoggerE("Error occured");
-//    ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Error occured"), &out);
-//    return;
-//  }
-//  ReportSuccess(out);
+  int result = device_flash_set_brightness(brightness);
+  if (result != DEVICE_ERROR_NONE) {
+    LoggerE("Error occured");
+    ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Error occured"), out);
+    return;
+  }
+  ReportSuccess(*out);
 }
 
 void SysteminfoManager::GetBrightness(const picojson::value& args, picojson::object* out) {
   LoggerD("entered");
 
   int brightness = 0;
-//  int result = device_flash_get_brightness(&brightness);
-//  if (result != DEVICE_ERROR_NONE) {
-//    LoggerE("Error occured");
-//    ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Error occured"), &out);
-//    return;
-//  }
-//  ReportSuccess(picojson::value(std::to_string(brightness)), out);
+  int result = device_flash_get_brightness(&brightness);
+  if (result != DEVICE_ERROR_NONE) {
+    LoggerE("Error occured");
+    ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Error occured"), out);
+    return;
+  }
+  ReportSuccess(picojson::value(std::to_string(brightness)), *out);
 }
 
 void SysteminfoManager::GetMaxBrightness(const picojson::value& args, picojson::object* out) {
   LoggerD("entered");
 
   int brightness = 0;
-//  int result = device_flash_get_max_brightness(&brightness);
-//  if (result != DEVICE_ERROR_NONE) {
-//    LoggerE("Error occured");
-//    ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Not supported property"), &out);
-//    return;
-//  }
-//  ReportSuccess(picojson::value(std::to_string(brightness)), out);
+  int result = device_flash_get_max_brightness(&brightness);
+  if (result != DEVICE_ERROR_NONE) {
+    LoggerE("Error occured");
+    ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Not supported property"), out);
+    return;
+  }
+  ReportSuccess(picojson::value(std::to_string(brightness)), *out);
+}
+
+PlatformResult SysteminfoManager::GetPropertyCount(const std::string& property,
+                                                   unsigned long* count)
+{
+  LoggerD("Enter");
+
+  if ("BATTERY" == property || "CPU" == property || "STORAGE" == property ||
+      "DISPLAY" == property || "DEVICE_ORIENTATION" == property ||
+      "BUILD" == property || "LOCALE" == property || "NETWORK" == property ||
+      "WIFI_NETWORK" == property || "PERIPHERAL" == property ||
+      "MEMORY" == property) {
+    *count = kDefaultPropertyCount;
+  } else if ("CELLULAR_NETWORK" == property) {
+    PlatformResult ret = SysteminfoUtils::CheckTelephonySupport();
+    if (ret.IsError()) {
+      *count = 0;
+    } else {
+      *count = GetSimCount();
+    }
+  } else if ("SIM" == property) {
+    PlatformResult ret = SysteminfoUtils::CheckTelephonySupport();
+    if (ret.IsError()) {
+      *count = 0;
+    } else {
+      *count = GetSimCount();
+    }
+  } else if ("CAMERA_FLASH" == property) {
+    *count = GetCameraTypesCount();
+  } else if ("ETHERNET_NETWORK" == property) {
+    PlatformResult ret = SysteminfoUtils::CheckIfEthernetNetworkSupported();
+    if (ret.IsError()) {
+      *count = 0;
+    } else {
+      *count = kDefaultPropertyCount;
+    }
+  } else {
+    LoggerD("Property with given id is not supported");
+    return PlatformResult(ErrorCode::NOT_SUPPORTED_ERR, "Property with given id is not supported");
+  }
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+wifi_rssi_level_e SysteminfoManager::GetWifiLevel() {
+  LoggerD("Enter");
+  return wifi_level_;
+}
+
+int SysteminfoManager::GetSensorHandle() {
+  LoggerD("Enter");
+  if (sensor_handle_ < 0) {
+    LoggerD("Connecting to sensor");
+    ConnectSensor(&sensor_handle_);
+  } else {
+    LoggerD("Sensor already connected");
+  }
+  return sensor_handle_;
+}
+
+PlatformResult SysteminfoManager::ConnectSensor(int* result) {
+  LoggerD("Entered");
+  sensor_t sensor = sensord_get_sensor(AUTO_ROTATION_SENSOR);
+  int handle_orientation = sensord_connect(sensor);
+  if (handle_orientation < 0) {
+    std::string log_msg = "Failed to connect auto rotation sensor";
+    LoggerE("%s", log_msg.c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+  }
+  bool ret = sensord_start(handle_orientation, 0);
+  if(!ret) {
+    sensord_disconnect(handle_orientation);
+    std::string log_msg = "Failed to start auto rotation sensor";
+    LoggerE("%s", log_msg.c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+  }
+  LoggerD("Sensor starts successfully = %d", handle_orientation);
+  *result = handle_orientation;
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+void SysteminfoManager::DisconnectSensor(int handle_orientation) {
+  LoggerD("Enter");
+  if (handle_orientation >= 0) {
+    LoggerD("Entered");
+    bool state = sensord_stop(handle_orientation);
+    LoggerD("sensord_stop() returned state = %d", state);
+    state = sensord_disconnect(handle_orientation);
+    LoggerD("sensord_disconnect() returned state %d", state);
+  } else {
+    LoggerD("sensor already disconnected - no action needed");
+  }
+}
+
+void SysteminfoManager::SetCpuInfoLoad(double load) {
+  LoggerD("Enter");
+  cpu_load_ = load;
+}
+
+void SysteminfoManager::SetAvailableCapacityInternal(unsigned long long capacity) {
+  LoggerD("Enter");
+  available_capacity_internal_ = capacity;
+}
+
+void SysteminfoManager::SetAvailableCapacityMmc(unsigned long long capacity) {
+  LoggerD("Enter");
+  available_capacity_mmc_ = capacity;
+}
+
+int SysteminfoManager::GetSimCount() {
+  LoggerD("Entered");
+  InitTapiHandles();
+  return sim_count_;
+}
+
+void SysteminfoManager::InitTapiHandles() {
+  LoggerD("Entered");
+  if (nullptr == tapi_handles_[0]){  //check if anything is in table
+    sim_count_ = 0;
+    char **cp_list = tel_get_cp_name_list();
+    if (nullptr != cp_list) {
+      while (cp_list[sim_count_]) {
+        tapi_handles_[sim_count_] = tel_init(cp_list[sim_count_]);
+        if (nullptr == tapi_handles_[sim_count_]) {
+          LoggerE("Failed to connect with tapi, handle is null");
+          break;
+        }
+        sim_count_++;
+        LoggerD("%d modem: %s", sim_count_, cp_list[sim_count_]);
+      }
+    } else {
+      LoggerE("Failed to get cp list");
+      sim_count_ = kTapiMaxHandle;
+    }
+    g_strfreev(cp_list);
+  }
+}
+
+TapiHandle* SysteminfoManager::GetTapiHandle() {
+  LoggerD("Entered");
+  InitTapiHandles();
+  return tapi_handles_[0];
+}
+
+TapiHandle** SysteminfoManager::GetTapiHandles() {
+  LoggerD("Enter");
+  InitTapiHandles();
+  return tapi_handles_;
+}
+
+void SysteminfoManager::InitCameraTypes() {
+  LoggerD("Enter");
+  bool supported = false;
+  PlatformResult ret = SystemInfoDeviceCapability::GetValueBool(
+      "tizen.org/feature/camera.back.flash", &supported);
+  if (ret.IsSuccess()) {
+    if (supported) {
+      camera_types_.push_back("BACK");
+    }
+  }
+  ret = SystemInfoDeviceCapability::GetValueBool(
+      "tizen.org/feature/camera.front.flash", &supported);
+  if (ret.IsSuccess()) {
+    if (supported) {
+      camera_types_.push_back("FRONT");
+    }
+  }
+}
+
+std::string SysteminfoManager::GetCameraTypes(int index) {
+  LoggerD("Enter");
+  if (index >= camera_types_.size()) {
+    return "";
+  }
+  return camera_types_[index];
+}
+
+int SysteminfoManager::GetCameraTypesCount() {
+  LoggerD("Enter");
+  return camera_types_.size();
 }
 
 }  // namespace systeminfo
index a7b721b3f26ab5fd48beb816d42540c3955a2282..636013748648c27724e20cdd2abf8528c4150971 100644 (file)
@@ -17,6 +17,8 @@
 #ifndef WEBAPI_PLUGINS_SYSTEMINFO_SYSTEMINFO_MANAGER_H__
 #define WEBAPI_PLUGINS_SYSTEMINFO_SYSTEMINFO_MANAGER_H__
 
+#include <wifi.h>
+
 #include "common/picojson.h"
 #include "common/platform_result.h"
 #include "systeminfo/systeminfo_properties_manager.h"
@@ -24,6 +26,8 @@
 namespace extension {
 namespace systeminfo {
 
+const int kTapiMaxHandle = 2;
+
 class SysteminfoInstance;
 
 class SysteminfoManager {
@@ -44,10 +48,38 @@ class SysteminfoManager {
   void GetAvailableMemory(const picojson::value& args, picojson::object* out);
   void GetCount(const picojson::value& args, picojson::object* out);
 
+  common::PlatformResult GetPropertyCount(const std::string& property, unsigned long* count);
+  wifi_rssi_level_e GetWifiLevel();
+  int GetSensorHandle();
+  TapiHandle* GetTapiHandle();
+  TapiHandle** GetTapiHandles();
+
+  void SetCpuInfoLoad(double load);
+  void SetAvailableCapacityInternal(unsigned long long capacity);
+  void SetAvailableCapacityMmc(unsigned long long capacity);
+  std::string GetCameraTypes(int index);
+  int GetCameraTypesCount();
  private:
+  common::PlatformResult ConnectSensor(int* result);
+  void DisconnectSensor(int handle_orientation);
+  void InitTapiHandles();
+  void InitCameraTypes();
+  int GetSimCount();
+
   SysteminfoInstance* instance_;
-  SystemInfoPropertiesManager prop_manager_;
+  SysteminfoPropertiesManager prop_manager_;
+
+  //! Sensor handle for DeviceOrientation purposes
+  int sensor_handle_;
+
+  std::vector<std::string> camera_types_;
+  wifi_rssi_level_e wifi_level_;
+  double cpu_load_;
+  unsigned long long available_capacity_internal_;
+  unsigned long long available_capacity_mmc_;
 
+  int sim_count_;
+  TapiHandle *tapi_handles_[kTapiMaxHandle+1];
 };
 } // namespace systeminfo
 } // namespace webapi
index 059794074b64821d168c10a35b0e16c3f4c1d52a..cb7de0506657c8f714aa72eebdd7e041fe04ee55 100644 (file)
 
 #include "systeminfo/systeminfo_properties_manager.h"
 
+#include <memory>
+
 #include <vconf.h>
 #include <vconf-internal-keys.h>
+#include <system_info.h>
+#include <sensor_internal.h>
+#include <system_settings.h>
+#include <net_connection.h>
+#include <sys/statfs.h>
+
+#include "systeminfo/systeminfo_manager.h"
+#include "systeminfo/systeminfo_device_capability.h"
+#include "common/scope_exit.h"
+#include "systeminfo/systeminfo-utils.h"
 
 namespace extension {
 namespace systeminfo {
@@ -26,7 +38,9 @@ using common::PlatformResult;
 using common::ErrorCode;
 
 namespace {
-const std::string kPropertyIdCpu = "CPU";
+const std::string kMemoryStateNormal = "NORMAL";
+const std::string kMemoryStateWarinig = "WARNING";
+const double kDisplayInchToMillimeter = 2.54;
 //Battery
 const double kRemainingBatteryChargeMax = 100.0;
 const int kVconfErrorNone = 0;
@@ -47,7 +61,6 @@ const std::string kTypeUnknown = "UNKNOWN";
 const std::string kTypeInternal = "INTERNAL";
 const std::string kTypeUsbHost = "USB_HOST";
 const std::string kTypeMmc = "MMC";
-const double kPropertyWatcherTime = 1;
 //Network
 enum NetworkType {
   kNone,
@@ -76,27 +89,20 @@ const int kWifiSignalStrengthDivideValue = 100;
 const unsigned short kMccDivider = 100;
 const char* kConnectionOff = "OFF";
 const char* kConnectionOn = "ON";
-//Sim
-const char* kSimStatusAbsent = "ABSENT";
-const char* kSimStatusInitializing = "INITIALIZING";
-const char* kSimStatusReady = "READY";
-const char* kSimStatusPinRequired = "PIN_REQUIRED";
-const char* kSimStatusPukRequired = "PUK_REQUIRED";
-const char* kSimStatusSimLocked = "SIM_LOCKED";
-const char* kSimStatusNetworkLocked = "NETWORK_LOCKED";
-const char* kSimStatusUnknown = "UNKNOWN";
 }
 
-SystemInfoPropertiesManager::SystemInfoPropertiesManager() {
+SysteminfoPropertiesManager::SysteminfoPropertiesManager(SysteminfoManager& manager)
+    : manager_(manager) {
   LoggerD("Entered");
 }
 
-SystemInfoPropertiesManager::~SystemInfoPropertiesManager() {
+SysteminfoPropertiesManager::~SysteminfoPropertiesManager() {
   LoggerD("Entered");
 }
 
-PlatformResult SystemInfoPropertiesManager::GetPropertyValue(const std::string& property, bool is_array_type,
-                                                  picojson::value* res) {
+PlatformResult SysteminfoPropertiesManager::GetPropertyValue(const std::string& property,
+                                                             bool is_array_type, picojson::value* res)
+{
   LoggerD("Entered getPropertyValue");
 
   if (!is_array_type) {
@@ -109,72 +115,72 @@ PlatformResult SystemInfoPropertiesManager::GetPropertyValue(const std::string&
             first->second.get<picojson::array>();
 
     unsigned long property_count = 0;
-    PlatformResult ret(ErrorCode::NO_ERROR);
-//    PlatformResult ret = SysteminfoUtils::GetCount(property, property_count);
-//    if (ret.IsError()){
-//      return ret;
-//    }
-
+    PlatformResult ret = manager_.GetPropertyCount(property, &property_count);
+    if (ret.IsError()){
+      LoggerD("Property is not available");
+      return ret;
+    }
     LoggerD("property name: %s", property.c_str());
-//    LoggerD("available property count: %d", property_count);
-//    for (size_t i = 0; i < property_count; i++) {
-    size_t i = 0;
+    LoggerD("available property count: %d", property_count);
+
+    for (size_t i = 0; i < property_count; i++) {
       picojson::value result = picojson::value(picojson::object());
       picojson::object& result_obj = result.get<picojson::object>();
 
-      ret = ReportProperty(property, i, &result_obj);
+      PlatformResult ret = ReportProperty(property, i, &result_obj);
       if (ret.IsError()){
         return ret;
       }
       array.push_back(result);
-//    }
-//    if (property_count == 0) {
-//      return PlatformResult(ErrorCode::NOT_SUPPORTED_ERR, "Property with given id is not supported");
-//    }
+    }
+    if (property_count == 0) {
+      return PlatformResult(ErrorCode::NOT_SUPPORTED_ERR, "Property with given id is not supported");
+    }
   }
 
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-PlatformResult SystemInfoPropertiesManager::ReportProperty(const std::string& property, int index,
+PlatformResult SysteminfoPropertiesManager::ReportProperty(const std::string& property, int index,
                                                picojson::object* res_obj) {
   LoggerD("Entered");
   if ("BATTERY" == property){
     return ReportBattery(res_obj);
   } else if ("CPU" == property) {
-//    return ReportCpu(res_obj);
+    return ReportCpu(res_obj);
   } else if ("STORAGE" == property) {
-//    return ReportStorage(res_obj);
+    return ReportStorage(res_obj);
   } else if ("DISPLAY" == property) {
-//    return ReportDisplay(res_obj);
+    return ReportDisplay(res_obj);
   } else if ("DEVICE_ORIENTATION" == property) {
-//    return ReportDeviceOrientation(res_obj);
+    return ReportDeviceOrientation(res_obj);
   } else if ("BUILD" == property) {
-//    return ReportBuild(res_obj);
+    return ReportBuild(res_obj);
   } else if ("LOCALE" == property) {
-//    return ReportLocale(res_obj);
+    return ReportLocale(res_obj);
   } else if ("NETWORK" == property) {
-//    return ReportNetwork(res_obj);
+    return ReportNetwork(res_obj);
   } else if ("WIFI_NETWORK" == property) {
-//    return ReportWifiNetwork(res_obj);
+    return ReportWifiNetwork(res_obj);
   } else if ("ETHERNET_NETWORK" == property) {
-//    return ReportEthernetNetwork(res_obj);
+    return ReportEthernetNetwork(res_obj);
   } else if ("CELLULAR_NETWORK" == property) {
-//    return ReportCellularNetwork(res_obj, index);
+    return ReportCellularNetwork(res_obj, index);
   } else if ("SIM" == property) {
-//    return ReportSim(res_obj, index);
+    return ReportSim(res_obj, index);
   } else if ("PERIPHERAL" == property) {
-//    return ReportPeripheral(res_obj);
+    return ReportPeripheral(res_obj);
   } else if ("MEMORY" == property) {
-//    return ReportMemory(res_obj);
+    return ReportMemory(res_obj);
   } else if ("CAMERA_FLASH" == property) {
-//    return ReportCameraFlash(res_obj);
+    return ReportCameraFlash(res_obj, index);
   }
   LoggerD("Property with given id is not supported");
   return PlatformResult(ErrorCode::NOT_SUPPORTED_ERR, "Property with given id is not supported");
 }
 
-PlatformResult SystemInfoPropertiesManager::ReportBattery(picojson::object* out) {
+/// BATTERY
+PlatformResult SysteminfoPropertiesManager::ReportBattery(picojson::object* out) {
   int value = 0;
   int ret = vconf_get_int(VCONFKEY_SYSMAN_BATTERY_CAPACITY, &value);
   if (kVconfErrorNone != ret) {
@@ -194,975 +200,936 @@ PlatformResult SystemInfoPropertiesManager::ReportBattery(picojson::object* out)
   out->insert(std::make_pair("isCharging", picojson::value(0 != value)));
   return PlatformResult(ErrorCode::NO_ERROR);
 }
-//TODO maybe make two functions later onGSourceFunc
-//PlatformResult SystemInfoPropertiesManager::ReportCpu(picojson::object* out) {
-//  LoggerD("Entered");
-//  static CpuInfo cpu_info;
-//  FILE *fp = nullptr;
-//  fp = fopen("/proc/stat", "r");
-//  if (nullptr == fp) {
-//    std::string error_msg("Can not open /proc/stat for reading");
-//    LoggerE( "%s", error_msg.c_str() );
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
-//  }
-//
-//  long long usr = 0;
-//  long long system = 0;
-//  long long nice = 0;
-//  long long idle = 0;
-//  double load = 0;
-//
-//  int read_ret = fscanf( fp, "%*s %lld %lld %lld %lld", &usr, &system, &nice, &idle);
-//  fclose(fp);
-//
-//  if (4 == read_ret) {
-//    long long total = usr + nice + system + idle - cpu_info.usr - cpu_info.nice -
-//        cpu_info.system - cpu_info.idle;
-//    long long diff_idle = idle - cpu_info.idle;
-//    if (( total > 0LL ) && ( diff_idle > 0LL )) {
-//      load = static_cast< double >( diff_idle ) * 100LL / total;
-//      cpu_info.usr = usr;
-//      cpu_info.system = system;
-//      cpu_info.nice = nice;
-//      cpu_info.idle = idle;
-//      cpu_info.load = load;
-//    } else {
-//      LoggerW("Cannot calculate cpu load, previous value returned");
-//      load = cpu_info.load;
-//    }
-//  } else {
-//    std::string error_msg( "Could not read /proc/stat" );
-//    LoggerE( "%s", error_msg.c_str() );
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
-//  }
-//
-//  system_info_listeners.SetCpuInfoLoad(cpu_info.load);
-//
-//  load = 100 - load;
-//  LoggerD("Cpu load : %f", load );
-//  out.insert(std::make_pair("load", picojson::value(load / 100.0)));
-//  return PlatformResult(ErrorCode::NO_ERROR);
-//}
-//
-//PlatformResult SystemInfoPropertiesManager::ReportDisplay(picojson::object* out) {
-//  int screenWidth = 0;
-//  int screenHeight = 0;
-//  int dotsPerInchWidth = 0;
-//  int dotsPerInchHeight = 0;
-//  double physicalWidth = 0;
-//  double physicalHeight = 0;
-//  double scaledBrightness;
-//
-//  // FETCH RESOLUTION
-//  if (SYSTEM_INFO_ERROR_NONE != system_info_get_platform_int(
-//      "tizen.org/feature/screen.width", &screenWidth)) {
-//    LoggerE("Cannot get value of screen width");
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get value of screen width");
-//  }
-//  if (SYSTEM_INFO_ERROR_NONE != system_info_get_platform_int(
-//      "tizen.org/feature/screen.height", &screenHeight)) {
-//    LoggerE("Cannot get value of screen height");
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get value of screen height");
-//  }
-//
-//  //FETCH DOTS PER INCH
-//  int dots_per_inch=0;
-//  if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_int(
-//      "tizen.org/feature/screen.dpi", &dots_per_inch)) {
-//    dotsPerInchWidth = dots_per_inch;
-//    dotsPerInchHeight = dots_per_inch;
-//  } else {
-//    LoggerE("Cannot get 'tizen.org/feature/screen.dpi' value");
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR,
-//                          "Cannot get 'tizen.org/feature/screen.dpi' value");
-//  }
-//
-//  //FETCH PHYSICAL WIDTH
-//  if (dotsPerInchWidth != 0 && screenWidth != 0) {
-//    physicalWidth = (screenWidth / dotsPerInchWidth) * DISPLAY_INCH_TO_MILLIMETER;
-//  } else {
-//    std::string log_msg = "Failed to get physical screen width value";
-//    LoggerE("%s, screenWidth : %d, dotsPerInchWidth: %d", log_msg.c_str(),
-//         screenWidth, dotsPerInchWidth);
-//  }
-//
-//  //FETCH PHYSICAL HEIGHT
-//  if (dotsPerInchHeight != 0 && screenHeight != 0) {
-//    physicalHeight = (screenHeight / dotsPerInchHeight) * DISPLAY_INCH_TO_MILLIMETER;
-//  } else {
-//    std::string log_msg = "Failed to get physical screen height value";
-//    LoggerE("%s, screenHeight : %d, dotsPerInchHeight: %d", log_msg.c_str(),
-//         screenHeight, dotsPerInchHeight);
-//  }
-//
-//  //FETCH BRIGHTNESS
-//  int brightness;
-//  if (kVconfErrorNone == vconf_get_int(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, &brightness)) {
-//    scaledBrightness = static_cast<double>(brightness)/kDisplayBrightnessDivideValue;
-//  } else {
-//    LoggerE("Cannot get brightness value of display");
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get brightness value of display");
-//  }
-//
-//  out.insert(std::make_pair("resolutionWidth", picojson::value(std::to_string(screenWidth))));
-//  out.insert(std::make_pair("resolutionHeight", picojson::value(std::to_string(screenHeight))));
-//  out.insert(std::make_pair("dotsPerInchWidth", picojson::value(std::to_string(dotsPerInchWidth))));
-//  out.insert(std::make_pair("dotsPerInchHeight", picojson::value(std::to_string(dotsPerInchHeight))));
-//  out.insert(std::make_pair("physicalWidth", picojson::value(std::to_string(physicalWidth))));
-//  out.insert(std::make_pair("physicalHeight", picojson::value(std::to_string(physicalHeight))));
-//  out.insert(std::make_pair("brightness", picojson::value(scaledBrightness)));
-//  return PlatformResult(ErrorCode::NO_ERROR);
-//}
-//
-//static PlatformResult FetchIsAutoRotation(bool* result)
-//{
-//  LoggerD("Entered");
-//  int is_auto_rotation = 0;
-//
-//  if ( 0 == vconf_get_bool(
-//      VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, &is_auto_rotation)) {
-//    if (is_auto_rotation) {
-//      *result = true;
-//    } else {
-//      *result = false;
-//    }
-//    return PlatformResult(ErrorCode::NO_ERROR);
-//  }
-//  else {
-//    LoggerE("VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL check failed");
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR,
-//                          "VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL check failed");
-//  }
-//}
-//
-//static PlatformResult FetchStatus(std::string* result)
-//{
-//  LoggerD("Entered");
-//  int rotation = 0;
-//  std::string status = kOrientationPortraitPrimary;
-//
-//  sensor_data_t data;
-//  bool ret = sensord_get_data(system_info_listeners.GetSensorHandle(),
-//                             AUTO_ROTATION_BASE_DATA_SET, &data);
-//  if (ret) {
-//    LoggerD("size of the data value array:%d", data.value_count);
-//    if (data.value_count > 0 ) {
-//      rotation = data.values[0];
-//      LoggerD("rotation is: %d", rotation);
-//    } else {
-//      LoggerE("Failed to get data : the size of array is 0. Default rotation would be returned.");
-//    }
-//  } else {
-//    LoggerE("Failed to get data(sensord_get_data). Default rotation would be returned.");
-//  }
-//
-//
-//  switch (rotation) {
-//    case AUTO_ROTATION_DEGREE_UNKNOWN:
-//    case AUTO_ROTATION_DEGREE_0:
-//      LoggerD("AUTO_ROTATION_DEGREE_0");
-//      status = kOrientationPortraitPrimary;
-//      break;
-//    case AUTO_ROTATION_DEGREE_90:
-//      LoggerD("AUTO_ROTATION_DEGREE_90");
-//      status = kOrientationLandscapePrimary;
-//      break;
-//    case AUTO_ROTATION_DEGREE_180:
-//      LoggerD("AUTO_ROTATION_DEGREE_180");
-//      status = kOrientationPortraitSecondary;
-//      break;
-//    case AUTO_ROTATION_DEGREE_270:
-//      LoggerD("AUTO_ROTATION_DEGREE_270");
-//      status = kOrientationLandscapeSecondary;
-//      break;
-//    default:
-//      LoggerE("Received unexpected data: %u", rotation);
-//      return PlatformResult(ErrorCode::UNKNOWN_ERR, "Received unexpected data");
-//  }
-//  *result = status;
-//  return PlatformResult(ErrorCode::NO_ERROR);
-//}
-
-//PlatformResult SystemInfoPropertiesManager::ReportDeviceOrientation(picojson::object* out) {
-//  bool is_auto_rotation = false;
-//  std::string status = "";
-//
-//  PlatformResult ret = FetchIsAutoRotation(&is_auto_rotation);
-//  if (ret.IsError()) return ret;
-//
-//  ret = FetchStatus(&status);
-//  if (ret.IsError()) return ret;
-//
-//  out.insert(std::make_pair("isAutoRotation", picojson::value(is_auto_rotation)));
-//  out.insert(std::make_pair("status", picojson::value(status)));
-//  return PlatformResult(ErrorCode::NO_ERROR);
-//}
-//
-//PlatformResult SystemInfoPropertiesManager::ReportBuild(picojson::object* out) {
-//  std::string model = "";
-//  PlatformResult ret = SystemInfoDeviceCapability::GetValueString(
-//      "tizen.org/system/model_name", &model);
-//  if (ret.IsError()) {
-//    return ret;
-//  }
-//  std::string manufacturer = "";
-//  ret = SystemInfoDeviceCapability::GetValueString(
-//      "tizen.org/system/manufacturer", &manufacturer);
-//  if (ret.IsError()) {
-//    return ret;
-//  }
-//  std::string buildVersion = "";
-//  ret = SystemInfoDeviceCapability::GetValueString(
-//      "tizen.org/system/build.string", &buildVersion);
-//  if (ret.IsError()) {
-//    return ret;
-//  }
-//
-//  out.insert(std::make_pair("model", picojson::value(model)));
-//  out.insert(std::make_pair("manufacturer", picojson::value(manufacturer)));
-//  out.insert(std::make_pair("buildVersion", picojson::value(buildVersion)));
-//  return PlatformResult(ErrorCode::NO_ERROR);
-//}
-//
-//PlatformResult SystemInfoPropertiesManager::ReportLocale(picojson::object* out) {
-//  std::string str_language = "";
-//  PlatformResult ret = GetRuntimeInfoString(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, str_language);
-//  if (ret.IsError()) {
-//    return ret;
-//  }
-//
-//  std::string str_country = "";
-//  ret = GetRuntimeInfoString(SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY, str_country);
-//  if (ret.IsError()) {
-//    return ret;
-//  }
-//
-//  out.insert(std::make_pair("language", picojson::value(str_language)));
-//  out.insert(std::make_pair("country", picojson::value(str_country)));
-//  return PlatformResult(ErrorCode::NO_ERROR);
-//}
-//
-//static PlatformResult GetNetworkTypeString(NetworkType type, std::string& type_string)
-//{
-//  switch (type) {
-//    case kNone:
-//      type_string = kNetworkTypeNone;
-//      break;
-//    case kType2G:
-//      type_string = kNetworkType2G;
-//      break;
-//    case kType2_5G:
-//      type_string = kNetworkType2_5G;
-//      break;
-//    case kType3G:
-//      type_string = kNetworkType3G;
-//      break;
-//    case kType4G:
-//      type_string = kNetworkType4G;
-//      break;
-//    case kWifi:
-//      type_string = kNetworkTypeWifi;
-//      break;
-//    case kEthernet:
-//      type_string = kNetworkTypeEthernet;
-//      break;
-//    case kUnknown:
-//      type_string = kNetworkTypeUnknown;
-//      break;
-//    default:
-//      LoggerE("Incorrect type: %d", type);
-//      return PlatformResult(ErrorCode::TYPE_MISMATCH_ERR, "Incorrect type");
-//  }
-//  return PlatformResult(ErrorCode::NO_ERROR);
-//}
-//
-//PlatformResult SystemInfoPropertiesManager::ReportNetwork(picojson::object* out) {
-//  connection_h connection_handle = nullptr;
-//  connection_type_e connection_type = CONNECTION_TYPE_DISCONNECTED;
-//  int networkType = 0;
-//  NetworkType type = kNone;
-//
-//  //connection must be created in every call, in other case error occurs
-//  int error = connection_create(&connection_handle);
-//  if (CONNECTION_ERROR_NONE != error) {
-//    std::string log_msg = "Cannot create connection: " + std::to_string(error);
-//    LoggerE("%s", log_msg.c_str());
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-//  }
-//  std::unique_ptr<std::remove_pointer<connection_h>::type, int(*)(connection_h)>
-//  connection_handle_ptr(connection_handle, &connection_destroy);
-//  // automatically release the memory
-//
-//  error = connection_get_type(connection_handle, &connection_type);
-//  if (CONNECTION_ERROR_NONE != error) {
-//    std::string log_msg = "Cannot get connection type: " + std::to_string(error);
-//    LoggerE("%s", log_msg.c_str());
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-//  }
-//
-//  switch (connection_type) {
-//    case CONNECTION_TYPE_DISCONNECTED :
-//      type = kNone;
-//      break;
-//    case CONNECTION_TYPE_WIFI :
-//      type =  kWifi;
-//      break;
-//    case CONNECTION_TYPE_CELLULAR :
-//      if (vconf_get_int(VCONFKEY_TELEPHONY_SVCTYPE, &networkType) == 0) {
-//        if (networkType < VCONFKEY_TELEPHONY_SVCTYPE_2G) {
-//          type =  kNone;
-//        } else if (networkType == VCONFKEY_TELEPHONY_SVCTYPE_2G) {
-//          type =  kType2G;
-//        } else if (networkType == VCONFKEY_TELEPHONY_SVCTYPE_2G
-//            || networkType == VCONFKEY_TELEPHONY_SVCTYPE_2_5G_EDGE) {
-//          type =  kType2_5G;
-//        } else if (networkType == VCONFKEY_TELEPHONY_SVCTYPE_3G
-//            || networkType == VCONFKEY_TELEPHONY_SVCTYPE_HSDPA) {
-//          type =  kType3G;
-//        } else if (networkType == VCONFKEY_TELEPHONY_SVCTYPE_LTE) {
-//          type =  kType4G;
-//        } else {
-//          type =  kNone;
-//        }
-//      }
-//      break;
-//    case CONNECTION_TYPE_ETHERNET :
-//      type =  kEthernet;
-//      break;
-//    default:
-//      LoggerE("Incorrect type: %d", connection_type);
-//      return PlatformResult(ErrorCode::UNKNOWN_ERR, "Incorrect type");
-//  }
-//  std::string type_str = "";
-//  PlatformResult ret = GetNetworkTypeString(type, type_str);
-//  if(ret.IsError()) {
-//    return ret;
-//  }
-//  out.insert(std::make_pair("networkType", picojson::value(type_str)));
-//  return PlatformResult(ErrorCode::NO_ERROR);
-//}
-//
-//static PlatformResult GetIps(wifi_ap_h wifi_ap_handle, std::string* ip_addr_str,
-//                   std::string* ipv6_addr_str){
-//  //getting ipv4 address
-//  char* ip_addr = nullptr;
-//  int error = wifi_ap_get_ip_address(wifi_ap_handle,
-//                                     WIFI_ADDRESS_FAMILY_IPV4,
-//                                     &ip_addr);
-//  if (WIFI_ERROR_NONE != error) {
-//    LoggerE("Failed to get ip address: %d", error);
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get ip address");
-//  }
-//  *ip_addr_str = ip_addr;
-//  free(ip_addr);
-//
-//  //getting ipv6 address
-//  ip_addr = nullptr;
-//  error = wifi_ap_get_ip_address(wifi_ap_handle,
-//                                 WIFI_ADDRESS_FAMILY_IPV6,
-//                                 &ip_addr);
-//  if (WIFI_ERROR_NONE != error) {
-//    LoggerE("Failed to get ipv6 address: %d", error);
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get ipv6 address");
-//  }
-//  *ipv6_addr_str = ip_addr;
-//  free(ip_addr);
-//  return PlatformResult(ErrorCode::NO_ERROR);
-//}
-//
-//PlatformResult SystemInfoPropertiesManager::ReportWifiNetwork(picojson::object* out) {
-//  LoggerD("Entered");
-//
-//  bool result_status = false;
-//  std::string result_ssid;
-//  std::string result_ip_address;
-//  std::string result_ipv6_address;
-//  std::string result_mac_address;
-//  double result_signal_strength = 0;
-//
-//  // wifi_initialize() must be called in each thread
-//  int error = wifi_initialize();
-//  if (WIFI_ERROR_NONE != error) {
-//    std::string log_msg = "Initialize failed: " + parseWifiNetworkError(error);
-//    LoggerE("%s", log_msg.c_str());
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-//  } else {
-//    LoggerD("WIFI initializatino succeed");
-//  }
-//  SCOPE_EXIT {
-//    wifi_deinitialize();
-//  };
-//
-//  wifi_ap_h wifi_ap_handle = nullptr;
-//  error = wifi_get_connected_ap(&wifi_ap_handle);
-//  if (WIFI_ERROR_NONE != error) {
-//    LoggerD("Error while wifi_get_connnected_ap: %s", parseWifiNetworkError(error).c_str());
-//    // in case of no connection, ignore error and leave status as false
-//    if (WIFI_ERROR_NO_CONNECTION != error) {
-//      std::string log_msg = "Cannot get connected access point handle: " + parseWifiNetworkError(error);
-//      LoggerE("%s", log_msg.c_str());
-//      return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-//    }
-//  } else {
-//    //if getting connected AP succeed, set status on true
-//    result_status = true;
-//  }
-//
-//  if (result_status) {
-//    std::unique_ptr<std::remove_pointer<wifi_ap_h>::type, int(*)(wifi_ap_h)>
-//    wifi_ap_handle_ptr(wifi_ap_handle, &wifi_ap_destroy);
-//    // automatically release the memory
-//
-//    //gathering mac address
-//    char* mac = nullptr;
-//    error = wifi_get_mac_address(&mac);
-//    if (WIFI_ERROR_NONE == error && nullptr != mac) {
-//      SLoggerD("MAC address fetched: %s", mac);
-//      result_mac_address = mac;
-//      free(mac);
-//    } else {
-//      std::string log_msg = "Failed to get mac address: " + parseWifiNetworkError(error);
-//      LoggerE("%s", log_msg.c_str());
-//      return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-//    }
-//
-//    //refreshing access point information
-//    error = wifi_ap_refresh(wifi_ap_handle);
-//    if (WIFI_ERROR_NONE != error) {
-//      std::string log_msg = "Failed to refresh access point information: " + parseWifiNetworkError(error);
-//      LoggerE("%s", log_msg.c_str());
-//      return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-//    }
-//
-//    //gathering ssid
-//    char* essid = nullptr;
-//    error = wifi_ap_get_essid(wifi_ap_handle, &essid);
-//    if (WIFI_ERROR_NONE == error) {
-//      result_ssid = essid;
-//      free(essid);
-//    } else {
-//      std::string log_msg = "Failed to get network ssid: " + parseWifiNetworkError(error);
-//      LoggerE("%s", log_msg.c_str());
-//      return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-//    }
-//
-//    //gathering ips
-//    PlatformResult ret = GetIps(wifi_ap_handle, &result_ip_address, &result_ipv6_address);
-//    if (ret.IsError()) {
-//      return ret;
-//    }
-//
-//    //gathering strength
-//    wifi_rssi_level_e rssi_level = system_info_listeners.GetWifiLevel();
-//    // this mean that level was not initialized or wifi not connected
-//    if (WIFI_RSSI_LEVEL_0 == rssi_level) {
-//      // so try to gather rssi level with dedicated function
-//      int rssi = 0;
-//      error = wifi_ap_get_rssi(wifi_ap_handle, &rssi);
-//      if (WIFI_ERROR_NONE == error) {
-//        result_signal_strength = ((double) abs(rssi))/kWifiSignalStrengthDivideValue;
-//      } else {
-//        std::string log_msg = "Failed to get signal strength: " + parseWifiNetworkError(error);
-//        LoggerE("%s", log_msg.c_str());
-//        return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-//      }
-//    } else {
-//      result_signal_strength = ((double) rssi_level)/WIFI_RSSI_LEVEL_4;
-//    }
-//  }
-//  //building result object
-//  out.insert(std::make_pair("status", picojson::value(result_status ? kWifiStatusOn : kWifiStatusOff)));
-//  out.insert(std::make_pair("ssid", picojson::value(result_ssid)));
-//  out.insert(std::make_pair("ipAddress", picojson::value(result_ip_address)));
-//  out.insert(std::make_pair("ipv6Address", picojson::value(result_ipv6_address)));
-//  out.insert(std::make_pair("macAddress", picojson::value(result_mac_address)));
-//  out.insert(std::make_pair("signalStrength", picojson::value(std::to_string(result_signal_strength))));
-//
-//  return PlatformResult(ErrorCode::NO_ERROR);
-//}
-//
-//PlatformResult SystemInfoPropertiesManager::ReportEthernetNetwork(picojson::object* out) {
-//  LoggerD("Entered");
-//
-//  std::string result_cable;
-//  std::string result_status;
-//  std::string result_ip_address;
-//  std::string result_ipv6_address;
-//  std::string result_mac_address;
-//
-//  connection_h connection_handle = nullptr;
-//  connection_ethernet_state_e connection_state = CONNECTION_ETHERNET_STATE_DEACTIVATED;
-//  connection_type_e connection_type = CONNECTION_TYPE_DISCONNECTED;
-//  connection_profile_h profile_handle = nullptr;
-//
-//  // connection must be created in every call, in other case error occurs
-//  int error = connection_create(&connection_handle);
-//  if (CONNECTION_ERROR_NONE != error) {
-//    std::string log_msg = "Cannot create connection: " + std::to_string(error);
-//    LoggerE("%s", log_msg.c_str());
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-//  }
-//  std::unique_ptr<std::remove_pointer<connection_h>::type, int (*)(connection_h)> connection_handle_ptr(
-//      connection_handle, &connection_destroy);  // automatically release the memory
-//
-//  error = connection_get_ethernet_state(connection_handle, &connection_state);
-//  if (CONNECTION_ERROR_NONE != error) {
-//    if (CONNECTION_ERROR_NOT_SUPPORTED == error) {
-//      std::string log_msg = "Cannot get ethernet connection state: Not supported";
-//      LoggerE("%s", log_msg.c_str());
-//      return PlatformResult(ErrorCode::NOT_SUPPORTED_ERR, log_msg);
-//    }
-//    std::string log_msg = "Cannot get ethernet connection state: " + std::to_string(error);
-//    LoggerE("%s", log_msg.c_str());
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-//  }
-//
-//  switch (connection_state) {
-//    case CONNECTION_ETHERNET_STATE_DEACTIVATED:
-//      result_status = "DEACTIVATED";
-//      break;
-//
-//    case CONNECTION_ETHERNET_STATE_DISCONNECTED:
-//      result_status = "DISCONNECTED";
-//      break;
-//
-//    case CONNECTION_ETHERNET_STATE_CONNECTED:
-//      result_status = "CONNECTED";
-//      break;
-//
-//    default:
-//      result_status = "UNKNOWN";
-//      break;
-//  }
-//
-//  connection_ethernet_cable_state_e cable_state = CONNECTION_ETHERNET_CABLE_DETACHED;
-//  error = connection_get_ethernet_cable_state(connection_handle, &cable_state);
-//  if (CONNECTION_ERROR_NONE != error) {
-//    std::string log_msg = "Cannot get ethernet cable state: " + std::to_string(error);
-//    LoggerE("%s", log_msg.c_str());
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-//  }
-//
-//  switch (cable_state) {
-//    case CONNECTION_ETHERNET_CABLE_DETACHED:
-//      result_cable = "DETACHED";
-//      break;
-//
-//    case CONNECTION_ETHERNET_CABLE_ATTACHED:
-//      result_cable = "ATTACHED";
-//      break;
-//
-//    default:
-//      result_cable = "UNKNOWN";
-//      break;
-//  }
-//
-//  char* mac = nullptr;
-//  error = connection_get_mac_address(connection_handle, CONNECTION_TYPE_ETHERNET, &mac);
-//  if (CONNECTION_ERROR_NONE == error && nullptr != mac) {
-//    SLoggerD("MAC address fetched: %s", mac);
-//    result_mac_address = mac;
-//    free(mac);
-//  } else {
-//    std::string log_msg = "Failed to get mac address: " + std::to_string(error);
-//    LoggerE("%s", log_msg.c_str());
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-//  }
-//
-//  error = connection_get_type(connection_handle, &connection_type);
-//  if (CONNECTION_ERROR_NONE != error) {
-//    std::string log_msg = "Cannot get connection type: " + std::to_string(error);
-//    LoggerE("%s", log_msg.c_str());
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-//  }
-//
-//  if (CONNECTION_TYPE_ETHERNET == connection_type) {
-//    //gathering profile
-//    error = connection_get_current_profile(connection_handle, &profile_handle);
-//    if (CONNECTION_ERROR_NONE != error) {
-//      std::string log_msg = "Cannot get connection profile: " + std::to_string(error);
-//      LoggerE("%s", log_msg.c_str());
-//      return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-//    }
-//    std::unique_ptr<std::remove_pointer<connection_profile_h>::type,
-//        int (*)(connection_profile_h)> profile_handle_ptr(
-//        profile_handle, &connection_profile_destroy); // automatically release the memory
-//
-//    //gathering ips
-//    PlatformResult ret = GetIps(profile_handle, &result_ip_address, &result_ipv6_address);
-//    if (ret.IsError()) {
-//      return ret;
-//    }
-//  } else {
-//    LoggerD("Connection type = %d. ETHERNET is disabled", connection_type);
-//  }
-//
-//  out.insert(std::make_pair("cable", picojson::value(result_cable)));
-//  out.insert(std::make_pair("status", picojson::value(result_status)));
-//  out.insert(std::make_pair("ipAddress", picojson::value(result_ip_address)));
-//  out.insert(std::make_pair("ipv6Address", picojson::value(result_ipv6_address)));
-//  out.insert(std::make_pair("macAddress", picojson::value(result_mac_address)));
-//
-//  return PlatformResult(ErrorCode::NO_ERROR);
-//}
-//
-//static PlatformResult FetchBasicSimProperties(TapiHandle *tapi_handle,
-//    unsigned short *result_mcc,
-//    unsigned short *result_mnc,
-//    unsigned short *result_cell_id,
-//    unsigned short *result_lac,
-//    bool *result_is_roaming,
-//    bool *result_is_flight_mode)
-//{
-//  LoggerD("Entered");
-//  int result_value = 0;
-//  int tapi_res = TAPI_API_SUCCESS;
-//  tapi_res = tel_get_property_int(tapi_handle, TAPI_PROP_NETWORK_PLMN, &result_value);
-//  if (TAPI_API_SUCCESS != tapi_res) {
-//    std::string error_msg = "Cannot get mcc value, error: " + std::to_string(tapi_res);
-//    LoggerE("%s", error_msg.c_str());
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
-//  }
-//  *result_mcc = static_cast<unsigned short>(result_value) / kMccDivider;
-//  *result_mnc = static_cast<unsigned short>(result_value) % kMccDivider;
-//
-//  tapi_res = tel_get_property_int(tapi_handle, TAPI_PROP_NETWORK_CELLID, &result_value);
-//  if (TAPI_API_SUCCESS != tapi_res) {
-//    std::string error_msg = "Cannot get cell_id value, error: " + std::to_string(tapi_res);
-//    LoggerE("%s", error_msg.c_str());
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
-//  }
-//  *result_cell_id = static_cast<unsigned short>(result_value);
-//
-//  tapi_res = tel_get_property_int(tapi_handle, TAPI_PROP_NETWORK_LAC, &result_value);
-//  if (TAPI_API_SUCCESS != tapi_res) {
-//    std::string error_msg = "Cannot get lac value, error: " + std::to_string(tapi_res);
-//    LoggerE("%s", error_msg.c_str());
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
-//  }
-//  *result_lac = static_cast<unsigned short>(result_value);
-//
-//  tapi_res = tel_get_property_int(tapi_handle, TAPI_PROP_NETWORK_ROAMING_STATUS, &result_value);
-//  if (TAPI_API_SUCCESS != tapi_res) {
-//    std::string error_msg = "Cannot get is_roaming value, error: " + std::to_string(tapi_res);
-//    LoggerE("%s", error_msg.c_str());
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
-//  }
-//  *result_is_roaming = (0 != result_value) ? true : false;
-//
-//  if (0 != vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &result_value)) {
-//    LoggerE("Cannot get is_flight_mode value");
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get is_flight_mode value");
-//  }
-//  *result_is_flight_mode = (0 != result_value) ? true : false;
-//  return PlatformResult(ErrorCode::NO_ERROR);
-//}
-//
-//static PlatformResult FetchConnection(TapiHandle *tapi_handle, std::string* result_status,
-//                            std::string* result_apn, std::string* result_ip_address,
-//                            std::string* result_ipv6_address, std::string* result_imei)
-//{
-//  LoggerD("Entered");
-//  connection_type_e connection_type = CONNECTION_TYPE_DISCONNECTED;
-//  connection_profile_h profile_handle = nullptr;
-//  connection_h connection_handle = nullptr;
-//
-//  //connection must be created in every call, in other case error occurs
-//  int error = connection_create(&connection_handle);
-//  if (CONNECTION_ERROR_NONE != error) {
-//    std::string log_msg = "Cannot create connection: " + std::to_string(error);
-//    LoggerE("%s", log_msg.c_str());
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
-//  }
-//  std::unique_ptr<std::remove_pointer<connection_h>::type, int(*)(connection_h)>
-//  connection_handle_ptr(connection_handle, &connection_destroy);
-//  // automatically release the memory
-//
-//  error = connection_get_type(connection_handle, &connection_type);
-//  if (CONNECTION_ERROR_NONE != error) {
-//    LoggerE("Failed to get connection type: %d", error);
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get connection type");
-//  }
-//
-//  char* apn = nullptr;
-//  if (CONNECTION_TYPE_CELLULAR == connection_type) {
-//    *result_status = kConnectionOn;
-//
-//    error = connection_get_current_profile(connection_handle,
-//                                           &profile_handle);
-//    std::unique_ptr
-//    <std::remove_pointer<connection_profile_h>::type, int(*)(connection_profile_h)>
-//    profile_handle_ptr(profile_handle, &connection_profile_destroy);
-//    // automatically release the memory
-//    if (CONNECTION_ERROR_NONE != error) {
-//      LoggerE("Failed to get profile: %d", error);
-//      return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get profile");
-//    }
-//
-//    error = connection_profile_get_cellular_apn(profile_handle, &apn);
-//    if (CONNECTION_ERROR_NONE != error) {
-//      LoggerE("Failed to get apn name: %d", error);
-//      return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get apn name");
-//    }
-//    *result_apn = apn;
-//    free(apn);
-//
-//    PlatformResult ret = GetIps(profile_handle, result_ip_address, result_ipv6_address);
-//    if (ret.IsError()) {
-//      return ret;
-//    }
-//  } else {
-//    *result_status = kConnectionOff;
-//
-//    //According to previous implementation in case of error
-//    //don't throw exception here
-//    error = connection_get_default_cellular_service_profile(
-//        connection_handle,
-//        CONNECTION_CELLULAR_SERVICE_TYPE_INTERNET,
-//        &profile_handle);
-//    std::unique_ptr
-//    <std::remove_pointer<connection_profile_h>::type, int(*)(connection_profile_h)>
-//    profile_handle_ptr(profile_handle, &connection_profile_destroy);
-//    // automatically release the memory
-//    if (CONNECTION_ERROR_NONE == error) {
-//      error = connection_profile_get_cellular_apn(profile_handle, &apn);
-//      if (CONNECTION_ERROR_NONE == error) {
-//        *result_apn = apn;
-//        free(apn);
-//      } else {
-//        LoggerE("Failed to get default apn name: %d. Failing silently",
-//             error);
-//      }
-//    } else {
-//      LoggerE("Failed to get default profile: %d. Failing silently",
-//           error);
-//    }
-//  }
-//
-//  char* imei = nullptr;
-//  imei = tel_get_misc_me_imei_sync(tapi_handle);
-//  if (nullptr != imei) {
-//    *result_imei = imei;
-//    free(imei);
-//  } else {
-//    LoggerE("Failed to get imei, nullptr pointer. Setting empty value.");
-//    *result_imei = "";
-//  }
-//  return PlatformResult(ErrorCode::NO_ERROR);
-//}
-//
-//PlatformResult SystemInfoPropertiesManager::ReportCellularNetwork(picojson::object* out, unsigned long count) {
-//  PlatformResult ret = CheckTelephonySupport();
-//  if (ret.IsError()) {
-//    return ret;
-//  }
-//  std::string result_status;
-//  std::string result_apn;
-//  std::string result_ip_address;
-//  std::string result_ipv6_address;
-//  unsigned short result_mcc;
-//  unsigned short result_mnc;
-//  unsigned short result_cell_id;
-//  unsigned short result_lac;
-//  bool result_is_roaming;
-//  bool result_is_flight_mode;
-//  std::string result_imei;
-//
-//  //gathering vconf-based values
-//  ret = FetchBasicSimProperties(system_info_listeners.GetTapiHandles()[count], &result_mcc,
-//                           &result_mnc, &result_cell_id, &result_lac,
-//                           &result_is_roaming, &result_is_flight_mode);
-//  if (ret.IsError()) {
-//    return ret;
-//  }
-//  //gathering connection informations
-//  ret = FetchConnection(system_info_listeners.GetTapiHandles()[count],
-//                  &result_status, &result_apn, &result_ip_address, &result_ipv6_address, &result_imei);
-//  if (ret.IsError()) {
-//    return ret;
-//  }
-//
-//  out.insert(std::make_pair("status", picojson::value(result_status)));
-//  out.insert(std::make_pair("apn", picojson::value(result_apn)));
-//  out.insert(std::make_pair("ipAddress", picojson::value(result_ip_address)));
-//  out.insert(std::make_pair("ipv6Address", picojson::value(result_ipv6_address)));
-//  out.insert(std::make_pair("mcc", picojson::value(std::to_string(result_mcc))));
-//  out.insert(std::make_pair("mnc", picojson::value(std::to_string(result_mnc))));
-//  out.insert(std::make_pair("cellId", picojson::value(std::to_string(result_cell_id))));
-//  out.insert(std::make_pair("lac", picojson::value(std::to_string(result_lac))));
-//  out.insert(std::make_pair("isRoaming", picojson::value(result_is_roaming)));
-//  out.insert(std::make_pair("isFligthMode", picojson::value(result_is_flight_mode)));
-//  out.insert(std::make_pair("imei", picojson::value(result_imei)));
-//  return PlatformResult(ErrorCode::NO_ERROR);
-//}
-//
-//void SimCphsValueCallback(TapiHandle */*handle*/, int result, void *data, void */*user_data*/)
-//{
-//  LoggerD("Entered");
-//  TelSimAccessResult_t access_rt = static_cast<TelSimAccessResult_t>(result);
-//  TelSimCphsNetName_t *cphs_info = static_cast<TelSimCphsNetName_t*>(data);
-//
-//  std::string result_operator;
-//  if (TAPI_SIM_ACCESS_SUCCESS == access_rt) {
-//    std::stringstream s;
-//    s << cphs_info->full_name;
-//    if (s.str().empty()) {
-//      s << cphs_info->short_name;
-//    }
-//    result_operator = s.str();
-//  } else {
-//    LoggerW("Failed to retrieve cphs_info: %d", access_rt);
-//  }
-//  sim_mgr.set_operator_name(result_operator);
-//  sim_mgr.TryReturn();
-//}
-//
-//void SimMsisdnValueCallback(TapiHandle */*handle*/, int result, void *data, void */*user_data*/)
-//{
-//  LoggerD("Entered");
-//  TelSimAccessResult_t access_rt = static_cast<TelSimAccessResult_t>(result);
-//  TelSimMsisdnList_t *msisdn_info = static_cast<TelSimMsisdnList_t*>(data);
-//
-//  std::string result_msisdn;
-//  if (TAPI_SIM_ACCESS_SUCCESS == access_rt) {
-//    if (msisdn_info->count > 0) {
-//      if (strlen(msisdn_info->list[0].num) > 0) {
-//        result_msisdn = msisdn_info->list[0].num;
-//      } else {
-//        LoggerW("MSISDN number empty");
-//      }
-//    } else {
-//      LoggerW("msisdn_info list empty");
-//    }
-//  } else {
-//    LoggerW("Failed to retrieve msisdn_: %d", access_rt);
-//  }
-//
-//  sim_mgr.set_msisdn(result_msisdn);
-//  sim_mgr.TryReturn();
-//}
-//
-//void SimSpnValueCallback(TapiHandle */*handle*/, int result, void *data, void */*user_data*/)
-//{
-//  LoggerD("Entered");
-//  TelSimAccessResult_t access_rt = static_cast<TelSimAccessResult_t>(result);
-//  TelSimSpn_t *spn_info = static_cast<TelSimSpn_t*>(data);
-//
-//  std::string result_spn;
-//  if (TAPI_SIM_ACCESS_SUCCESS == access_rt) {
-//    result_spn = (char *)spn_info->spn;
-//  } else {
-//    LoggerW("Failed to retrieve spn_: %d", access_rt);
-//  }
-//
-//  sim_mgr.set_spn(result_spn);
-//  sim_mgr.TryReturn();
-//}
-//
-//PlatformResult SystemInfoPropertiesManager::ReportSim(picojson::object* out, unsigned long count) {
-//  PlatformResult ret = CheckTelephonySupport();
-//  if (ret.IsError()) {
-//    return ret;
-//  }
-//  return sim_mgr.GatherSimInformation(
-//      system_info_listeners.GetTapiHandles()[count], &out);
-//}
-//
-//PlatformResult SystemInfoPropertiesManager::ReportPeripheral(picojson::object* out) {
-//
-///*  int wireless_display_status = 0;
-//  PlatformResult ret = GetVconfInt(VCONFKEY_MIRACAST_WFD_SOURCE_STATUS, wireless_display_status);
-//  if (ret.IsSuccess()) {
-//    if (VCONFKEY_MIRACAST_WFD_SOURCE_ON == wireless_display_status) {
-//      out.insert(std::make_pair(kVideoOutputString, picojson::value(true)));
-//      return PlatformResult(ErrorCode::NO_ERROR);
-//    }
-//  }*/
-//  int hdmi_status = 0;
-//  PlatformResult ret = GetVconfInt(VCONFKEY_SYSMAN_HDMI, hdmi_status);
-//  if (ret.IsSuccess()) {
-//    if (VCONFKEY_SYSMAN_HDMI_CONNECTED == hdmi_status) {
-//      out.insert(std::make_pair(kVideoOutputString, picojson::value(true)));
-//      return PlatformResult(ErrorCode::NO_ERROR);
-//    }
-//  }
-//
-//  out.insert(std::make_pair(kVideoOutputString, picojson::value(false)));
-//  return PlatformResult(ErrorCode::NO_ERROR);
-//}
-//
-//PlatformResult SystemInfoPropertiesManager::ReportMemory(picojson::object* out) {
-//  std::string state = MEMORY_STATE_NORMAL;
-//  int status = 0;
-//  PlatformResult ret = GetVconfInt(VCONFKEY_SYSMAN_LOW_MEMORY, status);
-//  if (ret.IsSuccess()) {
-//    switch (status) {
-//      case VCONFKEY_SYSMAN_LOW_MEMORY_SOFT_WARNING:
-//      case VCONFKEY_SYSMAN_LOW_MEMORY_HARD_WARNING:
-//        state = MEMORY_STATE_WARNING;
-//        break;
-//      case VCONFKEY_SYSMAN_LOW_MEMORY_NORMAL:
-//      default:
-//        state = MEMORY_STATE_NORMAL;
-//    }
-//  }
-//
-//  out.insert(std::make_pair("state", picojson::value(state)));
-//  return PlatformResult(ErrorCode::NO_ERROR);
-//}
-//
-//static void CreateStorageInfo(const std::string& type, struct statfs& fs, picojson::object* out) {
-//  out->insert(std::make_pair("type", picojson::value(type)));
-//  out->insert(std::make_pair("capacity", picojson::value(std::to_string(
-//      static_cast<unsigned long long>(fs.f_bsize) *
-//      static_cast<unsigned long long>(fs.f_blocks)))));
-//  out->insert(std::make_pair("availableCapacity", picojson::value(std::to_string(
-//      static_cast<unsigned long long>(fs.f_bsize) *
-//      static_cast<unsigned long long>(fs.f_bavail)))));
-//  bool isRemovable = (type == kTypeInternal) ? false : true;
-//  out->insert(std::make_pair("isRemovable", picojson::value(isRemovable)));
-//}
-//
-//PlatformResult SystemInfoPropertiesManager::ReportStorage(picojson::object* out) {
-//  int sdcardState = 0;
-//  struct statfs fs;
-//
-//  picojson::value result = picojson::value(picojson::array());
-//
-//  picojson::array& array = result.get<picojson::array>();
-//  array.push_back(picojson::value(picojson::object()));
-//  picojson::object& internal_obj = array.back().get<picojson::object>();
-//
-//  if (statfs(kStorageInternalPath, &fs) < 0) {
-//    LoggerE("There are no storage units detected");
-//    return PlatformResult(ErrorCode::UNKNOWN_ERR, "There are no storage units detected");
-//  }
-//  CreateStorageInfo(kTypeInternal, fs, &internal_obj);
-//  system_info_listeners.SetAvailableCapacityInternal(fs.f_bavail);
-//
-//  if (0 == vconf_get_int(VCONFKEY_SYSMAN_MMC_STATUS, &sdcardState)) {
-//    if (VCONFKEY_SYSMAN_MMC_MOUNTED == sdcardState){
-//      if (statfs(kStorageSdcardPath, &fs) < 0) {
-//        LoggerE("MMC mounted, but not accessible");
-//        return PlatformResult(ErrorCode::UNKNOWN_ERR, "MMC mounted, but not accessible");
-//      }
-//      array.push_back(picojson::value(picojson::object()));
-//      picojson::object& external_obj = array.back().get<picojson::object>();
-//      CreateStorageInfo(kTypeMmc, fs, &external_obj);
-//      system_info_listeners.SetAvailableCapacityMmc(fs.f_bavail);
-//    }
-//  }
-//
-//  out.insert(std::make_pair("storages", picojson::value(result)));
-//  return PlatformResult(ErrorCode::NO_ERROR);
-//}
-//PlatformResult SystemInfoPropertiesManager::ReportCameraFlash(picojson::object* out) {
-//    PlatformResult ret = CheckCameraFlashSupport();
-//    if (ret.IsError()) {
-//      return ret;
-//    }
-//    return PlatformResult(ErrorCode::NO_ERROR);
-//}
+
+/// CPU
+PlatformResult SysteminfoPropertiesManager::ReportCpu(picojson::object* out) {
+  LoggerD("Entered");
+  static CpuInfo cpu_info;
+  FILE *fp = nullptr;
+  fp = fopen("/proc/stat", "r");
+  if (nullptr == fp) {
+    std::string error_msg("Can not open /proc/stat for reading");
+    LoggerE( "%s", error_msg.c_str() );
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
+  }
+
+  long long usr = 0;
+  long long system = 0;
+  long long nice = 0;
+  long long idle = 0;
+  double load = 0;
+
+  int read_ret = fscanf( fp, "%*s %lld %lld %lld %lld", &usr, &system, &nice, &idle);
+  fclose(fp);
+
+  if (4 == read_ret) {
+    long long total = usr + nice + system + idle - cpu_info.usr - cpu_info.nice -
+        cpu_info.system - cpu_info.idle;
+    long long diff_idle = idle - cpu_info.idle;
+    if (( total > 0LL ) && ( diff_idle > 0LL )) {
+      load = static_cast< double >( diff_idle ) * 100LL / total;
+      cpu_info.usr = usr;
+      cpu_info.system = system;
+      cpu_info.nice = nice;
+      cpu_info.idle = idle;
+      cpu_info.load = load;
+    } else {
+      LoggerW("Cannot calculate cpu load, previous value returned");
+      load = cpu_info.load;
+    }
+  } else {
+    std::string error_msg( "Could not read /proc/stat" );
+    LoggerE( "%s", error_msg.c_str() );
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
+  }
+
+  manager_.SetCpuInfoLoad(cpu_info.load);
+
+  load = 100 - load;
+  LoggerD("Cpu load : %f", load );
+  out->insert(std::make_pair("load", picojson::value(load / 100.0)));
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+/// DISPLAY
+PlatformResult SysteminfoPropertiesManager::ReportDisplay(picojson::object* out) {
+  int screenWidth = 0;
+  int screenHeight = 0;
+  int dotsPerInchWidth = 0;
+  int dotsPerInchHeight = 0;
+  double physicalWidth = 0;
+  double physicalHeight = 0;
+  double scaledBrightness;
+
+  // FETCH RESOLUTION
+  if (SYSTEM_INFO_ERROR_NONE != system_info_get_platform_int(
+      "tizen.org/feature/screen.width", &screenWidth)) {
+    LoggerE("Cannot get value of screen width");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get value of screen width");
+  }
+  if (SYSTEM_INFO_ERROR_NONE != system_info_get_platform_int(
+      "tizen.org/feature/screen.height", &screenHeight)) {
+    LoggerE("Cannot get value of screen height");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get value of screen height");
+  }
+
+  //FETCH DOTS PER INCH
+  int dots_per_inch=0;
+  if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_int(
+      "tizen.org/feature/screen.dpi", &dots_per_inch)) {
+    dotsPerInchWidth = dots_per_inch;
+    dotsPerInchHeight = dots_per_inch;
+  } else {
+    LoggerE("Cannot get 'tizen.org/feature/screen.dpi' value");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "Cannot get 'tizen.org/feature/screen.dpi' value");
+  }
+
+  //FETCH PHYSICAL WIDTH
+  if (dotsPerInchWidth != 0 && screenWidth != 0) {
+    physicalWidth = (screenWidth / dotsPerInchWidth) * kDisplayInchToMillimeter;
+  } else {
+    std::string log_msg = "Failed to get physical screen width value";
+    LoggerE("%s, screenWidth : %d, dotsPerInchWidth: %d", log_msg.c_str(),
+         screenWidth, dotsPerInchWidth);
+  }
+
+  //FETCH PHYSICAL HEIGHT
+  if (dotsPerInchHeight != 0 && screenHeight != 0) {
+    physicalHeight = (screenHeight / dotsPerInchHeight) * kDisplayInchToMillimeter;
+  } else {
+    std::string log_msg = "Failed to get physical screen height value";
+    LoggerE("%s, screenHeight : %d, dotsPerInchHeight: %d", log_msg.c_str(),
+         screenHeight, dotsPerInchHeight);
+  }
+
+  //FETCH BRIGHTNESS
+  int brightness;
+  if (kVconfErrorNone == vconf_get_int(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, &brightness)) {
+    scaledBrightness = static_cast<double>(brightness)/kDisplayBrightnessDivideValue;
+  } else {
+    LoggerE("Cannot get brightness value of display");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get brightness value of display");
+  }
+
+  out->insert(std::make_pair("resolutionWidth", picojson::value(std::to_string(screenWidth))));
+  out->insert(std::make_pair("resolutionHeight", picojson::value(std::to_string(screenHeight))));
+  out->insert(std::make_pair("dotsPerInchWidth", picojson::value(std::to_string(dotsPerInchWidth))));
+  out->insert(std::make_pair("dotsPerInchHeight", picojson::value(std::to_string(dotsPerInchHeight))));
+  out->insert(std::make_pair("physicalWidth", picojson::value(std::to_string(physicalWidth))));
+  out->insert(std::make_pair("physicalHeight", picojson::value(std::to_string(physicalHeight))));
+  out->insert(std::make_pair("brightness", picojson::value(scaledBrightness)));
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+/// DEVICE_ORIENTATION
+PlatformResult SysteminfoPropertiesManager::FetchIsAutoRotation(bool* result)
+{
+  LoggerD("Entered");
+  int is_auto_rotation = 0;
+
+  if ( 0 == vconf_get_bool(
+      VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, &is_auto_rotation)) {
+    if (is_auto_rotation) {
+      *result = true;
+    } else {
+      *result = false;
+    }
+    return PlatformResult(ErrorCode::NO_ERROR);
+  }
+  else {
+    LoggerE("VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL check failed");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL check failed");
+  }
+}
+
+PlatformResult SysteminfoPropertiesManager::FetchStatus(std::string* result)
+{
+  LoggerD("Entered");
+  int rotation = 0;
+  std::string status = kOrientationPortraitPrimary;
+
+  sensor_data_t data;
+  bool ret = sensord_get_data(manager_.GetSensorHandle(),
+                             AUTO_ROTATION_BASE_DATA_SET, &data);
+  if (ret) {
+    LoggerD("size of the data value array:%d", data.value_count);
+    if (data.value_count > 0 ) {
+      rotation = data.values[0];
+      LoggerD("rotation is: %d", rotation);
+    } else {
+      LoggerE("Failed to get data : the size of array is 0. Default rotation would be returned.");
+    }
+  } else {
+    LoggerE("Failed to get data(sensord_get_data). Default rotation would be returned.");
+  }
+
+
+  switch (rotation) {
+    case AUTO_ROTATION_DEGREE_UNKNOWN:
+    case AUTO_ROTATION_DEGREE_0:
+      LoggerD("AUTO_ROTATION_DEGREE_0");
+      status = kOrientationPortraitPrimary;
+      break;
+    case AUTO_ROTATION_DEGREE_90:
+      LoggerD("AUTO_ROTATION_DEGREE_90");
+      status = kOrientationLandscapePrimary;
+      break;
+    case AUTO_ROTATION_DEGREE_180:
+      LoggerD("AUTO_ROTATION_DEGREE_180");
+      status = kOrientationPortraitSecondary;
+      break;
+    case AUTO_ROTATION_DEGREE_270:
+      LoggerD("AUTO_ROTATION_DEGREE_270");
+      status = kOrientationLandscapeSecondary;
+      break;
+    default:
+      LoggerE("Received unexpected data: %u", rotation);
+      return PlatformResult(ErrorCode::UNKNOWN_ERR, "Received unexpected data");
+  }
+  *result = status;
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult SysteminfoPropertiesManager::ReportDeviceOrientation(picojson::object* out) {
+  bool is_auto_rotation = false;
+  std::string status = "";
+
+  PlatformResult ret = FetchIsAutoRotation(&is_auto_rotation);
+  if (ret.IsError()) return ret;
+
+  ret = FetchStatus(&status);
+  if (ret.IsError()) return ret;
+
+  out->insert(std::make_pair("isAutoRotation", picojson::value(is_auto_rotation)));
+  out->insert(std::make_pair("status", picojson::value(status)));
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+/// BUILD
+PlatformResult SysteminfoPropertiesManager::ReportBuild(picojson::object* out) {
+  std::string model = "";
+  PlatformResult ret = SystemInfoDeviceCapability::GetValueString(
+      "tizen.org/system/model_name", &model);
+  if (ret.IsError()) {
+    return ret;
+  }
+  std::string manufacturer = "";
+  ret = SystemInfoDeviceCapability::GetValueString(
+      "tizen.org/system/manufacturer", &manufacturer);
+  if (ret.IsError()) {
+    return ret;
+  }
+  std::string buildVersion = "";
+  ret = SystemInfoDeviceCapability::GetValueString(
+      "tizen.org/system/build.string", &buildVersion);
+  if (ret.IsError()) {
+    return ret;
+  }
+
+  out->insert(std::make_pair("model", picojson::value(model)));
+  out->insert(std::make_pair("manufacturer", picojson::value(manufacturer)));
+  out->insert(std::make_pair("buildVersion", picojson::value(buildVersion)));
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+/// LOCALE
+PlatformResult SysteminfoPropertiesManager::ReportLocale(picojson::object* out) {
+  std::string str_language = "";
+  PlatformResult ret = SysteminfoUtils::GetRuntimeInfoString(
+      SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &str_language);
+  if (ret.IsError()) {
+    return ret;
+  }
+
+  std::string str_country = "";
+  ret = SysteminfoUtils::GetRuntimeInfoString(SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY, &str_country);
+  if (ret.IsError()) {
+    return ret;
+  }
+
+  out->insert(std::make_pair("language", picojson::value(str_language)));
+  out->insert(std::make_pair("country", picojson::value(str_country)));
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+/// NETWORK
+static PlatformResult GetNetworkTypeString(NetworkType type, std::string& type_string)
+{
+  switch (type) {
+    case kNone:
+      type_string = kNetworkTypeNone;
+      break;
+    case kType2G:
+      type_string = kNetworkType2G;
+      break;
+    case kType2_5G:
+      type_string = kNetworkType2_5G;
+      break;
+    case kType3G:
+      type_string = kNetworkType3G;
+      break;
+    case kType4G:
+      type_string = kNetworkType4G;
+      break;
+    case kWifi:
+      type_string = kNetworkTypeWifi;
+      break;
+    case kEthernet:
+      type_string = kNetworkTypeEthernet;
+      break;
+    case kUnknown:
+      type_string = kNetworkTypeUnknown;
+      break;
+    default:
+      LoggerE("Incorrect type: %d", type);
+      return PlatformResult(ErrorCode::TYPE_MISMATCH_ERR, "Incorrect type");
+  }
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult SysteminfoPropertiesManager::ReportNetwork(picojson::object* out) {
+  connection_h connection_handle = nullptr;
+  connection_type_e connection_type = CONNECTION_TYPE_DISCONNECTED;
+  int networkType = 0;
+  NetworkType type = kNone;
+
+  //connection must be created in every call, in other case error occurs
+  int error = connection_create(&connection_handle);
+  if (CONNECTION_ERROR_NONE != error) {
+    std::string log_msg = "Cannot create connection: " + std::to_string(error);
+    LoggerE("%s", log_msg.c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+  }
+  std::unique_ptr<std::remove_pointer<connection_h>::type, int(*)(connection_h)>
+  connection_handle_ptr(connection_handle, &connection_destroy);
+  // automatically release the memory
+
+  error = connection_get_type(connection_handle, &connection_type);
+  if (CONNECTION_ERROR_NONE != error) {
+    std::string log_msg = "Cannot get connection type: " + std::to_string(error);
+    LoggerE("%s", log_msg.c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+  }
+
+  switch (connection_type) {
+    case CONNECTION_TYPE_DISCONNECTED :
+      type = kNone;
+      break;
+    case CONNECTION_TYPE_WIFI :
+      type =  kWifi;
+      break;
+    case CONNECTION_TYPE_CELLULAR :
+      if (vconf_get_int(VCONFKEY_TELEPHONY_SVCTYPE, &networkType) == 0) {
+        if (networkType < VCONFKEY_TELEPHONY_SVCTYPE_2G) {
+          type =  kNone;
+        } else if (networkType == VCONFKEY_TELEPHONY_SVCTYPE_2G) {
+          type =  kType2G;
+        } else if (networkType == VCONFKEY_TELEPHONY_SVCTYPE_2G
+            || networkType == VCONFKEY_TELEPHONY_SVCTYPE_2_5G_EDGE) {
+          type =  kType2_5G;
+        } else if (networkType == VCONFKEY_TELEPHONY_SVCTYPE_3G
+            || networkType == VCONFKEY_TELEPHONY_SVCTYPE_HSDPA) {
+          type =  kType3G;
+        } else if (networkType == VCONFKEY_TELEPHONY_SVCTYPE_LTE) {
+          type =  kType4G;
+        } else {
+          type =  kNone;
+        }
+      }
+      break;
+    case CONNECTION_TYPE_ETHERNET :
+      type =  kEthernet;
+      break;
+    default:
+      LoggerE("Incorrect type: %d", connection_type);
+      return PlatformResult(ErrorCode::UNKNOWN_ERR, "Incorrect type");
+  }
+  std::string type_str = "";
+  PlatformResult ret = GetNetworkTypeString(type, type_str);
+  if(ret.IsError()) {
+    return ret;
+  }
+  out->insert(std::make_pair("networkType", picojson::value(type_str)));
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+/// WIFI_NETWORK
+static PlatformResult GetIps(wifi_ap_h wifi_ap_handle, std::string* ip_addr_str,
+                   std::string* ipv6_addr_str){
+  //getting ipv4 address
+  char* ip_addr = nullptr;
+  int error = wifi_ap_get_ip_address(wifi_ap_handle,
+                                     WIFI_ADDRESS_FAMILY_IPV4,
+                                     &ip_addr);
+  if (WIFI_ERROR_NONE != error) {
+    LoggerE("Failed to get ip address: %d", error);
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get ip address");
+  }
+  *ip_addr_str = ip_addr;
+  free(ip_addr);
+
+  //getting ipv6 address
+  ip_addr = nullptr;
+  error = wifi_ap_get_ip_address(wifi_ap_handle,
+                                 WIFI_ADDRESS_FAMILY_IPV6,
+                                 &ip_addr);
+  if (WIFI_ERROR_NONE != error) {
+    LoggerE("Failed to get ipv6 address: %d", error);
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get ipv6 address");
+  }
+  *ipv6_addr_str = ip_addr;
+  free(ip_addr);
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult SysteminfoPropertiesManager::ReportWifiNetwork(picojson::object* out) {
+  LoggerD("Entered");
+
+  bool result_status = false;
+  std::string result_ssid;
+  std::string result_ip_address;
+  std::string result_ipv6_address;
+  std::string result_mac_address;
+  double result_signal_strength = 0;
+
+  // wifi_initialize() must be called in each thread
+  int error = wifi_initialize();
+  if (WIFI_ERROR_NONE != error) {
+    std::string log_msg = "Initialize failed: " + std::string(get_error_message(error));
+    LoggerE("%s", log_msg.c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+  } else {
+    LoggerD("WIFI initializatino succeed");
+  }
+  SCOPE_EXIT {
+    wifi_deinitialize();
+  };
+
+  wifi_ap_h wifi_ap_handle = nullptr;
+  error = wifi_get_connected_ap(&wifi_ap_handle);
+  if (WIFI_ERROR_NONE != error) {
+    LoggerD("Error while wifi_get_connnected_ap: %s", get_error_message(error));
+    // in case of no connection, ignore error and leave status as false
+    if (WIFI_ERROR_NO_CONNECTION != error) {
+      std::string log_msg = "Cannot get connected access point handle: " +
+          std::string(get_error_message(error));
+      LoggerE("%s", log_msg.c_str());
+      return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+    }
+  } else {
+    //if getting connected AP succeed, set status on true
+    result_status = true;
+  }
+
+  if (result_status) {
+    std::unique_ptr<std::remove_pointer<wifi_ap_h>::type, int(*)(wifi_ap_h)>
+    wifi_ap_handle_ptr(wifi_ap_handle, &wifi_ap_destroy);
+    // automatically release the memory
+
+    //gathering mac address
+    char* mac = nullptr;
+    error = wifi_get_mac_address(&mac);
+    if (WIFI_ERROR_NONE == error && nullptr != mac) {
+      SLoggerD("MAC address fetched: %s", mac);
+      result_mac_address = mac;
+      free(mac);
+    } else {
+      std::string log_msg = "Failed to get mac address: " + std::string(get_error_message(error));
+      LoggerE("%s", log_msg.c_str());
+      return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+    }
+
+    //refreshing access point information
+    error = wifi_ap_refresh(wifi_ap_handle);
+    if (WIFI_ERROR_NONE != error) {
+      std::string log_msg = "Failed to refresh access point information: " +
+          std::string(get_error_message(error));
+      LoggerE("%s", log_msg.c_str());
+      return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+    }
+
+    //gathering ssid
+    char* essid = nullptr;
+    error = wifi_ap_get_essid(wifi_ap_handle, &essid);
+    if (WIFI_ERROR_NONE == error) {
+      result_ssid = essid;
+      free(essid);
+    } else {
+      std::string log_msg = "Failed to get network ssid: " + std::string(get_error_message(error));
+      LoggerE("%s", log_msg.c_str());
+      return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+    }
+
+    //gathering ips
+    PlatformResult ret = GetIps(wifi_ap_handle, &result_ip_address, &result_ipv6_address);
+    if (ret.IsError()) {
+      return ret;
+    }
+
+    //gathering strength
+    wifi_rssi_level_e rssi_level = manager_.GetWifiLevel();
+    // this mean that level was not initialized or wifi not connected
+    if (WIFI_RSSI_LEVEL_0 == rssi_level) {
+      // so try to gather rssi level with dedicated function
+      int rssi = 0;
+      error = wifi_ap_get_rssi(wifi_ap_handle, &rssi);
+      if (WIFI_ERROR_NONE == error) {
+        result_signal_strength = ((double) abs(rssi))/kWifiSignalStrengthDivideValue;
+      } else {
+        std::string log_msg = "Failed to get signal strength: " +
+            std::string(get_error_message(error));
+        LoggerE("%s", log_msg.c_str());
+        return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+      }
+    } else {
+      result_signal_strength = ((double) rssi_level)/WIFI_RSSI_LEVEL_4;
+    }
+  }
+  //building result object
+  out->insert(std::make_pair("status", picojson::value(result_status ? kWifiStatusOn : kWifiStatusOff)));
+  out->insert(std::make_pair("ssid", picojson::value(result_ssid)));
+  out->insert(std::make_pair("ipAddress", picojson::value(result_ip_address)));
+  out->insert(std::make_pair("ipv6Address", picojson::value(result_ipv6_address)));
+  out->insert(std::make_pair("macAddress", picojson::value(result_mac_address)));
+  out->insert(std::make_pair("signalStrength", picojson::value(std::to_string(result_signal_strength))));
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+/// ETHERNET_NETWORK
+PlatformResult SysteminfoPropertiesManager::ReportEthernetNetwork(picojson::object* out) {
+  LoggerD("Entered");
+
+  std::string result_cable;
+  std::string result_status;
+  std::string result_ip_address;
+  std::string result_ipv6_address;
+  std::string result_mac_address;
+
+  connection_h connection_handle = nullptr;
+  connection_ethernet_state_e connection_state = CONNECTION_ETHERNET_STATE_DEACTIVATED;
+  connection_type_e connection_type = CONNECTION_TYPE_DISCONNECTED;
+  connection_profile_h profile_handle = nullptr;
+
+  // connection must be created in every call, in other case error occurs
+  int error = connection_create(&connection_handle);
+  if (CONNECTION_ERROR_NONE != error) {
+    std::string log_msg = "Cannot create connection: " + std::to_string(error);
+    LoggerE("%s", log_msg.c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+  }
+  std::unique_ptr<std::remove_pointer<connection_h>::type, int (*)(connection_h)> connection_handle_ptr(
+      connection_handle, &connection_destroy);  // automatically release the memory
+
+  error = connection_get_ethernet_state(connection_handle, &connection_state);
+  if (CONNECTION_ERROR_NONE != error) {
+    if (CONNECTION_ERROR_NOT_SUPPORTED == error) {
+      std::string log_msg = "Cannot get ethernet connection state: Not supported";
+      LoggerE("%s", log_msg.c_str());
+      return PlatformResult(ErrorCode::NOT_SUPPORTED_ERR, log_msg);
+    }
+    std::string log_msg = "Cannot get ethernet connection state: " + std::to_string(error);
+    LoggerE("%s", log_msg.c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+  }
+
+  switch (connection_state) {
+    case CONNECTION_ETHERNET_STATE_DEACTIVATED:
+      result_status = "DEACTIVATED";
+      break;
+
+    case CONNECTION_ETHERNET_STATE_DISCONNECTED:
+      result_status = "DISCONNECTED";
+      break;
+
+    case CONNECTION_ETHERNET_STATE_CONNECTED:
+      result_status = "CONNECTED";
+      break;
+
+    default:
+      result_status = "UNKNOWN";
+      break;
+  }
+
+  connection_ethernet_cable_state_e cable_state = CONNECTION_ETHERNET_CABLE_DETACHED;
+  error = connection_get_ethernet_cable_state(connection_handle, &cable_state);
+  if (CONNECTION_ERROR_NONE != error) {
+    std::string log_msg = "Cannot get ethernet cable state: " + std::to_string(error);
+    LoggerE("%s", log_msg.c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+  }
+
+  switch (cable_state) {
+    case CONNECTION_ETHERNET_CABLE_DETACHED:
+      result_cable = "DETACHED";
+      break;
+
+    case CONNECTION_ETHERNET_CABLE_ATTACHED:
+      result_cable = "ATTACHED";
+      break;
+
+    default:
+      result_cable = "UNKNOWN";
+      break;
+  }
+
+  char* mac = nullptr;
+  error = connection_get_mac_address(connection_handle, CONNECTION_TYPE_ETHERNET, &mac);
+  if (CONNECTION_ERROR_NONE == error && nullptr != mac) {
+    SLoggerD("MAC address fetched: %s", mac);
+    result_mac_address = mac;
+    free(mac);
+  } else {
+    std::string log_msg = "Failed to get mac address: " + std::to_string(error);
+    LoggerE("%s", log_msg.c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+  }
+
+  error = connection_get_type(connection_handle, &connection_type);
+  if (CONNECTION_ERROR_NONE != error) {
+    std::string log_msg = "Cannot get connection type: " + std::to_string(error);
+    LoggerE("%s", log_msg.c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+  }
+
+  if (CONNECTION_TYPE_ETHERNET == connection_type) {
+    //gathering profile
+    error = connection_get_current_profile(connection_handle, &profile_handle);
+    if (CONNECTION_ERROR_NONE != error) {
+      std::string log_msg = "Cannot get connection profile: " + std::to_string(error);
+      LoggerE("%s", log_msg.c_str());
+      return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+    }
+    std::unique_ptr<std::remove_pointer<connection_profile_h>::type,
+        int (*)(connection_profile_h)> profile_handle_ptr(
+        profile_handle, &connection_profile_destroy); // automatically release the memory
+
+    //gathering ips
+    PlatformResult ret = GetIps(profile_handle, &result_ip_address, &result_ipv6_address);
+    if (ret.IsError()) {
+      return ret;
+    }
+  } else {
+    LoggerD("Connection type = %d. ETHERNET is disabled", connection_type);
+  }
+
+  out->insert(std::make_pair("cable", picojson::value(result_cable)));
+  out->insert(std::make_pair("status", picojson::value(result_status)));
+  out->insert(std::make_pair("ipAddress", picojson::value(result_ip_address)));
+  out->insert(std::make_pair("ipv6Address", picojson::value(result_ipv6_address)));
+  out->insert(std::make_pair("macAddress", picojson::value(result_mac_address)));
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+static PlatformResult FetchBasicSimProperties(TapiHandle *tapi_handle,
+    unsigned short *result_mcc,
+    unsigned short *result_mnc,
+    unsigned short *result_cell_id,
+    unsigned short *result_lac,
+    bool *result_is_roaming,
+    bool *result_is_flight_mode)
+{
+  LoggerD("Entered");
+  int result_value = 0;
+  int tapi_res = TAPI_API_SUCCESS;
+  tapi_res = tel_get_property_int(tapi_handle, TAPI_PROP_NETWORK_PLMN, &result_value);
+  if (TAPI_API_SUCCESS != tapi_res) {
+    std::string error_msg = "Cannot get mcc value, error: " + std::to_string(tapi_res);
+    LoggerE("%s", error_msg.c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
+  }
+  *result_mcc = static_cast<unsigned short>(result_value) / kMccDivider;
+  *result_mnc = static_cast<unsigned short>(result_value) % kMccDivider;
+
+  tapi_res = tel_get_property_int(tapi_handle, TAPI_PROP_NETWORK_CELLID, &result_value);
+  if (TAPI_API_SUCCESS != tapi_res) {
+    std::string error_msg = "Cannot get cell_id value, error: " + std::to_string(tapi_res);
+    LoggerE("%s", error_msg.c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
+  }
+  *result_cell_id = static_cast<unsigned short>(result_value);
+
+  tapi_res = tel_get_property_int(tapi_handle, TAPI_PROP_NETWORK_LAC, &result_value);
+  if (TAPI_API_SUCCESS != tapi_res) {
+    std::string error_msg = "Cannot get lac value, error: " + std::to_string(tapi_res);
+    LoggerE("%s", error_msg.c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
+  }
+  *result_lac = static_cast<unsigned short>(result_value);
+
+  tapi_res = tel_get_property_int(tapi_handle, TAPI_PROP_NETWORK_ROAMING_STATUS, &result_value);
+  if (TAPI_API_SUCCESS != tapi_res) {
+    std::string error_msg = "Cannot get is_roaming value, error: " + std::to_string(tapi_res);
+    LoggerE("%s", error_msg.c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, error_msg);
+  }
+  *result_is_roaming = (0 != result_value) ? true : false;
+
+  if (0 != vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &result_value)) {
+    LoggerE("Cannot get is_flight_mode value");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get is_flight_mode value");
+  }
+  *result_is_flight_mode = (0 != result_value) ? true : false;
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+static PlatformResult FetchConnection(TapiHandle *tapi_handle, std::string* result_status,
+                            std::string* result_apn, std::string* result_ip_address,
+                            std::string* result_ipv6_address, std::string* result_imei)
+{
+  LoggerD("Entered");
+  connection_type_e connection_type = CONNECTION_TYPE_DISCONNECTED;
+  connection_profile_h profile_handle = nullptr;
+  connection_h connection_handle = nullptr;
+
+  //connection must be created in every call, in other case error occurs
+  int error = connection_create(&connection_handle);
+  if (CONNECTION_ERROR_NONE != error) {
+    std::string log_msg = "Cannot create connection: " + std::to_string(error);
+    LoggerE("%s", log_msg.c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+  }
+  std::unique_ptr<std::remove_pointer<connection_h>::type, int(*)(connection_h)>
+  connection_handle_ptr(connection_handle, &connection_destroy);
+  // automatically release the memory
+
+  error = connection_get_type(connection_handle, &connection_type);
+  if (CONNECTION_ERROR_NONE != error) {
+    LoggerE("Failed to get connection type: %d", error);
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get connection type");
+  }
+
+  char* apn = nullptr;
+  if (CONNECTION_TYPE_CELLULAR == connection_type) {
+    *result_status = kConnectionOn;
+
+    error = connection_get_current_profile(connection_handle,
+                                           &profile_handle);
+    std::unique_ptr
+    <std::remove_pointer<connection_profile_h>::type, int(*)(connection_profile_h)>
+    profile_handle_ptr(profile_handle, &connection_profile_destroy);
+    // automatically release the memory
+    if (CONNECTION_ERROR_NONE != error) {
+      LoggerE("Failed to get profile: %d", error);
+      return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get profile");
+    }
+
+    error = connection_profile_get_cellular_apn(profile_handle, &apn);
+    if (CONNECTION_ERROR_NONE != error) {
+      LoggerE("Failed to get apn name: %d", error);
+      return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get apn name");
+    }
+    *result_apn = apn;
+    free(apn);
+
+    PlatformResult ret = GetIps(profile_handle, result_ip_address, result_ipv6_address);
+    if (ret.IsError()) {
+      return ret;
+    }
+  } else {
+    *result_status = kConnectionOff;
+
+    //According to previous implementation in case of error
+    //don't throw exception here
+    error = connection_get_default_cellular_service_profile(
+        connection_handle,
+        CONNECTION_CELLULAR_SERVICE_TYPE_INTERNET,
+        &profile_handle);
+    std::unique_ptr
+    <std::remove_pointer<connection_profile_h>::type, int(*)(connection_profile_h)>
+    profile_handle_ptr(profile_handle, &connection_profile_destroy);
+    // automatically release the memory
+    if (CONNECTION_ERROR_NONE == error) {
+      error = connection_profile_get_cellular_apn(profile_handle, &apn);
+      if (CONNECTION_ERROR_NONE == error) {
+        *result_apn = apn;
+        free(apn);
+      } else {
+        LoggerE("Failed to get default apn name: %d. Failing silently",
+             error);
+      }
+    } else {
+      LoggerE("Failed to get default profile: %d. Failing silently",
+           error);
+    }
+  }
+
+  char* imei = nullptr;
+  imei = tel_get_misc_me_imei_sync(tapi_handle);
+  if (nullptr != imei) {
+    *result_imei = imei;
+    free(imei);
+  } else {
+    LoggerE("Failed to get imei, nullptr pointer. Setting empty value.");
+    *result_imei = "";
+  }
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult SysteminfoPropertiesManager::ReportCellularNetwork(picojson::object* out,
+                                                                  unsigned long count) {
+  PlatformResult ret = SysteminfoUtils::CheckTelephonySupport();
+  if (ret.IsError()) {
+    return ret;
+  }
+  std::string result_status;
+  std::string result_apn;
+  std::string result_ip_address;
+  std::string result_ipv6_address;
+  unsigned short result_mcc;
+  unsigned short result_mnc;
+  unsigned short result_cell_id;
+  unsigned short result_lac;
+  bool result_is_roaming;
+  bool result_is_flight_mode;
+  std::string result_imei;
+
+  //gathering vconf-based values
+  ret = FetchBasicSimProperties(manager_.GetTapiHandles()[count], &result_mcc,
+                           &result_mnc, &result_cell_id, &result_lac,
+                           &result_is_roaming, &result_is_flight_mode);
+  if (ret.IsError()) {
+    return ret;
+  }
+  //gathering connection informations
+  ret = FetchConnection(manager_.GetTapiHandles()[count],
+                  &result_status, &result_apn, &result_ip_address, &result_ipv6_address,
+                  &result_imei);
+  if (ret.IsError()) {
+    return ret;
+  }
+
+  out->insert(std::make_pair("status", picojson::value(result_status)));
+  out->insert(std::make_pair("apn", picojson::value(result_apn)));
+  out->insert(std::make_pair("ipAddress", picojson::value(result_ip_address)));
+  out->insert(std::make_pair("ipv6Address", picojson::value(result_ipv6_address)));
+  out->insert(std::make_pair("mcc", picojson::value(std::to_string(result_mcc))));
+  out->insert(std::make_pair("mnc", picojson::value(std::to_string(result_mnc))));
+  out->insert(std::make_pair("cellId", picojson::value(std::to_string(result_cell_id))));
+  out->insert(std::make_pair("lac", picojson::value(std::to_string(result_lac))));
+  out->insert(std::make_pair("isRoaming", picojson::value(result_is_roaming)));
+  out->insert(std::make_pair("isFligthMode", picojson::value(result_is_flight_mode)));
+  out->insert(std::make_pair("imei", picojson::value(result_imei)));
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+/// SIM
+PlatformResult SysteminfoPropertiesManager::ReportSim(picojson::object* out, unsigned long count) {
+  PlatformResult ret = SysteminfoUtils::CheckTelephonySupport();
+  if (ret.IsError()) {
+    return ret;
+  }
+  return sim_manager_.GatherSimInformation(
+      manager_.GetTapiHandles()[count], out);
+}
+
+/// PERIPHERAL
+PlatformResult SysteminfoPropertiesManager::ReportPeripheral(picojson::object* out) {
+
+/*  int wireless_display_status = 0;
+  PlatformResult ret = GetVconfInt(VCONFKEY_MIRACAST_WFD_SOURCE_STATUS, &wireless_display_status);
+  if (ret.IsSuccess()) {
+    if (VCONFKEY_MIRACAST_WFD_SOURCE_ON == wireless_display_status) {
+      out.insert(std::make_pair(kVideoOutputString, picojson::value(true)));
+      return PlatformResult(ErrorCode::NO_ERROR);
+    }
+  }*/
+  int hdmi_status = 0;
+  PlatformResult ret = SysteminfoUtils::GetVconfInt(VCONFKEY_SYSMAN_HDMI, &hdmi_status);
+  if (ret.IsSuccess()) {
+    if (VCONFKEY_SYSMAN_HDMI_CONNECTED == hdmi_status) {
+      out->insert(std::make_pair(kVideoOutputString, picojson::value(true)));
+      return PlatformResult(ErrorCode::NO_ERROR);
+    }
+  }
+
+  out->insert(std::make_pair(kVideoOutputString, picojson::value(false)));
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+/// MEMORY
+PlatformResult SysteminfoPropertiesManager::ReportMemory(picojson::object* out) {
+  std::string state = kMemoryStateNormal;
+  int status = 0;
+  PlatformResult ret = SysteminfoUtils::GetVconfInt(VCONFKEY_SYSMAN_LOW_MEMORY, &status);
+  if (ret.IsSuccess()) {
+    switch (status) {
+      case VCONFKEY_SYSMAN_LOW_MEMORY_SOFT_WARNING:
+      case VCONFKEY_SYSMAN_LOW_MEMORY_HARD_WARNING:
+        state = kMemoryStateWarinig;
+        break;
+      case VCONFKEY_SYSMAN_LOW_MEMORY_NORMAL:
+      default:
+        state = kMemoryStateNormal;
+    }
+  }
+
+  out->insert(std::make_pair("state", picojson::value(state)));
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+static void CreateStorageInfo(const std::string& type, struct statfs& fs, picojson::object* out) {
+  out->insert(std::make_pair("type", picojson::value(type)));
+  out->insert(std::make_pair("capacity", picojson::value(std::to_string(
+      static_cast<unsigned long long>(fs.f_bsize) *
+      static_cast<unsigned long long>(fs.f_blocks)))));
+  out->insert(std::make_pair("availableCapacity", picojson::value(std::to_string(
+      static_cast<unsigned long long>(fs.f_bsize) *
+      static_cast<unsigned long long>(fs.f_bavail)))));
+  bool isRemovable = (type == kTypeInternal) ? false : true;
+  out->insert(std::make_pair("isRemovable", picojson::value(isRemovable)));
+}
+
+PlatformResult SysteminfoPropertiesManager::ReportStorage(picojson::object* out) {
+  int sdcardState = 0;
+  struct statfs fs;
+
+  picojson::value result = picojson::value(picojson::array());
+
+  picojson::array& array = result.get<picojson::array>();
+  array.push_back(picojson::value(picojson::object()));
+  picojson::object& internal_obj = array.back().get<picojson::object>();
+
+  if (statfs(kStorageInternalPath, &fs) < 0) {
+    LoggerE("There are no storage units detected");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, "There are no storage units detected");
+  }
+  CreateStorageInfo(kTypeInternal, fs, &internal_obj);
+  manager_.SetAvailableCapacityInternal(fs.f_bavail);
+
+  if (0 == vconf_get_int(VCONFKEY_SYSMAN_MMC_STATUS, &sdcardState)) {
+    if (VCONFKEY_SYSMAN_MMC_MOUNTED == sdcardState){
+      if (statfs(kStorageSdcardPath, &fs) < 0) {
+        LoggerE("MMC mounted, but not accessible");
+        return PlatformResult(ErrorCode::UNKNOWN_ERR, "MMC mounted, but not accessible");
+      }
+      array.push_back(picojson::value(picojson::object()));
+      picojson::object& external_obj = array.back().get<picojson::object>();
+      CreateStorageInfo(kTypeMmc, fs, &external_obj);
+      manager_.SetAvailableCapacityMmc(fs.f_bavail);
+    }
+  }
+
+  out->insert(std::make_pair("storages", picojson::value(result)));
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult SysteminfoPropertiesManager::ReportCameraFlash(picojson::object* out,
+                                                              unsigned long index) {
+  if (index < manager_.GetCameraTypesCount()) {
+    std::string camera = manager_.GetCameraTypes(index);
+    out->insert(std::make_pair("camera", picojson::value(camera)));
+  } else {
+    return PlatformResult(
+        ErrorCode::NOT_SUPPORTED_ERR,
+        "Camera is not supported on this device");
+  }
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
 
 
 } // namespace systeminfo
index ccd5808bbdbf1ab9847776e78f6534a0438b80fc..cb966d881e8ba8549f82a24a46ce6eeada2a0bcc 100644 (file)
 #include <string>
 #include "common/picojson.h"
 #include "common/platform_result.h"
+#include "systeminfo/systeminfo_sim_details_manager.h"
 
 namespace extension {
 namespace systeminfo {
 
-class SystemInfoPropertiesManager {
+class SysteminfoManager;
+
+class SysteminfoPropertiesManager {
  public:
-  SystemInfoPropertiesManager();
-  ~SystemInfoPropertiesManager();
+  SysteminfoPropertiesManager(SysteminfoManager& manager);
+  ~SysteminfoPropertiesManager();
 
   common::PlatformResult GetPropertyValue(
       const std::string& prop, bool is_array_type, picojson::value* res);
@@ -47,8 +50,15 @@ class SystemInfoPropertiesManager {
   common::PlatformResult ReportCellularNetwork(picojson::object* out, unsigned long count);
   common::PlatformResult ReportSim(picojson::object* out, unsigned long count);
   common::PlatformResult ReportPeripheral(picojson::object* out);
-  common::PlatformResult ReportCameraFlash(picojson::object* out);
+  common::PlatformResult ReportCameraFlash(picojson::object* out, unsigned long count);
+  common::PlatformResult ReportMemory(picojson::object* out);
   common::PlatformResult ReportStorage(picojson::object* out);
+
+  common::PlatformResult FetchIsAutoRotation(bool* result);
+  common::PlatformResult FetchStatus(std::string* result);
+
+  SysteminfoManager& manager_;
+  SimDetailsManager sim_manager_;
 };
 
 } // namespace systeminfo
diff --git a/src/systeminfo/systeminfo_sim_details_manager.cc b/src/systeminfo/systeminfo_sim_details_manager.cc
new file mode 100644 (file)
index 0000000..5493164
--- /dev/null
@@ -0,0 +1,293 @@
+/*
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#include "systeminfo/systeminfo_sim_details_manager.h"
+
+#include "common/logger.h"
+
+namespace extension {
+namespace systeminfo {
+
+namespace {
+//Sim
+const char* kSimStatusAbsent = "ABSENT";
+const char* kSimStatusInitializing = "INITIALIZING";
+const char* kSimStatusReady = "READY";
+const char* kSimStatusPinRequired = "PIN_REQUIRED";
+const char* kSimStatusPukRequired = "PUK_REQUIRED";
+const char* kSimStatusSimLocked = "SIM_LOCKED";
+const char* kSimStatusNetworkLocked = "NETWORK_LOCKED";
+const char* kSimStatusUnknown = "UNKNOWN";
+
+void SimCphsValueCallback(TapiHandle */*handle*/, int result, void *data, void *user_data) {
+  LoggerD("Entered");
+  SimDetailsManager* sim_mgr = static_cast<SimDetailsManager*>(user_data);
+  TelSimAccessResult_t access_rt = static_cast<TelSimAccessResult_t>(result);
+  TelSimCphsNetName_t *cphs_info = static_cast<TelSimCphsNetName_t*>(data);
+
+  std::string result_operator;
+  if (TAPI_SIM_ACCESS_SUCCESS == access_rt) {
+    std::stringstream s;
+    s << cphs_info->full_name;
+    if (s.str().empty()) {
+      s << cphs_info->short_name;
+    }
+    result_operator = s.str();
+  } else {
+    LoggerW("Failed to retrieve cphs_info: %d", access_rt);
+  }
+  sim_mgr->set_operator_name(result_operator);
+  sim_mgr->TryReturn();
+}
+
+void SimMsisdnValueCallback(TapiHandle */*handle*/, int result, void *data, void *user_data) {
+  LoggerD("Entered");
+  SimDetailsManager* sim_mgr = static_cast<SimDetailsManager*>(user_data);
+  TelSimAccessResult_t access_rt = static_cast<TelSimAccessResult_t>(result);
+  TelSimMsisdnList_t *msisdn_info = static_cast<TelSimMsisdnList_t*>(data);
+
+  std::string result_msisdn;
+  if (TAPI_SIM_ACCESS_SUCCESS == access_rt) {
+    if (msisdn_info->count > 0) {
+      if (strlen(msisdn_info->list[0].num) > 0) {
+        result_msisdn = msisdn_info->list[0].num;
+      } else {
+        LoggerW("MSISDN number empty");
+      }
+    } else {
+      LoggerW("msisdn_info list empty");
+    }
+  } else {
+    LoggerW("Failed to retrieve msisdn_: %d", access_rt);
+  }
+
+  sim_mgr->set_msisdn(result_msisdn);
+  sim_mgr->TryReturn();
+}
+
+void SimSpnValueCallback(TapiHandle */*handle*/, int result, void *data, void *user_data) {
+  LoggerD("Entered");
+  SimDetailsManager* sim_mgr = static_cast<SimDetailsManager*>(user_data);
+  TelSimAccessResult_t access_rt = static_cast<TelSimAccessResult_t>(result);
+  TelSimSpn_t *spn_info = static_cast<TelSimSpn_t*>(data);
+
+  std::string result_spn;
+  if (TAPI_SIM_ACCESS_SUCCESS == access_rt) {
+    result_spn = (char *)spn_info->spn;
+  } else {
+    LoggerW("Failed to retrieve spn_: %d", access_rt);
+  }
+
+  sim_mgr->set_spn(result_spn);
+  sim_mgr->TryReturn();
+}
+} //namespace
+
+using common::PlatformResult;
+using common::ErrorCode;
+
+SimDetailsManager::SimDetailsManager():
+            mcc_(0),
+            mnc_(0),
+            operator_name_(""),
+            msin_(""),
+            state_(""),
+            msisdn_(""),
+            iccid_(""),
+            spn_(""),
+            sim_result_obj_(nullptr),
+            to_process_(0)
+{
+}
+
+PlatformResult SimDetailsManager::GatherSimInformation(TapiHandle* handle, picojson::object* out) {
+  LoggerD("Entered");
+  std::lock_guard<std::mutex> first_lock_sim(sim_info_mutex_);
+  ResetSimHolder(out);
+
+  FetchSimState(handle);
+  if (kSimStatusReady == state_) {
+    PlatformResult ret = FetchSimSyncProps(handle);
+    if (ret.IsError()) {
+      return ret;
+    }
+    {
+      //All props should be fetched synchronously, but sync function does not work
+      std::lock_guard<std::mutex> lock_to_process(sim_to_process_mutex_);
+      //would be deleted on } ending bracket
+      int result = tel_get_sim_cphs_netname(handle, SimCphsValueCallback, this);
+      if (TAPI_API_SUCCESS == result) {
+        ++to_process_;
+      } else {
+        LoggerE("Failed getting cphs netname: %d", result);
+      }
+
+      result = tel_get_sim_msisdn(handle, SimMsisdnValueCallback, this);
+      if (TAPI_API_SUCCESS == result) {
+        ++to_process_;
+      } else {
+        LoggerE("Failed getting msisdn: %d", result);
+      }
+
+      result = tel_get_sim_spn(handle, SimSpnValueCallback, this);
+      if (TAPI_API_SUCCESS == result) {
+        ++to_process_;
+      } else {
+        LoggerE("Failed getting spn: %d", result);
+      }
+    }
+    //prevent returning not filled result
+    std::lock_guard<std::mutex> lock_sim(sim_info_mutex_);
+    //result will come from callbacks
+    return PlatformResult(ErrorCode::NO_ERROR);
+  }
+  //if sim state is not READY return default values and don't wait for callbacks
+  TryReturn();
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+void SimDetailsManager::FetchSimState(TapiHandle *tapi_handle) {
+  LoggerD("Entered");
+  if (nullptr == tapi_handle) {
+    LoggerE("Tapi handle is null");
+    state_ = kSimStatusUnknown;
+  } else {
+    int card_changed = 0;
+    TelSimCardStatus_t sim_card_state;
+    int error = tel_get_sim_init_info(tapi_handle, &sim_card_state, &card_changed);
+    if (TAPI_API_SUCCESS == error) {
+      switch (sim_card_state) {
+        case TAPI_SIM_STATUS_CARD_NOT_PRESENT:
+        case TAPI_SIM_STATUS_CARD_REMOVED:
+          state_ = kSimStatusAbsent;
+          break;
+        case TAPI_SIM_STATUS_SIM_INITIALIZING:
+          state_ = kSimStatusInitializing;
+          break;
+        case TAPI_SIM_STATUS_SIM_INIT_COMPLETED:
+          state_ = kSimStatusReady;
+          break;
+        case TAPI_SIM_STATUS_SIM_PIN_REQUIRED:
+          state_ = kSimStatusPinRequired;
+          break;
+        case TAPI_SIM_STATUS_SIM_PUK_REQUIRED:
+          state_ = kSimStatusPukRequired;
+          break;
+        case TAPI_SIM_STATUS_SIM_LOCK_REQUIRED:
+        case TAPI_SIM_STATUS_CARD_BLOCKED:
+          state_ = kSimStatusSimLocked;
+          break;
+        case TAPI_SIM_STATUS_SIM_NCK_REQUIRED:
+        case TAPI_SIM_STATUS_SIM_NSCK_REQUIRED:
+          state_ = kSimStatusNetworkLocked;
+          break;
+        default:
+          state_ = kSimStatusUnknown;
+          break;
+      }
+    }
+  }
+}
+
+PlatformResult SimDetailsManager::FetchSimSyncProps(TapiHandle *tapi_handle) {
+  LoggerD("Entered");
+  TelSimImsiInfo_t imsi;
+  int error = tel_get_sim_imsi(tapi_handle, &imsi);
+  if (TAPI_API_SUCCESS == error) {
+    LoggerD("mcc: %s, mnc: %s, msin: %s", imsi.szMcc, imsi.szMnc, imsi.szMsin);
+    mcc_ = std::stoul(imsi.szMcc);
+    mnc_ = std::stoul(imsi.szMnc);
+    msin_ = imsi.szMsin;
+  }
+  else {
+    LoggerE("Failed to get sim imsi: %d", error);
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to get sim imsi");
+  }
+
+  //TODO add code for iccid value fetching, when proper API would be ready
+  iccid_ = "";
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+void SimDetailsManager::ResetSimHolder(picojson::object* out) {
+  LoggerD("Entered");
+  sim_result_obj_ = out;
+  to_process_ = 0;
+  mcc_ = 0;
+  mnc_ = 0;
+  operator_name_ = "";
+  msin_ = "";
+  state_ = "";
+  msisdn_ = "";
+  iccid_ = "";
+  spn_ = "";
+}
+
+void SimDetailsManager::ReturnSimToJS() {
+  LoggerD("Entered");
+  if (nullptr != sim_result_obj_) {
+    sim_result_obj_->insert(std::make_pair("state", picojson::value(state_)));
+    sim_result_obj_->insert(std::make_pair("operatorName", picojson::value(operator_name_)));
+    sim_result_obj_->insert(std::make_pair("msisdn", picojson::value(msisdn_)));
+    sim_result_obj_->insert(std::make_pair("iccid", picojson::value(iccid_)));
+    sim_result_obj_->insert(std::make_pair("mcc", picojson::value(std::to_string(mcc_))));
+    sim_result_obj_->insert(std::make_pair("mnc", picojson::value(std::to_string(mnc_))));
+    sim_result_obj_->insert(std::make_pair("msin", picojson::value(msin_)));
+    sim_result_obj_->insert(std::make_pair("spn", picojson::value(spn_)));
+    //everything returned, clear pointer
+    sim_result_obj_ = nullptr;
+  } else {
+    LoggerE("No sim returned JSON object pointer is null");
+  }
+}
+
+void SimDetailsManager::TryReturn() {
+  LoggerD("Entered");
+  if (0 == to_process_){
+    LoggerD("Returning property to JS");
+    ReturnSimToJS();
+    sim_info_mutex_.unlock();
+  } else {
+    LoggerD("Not ready yet - waiting");
+  }
+}
+
+void SimDetailsManager::set_operator_name(const std::string& name) {
+  LoggerD("Entered");
+  std::lock_guard<std::mutex> lock(sim_to_process_mutex_);
+  operator_name_ = name;
+  --to_process_;
+  LoggerD("Operator name: %s", operator_name_.c_str());
+};
+
+void SimDetailsManager::set_msisdn(const std::string& msisdn) {
+  LoggerD("Entered");
+  std::lock_guard<std::mutex> lock(sim_to_process_mutex_);
+  this->msisdn_ = msisdn;
+  --to_process_;
+  LoggerD("MSISDN number: %s", this->msisdn_.c_str());
+};
+
+void SimDetailsManager::set_spn(const std::string& spn) {
+  LoggerD("Entered");
+  std::lock_guard<std::mutex> lock(sim_to_process_mutex_);
+  this->spn_ = spn;
+  --to_process_;
+  LoggerD("SPN value: %s", this->spn_.c_str());
+};
+
+} // namespace systeminfo
+} // namespace webapi
diff --git a/src/systeminfo/systeminfo_sim_details_manager.h b/src/systeminfo/systeminfo_sim_details_manager.h
new file mode 100644 (file)
index 0000000..38def8f
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#ifndef WEBAPI_PLUGINS_SYSTEMINFO_SYSTEMINFO_SIM_DETAILS_MANAGER_H__
+#define WEBAPI_PLUGINS_SYSTEMINFO_SYSTEMINFO_SIM_DETAILS_MANAGER_H__
+
+#include <string>
+#include <mutex>
+
+#include <ITapiModem.h>
+#include <ITapiSim.h>
+
+#include "common/picojson.h"
+#include "common/platform_result.h"
+
+namespace extension {
+namespace systeminfo {
+
+class SimDetailsManager {
+ public:
+  SimDetailsManager();
+
+  common::PlatformResult GatherSimInformation(TapiHandle* handle, picojson::object* out);
+  long GetSimCount(TapiHandle **tapi_handle);
+  void TryReturn();
+
+  void set_operator_name(const std::string& name);
+  void set_msisdn(const std::string& msisdn);
+  void set_spn(const std::string& spn);
+
+ private:
+  void ResetSimHolder(picojson::object* out);
+  void FetchSimState(TapiHandle *tapi_handle);
+  common::PlatformResult FetchSimSyncProps(TapiHandle *tapi_handle);
+  void ReturnSimToJS();
+
+  unsigned short mcc_;
+  unsigned short mnc_;
+  std::string operator_name_;
+  std::string msin_;
+  std::string state_;
+  std::string msisdn_;
+  std::string iccid_;
+  std::string spn_;
+
+  picojson::object* sim_result_obj_;
+  unsigned short to_process_;
+  std::mutex sim_to_process_mutex_;
+  std::mutex sim_info_mutex_;
+};
+
+} // namespace systeminfo
+} // namespace webapi
+
+#endif // WEBAPI_PLUGINS_SYSTEMINFO_SYSTEMINFO_SIM_DETAILS_MANAGER_H__