b35982e0b7319084118f7e9fe07afddfe564a1d5
[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                 SysSecureLog(NID_SHELL, "%ls, %ls, %ls", pContext->GetInstanceId().GetPointer(), pContext->GetProviderId().GetPointer(), appId.GetPointer());
240
241                 if (pContext->GetAppId() == appId)
242                 {
243                         SysLog(NID_SHELL, "client(%d) is unregistered.", clientId);
244                         pContext->OnDisconnected();
245                 }
246         }
247 }
248
249 void
250 AppWidgetManagerService::OnSettingChanged(Tizen::Base::String& key)
251 {
252 //      const static wchar_t KEY_SETTING_FONT_SIZE[] = L"http://tizen.org/setting/font.size";
253         const static wchar_t KEY_SETTING_FONT_TYPE[] = L"http://tizen.org/setting/font.type";
254         const static wchar_t KEY_SETTING_LANGUAGE[] = L"http://tizen.org/setting/locale.language";
255         const static wchar_t KEY_SETTING_COUNTRY[] = L"http://tizen.org/setting/locale.country";
256
257         if( key == KEY_SETTING_FONT_TYPE
258 //              || key == KEY_SETTING_FONT_SIZE
259                 || key == KEY_SETTING_LANGUAGE
260                 || key == KEY_SETTING_COUNTRY )
261         {
262                 SysLog(NID_SHELL, "'%ls' is changed.", key.GetPointer() );
263                 RequestUpdate("", "", "");
264         }
265 }
266
267 _AppWidgetContext*
268 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)
269 {
270         AppId appId;
271         String providerName;
272         _AppWidgetManagerImpl::ExtractAppIdAndProviderName(providerId, appId, providerName);
273
274         _AppContext* pAppContext = null;
275         bool containsKey = false;
276         __appContextList.ContainsKey(appId, containsKey);
277         if( containsKey == false)
278         {
279                 pAppContext = new(std::nothrow) _AppContext;
280                 __appContextList.Add(appId, pAppContext);
281         }
282         else
283         {
284                 __appContextList.GetValue(appId, pAppContext);
285         }
286
287         _AppWidgetContext* pAppWidgetContext = new (std::nothrow)_AppWidgetContext(pAppContext, userInfo, providerId, instanceId, width, height, period, priority);
288         SysTryReturn(NID_SHELL, pAppWidgetContext, 0, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
289
290         __appWidgetContextList.Add(pAppWidgetContext->GetInstanceId(), pAppWidgetContext);
291         pAppWidgetContext->OnAdded();
292
293         SysSecureLog(NID_SHELL, "%ls, %ls, count(%d)", pAppWidgetContext->GetProviderId().GetPointer(), pAppWidgetContext->GetInstanceId().GetPointer(), __appWidgetContextList.GetCount());
294         return pAppWidgetContext;
295 }
296
297 result
298 AppWidgetManagerService::RemoveAppWidget(const char* pProviderId, const char* pId)
299 {
300         SysTryReturn(NID_SHELL, ( pProviderId != null && pId != null), null, E_INVALID_ARG, "[E_INVALID_ARG]");
301
302         _AppWidgetContext* pAppWidgetContext = Find(pId);
303         SysTryReturn(NID_SHELL, pAppWidgetContext, null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND]");
304
305         result r = __appWidgetContextList.Remove(pAppWidgetContext->GetInstanceId());
306
307         delete pAppWidgetContext;
308
309     SysLog(NID_SHELL, "AppWidget(%s, %s) is removed. remain count(%d)", pProviderId, pId, __appWidgetContextList.GetCount());
310         return r;
311 }
312
313 ///////////////////////////////////////////////////////
314 // CoreDaemonEventReceiver implementation
315 ///////////////////////////////////////////////////////
316 int
317 AppWidgetManagerService::OnAppWidgetCreate(struct event_arg *arg, int *width, int *height, double *priority, void* data)
318 {
319         SysTryReturn(NID_SHELL, arg != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
320         SysTryReturn(NID_SHELL, arg->pkgname != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
321         SysTryReturn(NID_SHELL, arg->id != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
322         SysTryReturn(NID_SHELL, arg->type == event_arg::EVENT_NEW, -EPERM, E_SUCCESS, "invalid argument from master");
323
324         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);
325         AppWidgetManagerService* pAppWidgetService = AppWidgetManagerService::GetInstance();
326         SysTryReturn (NID_SHELL, pAppWidgetService->Find(arg->id) == null, -EBUSY, E_SUCCESS,"already exist");
327
328         const double default_priority = 1.0f;
329         _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);
330
331         *priority = pAppWidgetContext->GetPriority();
332         *height= pAppWidgetContext->GetHeight();
333         *width = pAppWidgetContext->GetWidth();
334
335     return 0;
336 }
337
338 int
339 AppWidgetManagerService::OnAppWidgetUpdate(struct event_arg *arg, void* data)
340 {
341         bool isInstanceIdSpecified = (arg->id == null || strlen(arg->id) < 1) ? false : true;
342         if (isInstanceIdSpecified == false)
343         {
344                 AppWidgetManagerService::GetInstance()->UpdateAppWidgetsByProviderId(arg->pkgname);
345         }
346         else
347         {
348                 _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->id);
349                 SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id);
350
351                 pAppWidgetContext->OnUpdate(L"");
352         }
353
354         return 0;
355 }
356
357 int
358 AppWidgetManagerService::UpdateAppWidgetsByProviderId(const String& providerId)
359 {
360         SysLog(NID_SHELL, "");
361
362         unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
363         SysTryReturn(NID_SHELL, pAppWidgetContextEnum, 0, E_SYSTEM, "[E_SYSTEM]");
364
365         while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
366         {
367                 _AppWidgetContext* pContext = null;
368                 pAppWidgetContextEnum->GetValue(pContext);
369
370                 if (pContext->GetProviderId() == providerId)
371                 {
372                         pContext->OnUpdate(L"");
373                 }
374         }
375
376         return 0;
377 }
378
379 int
380 AppWidgetManagerService::OnAppWidgetDestroy(struct event_arg *arg, void* data)
381 {
382         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_DELETE, -EPERM, E_SUCCESS, "invalid argument from master");
383         SysLog(NID_SHELL, "Enter");
384
385         AppWidgetManagerService* pAppWidgetManagerService = AppWidgetManagerService::GetInstance();
386
387         _AppWidgetContext* pAppWidgetContext = pAppWidgetManagerService->Find(arg->id);
388         SysSecureTryReturn(NID_SHELL, pAppWidgetContext, 0, E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id);
389
390     result r = pAppWidgetContext->OnRemoved();
391     SysTryReturn(NID_SHELL, !IsFailed(r), 0, E_SYSTEM, "[E_SYSTEM] Failed to execute OnRemoved.");
392
393     r = pAppWidgetManagerService->RemoveAppWidget(arg->pkgname, arg->id);
394     SysTryReturn(NID_SHELL, !IsFailed(r), 0, E_SYSTEM, "[E_SYSTEM] Failed to execute RemoveAppWidget.");
395
396     SysLog(NID_SHELL, "Exit");
397     return 0;
398 }
399
400 int
401 AppWidgetManagerService::OnAppWidgetPopupCreate(struct event_arg *arg, void* data)
402 {
403         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_PD_CREATE, -EPERM, E_SUCCESS, "invalid argument from master");
404         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);
405
406         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->id);
407         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id);
408
409         pAppWidgetContext->OnPopupCreated(arg->info.pd_create.x, arg->info.pd_create.y, arg->info.pd_create.w, arg->info.pd_create.h);
410
411     return 0;
412 }
413
414  int
415  AppWidgetManagerService::OnAppWidgetPopupDestroy(struct event_arg *arg, void* data)
416 {
417         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_PD_DESTROY, -EPERM, E_SUCCESS, "invalid argument from master");
418         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->id);
419         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id);
420
421         SysSecureLog(NID_SHELL, "providerId(%s), id(%s)", arg->pkgname, arg->id);
422         pAppWidgetContext->OnPopupDestoyed();
423
424     return 0;
425 }
426
427 int
428 AppWidgetManagerService::OnAppWidgetPause(struct event_arg *arg, void* data)
429 {
430          SysTryReturn(NID_SHELL, arg, 0, E_SUCCESS, "arg is null!");
431
432          _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->id);
433          SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , 0, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id);
434
435          SysSecureLog(NID_SHELL, "providerId(%s), id(%s)", arg->pkgname, arg->id);
436          pAppWidgetContext->OnBackground();
437
438     return 0;
439 }
440
441 int
442 AppWidgetManagerService::OnAppWidgetPauseAll(struct event_arg *arg, void* data)
443 {
444         unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum((AppWidgetManagerService::GetInstance()->__appWidgetContextList).GetMapEnumeratorN());
445         SysTryReturn(NID_SHELL, pAppWidgetContextEnum, -1, E_SYSTEM, "[E_SYSTEM]");
446
447         while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
448         {
449                 _AppWidgetContext* pContext = null;
450                 pAppWidgetContextEnum->GetValue(pContext);
451
452                 pContext->OnBackground();
453         }
454
455         return 0;
456 }
457
458 int
459 AppWidgetManagerService::OnAppWidgetResume(struct event_arg *pArg, void* pData)
460 {
461         SysTryReturn(NID_SHELL, pArg || pArg->id || pArg->pkgname, 0, E_SUCCESS, "pArg is null!");
462
463         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(pArg->id);
464         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", pArg->pkgname, pArg->id);
465
466         SysSecureLog(NID_SHELL, "providerId(%s), id(%s)", pArg->pkgname, pArg->id);
467         pAppWidgetContext->OnForeground();
468         return 0;
469 }
470
471 int
472 AppWidgetManagerService::OnAppWidgetResumeAll(struct event_arg *pArg, void* pData)
473 {
474         unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum((AppWidgetManagerService::GetInstance()->__appWidgetContextList).GetMapEnumeratorN());
475         SysTryReturn(NID_SHELL, pAppWidgetContextEnum, -1, E_SYSTEM, "[E_SYSTEM]");
476
477         while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
478         {
479                 _AppWidgetContext* pContext = null;
480                 pAppWidgetContextEnum->GetValue(pContext);
481
482                 pContext->OnForeground();
483         }
484
485         return 0;
486 }
487
488 int
489 AppWidgetManagerService::OnAppWidgetClick(struct event_arg *arg, void* data)
490 {
491         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_CLICKED, -EPERM, E_SUCCESS, "invalid argument from master");
492         SysTryReturn(NID_SHELL, arg != null, -EPERM, E_SUCCESS, "arg is null!");
493         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);
494
495     return 0;
496 }
497
498 int
499 AppWidgetManagerService::OnAppWidgetResize(struct event_arg *arg, void* data)
500 {
501         SysTryReturn(NID_SHELL, arg || arg->id || arg->pkgname, 0, E_SUCCESS, "arg is null!");
502         SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_RESIZE, -EPERM, E_SUCCESS, "invalid argument from master");
503
504         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);
505
506         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->id);
507         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id);
508
509         pAppWidgetContext->OnResize(arg->info.resize.w, arg->info.resize.h);
510
511     return 0;
512 }
513
514 int
515 AppWidgetManagerService::OnAppWidgetPeriodChanged(struct event_arg *arg, void* data)
516 {
517         SysTryReturn(NID_SHELL, arg != null, 0, E_SUCCESS, "arg is null!");
518         SysSecureLog(NID_SHELL, "providerId(%s), id(%s), width(%d), height(%d), priority(%d)", arg->pkgname, arg->id);
519     return 0;
520 }
521
522 int
523 AppWidgetManagerService::OnAppWidgetRecreate(struct event_arg *arg, void* data)
524 {
525         SysTryReturn(NID_SHELL, arg != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
526         SysTryReturn(NID_SHELL, arg->pkgname != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
527         SysTryReturn(NID_SHELL, arg->id != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
528
529         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);
530
531         AppWidgetManagerService* pAppWidgetManagerService = AppWidgetManagerService::GetInstance();
532         SysTryReturn(NID_SHELL, pAppWidgetManagerService != null, -EBUSY, E_SYSTEM, "Failed to get the instance for AppWidgetManagerService.");
533
534         const double default_priority = 1.0f;
535         _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);
536         SysTryReturn(NID_SHELL, pAppWidgetContext != null, -EBUSY, E_SYSTEM, "Failed to add the appwidget.");
537
538         return 0;
539 }
540
541 result
542 AppWidgetManagerService::InitializeCoreDaemonEventReceiver(const char *pCoreDaemonId)
543 {
544         SysTryReturnResult(NID_SHELL, pCoreDaemonId != null, E_INVALID_ARG, "pCoreDaemonId should not be null!");
545
546     struct event_handler cbs;
547     memset(&cbs, 0, sizeof(event_handler));
548
549     cbs.connected = AppWidgetConnected,
550     cbs.disconnected = AppWidgetDisconnected,
551     cbs.pause = OnAppWidgetPauseAll,
552     cbs.resume = OnAppWidgetResumeAll,
553     cbs.lb_pause = OnAppWidgetPause,
554     cbs.lb_resume = OnAppWidgetResume,
555     cbs.lb_create = OnAppWidgetCreate,
556     cbs.lb_destroy = OnAppWidgetDestroy,
557     cbs.update_content = OnAppWidgetUpdate,
558     cbs.pd_create = OnAppWidgetPopupCreate,
559     cbs.pd_destroy = OnAppWidgetPopupDestroy,
560     cbs.clicked = OnAppWidgetClick,
561     cbs.resize = OnAppWidgetResize,
562     cbs.set_period = OnAppWidgetPeriodChanged;
563     cbs.lb_recreate = OnAppWidgetRecreate;/* Recover from the fault of slave */
564     //cbs.content_event = OnAppWidgetContentEvent,
565
566     int ret = provider_init(null, pCoreDaemonId, &cbs, this);
567     SysTryReturnResult(NID_SHELL, ret == 0, E_SYSTEM, "provider_init failed.");
568
569     SysLog(NID_SHELL, "provider_init is invoked with (%s)", pCoreDaemonId);
570     return E_SUCCESS;
571 }
572
573 result
574 AppWidgetManagerService::DeinitializeCoreDaemonEventReceiver(void)
575 {
576     provider_fini();
577     return E_SUCCESS;
578 }
579
580 ///////////////////////////////////////////////////////
581 // stub implementation
582 ///////////////////////////////////////////////////////
583
584
585 result
586 AppWidgetManagerService::RequestUpdate(const Tizen::App::AppId& appId, const Tizen::Base::String& providerName, const Tizen::Base::String& argument)
587 {
588         bool found = false;
589         bool updateAllSuspended = appId.IsEmpty();
590
591         unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum((AppWidgetManagerService::GetInstance()->__appWidgetContextList).GetMapEnumeratorN());
592         SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "");
593
594         while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
595         {
596                 _AppWidgetContext* pContext = null;
597                 pAppWidgetContextEnum->GetValue(pContext);
598
599                 if ( (updateAllSuspended == true && AppManager::GetInstance()->IsRunning(appId) == false )
600                         || ( pContext->GetAppId() == appId && pContext->GetProviderName() == providerName ) )
601                 {
602                         RequestUpdate(pContext, argument);
603                         found = true;
604                 }
605         }
606
607         SysLog(NID_SHELL, "Exit.");
608         return (found) ? E_SUCCESS : E_OBJ_NOT_FOUND;
609 }
610
611 // for resuming
612 result
613 AppWidgetManagerService::RequestUpdate(_AppWidgetContext* pAppWidgetContext, const String& argument)
614 {
615         if (pAppWidgetContext == null)
616         {
617                 SysLog(NID_SHELL, "pAppWidgetContext is null.");
618         }
619
620         ArrayList* pArray = new (std::nothrow) ArrayList();
621         SysTryReturnResult(NID_SHELL, pArray, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
622
623         pArray->Construct();
624         pArray->Add(pAppWidgetContext);
625         pArray->Add(new String(argument));
626
627         result r = __handlerThread.SendUserEvent(LOCAL_EVENT_REQUEST_UPDATE, pArray);
628         SysTryLog(NID_SHELL, !IsFailed(r), "[%s] Propagated.", GetErrorMessage(r));
629         SysLog(NID_SHELL, "UserEvent(%d) is sent for '%ls.%ls'.", LOCAL_EVENT_REQUEST_UPDATE, pAppWidgetContext->GetAppId().GetPointer(), pAppWidgetContext->GetProviderName().GetPointer() );
630
631         return E_SUCCESS;
632 }
633
634 result
635 AppWidgetManagerService::RequestUpdateInstance(const Tizen::Base::String& instanceId, const Tizen::Base::String& argument)
636 {
637         SysSecureLog(NID_SHELL, "%ls, %ls", instanceId.GetPointer(), argument.GetPointer() );
638
639         _AppWidgetContext* pAppWidgetContext = Find(instanceId);
640         SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find the object(%ls).", instanceId.GetPointer());
641
642         RequestUpdate(pAppWidgetContext, argument);
643         return E_SUCCESS;
644 }
645
646 result
647 AppWidgetManagerService::AcquireRemoteBuffer(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int width, int height, int& bufferId)
648 {
649         _AppWidgetContext* pAppWidgetContext = this->Find(instanceId);
650         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
651
652         bufferId = pAppWidgetContext->AcquireRemoteBuffer(width, height);
653         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , bufferId != -1, "[E_SYSTEM] failed to AcquireRemoteBuffer for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
654
655     return E_SUCCESS;
656 }
657
658 result
659 AppWidgetManagerService::AcquireRemoteBufferForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int width, int height, int& bufferId)
660 {
661         _AppWidgetContext* pAppWidgetContext = this->Find(instanceId);
662         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
663
664         _AppWidgetPopupContext* pPopupContext = pAppWidgetContext->GetAppWidgetPopup();
665         SysSecureTryReturnResult(NID_SHELL, pPopupContext , E_SYSTEM, "[E_SYSTEM] pPd is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
666
667         bufferId = pPopupContext->AcquireRemoteBuffer(width, height);
668         SysSecureTryReturnResult(NID_SHELL, bufferId != -1, E_SYSTEM, "Failed to AcquireRemoteBuffer for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
669
670     return E_SUCCESS;
671 }
672
673 result
674 AppWidgetManagerService::SyncRemoteBuffer(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int width, int height)
675 {
676         _AppWidgetContext* pAppWidgetContext = this->Find(instanceId);
677         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
678
679         return pAppWidgetContext->SyncRemoteBuffer(width, height);
680 }
681
682 result
683 AppWidgetManagerService::SyncRemoteBufferForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId)
684 {
685         _AppWidgetContext* pAppWidgetContext = this->Find(instanceId);
686         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
687         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext->GetAppWidgetPopup(), E_SYSTEM, "[E_SYSTEM] GetAppWidgetPopup() returns null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
688
689         return pAppWidgetContext->GetAppWidgetPopup()->SyncRemoteBuffer();
690 }
691
692 result
693 AppWidgetManagerService::ReleaseRemoteBuffer(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId)
694 {
695         return E_SUCCESS;
696 }
697
698 result
699 AppWidgetManagerService::ReleaseRemoteBufferForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId)
700 {
701         return E_SUCCESS;
702 }
703
704 result
705 AppWidgetManagerService::RequestProviderCount(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int& providerCount)
706 {
707         SysLog(NID_SHELL, "ENTER");
708
709         _AppWidgetContext* pAppWidgetContext = this->Find(instanceId);
710         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext, E_SYSTEM, "pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
711
712         providerCount = GetProviderCount(pAppWidgetContext->GetAppId());
713
714         std::unique_ptr<char[]> providerId(_StringConverter::CopyToCharArrayN(pAppWidgetContext->GetProviderId()));
715         std::unique_ptr<char[]> id(_StringConverter::CopyToCharArrayN(pAppWidgetContext->GetInstanceId()));
716
717         int ret = provider_send_deleted(providerId.get(), id.get());
718         SysTryReturnResult(NID_SHELL, ret >= 0 , E_SYSTEM, "Failed to execute provider_send_deleted.");
719
720         //result r = pAppWidgetContext->OnRemoved();
721         //SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute OnRemoved.");
722
723         result r = RemoveAppWidget(providerId.get(), id.get());
724         SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute RemoveAppWidget.");
725
726         providerCount--;
727
728         RequestPendingEvent();
729
730         return E_SUCCESS;
731 }
732
733 result
734 AppWidgetManagerService::SendResult(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, bool isSucceeded)
735 {
736         _AppWidgetContext* pAppWidgetContext = null;
737
738         if (!isSucceeded)
739         {
740                 SysLog(NID_SHELL, "SendResult is called[false].");
741
742                 if (instanceId == INVALID_INSTANCE)
743                 {
744                         unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum((AppWidgetManagerService::GetInstance()->__appWidgetContextList).GetMapEnumeratorN());
745                         SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "");
746
747                         while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
748                         {
749                                 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
750                                 SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext, E_SYSTEM, "pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
751
752                                 if (pAppWidgetContext->GetAppContext()->GetConnectionState() == CONNECTION_STATE_NONE)
753                                 {
754                                         break;
755                                 }
756                         }
757                 }
758                 else
759                 {
760                         pAppWidgetContext = this->Find(instanceId);
761                 }
762
763                 SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext, E_SYSTEM, "pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
764
765                 std::unique_ptr<char[]> providerId(_StringConverter::CopyToCharArrayN(pAppWidgetContext->GetProviderId()));
766                 std::unique_ptr<char[]> id(_StringConverter::CopyToCharArrayN(pAppWidgetContext->GetInstanceId()));
767
768                 int ret = provider_send_deleted(providerId.get(), id.get());
769                 SysTryReturnResult(NID_SHELL, ret >= 0 , E_SYSTEM, "Failed to execute provider_send_deleted.");
770
771                 //result r = pAppWidgetContext->OnRemoved();
772                 //SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute OnRemoved.");
773
774                 result r = RemoveAppWidget(providerId.get(), id.get());
775                 SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute RemoveAppWidget.");
776         }
777         else    // for pending event excluding touch event.
778         {
779                 SysLog(NID_SHELL, "SendResult is called[true].");
780         }
781
782         RequestPendingEvent();
783
784         return E_SUCCESS;
785 }
786
787 result
788 AppWidgetManagerService::SendAccessStatus(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int accessStatus)
789 {
790         _AppWidgetContext* pAppWidgetContext = this->Find(instanceId);
791         SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
792
793         return pAppWidgetContext->SendAccessStatus(accessStatus);
794 }
795
796 result
797 AppWidgetManagerService::RequestPendingEvent(void)
798 {
799         unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum((AppWidgetManagerService::GetInstance()->__appWidgetContextList).GetMapEnumeratorN());
800         SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "");
801
802         result r = E_SUCCESS;
803
804         while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
805         {
806                 _AppWidgetContext* pContext = null;
807                 pAppWidgetContextEnum->GetValue(pContext);
808
809                 r = pContext->SendPendingEvent();
810                 if (r == E_SUCCESS)
811                 {
812                         SysLog(NID_SHELL, "Found pending event.");
813                         break;
814                 }
815         }
816
817         return E_SUCCESS;
818 }
819
820 AppWidgetManagerService::_TaskHandlerThread::~_TaskHandlerThread(void)
821 {
822
823 }
824
825 void
826 AppWidgetManagerService::_TaskHandlerThread::OnUserEventReceivedN(RequestId reqId, IList* pArgs)
827 {
828         SysTryReturnVoidResult(NID_SHELL, pArgs != null, E_INVALID_STATE, "pArgs is null!.");
829
830         SysLog(NID_SHELL, "Enter.");
831
832         switch (reqId)
833         {
834         case LOCAL_EVENT_REQUEST_UPDATE:
835         {
836                 _AppWidgetContext* pAppWidgetContext = dynamic_cast<_AppWidgetContext*>( pArgs->GetAt(0) );
837                 SysTryReturnVoidResult(NID_SHELL, pAppWidgetContext != null, E_INVALID_STATE, "_AppWidget is null!.");
838
839                 String* pArgument = dynamic_cast<String*>( pArgs->GetAt(1) );
840                 SysTryReturnVoidResult(NID_SHELL, pArgument != null, E_INVALID_STATE, "pArgument is null!.");
841
842                 pAppWidgetContext->OnUpdate(*pArgument);
843
844                 delete pArgument;
845                 pArgs->RemoveAll();
846                 delete pArgs;
847         }
848                 break;
849
850         default:
851                 SysAssertf(false, "Never get here!");
852                 break;
853         }
854
855         SysLog(NID_SHELL, "Exit.");
856 }
857
858 }}}     // Tizen::Shell::App