879c09f47a853a540c584325b56eab4b8307b7ca
[framework/osp/common-service.git] / src / system / FSys_SettingService.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                FSys_SettingService.cpp
19  * @brief               This is the implementation file for _SettingService class.
20  */
21
22 #include <unique_ptr.h>
23
24 #include <FBaseBoolean.h>
25 #include <FBaseInteger.h>
26 #include <FBaseSysLog.h>
27
28 #include <FIo_IpcServer.h>
29 #include <FIo_AppServiceIpcMessages.h>
30 #include <FSec_AccessController.h>
31
32 #include "FSys_SettingService.h"
33
34 using namespace std;
35 using namespace Tizen::App;
36 using namespace Tizen::Base;
37 using namespace Tizen::Base::Collection;
38 using namespace Tizen::Io;
39 using namespace Tizen::Security;
40
41 namespace Tizen { namespace System {
42
43 const static wchar_t* SETTING_SERVICE_ID = L"osp.sys.ipcserver.setting_service";
44
45 const static wchar_t* SETTING_SERVICE_COMMAND_GET_BOOL = L"osp.sys.ipcserver.setting_service.command.get.bool";
46 const static wchar_t* SETTING_SERVICE_COMMAND_GET_INT = L"osp.sys.ipcserver.setting_service.command.get.int";
47 const static wchar_t* SETTING_SERVICE_COMMAND_GET_STRING = L"osp.sys.ipcserver.setting_service.command.get.string";
48 const static wchar_t* SETTING_SERVICE_COMMAND_SET_BOOL = L"osp.sys.ipcserver.setting_service.command.set.bool";
49 const static wchar_t* SETTING_SERVICE_COMMAND_SET_INT = L"osp.sys.ipcserver.setting_service.command.set.int";
50 const static wchar_t* SETTING_SERVICE_COMMAND_SET_STRING = L"osp.sys.ipcserver.setting_service.command.set.string";
51 const static wchar_t* SETTING_SERVICE_COMMAND_SET_PRIV_BOOL = L"osp.sys.ipcserver.setting_service.command.set.priv.bool";
52 const static wchar_t* SETTING_SERVICE_COMMAND_SET_PRIV_STRING = L"osp.sys.ipcserver.setting_service.command.set.priv.string";
53 const static wchar_t* SETTING_SERVICE_COMMAND_SET_ASYNC_BOOL = L"osp.sys.ipcserver.setting_service.command.set.async.bool";
54 const static wchar_t* SETTING_SERVICE_COMMAND_SET_PRIV_ASYNC_BOOL = L"osp.sys.ipcserver.setting_service.command.set.priv.async.bool";
55 const static wchar_t* SETTING_SERVICE_COMMAND_RESULT = L"osp.sys.ipcserver.setting_service.command.result";
56
57 const static wchar_t* SETTING_SERVICE_COMMAND_SUBSCRIBE = L"osp.sys.ipcserver.setting_service.command.subscribe";
58 const static wchar_t* SETTING_SERVICE_COMMAND_UNSUBSCRIBE = L"osp.sys.ipcserver.setting_service.command.unsubscribe";
59 const static wchar_t* SETTING_SERVICE_COMMAND_EVENT = L"osp.sys.ipcserver.setting_service.command.event";
60
61 const static wchar_t* SETTING_SERVICE_COMMAND_SUPPORTED = L"osp.sys.ipcserver.setting_service.command.supported";
62
63 const static wchar_t* SETTING_SERVICE_COMMAND_SUBSCRIBE_INTERNAL = L"osp.sys.ipcserver.setting_service.command.subscribe.internal";
64 const static wchar_t* SETTING_SERVICE_COMMAND_UNSUBSCRIBE_INTERNAL = L"osp.sys.ipcserver.setting_service.command.unsubscribe.internal";
65 const static wchar_t* SETTING_SERVICE_COMMAND_EVENT_INTERNAL = L"osp.sys.ipcserver.setting_service.command.event.internal";
66
67 const static int SETTING_SERVICE_IPC_MSG_COMMAND = 0;
68 const static int SETTING_SERVICE_IPC_MSG_KEY = 1;
69 const static int SETTING_SERVICE_IPC_MSG_VALUE = 2;
70
71 const static wchar_t* _SETTINGS_KEY_FONT_SIZE = L"http://tizen.org/setting/font.size";
72 const static wchar_t* _SETTINGS_KEY_FONT_TYPE = L"http://tizen.org/setting/font.type";
73 const static wchar_t* _SETTINGS_KEY_LOCALE_COUNTRY = L"http://tizen.org/setting/locale.country";
74 const static wchar_t* _SETTINGS_KEY_LOCALE_LANGUAGE = L"http://tizen.org/setting/locale.language";
75
76 _SettingService* _SettingService::__pSettingService = null;
77
78 _SettingService::_SettingService()
79         : __serviceId(SETTING_SERVICE_ID)
80         , __pSettingInfo(null)
81         , __asyncList(SingleObjectDeleter)
82         , __eventList(SingleObjectDeleter)
83         , __eventListForInternal(SingleObjectDeleter)
84 {
85         result r = E_SUCCESS;
86
87         r = __ipcServer.Construct(__serviceId, *this, true);
88         SysTryReturnVoidResult(NID_SYS, r == E_SUCCESS, r, "It is failed to construct IPC server.");
89
90         __pSettingInfo = _SettingInfo::GetInstance();
91         SysTryCatch(NID_SYS, __pSettingInfo != null, r = E_SYSTEM, E_SYSTEM, "It is failed to get instance of _SettingInfo.");
92
93         __pSettingInfo->AddSettingEventListener(*this);
94         r = __asyncList.Construct();
95         SysTryCatch(NID_SYS, r == E_SUCCESS, , r, "It is failed to construct async list.");
96
97         r = __eventList.Construct();
98         SysTryCatch(NID_SYS, r == E_SUCCESS, , r, "It is failed to construct event list.");
99
100         r = __eventListForInternal.Construct();
101         SysTryCatch(NID_SYS, r == E_SUCCESS, , r, "It is failed to construct event list for internal.");
102
103         r = __ipcServer.Start();
104         SysTryCatch(NID_SYS, r == E_SUCCESS, , r, "It is failed to start IPC server.");
105
106         r = __responseMessage.Construct();
107         SysTryCatch(NID_SYS, r == E_SUCCESS, , r, "It is failed to create response message container.");
108
109 CATCH:
110         if(r != E_SUCCESS)
111         {
112                 __pSettingInfo = null;
113                 SysLogException(NID_SYS, r, "It is failed to construct _SettingService.");
114                 __ipcServer.Stop();
115         }
116 }
117
118 _SettingService::~_SettingService()
119 {
120         __pSettingInfo->RemoveSettingEventListener(*this);
121         __pSettingInfo = null;
122         result r = __ipcServer.Stop();
123         __responseMessage.RemoveAll(true);
124         SysTryReturnVoidResult(NID_SYS, r == E_SUCCESS, r, "It is failed to stop IPC server.");
125 }
126
127 _SettingService*
128 _SettingService::GetInstance(void)
129 {
130         static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
131         if(__pSettingService == null)
132         {
133                 pthread_once(&onceBlock, InitSingleton);
134         }
135         return __pSettingService;
136 }
137
138 void
139 _SettingService::InitSingleton(void)
140 {
141         _SettingService* pSettingService = new (nothrow) _SettingService();
142         SysTryReturnVoidResult(NID_SYS, pSettingService != null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
143
144         __pSettingService = pSettingService;
145         atexit(DestroySingleton);
146 }
147
148 void
149 _SettingService::OnIpcRequestReceived(_IpcServer& server, const IPC::Message& message)
150 {
151         __currentPkgId = server.GetClientPackageId();
152         __currentPid = server.GetClientId();
153         IPC_BEGIN_MESSAGE_MAP(_SettingService, message)
154                 IPC_MESSAGE_HANDLER_EX(IoService_Request, &server, OnRequestOccured)
155         IPC_END_MESSAGE_MAP_EX()
156 }
157
158 bool
159 _SettingService::OnRequestOccured(const ArrayList& request, ArrayList* response)
160 {
161         result r = E_SUCCESS;
162         String* pCommand = null;
163         String* pKey = null;
164         String* pValue = null;
165
166         SysTryCatch(NID_SYS, response != null, r = E_SYSTEM, r, "There is no response instance.");
167
168         __responseMessage.RemoveAll(true);
169         pCommand = (String*)request.GetAt(SETTING_SERVICE_IPC_MSG_COMMAND);
170         SysTryCatch(NID_SYS, pCommand != null, r = E_SYSTEM, r, "There is no command information.");
171
172         SysLog(NID_SYS, "Required command is [%ls].", pCommand->GetPointer());
173
174         if(*pCommand == SETTING_SERVICE_COMMAND_GET_INT)
175         {
176                 int value = 0;
177
178                 pKey = (String*)request.GetAt(SETTING_SERVICE_IPC_MSG_KEY);
179                 SysTryCatch(NID_SYS, pKey != null, r = E_SYSTEM, r, "There is no key information.");
180                 r = __pSettingInfo->GetValue(*pKey, value);
181                 pValue = new (nothrow) String();
182                 SysTryCatch(NID_SYS, pValue != null, r = E_SYSTEM, r, "It is failed to create pValue.");
183                 pValue->Append(value);
184         }
185         else if(*pCommand == SETTING_SERVICE_COMMAND_GET_BOOL)
186         {
187                 bool value = false;
188
189                 pKey = (String*)request.GetAt(SETTING_SERVICE_IPC_MSG_KEY);
190                 SysTryCatch(NID_SYS, pKey != null, r = E_SYSTEM, r, "There is no key information.");
191                 r = __pSettingInfo->GetValue(*pKey, value);
192                 pValue = new (nothrow) String();
193                 SysTryCatch(NID_SYS, pValue != null, r = E_SYSTEM, r, "It is failed to create pValue.");
194                 pValue->Append(value);
195         }
196         else if(*pCommand == SETTING_SERVICE_COMMAND_GET_STRING)
197         {
198                 String value;
199
200                 pKey = (String*)request.GetAt(SETTING_SERVICE_IPC_MSG_KEY);
201                 SysTryCatch(NID_SYS, pKey != null, r = E_SYSTEM, r, "There is no key information.");
202                 r = __pSettingInfo->GetValue(*pKey, value);
203                 pValue = new (nothrow) String(value);
204         }
205         else if(*pCommand == SETTING_SERVICE_COMMAND_SET_INT)
206         {
207                 int value = 0;
208
209                 r = _AccessController::CheckSystemPrivilege(__currentPkgId, _PRV_SETTING);
210                 SysTryCatch(NID_SYS, r == E_SUCCESS, r = E_PRIVILEGE_DENIED, r, "The application[%ls] does not have the privilege to call this method.", __currentPkgId.GetPointer());
211
212                 pKey = (String*)request.GetAt(SETTING_SERVICE_IPC_MSG_KEY);
213                 SysTryCatch(NID_SYS, pKey != null, r = E_SYSTEM, r, "There is no key information.");
214                 pValue = (String*)request.GetAt(SETTING_SERVICE_IPC_MSG_VALUE);
215                 Integer::Parse(*pValue, value);
216                 r = __pSettingInfo->SetValue(*pKey, value);
217         }
218         else if(*pCommand == SETTING_SERVICE_COMMAND_SET_BOOL)
219         {
220                 bool value = false;
221
222                 r = _AccessController::CheckSystemPrivilege(__currentPkgId, _PRV_SETTING);
223                 SysTryCatch(NID_SYS, r == E_SUCCESS, r = E_PRIVILEGE_DENIED, r, "The application[%ls] does not have the privilege to call this method.", __currentPkgId.GetPointer());
224
225                 pKey = (String*)request.GetAt(SETTING_SERVICE_IPC_MSG_KEY);
226                 SysTryCatch(NID_SYS, pKey != null, r = E_SYSTEM, r, "There is no key information.");
227                 pValue = (String*)request.GetAt(SETTING_SERVICE_IPC_MSG_VALUE);
228                 value = Boolean::Parse(*pValue);
229                 r = __pSettingInfo->SetValue(*pKey, value);
230         }
231         else if(*pCommand == SETTING_SERVICE_COMMAND_SET_STRING)
232         {
233
234                 r = _AccessController::CheckSystemPrivilege(__currentPkgId, _PRV_SETTING);
235                 SysTryCatch(NID_SYS, r == E_SUCCESS, r = E_PRIVILEGE_DENIED, r, "The application[%ls] does not have the privilege to call this method.", __currentPkgId.GetPointer());
236
237                 pKey = (String*)request.GetAt(SETTING_SERVICE_IPC_MSG_KEY);
238                 SysTryCatch(NID_SYS, pKey != null, r = E_SYSTEM, r, "There is no key information.");
239                 pValue = (String*)request.GetAt(SETTING_SERVICE_IPC_MSG_VALUE);
240                 r = __pSettingInfo->SetValue(*pKey, *pValue);
241         }
242         else if(*pCommand == SETTING_SERVICE_COMMAND_SET_PRIV_BOOL)
243         {
244                 bool value = false;
245
246                 r = _AccessController::CheckSystemPrivilege(__currentPkgId, _PRV_SYSTEMSETTING_WRITE, _PRV_SETTINGMANAGER_WRITE);
247                 SysTryCatch(NID_SYS, r == E_SUCCESS, r = E_PRIVILEGE_DENIED, r, "The application[%ls] does not have the privilege to call this method.", __currentPkgId.GetPointer());
248
249                 pKey = (String*)request.GetAt(SETTING_SERVICE_IPC_MSG_KEY);
250                 SysTryCatch(NID_SYS, pKey != null, r = E_SYSTEM, r, "There is no key information.");
251                 pValue = (String*)request.GetAt(SETTING_SERVICE_IPC_MSG_VALUE);
252                 value = Boolean::Parse(*pValue);
253                 r = __pSettingInfo->SetValueForPrivilegedKey(*pKey, value);
254         }
255         else if(*pCommand == SETTING_SERVICE_COMMAND_SET_PRIV_STRING)
256         {
257                 r = _AccessController::CheckSystemPrivilege(__currentPkgId, _PRV_SYSTEMSETTING_WRITE, _PRV_SETTINGMANAGER_WRITE);
258                 SysTryCatch(NID_SYS, r == E_SUCCESS, r = E_PRIVILEGE_DENIED, r, "The application[%ls] does not have the privilege to call this method.", __currentPkgId.GetPointer());
259
260                 pKey = (String*)request.GetAt(SETTING_SERVICE_IPC_MSG_KEY);
261                 SysTryCatch(NID_SYS, pKey != null, r = E_SYSTEM, r, "There is no key information.");
262                 pValue = (String*)request.GetAt(SETTING_SERVICE_IPC_MSG_VALUE);
263                 r = __pSettingInfo->SetValueForPrivilegedKey(*pKey, *pValue);
264         }
265         else if(*pCommand == SETTING_SERVICE_COMMAND_SET_ASYNC_BOOL)
266         {
267                 bool value = false;
268
269                 r = _AccessController::CheckSystemPrivilege(__currentPkgId, _PRV_SETTING);
270                 SysTryCatch(NID_SYS, r == E_SUCCESS, r = E_PRIVILEGE_DENIED, r, "The application[%ls] does not have the privilege to call this method.", __currentPkgId.GetPointer());
271
272                 pKey = (String*)request.GetAt(SETTING_SERVICE_IPC_MSG_KEY);
273                 SysTryCatch(NID_SYS, pKey != null, r = E_SYSTEM, r, "There is no key information.");
274                 pValue = (String*)request.GetAt(SETTING_SERVICE_IPC_MSG_VALUE);
275
276                 SysLog(NID_SYS, "Key is %ls, Value is %ls, pid is %d.", pKey->GetPointer(), pValue->GetPointer(), __currentPid);
277                 if(*pValue == L"true")
278                 {
279                         value = true;
280                 }
281                 else
282                 {
283                         value = false;
284                 }
285                 unique_ptr<String> reservedKey(new (nothrow)String(*pKey));
286                 SysTryCatch(NID_SYS, __asyncList.ContainsKey(*(reservedKey.get())) == false, r = E_IN_PROGRESS, r, "Required key(%ls) is already under processing.", pKey->GetPointer());
287                 unique_ptr<Integer> reservedPid(new (nothrow)Integer(__currentPid));
288
289                 r = __asyncList.Add(reservedKey.get(), reservedPid.get());
290                 SysTryCatch(NID_SYS, r == E_SUCCESS, r = E_SYSTEM, r, "It is failed to add aync list.");
291                 reservedPid.release();
292                 reservedKey.release();
293
294                 r = __pSettingInfo->SetValueAsync(*pKey, value, this);
295                 if(r != E_SUCCESS)
296                 {
297                         __asyncList.Remove(*pKey);
298                 }
299                 SysLog(NID_SYS, "Result is %s.", GetErrorMessage(r));
300         }
301         else if(*pCommand == SETTING_SERVICE_COMMAND_SET_PRIV_ASYNC_BOOL)
302         {
303                 bool value = false;
304                 r = _AccessController::CheckSystemPrivilege(__currentPkgId, _PRV_SYSTEMSETTING_WRITE, _PRV_SETTINGMANAGER_WRITE);
305                 SysTryCatch(NID_SYS, r == E_SUCCESS, r = E_PRIVILEGE_DENIED, r, "The application[%ls] does not have the privilege to call this method.", __currentPkgId.GetPointer());
306
307                 pKey = (String*)request.GetAt(SETTING_SERVICE_IPC_MSG_KEY);
308                 SysTryCatch(NID_SYS, pKey != null, r = E_SYSTEM, r, "There is no key information.");
309                 pValue = (String*)request.GetAt(SETTING_SERVICE_IPC_MSG_VALUE);
310
311                 SysLog(NID_SYS, "Key is %ls, Value is %ls, pid is %d.", pKey->GetPointer(), pValue->GetPointer(), __currentPid);
312                 if(*pValue == L"true")
313                 {
314                         value = true;
315                 }
316                 else
317                 {
318                         value = false;
319                 }
320
321                 unique_ptr<String> reservedKey(new (nothrow)String(*pKey));
322                 SysTryCatch(NID_SYS, __asyncList.ContainsKey(*(reservedKey.get())) == false, r = E_IN_PROGRESS, r, "Required key(%ls) is already under processing.", pKey->GetPointer());
323                 unique_ptr<Integer> reservedPid(new (nothrow)Integer(__currentPid));
324
325                 r = __asyncList.Add(reservedKey.get(), reservedPid.get());
326                 SysTryCatch(NID_SYS, r == E_SUCCESS, r = E_SYSTEM, r, "It is failed to add aync list.");
327                 reservedPid.release();
328                 reservedKey.release();
329
330                 r = __pSettingInfo->SetValueAsyncForPrivilegedKey(*pKey, value, this);
331                 if(r != E_SUCCESS)
332                 {
333                         __asyncList.Remove(*pKey);
334                 }
335                 SysLog(NID_SYS, "Result is %s.", GetErrorMessage(r));
336         }
337         else if(*pCommand == SETTING_SERVICE_COMMAND_SUBSCRIBE)
338         {
339                 unique_ptr<Integer> pid(new (nothrow) Integer(__currentPid));
340
341                 SysTryCatch(NID_SYS, __eventList.Contains(*(pid.get())) == false, r = E_OBJ_ALREADY_EXIST, r, "Required application(%ls, %d) is already subscribe event.", __currentPkgId.GetPointer(), __currentPid);
342                 r = __eventList.Add(pid.get());
343                 SysTryCatch(NID_SYS, r == E_SUCCESS, r = E_SYSTEM, r, "It is failed to add application(%ls, %d) on event list", __currentPkgId.GetPointer(), __currentPid);
344                 pid.release();
345         }
346         else if(*pCommand == SETTING_SERVICE_COMMAND_UNSUBSCRIBE)
347         {
348                 unique_ptr<Integer> pid(new (nothrow) Integer(__currentPid));
349
350                 SysTryCatch(NID_SYS, __eventList.Contains(*(pid.get())) == true, r = E_OBJ_NOT_FOUND, r, "Required application(%ls, %d) is not subscribe event.", __currentPkgId.GetPointer(), __currentPid);
351                 r = __eventList.Remove(*(pid.get()), true);
352                 SysTryCatch(NID_SYS, r == E_SUCCESS, r = E_SYSTEM, r, "It is failed to remove application(%ls, %d) on event list", __currentPkgId.GetPointer(), __currentPid);
353                 pid.release();
354         }
355         else if(*pCommand == SETTING_SERVICE_COMMAND_SUPPORTED)
356         {
357                 bool value = false;
358
359                 pKey = (String*)request.GetAt(SETTING_SERVICE_IPC_MSG_KEY);
360                 SysTryCatch(NID_SYS, pKey != null, r = E_SYSTEM, r, "There is no key information.");
361                 value = __pSettingInfo->HasKey(*pKey);
362                 SysLog(NID_SYS, "%ls is %d.", pKey->GetPointer(), value);
363                 pValue = new (nothrow) String();
364                 SysTryCatch(NID_SYS, pValue != null, r = E_SYSTEM, r, "It is failed to create pValue.");
365                 pValue->Append(value);
366         }
367         else if(*pCommand == SETTING_SERVICE_COMMAND_SUBSCRIBE_INTERNAL)
368         {
369                 unique_ptr<Integer> pid(new (nothrow) Integer(__currentPid));
370
371                 SysTryCatch(NID_SYS, __eventListForInternal.Contains(*(pid.get())) == false, r = E_OBJ_ALREADY_EXIST, r, "Required application(%ls, %d) is already subscribe event.", __currentPkgId.GetPointer(), __currentPid);
372                 r = __eventListForInternal.Add(pid.get());
373                 SysTryCatch(NID_SYS, r == E_SUCCESS, r = E_SYSTEM, r, "It is failed to add application(%ls, %d) on event list", __currentPkgId.GetPointer(), __currentPid);
374                 pid.release();
375         }
376         else if(*pCommand == SETTING_SERVICE_COMMAND_UNSUBSCRIBE_INTERNAL)
377         {
378                 unique_ptr<Integer> pid(new (nothrow) Integer(__currentPid));
379
380                 SysTryCatch(NID_SYS, __eventListForInternal.Contains(*(pid.get())) == true, r = E_OBJ_NOT_FOUND, r, "Required application(%ls, %d) is not subscribe event.", __currentPkgId.GetPointer(), __currentPid);
381                 r = __eventListForInternal.Remove(*(pid.get()), true);
382                 SysTryCatch(NID_SYS, r == E_SUCCESS, r = E_SYSTEM, r, "It is failed to remove application(%ls, %d) on event list", __currentPkgId.GetPointer(), __currentPid);
383                 pid.release();
384         }
385         else
386         {
387                 return false;
388         }
389
390 CATCH:
391         if(response != null)
392         {
393                 String* pCommandCode = new (nothrow) String(*pCommand);
394                 String* pResultCode = new (nothrow) String(GetErrorMessage(r));
395
396                 SysLog(NID_SYS, "Command Code is %ls.", pCommandCode->GetPointer());
397                 SysLog(NID_SYS, "Result Code is %ls.", pResultCode->GetPointer());
398
399                 response->Add(pCommandCode);
400                 response->Add(pResultCode);
401                 if(pValue != null)
402                 {
403                         SysLog(NID_SYS, "Value is %ls.", pValue->GetPointer());
404                         response->Add(pValue);
405                 }
406
407                 __responseMessage.AddItems(*response);
408         }
409         else
410         {
411                 SysLog(NID_SYS, "response is empty.");
412         }
413
414         return true;
415 }
416
417 void
418 _SettingService::OnResultReceivedForSetValueAsync(const String& key, result rCode)
419 {
420         SysLog(NID_SYS, "Key is %ls, result is %s.", key.GetPointer(), GetErrorMessage(rCode));
421         Integer* pid = (Integer*) __asyncList.GetValue(key);
422         ArrayList* pData = null;
423         result r = E_SUCCESS;
424         String cmdCode(SETTING_SERVICE_COMMAND_RESULT);
425         String keyCode;
426         String resultCode;
427
428         SysTryCatch(NID_SYS, pid != null, r = E_SYSTEM, r, "Required key(%ls) is not reserved.", key.GetPointer());
429         pData = new (nothrow) ArrayList;
430         pData->Construct();
431         keyCode.Append(key);
432         resultCode.Append(GetErrorMessage(rCode));
433         pData->Add(cmdCode);
434         pData->Add(keyCode);
435         pData->Add(resultCode);
436
437         r = __ipcServer.SendResponse(pid->value, new (nothrow) IoService_Data(*pData));
438         SysTryCatch(NID_SYS, r == E_SUCCESS, r = E_SYSTEM, r, "It is failed to send result to %d.", pid->value);
439
440 CATCH:
441         __asyncList.Remove(key, true);
442
443         if(pData != null)
444         {
445                 delete pData;
446         }
447 }
448
449 void
450 _SettingService::OnSettingChanged(Tizen::Base::String& key)
451 {
452         result r = E_SUCCESS;
453         IEnumerator* pEnum = null;
454
455         if(key == _SETTINGS_KEY_FONT_SIZE || key == _SETTINGS_KEY_FONT_TYPE
456                 || key == _SETTINGS_KEY_LOCALE_COUNTRY || key == _SETTINGS_KEY_LOCALE_LANGUAGE)
457         {
458                 pEnum = __eventListForInternal.GetEnumeratorN();
459
460                 while(pEnum->MoveNext() == E_SUCCESS)
461                 {
462                         Integer* pid = (Integer*) pEnum->GetCurrent();
463
464                         ArrayList data;
465                         data.Construct();
466                         String cmdCode(SETTING_SERVICE_COMMAND_EVENT_INTERNAL);
467                         String keyCode(key);
468                         data.Add(cmdCode);
469                         data.Add(keyCode);
470
471                         r = __ipcServer.SendResponse(pid->value, new (nothrow) IoService_Data(data));
472                         SysLog(NID_SYS, "Internal setting event is delivered to %d. result is %s.", pid->value, GetErrorMessage(r));
473                 }
474                 delete pEnum;
475         }
476
477         pEnum = __eventList.GetEnumeratorN();
478         while(pEnum->MoveNext() == E_SUCCESS)
479         {
480                 Integer* pid = (Integer*) pEnum->GetCurrent();
481
482                 ArrayList data;
483                 data.Construct();
484                 String cmdCode(SETTING_SERVICE_COMMAND_EVENT);
485                 String keyCode(key);
486                 data.Add(cmdCode);
487                 data.Add(keyCode);
488
489                 r = __ipcServer.SendResponse(pid->value, new (nothrow) IoService_Data(data));
490                 SysLog(NID_SYS, "Setting event is delivered to %d. result is %s.", pid->value, GetErrorMessage(r));
491         }
492
493         delete pEnum;
494 }
495
496 void
497 _SettingService::OnIpcServerStarted(const _IpcServer& server)
498 {
499 }
500
501 void
502 _SettingService::OnIpcServerStopped(const _IpcServer& server)
503 {
504 }
505
506 void
507 _SettingService::OnIpcClientConnected(const _IpcServer& server, int clientId)
508 {
509 }
510
511 void
512 _SettingService::OnIpcClientDisconnected(const _IpcServer&server, int clientId)
513 {
514 }
515
516 void
517 _SettingService::OnApplicationLaunched(const AppId& appId, int pid)
518 {
519 }
520
521 void
522 _SettingService::OnApplicationTerminated(const AppId& appId, int pid)
523 {
524         Integer reservedKey(pid);
525         result r = __eventList.Remove(reservedKey, true);
526         SysLog(NID_SYS, "Application(%d) is terminated and unsubscribe result is %s.", pid, GetErrorMessage(r));
527         r = __eventListForInternal.Remove(reservedKey, true);
528         SysLog(NID_SYS, "unsubscribe result is %s on internal event.", GetErrorMessage(r));
529 }
530
531 void
532 _SettingService::DestroySingleton(void)
533 {
534         delete __pSettingService;
535         __pSettingService = null;
536 }
537
538 }}
539