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 = __appWidgetContextList.Construct();
61 SysTryReturnVoidResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "Failed to execute Construct.");
64 _AppContext::~_AppContext(void)
66 SysLog(NID_SHELL, "Enter");
68 if (__pPendingEventList)
70 for (int i = 0; i < __pPendingEventList->GetCount(); i++)
72 PendingEvent* pEvent = null;
73 __pPendingEventList->GetAt(i, pEvent);
76 __pPendingEventList->RemoveAll();
77 delete __pPendingEventList;
80 IMapEnumeratorT<String, _AppWidgetContext*>* pMapEnum = __appWidgetContextList.GetMapEnumeratorN();
83 while (pMapEnum->MoveNext() == E_SUCCESS)
85 _AppWidgetContext* pAppWidgetContext = null;
86 pMapEnum->GetValue(pAppWidgetContext);
87 delete pAppWidgetContext;
93 SysLog(NID_SHELL, "Exit");
97 _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)
99 _AppWidgetContext* pAppWidgetContext = null;
100 bool containsKey = false;
102 __appWidgetContextList.ContainsKey(instanceId, containsKey);
103 if (containsKey == true)
105 SysSecureLog(NID_SHELL, "The appwidget(%ls) is already exist, so requesting to update.", instanceId.GetPointer() );
107 __appWidgetContextList.GetValue(instanceId, pAppWidgetContext);
108 pAppWidgetContext->OnUpdate(L"");
112 pAppWidgetContext = new (std::nothrow)_AppWidgetContext(this, instanceId, providerId, width, height, userInfo, period, priority);
113 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OUT_OF_MEMORY, "");
115 __appWidgetContextList.Add(instanceId, pAppWidgetContext);
116 pAppWidgetContext->OnAdded();
118 SysSecureLog(NID_SHELL, "%ls, %ls, count(%d)", pAppWidgetContext->GetProviderId().GetPointer(), pAppWidgetContext->GetInstanceId().GetPointer(), __appWidgetContextList.GetCount());
124 _AppContext::UpdateAppWidget(const Tizen::Base::String& instanceId)
126 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
127 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
129 pAppWidgetContext->OnUpdate(L"");
135 _AppContext::ResizeAppWidget(const Tizen::Base::String& instanceId, int width, int height)
137 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
138 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
140 pAppWidgetContext->OnResize(width, height);
146 _AppContext::CreateAppWidgetPopup(const Tizen::Base::String& instanceId, double x, double y, int width, int height)
148 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
149 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
151 pAppWidgetContext->OnPopupCreated(x, y, width, height);
157 _AppContext::DestroyAppWidget(const Tizen::Base::String& instanceId, bool isTriggeredByViewer)
159 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
160 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
162 __appWidgetContextList.Remove(instanceId);
164 result r = pAppWidgetContext->OnRemoved(isTriggeredByViewer);
165 SysTryLog(NID_SHELL, !IsFailed(r), "Failed to execute OnRemoved.");
167 delete pAppWidgetContext;
169 SysLog(NID_SHELL, "AppWidget(%ls) is removed. remain count(%d)", instanceId.GetPointer(), __appWidgetContextList.GetCount());
174 _AppContext::DestroyAppWidgetPopup(const Tizen::Base::String& instanceId)
176 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
177 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
179 pAppWidgetContext->OnPopupDestoyed();
185 _AppContext::GetConnectionState(void) const
187 return __connectionState;
191 _AppContext::SetConnectionState(_ConnectionState state)
193 __connectionState = state;
197 _AppContext::GetAppId(void) const
203 _AppContext::GetClientId(void) const
205 return __ipcClientId;
209 _AppContext::OnIpcConnected(int clientId)
211 __ipcClientId = clientId;
212 SetConnectionState(CONNECTION_STATE_CONNECTED);
216 _AppContext::OnIpcDisconnected(void)
219 SetConnectionState(CONNECTION_STATE_DISCONNECTED);
221 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
222 SysTryReturnVoidResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "");
224 _AppWidgetContext* pAppWidgetContext = null;
225 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
227 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
228 if (pAppWidgetContext)
230 pAppWidgetContext->OnDisconnected();
236 _AppContext::SetWaitingStatus(bool status)
238 __isWaitingResult = status;
242 _AppContext::GetWaitingStatus(void) const
244 return __isWaitingResult;
248 _AppContext::SendRequestToApp(const AppId& providerAppId, const String& operation, HashMap* pArgs)
250 result r = E_SUCCESS;
252 if (GetConnectionState() == CONNECTION_STATE_NONE || GetConnectionState() == CONNECTION_STATE_DISCONNECTED)
254 SysLog(NID_SHELL, "The application is not running.");
255 r = _AppWidgetRequestHelper::SendAppControlRequest(providerAppId, operation, pArgs);
256 pArgs->RemoveAll(true);
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. Queueing the request (%ls).", operation.GetPointer() );
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);
275 pArgs->RemoveAll(true);
277 SysTryReturn(NID_SHELL, !IsFailed(r), r, r, "[%s] Failed to SendRequestToApp", GetErrorMessage(r));
279 SetWaitingStatus(true);
287 _AppContext::SendPendingEvent(void)
289 SetWaitingStatus(false);
290 TryReturn(__pPendingEventList->GetCount() > 0, E_DATA_NOT_FOUND, "No pending event.");
292 PendingEvent* pEvent = null;
293 __pPendingEventList->GetAt(0, pEvent);
294 __pPendingEventList->RemoveAt(0);
295 SysLog(NID_SHELL, "(%d) Remains in __pPendingEventList.", __pPendingEventList->GetCount());
297 result r = _AppWidgetRequestHelper::SendIpcRequest(GetClientId(), pEvent->operation, pEvent->pArgs);
299 SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "SendIpcRequest failed.");
305 _AppContext::RequestUpdateInstance(const Tizen::Base::String& instanceId, const Tizen::Base::String& argument)
307 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
308 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
310 return pAppWidgetContext->OnUpdateAsync(this, argument);
314 _AppContext::AcquireRemoteBuffer(const Tizen::Base::String& instanceId, int width, int height, int& bufferId)
316 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
317 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
319 bufferId = pAppWidgetContext->AcquireRemoteBuffer(width, height);
325 _AppContext::AcquireRemoteBufferForPD(const Tizen::Base::String& instanceId, int width, int height, int& bufferId)
327 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
328 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
330 bufferId = pAppWidgetContext->AcquireRemoteBufferForPD(width, height);
336 _AppContext::SyncRemoteBuffer(const Tizen::Base::String& instanceId, int width, int height)
338 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
339 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
341 return pAppWidgetContext->SyncRemoteBuffer(width, height);
345 _AppContext::SyncRemoteBufferForPD(const Tizen::Base::String& instanceId)
347 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
348 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
350 return pAppWidgetContext->SyncRemoteBufferForPD();
354 _AppContext::SendAccessStatus(const Tizen::Base::String& instanceId, int accessStatus)
356 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
357 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
359 return pAppWidgetContext->SendAccessStatus(accessStatus);
363 _AppContext::FindAppWidget(const String& instanceId) const
365 _AppWidgetContext* pAppWidgetContext = null;
367 if (instanceId == INVALID_INSTANCE)
369 pAppWidgetContext = FindInvalidAppWidget();
373 result r = __appWidgetContextList.GetValue(instanceId, pAppWidgetContext);
374 SysTryReturn(NID_SHELL, !IsFailed(r), null, E_OBJ_NOT_FOUND, "instanceId(%ls) is not found", instanceId.GetPointer() );
376 return pAppWidgetContext;
380 _AppContext::FindInvalidAppWidget(void) const
382 SysTryReturn(NID_SHELL, GetConnectionState() == CONNECTION_STATE_NONE, null, E_INVALID_STATE, "[E_INVALID_STATE] connectionState(%d)", GetConnectionState());
384 _AppWidgetContext* pAppWidgetContext = null;
385 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
386 SysTryReturn(NID_SHELL, pAppWidgetContextEnum, null, E_SYSTEM, "");
388 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
390 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
391 if (pAppWidgetContext)
393 //TODO: check whether this app context has only one instance of _AppWidgetContext
394 return pAppWidgetContext;
401 _AppContext::GetProviderCount(void) const
403 return __appWidgetContextList.GetCount();
407 _AppContext::RequestUpdate(const Tizen::Base::String& providerName, const Tizen::Base::String& argument)
409 SysLog(NID_SHELL, "Enter.");
412 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
413 SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "Failed to invoke __appWidgetContextList.GetMapEnumeratorN()");
415 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
417 _AppWidgetContext* pAppWidgetContext = null;
418 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
420 if (pAppWidgetContext->GetProviderName() == providerName)
422 pAppWidgetContext->OnUpdateAsync(this, argument);
427 SysLog(NID_SHELL, "Exit.");
428 return (found) ? E_SUCCESS : E_OBJ_NOT_FOUND;
432 _AppContext::RequestUpdateAllInactiveted(void)
434 SysLog(NID_SHELL, "Exit.");
435 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
436 SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "Failed to invoke __appWidgetContextList.GetMapEnumeratorN()");
438 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
440 _AppWidgetContext* pAppWidgetContext = null;
441 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
443 if (pAppWidgetContext->IsActive() == false)
445 pAppWidgetContext->OnUpdateAsync(this, L"");
449 SysLog(NID_SHELL, "Exit.");
454 _AppContext::OnAppWidgetBackground(const Tizen::Base::String& instanceId)
456 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
457 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
459 pAppWidgetContext->OnBackground();
465 _AppContext::OnAppWidgetBackgroundAll(void)
467 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
468 SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "Failed to invoke GetMapEnumeratorN()");
470 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
472 _AppWidgetContext* pAppWidgetContext = null;
473 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
474 if (pAppWidgetContext)
476 pAppWidgetContext->OnBackground();
484 _AppContext::OnAppWidgetForeground(const Tizen::Base::String& instanceId)
486 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
487 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
489 pAppWidgetContext->OnForeground();
495 _AppContext::OnAppWidgetForegroundAll(void)
497 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
498 SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "Failed to invoke GetMapEnumeratorN()");
500 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
502 _AppWidgetContext* pAppWidgetContext = null;
503 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
504 if (pAppWidgetContext)
506 pAppWidgetContext->OnForeground();
514 _AppContext::HandleUserEvent(Tizen::Base::Collection::IList* pArgs)
516 _AppWidgetContext* pAppWidgetContext = dynamic_cast<_AppWidgetContext*>( pArgs->GetAt(1) );
517 SysTryReturnVoidResult(NID_SHELL, pAppWidgetContext != null, E_INVALID_STATE, "_AppWidget is null!.");
519 String* pArgument = dynamic_cast<String*>( pArgs->GetAt(2) );
520 SysTryReturnVoidResult(NID_SHELL, pArgument != null, E_INVALID_STATE, "pArgument is null!.");
522 pAppWidgetContext->OnUpdate(*pArgument);
525 }}} // Tizen::Shell::App