Merge "Update system" into tizen_2.1
[platform/framework/native/appfw.git] / src / app / FAppAppManager.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17
18 /**
19  * @file        FAppAppManager.cpp
20  * @brief       This is the implementation for the AppManager class.
21  */
22
23 #include <new>
24
25 #include <FBaseString.h>
26 #include <FBaseColIListT.h>
27 #include <FAppAppManager.h>
28 #include <FAppIAppControlListener.h>
29 #include <FAppSqlDataControl.h>
30 #include <FAppMapDataControl.h>
31 #include <FAppIAppCheckPointEventListener.h>
32 #include <FAppAppControlProviderManager.h>
33 #include <FAppIActiveAppEventListener.h>
34 #include <FBaseSysLog.h>
35
36 #include <FSec_AccessController.h>
37 #include "FApp_Types.h"
38 #include "FAppPkg_PackageManagerImpl.h"
39 #include "FApp_AppManagerImpl.h"
40 #include "FApp_AppImpl.h"
41 #include "FApp_AppInfo.h"
42 #include "FApp_AppArg.h"
43 #include "FApp_Aul.h"
44 #include "FApp_AppControlProviderManagerImpl.h"
45 #ifdef _SINGLETON_CLEANUP
46 #include "FApp_LongevityManager.h"
47 #endif
48
49 using namespace Tizen::App::Package;
50 using namespace Tizen::Base;
51 using namespace Tizen::Base::Collection;
52 using namespace Tizen::Base::Runtime;
53 using namespace Tizen::Io;
54 using namespace Tizen::Security;
55
56 namespace Tizen { namespace App
57 {
58
59 const long MAX_ARGUMENTS_SIZE = 1024;
60
61
62 AppManager::AppManager(void)
63 : __pAppManagerImpl(null)
64 {
65 }
66
67
68 result
69 AppManager::Construct(void)
70 {
71         result r = E_SUCCESS;
72
73         SysAssertf(__pAppManagerImpl == null,
74                         "Already constructed. Calling Construct() twice or more on a same in stance is not allowed for this class.");
75
76         __pAppManagerImpl = new (std::nothrow) _AppManagerImpl();
77         SysTryReturnResult(NID_APP, __pAppManagerImpl != null, E_OUT_OF_MEMORY, "");
78
79         r = __pAppManagerImpl->Construct();
80         SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] Propagating.", GetErrorMessage(r));
81
82         return r;
83
84 CATCH:
85         delete __pAppManagerImpl;
86         __pAppManagerImpl = null;
87
88         return r;
89 }
90
91
92 AppManager::~AppManager(void)
93 {
94         delete __pAppManagerImpl;
95 }
96
97
98 AppControl*
99 AppManager::FindAppControlN(const AppId& appId, const String& operationId)
100 {
101         return _AppManagerImpl::FindAppControlN(appId, operationId);
102 }
103
104
105 IList*
106 AppManager::FindAppControlsN(const String* pOperationId, const String* pCategory, const String* pDataType, const String* pUriScheme)
107 {
108         return _AppManagerImpl::FindAppControlsN(pOperationId, pCategory, pDataType, pUriScheme);
109 }
110
111
112 result
113 AppManager::StartAppControl(const String& uri, const String* pOperationId,
114                                                         const String* pDataType,
115                                                         IAppControlListener* pListener)
116 {
117         result r = _AccessController::CheckUserPrivilege(_PRV_APPLICATION_LAUNCH);
118         SysTryReturnResult(NID_APP, !IsFailed(r), E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
119
120         return _AppManagerImpl::StartAppControl(uri, pOperationId, pDataType, pListener);
121 }
122
123
124 result
125 AppManager::StartAppControl(const String* pOperationId, const String* pCategory,
126                                                         const String* pDataType, const String* pUriScheme,
127                                                         const IList* pDataList,
128                                                         IAppControlListener* pListener)
129 {
130         result r = _AccessController::CheckUserPrivilege(_PRV_APPLICATION_LAUNCH);
131         SysTryReturnResult(NID_APP, !IsFailed(r), E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
132
133         return _AppManagerImpl::StartAppControl(pOperationId, pCategory, pDataType, pUriScheme, pDataList, pListener);
134 }
135
136 SqlDataControl*
137 AppManager::GetSqlDataControlN(const String& providerId)
138 {
139         return _AppManagerImpl::GetSqlDataControlN(providerId);
140 }
141
142 MapDataControl*
143 AppManager::GetMapDataControlN(const String& providerId)
144 {
145         return _AppManagerImpl::GetMapDataControlN(providerId);
146 }
147
148 String
149 AppManager::GetAppSharedPath(const AppId& appId)
150 {
151         String sharedPath;
152
153         result r = _AppManagerImpl::GetAppRootPath(appId, sharedPath);
154         SysTryReturn(NID_APP, !IsFailed(r), sharedPath, r, "[%s] Propagating to caller...",
155                         GetErrorMessage(r));
156
157         sharedPath.Append(L"shared/");
158
159         SetLastResult(E_SUCCESS);
160         return sharedPath;
161 }
162
163 AppManager*
164 AppManager::GetInstance(void)
165 {
166         result r = E_SUCCESS;
167         static AppManager* pAppMgr = null;
168
169         if (pAppMgr == null)
170         {
171                 pAppMgr = new (std::nothrow) AppManager();
172                 SysTryReturn(NID_APP, pAppMgr != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] AppManager allocation failed.");
173
174                 r = pAppMgr->Construct();
175                 SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] AppManager construction failed.", GetErrorMessage(r));
176
177 #ifdef _SINGLETON_CLEANUP
178                 // [FIXME] temporary disable to resolve N_SE-23319, ImeApp cleanup issue
179                 //_LongevityManager::GetInstance().RegisterOwnership(*pAppMgr);
180 #endif
181         }
182
183         return pAppMgr;
184
185 CATCH:
186         delete pAppMgr;
187         pAppMgr = null;
188
189         return null;
190 }
191
192 result
193 AppManager::LaunchApplication(const AppId& appId, const IList* pArguments, LaunchOption option)
194 {
195         SysAssertf(__pAppManagerImpl != null, "Not constructed properly by platform.");
196         SysTryReturnResult(NID_APP, appId.GetLength() <= WIDGET_APP_MAX_APPID_LENGTH, E_MAX_EXCEEDED,
197                                           "The length of appid exceeded the limit(%d).", WIDGET_APP_MAX_APPID_LENGTH);
198
199         result r = _AccessController::CheckUserPrivilege(_PRV_APPLICATION_LAUNCH);
200         SysTryReturnResult(NID_APP, !IsFailed(r), E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
201
202         return __pAppManagerImpl->LaunchApplication(appId, pArguments, LAUNCH_OPTION_DEFAULT);
203 }
204
205 result
206 AppManager::LaunchApplication(const AppId& appId, LaunchOption option)
207 {
208         SysAssertf(__pAppManagerImpl != null, "Not constructed properly by platform.");
209         SysTryReturnResult(NID_APP, appId.GetLength() <= WIDGET_APP_MAX_APPID_LENGTH, E_MAX_EXCEEDED,
210                                           "The length of appid exceeded the limit(%d).", WIDGET_APP_MAX_APPID_LENGTH);
211
212         result r = _AccessController::CheckUserPrivilege(_PRV_APPLICATION_LAUNCH);
213         SysTryReturnResult(NID_APP, !IsFailed(r), E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
214
215         return __pAppManagerImpl->LaunchApplication(appId, LAUNCH_OPTION_DEFAULT);
216 }
217
218 result
219 AppManager::TerminateApplication(const AppId& appId)
220 {
221         SysAssertf(__pAppManagerImpl != null, "Not constructed properly by platform.");
222         SysTryReturnResult(NID_APP, appId.GetLength() <= WIDGET_APP_MAX_APPID_LENGTH, E_MAX_EXCEEDED,
223                                                   "The length of appid exceeded the limit(%d).", WIDGET_APP_MAX_APPID_LENGTH);
224
225         result r = _AccessController::CheckUserPrivilege(_PRV_APPLICATION_KILL, _PRV_APPMANAGER_KILL);
226         SysTryReturnResult(NID_APP, !IsFailed(r), E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
227
228         return __pAppManagerImpl->TerminateApplication(appId);
229 }
230
231 bool
232 AppManager::IsRunning(const AppId& appId) const
233 {
234         SysAssertf(__pAppManagerImpl != null, "Not constructed properly by platform.");
235
236         return __pAppManagerImpl->IsRunning(appId);
237 }
238
239 IList*
240 AppManager::GetRunningAppListN(void) const
241 {
242         SysAssertf(__pAppManagerImpl != null, "Not constructed properly by platform.");
243
244         return __pAppManagerImpl->GetRunningAppListN();
245 }
246
247 result
248 AppManager::RegisterAppLaunch(const String& condition, const IList* pArguments, LaunchOption option)
249 {
250         SysAssertf(__pAppManagerImpl != null, "Not constructed properly by platform.");
251
252         result r = _AccessController::CheckUserPrivilege(_PRV_APPLICATION_LAUNCH);
253         SysTryReturnResult(NID_APP, !IsFailed(r), E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
254
255         return __pAppManagerImpl->RegisterAppLaunch(L"", condition, pArguments, option);
256 }
257
258 result
259 AppManager::UnregisterAppLaunch(void)
260 {
261         SysAssertf(__pAppManagerImpl != null, "Not constructed properly by platform.");
262
263         result r = _AccessController::CheckUserPrivilege(_PRV_APPLICATION_LAUNCH);
264         SysTryReturnResult(NID_APP, !IsFailed(r), E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
265
266         return __pAppManagerImpl->UnregisterAppLaunch(L"", null);
267 }
268
269 result
270 AppManager::UnregisterAppLaunch(const String& condition)
271 {
272         SysAssertf(__pAppManagerImpl != null, "Not constructed properly by platform.");
273
274         result r = _AccessController::CheckUserPrivilege(_PRV_APPLICATION_LAUNCH);
275         SysTryReturnResult(NID_APP, !IsFailed(r), E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
276
277         return __pAppManagerImpl->UnregisterAppLaunch(L"", &condition);
278 }
279
280 bool
281 AppManager::IsAppLaunchRegistered(void) const
282 {
283         SysAssertf(__pAppManagerImpl != null, "Not constructed properly by platform.");
284
285         return __pAppManagerImpl->IsAppLaunchRegistered(L"", null);
286 }
287
288 result
289 AppManager::RegisterAppLaunch(const AppId& appId, const String& condition, const IList* pArguments, LaunchOption option)
290 {
291         SysAssertf(__pAppManagerImpl != null, "Not constructed properly by platform.");
292         SysTryReturnResult(NID_APP, _Aul::IsInstalled(appId) == true, E_APP_NOT_INSTALLED, "The application(%ls) is not installed.", appId.GetPointer());
293
294         return __pAppManagerImpl->RegisterAppLaunch(appId, condition, pArguments, option);
295 }
296
297
298 result
299 AppManager::UnregisterAppLaunch(const AppId& appId, const String* pCondition)
300 {
301         SysAssertf(__pAppManagerImpl != null, "Not constructed properly by platform.");
302         SysTryReturnResult(NID_APP, _Aul::IsInstalled(appId) == true, E_APP_NOT_INSTALLED, "The application(%ls) is not installed.", appId.GetPointer());
303
304         return __pAppManagerImpl->UnregisterAppLaunch(appId, pCondition);
305 }
306
307
308 bool
309 AppManager::IsAppLaunchRegistered(const AppId& appId, const String* pCondition) const
310 {
311         SysAssertf(__pAppManagerImpl != null, "Not constructed properly by platform.");
312
313         return __pAppManagerImpl->IsAppLaunchRegistered(appId, pCondition);
314 }
315
316 result
317 AppManager::SetCheckpointEventListener(IAppCheckpointEventListener& listener)
318 {
319         SysAssertf(__pAppManagerImpl != null, "Not constructed properly by platform.");
320
321         Tizen::Base::Runtime::IEventListener* pListener = &listener;
322         return __pAppManagerImpl->SetEventListener(AE_CHECKPOINT, pListener);
323 }
324
325 void
326 AppManager::SetAppLaunchConditionEventListener(IAppLaunchConditionEventListener* pListener)
327 {
328         SysLog(NID_APP, "");
329         _AppImpl::GetInstance()->SetAppLaunchConditionEventListener(pListener);
330 }
331
332
333 result
334 AppManager::SendAppControlResult(const String& appControlRequestId, const IList* pResultList)
335 {
336         int req = _AppArg::GetRequestId(appControlRequestId);
337         AppControlProviderManager* pInstance = AppControlProviderManager::GetInstance();
338         return _AppControlProviderManagerImpl::GetInstance(*pInstance)->SendAppControlResult(req, pResultList);
339 }
340
341 result
342 AppManager::AddActiveAppEventListener(IActiveAppEventListener& listener)
343 {
344         SysAssertf(__pAppManagerImpl != null, "Not constructed properly by platform.");
345
346         result r = _AccessController::CheckUserPrivilege(_PRV_APPUSAGE);
347         SysTryReturnResult(NID_APP, !IsFailed(r), E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
348
349         return __pAppManagerImpl->AddActiveAppEventListener(listener);
350 }
351
352 result
353 AppManager::RemoveActiveAppEventListener(IActiveAppEventListener& listener)
354 {
355         SysAssertf(__pAppManagerImpl != null, "Not constructed properly by platform.");
356
357         result r = _AccessController::CheckUserPrivilege(_PRV_APPUSAGE);
358         SysTryReturnResult(NID_APP, !IsFailed(r), E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
359
360         return __pAppManagerImpl->RemoveActiveAppEventListener(listener);
361 }
362
363 result
364 AppManager::GetActiveApp(AppId& appId)
365 {
366         SysAssertf(__pAppManagerImpl != null, "Not constructed properly by platform.");
367
368         result r = _AccessController::CheckUserPrivilege(_PRV_APPUSAGE);
369         SysTryReturnResult(NID_APP, !IsFailed(r), E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
370
371         return __pAppManagerImpl->GetActiveApp(appId);
372 }
373
374 }} // Tizen::App