Adding a function to get the provider count
authorkyeongwoo.lee <kyeongwoo.lee@samsung.com>
Wed, 3 Jul 2013 05:30:17 +0000 (14:30 +0900)
committerkyeongwoo.lee <kyeongwoo.lee@samsung.com>
Wed, 3 Jul 2013 05:30:17 +0000 (14:30 +0900)
Change-Id: I60ae96f04ed0a9b0cef9e6b1d4680e1a92101090

src/FShell_AppWidgetManagerProxy.cpp
src/FShell_AppWidgetProviderManagerImpl.cpp
src/inc/FShell_AppWidgetManagerIpcMessage.h
src/inc/FShell_AppWidgetManagerProxy.h
src/inc/FShell_AppWidgetProviderManagerImpl.h

index 61dc8a1..7ad3df8 100644 (file)
@@ -227,6 +227,19 @@ _AppWidgetManagerProxy::RequestReleaseSharedMemoryForPD(const Tizen::Base::Strin
 }
 
 result
+_AppWidgetManagerProxy::RequestProviderCount(const Tizen::Base::String& instanceId, int &count)
+{
+       SysTryReturnResult(NID_SHELL, __pIpcClient != null, E_SYSTEM, "__pIpcClient instance must not be null.");
+       SysLog(NID_SHELL, "");
+
+       std::auto_ptr<IPC::Message> pMsg (new (std::nothrow) AppWidgetManager_RequestProviderCount(instanceId, &count));
+       result r = __pIpcClient->SendRequest(*pMsg.get());
+       SysTryReturnResult(NID_SHELL, !IsFailed(r), r, "SendRequest failed.");
+
+       return E_SUCCESS;
+}
+
+result
 _AppWidgetManagerProxy::SendResult(const Tizen::Base::String& instanceId, bool isSucceeded)
 {
        SysTryReturnResult(NID_SHELL, __pIpcClient != null, E_SYSTEM, "__pIpcClient instance must not be null.");
@@ -234,7 +247,7 @@ _AppWidgetManagerProxy::SendResult(const Tizen::Base::String& instanceId, bool i
 
        std::auto_ptr<IPC::Message> pMsg (new (std::nothrow) AppWidgetManager_SendResult(instanceId, isSucceeded));
        result r = __pIpcClient->SendRequest(*pMsg.get());
-       SysTryReturnResult(NID_SHELL, !IsFailed(r), r, "SendResult failed.");
+       SysTryReturnResult(NID_SHELL, !IsFailed(r), r, "SendRequest failed.");
 
        return E_SUCCESS;
 }
index fdacfb1..3a94112 100644 (file)
@@ -146,7 +146,7 @@ _AppWidgetProviderManagerImpl::SetAppWidgetProviderFactory(IAppWidgetProviderFac
        {
                SysLogException(NID_SHELL, E_INVALID_OPERATION, "The application's attribute does not meet the condition to provide AppWidget. 'LifeDuration' and 'UseUi' attribute should be specified in application manifest and it's not allowed that declaring 'AUTO_RESTART' attribute for AppWidget.");
 
-               r = SendResult(INVALID_INSTANCE, false);
+               r = SendResult(INVALID_INSTANCE, false);
                SysTryLog(NID_SHELL, !IsFailed(r), "Because the context for this dynamic box is removed, POLLRDHUP occurs.");
 
                return E_INVALID_OPERATION;
@@ -444,11 +444,12 @@ _AppWidgetProviderManagerImpl::HandleRequest(const String& operationId, const IM
        }
        else
        {
+               HandleAppWidgetRequest(operationId, pArgs);
+
+               // reset the timer for life duration
                _ServiceAppImpl* pServiceAppImpl = _ServiceAppImpl::GetInstance();
                SysAssert(pServiceAppImpl);
                pServiceAppImpl->ResetLifeDurationTimer();
-
-               HandleAppWidgetRequest(operationId, pArgs);
        }
 
        return E_SUCCESS;
@@ -501,6 +502,7 @@ _AppWidgetProviderManagerImpl::HandleAppWidgetRequest(const String& operationId,
        {
                int width = 0;
                int height = 0;
+
                const String* pValue =  dynamic_cast<const String*>( pArgs->GetValue(ARG_KEY_WIDTH));
                SysTryReturnResult(NID_SHELL, pValue, E_FAILURE, "Failed to GetValue(%ls)", ARG_KEY_WIDTH.GetPointer() );
                Integer::Parse(*pValue, width);
@@ -630,7 +632,7 @@ _AppWidgetProviderManagerImpl::CreateAppWidget(const String& name, const String&
 result
 _AppWidgetProviderManagerImpl::UpdateAppWidget(const String& instanceId, int width, int height, const String& argument)
 {
-       SysSecureLog(NID_SHELL, "instanceId(%ls), w:%d, h:%d, argument:%ls", instanceId.GetPointer(), width, height, argument.GetPointer() );
+       SysSecureLog(NID_SHELL, "instanceId(%ls), w:%d, h:%d, argument:%ls", instanceId.GetPointer(), width, height, argument.GetPointer());
 
        AppWidgetProvider* pAppWidget = null;
        __appwidgetProviders.GetValue(instanceId, pAppWidget);
@@ -641,9 +643,10 @@ _AppWidgetProviderManagerImpl::UpdateAppWidget(const String& instanceId, int wid
        {
                SysLog(NID_SHELL, "Failed to update.");
 
-               result r = SendResult(instanceId, false);
-               SysTryLog(NID_SHELL, !IsFailed(r), "Failed to send the result.");
-               RemoveAppWidget(instanceId, false);
+               int count = 0;
+               result r = RequestProviderCount(instanceId, count);
+               SysTryLog(NID_SHELL, !IsFailed(r), "Failed to get the count of a provider.");
+               RemoveAppWidget(instanceId, count);
 
                return E_SYSTEM;
        }
@@ -686,8 +689,35 @@ _AppWidgetProviderManagerImpl::RemoveAppWidget(const String& instanceId, bool te
 
        SysLog(NID_SHELL,       "(%d) provider(s) remains.", __appwidgetProviders.GetCount() );
 
-       if( terminateIfFinished && this->__appwidgetProviders.GetCount() == 0)
+       if (terminateIfFinished && this->__appwidgetProviders.GetCount() == 0)
+       {
+               SysLog(NID_SHELL,       "%ls is terminated.", instanceId.GetPointer());
+               Tizen::App::App::GetInstance()->Terminate();
+       }
+
+       return E_SUCCESS;
+}
+
+result
+_AppWidgetProviderManagerImpl::RemoveAppWidget(const String& instanceId, int providerCount)
+{
+       SysSecureLog(NID_SHELL, "instanceId(%ls), providerCount(%d)", instanceId.GetPointer(), providerCount);
+
+       AppWidgetProvider* pAppWidgetProvider = null;
+       __appwidgetProviders.GetValue(instanceId, pAppWidgetProvider);
+       result r = __appwidgetProviders.Remove(instanceId);
+       SysLog(NID_SHELL,       "%s", GetErrorMessage(r) );
+
+       if (pAppWidgetProvider != null)
        {
+               pAppWidgetProvider->OnAppWidgetProviderRemoved();
+               pAppWidgetProvider->OnAppWidgetProviderTerminating();
+               delete pAppWidgetProvider;
+       }
+
+       if (providerCount == 0)
+       {
+               SysLog(NID_SHELL,       "The count of provider is 0. %ls is terminated.", instanceId.GetPointer());
                Tizen::App::App::GetInstance()->Terminate();
        }
 
@@ -822,6 +852,15 @@ _AppWidgetProviderManagerImpl::RequestSyncSharedMemoryForPD(const String& instan
 }
 
 result
+_AppWidgetProviderManagerImpl::RequestProviderCount(const String& instanceId, int& providerCount)
+{
+       _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
+       SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
+
+       return pProxy->RequestProviderCount(instanceId, providerCount);
+}
+
+result
 _AppWidgetProviderManagerImpl::SendResult(const String& instanceId, bool isSucceeded)
 {
        _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
index 01b64d5..c33c60c 100644 (file)
@@ -39,6 +39,7 @@ IPC_SYNC_MESSAGE_CONTROL3_1(AppWidgetManager_RequestSyncSharedMemory, Tizen::Bas
 IPC_SYNC_MESSAGE_CONTROL1_1(AppWidgetManager_RequestSyncSharedMemoryForPD, Tizen::Base::String, result)
 IPC_SYNC_MESSAGE_CONTROL1_1(AppWidgetManager_RequestReleaseSharedMemory, Tizen::Base::String, result)
 IPC_SYNC_MESSAGE_CONTROL1_1(AppWidgetManager_RequestReleaseSharedMemoryForPD, Tizen::Base::String, result)
+IPC_SYNC_MESSAGE_CONTROL1_1(AppWidgetManager_RequestProviderCount, Tizen::Base::String, int)
 IPC_MESSAGE_CONTROL2(AppWidgetManager_SendResult, Tizen::Base::String, bool)
 IPC_MESSAGE_CONTROL2(AppWidgetManager_SendAccessStatus, Tizen::Base::String, int)
 
index 1c1eb82..0725fac 100644 (file)
@@ -54,6 +54,7 @@ public:
        result RequestSyncSharedMemoryForPD(const Tizen::Base::String& instanceId);
        result RequestReleaseSharedMemory(const Tizen::Base::String& instanceId);
        result RequestReleaseSharedMemoryForPD(const Tizen::Base::String& instanceId);
+       result RequestProviderCount(const Tizen::Base::String& instanceId, int& providerCount);
        result SendResult(const Tizen::Base::String& instanceId, bool isSucceeded);
        result SendAccessStatus(const Tizen::Base::String& instanceId, int accessStatus);
 
index b9b4128..0a57783 100644 (file)
@@ -89,6 +89,7 @@ public:
        result RequestSyncSharedMemoryForPD(const Tizen::Base::String& instanceId);
        result RequestReleaseSharedMemory(const Tizen::Base::String& instanceId);
        result RequestReleaseSharedMemoryForPD(const Tizen::Base::String& instanceId);
+       result RequestProviderCount(const Tizen::Base::String& instanceId, int& providerCount);
        result SendResult(const Tizen::Base::String& instanceId, bool isSucceeded);
        result SendAccessStatus(const Tizen::Base::String& instanceId, int accessStatus);
 
@@ -115,6 +116,7 @@ private:
        result UpdateAppWidget(const Tizen::Base::String& instanceId, int width, int height, const Tizen::Base::String& argument);
        result ResizeAppWidget(const Tizen::Base::String& instanceId, int width, int height);
        result RemoveAppWidget(const Tizen::Base::String& instanceId, bool terminateIfFinished);
+       result RemoveAppWidget(const Tizen::Base::String& instanceId, int providerCount);
        result CreateAppWidgetPopupProvider(const Tizen::Base::String& instanceId, const Tizen::Base::String& providerName,  const Tizen::Base::String& userInfo, double x, double y, int width, int height);
        result DestroyAppWidgetPopupProvider(const Tizen::Base::String& instanceId);