2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
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
8 // http://www.apache.org/licenses/LICENSE-2.0
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.
18 * @file FSys_RuntimeClientEx.cpp
19 * @brief This is the implementation file for _RuntimeClientEx class.
22 #include <unique_ptr.h>
24 #include <FBaseInteger.h>
25 #include <FBaseLongLong.h>
26 #include <FBaseSysLog.h>
28 #include <FApp_AppInfo.h>
30 #include <FIo_AppServiceIpcMessages.h>
31 #include "FSys_SystemServiceMessageClient.h"
32 #include "FSys_RuntimeClientEx.h"
36 using namespace Tizen::App;
37 using namespace Tizen::Base;
38 using namespace Tizen::Base::Collection;
39 using namespace Tizen::Base::Runtime;
40 using namespace Tizen::Io;
42 namespace Tizen { namespace System
45 static const int _RUNTIME_GET_PARAM_TYPE = 1;
46 static const wchar_t* _RUNTIME_SERVICE_ID = L"osp.sys.ipcserver.runtimeinfo";
47 static const wchar_t* _RUNTIME_GET_SIZE = L"osp.system.command.runtime.get.size";
48 static const wchar_t* _RUNTIME_RESULT_SUCCESS = L"osp.system.result.success";
49 static const wchar_t* _RUNTIME_RESULT_SYSTEM = L"osp.system.result.system";
51 _RuntimeClientEx* _RuntimeClientEx::__pRuntimeClientEx= null;
53 class _RuntimeAsyncEventArg : public IEventArg
60 class _RuntimeAsyncEvent : public Event
63 virtual void FireImpl(IEventListener& listener, const IEventArg& arg)
65 IRuntimeInfoGetLonglongAsyncResultListener* pListener = dynamic_cast<IRuntimeInfoGetLonglongAsyncResultListener*> (&listener);
66 const _RuntimeAsyncEventArg* pArg = dynamic_cast<const _RuntimeAsyncEventArg*>(&arg);
68 if(pListener == null || pArg == null)
70 SysLogException(NID_SYS, E_SYSTEM, "It is failed to get listener or arguemnt");
73 pListener->OnResultReceivedForGetValueAsync(pArg->value, pArg->rCode);
74 RemoveListener(listener);
79 _RuntimeClientEx::GetInstance(void)
81 if(__pRuntimeClientEx == null)
83 __pRuntimeClientEx = new (std::nothrow) _RuntimeClientEx();
85 return __pRuntimeClientEx;
88 _RuntimeClientEx::_RuntimeClientEx()
91 , __pMessageClient(null)
94 static String RUNTIME_SERVICE_ID(_RUNTIME_SERVICE_ID);
96 __pMessageClient = _SystemServiceMessageClient::CreateInstance(RUNTIME_SERVICE_ID);
97 SysTryCatch(NID_SYS, __pMessageClient != null, r = E_SYSTEM, r, "It is failed to create SystemServiceMessageClient.");
99 r = __pMessageClient->RegisterListener(RUNTIME_SERVICE_ID, *this);
100 SysTryCatch(NID_SYS, r == E_SUCCESS, r = E_SYSTEM, r, "It is failed to register on MessageClient.");
102 __pIpcClient = __pMessageClient->GetIpcClient();
104 __asyncEventList.Construct();
109 _RuntimeClientEx::~_RuntimeClientEx()
111 result r = E_SUCCESS;
112 String key(_RUNTIME_SERVICE_ID);
113 r = __pMessageClient->UnregisterListener(key);
114 SysTryCatch(NID_SYS, r == E_SUCCESS, r = E_SYSTEM, r, "It is failed to register on MessageClient.");
116 __asyncEventList.RemoveAll(true);
118 delete __pMessageClient;
124 _RuntimeClientEx::GetDirectorySizeValueAsync(const String& path, IRuntimeInfoGetLonglongAsyncResultListener* listener)
126 result r = E_SUCCESS;
128 ArrayList requestMessages;
129 ArrayList responseMessages;
131 requestMessages.Construct();
132 responseMessages.Construct();
134 String serviceId(_RUNTIME_SERVICE_ID);
135 String commandId(_RUNTIME_GET_SIZE);
137 messageId.Append(__msgCount);
139 requestMessages.Add(serviceId);
140 requestMessages.Add(commandId);
141 requestMessages.Add(path);
142 requestMessages.Add(messageId);
144 unique_ptr<IoService_Request> pMsg(new (std::nothrow) IoService_Request(requestMessages, &responseMessages));
145 r = __pIpcClient->SendRequest(*pMsg);
146 SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to send request by IPC [%s]", GetErrorMessage(r));
148 String* pResult = (String*)responseMessages.GetAt(2);
149 SysTryReturnResult(NID_SYS, pResult != null, E_SYSTEM, "There is no result code.");
151 if(*pResult == _RUNTIME_RESULT_SUCCESS)
156 SysLog(NID_SYS, "r is %s.", GetErrorMessage(r));
160 _RuntimeAsyncEvent* pEvent = new (std::nothrow) _RuntimeAsyncEvent();
161 pEvent->AddListener(*listener);
163 __asyncEventList.Add(new Integer(__msgCount), pEvent);
171 _RuntimeClientEx::OnDataReceived(const Tizen::Base::Collection::ArrayList& data)
173 SysLog(NID_SYS, "Receive result");
174 String* pServiceId = (String*)(data.GetAt(0));
175 String* pResponseId = (String*)(data.GetAt(1));
176 String* pMessageId = (String*)(data.GetAt(2));
177 String* pValue = (String*)(data.GetAt(3));
178 String* pResultCode = (String*)(data.GetAt(4));
180 SysTryReturnVoidResult(NID_SYS, pServiceId != null && pResponseId != null && pMessageId != null && pValue != null && pResultCode != null, E_SYSTEM, "There is no result data.");
183 Integer::Parse(*pMessageId, msg_id);
185 Integer msgKey(msg_id);
187 _RuntimeAsyncEvent* pEvent = dynamic_cast <_RuntimeAsyncEvent*> (__asyncEventList.GetValue(msgKey));
188 SysTryReturnVoidResult(NID_SYS, pEvent != null, E_SYSTEM, "There is no registered event.");
190 _RuntimeAsyncEventArg* pEventArg = new (std::nothrow) _RuntimeAsyncEventArg();
192 LongLong::Parse(*pValue, pEventArg->value);
194 if(*pResultCode == _RUNTIME_RESULT_SUCCESS)
196 pEventArg->rCode = E_SUCCESS;
200 pEventArg->rCode = E_SYSTEM;
203 pEvent->Fire(*pEventArg);