04a688b2bbe6820fb3a579579b75d0d3f073423a
[platform/framework/native/appfw.git] / src / system / FSys_RuntimeInfoImpl.cpp
1 //
2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
3 //
4 // Licensed under the Apache License, Version 2.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //     http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16
17 /**
18  * @file                FSysRuntimeInfo.cpp
19  * @brief               This is the implementation file for _RuntimeInfoImpl class.
20  *
21  *
22  * This file contains the implementation of _RuntimeInfoImpl class.
23  */
24
25 #include <unique_ptr.h>
26 #include <pthread.h>
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <string.h>
30 #include <unistd.h>
31 #include <sys/vfs.h>
32 #include <app_storage.h>
33 #include <devman.h>
34 #include <runtime_info.h>
35 #include <vconf.h>
36
37 #include <FIo.h>
38 #include <FAppApp.h>
39 #include <FBaseRtEvent.h>
40 #include <FBaseRtIEventArg.h>
41 #include <FBaseRtIEventListener.h>
42 #include <FBaseRtThread.h>
43 #include <FBaseSysLog.h>
44 #include <FApp_AppInfo.h>
45 #include <FBase_StringConverter.h>
46
47 #include "FSys_EnvironmentImpl.h"
48 #include "FSys_RuntimeInfoImpl.h"
49 #include "FSys_RuntimeClient.h"
50
51 using namespace Tizen::App;
52 using namespace Tizen::Base;
53 using namespace Tizen::Base::Runtime;
54
55 using namespace std;
56
57 namespace Tizen { namespace System
58 {
59
60 #ifndef VCONFKEY_SERVICE_READY
61 #define VCONFKEY_SERVICE_READY  "memory/deviced/boot_power_on"
62 #endif
63
64 static const wchar_t* _ALLOCATED_MEMORY = L"AllocatedMemory";
65 static const wchar_t* _MEMORY_ALLOCATED = L"http://tizen.org/runtime/memory.allocated";
66 static const wchar_t* _MEMORY_ALLOCATED_SELF = L"http://tizen.org/runtime/memory.allocated.self";
67
68 static const wchar_t* _AVAILABLE_EXTERNAL_STORAGE = L"AvailableExternalStorage";
69 static const wchar_t* _STORAGE_AVAILABLE_EXTERNAL = L"http://tizen.org/runtime/storage.available.external";
70
71 static const wchar_t* _AVAILABLE_INTERNAL_STORAGE = L"AvailableInternalStorage";
72 static const wchar_t* _STORAGE_AVAILABLE_INTERNAL = L"http://tizen.org/runtime/storage.available.internal";
73
74 static const wchar_t* _AVAILABLE_MEDIA_STORAGE = L"AvailableMediaStorage";
75 static const wchar_t* _STORAGE_AVAILABLE_INTERNAL_MEDIA = L"http://tizen.org/runtime/storage.available.internal.media";
76
77 static const wchar_t* _BATTERY_LEVEL = L"BatteryLevel";
78 static const wchar_t* _CHARGING = L"IsCharging";
79
80 static const wchar_t* _CPU_CORE_ALL_USAGE = L"http://tizen.org/runtime/cpu.core.all.usage";
81
82 static const wchar_t* _MAX_ALLOCATABLE_MEMORY = L"MaxAllocatableMemory";
83 static const wchar_t* _AVAILABLE_VIDEO_MEMORY = L"AvailableVideoMemory";
84 static const wchar_t* _ALLOCATED_VIDEO_MEMORY = L"AllocatedVideoMemory";
85 static const wchar_t* _AVAILABLE_MEMORY = L"AvailableMemory";
86 static const wchar_t* _MEMORY_AVAILABLE = L"http://tizen.org/runtime/memory.available";
87 static const wchar_t* _MEMORY_AVAILABLE_VIDEO = L"http://tizen.org/runtime/memory.available.video";
88 static const wchar_t* _MEMORY_ALLOCATED_VIDEO = L"http://tizen.org/runtime/memory.allocated.video";
89
90 static const wchar_t* _STORAGE_ALLOCATED_INTERNAL_APPLICATION = L"http://tizen.org/runtime/storage.allocated.internal.application";
91 static const wchar_t* _STORAGE_ALLOCATED_INTERNAL_AUDIO = L"http://tizen.org/runtime/storage.allocated.internal.audio";
92 static const wchar_t* _STORAGE_ALLOCATED_INTERNAL_VIDEO = L"http://tizen.org/runtime/storage.allocated.internal.video";
93 static const wchar_t* _STORAGE_ALLOCATED_INTERNAL_IMAGE = L"http://tizen.org/runtime/storage.allocated.internal.image";
94 static const wchar_t* _STORAGE_ALLOCATED_INTERNAL_DOWNLOAD = L"http://tizen.org/runtime/storage.allocated.internal.download";
95 static const wchar_t* _STORAGE_ALLOCATED_EXTERNAL_APPLICATION = L"http://tizen.org/runtime/storage.allocated.external.application";
96 static const wchar_t* _STORAGE_ALLOCATED_EXTERNAL_AUDIO = L"http://tizen.org/runtime/storage.allocated.external.audio";
97 static const wchar_t* _STORAGE_ALLOCATED_EXTERNAL_VIDEO = L"http://tizen.org/runtime/storage.allocated.external.video";
98 static const wchar_t* _STORAGE_ALLOCATED_EXTERNAL_IMAGE = L"http://tizen.org/runtime/storage.allocated.external.image";
99 static const wchar_t* _STORAGE_ALLOCATED_EXTERNAL_DOWNLOAD = L"http://tizen.org/runtime/storage.allocated.external.download";
100
101 static const wchar_t _BOOT_STATUS_KEY[] = L"http://tizen.org/runtime/system.status";
102 static const wchar_t _BOOT_STATUS_INITIALIZING[] = L"initializing";
103 static const wchar_t _BOOT_STATUS_READY[]  = L"ready";
104
105
106 static const int _RUNTIME_INFO_EVENT_TYPE_INT = 101;
107 static const int _RUNTIME_INFO_EVENT_TYPE_LONGLONG = 102;
108
109
110 static const char* const _PROC_SYSTEM_MEMORY_INFO = "/proc/meminfo";
111 static const char* const _PROC_PROCESS_MEMORY_INFO = "/proc/self/status";
112 static const char* const _PROC_STAT = "/proc/stat";
113
114 static const char* const _PROC_KEY_SYSTEM_MEMORY_TOTAL = "MemTotal";
115 static const char* const _PROC_KEY_SYSTEM_MEMORY_FREE = "MemFree";
116 static const char* const _PROC_KEY_PROCESS_MEMORY = "VmSize";
117
118 static const char* const _ROOT_PATH = "/";
119
120 static const int _MAX_BUFFER_LENGTH = 1024;
121
122 static const int _CPU_USAGE_EVALUATION_INTERVAL = 1000000; //1 sec
123
124 typedef struct {
125     char cpu[20];
126     unsigned long long user;
127     unsigned long long system;
128     unsigned long long nice;
129     unsigned long long idle;
130     unsigned long long wait;
131     unsigned long long hi;
132     unsigned long long si;
133     unsigned long long zero;
134 } procstat_t;
135
136 bool read_proc_stat(procstat_t *p)
137 {
138         FILE *fp = null;
139         int ret = 0;
140
141         fp = fopen(_PROC_STAT, "r");
142         if(fp == null)
143         {
144                 return false;
145         }
146
147         ret = fscanf(fp, "%s %llu %llu %llu %llu %llu %llu %llu %llu",
148         p->cpu,
149         &p->user,
150         &p->system,
151         &p->nice,
152         &p->idle,
153         &p->wait,
154         &p->hi,
155         &p->si,
156         &p->zero);
157
158         if(ret < 1)
159         {
160                 if(fp != null)
161                 {
162                         fclose(fp);
163                 }
164                 return false;
165         }
166
167         if(fp != null)
168         {
169                 fclose(fp);
170         }
171
172         return true;
173 }
174  
175 void diff_proc_stat(procstat_t *a, procstat_t *b, procstat_t *d)
176 {
177         d->user     = a->user   - b->user;
178         d->system   = a->system - b->system;
179         d->nice     = a->nice   - b->nice;
180         d->idle     = a->idle   - b->idle;
181         d->wait     = a->wait   - b->wait;
182         d->hi       = a->hi     - b->hi;
183         d->si       = a->si     - b->si;
184         d->zero     = a->zero   - b->zero;
185 }
186
187 class _RuntimeInfoEventArg : public IEventArg
188 {
189 public:
190         _RuntimeInfoEventArg()
191         : Type(0)
192         , intValue(0)
193         , longLongValue(0)
194         , errorCode(E_SUCCESS)
195         , DirectoryPath(null)
196         , pListener(null)
197         {
198         }
199
200         ~_RuntimeInfoEventArg()
201         {
202                 if(DirectoryPath != null)
203                 {
204                         delete [] DirectoryPath;
205                 }
206         }
207
208         int Type;
209         int intValue;
210         long long longLongValue;
211         result errorCode;
212         char* DirectoryPath;
213         IEventListener* pListener;
214 };
215
216 class _RuntimeInfoEvent : public Event
217 {
218 protected:
219         void FireImpl(IEventListener& listener, const IEventArg& arg)
220         {
221                 const _RuntimeInfoEventArg* runtimeArg = dynamic_cast<const _RuntimeInfoEventArg*> (&arg);
222
223                 if(runtimeArg == null)
224                 {
225                         SysLogException(NID_SYS, E_SYSTEM, "Argument is null.");
226                         return;
227                 }
228
229                 switch(runtimeArg->Type)
230                 {
231                 case _RUNTIME_INFO_EVENT_TYPE_INT:
232                 {
233                         IRuntimeInfoGetIntAsyncResultListener* pIntListener = dynamic_cast<IRuntimeInfoGetIntAsyncResultListener*>(&listener);
234
235                         if(pIntListener == runtimeArg->pListener)
236                         {                               
237                                 pIntListener->OnResultReceivedForGetValueAsync(runtimeArg->intValue, runtimeArg->errorCode);
238                                 RemoveListener(listener);
239                         }
240                 }
241                 break;
242                 case _RUNTIME_INFO_EVENT_TYPE_LONGLONG:
243                 {
244                         IRuntimeInfoGetLonglongAsyncResultListener* pLonglongListener = dynamic_cast<IRuntimeInfoGetLonglongAsyncResultListener*>(&listener);
245                         if(pLonglongListener == runtimeArg->pListener)
246                         {
247                                 pLonglongListener->OnResultReceivedForGetValueAsync(runtimeArg->longLongValue, runtimeArg->errorCode);
248                                 RemoveListener(listener);
249                         }
250                 }
251                 break;
252                 }
253         }
254 };
255
256 _RuntimeInfoEvent runtimeInfoEvent;
257
258 _RuntimeInfoImpl::_RuntimeInfoImpl(void)
259 {
260 }
261
262 _RuntimeInfoImpl::~_RuntimeInfoImpl(void)
263 {
264 }
265
266 result
267 _RuntimeInfoImpl::GetValue(const String& key, String& value)
268 {
269         if (key == _BOOT_STATUS_KEY)
270         {
271                 int bootReady = -1;
272                 const int errorCode = vconf_get_int(VCONFKEY_SERVICE_READY, &bootReady);
273                 if (errorCode != 0)
274                 {
275                         value = (bootReady == 1 ) ? _BOOT_STATUS_READY : _BOOT_STATUS_INITIALIZING;
276
277                         return E_SUCCESS;
278                 }
279
280                 return E_SYSTEM;
281         }
282         else
283         {
284                 return E_OBJ_NOT_FOUND;
285         }
286 }
287
288 result
289 _RuntimeInfoImpl::GetValue(const String& key, int& value)
290 {
291         int total_size = 0;
292         int free_size =0;
293         result r = E_OBJ_NOT_FOUND;
294
295         if (key == _BATTERY_LEVEL)
296         {
297                 return GetBatteryLevel(value);
298         }
299         else if (key == _ALLOCATED_MEMORY || key == _ALLOCATED_VIDEO_MEMORY)
300         {
301                 r = GetFromProc(_PROC_PROCESS_MEMORY_INFO, _PROC_KEY_PROCESS_MEMORY, free_size);
302                 SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to get memory size.");
303                 value = free_size * 1024;
304         }
305         else if (key == _AVAILABLE_MEMORY || key == _AVAILABLE_VIDEO_MEMORY || key == _MAX_ALLOCATABLE_MEMORY)
306         {
307                 r = GetFromProc(_PROC_SYSTEM_MEMORY_INFO, _PROC_KEY_SYSTEM_MEMORY_FREE, free_size);
308                 SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to get memory size.");
309                 value = free_size * 1024;
310         }
311         return r;
312 }
313
314 result
315 _RuntimeInfoImpl::GetValue(const String& key, long long& value)
316 {
317
318         long long total_size = 0;
319         long long free_size =0;
320         result r = E_OBJ_NOT_FOUND;
321
322         if (key == _MEMORY_AVAILABLE || key == _MEMORY_AVAILABLE_VIDEO)
323         {
324                 r = GetFromProcLonglong(_PROC_SYSTEM_MEMORY_INFO, _PROC_KEY_SYSTEM_MEMORY_FREE, free_size);
325                 SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to get memory size.");
326                 value = free_size * 1024;
327         }
328         else if (key == _MEMORY_ALLOCATED || key == _MEMORY_ALLOCATED_VIDEO)
329         {
330                 r = GetFromProcLonglong(_PROC_SYSTEM_MEMORY_INFO, _PROC_KEY_SYSTEM_MEMORY_TOTAL, total_size);
331                 SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to get memory size.");
332                 r = GetFromProcLonglong(_PROC_SYSTEM_MEMORY_INFO, _PROC_KEY_SYSTEM_MEMORY_FREE, free_size);
333                 SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to get memory size.");
334                 value = (total_size - free_size) * 1024;
335         }
336         else if (key == _MEMORY_ALLOCATED_SELF)
337         {   
338                 r = GetFromProcLonglong(_PROC_PROCESS_MEMORY_INFO, _PROC_KEY_PROCESS_MEMORY, free_size);
339                 SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to get memory size.");
340                 value = free_size * 1024;
341         } 
342         else if (key == _AVAILABLE_INTERNAL_STORAGE)
343         {
344                 return GetAvailableInternalStorage(value);
345         }
346         else if (key == _AVAILABLE_EXTERNAL_STORAGE)
347         {
348                 return GetAvailableExternalStorage(value);
349         }
350         else if (key == _AVAILABLE_MEDIA_STORAGE)
351         {
352                 return GetAvailableMediaStorage(value);
353         }
354         else if(key == _STORAGE_AVAILABLE_INTERNAL)
355         {
356                 return GetAvailableInternalStorage(value);
357         }
358         else if(key == _STORAGE_AVAILABLE_EXTERNAL)
359         {
360                 return GetAvailableExternalStorage(value);
361         }
362         else if(key == _STORAGE_AVAILABLE_INTERNAL_MEDIA)
363         {
364                 return GetAvailableMediaStorage(value);
365         }
366         else
367         {
368                 SysLogException(NID_SYS, r, "Key[%ls] is not valid.", key.GetPointer());
369         }
370         return r;
371 }
372
373 long long
374 _RuntimeInfoImpl::GetDirectorySize(const char* path)
375 {
376         if(path == null)
377         {
378                 return 0;
379         }
380
381         char* pCommand = null;
382         char* pFileName = null;
383         int fileLength = 0;
384         int commandLength = 0;
385         long long size = 0;
386         int ret = 0;
387         FILE* pFile = null;
388
389         Tizen::App::App* pApp = Tizen::App::App::GetInstance();
390         if(pApp == null)
391         {
392                 return 0;
393         }
394
395         String appId(pApp->GetAppId());
396         unique_ptr <char[]> appIdPath(_StringConverter::CopyToCharArrayN(appId));
397
398         fileLength = strlen(appIdPath.get()) + 29;
399         pFileName = (char*)malloc(fileLength);
400         ret = sprintf(pFileName, "/tmp/size_of_directory_%s.tmp", appIdPath.get());
401         SysTryCatch(NID_SYS, ret > 0, E_SYSTEM, E_SYSTEM, "It is failed to write file path.");
402
403         commandLength = strlen(pFileName) + 8;
404         pCommand = (char*) malloc(commandLength);
405         ret = sprintf(pCommand, "rm -rf %s", pFileName);
406         SysTryCatch(NID_SYS, ret > 0, E_SYSTEM, E_SYSTEM, "It is failed to write remove pCommand.");
407
408         ret = system(pCommand);
409         if(ret == -1)
410         {
411                 SysLogException(NID_SYS, E_SYSTEM, "It is failed to execute pCommand[%s].", pCommand);
412         }
413         free(pCommand);
414         pCommand = null;
415
416         commandLength = strlen(pFileName) + strlen(path) + 16;
417         pCommand = (char*)malloc(commandLength);
418         ret = sprintf(pCommand, "du -skb -P %s >> %s", path, pFileName);
419         SysTryCatch(NID_SYS, ret > 0, E_SYSTEM, E_SYSTEM, "It is failed to write du pCommand.");
420
421         ret = system(pCommand);
422         SysTryCatch(NID_SYS, ret != -1, E_SYSTEM, E_SYSTEM, "It is failed to execute pCommand[%s].", pCommand);
423
424         pFile = fopen(pFileName, "r");
425         SysTryCatch(NID_SYS, pFile != null, E_SYSTEM, E_SYSTEM, "It is failed to read file [%s].", pFileName);
426
427         ret = fscanf(pFile, "%lld", &size);
428         SysTryCatch(NID_SYS, ret > 0, E_SYSTEM, E_SYSTEM, "It is failed to read file [%s].", pFileName);
429
430         ret = sprintf(pCommand, "rm -rf %s", pFileName);
431         SysTryCatch(NID_SYS, ret > 0, E_SYSTEM, E_SYSTEM, "It is failed to write remove pCommand.");
432
433         ret = system(pCommand);
434         SysTryCatch(NID_SYS, ret != -1, E_SYSTEM, E_SYSTEM, "It is failed to execute pCommand[%s].", pCommand);
435
436 CATCH:
437         if (pFileName)
438         {
439                 free(pFileName);
440         }
441         if (pCommand)
442         {
443                 free(pFileName);
444         }
445         if (pFile)
446         {
447                 fclose(pFile);
448         }
449         return size;
450 }
451
452 result
453 _RuntimeInfoImpl::GetValue(const String& key, double& value)
454 {
455         return E_OBJ_NOT_FOUND;
456 }
457
458 result
459 _RuntimeInfoImpl::GetValue(const String& key, bool& value)
460 {
461         if (key == _CHARGING)
462         {
463                 return IsChargingMode(value);
464         }
465         else
466         {
467                 return E_OBJ_NOT_FOUND;
468         }
469 }
470
471 result
472 _RuntimeInfoImpl::GetValue(const String& key, UuId& value)
473 {
474         return E_OBJ_NOT_FOUND;
475 }
476
477 result
478 _RuntimeInfoImpl::GetBatteryLevel(int& value)
479 {
480         int batteryValue = -1;
481         batteryValue = device_get_battery_pct();
482         SysTryReturnResult(NID_SYS, !(batteryValue < 0 || value > 100), E_SYSTEM, "[E_SYSTEM] device_get_battery_pct return %d", batteryValue);
483         value = batteryValue;
484
485         return E_SUCCESS;
486 }
487
488 result
489 _RuntimeInfoImpl::IsChargingMode(bool& value)
490 {
491         bool chargeState = false;
492         int ret = 0;
493         ret = runtime_info_get_value_bool(RUNTIME_INFO_KEY_BATTERY_IS_CHARGING, &chargeState);
494         SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "[E_SYSTEM] runtime_info_get_value_bool returns %d.", ret);
495         value = chargeState;
496         return E_SUCCESS;
497
498 }
499
500 result
501 _RuntimeInfoImpl::GetAvailableInternalStorage(long long& value)
502 {
503         long long total = 0;
504         result r = E_SUCCESS;
505
506         r = GetCapacity(_ROOT_PATH, total, value);
507         SysTryReturn(NID_SYS, !IsFailed(r), E_SYSTEM, r, "[E_SYSTEM] system error has occurred. ");
508
509         return E_SUCCESS;
510 }
511 result
512 _RuntimeInfoImpl::GetAvailableExternalStorage(long long& value)
513 {
514         int sdCardStatus = 0;
515         int ret = -1;
516         long long total = 0;
517
518         ret = vconf_get_int(VCONFKEY_SYSMAN_MMC_STATUS, &sdCardStatus);
519         SysTryReturn(NID_SYS, !(ret < 0), E_SYSTEM, E_SYSTEM, "[E_SYSTEM] vconf_get_int VCONFKEY_SYSMAN_MMC_STATUS failed");
520
521         if(sdCardStatus == 0)
522         {
523                 value = 0;
524                 return E_SUCCESS;
525         }
526         char* directoryPath = _StringConverter::CopyToCharArrayN(_EnvironmentImpl::GetExternalStoragePath());
527         SysTryReturnResult(NID_SYS, directoryPath != null, E_SYSTEM, "It is failed to get external directory path.");
528         result r = GetCapacity(directoryPath, total, value);
529         delete [] directoryPath;
530         return r ;
531 }
532
533 result
534 _RuntimeInfoImpl::GetAvailableMediaStorage(long long& value)
535 {
536         long long total = 0;
537
538         char* directoryPath = _StringConverter::CopyToCharArrayN(_EnvironmentImpl::GetMediaPath());
539         SysTryReturnResult(NID_SYS, directoryPath != null, E_SYSTEM, "It is failed to get media directory path.");
540         result r = GetCapacity(directoryPath, total, value);
541         delete [] directoryPath;
542         return r;
543 }
544
545 result
546 _RuntimeInfoImpl::GetCapacity(const char* path, long long& totalSize, long long& availableSize)
547 {
548         struct statfs fs;
549         if (statfs(path, &fs) < 0)
550         {
551                 SysLogException(NID_SYS, E_SYSTEM, "[E_SYSTEM] statfs() failed");
552                 return E_SYSTEM;
553         }
554
555         totalSize = static_cast< long long >(fs.f_bsize) * static_cast< long long >(fs.f_blocks);
556         availableSize = static_cast< long long >(fs.f_bsize) * static_cast< long long >(fs.f_bavail);
557
558         return E_SUCCESS;
559 }
560
561 result
562 _RuntimeInfoImpl::GetFromProcLonglong(const char* path, const char* key, long long& value)
563 {
564         FILE* pStream = null;
565         char line[_MAX_BUFFER_LENGTH] = {0, };
566         char fieldName[_MAX_BUFFER_LENGTH] = {0, };
567         long long keyValue = 0;
568         pStream = fopen(path, "r");
569         SysTryReturnResult(NID_SYS, pStream != null, E_SYSTEM, "%s open is failed.", path);
570
571         while (fgets(line, sizeof(line), pStream))
572         {
573                 if (sscanf(line, "%s %lld %*s", fieldName, &keyValue) == 2)
574                 {
575                         if (strncmp(fieldName, key, static_cast< int >(strlen(key))) == 0)
576                         {
577                                 value = keyValue;
578                                 fclose(pStream);
579                                 return E_SUCCESS;
580                         }
581                 }
582         }
583         fclose(pStream);
584
585         SysLogException(NID_SYS, E_OBJ_NOT_FOUND, "it can't find %s field", key);
586         return E_OBJ_NOT_FOUND;
587 }
588
589 result
590 _RuntimeInfoImpl::GetFromProc(const char* path, const char* key, int& value)
591 {
592         FILE* pStream = null;
593         char line[_MAX_BUFFER_LENGTH] = {0, };
594         char fieldName[_MAX_BUFFER_LENGTH] = {0, };
595         int keyValue = 0;
596         pStream = fopen(path, "r");
597         SysTryReturnResult(NID_SYS, pStream != null, E_SYSTEM, "%s open is failed.", path);
598
599         while (fgets(line, sizeof(line), pStream))
600         {
601                 if (sscanf(line, "%s %d %*s", fieldName, &keyValue) == 2)
602                 {
603                         if (strncmp(fieldName, key, static_cast< int >(strlen(key))) == 0)
604                         {
605                                 value = keyValue;
606                                 fclose(pStream);
607                                 return E_SUCCESS;
608                         }
609                 }
610         }
611         fclose(pStream);
612
613         SysLogException(NID_SYS, E_OBJ_NOT_FOUND, "it can't find %s field", key);
614         return E_OBJ_NOT_FOUND;
615 }
616
617 void*
618 _RuntimeInfoImpl::GetDirectorySizeAsync(void* data)
619 {       
620         if(data == null)
621         {               
622                 return null;
623         }
624         _RuntimeInfoEventArg* pEventArg = (_RuntimeInfoEventArg*)data;
625         long long size = _RuntimeInfoImpl::GetDirectorySize(pEventArg->DirectoryPath);
626
627         if(pEventArg == null)
628         {
629                 SysLogException(NID_SYS, E_OUT_OF_MEMORY, "It is failed to create instance of _RuntimeInfoEventArg");
630                 return null;
631         }
632         pEventArg->Type = _RUNTIME_INFO_EVENT_TYPE_LONGLONG;
633         pEventArg->longLongValue = size;
634         SysLog(NID_SYS, "Fire event %x %s %lld", pEventArg, pEventArg->DirectoryPath, size);
635         runtimeInfoEvent.Fire(*pEventArg);
636         
637         return null;
638 }
639
640 void*
641 _RuntimeInfoImpl::GetCpuUsageAsync(void* data)
642 {
643         result r = E_SUCCESS;
644
645         int value = 0;
646         procstat_t first, second, diffrence;
647         unsigned long long total, usage;
648
649         if(read_proc_stat(&first) != false)
650         {
651                 usleep(_CPU_USAGE_EVALUATION_INTERVAL);
652                 if(read_proc_stat(&second) != false)
653                 {
654                         diff_proc_stat(&second, &first, &diffrence);
655                         total = diffrence.user + diffrence.system 
656                                 + diffrence.nice + diffrence.idle 
657                                 + diffrence.wait + diffrence.hi 
658                                 + diffrence.si;
659                         usage = 10000 - (diffrence.idle * 10000 / total);
660                         value = usage/100;
661                         r = E_SUCCESS;
662                 }
663                 else
664                 {
665                         r = E_SYSTEM;
666                 }
667         }
668         else
669         {
670                 r = E_SYSTEM;
671         }
672
673         _RuntimeInfoEventArg* pEventArg = (_RuntimeInfoEventArg*) data;
674         if(pEventArg == null)
675         {
676                 SysLogException(NID_SYS, E_OUT_OF_MEMORY, "It is failed to create instance of _RuntimeInfoEventArg");
677                 return null;
678         }
679         pEventArg->errorCode = r;
680         pEventArg->Type = _RUNTIME_INFO_EVENT_TYPE_INT;
681         pEventArg->intValue = value;
682
683         runtimeInfoEvent.Fire(*pEventArg);
684
685         return null;
686 }
687
688 result
689 _RuntimeInfoImpl::GetValueAsync(const String& key, IRuntimeInfoGetIntAsyncResultListener* listener)
690 {
691         result r = E_SUCCESS;
692
693         SysTryReturnResult(NID_SYS, listener != null, E_INVALID_ARG, "listener is null");
694
695         if (key == _CPU_CORE_ALL_USAGE)
696         {
697                 if(listener != null)
698                 {
699                         runtimeInfoEvent.AddListener(*listener);
700                 }
701
702                 int thr_id = 0;
703                 pthread_t p_thread;
704                 _RuntimeInfoEventArg* pEventArg = new (std::nothrow) _RuntimeInfoEventArg();
705                 pEventArg->pListener = listener;
706                 thr_id = pthread_create(&p_thread, null, GetCpuUsageAsync, pEventArg);
707                 pthread_detach(p_thread);
708         }
709         else
710         {
711                 SysLogException(NID_SYS, E_INVALID_ARG, "Required key[%ls] is not valid", key.GetPointer());
712                 r = E_INVALID_ARG;
713         }
714         return r;
715 }
716
717 result
718 _RuntimeInfoImpl::GetValueAsync(const String& key, IRuntimeInfoGetLonglongAsyncResultListener* listener)
719 {
720         int thr_id = 0;
721         pthread_t p_thread;
722         result r = E_SUCCESS;
723         String directoryPath;
724
725         SysTryReturnResult(NID_SYS, listener != null, E_INVALID_ARG, "listener is null");
726
727         if(key == _STORAGE_ALLOCATED_INTERNAL_APPLICATION)
728         {
729                 directoryPath.Append(_EnvironmentImpl::GetPredefinedPath(PREDEFINED_DIRECTORY_APPLICATIONS));
730         }       
731         else if (key == _STORAGE_ALLOCATED_INTERNAL_AUDIO)
732         {
733                 directoryPath.Append(_EnvironmentImpl::GetPredefinedPath(PREDEFINED_DIRECTORY_SOUNDS));
734         }
735         else if (key == _STORAGE_ALLOCATED_INTERNAL_VIDEO)
736         {
737                 directoryPath.Append(_EnvironmentImpl::GetPredefinedPath(PREDEFINED_DIRECTORY_VIDEOS));
738         }
739         else if (key == _STORAGE_ALLOCATED_INTERNAL_IMAGE)
740         {
741                 directoryPath.Append(_EnvironmentImpl::GetPredefinedPath(PREDEFINED_DIRECTORY_IMAGES));
742         }
743         else if (key == _STORAGE_ALLOCATED_INTERNAL_DOWNLOAD)
744         {
745                 directoryPath.Append(_EnvironmentImpl::GetPredefinedPath(PREDEFINED_DIRECTORY_DOWNLOADS));
746         }
747         else if (key == _STORAGE_ALLOCATED_EXTERNAL_APPLICATION)
748         {
749                 directoryPath.Append(_EnvironmentImpl::GetPredefinedPath(PREDEFINED_DIRECTORY_EXTERNAL_APPLICATIONS));
750         }
751         else if (key == _STORAGE_ALLOCATED_EXTERNAL_AUDIO)
752         {
753                 directoryPath.Append(_EnvironmentImpl::GetPredefinedPath(PREDEFINED_DIRECTORY_EXTERNAL_SOUNDS));
754         }
755         else if (key == _STORAGE_ALLOCATED_EXTERNAL_VIDEO)
756         {
757                 directoryPath.Append(_EnvironmentImpl::GetPredefinedPath(PREDEFINED_DIRECTORY_EXTERNAL_VIDEOS));
758         }
759         else if (key == _STORAGE_ALLOCATED_EXTERNAL_IMAGE)
760         {
761                 directoryPath.Append(_EnvironmentImpl::GetPredefinedPath(PREDEFINED_DIRECTORY_EXTERNAL_IMAGES));
762         }
763         else if (key == _STORAGE_ALLOCATED_EXTERNAL_DOWNLOAD)
764         {
765                 directoryPath.Append(_EnvironmentImpl::GetPredefinedPath(PREDEFINED_DIRECTORY_EXTERNAL_DOWNLOADS));
766         }
767         else
768         {
769                 SysLogException(NID_SYS, E_INVALID_ARG, "Required key[%ls] is not valid", key.GetPointer());
770                 r = E_INVALID_ARG;
771         }
772
773         SysLog(NID_SYS, "%s", GetErrorMessage(r));
774         SysLog(NID_SYS, "%ls", directoryPath.GetPointer());
775         if(r == E_SUCCESS)
776         {
777                 _RuntimeClient* pRuntimeClient = _RuntimeClient::GetInstance();
778                 pRuntimeClient->GetDirectorySizeValueAsync(directoryPath, listener);
779         }
780
781         return r;
782 }
783
784 _RuntimeInfoImpl*
785 _RuntimeInfoImpl::GetInstance(RuntimeInfo& runtimeinfo)
786 {
787         return runtimeinfo.__pRuntimeInfoImpl;
788 }
789
790 const _RuntimeInfoImpl*
791 _RuntimeInfoImpl::GetInstance(const RuntimeInfo& runtimeinfo)
792 {
793         return runtimeinfo.__pRuntimeInfoImpl;
794 }
795
796 } } //Tizen::System
797