result AddAppWidget(const Tizen::Base::String& userInfo, const Tizen::Base::String& appId, const Tizen::Base::String& instanceId, int width, int height, int period, int priority);
result RequestUpdate(_AppWidgetContext* pAppWidgetContext, const Tizen::Base::String& argument) const;
void OnUserEventReceivedN(RequestId reqId, Tizen::Base::Collection::IList* pArgs);
+ virtual ~AppWidgetManagerService(void);
private:
AppWidgetManagerService(void);
- virtual ~AppWidgetManagerService(void);
result Construct(const char* pServiceIdForCoreDaemon);
result InitializeCoreDaemonEventReceiver(const char* pServiceIdForCoreDaemon);
// helpers
_AppContext* FindAppContext(const Tizen::App::AppId& appId) const;
+ result RemoveAppContext(const Tizen::App::AppId& appId);
_AppWidgetContext* FindAppWidget(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId) const;
void StartPingTimer(void);
virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer);
result RequestUpdateAllSuspened(void) const;
+ static void InitSingleton(void);
+ static void DestroySingleton(void);
private:
static AppWidgetManagerService* __pTheInstance;
#include <FBase.h>
#include <FBaseSysLog.h>
#include <FBaseColHashMap.h>
+#include <FBaseColIMapEnumeratorT.h>
#include <FAppApp.h>
#include <FBaseComparerT.h>
#include <FApp_AppManagerImpl.h>
_AppContext::~_AppContext(void)
{
+ SysLog(NID_SHELL, "Enter");
+
if (__pPendingEventList)
{
for (int i = 0; i < __pPendingEventList->GetCount(); i++)
__pPendingEventList->RemoveAll();
delete __pPendingEventList;
}
+
+ IMapEnumeratorT<String, _AppWidgetContext*>* pMapEnum = __appWidgetContextList.GetMapEnumeratorN();
+ if (pMapEnum != null)
+ {
+ while (pMapEnum->MoveNext() == E_SUCCESS)
+ {
+ _AppWidgetContext* pAppWidgetContext = null;
+ pMapEnum->GetValue(pAppWidgetContext);
+ delete pAppWidgetContext;
+ }
+
+ delete pMapEnum;
+ }
+
+ SysLog(NID_SHELL, "Exit");
}
result
}
int
-_AppContext::GetProviderCount(const String& appId) const
+_AppContext::GetProviderCount(void) const
{
return __appWidgetContextList.GetCount();
}
AppWidgetManagerService::~AppWidgetManagerService(void)
{
- SysLog(NID_SHELL, "Enter.");
+ SysLog(NID_SHELL, "Enter");
+
__pingTimer.Cancel();
+
DeinitializeCoreDaemonEventReceiver();
- SysLog(NID_SHELL, "Exit.");
+
+ IMapEnumeratorT<String, _AppContext*>* pMapEnum = __appContextList.GetMapEnumeratorN();
+ if (pMapEnum != null)
+ {
+ while (pMapEnum->MoveNext() == E_SUCCESS)
+ {
+ _AppContext* pAppContext = null;
+ pMapEnum->GetValue(pAppContext);
+ delete pAppContext;
+ }
+
+ delete pMapEnum;
+ }
+
+ SysLog(NID_SHELL, "Exit");
+}
+
+void
+AppWidgetManagerService::InitSingleton(void)
+{
+ unique_ptr<AppWidgetManagerService> pInstance(new (nothrow) AppWidgetManagerService());
+ SysTryReturnVoidResult(NID_SHELL, pInstance, E_OUT_OF_MEMORY, "The memory is insufficient.");
+
+ __pTheInstance = pInstance.release();
+ std::atexit(DestroySingleton);
+}
+
+void
+AppWidgetManagerService::DestroySingleton(void)
+{
+ delete __pTheInstance;
}
AppWidgetManagerService*
AppWidgetManagerService*
AppWidgetManagerService::CreateInstance(const char* pCoreDaemonId)
{
+ ClearLastResult();
+
+ static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
+
if (__pTheInstance == null)
{
- __pTheInstance = new AppWidgetManagerService();
- SysTryReturn(NID_SHELL, __pTheInstance != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
+ pthread_once(&onceBlock, InitSingleton);
+ result r = GetLastResult();
+ if (IsFailed(r))
+ {
+ onceBlock = PTHREAD_ONCE_INIT;
+ }
- result r = __pTheInstance->Construct(pCoreDaemonId);
+ r = __pTheInstance->Construct(pCoreDaemonId);
SysAssertf(!IsFailed(r), "Failed to construct AppWidgetManagerService");
SysLog(NID_SHELL, "AppWidgetManagerService is created.");
}
return pAppContext;
}
+result
+AppWidgetManagerService::RemoveAppContext(const Tizen::App::AppId& appId)
+{
+ return __appContextList.Remove(appId);
+}
+
_AppWidgetContext*
AppWidgetManagerService::FindAppWidget(const AppId& appId, const String& instanceId) const
{
{
SysAssertf(arg != null && arg->type == event_arg::EVENT_DELETE, "The status of data-provider-master is invalid.");
- _AppContext* pAppContext = AppWidgetManagerService::GetInstance()->FindAppContext(_AppWidgetHelper::ExtractAppId(arg->pkgname));
+ String appId = _AppWidgetHelper::ExtractAppId(arg->pkgname);
+ _AppContext* pAppContext = AppWidgetManagerService::GetInstance()->FindAppContext(appId);
SysTryReturn(NID_SHELL, pAppContext != null, -1, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Failed to find _AppContext.");
pAppContext->DestroyAppWidget(arg->id);
+ if (pAppContext->GetProviderCount() == 0)
+ {
+ SysLog(NID_SHELL, "The provider count for (%ls) is 0.", appId.GetPointer());
+ AppWidgetManagerService::GetInstance()->RemoveAppContext(appId);
+ delete pAppContext;
+ }
+
return 0;
}
result r = __appContextList.GetValue(appId, pAppContext);
SysTryReturnResult(NID_SHELL, pAppContext, E_OBJ_NOT_FOUND, "Failed to find _AppContext.");
- providerCount = pAppContext->GetProviderCount(appId);
+ providerCount = pAppContext->GetProviderCount();
r = pAppContext->DestroyAppWidget(instanceId, false);
SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute DestroyAppWidget.");