minor change
[framework/osp/appwidget-service.git] / src / FShell_AppWidgetManagerService.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17
18 /**
19  * @file        FShell_AppWidgetManagerService.cpp
20  * @brief       This is the implementation for the AppWidgetManagerService class.
21  */
22
23 #include <stdlib.h>
24 #include <unistd.h>
25 #include <unique_ptr.h>
26 #include <provider.h>
27 #include <aul.h>
28
29 #include <FBase.h>
30 #include <FBaseSysLog.h>
31 #include <FApp.h>
32 #include <FApp_AppManagerImpl.h>
33 #include <FIo_IpcServer.h>
34 #include <FBase_StringConverter.h>
35
36 #include "FShell_AppWidgetContext.h"
37 #include "FShell_AppWidgetPopupContext.h"
38 #include "FShell_AppWidgetManagerStub.h"
39
40 #include "FShell_AppWidgetManagerService.h"
41
42 namespace Tizen { namespace Shell  { namespace App {
43
44 using namespace Tizen::App;
45 using namespace Tizen::Base;
46 using namespace Tizen::Base::Collection;
47 using namespace Tizen::Base::Runtime;
48 using namespace Tizen::Io;
49 using namespace Tizen::System;
50 using namespace Tizen::Shell::App;
51
52
53 namespace
54 {
55 static const RequestId  LOCAL_EVENT_REQUEST_UPDATE = 0;
56 }
57
58 AppWidgetManagerService::AppWidgetManagerService()
59 {
60 }
61
62 AppWidgetManagerService::~AppWidgetManagerService()
63 {
64         __pingTimer.Cancel();
65         DeinitializeMasterDaemonEventReceiver();
66 }
67
68 AppWidgetManagerService*
69 AppWidgetManagerService::GetInstance(void)
70 {
71         static AppWidgetManagerService* pSelf = null;
72         if( pSelf == null)
73         {
74                 pSelf = new AppWidgetManagerService();
75                 SysTryReturn(NID_APP, pSelf != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
76
77                 result r = pSelf->Construct();
78                 SysAssertf(!IsFailed(r), "Failed to construct AppWidgetManagerService");
79                 SysLog(NID_APP, "AppWidgetManagerService is created.");
80         }
81         return pSelf;
82 }
83
84 result
85 AppWidgetManagerService::Construct()
86 {
87 //      _AppManagerImpl::GetInstance()->AddEventListener(*this);
88
89         _AppWidgetManagerStub::StartIpcServer();
90
91         result r = __handlerThread.Construct(THREAD_TYPE_EVENT_DRIVEN);
92         SysTryReturn(NID_APP, IsFailed(r) == false, false, r, "[%s] Event thread creation failure.", GetErrorMessage(r));
93
94         r = __handlerThread.Start();
95         SysTryReturn(NID_APP, IsFailed(r) == false, false, r, "[%s] Event thread Start failure.", GetErrorMessage(r));
96
97         return InitializeMasterDaemonEventReceiver("osp-livebox-service");
98 }
99
100 int
101 AppWidgetManagerService::AppWidgetConnected(struct event_arg *arg, void* data)
102 {
103     int ret;
104     ret = provider_send_hello();
105     if (ret == 0)
106     {
107         SysLog(NID_APP, "success to be connected with master daemon");
108         AppWidgetManagerService::GetInstance()->StartPingTimer();
109
110     }
111     else
112     {
113         SysLog(NID_APP, "failed to provider_send_hello()");
114     }
115     return ret;
116 }
117
118 int
119 AppWidgetManagerService::AppWidgetDisconnected(struct event_arg *arg, void* data)
120 {
121         SysLog(NID_APP, "success to be disconnected with master daemon");
122 //      aul_terminate_pid(getpid());
123     return 0;
124 }
125
126 void
127 AppWidgetManagerService::StartPingTimer()
128 {
129         __pingTimer.Construct(*this);//, true);
130         __pingTimer.StartAsRepeatable(120000);
131 }
132
133 void
134 AppWidgetManagerService::OnTimerExpired(Timer& timer)
135 {
136         SysLog(NID_APP, "provider_send_ping");
137         provider_send_ping();
138 }
139
140 _AppWidgetContext*
141 AppWidgetManagerService::Find(const String& appId, const String& instanceId) const
142 {
143         for( int i = 0; i < __appWidgetContextList.GetCount(); i++ )
144         {
145                 _AppWidgetContext* pAppWidgetContext = null;
146                 __appWidgetContextList.GetAt(i, pAppWidgetContext);
147 //              SysLog(NID_APP, "%ls", pAppWidgetContext->__instanceId.GetPointer());
148
149                 if ( pAppWidgetContext->__instanceId == instanceId )
150                 {
151 //                      SysAssert(pAppWidgetContext->__appId == appId)
152                         return pAppWidgetContext;
153                 }
154         }
155         return null;
156 }
157
158 result
159 AppWidgetManagerService::SetClientIds(const Tizen::App::AppId& appId, int clientId)
160 {
161         for( int i = 0; i < __appWidgetContextList.GetCount(); i++ )
162         {
163                 _AppWidgetContext* pAppWidgetContext = null;
164                 __appWidgetContextList.GetAt(i, pAppWidgetContext);
165                 SysLog(NID_APP, "%ls", pAppWidgetContext->__instanceId.GetPointer());
166                 SysLog(NID_APP, "%ls, %ls", pAppWidgetContext->__providerId.GetPointer(), appId.GetPointer());
167
168                 if ( pAppWidgetContext->__appId == appId )
169                 {
170                         pAppWidgetContext->SetClientId(clientId);
171                         SysLog(NID_APP, "client is registered.(%d)", clientId);
172                         if( clientId == -1)
173                         {
174                                 pAppWidgetContext->ReleaseSharedMem();
175                                 if(pAppWidgetContext->GetAppWidgetPopup())
176                                 {
177                                         pAppWidgetContext->OnPopupDestoyed();
178                                 }
179                         }
180                 }
181         }
182         return E_SUCCESS;
183 }
184
185 void
186 AppWidgetManagerService::OnIpcClientConnected(const _IpcServer& server, int clientId)
187 {
188         //SysLog(NID_APP, "(clientId:%d)\n", clientId);
189         String fullAppId = server.GetClientAppId() + "." + server.GetClientAppExecutableName();
190         SysLog(NID_APP, "(%ls)\n", fullAppId.GetPointer());
191 //      this->SetClientIds(fullAppId, clientId);//Todo
192
193 }
194
195 void
196 AppWidgetManagerService::OnIpcClientDisconnected(const _IpcServer& server, int clientId)
197 {
198         String fullAppId = server.GetClientAppId() + "." + server.GetClientAppExecutableName();
199         SysLog(NID_APP, "(%ls)\n", fullAppId.GetPointer());
200         this->SetClientIds(fullAppId, -1);
201 }
202
203 result
204 AppWidgetManagerService::AddAppWidget(_AppWidgetContext* pAppWidgetContext)
205 {
206         SysLog(NID_APP, "%ls, %ls, count(%d)", pAppWidgetContext->__providerId.GetPointer(), pAppWidgetContext->__instanceId.GetPointer(), __appWidgetContextList.GetCount());
207
208         return __appWidgetContextList.Add(pAppWidgetContext);
209 }
210
211 result
212 AppWidgetManagerService::RemoveAppWidget(const char* pPackageName, const char* pId, bool free)
213 {
214         SysLog(NID_APP, "%s, %s, count(%d)", pPackageName, pId, __appWidgetContextList.GetCount());
215
216         SysTryReturn(NID_APP, ( pPackageName != null && pId != null), null, E_INVALID_ARG, "[E_INVALID_ARG]");
217         SysLog(NID_APP, "%s, %s", pPackageName, pId);
218
219         _AppWidgetContext* pAppWidgetContext = Find(pPackageName, pId);
220         SysTryReturn(NID_APP, pAppWidgetContext, null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND]");
221
222         result r = __appWidgetContextList.Remove(pAppWidgetContext);
223
224         if( __appWidgetContextList.GetCount() == 0 )
225         {
226                 SysLog(NID_APP, "No running native appWidget app remains, terminating osp appWidget service...");
227                 Tizen::App::App::GetInstance()->Terminate();
228         }
229
230         return r;
231 }
232
233
234 ///////////////////////////////////////////////////////
235 // MasterDaemonEventReceiver implementation
236 ///////////////////////////////////////////////////////
237 int
238 AppWidgetManagerService::OnAppWidgetCreate(struct event_arg *arg, int *width, int *height, double *priority, void* data)
239 {
240         SysTryReturn(NID_APP, arg != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
241         SysTryReturn(NID_APP, arg->pkgname != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
242         SysTryReturn(NID_APP, arg->id != null, EINVAL, E_INVALID_ARG, "[E_INVALID_ARG]");
243         SysTryReturn(NID_APP, arg->type == event_arg::EVENT_NEW, -EPERM, E_SUCCESS, "invalid argument from master");
244
245         SysLog(NID_APP, "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);
246         SysTryReturn (NID_APP, AppWidgetManagerService::GetInstance()->Find(arg->pkgname, arg->id) == null, -EBUSY, E_SUCCESS,"already exist");
247
248         double default_priority = 1.0f;
249         _AppWidgetContext* pAppWidgetContext = new (std::nothrow)_AppWidgetContext( arg->info.lb_create.content, arg->pkgname, arg->id,
250                         arg->info.lb_create.width, arg->info.lb_create.height, arg->info.lb_create.period * 1000, default_priority);
251         SysTryReturn(NID_APP, pAppWidgetContext, 0, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
252
253         AppWidgetManagerService* pAppWidgetService = AppWidgetManagerService::GetInstance();
254         pAppWidgetService->AddAppWidget(pAppWidgetContext);
255         pAppWidgetContext->OnAdded();
256
257         *priority = pAppWidgetContext->__priority;
258         *height= pAppWidgetContext->__height;
259         *width = pAppWidgetContext->__width;
260
261         SysLog(NID_APP, "Exit. %d appWidget(es)", pAppWidgetService->__appWidgetContextList.GetCount());
262     return 0;
263 }
264
265 int
266 AppWidgetManagerService::OnAppWidgetUpdate(struct event_arg *arg, void* data)
267 {
268         if( arg->id == null || strlen(arg->id) < 1)
269         {
270                 SysLog(NID_APP, "updating alls");
271                 AppWidgetManagerService::GetInstance()->UpdateAllAppWidgetsByAppId(arg->pkgname);
272         }
273         else
274         {
275                 _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->pkgname, arg->id);
276                 SysTryReturnResult(NID_APP, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for appId(%s), instanceId(%s)", arg->pkgname, arg->id);
277
278                 pAppWidgetContext->OnUpdate(L"");
279         }
280
281         return 0;
282 }
283
284 int
285 AppWidgetManagerService::UpdateAllAppWidgetsByAppId(const String& providerId)
286 {
287         for( int i = 0; i < __appWidgetContextList.GetCount(); i++ )
288         {
289                 _AppWidgetContext* pAppWidgetContext = null;
290                 __appWidgetContextList.GetAt(i, pAppWidgetContext);
291
292                 if ( pAppWidgetContext->__providerId == providerId )
293                 {
294                         pAppWidgetContext->OnUpdate(L"");
295                 }
296         }
297         return E_SUCCESS;
298 }
299
300 int
301 AppWidgetManagerService::OnAppWidgetDestroy(struct event_arg *arg, void* data)
302 {
303         SysTryReturn (NID_APP, arg->type == event_arg::EVENT_DELETE, -EPERM, E_SUCCESS, "invalid argument from master");
304         SysLog(NID_APP, "Enter");
305
306         AppWidgetManagerService* pAppWidgetManagerService = AppWidgetManagerService::GetInstance();
307
308         _AppWidgetContext* pAppWidgetContext = pAppWidgetManagerService->Find(arg->pkgname, arg->id);
309         SysTryReturnResult(NID_APP, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for appId(%s), instanceId(%s)", arg->pkgname, arg->id);
310
311     pAppWidgetContext->OnRemoved();
312     pAppWidgetManagerService->RemoveAppWidget( arg->pkgname, arg->id, true);
313     delete pAppWidgetContext;
314
315     SysLog(NID_APP, "Exit");
316     return 0;
317 }
318
319 int
320 AppWidgetManagerService::OnAppWidgetPopupCreate(struct event_arg *arg, void* data)
321 {
322         SysTryReturn (NID_APP, arg->type == event_arg::EVENT_PD_CREATE, -EPERM, E_SUCCESS, "invalid argument from master");
323         SysLog(NID_APP, "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);
324
325         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->pkgname, arg->id);
326         SysTryReturnResult(NID_APP, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for appId(%s), instanceId(%s)", arg->pkgname, arg->id);
327
328         /*if( pAppWidgetContext->GetAppWidgetPopup() )
329         {
330                 pAppWidgetContext->OnPopupDestoyed();
331         }*/
332         pAppWidgetContext->OnPopupCreated(arg->info.pd_create.x, arg->info.pd_create.y, arg->info.pd_create.w, arg->info.pd_create.h);
333
334     return 0;
335 }
336
337  int
338  AppWidgetManagerService::OnAppWidgetPopupDestroy(struct event_arg *arg, void* data)
339 {
340         SysTryReturn (NID_APP, arg->type == event_arg::EVENT_PD_DESTROY, -EPERM, E_SUCCESS, "invalid argument from master");
341         SysLog(NID_APP, "packageName(%s), id(%s)", arg->pkgname, arg->id);
342         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->pkgname, arg->id);
343         SysTryReturnResult(NID_APP, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for appId(%s), instanceId(%s)", arg->pkgname, arg->id);
344
345         pAppWidgetContext->OnPopupDestoyed();
346
347     return 0;
348 }
349
350  int
351  AppWidgetManagerService::OnAppWidgetPause(struct event_arg *arg, void* data)
352 {
353          SysTryReturn(NID_APP, arg, 0, E_SUCCESS, "arg is null!");
354
355          _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->pkgname, arg->id);
356          SysTryReturnResult(NID_APP, pAppWidgetContext , 0, "[E_SYSTEM] pAppWidgetContext is null for appId(%s), instanceId(%s)", arg->pkgname, arg->id);
357
358          SysLog(NID_APP, "packageName(%s), id(%s)", arg->pkgname, arg->id);
359          pAppWidgetContext->OnBackground();
360     return 0;
361 }
362
363 int
364 AppWidgetManagerService::OnAppWidgetResume(struct event_arg *arg, void* data)
365 {
366         SysTryReturn(NID_APP, arg || arg->id || arg->pkgname, 0, E_SUCCESS, "arg is null!");
367
368         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->pkgname, arg->id);
369         SysTryReturnResult(NID_APP, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for appId(%s), instanceId(%s)", arg->pkgname, arg->id);
370
371         SysLog(NID_APP, "packageName(%s), id(%s)", arg->pkgname, arg->id);
372         pAppWidgetContext->OnForeground();
373     return 0;
374 }
375
376 int
377 AppWidgetManagerService::OnAppWidgetClick(struct event_arg *arg, void* data)
378 {
379         SysTryReturn (NID_APP, arg->type == event_arg::EVENT_CLICKED, -EPERM, E_SUCCESS, "invalid argument from master");
380         SysTryReturn(NID_APP, arg != null, -EPERM, E_SUCCESS, "arg is null!");
381         SysLog(NID_APP, "packageName(%s), id(%s), clicked.event(%s), clicked.x(%d), clicked.y(%d)", arg->pkgname, arg->id, arg->info.clicked.event, arg->info.clicked.x, arg->info.clicked.y);
382
383     return 0;
384 }
385
386 int
387 AppWidgetManagerService::OnAppWidgetResize(struct event_arg *arg, void* data)
388 {
389         SysTryReturn(NID_APP, arg || arg->id || arg->pkgname, 0, E_SUCCESS, "arg is null!");
390         SysTryReturn (NID_APP, arg->type == event_arg::EVENT_RESIZE, -EPERM, E_SUCCESS, "invalid argument from master");
391
392         SysLog(NID_APP, "packageName(%s), id(%s), resize.w(%d), resize.h(%d)", arg->pkgname, arg->id, arg->info.resize.w, arg->info.resize.h);
393
394         _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->Find(arg->pkgname, arg->id);
395         SysTryReturnResult(NID_APP, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for appId(%s), instanceId(%s)", arg->pkgname, arg->id);
396
397         pAppWidgetContext->OnResize(arg->info.resize.w, arg->info.resize.h);
398
399     return 0;
400 }
401
402 int
403 AppWidgetManagerService::OnAppWidgetPeriodChaned(struct event_arg *arg, void* data)
404 {
405         SysTryReturn(NID_APP, arg != null, 0, E_SUCCESS, "arg is null!");
406         SysLog(NID_APP, "packageName(%s), id(%s), width(%d), height(%d), priority(%d)", arg->pkgname, arg->id);
407     return 0;
408 }
409
410 result
411 AppWidgetManagerService::InitializeMasterDaemonEventReceiver(const char *pServiceExecutableName)
412 {
413         SysTryReturnResult(NID_APP, pServiceExecutableName != null, E_INVALID_ARG, "");
414         SysLog(NID_APP, "Enter.");
415
416         __appWidgetContextList.Construct();
417
418         /*!
419          * \note
420          * Only for the buffer type
421          */
422     struct event_handler cbs;
423     memset(&cbs, 0, sizeof(event_handler));
424
425     cbs.connected = AppWidgetConnected,
426     cbs.disconnected = AppWidgetDisconnected,
427     cbs.pause = OnAppWidgetPause,
428     cbs.resume = OnAppWidgetResume,
429 //    cbs.lb_pause = OnAppWidgetPause,
430 //    cbs.lb_resume = OnAppWidgetResume,
431     cbs.lb_create = OnAppWidgetCreate,
432     cbs.lb_destroy = OnAppWidgetDestroy,
433     cbs.update_content = OnAppWidgetUpdate,
434     cbs.pd_create = OnAppWidgetPopupCreate,
435     cbs.pd_destroy = OnAppWidgetPopupDestroy,
436     cbs.clicked = OnAppWidgetClick,
437     cbs.resize = OnAppWidgetResize,
438     cbs.set_period = OnAppWidgetPeriodChaned;
439     //cbs.lb_recreate = OnAppWidgetRecreate,/* Recover from the fault of slave */
440     //cbs.content_event = OnAppWidgetContentEvent,
441     //cbs.change_group = OnAppWidgetGroupChanged;
442
443     int ret = provider_init(null, pServiceExecutableName, &cbs, this);
444     SysTryReturnResult(NID_APP, ret == 0, E_SYSTEM, "provider_init failed.");
445
446     SysLog(NID_APP, "Exit.");
447     return E_SUCCESS;
448 }
449
450 result
451 AppWidgetManagerService::DeinitializeMasterDaemonEventReceiver()
452 {
453         SysLog(NID_APP, "Enter.");
454     provider_fini();
455     SysLog(NID_APP, "Exit.");
456     return E_SUCCESS;
457 }
458
459 ///////////////////////////////////////////////////////
460 // stub implmentation
461 ///////////////////////////////////////////////////////
462
463 result
464 AppWidgetManagerService::RequestUpdate(const Tizen::App::AppId& appId, const Tizen::Base::String& providerName, const Tizen::Base::String& argument)
465 {
466         SysLog(NID_APP, "%ls, %ls", appId.GetPointer(), providerName.GetPointer() );
467
468         bool found = false;
469         for( int i = 0; i < __appWidgetContextList.GetCount(); i++ )
470         {
471                 _AppWidgetContext* pAppWidgetContext = null;
472                 __appWidgetContextList.GetAt(i, pAppWidgetContext);
473
474                 if ( pAppWidgetContext->__appId == appId && pAppWidgetContext->__providerName == providerName)
475                 {
476                         SysLog(NID_APP, "OK");
477
478                         ArrayList* pArray = new (std::nothrow) ArrayList();
479                         SysTryReturnResult(NID_APP, pArray, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
480
481                         pArray->Construct();
482                         pArray->Add(pAppWidgetContext);
483                         pArray->Add(new String(argument));
484
485                         result r = __handlerThread.SendUserEvent(LOCAL_EVENT_REQUEST_UPDATE, pArray);
486                         SysTryLog(NID_APP, !IsFailed(r), "[%s] Propagated.", GetErrorMessage(r));
487
488                         found = true;
489                 }
490         }
491         SysLog(NID_APP, "Exit.");
492         return (found) ? E_SUCCESS : E_OBJ_NOT_FOUND;
493
494 }
495
496 result
497 AppWidgetManagerService::RequestUpdateInstance(const Tizen::Base::String& instanceId, const Tizen::Base::String& argument)
498 {
499         SysLog(NID_APP, "%ls, %ls", instanceId.GetPointer(), argument.GetPointer() );
500
501         for( int i = 0; i < __appWidgetContextList.GetCount(); i++ )
502         {
503                 _AppWidgetContext* pAppWidgetContext = null;
504                 __appWidgetContextList.GetAt(i, pAppWidgetContext);
505
506                 if ( pAppWidgetContext->__instanceId == instanceId)
507                 {
508                         SysLog(NID_APP, "OK");
509
510                         ArrayList* pArray = new (std::nothrow) ArrayList();
511                         SysTryReturnResult(NID_APP, pArray, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
512
513                         pArray->Construct();
514                         pArray->Add(pAppWidgetContext);
515                         pArray->Add(new String(argument));
516
517                         result r = __handlerThread.SendUserEvent(LOCAL_EVENT_REQUEST_UPDATE, pArray);
518                         SysTryLog(NID_APP, !IsFailed(r), "[%s] Propagated.", GetErrorMessage(r));
519
520                         return E_SUCCESS;
521                 }
522         }
523         SysLog(NID_APP, "Exit.");
524         return E_OBJ_NOT_FOUND;
525 }
526
527 result
528 AppWidgetManagerService::RequestSharedMemoryId(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int width, int height, int& shmId)
529 {
530         _AppWidgetContext* pAppWidgetContext = this->Find(appId, instanceId);
531         SysTryReturnResult(NID_APP, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
532
533         if(pAppWidgetContext->HasValidClientId() == false)
534         {
535                 String fullAppId = __pIpcServer->GetClientAppId() + "." + __pIpcServer->GetClientAppExecutableName();
536                 this->SetClientIds(fullAppId, __pIpcServer->GetClientId());
537         }
538
539         shmId = pAppWidgetContext->GetSharedMemId(width, height);
540         SysTryReturnResult(NID_APP, pAppWidgetContext , shmId != -1, "[E_SYSTEM] failed to GetSharedMemId for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
541
542     return E_SUCCESS;
543 }
544
545 result
546 AppWidgetManagerService::RequestSharedMemoryIdForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int width, int height, int& shmId)
547 {
548         _AppWidgetContext* pAppWidgetContext = this->Find(appId, instanceId);
549         SysTryReturnResult(NID_APP, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
550
551         _AppWidgetPopupContext* pPd = pAppWidgetContext->GetAppWidgetPopup();
552         SysTryReturnResult(NID_APP, pPd , E_SYSTEM, "[E_SYSTEM] pPd is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
553
554         if(pPd->HasValidClientId() == false)
555         {
556                 String fullAppId = __pIpcServer->GetClientAppId() + "." + __pIpcServer->GetClientAppExecutableName();
557                 pPd->SetClientId(__pIpcServer->GetClientId());
558         }
559
560         shmId = pPd->GetSharedMemId(width, height);
561         SysTryReturnResult(NID_APP, pAppWidgetContext , shmId != -1, "[E_SYSTEM] failed to GetSharedMemId for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
562
563     return E_SUCCESS;
564 }
565
566 result
567 AppWidgetManagerService::RequestSyncSharedMemory(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int width, int height)
568 {
569         _AppWidgetContext* pAppWidgetContext = this->Find(appId, instanceId);
570         SysTryReturnResult(NID_APP, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
571
572         return pAppWidgetContext->RequestUpdateRemote(width, height);
573 }
574
575 result
576 AppWidgetManagerService::RequestSyncSharedMemoryForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId)
577 {
578         _AppWidgetContext* pAppWidgetContext = this->Find(appId, instanceId);
579         SysTryReturnResult(NID_APP, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
580         SysTryReturnResult(NID_APP, pAppWidgetContext->GetAppWidgetPopup(), E_SYSTEM, "[E_SYSTEM] GetAppWidgetPopup() returns null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
581
582         return pAppWidgetContext->GetAppWidgetPopup()->RequestUpdateRemote();
583 }
584
585 result
586 AppWidgetManagerService::RequestReleaseSharedMemory(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId)
587 {
588         std::unique_ptr<char[]> pkgname(_StringConverter::CopyToCharArrayN(appId));
589         std::unique_ptr<char[]> id(_StringConverter::CopyToCharArrayN(instanceId));
590
591         _AppWidgetContext* pAppWidgetContext = this->Find(appId, instanceId);
592         SysTryReturnResult(NID_APP, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
593
594         return pAppWidgetContext->ReleaseSharedMem();
595 }
596
597 result
598 AppWidgetManagerService::RequestReleaseSharedMemoryForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId)
599 {
600         std::unique_ptr<char[]> pkgname(_StringConverter::CopyToCharArrayN(appId));
601         std::unique_ptr<char[]> id(_StringConverter::CopyToCharArrayN(instanceId));
602
603         _AppWidgetContext* pAppWidgetContext = this->Find(appId, instanceId);
604         SysTryReturnResult(NID_APP, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
605         SysTryReturnResult(NID_APP, pAppWidgetContext->GetAppWidgetPopup(), E_SYSTEM, "[E_SYSTEM] GetAppWidgetPopup() returns null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
606
607 //      return pAppWidgetContext->GetAppWidgetPopup()->ReleaseSharedMem();
608         return E_SUCCESS;
609 }
610
611 AppWidgetManagerService::_TaskHandlerThread::~_TaskHandlerThread(void)
612 {
613
614 }
615
616 void
617 AppWidgetManagerService::_TaskHandlerThread::OnUserEventReceivedN(RequestId reqId, IList* pArgs)
618 {
619         SysTryReturnVoidResult(NID_APP, pArgs != null, E_INVALID_STATE, "pArgs is null!.");
620
621         SysLog(NID_APP, "Enter.");
622
623         switch (reqId)
624         {
625         case LOCAL_EVENT_REQUEST_UPDATE:
626         {
627                 _AppWidgetContext* pAppWidgetContext = dynamic_cast<_AppWidgetContext*>( pArgs->GetAt(0) );
628                 SysTryReturnVoidResult(NID_APP, pAppWidgetContext != null, E_INVALID_STATE, "_AppWidget is null!.");
629
630                 String* pArgument = dynamic_cast<String*>( pArgs->GetAt(1) );
631                 SysTryReturnVoidResult(NID_APP, pArgument != null, E_INVALID_STATE, "pArgument is null!.");
632
633                 pAppWidgetContext->OnUpdate(*pArgument);
634
635                 delete pArgument;
636                 pArgs->RemoveAll();
637                 delete pArgs;
638         }
639                 break;
640
641         default:
642                 SysAssertf(false, "never get here!");
643                 break;
644         }
645         SysLog(NID_APP, "Exit.");
646 }
647
648 } } } //namespace Tizen { namespace Shell  { namespace App {