+result
+_AppContext::SendRequestToApp(const AppId& providerAppId, const String& operation, HashMap* pArgs)
+{
+ result r = E_SUCCESS;
+
+ if (GetConnectionState() == CONNECTION_STATE_NONE || GetConnectionState() == CONNECTION_STATE_DISCONNECTED)
+ {
+ SysLog(NID_SHELL, "The application is not running.");
+ result r = _AppWidgetRequestHelper::SendAppControlRequest(providerAppId, operation, pArgs);
+ SysTryReturn(NID_SHELL, !IsFailed(r), r, r, "[%s] Failed to SendRequestToApp", GetErrorMessage(r));
+
+ SetWaitingStatus(true);
+ SetConnectionState(CONNECTION_STATE_CONNECTING);
+ }
+ else
+ {
+ if (GetConnectionState() == CONNECTION_STATE_CONNECTING || GetWaitingStatus() == true)
+ {
+ SysLog(NID_SHELL, "The application is running but IPC is not connected yet.");
+ __pPendingEventList->Add(new (nothrow) PendingEvent(operation, pArgs));
+ }
+ else
+ {
+ SysLog(NID_SHELL, "The application is running and IPC is connected.");
+ r = _AppWidgetRequestHelper::SendIpcRequest(GetClientId(), operation, pArgs);
+
+ pArgs->RemoveAll(true);
+ delete pArgs;
+ SetWaitingStatus(true);
+ }
+ }
+
+ return E_SUCCESS;
+}
+
+result
+_AppContext::SendPendingEvent(void)
+{
+ SetWaitingStatus(false);
+ TryReturn(__pPendingEventList->GetCount() > 0, E_DATA_NOT_FOUND, "This context has no pending event. Please find next pending event context.");
+
+ PendingEvent* pEvent = null;
+ __pPendingEventList->GetAt(0, pEvent);
+ SysTryReturnResult(NID_SHELL, pEvent != null, E_SYSTEM, "__pPendingEventList has (%d) items, but failed to GetAt(0)", __pPendingEventList->GetCount());
+
+ __pPendingEventList->RemoveAt(0);
+ SysLog(NID_SHELL, "(%d) Remains in __pPendingEventList.", __pPendingEventList->GetCount());
+
+ result r = _AppWidgetRequestHelper::SendIpcRequest(GetClientId(), pEvent->operation, pEvent->pArg);
+ delete pEvent;
+ SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "SendIpcRequest failed.");
+
+ return E_SUCCESS;
+}
+
+_AppWidgetContext*
+_AppContext::FindAppWidget(const String& instanceId) const
+{
+ _AppWidgetContext* pAppWidgetContext = null;
+
+ if (instanceId == INVALID_INSTANCE)
+ {
+ pAppWidgetContext = FindInvalidAppWidget();
+ }
+ else
+ {
+ result r = __appWidgetContextList.GetValue(instanceId, pAppWidgetContext);
+ SysTryReturn(NID_SHELL, !IsFailed(r), null, E_OBJ_NOT_FOUND, "instanceId(%ls) is not found", instanceId.GetPointer() );
+ }
+ return pAppWidgetContext;
+}
+
+_AppWidgetContext*
+_AppContext::FindInvalidAppWidget(void) const
+{
+ SysTryReturn(NID_SHELL, GetConnectionState() == CONNECTION_STATE_NONE, null, E_INVALID_STATE, "[E_INVALID_STATE] connectionState(%d)", GetConnectionState());
+
+ _AppWidgetContext* pAppWidgetContext = null;
+ unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
+ SysTryReturn(NID_SHELL, pAppWidgetContextEnum, null, E_SYSTEM, "");
+
+ while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
+ {
+ pAppWidgetContextEnum->GetValue(pAppWidgetContext);
+ if (pAppWidgetContext)
+ {
+ //TODO: check whether this app context has only one instance of _AppWidgetContext
+ return pAppWidgetContext;
+ }
+ }
+ return null;
+}
+
+int
+_AppContext::GetProviderCount(const String& appId) const
+{
+ return __appWidgetContextList.GetCount();
+}
+
+result
+_AppContext::RequestUpdate(const Tizen::Base::String& providerName, const Tizen::Base::String& argument) const
+{
+ bool found = false;
+ bool requestToAll = providerName.IsEmpty();
+
+ unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
+ SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "Failed to invoke __appWidgetContextList.GetMapEnumeratorN()");
+
+ while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
+ {
+ _AppWidgetContext* pAppWidgetContext = null;
+ pAppWidgetContextEnum->GetValue(pAppWidgetContext);
+
+ if (pAppWidgetContext->GetProviderName() == providerName || requestToAll == true)
+ {
+ pAppWidgetContext->RequestUpdate(argument);
+ found = true;
+ }
+ }
+
+ SysLog(NID_SHELL, "Exit.");
+ return (found) ? E_SUCCESS : E_OBJ_NOT_FOUND;
+}
+
+result
+_AppContext::OnAppWidgetBackgroundAll(void) const
+{
+ unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
+ SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "Failed to invoke GetMapEnumeratorN()");
+
+ while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
+ {
+ _AppWidgetContext* pAppWidgetContext = null;
+ pAppWidgetContextEnum->GetValue(pAppWidgetContext);
+ if (pAppWidgetContext)
+ {
+ pAppWidgetContext->OnBackground();
+ }
+ }
+
+ return E_SUCCESS;
+}
+
+result
+_AppContext::OnAppWidgetForegroundAll(void) const
+{
+ unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
+ SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "Failed to invoke GetMapEnumeratorN()");
+
+ while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
+ {
+ _AppWidgetContext* pAppWidgetContext = null;
+ pAppWidgetContextEnum->GetValue(pAppWidgetContext);
+ if (pAppWidgetContext)
+ {
+ pAppWidgetContext->OnForeground();
+ }
+ }
+
+ return E_SUCCESS;
+}
+
+
+