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::OnApplicationTerminated(void)
238 if (GetWaitingStatus() == true )
240 SysLog(NID_SHELL, "The application (%ls) is terminated without response.", __appId.GetPointer() );
241 SetWaitingStatus(false);
243 if (GetConnectionState() == CONNECTION_STATE_CONNECTING)
245 SysLog(NID_SHELL, "The application (%ls) is terminated before IPC connected, resetting connection state.", __appId.GetPointer() );
246 SetConnectionState(CONNECTION_STATE_DISCONNECTED);
252 _AppContext::SetWaitingStatus(bool status)
254 __isWaitingResult = status;
258 _AppContext::GetWaitingStatus(void) const
260 return __isWaitingResult;
264 _AppContext::SendRequestToApp(const AppId& providerAppId, const String& operation, HashMap* pArgs)
266 result r = E_SUCCESS;
268 if (GetConnectionState() == CONNECTION_STATE_NONE || GetConnectionState() == CONNECTION_STATE_DISCONNECTED)
270 SysLog(NID_SHELL, "The application is not running.");
271 r = _AppWidgetRequestHelper::SendAppControlRequest(providerAppId, operation, pArgs);
272 pArgs->RemoveAll(true);
275 SysTryReturn(NID_SHELL, !IsFailed(r), r, r, "[%s] Failed to SendRequestToApp", GetErrorMessage(r));
277 SetWaitingStatus(true);
278 SetConnectionState(CONNECTION_STATE_CONNECTING);
282 if (GetConnectionState() == CONNECTION_STATE_CONNECTING || GetWaitingStatus() == true)
284 SysLog(NID_SHELL, "The application is running but IPC is not connected yet. Queueing the request (%ls).", operation.GetPointer() );
285 __pPendingEventList->Add(new (nothrow) PendingEvent(operation, pArgs));
289 SysLog(NID_SHELL, "The application is running and IPC is connected.");
290 r = _AppWidgetRequestHelper::SendIpcRequest(GetClientId(), operation, pArgs);
291 pArgs->RemoveAll(true);
293 SysTryReturn(NID_SHELL, !IsFailed(r), r, r, "[%s] Failed to SendRequestToApp", GetErrorMessage(r));
295 SetWaitingStatus(true);
303 _AppContext::SendPendingEvent(void)
305 SetWaitingStatus(false);
306 TryReturn(__pPendingEventList->GetCount() > 0, E_DATA_NOT_FOUND, "No pending event.");
308 PendingEvent* pEvent = null;
309 __pPendingEventList->GetAt(0, pEvent);
310 __pPendingEventList->RemoveAt(0);
311 SysLog(NID_SHELL, "(%d) Remains in __pPendingEventList.", __pPendingEventList->GetCount());
313 result r = _AppWidgetRequestHelper::SendIpcRequest(GetClientId(), pEvent->operation, pEvent->pArgs);
315 SysTryReturnResult(NID_SHELL, !IsFailed(r), E_SYSTEM, "SendIpcRequest failed.");
321 _AppContext::RequestUpdateInstance(const Tizen::Base::String& instanceId, const Tizen::Base::String& argument)
323 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
324 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
326 return pAppWidgetContext->OnUpdateAsync(this, argument);
330 _AppContext::AcquireRemoteBuffer(const Tizen::Base::String& instanceId, int width, int height, int& bufferId)
332 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
333 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
335 bufferId = pAppWidgetContext->AcquireRemoteBuffer(width, height);
341 _AppContext::AcquireRemoteBufferForPD(const Tizen::Base::String& instanceId, int width, int height, int& bufferId)
343 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
344 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
346 bufferId = pAppWidgetContext->AcquireRemoteBufferForPD(width, height);
352 _AppContext::SyncRemoteBuffer(const Tizen::Base::String& instanceId, int width, int height)
354 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
355 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
357 return pAppWidgetContext->SyncRemoteBuffer(width, height);
361 _AppContext::SyncRemoteBufferForPD(const Tizen::Base::String& instanceId)
363 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
364 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
366 return pAppWidgetContext->SyncRemoteBufferForPD();
370 _AppContext::SendAccessStatus(const Tizen::Base::String& instanceId, int accessStatus)
372 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
373 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
375 return pAppWidgetContext->SendAccessStatus(accessStatus);
379 _AppContext::FindAppWidget(const String& instanceId) const
381 _AppWidgetContext* pAppWidgetContext = null;
383 if (instanceId == INVALID_INSTANCE)
385 pAppWidgetContext = FindInvalidAppWidget();
389 result r = __appWidgetContextList.GetValue(instanceId, pAppWidgetContext);
390 SysTryReturn(NID_SHELL, !IsFailed(r), null, E_OBJ_NOT_FOUND, "instanceId(%ls) is not found", instanceId.GetPointer() );
392 return pAppWidgetContext;
396 _AppContext::FindInvalidAppWidget(void) const
398 SysTryReturn(NID_SHELL, GetConnectionState() == CONNECTION_STATE_NONE, null, E_INVALID_STATE, "[E_INVALID_STATE] connectionState(%d)", GetConnectionState());
400 _AppWidgetContext* pAppWidgetContext = null;
401 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
402 SysTryReturn(NID_SHELL, pAppWidgetContextEnum, null, E_SYSTEM, "");
404 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
406 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
407 if (pAppWidgetContext)
409 //TODO: check whether this app context has only one instance of _AppWidgetContext
410 return pAppWidgetContext;
417 _AppContext::GetProviderCount(void) const
419 return __appWidgetContextList.GetCount();
423 _AppContext::RequestUpdate(const Tizen::Base::String& providerName, const Tizen::Base::String& argument)
425 SysLog(NID_SHELL, "Enter.");
428 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
429 SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "Failed to invoke __appWidgetContextList.GetMapEnumeratorN()");
431 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
433 _AppWidgetContext* pAppWidgetContext = null;
434 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
436 if (pAppWidgetContext->GetProviderName() == providerName)
438 pAppWidgetContext->OnUpdateAsync(this, argument);
443 SysLog(NID_SHELL, "Exit.");
444 return (found) ? E_SUCCESS : E_OBJ_NOT_FOUND;
448 _AppContext::RequestUpdateAllInactiveted(void)
450 SysLog(NID_SHELL, "Exit.");
451 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
452 SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "Failed to invoke __appWidgetContextList.GetMapEnumeratorN()");
454 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
456 _AppWidgetContext* pAppWidgetContext = null;
457 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
459 if (pAppWidgetContext->IsActive() == false)
461 pAppWidgetContext->OnUpdateAsync(this, L"");
465 SysLog(NID_SHELL, "Exit.");
470 _AppContext::OnAppWidgetBackground(const Tizen::Base::String& instanceId)
472 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
473 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
475 pAppWidgetContext->OnBackground();
481 _AppContext::OnAppWidgetBackgroundAll(void)
483 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
484 SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "Failed to invoke GetMapEnumeratorN()");
486 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
488 _AppWidgetContext* pAppWidgetContext = null;
489 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
490 if (pAppWidgetContext)
492 pAppWidgetContext->OnBackground();
500 _AppContext::OnAppWidgetForeground(const Tizen::Base::String& instanceId)
502 _AppWidgetContext* pAppWidgetContext = FindAppWidget(instanceId);
503 SysTryReturnResult(NID_SHELL, pAppWidgetContext, E_OBJ_NOT_FOUND, "Failed to find _AppWidgetContext.");
505 pAppWidgetContext->OnForeground();
511 _AppContext::OnAppWidgetForegroundAll(void)
513 unique_ptr< IMapEnumeratorT<String, _AppWidgetContext*> > pAppWidgetContextEnum(__appWidgetContextList.GetMapEnumeratorN());
514 SysTryReturnResult(NID_SHELL, pAppWidgetContextEnum, E_SYSTEM, "Failed to invoke GetMapEnumeratorN()");
516 while (pAppWidgetContextEnum->MoveNext() == E_SUCCESS)
518 _AppWidgetContext* pAppWidgetContext = null;
519 pAppWidgetContextEnum->GetValue(pAppWidgetContext);
520 if (pAppWidgetContext)
522 pAppWidgetContext->OnForeground();
530 _AppContext::HandleUserEvent(Tizen::Base::Collection::IList* pArgs)
532 _AppWidgetContext* pAppWidgetContext = dynamic_cast<_AppWidgetContext*>( pArgs->GetAt(1) );
533 SysTryReturnVoidResult(NID_SHELL, pAppWidgetContext != null, E_INVALID_STATE, "_AppWidget is null!.");
535 String* pArgument = dynamic_cast<String*>( pArgs->GetAt(2) );
536 SysTryReturnVoidResult(NID_SHELL, pArgument != null, E_INVALID_STATE, "pArgument is null!.");
538 pAppWidgetContext->OnUpdate(*pArgument);
541 }}} // Tizen::Shell::App