2 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
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
8 // http://floralicense.org/license/
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.
18 * @file FShell_AppWidgetManagerService.cpp
19 * @brief This is the implementation for the AppWidgetManagerService class.
22 #include <unique_ptr.h>
24 #include <FBaseSysLog.h>
25 #include <FBaseColIList.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>
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"
40 namespace Tizen { namespace Shell { namespace App {
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;
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;
61 AppWidgetManagerService* AppWidgetManagerService::__pTheInstance = null;
63 AppWidgetManagerService::AppWidgetManagerService(void)
68 AppWidgetManagerService::~AppWidgetManagerService(void)
70 SysLog(NID_SHELL, "Enter.");
72 DeinitializeCoreDaemonEventReceiver();
73 SysLog(NID_SHELL, "Exit.");
76 AppWidgetManagerService*
77 AppWidgetManagerService::GetInstance(void)
79 if( __pTheInstance == null)
81 __pTheInstance = CreateInstance(APPNAME_OSP_APPWIDGET_SERVICE);
83 return __pTheInstance;
86 AppWidgetManagerService*
87 AppWidgetManagerService::CreateInstance(const char* pCoreDaemonId)
89 if( __pTheInstance == null)
91 __pTheInstance = new AppWidgetManagerService();
92 SysTryReturn(NID_SHELL, __pTheInstance != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
94 result r = __pTheInstance->Construct(pCoreDaemonId);
95 SysAssertf(!IsFailed(r), "Failed to construct AppWidgetManagerService");
96 SysLog(NID_SHELL, "AppWidgetManagerService is created.");
98 return __pTheInstance;
102 AppWidgetManagerService::Construct(const char* pCoreDaemonId)
104 _AppWidgetManagerStub::StartIpcServer();
106 result r = __handlerThread.Construct(THREAD_TYPE_EVENT_DRIVEN);
107 SysTryReturnResult(NID_SHELL, IsFailed(r) == false, r, "Event thread creation failure.");
109 r = __handlerThread.Start();
110 SysTryReturnResult(NID_SHELL, IsFailed(r) == false, r, "Event thread Start failure.");
112 SettingInfo::AddSettingEventListener(*this);
114 static __HashMapDefaultProviderT <String> strHashCodeProvider;
115 static ComparerT <String> strComparer;
117 r = __appWidgetContextList.Construct(0, 0, strHashCodeProvider, strComparer);
118 SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute Construct.");
120 r = __appContextList.Construct(0, 0, strHashCodeProvider, strComparer);
121 SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute Construct.");
123 return InitializeCoreDaemonEventReceiver(pCoreDaemonId);
127 AppWidgetManagerService::AppWidgetConnected(struct event_arg *arg, void* data)
130 ret = provider_send_hello();
133 SysLog(NID_SHELL, "Success to be connected with master daemon");
134 AppWidgetManagerService::GetInstance()->StartPingTimer();
139 SysLog(NID_SHELL, "Failed to invoke provider_send_hello()");
145 AppWidgetManagerService::AppWidgetDisconnected(struct event_arg *arg, void* data)
147 SysLog(NID_SHELL, "Disconnected with master daemon");
152 AppWidgetManagerService::StartPingTimer(void)
154 result r = E_SUCCESS;
156 r = __pingTimer.Construct(*this);
157 SysTryReturnVoidResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "");
159 r = __pingTimer.StartAsRepeatable(TIMER_DURATION_PING);
160 SysTryReturnVoidResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "");
164 AppWidgetManagerService::OnTimerExpired(Timer& timer)
166 provider_send_ping();
170 AppWidgetManagerService::Find(const String& instanceId) const
172 _AppWidgetContext* pAppWidgetContext = null;
173 __appWidgetContextList.GetValue(instanceId, pAppWidgetContext);
175 return pAppWidgetContext;
179 AppWidgetManagerService::GetProviderCount(const String& appId) const
181 int providerCount = 0;
183 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
184 SysTryReturn(NID_SHELL, pAppWidgetContextEnum, providerCount, E_SYSTEM, "[E_SYSTEM]");
186 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
188 _AppWidgetContext* pContext = null;
189 pAppWidgetContextEnum->GetValue(pContext);
191 if (pContext->GetAppId() == appId)
197 SysLog(NID_SHELL, "The provider count is %d for %ls", providerCount, appId.GetPointer());
198 return providerCount;
203 AppWidgetManagerService::OnIpcClientConnected(const _IpcServer& server, int clientId)
205 String appId = server.GetClientApplicationId();
206 SysLog(NID_SHELL, "appId(%ls)", appId.GetPointer());
208 _AppContext* pAppContext = null;
209 __appContextList.GetValue(appId, pAppContext);
212 pAppContext->SetClientId(clientId);
213 pAppContext->SetConnectionState(CONNECTION_STATE_CONNECTED);
218 AppWidgetManagerService::OnIpcClientDisconnected(const _IpcServer& server, int clientId)
220 String appId = server.GetClientApplicationId();
221 SysLog(NID_SHELL, "appId(%ls)", appId.GetPointer());
223 _AppContext* pAppContext = null;
224 __appContextList.GetValue(appId, pAppContext);
227 pAppContext->SetClientId(-1);
228 pAppContext->SetConnectionState(CONNECTION_STATE_DISCONNECTED);
231 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
232 SysTryReturnVoidResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "");
234 _AppWidgetContext* pContext = null;
235 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
238 pAppWidgetContextEnum->GetValue(pContext);
239 SysSecureLog(NID_SHELL, "%ls, %ls, %ls", pContext->GetInstanceId().GetPointer(), pContext->GetProviderId().GetPointer(), appId.GetPointer());
241 if (pContext->GetAppId() == appId)
243 SysLog(NID_SHELL, "client(%d) is unregistered.", clientId);
244 pContext->OnDisconnected();
250 AppWidgetManagerService::OnSettingChanged(Tizen::Base::String& key)
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";
257 if( key == KEY_SETTING_FONT_TYPE
258 // || key == KEY_SETTING_FONT_SIZE
259 || key == KEY_SETTING_LANGUAGE
260 || key == KEY_SETTING_COUNTRY )
262 SysLog(NID_SHELL, "'%ls' is changed.", key.GetPointer() );
263 RequestUpdate("", "", "");
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)
272 _AppWidgetManagerImpl::ExtractAppIdAndProviderName(providerId, appId, providerName);
274 _AppContext* pAppContext = null;
275 bool containsKey = false;
276 __appContextList.ContainsKey(appId, containsKey);
277 if( containsKey == false)
279 pAppContext = new(std::nothrow) _AppContext;
280 __appContextList.Add(appId, pAppContext);
284 __appContextList.GetValue(appId, pAppContext);
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]");
290 __appWidgetContextList.Add(pAppWidgetContext->GetInstanceId(), pAppWidgetContext);
291 pAppWidgetContext->OnAdded();
293 SysSecureLog(NID_SHELL, "%ls, %ls, count(%d)", pAppWidgetContext->GetProviderId().GetPointer(), pAppWidgetContext->GetInstanceId().GetPointer(), __appWidgetContextList.GetCount());
294 return pAppWidgetContext;
298 AppWidgetManagerService::RemoveAppWidget(const char* pProviderId, const char* pId)
300 SysTryReturn(NID_SHELL, ( pProviderId != null && pId != null), null, E_INVALID_ARG, "[E_INVALID_ARG]");
302 _AppWidgetContext* pAppWidgetContext = Find(pId);
303 SysTryReturn(NID_SHELL, pAppWidgetContext, null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND]");
305 result r = __appWidgetContextList.Remove(pAppWidgetContext->GetInstanceId());
307 delete pAppWidgetContext;
309 SysLog(NID_SHELL, "AppWidget(%s, %s) is removed. remain count(%d)", pProviderId, pId, __appWidgetContextList.GetCount());
313 ///////////////////////////////////////////////////////
314 // CoreDaemonEventReceiver implementation
315 ///////////////////////////////////////////////////////
317 AppWidgetManagerService::OnAppWidgetCreate(struct event_arg *arg, int *width, int *height, double *priority, void* data)
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");
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");
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);
331 *priority = pAppWidgetContext->GetPriority();
332 *height= pAppWidgetContext->GetHeight();
333 *width = pAppWidgetContext->GetWidth();
339 AppWidgetManagerService::OnAppWidgetUpdate(struct event_arg *arg, void* data)
341 bool isInstanceIdSpecified = (arg->id == null || strlen(arg->id) < 1) ? false : true;
342 if (isInstanceIdSpecified == false)
344 AppWidgetManagerService::GetInstance()->UpdateAppWidgetsByProviderId(arg->pkgname);
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);
351 pAppWidgetContext->OnUpdate(L"");
358 AppWidgetManagerService::UpdateAppWidgetsByProviderId(const String& providerId)
360 SysLog(NID_SHELL, "");
362 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
363 SysTryReturn(NID_SHELL, pAppWidgetContextEnum, 0, E_SYSTEM, "[E_SYSTEM]");
365 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
367 _AppWidgetContext* pContext = null;
368 pAppWidgetContextEnum->GetValue(pContext);
370 if (pContext->GetProviderId() == providerId)
372 pContext->OnUpdate(L"");
380 AppWidgetManagerService::OnAppWidgetDestroy(struct event_arg *arg, void* data)
382 SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_DELETE, -EPERM, E_SUCCESS, "invalid argument from master");
383 SysLog(NID_SHELL, "Enter");
385 AppWidgetManagerService* pAppWidgetManagerService = AppWidgetManagerService::GetInstance();
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);
390 result r = pAppWidgetContext->OnRemoved();
391 SysTryReturn(NID_SHELL, !IsFailed(r), 0, E_SYSTEM, "[E_SYSTEM] Failed to execute OnRemoved.");
393 r = pAppWidgetManagerService->RemoveAppWidget(arg->pkgname, arg->id);
394 SysTryReturn(NID_SHELL, !IsFailed(r), 0, E_SYSTEM, "[E_SYSTEM] Failed to execute RemoveAppWidget.");
396 SysLog(NID_SHELL, "Exit");
401 AppWidgetManagerService::OnAppWidgetPopupCreate(struct event_arg *arg, void* data)
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);
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);
409 pAppWidgetContext->OnPopupCreated(arg->info.pd_create.x, arg->info.pd_create.y, arg->info.pd_create.w, arg->info.pd_create.h);
415 AppWidgetManagerService::OnAppWidgetPopupDestroy(struct event_arg *arg, void* data)
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);
421 SysSecureLog(NID_SHELL, "providerId(%s), id(%s)", arg->pkgname, arg->id);
422 pAppWidgetContext->OnPopupDestoyed();
428 AppWidgetManagerService::OnAppWidgetPause(struct event_arg *arg, void* data)
430 SysTryReturn(NID_SHELL, arg, 0, E_SUCCESS, "arg is null!");
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);
435 SysSecureLog(NID_SHELL, "providerId(%s), id(%s)", arg->pkgname, arg->id);
436 pAppWidgetContext->OnBackground();
442 AppWidgetManagerService::OnAppWidgetPauseAll(struct event_arg *arg, void* data)
444 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum((AppWidgetManagerService::GetInstance()->__appWidgetContextList).GetMapEnumeratorN());
445 SysTryReturn(NID_SHELL, pAppWidgetContextEnum, -1, E_SYSTEM, "[E_SYSTEM]");
447 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
449 _AppWidgetContext* pContext = null;
450 pAppWidgetContextEnum->GetValue(pContext);
452 pContext->OnBackground();
459 AppWidgetManagerService::OnAppWidgetResume(struct event_arg *pArg, void* pData)
461 SysTryReturn(NID_SHELL, pArg || pArg->id || pArg->pkgname, 0, E_SUCCESS, "pArg is null!");
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);
466 SysSecureLog(NID_SHELL, "providerId(%s), id(%s)", pArg->pkgname, pArg->id);
467 pAppWidgetContext->OnForeground();
472 AppWidgetManagerService::OnAppWidgetResumeAll(struct event_arg *pArg, void* pData)
474 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum((AppWidgetManagerService::GetInstance()->__appWidgetContextList).GetMapEnumeratorN());
475 SysTryReturn(NID_SHELL, pAppWidgetContextEnum, -1, E_SYSTEM, "[E_SYSTEM]");
477 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
479 _AppWidgetContext* pContext = null;
480 pAppWidgetContextEnum->GetValue(pContext);
482 pContext->OnForeground();
489 AppWidgetManagerService::OnAppWidgetClick(struct event_arg *arg, void* data)
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);
499 AppWidgetManagerService::OnAppWidgetResize(struct event_arg *arg, void* data)
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");
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);
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);
509 pAppWidgetContext->OnResize(arg->info.resize.w, arg->info.resize.h);
515 AppWidgetManagerService::OnAppWidgetPeriodChanged(struct event_arg *arg, void* data)
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);
523 AppWidgetManagerService::OnAppWidgetRecreate(struct event_arg *arg, void* data)
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]");
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);
531 AppWidgetManagerService* pAppWidgetManagerService = AppWidgetManagerService::GetInstance();
532 SysTryReturn(NID_SHELL, pAppWidgetManagerService != null, -EBUSY, E_SYSTEM, "Failed to get the instance for AppWidgetManagerService.");
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.");
542 AppWidgetManagerService::InitializeCoreDaemonEventReceiver(const char *pCoreDaemonId)
544 SysTryReturnResult(NID_SHELL, pCoreDaemonId != null, E_INVALID_ARG, "pCoreDaemonId should not be null!");
546 struct event_handler cbs;
547 memset(&cbs, 0, sizeof(event_handler));
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,
566 int ret = provider_init(null, pCoreDaemonId, &cbs, this);
567 SysTryReturnResult(NID_SHELL, ret == 0, E_SYSTEM, "provider_init failed.");
569 SysLog(NID_SHELL, "provider_init is invoked with (%s)", pCoreDaemonId);
574 AppWidgetManagerService::DeinitializeCoreDaemonEventReceiver(void)
580 ///////////////////////////////////////////////////////
581 // stub implementation
582 ///////////////////////////////////////////////////////
586 AppWidgetManagerService::RequestUpdate(const Tizen::App::AppId& appId, const Tizen::Base::String& providerName, const Tizen::Base::String& argument)
589 bool updateAllSuspended = appId.IsEmpty();
591 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum((AppWidgetManagerService::GetInstance()->__appWidgetContextList).GetMapEnumeratorN());
592 SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "");
594 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
596 _AppWidgetContext* pContext = null;
597 pAppWidgetContextEnum->GetValue(pContext);
599 if ( (updateAllSuspended == true && AppManager::GetInstance()->IsRunning(appId) == false )
600 || ( pContext->GetAppId() == appId && pContext->GetProviderName() == providerName ) )
602 RequestUpdate(pContext, argument);
607 SysLog(NID_SHELL, "Exit.");
608 return (found) ? E_SUCCESS : E_OBJ_NOT_FOUND;
613 AppWidgetManagerService::RequestUpdate(_AppWidgetContext* pAppWidgetContext, const String& argument)
615 if (pAppWidgetContext == null)
617 SysLog(NID_SHELL, "pAppWidgetContext is null.");
620 ArrayList* pArray = new (std::nothrow) ArrayList();
621 SysTryReturnResult(NID_SHELL, pArray, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
624 pArray->Add(pAppWidgetContext);
625 pArray->Add(new String(argument));
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() );
635 AppWidgetManagerService::RequestUpdateInstance(const Tizen::Base::String& instanceId, const Tizen::Base::String& argument)
637 SysSecureLog(NID_SHELL, "%ls, %ls", instanceId.GetPointer(), argument.GetPointer() );
639 _AppWidgetContext* pAppWidgetContext = Find(instanceId);
640 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find the object(%ls).", instanceId.GetPointer());
642 RequestUpdate(pAppWidgetContext, argument);
647 AppWidgetManagerService::AcquireRemoteBuffer(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int width, int height, int& bufferId)
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());
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());
659 AppWidgetManagerService::AcquireRemoteBufferForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int width, int height, int& bufferId)
661 _AppWidgetContext* pAppWidgetContext = this->Find(instanceId);
662 SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
664 _AppWidgetPopupContext* pPopupContext = pAppWidgetContext->GetAppWidgetPopup();
665 SysSecureTryReturnResult(NID_SHELL, pPopupContext , E_SYSTEM, "[E_SYSTEM] pPd is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
667 bufferId = pPopupContext->AcquireRemoteBuffer(width, height);
668 SysSecureTryReturnResult(NID_SHELL, bufferId != -1, E_SYSTEM, "Failed to AcquireRemoteBuffer for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
674 AppWidgetManagerService::SyncRemoteBuffer(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int width, int height)
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());
679 return pAppWidgetContext->SyncRemoteBuffer(width, height);
683 AppWidgetManagerService::SyncRemoteBufferForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId)
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());
689 return pAppWidgetContext->GetAppWidgetPopup()->SyncRemoteBuffer();
693 AppWidgetManagerService::ReleaseRemoteBuffer(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId)
699 AppWidgetManagerService::ReleaseRemoteBufferForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId)
705 AppWidgetManagerService::RequestProviderCount(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int& providerCount)
707 SysLog(NID_SHELL, "ENTER");
709 _AppWidgetContext* pAppWidgetContext = this->Find(instanceId);
710 SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext, E_SYSTEM, "pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
712 providerCount = GetProviderCount(pAppWidgetContext->GetAppId());
714 std::unique_ptr<char[]> providerId(_StringConverter::CopyToCharArrayN(pAppWidgetContext->GetProviderId()));
715 std::unique_ptr<char[]> id(_StringConverter::CopyToCharArrayN(pAppWidgetContext->GetInstanceId()));
717 int ret = provider_send_deleted(providerId.get(), id.get());
718 SysTryReturnResult(NID_SHELL, ret >= 0 , E_SYSTEM, "Failed to execute provider_send_deleted.");
720 //result r = pAppWidgetContext->OnRemoved();
721 //SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute OnRemoved.");
723 result r = RemoveAppWidget(providerId.get(), id.get());
724 SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute RemoveAppWidget.");
728 RequestPendingEvent();
734 AppWidgetManagerService::SendResult(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, bool isSucceeded)
736 _AppWidgetContext* pAppWidgetContext = null;
740 SysLog(NID_SHELL, "SendResult is called[false].");
742 if (instanceId == INVALID_INSTANCE)
744 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum((AppWidgetManagerService::GetInstance()->__appWidgetContextList).GetMapEnumeratorN());
745 SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "");
747 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
749 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
750 SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext, E_SYSTEM, "pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
752 if (pAppWidgetContext->GetAppContext()->GetConnectionState() == CONNECTION_STATE_NONE)
760 pAppWidgetContext = this->Find(instanceId);
763 SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext, E_SYSTEM, "pAppWidgetContext is null for (%ls) (%ls)", appId.GetPointer(), instanceId.GetPointer());
765 std::unique_ptr<char[]> providerId(_StringConverter::CopyToCharArrayN(pAppWidgetContext->GetProviderId()));
766 std::unique_ptr<char[]> id(_StringConverter::CopyToCharArrayN(pAppWidgetContext->GetInstanceId()));
768 int ret = provider_send_deleted(providerId.get(), id.get());
769 SysTryReturnResult(NID_SHELL, ret >= 0 , E_SYSTEM, "Failed to execute provider_send_deleted.");
771 //result r = pAppWidgetContext->OnRemoved();
772 //SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute OnRemoved.");
774 result r = RemoveAppWidget(providerId.get(), id.get());
775 SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute RemoveAppWidget.");
777 else // for pending event excluding touch event.
779 SysLog(NID_SHELL, "SendResult is called[true].");
782 RequestPendingEvent();
788 AppWidgetManagerService::SendAccessStatus(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int accessStatus)
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());
793 return pAppWidgetContext->SendAccessStatus(accessStatus);
797 AppWidgetManagerService::RequestPendingEvent(void)
799 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum((AppWidgetManagerService::GetInstance()->__appWidgetContextList).GetMapEnumeratorN());
800 SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "");
802 result r = E_SUCCESS;
804 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
806 _AppWidgetContext* pContext = null;
807 pAppWidgetContextEnum->GetValue(pContext);
809 r = pContext->SendPendingEvent();
812 SysLog(NID_SHELL, "Found pending event.");
820 AppWidgetManagerService::_TaskHandlerThread::~_TaskHandlerThread(void)
826 AppWidgetManagerService::_TaskHandlerThread::OnUserEventReceivedN(RequestId reqId, IList* pArgs)
828 SysTryReturnVoidResult(NID_SHELL, pArgs != null, E_INVALID_STATE, "pArgs is null!.");
830 SysLog(NID_SHELL, "Enter.");
834 case LOCAL_EVENT_REQUEST_UPDATE:
836 _AppWidgetContext* pAppWidgetContext = dynamic_cast<_AppWidgetContext*>( pArgs->GetAt(0) );
837 SysTryReturnVoidResult(NID_SHELL, pAppWidgetContext != null, E_INVALID_STATE, "_AppWidget is null!.");
839 String* pArgument = dynamic_cast<String*>( pArgs->GetAt(1) );
840 SysTryReturnVoidResult(NID_SHELL, pArgument != null, E_INVALID_STATE, "pArgument is null!.");
842 pAppWidgetContext->OnUpdate(*pArgument);
851 SysAssertf(false, "Never get here!");
855 SysLog(NID_SHELL, "Exit.");
858 }}} // Tizen::Shell::App