remove redundant local static HashMapProviderT and ComparerT
[framework/osp/appwidget-service.git] / src / FShell_AppWidgetManagerService.cpp
1 //
2 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
3 //
4 // Licensed under the Flora License, Version 1.1 (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://floralicense.org/license/
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        FShell_AppWidgetManagerService.cpp
19  * @brief       This is the implementation for the AppWidgetManagerService class.
20  */
21
22 #include <unique_ptr.h>
23 #include <provider.h>
24 #include <errno.h>
25
26 #include <FBase.h>
27 #include <FBaseSysLog.h>
28 #include <FBaseColIList.h>
29 #include <FAppApp.h>
30 #include <FSystem.h>
31 #include <FBaseComparerT.h>
32 #include <FApp_AppManagerImpl.h>
33 #include <FShell_AppWidgetManagerImpl.h>
34 #include <FIo_IpcServer.h>
35 #include <FBase_StringConverter.h>
36
37 #include "FShell_AppWidgetContext.h"
38 #include "FShell_AppWidgetPopupContext.h"
39 #include "FShell_AppWidgetManagerService.h"
40 #include "FShell_TemplateUtil.h"
41
42 namespace Tizen { namespace Shell  { namespace App {
43
44 using namespace std;
45 using namespace Tizen::App;
46 using namespace Tizen::Base;
47 using namespace Tizen::Base::Collection;
48 using namespace Tizen::Base::Runtime;
49 using namespace Tizen::Io;
50 using namespace Tizen::System;
51 using namespace Tizen::Shell::App;
52
53 namespace
54 {
55 static const char APPNAME_OSP_APPWIDGET_SERVICE[] = "osp-appwidget-service";
56 static const int TIMER_DURATION_PING = 120000;
57 //extern const int UPDATE_PERIOD_MSEC_MIN;
58 }
59
60
61 AppWidgetManagerService* AppWidgetManagerService::__pTheInstance = null;
62
63 AppWidgetManagerService::AppWidgetManagerService(void)
64 {
65
66 }
67
68 AppWidgetManagerService::~AppWidgetManagerService(void)
69 {
70         SysLog(NID_SHELL, "Enter.");
71         __pingTimer.Cancel();
72         DeinitializeCoreDaemonEventReceiver();
73         SysLog(NID_SHELL, "Exit.");
74 }
75
76 AppWidgetManagerService*
77 AppWidgetManagerService::GetInstance(void)
78 {
79         if (__pTheInstance == null)
80         {
81                 __pTheInstance = CreateInstance(APPNAME_OSP_APPWIDGET_SERVICE);
82         }
83         return __pTheInstance;
84 }
85
86 AppWidgetManagerService*
87 AppWidgetManagerService::CreateInstance(const char* pCoreDaemonId)
88 {
89         if (__pTheInstance == null)
90         {
91                 __pTheInstance = new AppWidgetManagerService();
92                 SysTryReturn(NID_SHELL, __pTheInstance != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
93
94                 result r = __pTheInstance->Construct(pCoreDaemonId);
95                 SysAssertf(!IsFailed(r), "Failed to construct AppWidgetManagerService");
96                 SysLog(NID_SHELL, "AppWidgetManagerService is created.");
97         }
98         return __pTheInstance;
99 }
100
101 result
102 AppWidgetManagerService::Construct(const char* pCoreDaemonId)
103 {
104         result r = __appContextList.Construct();
105         SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute Construct.");
106
107         _AppWidgetManagerStub::StartIpcServer();
108
109         SettingInfo::AddSettingEventListener(*this);
110
111         return InitializeCoreDaemonEventReceiver(pCoreDaemonId);
112 }
113
114 int
115 AppWidgetManagerService::OnAppWidgetServiceConnected(struct event_arg *arg, void* data)
116 {
117     int ret;
118     ret = provider_send_hello();
119     if (ret == 0)
120     {
121         SysLog(NID_SHELL, "Success to be connected with master daemon");
122         AppWidgetManagerService::GetInstance()->StartPingTimer();
123
124     }
125     else
126     {
127         SysLog(NID_SHELL, "Failed to invoke provider_send_hello()");
128     }
129     return ret;
130 }
131
132 int
133 AppWidgetManagerService::OnAppWidgetServiceCDisconnected(struct event_arg *arg, void* data)
134 {
135         SysLog(NID_SHELL, "Disconnected with master daemon");
136     return 0;
137 }
138
139 void
140 AppWidgetManagerService::StartPingTimer(void)
141 {
142         result r = E_SUCCESS;
143
144         r = __pingTimer.Construct(*this);
145         SysTryReturnVoidResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "");
146
147         r = __pingTimer.StartAsRepeatable(TIMER_DURATION_PING);
148         SysTryReturnVoidResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "");
149 }
150
151 void
152 AppWidgetManagerService::OnTimerExpired(Timer& timer)
153 {
154         provider_send_ping();
155 }
156
157 _AppWidgetContext*
158 AppWidgetManagerService::FindAppWidget(const AppId& appId, const String& instanceId) const
159 {
160         _AppContext* pAppContext = null;
161         result r = __appContextList.GetValue(appId, pAppContext);
162         SysTryReturn(NID_SHELL, !IsFailed(r), null, E_OBJ_NOT_FOUND, "appId(%ls) is not found", appId.GetPointer() );
163
164         return pAppContext->FindAppWidget(instanceId);
165 }
166
167 void
168 AppWidgetManagerService::OnIpcClientConnected(const _IpcServer& server, int clientId)
169 {
170         String appId = server.GetClientApplicationId();
171         SysLog(NID_SHELL, "appId(%ls)", appId.GetPointer());
172
173         _AppContext* pAppContext = null;
174         __appContextList.GetValue(appId, pAppContext);
175         if (pAppContext)
176         {
177                 pAppContext->OnIpcConnected(clientId);
178         }
179 }
180
181 void
182 AppWidgetManagerService::OnIpcClientDisconnected(const _IpcServer& server, int clientId)
183 {
184         String appId = server.GetClientApplicationId();
185         SysLog(NID_SHELL, "appId(%ls)", appId.GetPointer());
186
187         _AppContext* pAppContext = null;
188         __appContextList.GetValue(appId, pAppContext);
189         if (pAppContext)
190         {
191                 pAppContext->OnIpcDisconnected();
192         }
193 }
194
195 void
196 AppWidgetManagerService::OnSettingChanged(Tizen::Base::String& key)
197 {
198 //      const static wchar_t KEY_SETTING_FONT_SIZE[] = L"http://tizen.org/setting/font.size";
199         const static wchar_t KEY_SETTING_FONT_TYPE[] = L"http://tizen.org/setting/font.type";
200         const static wchar_t KEY_SETTING_LANGUAGE[] = L"http://tizen.org/setting/locale.language";
201         const static wchar_t KEY_SETTING_COUNTRY[] = L"http://tizen.org/setting/locale.country";
202
203         if( key == KEY_SETTING_FONT_TYPE
204 //              || key == KEY_SETTING_FONT_SIZE
205                 || key == KEY_SETTING_LANGUAGE
206                 || key == KEY_SETTING_COUNTRY )
207         {
208                 SysLog(NID_SHELL, "'%ls' is changed.", key.GetPointer() );
209                 RequestUpdateAllSuspened();
210         }
211 }
212
213 _AppWidgetContext*
214 AppWidgetManagerService::AddAppWidget(const Tizen::Base::String& userInfo, const Tizen::Base::String& providerId, const Tizen::Base::String& instanceId, int width, int height, int period, int priority)
215 {
216         AppId appId;
217         String providerName;
218         _AppWidgetManagerImpl::ExtractAppIdAndProviderName(providerId, appId, providerName);
219
220         _AppContext* pAppContext = null;
221         bool containsKey = false;
222         __appContextList.ContainsKey(appId, containsKey);
223         if( containsKey == false)
224         {
225                 pAppContext = new(std::nothrow) _AppContext(appId);
226                 SysTryReturn(NID_SHELL, pAppContext, 0, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
227                 __appContextList.Add(appId, pAppContext);
228         }
229         else
230         {
231                 __appContextList.GetValue(appId, pAppContext);
232         }
233
234         return pAppContext->AddAppWidget(userInfo, providerId, instanceId, width, height, period, priority);
235 }
236
237 ///////////////////////////////////////////////////////
238 // CoreDaemonEventReceiver implementation
239 ///////////////////////////////////////////////////////
240 int
241 AppWidgetManagerService::OnAppWidgetCreate(struct event_arg *arg, int *width, int *height, double *priority, void* data)
242 {
243         SysTryReturn(NID_SHELL, arg != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
244         SysTryReturn(NID_SHELL, arg->pkgname != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
245         SysTryReturn(NID_SHELL, arg->id != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
246         SysTryReturn(NID_SHELL, arg->type == event_arg::EVENT_NEW, -EPERM, E_SUCCESS, "invalid argument from master");
247
248         SysSecureLog(NID_SHELL, "providerId(%s) id(%s) content(%s) cluster(%s) category(%s)", arg->pkgname, arg->id, arg->info.lb_create.content, arg->info.lb_create.cluster, arg->info.lb_create.category);
249         AppWidgetManagerService* pAppWidgetService = AppWidgetManagerService::GetInstance();
250 //      SysTryReturn (NID_SHELL, pAppWidgetService->FindAppWidget(ExtractAppId(arg->pkgname), arg->id) == null, -EBUSY, E_SUCCESS,"already exist");
251
252         const double default_priority = 1.0f;
253         _AppWidgetContext* pAppWidgetContext = pAppWidgetService->AddAppWidget(arg->info.lb_create.content, arg->pkgname, arg->id, arg->info.lb_create.width, arg->info.lb_create.height, arg->info.lb_create.period * 1000, default_priority);
254
255         *priority = pAppWidgetContext->GetPriority();
256         *height= pAppWidgetContext->GetHeight();
257         *width = pAppWidgetContext->GetWidth();
258
259     return 0;
260 }
261
262 int
263 AppWidgetManagerService::OnAppWidgetUpdate(struct event_arg *arg, void* data)
264 {
265         bool isInstanceIdSpecified = (arg->id == null || strlen(arg->id) < 1) ? false : true;
266         if (isInstanceIdSpecified == false)
267         {
268                 AppId appId;
269                 String providerName;
270                 _AppWidgetManagerImpl::ExtractAppIdAndProviderName(arg->pkgname, appId, providerName);
271
272                 AppWidgetManagerService::GetInstance()->RequestUpdate(appId, providerName, L"");
273         }
274         else
275         {
276                 _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->FindAppWidget(_AppWidgetHelper::ExtractAppId(arg->pkgname), arg->id);
277                 SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id);
278
279                 pAppWidgetContext->OnUpdate(L"");
280         }
281
282         return 0;
283 }
284
285 int
286 AppWidgetManagerService::OnAppWidgetDestroy(struct event_arg *arg, void* data)
287 {
288         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_DELETE, -EPERM, E_SUCCESS, "invalid argument from master");
289         SysLog(NID_SHELL, "Enter");
290
291     _AppContext* pAppContext = null;
292         result r = AppWidgetManagerService::GetInstance()->__appContextList.GetValue(_AppWidgetHelper::ExtractAppId(arg->pkgname), pAppContext);
293         SysTryReturn(NID_SHELL, !IsFailed(r), null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND]");
294
295         pAppContext->RemoveAppWidget(arg->id);
296
297     SysLog(NID_SHELL, "Exit");
298     return 0;
299 }
300
301 int
302 AppWidgetManagerService::OnAppWidgetPopupCreate(struct event_arg *arg, void* data)
303 {
304         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_PD_CREATE, -EPERM, E_SUCCESS, "invalid argument from master");
305         SysSecureLog(NID_SHELL, "providerId(%s), id(%s), x(%d), y(%d), width(%f), height(%f), priority(%d)", arg->pkgname, arg->id, arg->info.pd_create.x, arg->info.pd_create.y, arg->info.pd_create.w, arg->info.pd_create.h);
306
307         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->FindAppWidget(_AppWidgetHelper::ExtractAppId(arg->pkgname), arg->id);
308         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id);
309
310         pAppWidgetContext->OnPopupCreated(arg->info.pd_create.x, arg->info.pd_create.y, arg->info.pd_create.w, arg->info.pd_create.h);
311
312     return 0;
313 }
314
315  int
316  AppWidgetManagerService::OnAppWidgetPopupDestroy(struct event_arg *arg, void* data)
317 {
318         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_PD_DESTROY, -EPERM, E_SUCCESS, "invalid argument from master");
319         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->FindAppWidget(_AppWidgetHelper::ExtractAppId(arg->pkgname), arg->id);
320         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id);
321
322         SysSecureLog(NID_SHELL, "providerId(%s), id(%s)", arg->pkgname, arg->id);
323         pAppWidgetContext->OnPopupDestoyed();
324
325     return 0;
326 }
327
328 int
329 AppWidgetManagerService::OnAppWidgetBackground(struct event_arg *arg, void* data)
330 {
331          SysTryReturn(NID_SHELL, arg, 0, E_SUCCESS, "arg is null!");
332
333          _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->FindAppWidget(_AppWidgetHelper::ExtractAppId(arg->pkgname), arg->id);
334          SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , 0, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id);
335
336          SysSecureLog(NID_SHELL, "providerId(%s), id(%s)", arg->pkgname, arg->id);
337          pAppWidgetContext->OnBackground();
338
339     return 0;
340 }
341
342 int
343 AppWidgetManagerService::OnAppWidgetBackgroundAll(struct event_arg *arg, void* data)
344 {
345         unique_ptr< IMapEnumeratorT<String, _AppContext*> > pAppContextEnum(AppWidgetManagerService::GetInstance()->__appContextList.GetMapEnumeratorN());
346         SysTryReturnResult(NID_SHELL, pAppContextEnum, E_SYSTEM, "Failed to invoke __appContextList.GetMapEnumeratorN()");
347
348         while (pAppContextEnum->MoveNext() == E_SUCCESS)
349         {
350                 _AppContext* pAppContext = null;
351                 pAppContextEnum->GetValue(pAppContext);
352
353                 if (pAppContext)
354                 {
355                         pAppContext->OnAppWidgetBackgroundAll();
356                 }
357         }
358
359         return 0;
360 }
361
362 int
363 AppWidgetManagerService::OnAppWidgetForeground(struct event_arg *pArg, void* pData)
364 {
365         SysTryReturn(NID_SHELL, pArg || pArg->id || pArg->pkgname, 0, E_SUCCESS, "pArg is null!");
366         SysSecureLog(NID_SHELL, "providerId(%s), id(%s)", pArg->pkgname, pArg->id);
367
368         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->FindAppWidget(_AppWidgetHelper::ExtractAppId(pArg->pkgname), pArg->id);
369         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", pArg->pkgname, pArg->id);
370
371         pAppWidgetContext->OnForeground();
372
373         return 0;
374 }
375
376 int
377 AppWidgetManagerService::OnAppWidgetForegroundAll(struct event_arg *pArg, void* pData)
378 {
379         unique_ptr< IMapEnumeratorT<String, _AppContext*> > pAppContextEnum(AppWidgetManagerService::GetInstance()->__appContextList.GetMapEnumeratorN());
380         SysTryReturnResult(NID_SHELL, pAppContextEnum, E_SYSTEM, "Failed to invoke __appContextList.GetMapEnumeratorN()");
381
382         while (pAppContextEnum->MoveNext() == E_SUCCESS)
383         {
384                 _AppContext* pAppContext = null;
385                 pAppContextEnum->GetValue(pAppContext);
386
387                 if (pAppContext)
388                 {
389                         pAppContext->OnAppWidgetForegroundAll();
390                 }
391         }
392
393         return 0;
394 }
395
396 int
397 AppWidgetManagerService::OnAppWidgetClick(struct event_arg *arg, void* data)
398 {
399         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_CLICKED, -EPERM, E_SUCCESS, "invalid argument from master");
400         SysTryReturn(NID_SHELL, arg != null, -EPERM, E_SUCCESS, "arg is null!");
401         SysSecureLog(NID_SHELL, "providerId(%s), id(%s), clicked.event(%s), clicked.x(%f), clicked.y(%f)", arg->pkgname, arg->id, arg->info.clicked.event, arg->info.clicked.x, arg->info.clicked.y);
402
403     return 0;
404 }
405
406 int
407 AppWidgetManagerService::OnAppWidgetResize(struct event_arg *arg, void* data)
408 {
409         SysTryReturn(NID_SHELL, arg || arg->id || arg->pkgname, 0, E_SUCCESS, "arg is null!");
410         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_RESIZE, -EPERM, E_SUCCESS, "invalid argument from master");
411
412         SysSecureLog(NID_SHELL, "providerId(%s), id(%s), resize.w(%d), resize.h(%d)", arg->pkgname, arg->id, arg->info.resize.w, arg->info.resize.h);
413
414         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->FindAppWidget(_AppWidgetHelper::ExtractAppId(arg->pkgname), arg->id);
415         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id);
416
417         pAppWidgetContext->OnResize(arg->info.resize.w, arg->info.resize.h);
418
419     return 0;
420 }
421
422 int
423 AppWidgetManagerService::OnAppWidgetPeriodChanged(struct event_arg *arg, void* data)
424 {
425         SysTryReturn(NID_SHELL, arg != null, 0, E_SUCCESS, "arg is null!");
426         SysSecureLog(NID_SHELL, "providerId(%s), id(%s), width(%d), height(%d), priority(%d)", arg->pkgname, arg->id);
427     return 0;
428 }
429
430 int
431 AppWidgetManagerService::OnAppWidgetRecreate(struct event_arg *arg, void* data)
432 {
433         SysTryReturn(NID_SHELL, arg != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
434         SysTryReturn(NID_SHELL, arg->pkgname != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
435         SysTryReturn(NID_SHELL, arg->id != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
436         SysTryReturn(NID_SHELL, arg->type == event_arg::EVENT_RENEW, -EPERM, E_SUCCESS, "invalid argument from master");
437
438         SysSecureLog(NID_SHELL, "providerId(%s) id(%s) content(%s) cluster(%s) category(%s)", arg->pkgname, arg->id, arg->info.lb_recreate.content, arg->info.lb_recreate.cluster, arg->info.lb_recreate.category);
439
440         AppWidgetManagerService* pAppWidgetManagerService = AppWidgetManagerService::GetInstance();
441         SysTryReturn(NID_SHELL, pAppWidgetManagerService != null, -EBUSY, E_SYSTEM, "Failed to get the instance for AppWidgetManagerService.");
442
443         const double default_priority = 1.0f;
444         _AppWidgetContext* pAppWidgetContext = pAppWidgetManagerService->AddAppWidget(arg->info.lb_create.content, arg->pkgname, arg->id, arg->info.lb_create.width, arg->info.lb_create.height, arg->info.lb_create.period * 1000, default_priority);
445         SysTryReturn(NID_SHELL, pAppWidgetContext != null, -EBUSY, E_SYSTEM, "Failed to add the appwidget.");
446
447         return 0;
448 }
449
450 result
451 AppWidgetManagerService::InitializeCoreDaemonEventReceiver(const char *pCoreDaemonId)
452 {
453         SysTryReturnResult(NID_SHELL, pCoreDaemonId != null, E_INVALID_ARG, "pCoreDaemonId should not be null!");
454
455     struct event_handler cbs;
456     memset(&cbs, 0, sizeof(event_handler));
457
458     cbs.connected = OnAppWidgetServiceConnected,
459     cbs.disconnected = OnAppWidgetServiceCDisconnected,
460     cbs.pause = OnAppWidgetBackgroundAll,
461     cbs.resume = OnAppWidgetForegroundAll,
462     cbs.lb_pause = OnAppWidgetBackground,
463     cbs.lb_resume = OnAppWidgetForeground,
464     cbs.lb_create = OnAppWidgetCreate,
465     cbs.lb_destroy = OnAppWidgetDestroy,
466     cbs.update_content = OnAppWidgetUpdate,
467     cbs.pd_create = OnAppWidgetPopupCreate,
468     cbs.pd_destroy = OnAppWidgetPopupDestroy,
469     cbs.clicked = OnAppWidgetClick,
470     cbs.resize = OnAppWidgetResize,
471     cbs.set_period = OnAppWidgetPeriodChanged;
472     cbs.lb_recreate = OnAppWidgetRecreate;/* Recover from the fault of slave */
473     //cbs.content_event = OnAppWidgetContentEvent,
474
475     int ret = provider_init(null, pCoreDaemonId, &cbs, this);
476     SysTryReturnResult(NID_SHELL, ret == 0, E_SYSTEM, "provider_init failed.");
477
478     SysLog(NID_SHELL, "provider_init is invoked with (%s)", pCoreDaemonId);
479     return E_SUCCESS;
480 }
481
482 result
483 AppWidgetManagerService::DeinitializeCoreDaemonEventReceiver(void)
484 {
485     provider_fini();
486     return E_SUCCESS;
487 }
488
489 ///////////////////////////////////////////////////////
490 // stub implementation
491 ///////////////////////////////////////////////////////
492
493
494 result
495 AppWidgetManagerService::RequestUpdate(const Tizen::App::AppId& appId, const Tizen::Base::String& providerName, const Tizen::Base::String& argument) const
496 {
497         _AppContext* pAppContext = null;
498         result r = __appContextList.GetValue(appId, pAppContext);
499         SysTryReturn(NID_SHELL, !IsFailed(r), null, E_OBJ_NOT_FOUND, "appId(%ls) is not found", appId.GetPointer() );
500
501         return pAppContext->RequestUpdate(providerName, argument);
502 }
503
504 result
505 AppWidgetManagerService::RequestUpdateAllSuspened(void) const
506 {
507         unique_ptr< IMapEnumeratorT<String, _AppContext*> > pAppContextEnum(__appContextList.GetMapEnumeratorN());
508         SysTryReturnResult(NID_SHELL, pAppContextEnum, E_SYSTEM, "Failed to invoke __appContextList.GetMapEnumeratorN()");
509
510         while (pAppContextEnum->MoveNext() == E_SUCCESS)
511         {
512                 _AppContext* pAppContext = null;
513                 pAppContextEnum->GetValue(pAppContext);
514
515                 if ( pAppContext && _AppManagerImpl::GetInstance()->IsRunning(pAppContext->GetAppId()) == false )
516                 {
517                         pAppContext->RequestUpdate(L"", L"");
518                 }
519
520         }
521
522         SysLog(NID_SHELL, "Exit.");
523         return E_SUCCESS;
524 }
525
526 result
527 AppWidgetManagerService::RequestUpdateInstance(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, const Tizen::Base::String& argument)
528 {
529         SysSecureLog(NID_SHELL, "%ls, %ls", instanceId.GetPointer(), argument.GetPointer() );
530
531         _AppWidgetContext* pAppWidgetContext = FindAppWidget(appId, instanceId);
532         SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find the object(%ls).", instanceId.GetPointer());
533
534         pAppWidgetContext->OnUpdateAsync(argument);
535         return E_SUCCESS;
536 }
537
538 result
539 AppWidgetManagerService::AcquireRemoteBuffer(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int width, int height, int& bufferId)
540 {
541         _AppWidgetContext* pAppWidgetContext = this->FindAppWidget(appId, instanceId);
542         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
543
544         bufferId = pAppWidgetContext->AcquireRemoteBuffer(width, height);
545         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , bufferId != -1, "[E_SYSTEM] failed to AcquireRemoteBuffer for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
546
547     return E_SUCCESS;
548 }
549
550 result
551 AppWidgetManagerService::AcquireRemoteBufferForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int width, int height, int& bufferId)
552 {
553         _AppWidgetContext* pAppWidgetContext = this->FindAppWidget(appId, instanceId);
554         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
555
556         _AppWidgetPopupContext* pPopupContext = pAppWidgetContext->GetAppWidgetPopup();
557         SysSecureTryReturnResult(NID_SHELL, pPopupContext , E_SYSTEM, "[E_SYSTEM] pPd is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
558
559         bufferId = pPopupContext->AcquireRemoteBuffer(width, height);
560         SysSecureTryReturnResult(NID_SHELL, bufferId != -1, E_SYSTEM, "Failed to AcquireRemoteBuffer for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
561
562     return E_SUCCESS;
563 }
564
565 result
566 AppWidgetManagerService::SyncRemoteBuffer(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int width, int height)
567 {
568         _AppWidgetContext* pAppWidgetContext = this->FindAppWidget(appId, instanceId);
569         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
570
571         return pAppWidgetContext->SyncRemoteBuffer(width, height);
572 }
573
574 result
575 AppWidgetManagerService::SyncRemoteBufferForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId)
576 {
577         _AppWidgetContext* pAppWidgetContext = this->FindAppWidget(appId, instanceId);
578         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
579         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext->GetAppWidgetPopup(), E_SYSTEM, "[E_SYSTEM] GetAppWidgetPopup() returns null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
580
581         return pAppWidgetContext->GetAppWidgetPopup()->SyncRemoteBuffer();
582 }
583
584 result
585 AppWidgetManagerService::ReleaseRemoteBuffer(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId)
586 {
587         return E_SUCCESS;
588 }
589
590 result
591 AppWidgetManagerService::ReleaseRemoteBufferForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId)
592 {
593         return E_SUCCESS;
594 }
595
596 result
597 AppWidgetManagerService::RequestProviderCount(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int& providerCount)
598 {
599         SysLog(NID_SHELL, "ENTER");
600
601         _AppContext* pAppContext = null;
602         result r = __appContextList.GetValue(appId, pAppContext);
603         SysTryReturn(NID_SHELL, pAppContext, null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND]");
604
605         providerCount = pAppContext->GetProviderCount(appId);
606
607         r = pAppContext->RemoveAppWidget(instanceId, false);
608         SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute RemoveAppWidget.");
609
610         providerCount--;
611
612         pAppContext->SendPendingEvent();
613
614         return E_SUCCESS;
615 }
616
617 result
618 AppWidgetManagerService::SendResult(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, bool isSucceeded)
619 {
620         _AppContext* pAppContext = null;
621         result r = __appContextList.GetValue(appId, pAppContext);
622         SysTryReturn(NID_SHELL, !IsFailed(r), null, E_OBJ_NOT_FOUND, "appId(%ls) is not found", appId.GetPointer() );
623
624         if (!isSucceeded)
625         {
626                 r = pAppContext->RemoveAppWidget(instanceId, false);
627                 SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute RemoveAppWidget.");
628         }
629         else    // for pending event excluding touch event.
630         {
631                 SysLog(NID_SHELL, "SendResult is called[true].");
632         }
633
634         pAppContext->SendPendingEvent();
635
636         return E_SUCCESS;
637 }
638
639 result
640 AppWidgetManagerService::SendAccessStatus(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int accessStatus)
641 {
642         _AppWidgetContext* pAppWidgetContext = this->FindAppWidget(appId, instanceId);
643         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
644
645         return pAppWidgetContext->SendAccessStatus(accessStatus);
646 }
647
648 void
649 AppWidgetManagerService::OnUserEventReceivedN(RequestId reqId, IList* pArgs)
650 {
651         SysTryReturnVoidResult(NID_SHELL, pArgs != null, E_INVALID_STATE, "pArgs is null!.");
652
653         SysLog(NID_SHELL, "Enter.");
654
655         switch (reqId)
656         {
657         case LOCAL_EVENT_REQUEST_UPDATE:
658         {
659                 _AppWidgetContext* pAppWidgetContext = dynamic_cast<_AppWidgetContext*>( pArgs->GetAt(0) );
660                 SysTryReturnVoidResult(NID_SHELL, pAppWidgetContext != null, E_INVALID_STATE, "_AppWidget is null!.");
661
662                 String* pArgument = dynamic_cast<String*>( pArgs->GetAt(1) );
663                 SysTryReturnVoidResult(NID_SHELL, pArgument != null, E_INVALID_STATE, "pArgument is null!.");
664
665                 pAppWidgetContext->OnUpdate(*pArgument);
666
667                 delete pArgument;
668                 pArgs->RemoveAll();
669                 delete pArgs;
670         }
671                 break;
672
673         default:
674                 SysAssertf(false, "Never get here!");
675                 break;
676         }
677
678         SysLog(NID_SHELL, "Exit.");
679 }
680
681 // _AppWidgetHelper
682 AppId
683 _AppWidgetHelper::ExtractAppId(const String& providerId)
684 {
685         int indexOfSecondDot = 0;
686         result r = providerId.IndexOf(".", 12, indexOfSecondDot);//"1234567890._"
687         SysTryReturn(NID_SHELL, !IsFailed(r), L"", E_INVALID_ARG, "[E_INVALID_ARG] Failed to get the index from providerId(%ls).", providerId.GetPointer() );
688
689         String appId;
690         providerId.SubString(0, indexOfSecondDot, appId);
691         return appId;
692 }
693
694 String
695 _AppWidgetHelper::ExtractProviderName(const String& providerId)
696 {
697         int indexOfSecondDot = 0;
698         result r = providerId.IndexOf(".", 12, indexOfSecondDot);//"1234567890._"
699         SysTryReturn(NID_SHELL, !IsFailed(r), L"", E_INVALID_ARG, "[E_INVALID_ARG] Failed to get the index from providerId(%ls).", providerId.GetPointer() );
700
701         String providerName;
702         providerId.SubString(indexOfSecondDot + 1, providerName);
703         return providerName;
704 }
705
706 }}}     // Tizen::Shell::App