From: jungmin76.park Date: Sat, 3 Aug 2013 01:28:49 +0000 (+0900) Subject: add FShell_AppContext.cpp X-Git-Tag: submit/tizen/20130912.075546~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dac5af5b6f71b082507d0bc3aac6b64f76d3068d;p=platform%2Fframework%2Fnative%2Fappwidget-service.git add FShell_AppContext.cpp Change-Id: I7769e37606130dcb4fe4a7c6f00c30472090a790 Signed-off-by: jungmin76.park --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 538baa9..2420719 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,7 @@ INCLUDE_DIRECTORIES ( SET (${this_target}_SOURCE_FILES src/OspAppWidgetService.cpp src/OspAppWidgetServiceEntry.cpp + src/FShell_AppContext.cpp src/FShell_AppWidgetContext.cpp src/FShell_AppWidgetRemoteBuffer.cpp src/FShell_AppWidgetManagerService.cpp diff --git a/inc/FShell_AppContext.h b/inc/FShell_AppContext.h new file mode 100644 index 0000000..ed3ff78 --- /dev/null +++ b/inc/FShell_AppContext.h @@ -0,0 +1,107 @@ +// +// Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file FShell_AppContext.h + * @brief This is the header file for the _AppContext class. + * + * This header file contains the declarations of the _AppContext class. + */ + +#ifndef _FSHELL_INTERNAL_APP_CONTEXT_H_ +#define _FSHELL_INTERNAL_APP_CONTEXT_H_ + +#include +#include + +namespace Tizen { namespace Base { namespace Collection +{ +class HashMap; +}}} + +namespace Tizen { namespace Shell { namespace App +{ + +enum _ConnectionState +{ + CONNECTION_STATE_NONE = 0, + CONNECTION_STATE_CONNECTING, + CONNECTION_STATE_CONNECTED, + CONNECTION_STATE_DISCONNECTED +}; + +class _AppWidgetContext; + +/** + * @class _AppContext + * @brief Context of a AppWidget provider application. + */ +class _AppContext + :public Tizen::Base::Object +{ + +public: + _AppContext(const Tizen::App::AppId& appId); + ~_AppContext(void); + + _AppWidgetContext* AddAppWidget(const Tizen::Base::String& userInfo, const Tizen::Base::String& providerId, const Tizen::Base::String& instanceId, int width, int height, int period, int priority); + result RemoveAppWidget(const Tizen::Base::String& instanceId, bool isTriggeredByViewer = true); + result RequestUpdate(const Tizen::Base::String& providerName, const Tizen::Base::String& argument) const; + result OnAppWidgetBackgroundAll(void) const; + result OnAppWidgetForegroundAll(void) const; + + result SendRequestToApp(const Tizen::App::AppId& providerAppId, const Tizen::Base::String& operation, Tizen::Base::Collection::HashMap* pArgs); + result SendPendingEvent(void); + + void OnIpcConnected(int clientId); + void OnIpcDisconnected(void); + + Tizen::App::AppId GetAppId(void) const; + int GetClientId(void) const; + _ConnectionState GetConnectionState(void) const; + bool GetWaitingStatus(void) const; + + _AppWidgetContext* FindAppWidget(const Tizen::Base::String& instanceId) const; + int GetProviderCount(const Tizen::Base::String& appId) const; + +private: + void SetConnectionState(_ConnectionState state); + void SetWaitingStatus(bool status); + _AppWidgetContext* FindInvalidAppWidget(void) const; + +private: + + struct PendingEvent + { + PendingEvent(const Tizen::Base::String& operation, Tizen::Base::Collection::HashMap* pHashMap) + : operation(operation), pArg(pHashMap) { } + + Tizen::Base::String operation; + Tizen::Base::Collection::HashMap* pArg; + }; + + const Tizen::App::AppId __appId; + bool __isWaitingResult; + int __ipcClientId; + _ConnectionState __connectionState; + Tizen::Base::Collection::HashMapT __appWidgetContextList; + Tizen::Base::Collection::ArrayListT* __pPendingEventList; +}; + + +}}} // Tizen::Shell::App + +#endif // _FSHELL_INTERNAL_APP_CONTEXT_H_ diff --git a/inc/FShell_AppWidgetContext.h b/inc/FShell_AppWidgetContext.h index 8d56634..bbadc5b 100644 --- a/inc/FShell_AppWidgetContext.h +++ b/inc/FShell_AppWidgetContext.h @@ -28,6 +28,7 @@ #include #include #include +#include "FShell_AppContext.h" #include "FShell_AppWidgetRemoteBuffer.h" namespace Tizen { namespace Base { namespace Collection @@ -54,73 +55,6 @@ extern const wchar_t ARG_KEY_TIME_STAMP[]; extern const int UPDATE_PERIOD_MSEC_MIN; -enum _ConnectionState -{ - CONNECTION_STATE_NONE = 0, - CONNECTION_STATE_CONNECTING, - CONNECTION_STATE_CONNECTED, - CONNECTION_STATE_DISCONNECTED -}; - -class _AppWidgetContext; - -/** - * @class _AppContext - * @brief Context of a AppWidget provider application. - */ -class _AppContext - :public Tizen::Base::Object -{ - -public: - _AppContext(const Tizen::App::AppId& appId); - ~_AppContext(void); - - _AppWidgetContext* AddAppWidget(const Tizen::Base::String& userInfo, const Tizen::Base::String& providerId, const Tizen::Base::String& instanceId, int width, int height, int period, int priority); - result RemoveAppWidget(const Tizen::Base::String& instanceId, bool isTriggeredByViewer = true); - result RequestUpdate(const Tizen::Base::String& providerName, const Tizen::Base::String& argument) const; - result OnAppWidgetBackgroundAll(void) const; - result OnAppWidgetForegroundAll(void) const; - - result SendRequestToApp(const Tizen::App::AppId& providerAppId, const Tizen::Base::String& operation, Tizen::Base::Collection::HashMap* pArgs); - result SendPendingEvent(void); - - void OnIpcConnected(int clientId); - void OnIpcDisconnected(void); - - Tizen::App::AppId GetAppId(void) const; - int GetClientId(void) const; - _ConnectionState GetConnectionState(void) const; - bool GetWaitingStatus(void) const; - - _AppWidgetContext* FindAppWidget(const Tizen::Base::String& instanceId) const; - int GetProviderCount(const Tizen::Base::String& appId) const; - -private: - void SetConnectionState(_ConnectionState state); - void SetWaitingStatus(bool status); - _AppWidgetContext* FindInvalidAppWidget(void) const; - -private: - - struct PendingEvent - { - PendingEvent(const Tizen::Base::String& operation, Tizen::Base::Collection::HashMap* pHashMap) - : operation(operation), pArg(pHashMap) { } - - Tizen::Base::String operation; - Tizen::Base::Collection::HashMap* pArg; - }; - - Tizen::App::AppId __appId; - bool __isWaitingResult; - int __ipcClientId; - _ConnectionState __connectionState; - Tizen::Base::Collection::HashMapT __appWidgetContextList; - Tizen::Base::Collection::ArrayListT* __pPendingEventList; -}; - - class _AppWidgetPopupContext; /** @@ -133,20 +67,19 @@ class _AppWidgetContext , public Tizen::Base::Object { public: - _AppWidgetContext(_AppContext* pAppContext, const Tizen::Base::String& userInfo, const Tizen::Base::String& appId, const Tizen::Base::String& instanceId, int width, int height, int period, int priority); + _AppWidgetContext(_AppContext* pAppContext, const Tizen::Base::String& instanceId, const Tizen::Base::String& providerId, int width, int height, const Tizen::Base::String& userInfo, int period, int priority); virtual ~_AppWidgetContext(void); // handle dynamic box void OnAdded(void); void OnUpdate(const Tizen::Base::String& argument); + result OnUpdateAsync(const Tizen::Base::String& argument); void OnResize(int width, int height); result OnRemoved(bool isTriggeredByViewer = true); // dynamic box state void OnForeground(void); void OnBackground(void); - result RequestUpdate(const Tizen::Base::String& argument); - // handle request from dynamic box int AcquireRemoteBuffer(int w, int h) const; result SyncRemoteBuffer(int width, int height); @@ -185,7 +118,6 @@ private: virtual void OnTouchEventReceived(buffer_event event, double timestamp, double x, double y); virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer); - void SetForeground(bool forground); void SetWidth(int width); void SetHeight(int height); int GetPeriod(void) const; @@ -207,21 +139,22 @@ private: double y; }; - mutable bool __isRemoteBufferProxyCreated; - bool __hasPendingRequest; - bool __isForeground; + const Tizen::Base::String __instanceId; + const Tizen::Base::String __providerId; + const Tizen::Base::String __appId; + const Tizen::Base::String __providerName; + const Tizen::Base::String __userInfo; + int __width; int __height; - int __priority; - int __ipcClientId; + const int __priority; const int __updateMillis; - long long __lastUpdatedTime; - const Tizen::Base::String __userInfo; - const Tizen::Base::String __providerId; - const Tizen::Base::String __instanceId; - Tizen::Base::String __appId;//TODO: const - Tizen::Base::String __providerName;//TODO: const + int __ipcClientId; + bool __isForeground; + mutable bool __isRemoteBufferProxyCreated; + long long __lastUpdatedTime; + bool __hasPendingRequest; Tizen::Base::String __pendingArgument; Tizen::Base::Runtime::Timer __updateTimer; diff --git a/inc/FShell_AppWidgetManagerService.h b/inc/FShell_AppWidgetManagerService.h index 467a24a..c6db66e 100644 --- a/inc/FShell_AppWidgetManagerService.h +++ b/inc/FShell_AppWidgetManagerService.h @@ -55,7 +55,10 @@ public: void OnUserEventReceivedN(RequestId reqId, Tizen::Base::Collection::IList* pArgs); private: + AppWidgetManagerService(void); + virtual ~AppWidgetManagerService(void); result Construct(const char* pServiceIdForCoreDaemon); + result InitializeCoreDaemonEventReceiver(const char* pServiceIdForCoreDaemon); result DeinitializeCoreDaemonEventReceiver(void); @@ -76,22 +79,22 @@ private: static int OnAppWidgetPeriodChanged(struct event_arg *arg, void* data); static int OnAppWidgetRecreate(struct event_arg *arg, void* data); - // stub implementations + // stub implementations(request for app) virtual result RequestUpdate(const Tizen::App::AppId& appId, const Tizen::Base::String& providerName, const Tizen::Base::String& argument) const; virtual result RequestUpdateInstance(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, const Tizen::Base::String& argument); + + // stub implementations(request for buffer) virtual result AcquireRemoteBuffer(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int w, int h, int& bufferId); virtual result AcquireRemoteBufferForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int w, int h, int& bufferId); virtual result SyncRemoteBuffer(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int width, int height); virtual result SyncRemoteBufferForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId); virtual result ReleaseRemoteBuffer(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId); virtual result ReleaseRemoteBufferForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId); - virtual result RequestProviderCount(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int& providerCount); - virtual result SendResult(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, bool isSucceeded); virtual result SendAccessStatus(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int accessStatus); - // internal functions - AppWidgetManagerService(void); - virtual ~AppWidgetManagerService(void); + // stub implementations(response) + virtual result RequestProviderCount(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int& providerCount); + virtual result SendResult(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, bool isSucceeded); // _IIpcServerEventListener virtual void OnIpcClientConnected(const Tizen::Io::_IpcServer& server, int clientId); @@ -102,12 +105,8 @@ private: // helpers _AppWidgetContext* FindAppWidget(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId) const; - int UpdateAppWidgetsByProviderId(const Tizen::Base::String& providerId); -// result RequestPendingEvent(void); - void StartPingTimer(void); virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer); - static Tizen::App::AppId ExtractAppId(const Tizen::Base::String& providerId); result RequestUpdateAllSuspened(void) const; private: @@ -117,6 +116,13 @@ private: Tizen::Base::Runtime::Timer __pingTimer; }; // class AppWidgetManagerService +class _AppWidgetHelper +{ +public: + static Tizen::App::AppId ExtractAppId(const Tizen::Base::String& providerId); + static Tizen::Base::String ExtractProviderName(const Tizen::Base::String& providerId); +}; //AppWidgetHelper + }}} // Tizen::Shell::App #endif // _FSHELL_INTERNAL_APPWIDGET_MANAGER_SERVICE_H_ diff --git a/inc/FShell_AppWidgetManagerStub.h b/inc/FShell_AppWidgetManagerStub.h index df3411d..5523a45 100644 --- a/inc/FShell_AppWidgetManagerStub.h +++ b/inc/FShell_AppWidgetManagerStub.h @@ -75,10 +75,10 @@ protected: virtual result SyncRemoteBufferForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId) = 0; virtual result ReleaseRemoteBuffer(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId) = 0; virtual result ReleaseRemoteBufferForPD(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId) = 0; + virtual result SendAccessStatus(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int accessStatus) = 0; virtual result RequestProviderCount(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int& pProviderCount) = 0; virtual result SendResult(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, bool isSucceeded) = 0; - virtual result SendAccessStatus(const Tizen::App::AppId& appId, const Tizen::Base::String& instanceId, int accessStatus) = 0; // _IIpcServerEventListener virtual void OnIpcServerStarted(const Tizen::Io::_IpcServer& server); diff --git a/inc/FShell_AppWidgetRemoteBuffer.h b/inc/FShell_AppWidgetRemoteBuffer.h index 1b32ba0..749596d 100644 --- a/inc/FShell_AppWidgetRemoteBuffer.h +++ b/inc/FShell_AppWidgetRemoteBuffer.h @@ -58,9 +58,9 @@ private: result Release(void); private: - target_type __type; - Tizen::Base::String __providerId; - Tizen::Base::String __instanceId; + const target_type __type; + const Tizen::Base::String __providerId; + const Tizen::Base::String __instanceId; void* __buffer; struct livebox_buffer* __buffer_info; _IAppWidgetRemoteBufferEventListener* __pListener; diff --git a/src/FShell_AppContext.cpp b/src/FShell_AppContext.cpp new file mode 100644 index 0000000..fc03aa1 --- /dev/null +++ b/src/FShell_AppContext.cpp @@ -0,0 +1,336 @@ +// +// Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file FShell_AppWidgetContext.cpp + * @brief This is the implementation for the _AppWidgetContext class. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "FShell_AppWidgetContext.h" +#include "FShell_AppWidgetContextHelper.h" +#include "FShell_TemplateUtil.h" + +namespace Tizen { namespace Shell { namespace App +{ + +using namespace std; +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::System; + +static const wchar_t INVALID_INSTANCE[] = L"file://invalid instance id"; + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// _AppContext class +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +_AppContext::_AppContext(const AppId& appId) + :__appId(appId) + ,__isWaitingResult(false) + ,__ipcClientId(0) + ,__connectionState(CONNECTION_STATE_NONE) + ,__pPendingEventList(null) +{ + + __pPendingEventList = new (nothrow) ArrayListT(); + SysTryReturnVoidResult(NID_SHELL, __pPendingEventList, E_OUT_OF_MEMORY, ""); + + result r = __pPendingEventList->Construct(); + SysTryReturnVoidResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute Construct."); + + static __HashMapDefaultProviderT strHashCodeProvider; + static ComparerT strComparer; + r = __appWidgetContextList.Construct(0, 0, strHashCodeProvider, strComparer); + SysTryReturnVoidResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute Construct."); +} + +_AppContext::~_AppContext(void) +{ + if (__pPendingEventList) + { + for (int i = 0; i < __pPendingEventList->GetCount(); i++) + { + PendingEvent* pEvent = null; + __pPendingEventList->GetAt(i, pEvent); + delete pEvent; + } + __pPendingEventList->RemoveAll(); + delete __pPendingEventList; + } +} + +_AppWidgetContext* +_AppContext::AddAppWidget(const Tizen::Base::String& userInfo, const Tizen::Base::String& providerId, const Tizen::Base::String& instanceId, int width, int height, int period, int priority) +{ + _AppWidgetContext* pAppWidgetContext = new (std::nothrow)_AppWidgetContext(this, instanceId, providerId, width, height, userInfo, period, priority); + SysTryReturn(NID_SHELL, pAppWidgetContext, 0, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]"); + + __appWidgetContextList.Add(pAppWidgetContext->GetInstanceId(), pAppWidgetContext); + pAppWidgetContext->OnAdded(); + + SysSecureLog(NID_SHELL, "%ls, %ls, count(%d)", pAppWidgetContext->GetProviderId().GetPointer(), pAppWidgetContext->GetInstanceId().GetPointer(), __appWidgetContextList.GetCount()); + return pAppWidgetContext; +} + +result +_AppContext::RemoveAppWidget(const Tizen::Base::String& instanceId, bool isTriggeredByViewer) +{ + _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId); + SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND]"); + + __appWidgetContextList.Remove(instanceId); + + result r = pAppWidgetContext->OnRemoved(isTriggeredByViewer); + SysTryLog(NID_SHELL, !IsFailed(r), "Failed to execute OnRemoved."); + + delete pAppWidgetContext; + + SysLog(NID_SHELL, "AppWidget(%ls, %ls) is removed. remain count(%d)", pAppWidgetContext->GetProviderId().GetPointer(), instanceId.GetPointer(), __appWidgetContextList.GetCount()); + return E_SUCCESS; +} + +_ConnectionState +_AppContext::GetConnectionState(void) const +{ + return __connectionState; +} + +void +_AppContext::SetConnectionState(_ConnectionState state) +{ + __connectionState = state; +} + +Tizen::App::AppId +_AppContext::GetAppId(void) const +{ + return __appId; +} + +int +_AppContext::GetClientId(void) const +{ + return __ipcClientId; +} + +void +_AppContext::OnIpcConnected(int clientId) +{ + __ipcClientId = clientId; + SetConnectionState(CONNECTION_STATE_CONNECTED); +} + +void +_AppContext::OnIpcDisconnected(void) +{ + __ipcClientId = -1; + SetConnectionState(CONNECTION_STATE_DISCONNECTED); + + unique_ptr< IMapEnumeratorT > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN()); + SysTryReturnVoidResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, ""); + + _AppWidgetContext* pAppWidgetContext = null; + while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS) + { + pAppWidgetContextEnum->GetValue(pAppWidgetContext); + if (pAppWidgetContext) + { + pAppWidgetContext->OnDisconnected(); + } + } +} + +void +_AppContext::SetWaitingStatus(bool status) +{ + __isWaitingResult = status; +} + +bool +_AppContext::GetWaitingStatus(void) const +{ + return __isWaitingResult; +} + +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); + __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 > 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 > 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->OnUpdateAsync(argument); + found = true; + } + } + + SysLog(NID_SHELL, "Exit."); + return (found) ? E_SUCCESS : E_OBJ_NOT_FOUND; +} + +result +_AppContext::OnAppWidgetBackgroundAll(void) const +{ + unique_ptr< IMapEnumeratorT > 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 > 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; +} + +}}} // Tizen::Shell::App diff --git a/src/FShell_AppWidgetContext.cpp b/src/FShell_AppWidgetContext.cpp index 021b64f..23baf02 100644 --- a/src/FShell_AppWidgetContext.cpp +++ b/src/FShell_AppWidgetContext.cpp @@ -23,25 +23,17 @@ #include #include -//#include #include -#include -#include -#include -#include #include #include -#include -#include - #include +#include #include "FShell_AppWidgetManagerImpl.h" #include "FShell_AppWidgetManagerService.h" #include "FShell_AppWidgetPopupContext.h" #include "FShell_AppWidgetContext.h" #include "FShell_AppWidgetContextHelper.h" #include "FShell_AppWidgetRemoteBuffer.h" -#include "FShell_TemplateUtil.h" namespace Tizen { namespace Shell { namespace App { @@ -73,325 +65,27 @@ const wchar_t APPWIDGET_ON_TOUCH[] = L"http://tizen.org/appcontrol/appwidget/tou const int UPDATE_PERIOD_MSEC_MIN = 1800000; // 30min -static const wchar_t INVALID_INSTANCE[] = L"file://invalid instance id"; - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// _AppContext class -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -_AppContext::_AppContext(const AppId& appId) - :__appId(appId) - ,__isWaitingResult(false) - ,__ipcClientId(0) - ,__connectionState(CONNECTION_STATE_NONE) - ,__pPendingEventList(null) -{ - - __pPendingEventList = new (nothrow) ArrayListT(); - SysTryReturnVoidResult(NID_SHELL, __pPendingEventList, E_OUT_OF_MEMORY, ""); - - result r = __pPendingEventList->Construct(); - SysTryReturnVoidResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute Construct."); - - static __HashMapDefaultProviderT strHashCodeProvider; - static ComparerT strComparer; - r = __appWidgetContextList.Construct(0, 0, strHashCodeProvider, strComparer); - SysTryReturnVoidResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute Construct."); -} - -_AppContext::~_AppContext(void) -{ - if (__pPendingEventList) - { - for (int i = 0; i < __pPendingEventList->GetCount(); i++) - { - PendingEvent* pEvent = null; - __pPendingEventList->GetAt(i, pEvent); - delete pEvent; - } - __pPendingEventList->RemoveAll(); - delete __pPendingEventList; - } -} - -_AppWidgetContext* -_AppContext::AddAppWidget(const Tizen::Base::String& userInfo, const Tizen::Base::String& providerId, const Tizen::Base::String& instanceId, int width, int height, int period, int priority) -{ - _AppWidgetContext* pAppWidgetContext = new (std::nothrow)_AppWidgetContext(this, userInfo, providerId, instanceId, width, height, period, priority); - SysTryReturn(NID_SHELL, pAppWidgetContext, 0, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]"); - - __appWidgetContextList.Add(pAppWidgetContext->GetInstanceId(), pAppWidgetContext); - pAppWidgetContext->OnAdded(); - - SysSecureLog(NID_SHELL, "%ls, %ls, count(%d)", pAppWidgetContext->GetProviderId().GetPointer(), pAppWidgetContext->GetInstanceId().GetPointer(), __appWidgetContextList.GetCount()); - return pAppWidgetContext; -} - -result -_AppContext::RemoveAppWidget(const Tizen::Base::String& instanceId, bool isTriggeredByViewer) -{ - _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId); - SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND]"); - - __appWidgetContextList.Remove(instanceId); - - result r = pAppWidgetContext->OnRemoved(isTriggeredByViewer); - SysTryLog(NID_SHELL, !IsFailed(r), "Failed to execute OnRemoved."); - - delete pAppWidgetContext; - - SysLog(NID_SHELL, "AppWidget(%ls, %ls) is removed. remain count(%d)", pAppWidgetContext->GetProviderId().GetPointer(), instanceId.GetPointer(), __appWidgetContextList.GetCount()); - return E_SUCCESS; -} - -_ConnectionState -_AppContext::GetConnectionState(void) const -{ - return __connectionState; -} - -void -_AppContext::SetConnectionState(_ConnectionState state) -{ - __connectionState = state; -} - -Tizen::App::AppId -_AppContext::GetAppId(void) const -{ - return __appId; -} - -int -_AppContext::GetClientId(void) const -{ - return __ipcClientId; -} - -void -_AppContext::OnIpcConnected(int clientId) -{ - __ipcClientId = clientId; - SetConnectionState(CONNECTION_STATE_CONNECTED); -} - -void -_AppContext::OnIpcDisconnected(void) -{ - __ipcClientId = -1; - SetConnectionState(CONNECTION_STATE_DISCONNECTED); - - unique_ptr< IMapEnumeratorT > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN()); - SysTryReturnVoidResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, ""); - - _AppWidgetContext* pAppWidgetContext = null; - while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS) - { - pAppWidgetContextEnum->GetValue(pAppWidgetContext); - if (pAppWidgetContext) - { - pAppWidgetContext->OnDisconnected(); - } - } -} - -void -_AppContext::SetWaitingStatus(bool status) -{ - __isWaitingResult = status; -} - -bool -_AppContext::GetWaitingStatus(void) const -{ - return __isWaitingResult; -} - -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 > 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 > 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 > 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 > 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; -} - - - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// _AppWidgetContext class -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -_AppWidgetContext::_AppWidgetContext(_AppContext* pAppContext, const String& userInfo, const String& providerId, const String& instanceId, int width, int height, int period, int priority) - :__isRemoteBufferProxyCreated(false) - ,__hasPendingRequest(false) - ,__isForeground(true) +_AppWidgetContext::_AppWidgetContext(_AppContext* pAppContext, const String& instanceId, const String& providerId, int width, int height, const Tizen::Base::String& userInfo, int period, int priority) + :__instanceId(instanceId) + ,__providerId(providerId) + ,__appId(_AppWidgetHelper::ExtractAppId(providerId)) + ,__providerName(_AppWidgetHelper::ExtractProviderName(providerId)) + ,__userInfo(userInfo) ,__width(width) ,__height(height) ,__priority(priority) - ,__ipcClientId(-1) ,__updateMillis( (period > UPDATE_PERIOD_MSEC_MIN) ? period : UPDATE_PERIOD_MSEC_MIN ) + ,__ipcClientId(-1) + ,__isForeground(true) + ,__isRemoteBufferProxyCreated(false) ,__lastUpdatedTime(0) - ,__userInfo(userInfo) - ,__providerId(providerId) - ,__instanceId(instanceId) + ,__hasPendingRequest(false) ,__pAppContext(pAppContext) ,__pAppWidgetPopup(null) ,__pAppWidgetRemoteBuffer(null) ,__pPendingTouchEventList(null) { - _AppWidgetManagerImpl::ExtractAppIdAndProviderName(providerId, __appId, __providerName);//TODO: extract this line to outside SysSecureLog(NID_SHELL, "appId(%ls), providerId(%ls), instanceId(%ls), width(%d), height(%d), priority(%d), period(%d)", __appId.GetPointer(), __providerId.GetPointer(), __instanceId.GetPointer(), __width, __height, __priority, __updateMillis); // for updating period @@ -486,19 +180,7 @@ _AppWidgetContext::OnUpdate(const String& argument) SysLog(NID_SHELL, "argument(%ls)", argument.GetPointer()); ClearLastResult(); - // Queueing the pointer of background context. - if (!this->IsForeground()) - { - // Saving the data - if (!argument.IsEmpty()) - { - __pendingArgument = argument; - } - - __hasPendingRequest = true; - SysLog(NID_SHELL, "Update is requested but the %ls is background.", (this->GetAppId()).GetPointer()); - } - else + if (this->IsForeground()) { result r = this->SendUpdateRequest(GetWidth(), GetHeight(), argument); SysTryLog(NID_SHELL, !IsFailed(r), "Failed to execute SendUpdateRequest."); @@ -509,21 +191,21 @@ _AppWidgetContext::OnUpdate(const String& argument) __hasPendingRequest = false; __pendingArgument.Clear(); } -} - -void -_AppWidgetContext::OnResize(int width, int height) -{ - SysSecureLog(NID_SHELL, "appId(%ls), instanceId(%ls), width(%d), height(%d), priority(%d)", GetProviderId().GetPointer(), GetInstanceId().GetPointer(), GetWidth(), GetHeight(), GetPriority()); - - SetWidth(width); - SetHeight(height); + else + { + // Queueing the pointer of background context. + if (!argument.IsEmpty()) + { + __pendingArgument = argument; + } - SendResizeRequest(width, height); + __hasPendingRequest = true; + SysLog(NID_SHELL, "Update is requested but the %ls is background.", (this->GetProviderId()).GetPointer()); + } } result -_AppWidgetContext::RequestUpdate(const String& argument) +_AppWidgetContext::OnUpdateAsync(const String& argument) { ArrayList* pArray = new (std::nothrow) ArrayList(); SysTryReturnResult(NID_SHELL, pArray, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]"); @@ -539,6 +221,17 @@ _AppWidgetContext::RequestUpdate(const String& argument) return E_SUCCESS; } +void +_AppWidgetContext::OnResize(int width, int height) +{ + SysSecureLog(NID_SHELL, "appId(%ls), instanceId(%ls), width(%d), height(%d), priority(%d)", GetProviderId().GetPointer(), GetInstanceId().GetPointer(), GetWidth(), GetHeight(), GetPriority()); + + SetWidth(width); + SetHeight(height); + + SendResizeRequest(width, height); +} + void _AppWidgetContext::OnForeground(void) { @@ -548,12 +241,12 @@ _AppWidgetContext::OnForeground(void) return; } - this->SetForeground(true); + __isForeground = true; if (__hasPendingRequest == true) { SysLog(NID_SHELL, "There is pending update request."); -// RequestUpdate(__pendingArgument); +// OnUpdateAsync(__pendingArgument); OnUpdate(__pendingArgument); } else @@ -561,7 +254,7 @@ _AppWidgetContext::OnForeground(void) if (IsUpdatePeriodExpired() == true) { SysLog(NID_SHELL, "The period is expired."); -// RequestUpdate(L""); +// OnUpdateAsync(L""); OnUpdate(L""); } } @@ -595,7 +288,7 @@ _AppWidgetContext::OnBackground(void) } SysLog(NID_SHELL, "OnBackground"); - SetForeground(false); + __isForeground = false; } void @@ -614,7 +307,6 @@ _AppWidgetContext::OnPopupDestoyed(void) if (__pAppWidgetPopup) { -// __pAppWidgetPopup->OnPopupDestoyed(); delete __pAppWidgetPopup; __pAppWidgetPopup = null; } @@ -679,7 +371,7 @@ _AppWidgetContext::OnTouchEventReceived(buffer_event event, double timestamp, do { __pPendingTouchEventList->Add(new (nothrow) PendingTouchEvent(event, timestamp, x, y)); - if( AppManager::GetInstance()->IsRunning(this->GetAppId() ) == false || + if( _AppManagerImpl::GetInstance()->IsRunning(this->GetAppId() ) == false || ( __pAppContext->GetConnectionState() == CONNECTION_STATE_CONNECTED && __isRemoteBufferProxyCreated == false)) { SysLog(NID_SHELL, "request to start AppControl"); @@ -816,12 +508,6 @@ _AppWidgetContext::GetProviderName(void) const return __providerName; } -void -_AppWidgetContext::SetForeground(bool foreground) -{ - __isForeground = foreground; -} - bool _AppWidgetContext::IsForeground(void) const { diff --git a/src/FShell_AppWidgetManagerService.cpp b/src/FShell_AppWidgetManagerService.cpp index 7127d35..65fe7ba 100644 --- a/src/FShell_AppWidgetManagerService.cpp +++ b/src/FShell_AppWidgetManagerService.cpp @@ -36,7 +36,6 @@ #include "FShell_AppWidgetContext.h" #include "FShell_AppWidgetPopupContext.h" -#include "FShell_AppWidgetManagerStub.h" #include "FShell_AppWidgetManagerService.h" #include "FShell_TemplateUtil.h" @@ -158,18 +157,6 @@ AppWidgetManagerService::OnTimerExpired(Timer& timer) provider_send_ping(); } -AppId -AppWidgetManagerService::ExtractAppId(const String& providerId) -{ - int index = 0; - result r = providerId.IndexOf(".", 12, index);//"1234567890._" - SysTryReturn(NID_SHELL, !IsFailed(r), L"", E_INVALID_ARG, "[E_INVALID_ARG] Failed to get the index from providerId(%ls).", providerId.GetPointer() ); - - String appId; - providerId.SubString(0, index, appId); - return appId; -} - _AppWidgetContext* AppWidgetManagerService::FindAppWidget(const AppId& appId, const String& instanceId) const { @@ -289,7 +276,7 @@ AppWidgetManagerService::OnAppWidgetUpdate(struct event_arg *arg, void* data) } else { - _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->FindAppWidget(ExtractAppId(arg->pkgname), arg->id); + _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->FindAppWidget(_AppWidgetHelper::ExtractAppId(arg->pkgname), arg->id); SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id); pAppWidgetContext->OnUpdate(L""); @@ -305,7 +292,7 @@ AppWidgetManagerService::OnAppWidgetDestroy(struct event_arg *arg, void* data) SysLog(NID_SHELL, "Enter"); _AppContext* pAppContext = null; - result r = AppWidgetManagerService::GetInstance()->__appContextList.GetValue(ExtractAppId(arg->pkgname), pAppContext); + result r = AppWidgetManagerService::GetInstance()->__appContextList.GetValue(_AppWidgetHelper::ExtractAppId(arg->pkgname), pAppContext); SysTryReturn(NID_SHELL, !IsFailed(r), null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND]"); pAppContext->RemoveAppWidget(arg->id); @@ -320,7 +307,7 @@ AppWidgetManagerService::OnAppWidgetPopupCreate(struct event_arg *arg, void* dat SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_PD_CREATE, -EPERM, E_SUCCESS, "invalid argument from master"); 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); - _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->FindAppWidget(ExtractAppId(arg->pkgname), arg->id); + _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->FindAppWidget(_AppWidgetHelper::ExtractAppId(arg->pkgname), arg->id); SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id); pAppWidgetContext->OnPopupCreated(arg->info.pd_create.x, arg->info.pd_create.y, arg->info.pd_create.w, arg->info.pd_create.h); @@ -332,7 +319,7 @@ AppWidgetManagerService::OnAppWidgetPopupCreate(struct event_arg *arg, void* dat AppWidgetManagerService::OnAppWidgetPopupDestroy(struct event_arg *arg, void* data) { SysTryReturn (NID_SHELL, arg->type == event_arg::EVENT_PD_DESTROY, -EPERM, E_SUCCESS, "invalid argument from master"); - _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->FindAppWidget(ExtractAppId(arg->pkgname), arg->id); + _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->FindAppWidget(_AppWidgetHelper::ExtractAppId(arg->pkgname), arg->id); SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id); SysSecureLog(NID_SHELL, "providerId(%s), id(%s)", arg->pkgname, arg->id); @@ -346,7 +333,7 @@ AppWidgetManagerService::OnAppWidgetBackground(struct event_arg *arg, void* data { SysTryReturn(NID_SHELL, arg, 0, E_SUCCESS, "arg is null!"); - _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->FindAppWidget(ExtractAppId(arg->pkgname), arg->id); + _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->FindAppWidget(_AppWidgetHelper::ExtractAppId(arg->pkgname), arg->id); SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , 0, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id); SysSecureLog(NID_SHELL, "providerId(%s), id(%s)", arg->pkgname, arg->id); @@ -381,7 +368,7 @@ AppWidgetManagerService::OnAppWidgetForeground(struct event_arg *pArg, void* pDa SysTryReturn(NID_SHELL, pArg || pArg->id || pArg->pkgname, 0, E_SUCCESS, "pArg is null!"); SysSecureLog(NID_SHELL, "providerId(%s), id(%s)", pArg->pkgname, pArg->id); - _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->FindAppWidget(ExtractAppId(pArg->pkgname), pArg->id); + _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->FindAppWidget(_AppWidgetHelper::ExtractAppId(pArg->pkgname), pArg->id); SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", pArg->pkgname, pArg->id); pAppWidgetContext->OnForeground(); @@ -427,7 +414,7 @@ AppWidgetManagerService::OnAppWidgetResize(struct event_arg *arg, void* data) 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); - _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->FindAppWidget(ExtractAppId(arg->pkgname), arg->id); + _AppWidgetContext* pAppWidgetContext = AppWidgetManagerService::GetInstance()->FindAppWidget(_AppWidgetHelper::ExtractAppId(arg->pkgname), arg->id); SysSecureTryReturnResult(NID_SHELL, pAppWidgetContext , E_SYSTEM, "[E_SYSTEM] pAppWidgetContext is null for providerId(%s), instanceId(%s)", arg->pkgname, arg->id); pAppWidgetContext->OnResize(arg->info.resize.w, arg->info.resize.h); @@ -528,7 +515,7 @@ AppWidgetManagerService::RequestUpdateAllSuspened(void) const _AppContext* pAppContext = null; pAppContextEnum->GetValue(pAppContext); - if ( pAppContext && AppManager::GetInstance()->IsRunning(pAppContext->GetAppId()) == false ) + if ( pAppContext && _AppManagerImpl::GetInstance()->IsRunning(pAppContext->GetAppId()) == false ) { pAppContext->RequestUpdate(L"", L""); } @@ -547,7 +534,7 @@ AppWidgetManagerService::RequestUpdateInstance(const Tizen::App::AppId& appId, c _AppWidgetContext* pAppWidgetContext = FindAppWidget(appId, instanceId); SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find the object(%ls).", instanceId.GetPointer()); - pAppWidgetContext->RequestUpdate(argument); + pAppWidgetContext->OnUpdateAsync(argument); return E_SUCCESS; } @@ -694,4 +681,29 @@ AppWidgetManagerService::OnUserEventReceivedN(RequestId reqId, IList* pArgs) SysLog(NID_SHELL, "Exit."); } +// _AppWidgetHelper +AppId +_AppWidgetHelper::ExtractAppId(const String& providerId) +{ + int indexOfSecondDot = 0; + result r = providerId.IndexOf(".", 12, indexOfSecondDot);//"1234567890._" + SysTryReturn(NID_SHELL, !IsFailed(r), L"", E_INVALID_ARG, "[E_INVALID_ARG] Failed to get the index from providerId(%ls).", providerId.GetPointer() ); + + String appId; + providerId.SubString(0, indexOfSecondDot, appId); + return appId; +} + +String +_AppWidgetHelper::ExtractProviderName(const String& providerId) +{ + int indexOfSecondDot = 0; + result r = providerId.IndexOf(".", 12, indexOfSecondDot);//"1234567890._" + SysTryReturn(NID_SHELL, !IsFailed(r), L"", E_INVALID_ARG, "[E_INVALID_ARG] Failed to get the index from providerId(%ls).", providerId.GetPointer() ); + + String providerName; + providerId.SubString(indexOfSecondDot + 1, providerName); + return providerName; +} + }}} // Tizen::Shell::App