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_AppWidgetContext.cpp
19 * @brief This is the implementation for the _AppWidgetContext class.
23 #include <unique_ptr.h>
25 #include <FBaseSysLog.h>
27 #include <FApp_AppManagerImpl.h>
28 #include "FShell_AppWidgetContext.h"
29 #include "FShell_AppWidgetContextHelper.h"
30 #include "FShell_TemplateUtil.h"
32 namespace Tizen { namespace Shell { namespace App
36 using namespace Tizen::App;
37 using namespace Tizen::Base;
38 using namespace Tizen::Base::Collection;
39 using namespace Tizen::System;
41 static const wchar_t INVALID_INSTANCE[] = L"file://invalid instance id";
43 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
45 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
46 _AppContext::_AppContext(const AppId& appId)
48 ,__isWaitingResult(false)
50 ,__connectionState(CONNECTION_STATE_NONE)
51 ,__pPendingEventList(null)
54 __pPendingEventList = new (nothrow) ArrayListT<PendingEvent*>();
55 SysTryReturnVoidResult(NID_SHELL, __pPendingEventList, E_OUT_OF_MEMORY, "");
57 result r = __pPendingEventList->Construct();
58 SysTryReturnVoidResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute Construct.");
60 r = __appWidgetContexts.Construct();
61 SysTryReturnVoidResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute Construct.");
63 SysLog(NID_SHELL, "Constructed.");
66 _AppContext::~_AppContext(void)
68 SysLog(NID_SHELL, "Enter");
70 if (__pPendingEventList)
72 for (int i = 0; i < __pPendingEventList->GetCount(); i++)
74 PendingEvent* pEvent = null;
75 __pPendingEventList->GetAt(i, pEvent);
78 __pPendingEventList->RemoveAll();
79 delete __pPendingEventList;
82 IMapEnumeratorT<String, _AppWidgetContext*>* pMapEnum = __appWidgetContexts.GetMapEnumeratorN();
85 while (pMapEnum->MoveNext() == E_SUCCESS)
87 _AppWidgetContext* pAppWidgetContext = null;
88 pMapEnum->GetValue(pAppWidgetContext);
89 delete pAppWidgetContext;
95 SysLog(NID_SHELL, "Exit");
99 _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)
101 _AppWidgetContext* pAppWidgetContext = null;
102 bool containsKey = false;
104 __appWidgetContexts.ContainsKey(instanceId, containsKey);
105 if (containsKey == true)
107 SysSecureLog(NID_SHELL, "The appwidget(%ls) is already exist, so requesting to update.", instanceId.GetPointer() );
109 __appWidgetContexts.GetValue(instanceId, pAppWidgetContext);
110 pAppWidgetContext->OnUpdate(L"");
114 pAppWidgetContext = new (std::nothrow)_AppWidgetContext(this, instanceId, providerId, width, height, userInfo, period, priority);
115 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OUT_OF_MEMORY, "");
117 __appWidgetContexts.Add(instanceId, pAppWidgetContext);
118 pAppWidgetContext->OnAdded();
120 SysSecureLog(NID_SHELL, "%ls, %ls, count(%d)", pAppWidgetContext->GetProviderId().GetPointer(), pAppWidgetContext->GetInstanceId().GetPointer(), __appWidgetContexts.GetCount());
126 _AppContext::UpdateAppWidget(const Tizen::Base::String& instanceId)
128 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
129 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
131 pAppWidgetContext->OnUpdate(L"");
137 _AppContext::ResizeAppWidget(const Tizen::Base::String& instanceId, int width, int height)
139 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
140 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
142 pAppWidgetContext->OnResize(width, height);
148 _AppContext::CreateAppWidgetPopup(const Tizen::Base::String& instanceId, double x, double y, int width, int height)
150 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
151 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
153 pAppWidgetContext->OnPopupCreated(x, y, width, height);
159 _AppContext::DestroyAppWidget(const Tizen::Base::String& instanceId, bool isTriggeredByViewer)
161 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
162 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
164 __appWidgetContexts.Remove(instanceId);
166 result r = pAppWidgetContext->OnRemoved(isTriggeredByViewer);
167 SysTryLog(NID_SHELL, !IsFailed(r), "Failed to execute OnRemoved.");
169 delete pAppWidgetContext;
171 SysLog(NID_SHELL, "AppWidget(%ls) is removed. remain count(%d)", instanceId.GetPointer(), __appWidgetContexts.GetCount());
176 _AppContext::DestroyAppWidgetPopup(const Tizen::Base::String& instanceId)
178 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
179 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
181 pAppWidgetContext->OnPopupDestoyed();
187 _AppContext::GetConnectionState(void) const
189 return __connectionState;
193 _AppContext::SetConnectionState(_ConnectionState state)
195 SysLog(NID_SHELL, "state transition has occurred: %ls -> %ls", GetConnectionStateString(__connectionState), GetConnectionStateString(state));
196 __connectionState = state;
200 _AppContext::GetConnectionStateString(_ConnectionState state)
202 static const wchar_t* const connectionStateStringArray[] =
210 return connectionStateStringArray[state];
214 _AppContext::GetAppId(void) const
220 _AppContext::GetClientId(void) const
222 return __ipcClientId;
226 _AppContext::OnIpcConnected(int clientId)
228 __ipcClientId = clientId;
229 SetConnectionState(CONNECTION_STATE_CONNECTED);
233 _AppContext::OnIpcDisconnected(void)
236 SetConnectionState(CONNECTION_STATE_DISCONNECTED);
238 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContexts.GetMapEnumeratorN());
239 SysTryReturnVoidResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "");
241 _AppWidgetContext* pAppWidgetContext = null;
242 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
244 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
245 if (pAppWidgetContext)
247 pAppWidgetContext->OnDisconnected();
253 _AppContext::OnApplicationTerminated(void)
255 if (GetWaitingStatus() == true )
257 SysLog(NID_SHELL, "The application (%ls) is terminated without response.", __appId.GetPointer() );
258 SetWaitingStatus(false);
260 if (GetConnectionState() == CONNECTION_STATE_CONNECTING)
262 SysLog(NID_SHELL, "The application (%ls) is terminated before IPC connected, resetting connection state.", __appId.GetPointer() );
263 SetConnectionState(CONNECTION_STATE_DISCONNECTED);
269 _AppContext::SetWaitingStatus(bool status)
271 __isWaitingResult = status;
275 _AppContext::GetWaitingStatus(void) const
277 return __isWaitingResult;
281 _AppContext::SendRequestToApp(const AppId& providerAppId, const String& operation, HashMap* pArgs)
283 result r = E_SUCCESS;
285 const _ConnectionState connectionState = GetConnectionState();
286 SysLog(NID_SHELL, "Connection(%ls), Waiting response(%d)", GetConnectionStateString(connectionState), GetWaitingStatus() ? "true":"false");
288 if (connectionState == CONNECTION_STATE_NONE || connectionState == CONNECTION_STATE_DISCONNECTED)
290 const _ConnectionState oldConnectionState = connectionState;
291 SetConnectionState(CONNECTION_STATE_CONNECTING);
292 r = _AppWidgetRequestHelper::SendAppControlRequest(providerAppId, operation, pArgs);
293 pArgs->RemoveAll(true);
296 SysTryCatch(NID_SHELL, !IsFailed(r), , r, "[%s] Failed to SendRequestToApp", GetErrorMessage(r));
298 SetWaitingStatus(true);
302 SetConnectionState(oldConnectionState);
307 if (GetWaitingStatus() == true || GetConnectionState() == CONNECTION_STATE_CONNECTING)
309 SysLog(NID_SHELL, "Queueing the request (%ls).", operation.GetPointer() );
310 __pPendingEventList->Add(new (nothrow) PendingEvent(operation, pArgs));
314 r = _AppWidgetRequestHelper::SendIpcRequest(GetClientId(), operation, pArgs);
315 pArgs->RemoveAll(true);
317 SysTryReturn(NID_SHELL, !IsFailed(r), r, r, "[%s] Failed to SendRequestToApp", GetErrorMessage(r));
319 SetWaitingStatus(true);
327 _AppContext::SendPendingEvent(void)
329 SetWaitingStatus(false);
330 TryReturn(__pPendingEventList->GetCount() > 0, E_DATA_NOT_FOUND, "No pending event.");
332 PendingEvent* pEvent = null;
333 __pPendingEventList->GetAt(0, pEvent);
334 __pPendingEventList->RemoveAt(0);
335 SysLog(NID_SHELL, "(%d) pending event(s) remains.", __pPendingEventList->GetCount());
337 result r = _AppWidgetRequestHelper::SendIpcRequest(GetClientId(), pEvent->operation, pEvent->pArgs);
339 SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "SendIpcRequest failed.");
345 _AppContext::RequestUpdateInstance(const Tizen::Base::String& instanceId, const Tizen::Base::String& argument)
347 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
348 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
350 return pAppWidgetContext->OnUpdateAsync(this, argument);
354 _AppContext::AcquireRemoteBuffer(const Tizen::Base::String& instanceId, int width, int height, int& bufferId)
356 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
357 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
359 bufferId = pAppWidgetContext->AcquireRemoteBuffer(width, height);
365 _AppContext::AcquireRemoteBufferForPD(const Tizen::Base::String& instanceId, int width, int height, int& bufferId)
367 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
368 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
370 bufferId = pAppWidgetContext->AcquireRemoteBufferForPD(width, height);
376 _AppContext::SyncRemoteBuffer(const Tizen::Base::String& instanceId, int width, int height)
378 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
379 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
381 return pAppWidgetContext->SyncRemoteBuffer(width, height);
385 _AppContext::SyncRemoteBufferForPD(const Tizen::Base::String& instanceId)
387 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
388 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
390 return pAppWidgetContext->SyncRemoteBufferForPD();
394 _AppContext::SendAccessStatus(const Tizen::Base::String& instanceId, int accessStatus)
396 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
397 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
399 return pAppWidgetContext->SendAccessStatus(accessStatus);
403 _AppContext::FindAppWidget(const String& instanceId) const
405 _AppWidgetContext* pAppWidgetContext = null;
407 if (instanceId == INVALID_INSTANCE)
409 pAppWidgetContext = FindInvalidAppWidget();
413 result r = __appWidgetContexts.GetValue(instanceId, pAppWidgetContext);
414 SysTryReturn(NID_SHELL, !IsFailed(r), null, E_OBJ_NOT_FOUND, "instanceId(%ls) is not found", instanceId.GetPointer() );
416 return pAppWidgetContext;
420 _AppContext::FindInvalidAppWidget(void) const
422 SysTryReturn(NID_SHELL, GetConnectionState() == CONNECTION_STATE_NONE, null, E_INVALID_STATE, "[E_INVALID_STATE] connectionState(%d)", GetConnectionState());
424 _AppWidgetContext* pAppWidgetContext = null;
425 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContexts.GetMapEnumeratorN());
426 SysTryReturn(NID_SHELL, pAppWidgetContextEnum, null, E_SYSTEM, "");
428 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
430 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
431 if (pAppWidgetContext)
433 //TODO: check whether this app context has only one instance of _AppWidgetContext
434 return pAppWidgetContext;
441 _AppContext::GetProviderCount(void) const
443 return __appWidgetContexts.GetCount();
447 _AppContext::RequestUpdate(const Tizen::Base::String& providerName, const Tizen::Base::String& argument)
449 SysLog(NID_SHELL, "Enter.");
452 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContexts.GetMapEnumeratorN());
453 SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "Failed to invoke __appWidgetContexts.GetMapEnumeratorN()");
455 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
457 _AppWidgetContext* pAppWidgetContext = null;
458 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
460 if (pAppWidgetContext->GetProviderName() == providerName)
462 pAppWidgetContext->OnUpdateAsync(this, argument);
467 SysLog(NID_SHELL, "Exit.");
468 return (found) ? E_SUCCESS : E_OBJ_NOT_FOUND;
472 _AppContext::RequestUpdateAllInactiveted(void)
474 SysLog(NID_SHELL, "Exit.");
475 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContexts.GetMapEnumeratorN());
476 SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "Failed to invoke __appWidgetContexts.GetMapEnumeratorN()");
478 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
480 _AppWidgetContext* pAppWidgetContext = null;
481 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
483 if (pAppWidgetContext->IsActive() == false)
485 pAppWidgetContext->OnUpdateAsync(this, L"");
489 SysLog(NID_SHELL, "Exit.");
494 _AppContext::OnAppWidgetBackground(const Tizen::Base::String& instanceId)
496 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
497 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
499 pAppWidgetContext->OnBackground();
505 _AppContext::OnAppWidgetBackgroundAll(void)
507 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContexts.GetMapEnumeratorN());
508 SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "Failed to invoke GetMapEnumeratorN()");
510 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
512 _AppWidgetContext* pAppWidgetContext = null;
513 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
514 if (pAppWidgetContext)
516 pAppWidgetContext->OnBackground();
524 _AppContext::OnAppWidgetForeground(const Tizen::Base::String& instanceId)
526 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
527 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
529 pAppWidgetContext->OnForeground();
535 _AppContext::OnAppWidgetForegroundAll(void)
537 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContexts.GetMapEnumeratorN());
538 SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "Failed to invoke GetMapEnumeratorN()");
540 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
542 _AppWidgetContext* pAppWidgetContext = null;
543 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
544 if (pAppWidgetContext)
546 pAppWidgetContext->OnForeground();
554 _AppContext::HandleUserEvent(Tizen::Base::Collection::IList* pArgs)
556 _AppWidgetContext* pAppWidgetContext = dynamic_cast<_AppWidgetContext*>( pArgs->GetAt(1) );
557 SysTryReturnVoidResult(NID_SHELL, pAppWidgetContext != null, E_INVALID_STATE, "_AppWidget is null!.");
559 String* pArgument = dynamic_cast<String*>( pArgs->GetAt(2) );
560 SysTryReturnVoidResult(NID_SHELL, pArgument != null, E_INVALID_STATE, "pArgument is null!.");
562 pAppWidgetContext->OnUpdate(*pArgument);
565 }}} // Tizen::Shell::App