Merge "Add a _LocalizedNumParser class and 4 static functions" into tizen_2.1
[platform/framework/native/appfw.git] / src / system / FSys_SystemInfoImpl.cpp
index b92aa5e..6b7542a 100644 (file)
@@ -1,5 +1,4 @@
 //
-// Open Service Platform
 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
 //
 // Licensed under the Apache License, Version 2.0 (the License);
@@ -20,6 +19,9 @@
  * @brief              This is the implementation file for _SystemInfoImpl class.
  */
 #include <unique_ptr.h>
+#include <unistd.h>
+
+#include <ITapiModem.h>
 
 #include <FBaseBoolean.h>
 #include <FBaseInteger.h>
@@ -33,6 +35,7 @@
 
 #include "FSys_Types.h"
 #include "FSys_SystemClient.h"
+#include "FSys_CommunicationDispatcherClient.h"
 
 using namespace std;
 
@@ -43,7 +46,7 @@ using namespace Tizen::Io;
 namespace Tizen { namespace System
 {
 
-static const wchar_t* _REGISTRY_PATH = L"/tmp/osp/system_info_cache.ini";
+static const wchar_t* _REGISTRY_PATH = L"/opt/usr/etc/system_info_cache.ini";
 static const wchar_t* _SYSTEM_INFO_SESSION = L"SystemInformation";
 
 //Bluetooth
@@ -132,7 +135,6 @@ static const wchar_t* _NETWORK_TYPE = L"NetworkType";
 static const wchar_t* _NETWORK_EMERGENCY = L"Emergency";
 static const wchar_t* _NETWORK_NO_SERVICE = L"NoService";
 
-
 //WIFI
 static const wchar_t* _WIFI = L"http://tizen.org/feature/network.wifi";
 static const wchar_t* _WIFI_SUPPORTED = L"WiFiSupported";
@@ -150,9 +152,9 @@ static const wchar_t* _SUPPORTED = L"Supported";
 static const wchar_t* _UNSUPPORTED = L"Unsupported";
 
 static bool firstRequest = false;
-static HashMap integerList;
-static HashMap boolList;
-static HashMap stringList;
+static HashMap integerList(SingleObjectDeleter);
+static HashMap boolList(SingleObjectDeleter);
+static HashMap stringList(SingleObjectDeleter);
 
 void
 PrepareCache(void)
@@ -265,12 +267,12 @@ _SystemInfoImpl::GetSysInfo(const String& key, String& value)
                PrepareCache();
        }
 
-       String* pValue = (String*)stringList.GetValue(key);
+       String* pValue = (String*)stringList.GetValue(tizenKey);
 
        if(pValue != null)
        {
                value = *pValue;
-               r = E_SUCCESS;
+               return E_SUCCESS;
        }
 
        if (key == _NETWORK_TYPE) //Compatibility
@@ -433,20 +435,57 @@ _SystemInfoImpl::GetSysInfo(const String& key, String& value)
        {
                r = E_OBJ_NOT_FOUND;
        }
+       else if (tizenKey == _DUID)
+       {
+               int ret = 0;
+               TapiHandle* handle = null;
+               int time_count = 0;
+               int status = 0;
+
+               handle = tel_init(null);
+               if(handle != null)
+               {
+                       while(time_count < 30) //Wait 30 second.
+                       {
+                               ret = tel_check_modem_power_status(handle, &status);
+                               SysLog(NID_SYS, "Modem check result is %d, status is %d.", handle, status);
+                               if(ret != TAPI_API_SUCCESS)
+                               {
+                                       SysLogException(NID_SYS, E_SYSTEM, "It is failed to get Modem status.");
+                                       tel_deinit(handle);
+                                       return E_SYSTEM;
+                               }
+
+                               if(status == 0)
+                               {
+                                       break;
+                               }
+
+                               usleep(1000000);
+                               time_count++;
+                       }
+                       tel_deinit(handle);
+               }
+               _SystemClient* pSystemClient = _SystemClient::GetInstance();
+               r = pSystemClient->GetValue(tizenKey, value);
+       }
        else
        {
                r = GetFromRegistry(tizenKey, value);
-               SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_OBJ_NOT_FOUND, "It is failed to get the key[%ls]", tizenKey.GetPointer());
-               r = E_SUCCESS;
+
+               if(r != E_SUCCESS)
+               {
+                       _SystemClient* pSystemClient = _SystemClient::GetInstance();
+                       r = pSystemClient->GetValue(tizenKey, value);
+               }
        }
        if( r == E_SUCCESS)
        {
-               stringList.Add(new String(key), new String(value));
+               stringList.Add(new String(tizenKey), new String(value));
        }
        return r;
 }
 
