modify method names to give consitancy
[platform/framework/native/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 <FBaseSysLog.h>
25 #include <FBaseColIList.h>
26 #include <FAppApp.h>
27 #include <FSystem.h>
28 #include <FBaseComparerT.h>
29 #include <FApp_AppManagerImpl.h>
30 #include <FShell_AppWidgetManagerImpl.h>
31 #include <FIo_IpcServer.h>
32 #include <FBase_StringConverter.h>
33 #include <FBase.h>
34 #include "FShell_AppWidgetContext.h"
35 #include "FShell_AppWidgetPopupContext.h"
36 #include "FShell_AppWidgetManagerStub.h"
37 #include "FShell_AppWidgetManagerService.h"
38 #include "FShell_TemplateUtil.h"
39
40 namespace Tizen { namespace Shell  { namespace App {
41
42 using namespace std;
43 using namespace Tizen::App;
44 using namespace Tizen::Base;
45 using namespace Tizen::Base::Collection;
46 using namespace Tizen::Base::Runtime;
47 using namespace Tizen::Io;
48 using namespace Tizen::System;
49 using namespace Tizen::Shell::App;
50
51 namespace
52 {
53 static const RequestId  LOCAL_EVENT_REQUEST_UPDATE = 0;
54 static const wchar_t INVALID_INSTANCE[] = L"file://invalid instance id";
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         _AppWidgetManagerStub::StartIpcServer();
105
106         result r = __handlerThread.Construct(THREAD_TYPE_EVENT_DRIVEN);
107         SysTryReturnResult(NID_SHELL, IsFailed(r) == false, r, "Event thread creation failure.");
108
109         r = __handlerThread.Start();
110         SysTryReturnResult(NID_SHELL, IsFailed(r) == false, r, "Event thread Start failure.");
111
112         SettingInfo::AddSettingEventListener(*this);
113
114         static __HashMapDefaultProviderT <String> strHashCodeProvider;
115         static ComparerT <String> strComparer;
116
117         r = __appWidgetContextList.Construct(0, 0, strHashCodeProvider, strComparer);
118         SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute Construct.");
119
120         r = __appContextList.Construct(0, 0, strHashCodeProvider, strComparer);
121         SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute Construct.");
122
123         return InitializeCoreDaemonEventReceiver(pCoreDaemonId);
124 }
125
126 int
127 AppWidgetManagerService::AppWidgetConnected(struct event_arg *arg, void* data)
128 {
129     int ret;
130     ret = provider_send_hello();
131     if (ret == 0)
132     {
133         SysLog(NID_SHELL, "Success to be connected with master daemon");
134         AppWidgetManagerService::GetInstance()->StartPingTimer();
135
136     }
137     else
138     {
139         SysLog(NID_SHELL, "Failed to invoke provider_send_hello()");
140     }
141     return ret;
142 }
143
144 int
145 AppWidgetManagerService::AppWidgetDisconnected(struct event_arg *arg, void* data)
146 {
147         SysLog(NID_SHELL, "Disconnected with master daemon");
148     return 0;
149 }
150
151 void
152 AppWidgetManagerService::StartPingTimer(void)
153 {
154         result r = E_SUCCESS;
155
156         r = __pingTimer.Construct(*this);
157         SysTryReturnVoidResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "");
158
159         r = __pingTimer.StartAsRepeatable(TIMER_DURATION_PING);
160         SysTryReturnVoidResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "");
161 }
162
163 void
164 AppWidgetManagerService::OnTimerExpired(Timer& timer)
165 {
166         provider_send_ping();
167 }
168
169 _AppWidgetContext*
170 AppWidgetManagerService::Find(const String& instanceId) const
171 {
172         _AppWidgetContext* pAppWidgetContext = null;
173         __appWidgetContextList.GetValue(instanceId, pAppWidgetContext);
174
175         return pAppWidgetContext;
176 }
177
178 int
179 AppWidgetManagerService::GetProviderCount(const String& appId) const
180 {
181         int providerCount = 0;
182
183         unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
184         SysTryReturn(NID_SHELL, pAppWidgetContextEnum, providerCount, E_SYSTEM, "[E_SYSTEM]");
185
186         while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
187         {
188                 _AppWidgetContext* pContext = null;
189                 pAppWidgetContextEnum->GetValue(pContext);
190
191                 if (pContext->GetAppId() == appId)
192                 {
193                         providerCount++;
194                 }
195         }
196
197         SysLog(NID_SHELL, "The provider count is %d for %ls", providerCount, appId.GetPointer());
198         return providerCount;
199 }
200
201
202 void
203 AppWidgetManagerService::OnIpcClientConnected(const _IpcServer& server, int clientId)
204 {
205         String appId = server.GetClientApplicationId();
206         SysLog(NID_SHELL, "appId(%ls)", appId.GetPointer());
207
208         _AppContext* pAppContext = null;
209         __appContextList.GetValue(appId, pAppContext);
210         if (pAppContext)
211         {
212                 pAppContext->SetClientId(clientId);
213                 pAppContext->SetConnectionState(CONNECTION_STATE_CONNECTED);
214         }
215 }
216
217 void
218 AppWidgetManagerService::OnIpcClientDisconnected(const _IpcServer& server, int clientId)
219 {
220         String appId = server.GetClientApplicationId();
221         SysLog(NID_SHELL, "appId(%ls)", appId.GetPointer());
222
223         _AppContext* pAppContext = null;
224         __appContextList.GetValue(appId, pAppContext);
225         if (pAppContext)
226         {
227                 pAppContext->SetClientId(-1);
228                 pAppContext->SetConnectionState(CONNECTION_STATE_DISCONNECTED);
229         }
230
231         unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
232         SysTryReturnVoidResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "");
233
234         _AppWidgetContext* pContext = null;
235         while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
236         {
237
238                 pAppWidgetContextEnum->GetValue(pContext);
239                 if (pContext->GetAppId() == appId)
240                 {
241                         pContext->OnDisconnected();
242                 }
243         }
244 }
245
246 void
247 AppWidgetManagerService::OnSettingChanged(Tizen::Base::String& key)
248 {
249 //      const static wchar_t KEY_SETTING_FONT_SIZE[] = L"http://tizen.org/setting/font.size";
250         const static wchar_t KEY_SETTING_FONT_TYPE[] = L"http://tizen.org/setting/font.type";
251         const static wchar_t KEY_SETTING_LANGUAGE[] = L"http://tizen.org/setting/locale.language";
252         const static wchar_t KEY_SETTING_COUNTRY[] = L"http://tizen.org/setting/locale.country";
253
254         if( key == KEY_SETTING_FONT_TYPE
255 //              || key == KEY_SETTING_FONT_SIZE
256                 || key == KEY_SETTING_LANGUAGE
257                 || key == KEY_SETTING_COUNTRY )
258         {
259                 SysLog(NID_SHELL, "'%ls' is changed.", key.GetPointer() );
260                 RequestUpdate("", "", "");
261         }
262 }
263
264 _AppWidgetContext*
265 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)
266 {
267         AppId appId;
268         String providerName;
269         _AppWidgetManagerImpl::ExtractAppIdAndProviderName(providerId, appId, providerName);
270
271         _AppContext* pAppContext = null;
272         bool containsKey = false;
273         __appContextList.ContainsKey(appId, containsKey);
274         if( containsKey == false)
275         {
276                 pAppContext = new(std::nothrow) _AppContext;
277                 __appContextList.Add(appId, pAppContext);
278         }
279         else
280         {
281                 __appContextList.GetValue(appId, pAppContext);
282         }
283
284         _AppWidgetContext* pAppWidgetContext = new (std::nothrow)_AppWidgetContext(pAppContext, userInfo, providerId, instanceId, width, height, period, priority);
285         SysTryReturn(NID_SHELL, pAppWidgetContext, 0, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
286
287         __appWidgetContextList.Add(pAppWidgetContext->GetInstanceId(), pAppWidgetContext);
288         pAppWidgetContext->OnAdded();
289
290         SysSecureLog(NID_SHELL, "%ls, %ls, count(%d)", pAppWidgetContext->GetProviderId().GetPointer(), pAppWidgetContext->GetInstanceId().GetPointer(), __appWidgetContextList.GetCount());
291         return pAppWidgetContext;
292 }
293
294 result
295 AppWidgetManagerService::RemoveAppWidget(const char* pProviderId, const char* pId)
296 {
297         SysTryReturn(NID_SHELL, ( pProviderId != null && pId != null), null, E_INVALID_ARG, "[E_INVALID_ARG]");
298
299         _AppWidgetContext* pAppWidgetContext = Find(pId);
300         SysTryReturn(NID_SHELL, pAppWidgetContext, null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND]");
301
302         result r = __appWidgetContextList.Remove(pAppWidgetContext->GetInstanceId());
303
304         delete pAppWidgetContext;
305
306     SysLog(NID_SHELL, "AppWidget(%s, %s) is removed. remain count(%d)", pProviderId, pId, __appWidgetContextList.GetCount());
307         return r;
308 }
309
310 ///////////////////////////////////////////////////////
311 // CoreDaemonEventReceiver implementation
312 ///////////////////////////////////////////////////////
313 int
314 AppWidgetManagerService::OnAppWidgetCreate(struct event_arg *arg, int *width, int *height, double *priority, void* data)
315 {
316         SysTryReturn(NID_SHELL, arg != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
317         SysTryReturn(NID_SHELL, arg->pkgname != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
318         SysTryReturn(NID_SHELL, arg->id != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
319         SysTryReturn(NID_SHELL, arg->type == event_arg::EVENT_NEW, -EPERM, E_SUCCESS, "invalid argument from master");
320
321         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);
322         AppWidgetManagerService* pAppWidgetService = AppWidgetManagerService::GetInstance();
323         SysTryReturn (NID_SHELL, pAppWidgetService->Find(arg->id) == null, -EBUSY, E_SUCCESS,"already exist");
324
325         const double default_priority = 1.0f;
326         _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);
327
328         *priority = pAppWidgetContext->GetPriority();
329         *height= pAppWidgetContext->GetHeight();
330         *width = pAppWidgetContext->GetWidth();
331
332     return 0;
333 }
334
335 int
336 AppWidgetManagerService::OnAppWidgetUpdate(struct event_arg *arg, void* data)
337 {
338         bool isInstanceIdSpecified = (arg->id == null || strlen(arg->id) < 1) ? false : true;
339         if (isInstanceIdSpecified == false)
340         {
341                 AppWidgetManagerService::GetInstance()->UpdateAppWidgetsByProviderId(arg->pkgname);
342         }
343         else
344         {
345                 _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->id);
346                 SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id);
347
348                 pAppWidgetContext->OnUpdate(L"");
349         }
350
351         return 0;
352 }
353
354 int
355 AppWidgetManagerService::UpdateAppWidgetsByProviderId(const String& providerId)
356 {
357         SysLog(NID_SHELL, "");
358
359         unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
360         SysTryReturn(NID_SHELL, pAppWidgetContextEnum, 0, E_SYSTEM, "[E_SYSTEM]");
361
362         while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
363         {
364                 _AppWidgetContext* pContext = null;
365                 pAppWidgetContextEnum->GetValue(pContext);
366
367                 if (pContext->GetProviderId() == providerId)
368                 {
369                         pContext->OnUpdate(L"");
370                 }
371         }
372
373         return 0;
374 }
375
376 int
377 AppWidgetManagerService::OnAppWidgetDestroy(struct event_arg *arg, void* data)
378 {
379         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_DELETE, -EPERM, E_SUCCESS, "invalid argument from master");
380         SysLog(NID_SHELL, "Enter");
381
382         AppWidgetManagerService* pAppWidgetManagerService = AppWidgetManagerService::GetInstance();
383
384         _AppWidgetContext* pAppWidgetContext = pAppWidgetManagerService->Find(arg->id);
385         SysSecureTryReturn(NID_SHELL, pAppWidgetContext, 0, E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id);
386
387     result r = pAppWidgetContext->OnRemoved();
388     SysTryReturn(NID_SHELL, !IsFailed(r), 0, E_SYSTEM, "[E_SYSTEM] Failed to execute OnRemoved.");
389
390     r = pAppWidgetManagerService->RemoveAppWidget(arg->pkgname, arg->id);
391     SysTryReturn(NID_SHELL, !IsFailed(r), 0, E_SYSTEM, "[E_SYSTEM] Failed to execute RemoveAppWidget.");
392
393     SysLog(NID_SHELL, "Exit");
394     return 0;
395 }
396
397 int
398 AppWidgetManagerService::OnAppWidgetPopupCreate(struct event_arg *arg, void* data)
399 {
400         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_PD_CREATE, -EPERM, E_SUCCESS, "invalid argument from master");
401         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);
402
403         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->id);
404         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id);
405
406         pAppWidgetContext->OnPopupCreated(arg->info.pd_create.x, arg->info.pd_create.y, arg->info.pd_create.w, arg->info.pd_create.h);
407
408     return 0;
409 }
410
411  int
412  AppWidgetManagerService::OnAppWidgetPopupDestroy(struct event_arg *arg, void* data)
413 {
414         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_PD_DESTROY, -EPERM, E_SUCCESS, "invalid argument from master");
415         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->id);
416         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id);
417
418         SysSecureLog(NID_SHELL, "providerId(%s), id(%s)", arg->pkgname, arg->id);
419         pAppWidgetContext->OnPopupDestoyed();
420
421     return 0;
422 }
423
424 int
425 AppWidgetManagerService::OnAppWidgetBackground(struct event_arg *arg, void* data)
426 {
427          SysTryReturn(NID_SHELL, arg, 0, E_SUCCESS, "arg is null!");
428
429          _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->id);
430          SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , 0, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id);
431
432          SysSecureLog(NID_SHELL, "providerId(%s), id(%s)", arg->pkgname, arg->id);
433          pAppWidgetContext->OnBackground();
434
435     return 0;
436 }
437
438 int
439 AppWidgetManagerService::OnAppWidgetBackgroundAll(struct event_arg *arg, void* data)
440 {
441         unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum((AppWidgetManagerService::GetInstance()->__appWidgetContextList).GetMapEnumeratorN());
442         SysTryReturn(NID_SHELL, pAppWidgetContextEnum, -1, E_SYSTEM, "[E_SYSTEM]");
443
444         while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
445         {
446                 _AppWidgetContext* pContext = null;
447                 pAppWidgetContextEnum->GetValue(pContext);
448
449                 pContext->OnBackground();
450         }
451
452         return 0;
453 }
454
455 int
456 AppWidgetManagerService::OnAppWidgetForeground(struct event_arg *pArg, void* pData)
457 {
458         SysTryReturn(NID_SHELL, pArg || pArg->id || pArg->pkgname, 0, E_SUCCESS, "pArg is null!");
459
460         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(pArg->id);
461         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", pArg->pkgname, pArg->id);
462
463         SysSecureLog(NID_SHELL, "providerId(%s), id(%s)", pArg->pkgname, pArg->id);
464         pAppWidgetContext->OnForeground();
465         return 0;
466 }
467
468 int
469 AppWidgetManagerService::OnAppWidgetForegroundAll(struct event_arg *pArg, void* pData)
470 {
471         unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum((AppWidgetManagerService::GetInstance()->__appWidgetContextList).GetMapEnumeratorN());
472         SysTryReturn(NID_SHELL, pAppWidgetContextEnum, -1, E_SYSTEM, "[E_SYSTEM]");
473
474         while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
475         {
476                 _AppWidgetContext* pContext = null;
477                 pAppWidgetContextEnum->GetValue(pContext);
478
479                 pContext->OnForeground();
480         }
481
482         return 0;
483 }
484
485 int
486 AppWidgetManagerService::OnAppWidgetClick(struct event_arg *arg, void* data)
487 {
488         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_CLICKED, -EPERM, E_SUCCESS, "invalid argument from master");
489         SysTryReturn(NID_SHELL, arg != null, -EPERM, E_SUCCESS, "arg is null!");
490         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);
491
492     return 0;
493 }
494
495 int
496 AppWidgetManagerService::OnAppWidgetResize(struct event_arg *arg, void* data)
497 {
498         SysTryReturn(NID_SHELL, arg || arg->id || arg->pkgname, 0, E_SUCCESS, "arg is null!");
499         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_RESIZE, -EPERM, E_SUCCESS, "invalid argument from master");
500
501         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);
502
503         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->id);
504         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id);
505
506         pAppWidgetContext->OnResize(arg->info.resize.w, arg->info.resize.h);
507
508     return 0;
509 }
510
511 int
512 AppWidgetManagerService::OnAppWidgetPeriodChanged(struct event_arg *arg, void* data)
513 {
514         SysTryReturn(NID_SHELL, arg != null, 0, E_SUCCESS, "arg is null!");
515         SysSecureLog(NID_SHELL, "providerId(%s), id(%s), width(%d), height(%d), priority(%d)", arg->pkgname, arg->id);
516     return 0;
517 }
518
519 int
520 AppWidgetManagerService::OnAppWidgetRecreate(struct event_arg *arg, void* data)
521 {
522         SysTryReturn(NID_SHELL, arg != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
523         SysTryReturn(NID_SHELL, arg->pkgname != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
524         SysTryReturn(NID_SHELL, arg->id != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
525
526         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);
527
528         AppWidgetManagerService* pAppWidgetManagerService = AppWidgetManagerService::GetInstance();
529         SysTryReturn(NID_SHELL, pAppWidgetManagerService != null, -EBUSY, E_SYSTEM, "Failed to get the instance for AppWidgetManagerService.");
530
531         const double default_priority = 1.0f;
532         _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);
533         SysTryReturn(NID_SHELL, pAppWidgetContext != null, -EBUSY, E_SYSTEM, "Failed to add the appwidget.");
534
535         return 0;
536 }
537
538 result
539 AppWidgetManagerService::InitializeCoreDaemonEventReceiver(const char *pCoreDaemonId)
540 {
541         SysTryReturnResult(NID_SHELL, pCoreDaemonId != null, E_INVALID_ARG, "pCoreDaemonId should not be null!");
542
543     struct event_handler cbs;
544     memset(&cbs, 0, sizeof(event_handler));
545
546     cbs.connected = AppWidgetConnected,
547     cbs.disconnected = AppWidgetDisconnected,
548     cbs.pause = OnAppWidgetBackgroundAll,
549     cbs.resume = OnAppWidgetForegroundAll,
550     cbs.lb_pause = OnAppWidgetBackground,
551     cbs.lb_resume = OnAppWidgetForeground,
552     cbs.lb_create = OnAppWidgetCreate,
553     cbs.lb_destroy = OnAppWidgetDestroy,
554     cbs.update_content = OnAppWidgetUpdate,
555     cbs.pd_create = OnAppWidgetPopupCreate,
556     cbs.pd_destroy = OnAppWidgetPopupDestroy,
557     cbs.clicked = OnAppWidgetClick,
558     cbs.resize = OnAppWidgetResize,
559     cbs.set_period = OnAppWidgetPeriodChanged;
560     cbs.lb_recreate = OnAppWidgetRecreate;/* Recover from the fault of slave */
561     //cbs.content_event = OnAppWidgetContentEvent,
562
563     int ret = provider_init(null, pCoreDaemonId, &cbs, this);
564     SysTryReturnResult(NID_SHELL, ret == 0, E_SYSTEM, "provider_init failed.");
565
566     SysLog(NID_SHELL, "provider_init is invoked with (%s)", pCoreDaemonId);
567     return E_SUCCESS;
568 }
569
570 result
571 AppWidgetManagerService::DeinitializeCoreDaemonEventReceiver(void)
572 {
573     provider_fini();
574     return E_SUCCESS;
575 }
576
577 ///////////////////////////////////////////////////////
578 // stub implementation
579 ///////////////////////////////////////////////////////
580
581
582 result
583 AppWidgetManagerService::RequestUpdate(const Tizen::App::AppId& appId, const Tizen::Base::String& providerName, const Tizen::Base::String& argument)
584 {
585         bool found = false;
586         bool updateAllSuspended = appId.IsEmpty();
587
588         unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum((AppWidgetManagerService::GetInstance()->__appWidgetContextList).GetMapEnumeratorN());
589         SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "");
590
591         while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
592         {
593                 _AppWidgetContext* pContext = null;
594                 pAppWidgetContextEnum->GetValue(pContext);
595
596                 if ( (updateAllSuspended == true && AppManager::GetInstance()->IsRunning(appId) == false )
597                         || ( pContext->GetAppId() == appId && pContext->GetProviderName() == providerName ) )
598                 {
599                         RequestUpdate(pContext, argument);
600                         found = true;
601                 }
602         }
603
604         SysLog(NID_SHELL, "Exit.");
605         return (found) ? E_SUCCESS : E_OBJ_NOT_FOUND;
606 }
607
608 // for resuming
609 result
610 AppWidgetManagerService::RequestUpdate(_AppWidgetContext* pAppWidgetContext, const String& argument)
611 {
612         if (pAppWidgetContext == null)
613         {
614                 SysLog(NID_SHELL, "pAppWidgetContext is null.");
615         }
616
617         ArrayList* pArray = new (std::nothrow) ArrayList();
618         SysTryReturnResult(NID_SHELL, pArray, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
619
620         pArray->Construct();
621         pArray->Add(pAppWidgetContext);
622         pArray->Add(new String(argument));
623
624         result r = __handlerThread.SendUserEvent(LOCAL_EVENT_REQUEST_UPDATE, pArray);
625         SysTryLog(NID_SHELL, !IsFailed(r), "[%s] Propagated.", GetErrorMessage(r));
626         SysLog(NID_SHELL, "UserEvent(%d) is sent for '%ls.%ls'.", LOCAL_EVENT_REQUEST_UPDATE, pAppWidgetContext->GetAppId().GetPointer(), pAppWidgetContext->GetProviderName().GetPointer() );
627
628         return E_SUCCESS;
629 }
630
631 result
632 AppWidgetManagerService::RequestUpdateInstance(const Tizen::Base::String& instanceId, const Tizen::Base::String& argument)
633 {
634         SysSecureLog(NID_SHELL, "%ls, %ls", instanceId.GetPointer(), argument.GetPointer() );
635
636         _AppWidgetContext* pAppWidgetContext = Find(instanceId);
637         SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find the object(%ls).", instanceId.GetPointer());
638
639         RequestUpdate(pAppWidgetContext, argument);
640         return E_SUCCESS;
641 }
642
643 result
644 AppWidgetManagerService::AcquireRemoteBuffer(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int width, int height, int& bufferId)
645 {
646         _AppWidgetContext* pAppWidgetContext = this->Find(instanceId);
647         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
648
649         bufferId = pAppWidgetContext->AcquireRemoteBuffer(width, height);
650         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , bufferId != -1, "[E_SYSTEM] failed to AcquireRemoteBuffer for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
651
652     return E_SUCCESS;
653 }
654
655 result
656 AppWidgetManagerService::AcquireRemoteBufferForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int width, int height, int& bufferId)
657 {
658         _AppWidgetContext* pAppWidgetContext = this->Find(instanceId);
659         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
660
661         _AppWidgetPopupContext* pPopupContext = pAppWidgetContext->GetAppWidgetPopup();
662         SysSecureTryReturnResult(NID_SHELL, pPopupContext , E_SYSTEM, "[E_SYSTEM] pPd is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
663
664         bufferId = pPopupContext->AcquireRemoteBuffer(width, height);
665         SysSecureTryReturnResult(NID_SHELL, bufferId != -1, E_SYSTEM, "Failed to AcquireRemoteBuffer for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
666
667     return E_SUCCESS;
668 }
669
670 result
671 AppWidgetManagerService::SyncRemoteBuffer(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int width, int height)
672 {
673         _AppWidgetContext* pAppWidgetContext = this->Find(instanceId);
674         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
675
676         return pAppWidgetContext->SyncRemoteBuffer(width, height);
677 }
678
679 result
680 AppWidgetManagerService::SyncRemoteBufferForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId)
681 {
682         _AppWidgetContext* pAppWidgetContext = this->Find(instanceId);
683         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
684         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext->GetAppWidgetPopup(), E_SYSTEM, "[E_SYSTEM] GetAppWidgetPopup() returns null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
685
686         return pAppWidgetContext->GetAppWidgetPopup()->SyncRemoteBuffer();
687 }
688
689 result
690 AppWidgetManagerService::ReleaseRemoteBuffer(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId)
691 {
692         return E_SUCCESS;
693 }
694
695 result
696 AppWidgetManagerService::ReleaseRemoteBufferForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId)
697 {
698         return E_SUCCESS;
699 }
700
701 result
702 AppWidgetManagerService::RequestProviderCount(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int& providerCount)
703 {
704         SysLog(NID_SHELL, "ENTER");
705
706         _AppWidgetContext* pAppWidgetContext = this->Find(instanceId);
707         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext, E_SYSTEM, "pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
708
709         providerCount = GetProviderCount(pAppWidgetContext->GetAppId());
710
711         std::unique_ptr<char[]> providerId(_StringConverter::CopyToCharArrayN(pAppWidgetContext->GetProviderId()));
712         std::unique_ptr<char[]> id(_StringConverter::CopyToCharArrayN(pAppWidgetContext->GetInstanceId()));
713
714         int ret = provider_send_deleted(providerId.get(), id.get());
715         SysTryReturnResult(NID_SHELL, ret >= 0 , E_SYSTEM, "Failed to execute provider_send_deleted.");
716
717         //result r = pAppWidgetContext->OnRemoved();
718         //SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute OnRemoved.");
719
720         result r = RemoveAppWidget(providerId.get(), id.get());
721         SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute RemoveAppWidget.");
722
723         providerCount--;
724
725         RequestPendingEvent();
726
727         return E_SUCCESS;
728 }
729
730 result
731 AppWidgetManagerService::SendResult(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, bool isSucceeded)
732 {
733         _AppWidgetContext* pAppWidgetContext = null;
734
735         if (!isSucceeded)
736         {
737                 SysLog(NID_SHELL, "SendResult is called[false].");
738
739                 if (instanceId == INVALID_INSTANCE)
740                 {
741                         unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum((AppWidgetManagerService::GetInstance()->__appWidgetContextList).GetMapEnumeratorN());
742                         SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "");
743
744                         while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
745                         {
746                                 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
747                                 SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext, E_SYSTEM, "pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
748
749                                 if (pAppWidgetContext->GetAppContext()->GetConnectionState() == CONNECTION_STATE_NONE)
750                                 {
751                                         break;
752                                 }
753                         }
754                 }
755                 else
756                 {
757                         pAppWidgetContext = this->Find(instanceId);
758                 }
759
760                 SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext, E_SYSTEM, "pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
761
762                 std::unique_ptr<char[]> providerId(_StringConverter::CopyToCharArrayN(pAppWidgetContext->GetProviderId()));
763                 std::unique_ptr<char[]> id(_StringConverter::CopyToCharArrayN(pAppWidgetContext->GetInstanceId()));
764
765                 int ret = provider_send_deleted(providerId.get(), id.get());
766                 SysTryReturnResult(NID_SHELL, ret >= 0 , E_SYSTEM, "Failed to execute provider_send_deleted.");
767
768                 //result r = pAppWidgetContext->OnRemoved();
769                 //SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute OnRemoved.");
770
771                 result r = RemoveAppWidget(providerId.get(), id.get());
772                 SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute RemoveAppWidget.");
773         }
774         else    // for pending event excluding touch event.
775         {
776                 SysLog(NID_SHELL, "SendResult is called[true].");
777         }
778
779         RequestPendingEvent();
780
781         return E_SUCCESS;
782 }
783
784 result
785 AppWidgetManagerService::SendAccessStatus(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int accessStatus)
786 {
787         _AppWidgetContext* pAppWidgetContext = this->Find(instanceId);
788         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
789
790         return pAppWidgetContext->SendAccessStatus(accessStatus);
791 }
792
793 result
794 AppWidgetManagerService::RequestPendingEvent(void)
795 {
796         unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum((AppWidgetManagerService::GetInstance()->__appWidgetContextList).GetMapEnumeratorN());
797         SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "");
798
799         result r = E_SUCCESS;
800
801         while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
802         {
803                 _AppWidgetContext* pContext = null;
804                 pAppWidgetContextEnum->GetValue(pContext);
805
806                 r = pContext->SendPendingEvent();
807                 if (r == E_SUCCESS)
808                 {
809                         SysLog(NID_SHELL, "Found pending event.");
810                         break;
811                 }
812         }
813
814         return E_SUCCESS;
815 }
816
817 AppWidgetManagerService::_TaskHandlerThread::~_TaskHandlerThread(void)
818 {
819
820 }
821
822 void
823 AppWidgetManagerService::_TaskHandlerThread::OnUserEventReceivedN(RequestId reqId, IList* pArgs)
824 {
825         SysTryReturnVoidResult(NID_SHELL, pArgs != null, E_INVALID_STATE, "pArgs is null!.");
826
827         SysLog(NID_SHELL, "Enter.");
828
829         switch (reqId)
830         {
831         case LOCAL_EVENT_REQUEST_UPDATE:
832         {
833                 _AppWidgetContext* pAppWidgetContext = dynamic_cast<_AppWidgetContext*>( pArgs->GetAt(0) );
834                 SysTryReturnVoidResult(NID_SHELL, pAppWidgetContext != null, E_INVALID_STATE, "_AppWidget is null!.");
835
836                 String* pArgument = dynamic_cast<String*>( pArgs->GetAt(1) );
837                 SysTryReturnVoidResult(NID_SHELL, pArgument != null, E_INVALID_STATE, "pArgument is null!.");
838
839                 pAppWidgetContext->OnUpdate(*pArgument);
840
841                 delete pArgument;
842                 pArgs->RemoveAll();
843                 delete pArgs;
844         }
845                 break;
846
847         default:
848                 SysAssertf(false, "Never get here!");
849                 break;
850         }
851
852         SysLog(NID_SHELL, "Exit.");
853 }
854
855 }}}     // Tizen::Shell::App