3b6e0f6b7c11136f5ba5ac068e0d5cfdefa9a0c6
[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 <FApp_AppManagerImpl.h>
28 #include <FIo_IpcServer.h>
29 #include <FBase_StringConverter.h>
30 #include "FShell_AppWidgetContext.h"
31 #include "FShell_AppWidgetPopupContext.h"
32 #include "FShell_AppWidgetManagerStub.h"
33 #include "FShell_AppWidgetManagerService.h"
34
35 namespace Tizen { namespace Shell  { namespace App {
36
37 using namespace Tizen::App;
38 using namespace Tizen::Base;
39 using namespace Tizen::Base::Collection;
40 using namespace Tizen::Base::Runtime;
41 using namespace Tizen::Io;
42 using namespace Tizen::System;
43 using namespace Tizen::Shell::App;
44
45 namespace
46 {
47 static const RequestId  LOCAL_EVENT_REQUEST_UPDATE = 0;
48 }
49
50 extern const int UPDATE_PERIOD_MSEC_MIN;
51
52 AppWidgetManagerService::AppWidgetManagerService(void)
53 {
54
55 }
56
57 AppWidgetManagerService::~AppWidgetManagerService(void)
58 {
59         __pingTimer.Cancel();
60         DeinitializeMasterDaemonEventReceiver();
61 }
62
63 AppWidgetManagerService*
64 AppWidgetManagerService::GetInstance(void)
65 {
66         static AppWidgetManagerService* pSelf = null;
67         if( pSelf == null)
68         {
69                 pSelf = new AppWidgetManagerService();
70                 SysTryReturn(NID_SHELL, pSelf != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
71
72                 result r = pSelf->Construct();
73                 SysAssertf(!IsFailed(r), "Failed to construct AppWidgetManagerService");
74                 SysLog(NID_SHELL, "AppWidgetManagerService is created.");
75         }
76         return pSelf;
77 }
78
79 result
80 AppWidgetManagerService::Construct(void)
81 {
82         _AppWidgetManagerStub::StartIpcServer();
83
84         result r = __handlerThread.Construct(THREAD_TYPE_EVENT_DRIVEN);
85         SysTryReturnResult(NID_SHELL, IsFailed(r) == false, r, "Event thread creation failure.");
86
87         r = __handlerThread.Start();
88         SysTryReturnResult(NID_SHELL, IsFailed(r) == false, r, "Event thread Start failure.");
89
90         return InitializeMasterDaemonEventReceiver("osp-appwidget-service");
91 }
92
93 int
94 AppWidgetManagerService::AppWidgetConnected(struct event_arg *arg, void* data)
95 {
96     int ret;
97     ret = provider_send_hello();
98     if (ret == 0)
99     {
100         SysLog(NID_SHELL, "success to be connected with master daemon");
101         AppWidgetManagerService::GetInstance()->StartPingTimer();
102
103     }
104     else
105     {
106         SysLog(NID_SHELL, "failed to provider_send_hello()");
107     }
108     return ret;
109 }
110
111 int
112 AppWidgetManagerService::AppWidgetDisconnected(struct event_arg *arg, void* data)
113 {
114         SysLog(NID_SHELL, "success to be disconnected with master daemon");
115     return 0;
116 }
117
118 void
119 AppWidgetManagerService::StartPingTimer(void)
120 {
121         __pingTimer.Construct(*this);
122         __pingTimer.StartAsRepeatable(120000);
123 }
124
125 void
126 AppWidgetManagerService::OnTimerExpired(Timer& timer)
127 {
128         SysLog(NID_SHELL, "provider_send_ping");
129         provider_send_ping();
130 }
131
132 //TODO: remove unused param 'appId'
133 _AppWidgetContext*
134 AppWidgetManagerService::Find(const String& appId, const String& instanceId) const
135 {
136         for (int i = 0; i < __appWidgetContextList.GetCount(); i++)
137         {
138                 _AppWidgetContext* pAppWidgetContext = null;
139                 __appWidgetContextList.GetAt(i, pAppWidgetContext);
140
141                 if (pAppWidgetContext->GetInstanceId() == instanceId)
142                 {
143                         return pAppWidgetContext;
144                 }
145         }
146         return null;
147 }
148
149 int
150 AppWidgetManagerService::Find(const String& appId) const
151 {
152         int clientId = -1;
153
154         for (int i = 0; i < __appWidgetContextList.GetCount(); i++)
155         {
156                 _AppWidgetContext* pAppWidgetContext = null;
157                 __appWidgetContextList.GetAt(i, pAppWidgetContext);
158
159                 if (pAppWidgetContext->GetProviderId() == appId)
160                 {
161                         clientId = pAppWidgetContext->GetClientId();
162                         break;
163                 }
164         }
165
166         SysLog(NID_SHELL, "clientId is %d", clientId);
167
168         return clientId;
169 }
170
171 result
172 AppWidgetManagerService::SetIpcClientIds(const Tizen::App::AppId& appId, int clientId)
173 {
174         for (int i = 0; i < __appWidgetContextList.GetCount(); i++)
175         {
176                 _AppWidgetContext* pAppWidgetContext = null;
177                 __appWidgetContextList.GetAt(i, pAppWidgetContext);
178                 SysSecureLog(NID_SHELL, "%ls, %ls, %ls", pAppWidgetContext->GetInstanceId().GetPointer(), pAppWidgetContext->GetProviderId().GetPointer(), appId.GetPointer());
179
180                 if (pAppWidgetContext->GetAppId() == appId)
181                 {
182                         pAppWidgetContext->SetIpcClientId(clientId);
183
184                         if( clientId == -1)
185                         {
186                                 SysLog(NID_SHELL, "client is unregistered.");
187                                 pAppWidgetContext->Suspend();
188                                 if(pAppWidgetContext->GetAppWidgetPopup())
189                                 {
190                                         pAppWidgetContext->OnPopupDestoyed();
191                                 }
192                         }
193                         else
194                         {
195                                 SysLog(NID_SHELL, "client is registered.(%d)", clientId);
196                         }
197                 }
198         }
199         return E_SUCCESS;
200 }
201
202 void
203 AppWidgetManagerService::OnIpcClientConnected(const _IpcServer& server, int clientId)
204 {
205         String appId = server.GetClientApplicationId();
206         SysLog(NID_SHELL, "(%ls)\n", appId.GetPointer());
207
208         this->SetIpcClientIds(appId, clientId);
209 }
210
211 void
212 AppWidgetManagerService::OnIpcClientDisconnected(const _IpcServer& server, int clientId)
213 {
214         String appId = server.GetClientApplicationId();
215         SysLog(NID_SHELL, "(%ls)\n", appId.GetPointer());
216
217         this->SetIpcClientIds(appId, -1);
218 }
219
220 result
221 AppWidgetManagerService::AddAppWidget(_AppWidgetContext* pAppWidgetContext)
222 {
223         SysSecureLog(NID_SHELL, "%ls, %ls, count(%d)", pAppWidgetContext->GetProviderId().GetPointer(), pAppWidgetContext->GetInstanceId().GetPointer(), __appWidgetContextList.GetCount());
224
225         return __appWidgetContextList.Add(pAppWidgetContext);
226 }
227
228 result
229 AppWidgetManagerService::RemoveAppWidget(const char* pPackageName, const char* pId, bool free)
230 {
231         SysTryReturn(NID_SHELL, ( pPackageName != null && pId != null), null, E_INVALID_ARG, "[E_INVALID_ARG]");
232
233         _AppWidgetContext* pAppWidgetContext = Find(pPackageName, pId);
234         SysTryReturn(NID_SHELL, pAppWidgetContext, null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND]");
235
236         result r = __appWidgetContextList.Remove(pAppWidgetContext);
237
238         delete pAppWidgetContext;
239
240     SysLog(NID_SHELL, "AppWidget(%s, %s) is removed. remain count(%d)", pPackageName, pId, __appWidgetContextList.GetCount());
241         return r;
242 }
243
244 ///////////////////////////////////////////////////////
245 // MasterDaemonEventReceiver implementation
246 ///////////////////////////////////////////////////////
247 int
248 AppWidgetManagerService::OnAppWidgetCreate(struct event_arg *arg, int *width, int *height, double *priority, void* data)
249 {
250         SysTryReturn(NID_SHELL, arg != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
251         SysTryReturn(NID_SHELL, arg->pkgname != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
252         SysTryReturn(NID_SHELL, arg->id != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
253         SysTryReturn(NID_SHELL, arg->type == event_arg::EVENT_NEW, -EPERM, E_SUCCESS, "invalid argument from master");
254
255         SysSecureLog(NID_SHELL, "packageName(%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);
256         SysTryReturn (NID_SHELL, AppWidgetManagerService::GetInstance()->Find(arg->pkgname, arg->id) == null, -EBUSY, E_SUCCESS,"already exist");
257
258         double default_priority = 1.0f;
259         _AppWidgetContext* pAppWidgetContext = new (std::nothrow)_AppWidgetContext( arg->info.lb_create.content, arg->pkgname, arg->id,
260                         arg->info.lb_create.width, arg->info.lb_create.height, arg->info.lb_create.period * 1000, default_priority);
261         SysTryReturn(NID_SHELL, pAppWidgetContext, 0, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
262
263         int clientId = AppWidgetManagerService::GetInstance()->Find(arg->pkgname);
264         if (clientId != -1)
265         {
266                 SysLog(NID_SHELL, "There is same parent application.");
267                 pAppWidgetContext->SetIpcClientId(clientId);
268         }
269         else
270         {
271                 SysLog(NID_SHELL, "There is no same parent application.");
272         }
273
274         AppWidgetManagerService* pAppWidgetService = AppWidgetManagerService::GetInstance();
275         pAppWidgetService->AddAppWidget(pAppWidgetContext);
276         pAppWidgetContext->OnAdded();
277
278         *priority = pAppWidgetContext->GetPriority();
279         *height= pAppWidgetContext->GetHeight();
280         *width = pAppWidgetContext->GetWidth();
281
282         SysLog(NID_SHELL, "Exit. %d appWidget(s)", pAppWidgetService->__appWidgetContextList.GetCount());
283     return 0;
284 }
285
286 int
287 AppWidgetManagerService::OnAppWidgetUpdate(struct event_arg *arg, void* data)
288 {
289         if( arg->id == null || strlen(arg->id) < 1)
290         {
291                 SysLog(NID_SHELL, "updating alls");
292                 AppWidgetManagerService::GetInstance()->UpdateAllAppWidgetsByAppId(arg->pkgname);
293         }
294         else
295         {
296                 _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->pkgname, arg->id);
297                 SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for appId(%s), instanceId(%s)", arg->pkgname, arg->id);
298
299                 pAppWidgetContext->OnUpdate(L"");
300         }
301
302         return 0;
303 }
304
305 int
306 AppWidgetManagerService::UpdateAllAppWidgetsByAppId(const String& providerId)
307 {
308         for( int i = 0; i < __appWidgetContextList.GetCount(); i++ )
309         {
310                 _AppWidgetContext* pAppWidgetContext = null;
311                 __appWidgetContextList.GetAt(i, pAppWidgetContext);
312
313                 if ( pAppWidgetContext->GetProviderId() == providerId )
314                 {
315                         pAppWidgetContext->OnUpdate(L"");
316                 }
317         }
318         return E_SUCCESS;
319 }
320
321 int
322 AppWidgetManagerService::OnAppWidgetDestroy(struct event_arg *arg, void* data)
323 {
324         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_DELETE, -EPERM, E_SUCCESS, "invalid argument from master");
325         SysLog(NID_SHELL, "Enter");
326
327         AppWidgetManagerService* pAppWidgetManagerService = AppWidgetManagerService::GetInstance();
328
329         _AppWidgetContext* pAppWidgetContext = pAppWidgetManagerService->Find(arg->pkgname, arg->id);
330         SysSecureTryReturn(NID_SHELL, pAppWidgetContext, 0, E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for appId(%s), instanceId(%s)", arg->pkgname, arg->id);
331
332     result r = pAppWidgetContext->OnRemoved();
333     SysTryReturn(NID_SHELL, !IsFailed(r), 0, E_SYSTEM, "[E_SYSTEM] Failed to execute OnRemoved.");
334
335     r = pAppWidgetManagerService->RemoveAppWidget(arg->pkgname, arg->id, true);
336     SysTryReturn(NID_SHELL, !IsFailed(r), 0, E_SYSTEM, "[E_SYSTEM] Failed to execute RemoveAppWidget.");
337
338     SysLog(NID_SHELL, "Exit");
339     return 0;
340 }
341
342 int
343 AppWidgetManagerService::OnAppWidgetPopupCreate(struct event_arg *arg, void* data)
344 {
345         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_PD_CREATE, -EPERM, E_SUCCESS, "invalid argument from master");
346         SysSecureLog(NID_SHELL, "packageName(%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);
347
348         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->pkgname, arg->id);
349         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for appId(%s), instanceId(%s)", arg->pkgname, arg->id);
350
351         pAppWidgetContext->OnPopupCreated(arg->info.pd_create.x, arg->info.pd_create.y, arg->info.pd_create.w, arg->info.pd_create.h);
352
353     return 0;
354 }
355
356  int
357  AppWidgetManagerService::OnAppWidgetPopupDestroy(struct event_arg *arg, void* data)
358 {
359         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_PD_DESTROY, -EPERM, E_SUCCESS, "invalid argument from master");
360         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->pkgname, arg->id);
361         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for appId(%s), instanceId(%s)", arg->pkgname, arg->id);
362
363         SysSecureLog(NID_SHELL, "packageName(%s), id(%s)", arg->pkgname, arg->id);
364         pAppWidgetContext->OnPopupDestoyed();
365
366     return 0;
367 }
368
369 int
370 AppWidgetManagerService::OnAppWidgetPause(struct event_arg *arg, void* data)
371 {
372          SysTryReturn(NID_SHELL, arg, 0, E_SUCCESS, "arg is null!");
373
374          _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->pkgname, arg->id);
375          SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , 0, "[E_SYSTEM] pAppWidgetContext is null for appId(%s), instanceId(%s)", arg->pkgname, arg->id);
376
377          SysSecureLog(NID_SHELL, "packageName(%s), id(%s)", arg->pkgname, arg->id);
378          pAppWidgetContext->OnBackground();
379
380     return 0;
381 }
382
383 int
384 AppWidgetManagerService::OnAppWidgetPauseAll(struct event_arg *arg, void* data)
385 {
386         SysLog(NID_SHELL, "OnAppWidgetPauseAll");
387
388         AppWidgetManagerService* pAppManagerService = AppWidgetManagerService::GetInstance();
389
390         for (int i = 0; i < (pAppManagerService->__appWidgetContextList).GetCount(); i++)
391         {
392                 _AppWidgetContext* pAppWidgetContext = null;
393                 (pAppManagerService->__appWidgetContextList).GetAt(i, pAppWidgetContext);
394
395                 pAppWidgetContext->OnBackground();
396         }
397
398     return 0;
399 }
400
401 int
402 AppWidgetManagerService::OnAppWidgetResume(struct event_arg *pArg, void* pData)
403 {
404         SysTryReturn(NID_SHELL, pArg || pArg->id || pArg->pkgname, 0, E_SUCCESS, "pArg is null!");
405
406         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(pArg->pkgname, pArg->id);
407         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for appId(%s), instanceId(%s)", pArg->pkgname, pArg->id);
408
409         SysSecureLog(NID_SHELL, "packageName(%s), id(%s)", pArg->pkgname, pArg->id);
410         pAppWidgetContext->OnForeground();
411         return 0;
412 }
413
414 int
415 AppWidgetManagerService::OnAppWidgetResumeAll(struct event_arg *pArg, void* pData)
416 {
417         SysLog(NID_SHELL, "OnAppWidgetResumeAll");
418
419         AppWidgetManagerService* pAppManagerService = AppWidgetManagerService::GetInstance();
420
421         for (int i = 0; i < (pAppManagerService->__appWidgetContextList).GetCount(); i++)
422         {
423                 _AppWidgetContext* pAppWidgetContext = null;
424                 (pAppManagerService->__appWidgetContextList).GetAt(i, pAppWidgetContext);
425
426                 pAppWidgetContext->OnForeground();
427         }
428
429     return 0;
430 }
431
432 int
433 AppWidgetManagerService::OnAppWidgetClick(struct event_arg *arg, void* data)
434 {
435         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_CLICKED, -EPERM, E_SUCCESS, "invalid argument from master");
436         SysTryReturn(NID_SHELL, arg != null, -EPERM, E_SUCCESS, "arg is null!");
437         SysSecureLog(NID_SHELL, "packageName(%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);
438
439     return 0;
440 }
441
442 int
443 AppWidgetManagerService::OnAppWidgetResize(struct event_arg *arg, void* data)
444 {
445         SysTryReturn(NID_SHELL, arg || arg->id || arg->pkgname, 0, E_SUCCESS, "arg is null!");
446         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_RESIZE, -EPERM, E_SUCCESS, "invalid argument from master");
447
448         SysSecureLog(NID_SHELL, "packageName(%s), id(%s), resize.w(%d), resize.h(%d)", arg->pkgname, arg->id, arg->info.resize.w, arg->info.resize.h);
449
450         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->pkgname, arg->id);
451         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for appId(%s), instanceId(%s)", arg->pkgname, arg->id);
452
453         pAppWidgetContext->OnResize(arg->info.resize.w, arg->info.resize.h);
454
455     return 0;
456 }
457
458 int
459 AppWidgetManagerService::OnAppWidgetPeriodChaned(struct event_arg *arg, void* data)
460 {
461         SysTryReturn(NID_SHELL, arg != null, 0, E_SUCCESS, "arg is null!");
462         SysSecureLog(NID_SHELL, "packageName(%s), id(%s), width(%d), height(%d), priority(%d)", arg->pkgname, arg->id);
463     return 0;
464 }
465
466 int
467 AppWidgetManagerService::OnAppWidgetRecreate(struct event_arg *arg, void* data)
468 {
469         SysLog(NID_SHELL, "");
470         return 0;
471 }
472
473 result
474 AppWidgetManagerService::InitializeMasterDaemonEventReceiver(const char *pServiceExecutableName)
475 {
476         SysTryReturnResult(NID_SHELL, pServiceExecutableName != null, E_INVALID_ARG, "");
477         SysLog(NID_SHELL, "Enter.");
478
479         __appWidgetContextList.Construct();
480
481         /*!
482          * \note
483          * Only for the buffer type
484          */
485     struct event_handler cbs;
486     memset(&cbs, 0, sizeof(event_handler));
487
488     cbs.connected = AppWidgetConnected,
489     cbs.disconnected = AppWidgetDisconnected,
490     cbs.pause = OnAppWidgetPauseAll,
491     cbs.resume = OnAppWidgetResumeAll,
492     cbs.lb_pause = OnAppWidgetPause,
493     cbs.lb_resume = OnAppWidgetResume,
494     cbs.lb_create = OnAppWidgetCreate,
495     cbs.lb_destroy = OnAppWidgetDestroy,
496     cbs.update_content = OnAppWidgetUpdate,
497     cbs.pd_create = OnAppWidgetPopupCreate,
498     cbs.pd_destroy = OnAppWidgetPopupDestroy,
499     cbs.clicked = OnAppWidgetClick,
500     cbs.resize = OnAppWidgetResize,
501     cbs.set_period = OnAppWidgetPeriodChaned;
502     cbs.lb_recreate = OnAppWidgetRecreate;/* Recover from the fault of slave */
503     //cbs.content_event = OnAppWidgetContentEvent,
504
505     int ret = provider_init(null, pServiceExecutableName, &cbs, this);
506     SysTryReturnResult(NID_SHELL, ret == 0, E_SYSTEM, "provider_init failed.");
507
508     SysLog(NID_SHELL, "Exit.");
509     return E_SUCCESS;
510 }
511
512 result
513 AppWidgetManagerService::DeinitializeMasterDaemonEventReceiver(void)
514 {
515         SysLog(NID_SHELL, "Enter.");
516     provider_fini();
517     SysLog(NID_SHELL, "Exit.");
518     return E_SUCCESS;
519 }
520
521 ///////////////////////////////////////////////////////
522 // stub implementation
523 ///////////////////////////////////////////////////////
524 result
525 AppWidgetManagerService::RequestUpdate(const Tizen::App::AppId& appId, const Tizen::Base::String& providerName, const Tizen::Base::String& argument)
526 {
527         SysLog(NID_SHELL, "%ls, %ls", appId.GetPointer(), providerName.GetPointer() );
528
529         bool found = false;
530         for( int i = 0; i < __appWidgetContextList.GetCount(); i++ )
531         {
532                 _AppWidgetContext* pAppWidgetContext = null;
533                 __appWidgetContextList.GetAt(i, pAppWidgetContext);
534
535                 if ( pAppWidgetContext->GetAppId() == appId && pAppWidgetContext->GetProviderName() == providerName)
536                 {
537                         ArrayList* pArray = new (std::nothrow) ArrayList();
538                         SysTryReturnResult(NID_SHELL, pArray, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
539
540                         pArray->Construct();
541                         pArray->Add(pAppWidgetContext);
542                         pArray->Add(new String(argument));
543
544                         result r = __handlerThread.SendUserEvent(LOCAL_EVENT_REQUEST_UPDATE, pArray);
545                         SysTryLog(NID_SHELL, !IsFailed(r), "[%s] Propagated.", GetErrorMessage(r));
546
547                         found = true;
548                 }
549         }
550         SysLog(NID_SHELL, "Exit.");
551         return (found) ? E_SUCCESS : E_OBJ_NOT_FOUND;
552 }
553
554 result
555 AppWidgetManagerService::RequestUpdateInstance(const Tizen::Base::String& instanceId, const Tizen::Base::String& argument)
556 {
557         SysSecureLog(NID_SHELL, "%ls, %ls", instanceId.GetPointer(), argument.GetPointer() );
558
559         for (int i = 0; i < __appWidgetContextList.GetCount(); i++ )
560         {
561                 _AppWidgetContext* pAppWidgetContext = null;
562                 __appWidgetContextList.GetAt(i, pAppWidgetContext);
563
564                 if (pAppWidgetContext->GetInstanceId() == instanceId)
565                 {
566                         SysLog(NID_SHELL, "OK");
567
568                         ArrayList* pArray = new (std::nothrow) ArrayList();
569                         SysTryReturnResult(NID_SHELL, pArray, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
570
571                         pArray->Construct();
572                         pArray->Add(pAppWidgetContext);
573                         pArray->Add(new String(argument));
574
575                         result r = __handlerThread.SendUserEvent(LOCAL_EVENT_REQUEST_UPDATE, pArray);
576                         SysTryLog(NID_SHELL, !IsFailed(r), "[%s] Propagated.", GetErrorMessage(r));
577
578                         return E_SUCCESS;
579                 }
580         }
581         SysLog(NID_SHELL, "Exit.");
582         return E_OBJ_NOT_FOUND;
583 }
584
585 result
586 AppWidgetManagerService::RequestSharedMemoryId(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int width, int height, int& shmId)
587 {
588         _AppWidgetContext* pAppWidgetContext = this->Find(appId, instanceId);
589         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
590
591         shmId = pAppWidgetContext->GetSharedMemId(width, height);
592         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , shmId != -1, "[E_SYSTEM] failed to GetSharedMemId for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
593
594     return E_SUCCESS;
595 }
596
597 result
598 AppWidgetManagerService::RequestSharedMemoryIdForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int width, int height, int& shmId)
599 {
600         _AppWidgetContext* pAppWidgetContext = this->Find(appId, instanceId);
601         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
602
603         _AppWidgetPopupContext* pPd = pAppWidgetContext->GetAppWidgetPopup();
604         SysSecureTryReturnResult(NID_SHELL, pPd , E_SYSTEM, "[E_SYSTEM] pPd is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
605
606         if(pPd->HasValidClientId() == false)
607         {
608                 String fullAppId = __pIpcServer->GetClientApplicationId();
609                 pPd->SetIpcClientId(__pIpcServer->GetClientId());
610         }
611
612         shmId = pPd->GetSharedMemId(width, height);
613         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , shmId != -1, "[E_SYSTEM] failed to GetSharedMemId for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
614
615     return E_SUCCESS;
616 }
617
618 result
619 AppWidgetManagerService::RequestSyncSharedMemory(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int width, int height)
620 {
621         _AppWidgetContext* pAppWidgetContext = this->Find(appId, instanceId);
622         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
623
624         return pAppWidgetContext->RequestUpdateRemote(width, height);
625 }
626
627 result
628 AppWidgetManagerService::RequestSyncSharedMemoryForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId)
629 {
630         _AppWidgetContext* pAppWidgetContext = this->Find(appId, instanceId);
631         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
632         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext->GetAppWidgetPopup(), E_SYSTEM, "[E_SYSTEM] GetAppWidgetPopup() returns null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
633
634         return pAppWidgetContext->GetAppWidgetPopup()->RequestUpdateRemote();
635 }
636
637 result
638 AppWidgetManagerService::RequestReleaseSharedMemory(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId)
639 {
640         return E_SUCCESS;
641 }
642
643 result
644 AppWidgetManagerService::RequestReleaseSharedMemoryForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId)
645 {
646         return E_SUCCESS;
647 }
648
649 result
650 AppWidgetManagerService::SendResult(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, bool isSucceeded)
651 {
652         if (!isSucceeded)
653         {
654                 _AppWidgetContext* pAppWidgetContext = this->Find(appId, instanceId);
655                 SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext, E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
656
657                 std::unique_ptr<char[]> packageName(_StringConverter::CopyToCharArrayN(pAppWidgetContext->GetProviderId()));
658                 std::unique_ptr<char[]> id(_StringConverter::CopyToCharArrayN(pAppWidgetContext->GetInstanceId()));
659
660                 int ret = provider_send_deleted(packageName.get(), id.get());
661                 SysTryReturnResult(NID_SHELL, ret >= 0 , E_SYSTEM, "Failed to execute provider_send_deleted.");
662
663                 result r = pAppWidgetContext->OnRemoved();
664                 SysTryReturn(NID_SHELL, !IsFailed(r), 0, E_SYSTEM, "[E_SYSTEM] Failed to execute OnRemoved.");
665
666                 r = RemoveAppWidget(packageName.get(), id.get(), true);
667                 SysTryReturn(NID_SHELL, !IsFailed(r), 0, E_SYSTEM, "[E_SYSTEM] Failed to execute RemoveAppWidget.");
668         }
669
670         return E_SUCCESS;
671 }
672
673 AppWidgetManagerService::_TaskHandlerThread::~_TaskHandlerThread(void)
674 {
675
676 }
677
678 void
679 AppWidgetManagerService::_TaskHandlerThread::OnUserEventReceivedN(RequestId reqId, IList* pArgs)
680 {
681         SysTryReturnVoidResult(NID_SHELL, pArgs != null, E_INVALID_STATE, "pArgs is null!.");
682
683         SysLog(NID_SHELL, "Enter.");
684
685         switch (reqId)
686         {
687         case LOCAL_EVENT_REQUEST_UPDATE:
688         {
689                 _AppWidgetContext* pAppWidgetContext = dynamic_cast<_AppWidgetContext*>( pArgs->GetAt(0) );
690                 SysTryReturnVoidResult(NID_SHELL, pAppWidgetContext != null, E_INVALID_STATE, "_AppWidget is null!.");
691
692                 String* pArgument = dynamic_cast<String*>( pArgs->GetAt(1) );
693                 SysTryReturnVoidResult(NID_SHELL, pArgument != null, E_INVALID_STATE, "pArgument is null!.");
694
695                 pAppWidgetContext->OnUpdate(*pArgument);
696
697                 delete pArgument;
698                 pArgs->RemoveAll();
699                 delete pArgs;
700         }
701                 break;
702
703         default:
704                 SysAssertf(false, "Never get here!");
705                 break;
706         }
707
708         SysLog(NID_SHELL, "Exit.");
709 }
710
711 }}}     // Tizen::Shell::App