-
 result
 _SystemInfoImpl::GetSysInfo(const String& key, int& value)
 {
@@ -458,11 +497,12 @@ _SystemInfoImpl::GetSysInfo(const String& key, int& value)
                PrepareCache();
        }
 
-       Integer* pValue = (Integer*)integerList.GetValue(key);
+       Integer* pValue = (Integer*)integerList.GetValue(tizenKey);
 
        if(pValue != null)
        {
                value = pValue->value;
+               return E_SUCCESS;
        }
 
        if (key == _CAMERA_COUNT)
@@ -479,36 +519,37 @@ _SystemInfoImpl::GetSysInfo(const String& key, int& value)
                        cameraCount++;
 
                value = cameraCount;
-       }       
+       }
        else
        {
                r = GetFromRegistry(tizenKey, value);
-               SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_OBJ_NOT_FOUND, "It is failed to get the key[%ls]", tizenKey.GetPointer());
+               if(r != E_SUCCESS)
+               {
+                       _SystemClient* pSystemClient = _SystemClient::GetInstance();
+                       r = pSystemClient->GetValue(tizenKey, value);
+               }
        }
 
        if(r == E_SUCCESS)
        {
-               integerList.Add(new String(key), new Integer(value));
+               integerList.Add(new String(tizenKey), new Integer(value));
        }
-       
+
        return r;
 }
 
-
 result
 _SystemInfoImpl::GetSysInfo(const String& key, long long& value)
 {
        return E_OBJ_NOT_FOUND;
 }
 
-
 result
 _SystemInfoImpl::GetSysInfo(const String& key, double& value)
 {
        return E_OBJ_NOT_FOUND;
 }
 
-
 result
 _SystemInfoImpl::GetSysInfo(const String& key, bool& value)
 {
@@ -520,36 +561,39 @@ _SystemInfoImpl::GetSysInfo(const String& key, bool& value)
                PrepareCache();
        }
 
-       Boolean* pValue = (Boolean*)boolList.GetValue(key);
+       Boolean* pValue = (Boolean*)boolList.GetValue(tizenKey);
 
        if(pValue != null)
        {
                value = pValue->value;
+               return E_SUCCESS;
        }
 
-
        r = GetFromRegistry(tizenKey, value);
+       if(r != E_SUCCESS)
+       {
+               _SystemClient* pSystemClient = _SystemClient::GetInstance();
+               r = pSystemClient->GetValue(tizenKey, value);
+       }
        SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_OBJ_NOT_FOUND, "It is failed to get the key[%ls]", tizenKey.GetPointer());
 
        if(r == E_SUCCESS)
        {
-               boolList.Add(new String(key), new Boolean(value));
+               boolList.Add(new String(tizenKey), new Boolean(value));
        }
 
        return r;
 }
 
-
 result
 _SystemInfoImpl::GetSysInfo(const String& key, UuId& value)
 {
        return E_OBJ_NOT_FOUND;
 }
 
-
 Collection::IList*
 _SystemInfoImpl::GetSysInfoValuesN(const String& key, SystemInfoValueType type)
