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>
26 #include <FBaseColHashMap.h>
27 #include <FBaseColIMapEnumeratorT.h>
29 #include <FBaseComparerT.h>
30 #include <FApp_AppManagerImpl.h>
31 #include "FShell_AppWidgetContext.h"
32 #include "FShell_AppWidgetContextHelper.h"
33 #include "FShell_TemplateUtil.h"
35 namespace Tizen { namespace Shell { namespace App
39 using namespace Tizen::App;
40 using namespace Tizen::Base;
41 using namespace Tizen::Base::Collection;
42 using namespace Tizen::System;
44 static const wchar_t INVALID_INSTANCE[] = L"file://invalid instance id";
46 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
48 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
49 _AppContext::_AppContext(const AppId& appId)
51 ,__isWaitingResult(false)
53 ,__connectionState(CONNECTION_STATE_NONE)
54 ,__pPendingEventList(null)
57 __pPendingEventList = new (nothrow) ArrayListT<PendingEvent*>();
58 SysTryReturnVoidResult(NID_SHELL, __pPendingEventList, E_OUT_OF_MEMORY, "");
60 result r = __pPendingEventList->Construct();
61 SysTryReturnVoidResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute Construct.");
63 r = __appWidgetContextList.Construct();
64 SysTryReturnVoidResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute Construct.");
67 _AppContext::~_AppContext(void)
69 SysLog(NID_SHELL, "Enter");
71 if (__pPendingEventList)
73 for (int i = 0; i < __pPendingEventList->GetCount(); i++)
75 PendingEvent* pEvent = null;
76 __pPendingEventList->GetAt(i, pEvent);
79 __pPendingEventList->RemoveAll();
80 delete __pPendingEventList;
83 IMapEnumeratorT<String, _AppWidgetContext*>* pMapEnum = __appWidgetContextList.GetMapEnumeratorN();
86 while (pMapEnum->MoveNext() == E_SUCCESS)
88 _AppWidgetContext* pAppWidgetContext = null;
89 pMapEnum->GetValue(pAppWidgetContext);
90 delete pAppWidgetContext;
96 SysLog(NID_SHELL, "Exit");
100 _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)
102 _AppWidgetContext* pAppWidgetContext = null;
103 bool containsKey = false;
105 __appWidgetContextList.ContainsKey(instanceId, containsKey);
106 if (containsKey == true)
108 SysSecureLog(NID_SHELL, "The appwidget(%ls) is already exist, so requesting to update.", instanceId.GetPointer() );
110 __appWidgetContextList.GetValue(instanceId, pAppWidgetContext);
111 pAppWidgetContext->OnUpdate(L"");
115 pAppWidgetContext = new (std::nothrow)_AppWidgetContext(this, instanceId, providerId, width, height, userInfo, period, priority);
116 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OUT_OF_MEMORY, "");
118 __appWidgetContextList.Add(instanceId, pAppWidgetContext);
119 pAppWidgetContext->OnAdded();
121 SysSecureLog(NID_SHELL, "%ls, %ls, count(%d)", pAppWidgetContext->GetProviderId().GetPointer(), pAppWidgetContext->GetInstanceId().GetPointer(), __appWidgetContextList.GetCount());
127 _AppContext::UpdateAppWidget(const Tizen::Base::String& instanceId)
129 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
130 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
132 pAppWidgetContext->OnUpdate(L"");
138 _AppContext::ResizeAppWidget(const Tizen::Base::String& instanceId, int width, int height)
140 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
141 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
143 pAppWidgetContext->OnResize(width, height);
149 _AppContext::CreateAppWidgetPopup(const Tizen::Base::String& instanceId, double x, double y, int width, int height)
151 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
152 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
154 pAppWidgetContext->OnPopupCreated(x, y, width, height);
160 _AppContext::DestroyAppWidget(const Tizen::Base::String& instanceId, bool isTriggeredByViewer)
162 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
163 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
165 __appWidgetContextList.Remove(instanceId);
167 result r = pAppWidgetContext->OnRemoved(isTriggeredByViewer);
168 SysTryLog(NID_SHELL, !IsFailed(r), "Failed to execute OnRemoved.");
170 delete pAppWidgetContext;
172 SysLog(NID_SHELL, "AppWidget(%ls) is removed. remain count(%d)", instanceId.GetPointer(), __appWidgetContextList.GetCount());
177 _AppContext::DestroyAppWidgetPopup(const Tizen::Base::String& instanceId)
179 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
180 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
182 pAppWidgetContext->OnPopupDestoyed();
188 _AppContext::GetConnectionState(void) const
190 return __connectionState;
194 _AppContext::SetConnectionState(_ConnectionState state)
196 __connectionState = state;
200 _AppContext::GetAppId(void) const
206 _AppContext::GetClientId(void) const
208 return __ipcClientId;
212 _AppContext::OnIpcConnected(int clientId)
214 __ipcClientId = clientId;
215 SetConnectionState(CONNECTION_STATE_CONNECTED);
219 _AppContext::OnIpcDisconnected(void)
222 SetConnectionState(CONNECTION_STATE_DISCONNECTED);
224 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
225 SysTryReturnVoidResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "");
227 _AppWidgetContext* pAppWidgetContext = null;
228 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
230 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
231 if (pAppWidgetContext)
233 pAppWidgetContext->OnDisconnected();
239 _AppContext::SetWaitingStatus(bool status)
241 __isWaitingResult = status;
245 _AppContext::GetWaitingStatus(void) const
247 return __isWaitingResult;
251 _AppContext::SendRequestToApp(const AppId& providerAppId, const String& operation, HashMap* pArgs)
253 result r = E_SUCCESS;
255 if (GetConnectionState() == CONNECTION_STATE_NONE || GetConnectionState() == CONNECTION_STATE_DISCONNECTED)
257 SysLog(NID_SHELL, "The application is not running.");
258 result r = _AppWidgetRequestHelper::SendAppControlRequest(providerAppId, operation, pArgs);
259 SysTryReturn(NID_SHELL, !IsFailed(r), r, r, "[%s] Failed to SendRequestToApp", GetErrorMessage(r));
261 SetWaitingStatus(true);
262 SetConnectionState(CONNECTION_STATE_CONNECTING);
266 if (GetConnectionState() == CONNECTION_STATE_CONNECTING || GetWaitingStatus() == true)
268 SysLog(NID_SHELL, "The application is running but IPC is not connected yet.");
269 __pPendingEventList->Add(new (nothrow) PendingEvent(operation, pArgs));
273 SysLog(NID_SHELL, "The application is running and IPC is connected.");
274 r = _AppWidgetRequestHelper::SendIpcRequest(GetClientId(), operation, pArgs);
276 pArgs->RemoveAll(true);
278 SetWaitingStatus(true);
286 _AppContext::SendPendingEvent(void)
288 SetWaitingStatus(false);
289 TryReturn(__pPendingEventList->GetCount() > 0, E_DATA_NOT_FOUND, "This context has no pending event. Please find next pending event context.");
291 PendingEvent* pEvent = null;
292 __pPendingEventList->GetAt(0, pEvent);
293 __pPendingEventList->RemoveAt(0);
294 SysLog(NID_SHELL, "(%d) Remains in __pPendingEventList.", __pPendingEventList->GetCount());
296 result r = _AppWidgetRequestHelper::SendIpcRequest(GetClientId(), pEvent->operation, pEvent->pArg);
298 SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "SendIpcRequest failed.");
304 _AppContext::RequestUpdateInstance(const Tizen::Base::String& instanceId, const Tizen::Base::String& argument)
306 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
307 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
309 return pAppWidgetContext->OnUpdateAsync(this, argument);
313 _AppContext::AcquireRemoteBuffer(const Tizen::Base::String& instanceId, int width, int height, int& bufferId)
315 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
316 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
318 bufferId = pAppWidgetContext->AcquireRemoteBuffer(width, height);
324 _AppContext::AcquireRemoteBufferForPD(const Tizen::Base::String& instanceId, int width, int height, int& bufferId)
326 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
327 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
329 bufferId = pAppWidgetContext->AcquireRemoteBufferForPD(width, height);
335 _AppContext::SyncRemoteBuffer(const Tizen::Base::String& instanceId, int width, int height)
337 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
338 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
340 return pAppWidgetContext->SyncRemoteBuffer(width, height);
344 _AppContext::SyncRemoteBufferForPD(const Tizen::Base::String& instanceId)
346 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
347 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
349 return pAppWidgetContext->SyncRemoteBufferForPD();
353 _AppContext::SendAccessStatus(const Tizen::Base::String& instanceId, int accessStatus)
355 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
356 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
358 return pAppWidgetContext->SendAccessStatus(accessStatus);
362 _AppContext::FindAppWidget(const String& instanceId) const
364 _AppWidgetContext* pAppWidgetContext = null;
366 if (instanceId == INVALID_INSTANCE)
368 pAppWidgetContext = FindInvalidAppWidget();
372 result r = __appWidgetContextList.GetValue(instanceId, pAppWidgetContext);
373 SysTryReturn(NID_SHELL, !IsFailed(r), null, E_OBJ_NOT_FOUND, "instanceId(%ls) is not found", instanceId.GetPointer() );
375 return pAppWidgetContext;
379 _AppContext::FindInvalidAppWidget(void) const
381 SysTryReturn(NID_SHELL, GetConnectionState() == CONNECTION_STATE_NONE, null, E_INVALID_STATE, "[E_INVALID_STATE] connectionState(%d)", GetConnectionState());
383 _AppWidgetContext* pAppWidgetContext = null;
384 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
385 SysTryReturn(NID_SHELL, pAppWidgetContextEnum, null, E_SYSTEM, "");
387 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
389 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
390 if (pAppWidgetContext)
392 //TODO: check whether this app context has only one instance of _AppWidgetContext
393 return pAppWidgetContext;
400 _AppContext::GetProviderCount(void) const
402 return __appWidgetContextList.GetCount();
406 _AppContext::RequestUpdate(const Tizen::Base::String& providerName, const Tizen::Base::String& argument)
408 SysLog(NID_SHELL, "Enter.");
411 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
412 SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "Failed to invoke __appWidgetContextList.GetMapEnumeratorN()");
414 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
416 _AppWidgetContext* pAppWidgetContext = null;
417 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
419 if (pAppWidgetContext->GetProviderName() == providerName)
421 pAppWidgetContext->OnUpdateAsync(this, argument);
426 SysLog(NID_SHELL, "Exit.");
427 return (found) ? E_SUCCESS : E_OBJ_NOT_FOUND;
431 _AppContext::RequestUpdateAllInactiveted(void)
433 SysLog(NID_SHELL, "Exit.");
434 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
435 SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "Failed to invoke __appWidgetContextList.GetMapEnumeratorN()");
437 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
439 _AppWidgetContext* pAppWidgetContext = null;
440 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
442 if (pAppWidgetContext->IsActive() == false)
444 pAppWidgetContext->OnUpdateAsync(this, L"");
448 SysLog(NID_SHELL, "Exit.");
453 _AppContext::OnAppWidgetBackground(const Tizen::Base::String& instanceId)
455 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
456 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
458 pAppWidgetContext->OnBackground();
464 _AppContext::OnAppWidgetBackgroundAll(void)
466 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
467 SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "Failed to invoke GetMapEnumeratorN()");
469 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
471 _AppWidgetContext* pAppWidgetContext = null;
472 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
473 if (pAppWidgetContext)
475 pAppWidgetContext->OnBackground();
483 _AppContext::OnAppWidgetForeground(const Tizen::Base::String& instanceId)
485 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
486 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
488 pAppWidgetContext->OnForeground();
494 _AppContext::OnAppWidgetForegroundAll(void)
496 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
497 SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "Failed to invoke GetMapEnumeratorN()");
499 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
501 _AppWidgetContext* pAppWidgetContext = null;
502 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
503 if (pAppWidgetContext)
505 pAppWidgetContext->OnForeground();
513 _AppContext::HandleUserEvent(Tizen::Base::Collection::IList* pArgs)
515 _AppWidgetContext* pAppWidgetContext = dynamic_cast<_AppWidgetContext*>( pArgs->GetAt(1) );
516 SysTryReturnVoidResult(NID_SHELL, pAppWidgetContext != null, E_INVALID_STATE, "_AppWidget is null!.");
518 String* pArgument = dynamic_cast<String*>( pArgs->GetAt(2) );
519 SysTryReturnVoidResult(NID_SHELL, pArgument != null, E_INVALID_STATE, "pArgument is null!.");
521 pAppWidgetContext->OnUpdate(*pArgument);
524 }}} // Tizen::Shell::App