-{      
+{
        SetLastResult(E_OBJ_NOT_FOUND);
        return null;
 }
@@ -603,14 +647,41 @@ _SystemInfoImpl::GetImei(String& imei)
 {
        result r = E_SUCCESS;
 
+       int ret = 0;
+       TapiHandle* handle = null;
+       int time_count = 0;
+       int status = 0;
+
+       handle = tel_init(null);
+       SysTryReturnResult(NID_SYS, handle != null, E_SYSTEM, "It is failed to get handle of telephony.");
+       while(time_count < 30) //Wait 30 second.
+       {
+               ret = tel_check_modem_power_status(handle, &status);
+               SysLog(NID_SYS, "Modem check result is %d, status is %d.", handle, status);
+               if(ret != TAPI_API_SUCCESS)
+               {
+                       SysLogException(NID_SYS, E_SYSTEM, "It is failed to get Modem status.");
+                       tel_deinit(handle);
+                       return E_SYSTEM;
+               }
+
+               if(status == 0)
+               {
+                       break;
+               }
+
+               usleep(1000000);
+               time_count++;
+       }
+       tel_deinit(handle);
+
        ArrayList requestMessage;
        ArrayList responseMessage;
 
-       unique_ptr<_IpcClient> pIpcClient (new (std::nothrow) _IpcClient());
-       SysTryReturn(NID_SYS, pIpcClient != null, E_OUT_OF_MEMORY, r, "It is failed to create IPC instance.");
+       _CommunicationDispatcherClient* pCommunicationDispatcherClient = _CommunicationDispatcherClient::GetInstance();
 
-       r = pIpcClient->Construct(_COMMUNICATION_DISPATCHER_IPC_ID);
-       SysTryReturn(NID_SYS, r == E_SUCCESS, E_SYSTEM, r, "It is failed to create IpcClient. [%s]", GetErrorMessage(r));
+       _IpcClient* pIpcClient = pCommunicationDispatcherClient->GetIpcClient();
+       SysTryReturn(NID_SYS, pIpcClient != null, E_OUT_OF_MEMORY, r, "It is failed to create IPC instance.");
 
        requestMessage.Construct();
        responseMessage.Construct();
@@ -648,10 +719,10 @@ _SystemInfoImpl::GetFromRegistry(const String& key, String& value)
        String valStr;
 
        r = _reg.Construct(_REGISTRY_PATH, REG_OPEN_READ_ONLY, null);
-       SysTryReturnResult(NID_SYS, r == E_SUCCESS , r, " RegistryImpl construct It is failed");
+       SysTryReturnResult(NID_SYS, r == E_SUCCESS , r, " RegistryImpl construct is failed");
 
        r = _reg.GetValue(_SYSTEM_INFO_SESSION, key, valStr);
-       SysTryReturnResult(NID_SYS, r == E_SUCCESS , r, " Registry GetValue  It is failed");
+       SysTryReturnResult(NID_SYS, r == E_SUCCESS , r, " Registry GetValue is failed");
 
        if(valStr == L"true" || valStr == L"false")
        {
@@ -672,32 +743,28 @@ _SystemInfoImpl::GetFromRegistry(const String& key, int& value)
        _RegistryImpl _reg;
        String valStr;
        r = _reg.Construct(_REGISTRY_PATH, REG_OPEN_READ_ONLY, null);
-       SysTryReturnResult(NID_SYS, r == E_SUCCESS, r, " RegistryImpl construct It is failed");
+       SysTryReturnResult(NID_SYS, r == E_SUCCESS, r, " RegistryImpl construct is failed");
 
        r = _reg.GetValue(_SYSTEM_INFO_SESSION, key, valStr);
-       SysTryReturnResult(NID_SYS, r == E_SUCCESS, r, " Registry GetValue  It is failed");
-       SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, " Registry GetValue  It is failed");
+       SysTryReturnResult(NID_SYS, r == E_SUCCESS, r, " Registry GetValue is failed");
+       SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, " Registry GetValue is failed");
        r = Integer::Parse(valStr, value);
-       SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_OBJ_NOT_FOUND, " Integer::Parse()  It is failed");
+       SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_OBJ_NOT_FOUND, " Integer::Parse() is failed");
        return E_SUCCESS;
 }
 
 result
 _SystemInfoImpl::GetFromRegistry(const String& key, bool& value)
 {
-/*
-       _SystemClient* pSystemClient = _SystemClient::GetInstance();
-       pSystemClient->GetValue(key, value);
-*/
        result r = E_SUCCESS;
        _RegistryImpl _reg;
        String valStr;
        r = _reg.Construct(_REGISTRY_PATH, REG_OPEN_READ_ONLY, null);
-       SysTryReturnResult(NID_SYS, r == E_SUCCESS, r, " RegistryImpl construct It is failed");
+       SysTryReturnResult(NID_SYS, r == E_SUCCESS, r, " RegistryImpl construct is failed");
 
        r = _reg.GetValue(_SYSTEM_INFO_SESSION, key, valStr);
-       SysTryReturnResult(NID_SYS, r == E_SUCCESS, r, " Registry GetValue It is failed");
-       SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, " Registry GetValue  It is failed");
+       SysTryReturnResult(NID_SYS, r == E_SUCCESS, r, " Registry GetValue is failed");
+       SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, " Registry GetValue is failed");
        if(valStr == L"true")
        {
                value = true;