2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FApp_AppArg.cpp
20 * @brief This is the implementation for the _AppArg.cpp class.
28 #include <unique_ptr.h>
32 #include <appsvc/appsvc.h>
34 #include <FBaseInteger.h>
35 #include <FBaseColArrayList.h>
36 #include <FBaseColHashMap.h>
37 #include <FBaseUtilStringTokenizer.h>
39 #include <FBaseSysLog.h>
40 #include <FBase_StringConverter.h>
42 #include "FApp_MapDataControlImpl.h"
43 #include "FApp_AppControlImpl.h"
44 #include "FApp_SqlDataControlImpl.h"
45 #include "FApp_AppControlEventArg.h"
46 #include "FApp_AppArg.h"
47 #include "FApp_AppMessageImpl.h"
48 #include "FAppPkg_PackageManagerImpl.h"
50 using namespace Tizen::Base;
51 using namespace Tizen::Base::Collection;
52 using namespace Tizen::Base::Utility;
53 using namespace Tizen::App::Package;
55 namespace Tizen { namespace App
58 static const char OSP_V_LAUNCH_TYPE_LAUNCH[] = "launch";
59 static const char OSP_V_LAUNCH_TYPE_APPCONTROL[] = "appcontrol";
60 static const char OSP_V_LAUNCH_TYPE_DATACONTROL[] = "datacontrol";
61 static const char OSP_V_LAUNCH_TYPE_CONDTION[] = "condition";
62 static const char OSP_V_REQUEST_TYPE_SQL_QUERY[] = "sql_query";
63 static const char OSP_V_REQUEST_TYPE_SQL_INSERT[] = "sql_insert";
64 static const char OSP_V_REQUEST_TYPE_SQL_UPDATE[] = "sql_update";
65 static const char OSP_V_REQUEST_TYPE_SQL_DELETE[] = "sql_delete";
66 static const char OSP_V_REQUEST_TYPE_MAP_QEURY[] = "map_query";
67 static const char OSP_V_REQUEST_TYPE_MAP_INSERT[] = "map_insert";
68 static const char OSP_V_REQUEST_TYPE_MAP_UPDATE[] = "map_update";
69 static const char OSP_V_REQUEST_TYPE_MAP_DELETE[] = "map_delete";
70 static const char BUNDLE_KEY_WINDOW[] = "__APP_SVC_K_WIN_ID__";
71 static const char BUNDLE_KEY_PREFIX_AUL[] = "__AUL_";
72 static const char BUNDLE_KEY_PREFIX_SERVICE[] = "__APP_SVC_";
73 static const char BUNDLE_KEY_PREFIX_OSP[] = "__OSP_";
74 const char TIZEN_NOTIFICATION_DATA[] = "http://tizen.org/appcontrol/data/notification";
76 static const char SAMSUNG_ACCOUNT_KEY_CLIENT_ID[] = "client_id";
77 static const char SAMSUNG_ACCOUNT_KEY_CLIENT_SECRET[] = "client_secret";
78 static const char SAMSUNG_ACCOUNT_KEY_SERVICE_CATEGORY[] = "service_category";
80 static const char SMS_KEY_SERVICE_CALLER[] = "service_caller";
81 static const char SMS_KEY_SERVICE_DATA[] = "service_data";
84 _AppArg::_AppArg(void)
90 _AppArg::~_AppArg(void)
94 bundle_free(__pBundle);
100 _AppArg::Construct(const String& argText)
102 __pBundle = bundle_create();
103 SysTryReturnResult(NID_APP, __pBundle != null, E_OUT_OF_MEMORY, "Bundle creation failure.");
105 return CreateLaunchArg(__pBundle, argText);
110 _AppArg::Construct(const IList* pList)
112 __pBundle = bundle_create();
113 SysTryReturnResult(NID_APP, __pBundle != null, E_OUT_OF_MEMORY, "Bundle creation failure.");
115 return CreateLaunchArg(__pBundle, pList);
120 _AppArg::Construct(const _AppControlImpl& ac, const IList* pList)
122 __pBundle = bundle_create();
123 SysTryReturnResult(NID_APP, __pBundle != null, E_OUT_OF_MEMORY, "Bundle creation failure.");
125 return CreateAppControlArg(__pBundle, ac, pList);
130 _AppArg::Construct(const _AppControlImpl& ac, const String* pUri, const String* pMime, const IMap* pList)
132 __pBundle = bundle_create();
133 SysTryReturnResult(NID_APP, __pBundle != null, E_OUT_OF_MEMORY, "Bundle creation failure.");
135 return CreateAppControlArg(__pBundle, ac, pUri, pMime, pList);
140 _AppArg::Construct(const _SqlDataControlImpl& dc, _DataControlRequestType requestType, const IList* pList)
142 __pBundle = bundle_create();
143 SysTryReturnResult(NID_APP, __pBundle != null, E_OUT_OF_MEMORY, "Bundle creation failure.");
145 return CreateSqlDataControlArg(__pBundle, dc, requestType, pList);
150 _AppArg::Construct(const _MapDataControlImpl& dc, _DataControlRequestType requestType, const IList* pList)
152 __pBundle = bundle_create();
153 SysTryReturnResult(NID_APP, __pBundle != null, E_OUT_OF_MEMORY, "Bundle creation failure.");
155 return CreateMapDataControlArg(__pBundle, dc, requestType, pList);
160 _AppArg::ConstructResult(const _AppArg& arg, const IList* pList)
162 int ret = aul_create_result_bundle(arg.GetBundle(), &__pBundle);
163 SysTryReturnResult(NID_APP, __pBundle != null, E_INVALID_STATE, "Bundle creatioin from service handle failure : %d.", ret);
165 return CreateResultArg(__pBundle, pList);
170 _AppArg::ConstructResult(const _AppArg& arg, const IMap* pMap)
172 int ret = aul_create_result_bundle(arg.GetBundle(), &__pBundle);
173 SysTryReturnResult(NID_APP, __pBundle != null, E_INVALID_STATE, "Bundle creatioin from service handle failure : %d.", ret);
175 return CreateResultArg(__pBundle, pMap);
180 _AppArg::Construct(bundle* b)
182 __pBundle = bundle_dup(b);
183 SysTryReturnResult(NID_APP, __pBundle != null, E_INVALID_STATE, "Bundle creatioin from service handle failure.");
190 _AppArg::ConstructForAppLaunchCondition(const String& condition, const IList* pList)
192 __pBundle = bundle_create();
193 SysTryReturnResult(NID_APP, __pBundle != null, E_OUT_OF_MEMORY, "Bundle creation failure.");
195 return CreateAppLaunchConditionArg(__pBundle, condition, pList);
200 _AppArg::GetArgListN(int num) const
202 bundle* pBundle = __pBundle;
203 SysTryReturn(NID_APP, pBundle != null, null, E_INVALID_STATE, "[E_INVALID_STATE] Improper bundle state.");
205 ArrayList* pList = new (std::nothrow) ArrayList();
206 SysTryReturn(NID_APP, pList != null, null, E_OUT_OF_MEMORY, "ArrayList creation failure.");
210 const char* p = NULL;
211 _AppHandler launch_type = GetHandler(pBundle);
215 case _APP_HANDLER_APPCONTROL:
217 // [FIXME] proper request Id required
218 pList->Add(*new (std::nothrow) String(GetRequestId(num)));
221 p = appsvc_get_category(pBundle);
224 pList->Add(*new (std::nothrow) String(p));
228 pList->Add(*new (std::nothrow) String(L""));
232 p = appsvc_get_mime(pBundle);
235 pList->Add(*new (std::nothrow) String(p));
239 pList->Add(*new (std::nothrow) String(L""));
243 p = appsvc_get_uri(pBundle);
246 pList->Add(*new (std::nothrow) String(p));
250 pList->Add(*new (std::nothrow) String(L""));
255 case _APP_HANDLER_DATACONTROL:
257 AddListFromBundle(pList, pBundle, OSP_K_APPID);
259 AddListFromBundle(pList, pBundle, OSP_K_DATACONTROL_REQUEST_TYPE);
261 AddListFromBundle(pList, pBundle, OSP_K_REQUEST_ID);
263 AddListFromBundle(pList, pBundle, OSP_K_DATACONTROL_PROVIDER);
266 case _APP_HANDLER_LAUNCH_COND:
267 pList->Add(*new (std::nothrow) String(LEGACY_LAUNCH_REASON_CONDITIONAL));
268 AddListFromBundle(pList, pBundle, OSP_K_COND);
271 case _APP_HANDLER_LAUNCH_NORMAL:
272 pList->Add(*new (std::nothrow) String(LEGACY_LAUNCH_REASON_NORMAL));
273 pList->Add(*new (std::nothrow) String(L"osp.operation.MAIN"));
277 SysLog(NID_APP, "Invalid handler type");
281 SetArgList(__pBundle, pList);
288 _AppArg::GetArgListN(void) const
290 SysTryReturn(NID_APP, __pBundle != null, null, E_INVALID_STATE, "[E_INVALID_STATE] Improper bundle state.");
292 ArrayList* pList = new (std::nothrow) ArrayList();
293 SysTryReturn(NID_APP, pList != null, null, E_OUT_OF_MEMORY, "ArrayList creation failure.");
297 SetArgList(__pBundle, pList);
302 // the returned map is allocated using SingleObjectDeleter
304 _AppArg::GetArgMapN(void) const
306 SysTryReturn(NID_APP, __pBundle != null, null, E_INVALID_STATE, "[E_INVALID_STATE] Improper bundle state.");
308 HashMap* pHashMap = new (std::nothrow) HashMap(SingleObjectDeleter);
309 SysTryReturn(NID_APP, pHashMap != null, null, E_OUT_OF_MEMORY, "HashMap creation failure.");
311 pHashMap->Construct();
313 SetArgMap(__pBundle, pHashMap);
315 if (pHashMap->GetCount() == 0)
317 // [FIXME] temporary resolution for PolarisOffice
318 const char* p = appsvc_get_uri(__pBundle);
326 pHashMap->Add(new (std::nothrow) String(L"reqId"), new (std::nothrow) String(L"-1"));
327 pHashMap->Add(new (std::nothrow) String(L"path1"), new (std::nothrow) String(L""));
328 pHashMap->Add(new (std::nothrow) String(L"path2"), new (std::nothrow) String(L""));
329 pHashMap->Add(new (std::nothrow) String(L"path3"), new (std::nothrow) String(L""));
330 pHashMap->Add(new (std::nothrow) String(L"path"), new (std::nothrow) String(p));
336 ArrayList* pList = _AppMessageImpl::GetValueArray(__pBundle, OSP_K_ARG);
339 pHashMap->Add(new (std::nothrow) String(TIZEN_APPCONTROL_DATA_LEGACY), pList);
345 IsInternalKey(const char* pKey)
347 if (strncmp(BUNDLE_KEY_PREFIX_AUL, pKey, strlen(BUNDLE_KEY_PREFIX_AUL)) == 0)
352 if (strncmp(BUNDLE_KEY_PREFIX_SERVICE, pKey, strlen(BUNDLE_KEY_PREFIX_SERVICE)) == 0)
357 if (strncmp(BUNDLE_KEY_PREFIX_OSP, pKey, strlen(BUNDLE_KEY_PREFIX_OSP)) == 0)
366 BundleIterFnCb(const char* pKey, const int type, const bundle_keyval_t* pVal, void* pData)
368 HashMap* pMap = static_cast<HashMap*>(pData);
370 if (pKey && pVal && pMap)
372 if (IsInternalKey(pKey))
374 //SysLog(NID_APP, "(%s)", pKey);
382 case BUNDLE_TYPE_STR:
383 bundle_keyval_get_basic_val(const_cast<bundle_keyval_t*>(pVal), reinterpret_cast<void**>(&pStr), &size);
386 SysLog(NID_APP, "(%s, %s)", pKey, pStr);
387 pMap->Add(new (std::nothrow) String(pKey), new (std::nothrow) String(pStr));
390 case BUNDLE_TYPE_STR_ARRAY:
393 bundle_keyval_get_array_val(const_cast<bundle_keyval_t*>(pVal), &pArr, &size, NULL);
394 if (pArr && size > 0)
396 String str = static_cast<char*>(*pArr);
397 for (size_t i = 1; i < size; i++)
400 str += static_cast<char*>(*(pArr + i));
403 SysLog(NID_APP, "(%s, %ls)", pKey, str.GetPointer());
404 pMap->Add(new (std::nothrow) String(pKey), new (std::nothrow) String(str));
408 SysLog(NID_APP, "No entry for str array %s(%d)", pKey, size);
413 SysLog(NID_APP, "Invalid type for %s : %d", pKey, type);
420 _AppArg::SetArgMap(bundle* pBundle, HashMap* pMap)
422 bundle_foreach(pBundle, BundleIterFnCb, reinterpret_cast<void*>(pMap));
428 _AppArg::SetArgList(bundle* pBundle, ArrayList* pList)
430 // actual argument below
432 const char** pa = appsvc_get_data_array(pBundle, OSP_K_ARG, &len);
435 for (int i = 0; i < len; i++)
439 //SysLog(NID_APP, "%d/%dth arg [%s]", i, len, pa[i]);
440 pList->Add(*new (std::nothrow) String(pa[i]));
445 const char* p = appsvc_get_uri(pBundle);
448 pList->Add(*new (std::nothrow) String(p));
449 SysLog(NID_APP, "argument is %s", p);
453 p = appsvc_get_data(pBundle, SMS_KEY_SERVICE_CALLER);
456 tmp.Format(60, L"%s:%s", SMS_KEY_SERVICE_CALLER, p);
457 pList->Add(*new (std::nothrow) String(tmp));
458 SysLog(NID_APP, "service_caller is %s", p);
461 p = appsvc_get_data(pBundle, SMS_KEY_SERVICE_DATA);
464 tmp.Format(60, L"%s:%s", SMS_KEY_SERVICE_DATA, p);
465 pList->Add(*new (std::nothrow) String(tmp));
466 SysLog(NID_APP, "service_data is set");
469 p = appsvc_get_data(pBundle, SAMSUNG_ACCOUNT_KEY_CLIENT_ID);
472 tmp.Format(60, L"%s:%s", SAMSUNG_ACCOUNT_KEY_CLIENT_ID, p);
473 pList->Add(*new (std::nothrow) String(tmp));
474 SysLog(NID_APP, "client_id is %s", p);
477 p = appsvc_get_data(pBundle, SAMSUNG_ACCOUNT_KEY_CLIENT_SECRET);
480 tmp.Format(60, L"%s:%s", SAMSUNG_ACCOUNT_KEY_CLIENT_SECRET, p);
481 pList->Add(*new (std::nothrow) String(tmp));
482 SysLog(NID_APP, "client_secret is %s", p);
485 p = appsvc_get_data(pBundle, SAMSUNG_ACCOUNT_KEY_SERVICE_CATEGORY);
488 tmp.Format(60, L"%s:%s", SAMSUNG_ACCOUNT_KEY_SERVICE_CATEGORY, p);
489 pList->Add(*new (std::nothrow) String(tmp));
490 SysLog(NID_APP, "service_category is %s", p);
498 _AppArg::GetValue(const char* key) const
500 const char* p = appsvc_get_data(__pBundle, key);
506 _AppArg::GetHandler(bundle* b)
508 SysTryReturn(NID_APP, b != null, _APP_HANDLER_NONE, E_INVALID_STATE, "[E_INVALID_STATE] Improper bundle state.");
510 const char* p = null;
512 p = appsvc_get_data(b, OSP_K_LAUNCH_TYPE);
516 if (strcmp(p, OSP_V_LAUNCH_TYPE_DATACONTROL) == 0)
518 return _APP_HANDLER_DATACONTROL;
521 if (strcmp(p, OSP_V_LAUNCH_TYPE_APPCONTROL) == 0)
523 SysLog(NID_APP, "Building AppControl arguments.");
525 return _APP_HANDLER_APPCONTROL;
529 // not appcontrol nor datacontrol => normal launch or condlaunch
530 p = appsvc_get_data(b, OSP_K_COND);
533 SysLog(NID_APP, "Building Conditional AppLaunch arguments.");
534 return _APP_HANDLER_LAUNCH_COND;
538 SysLog(NID_APP, "Building Normal AppLaunch arguments.");
539 return _APP_HANDLER_LAUNCH_NORMAL;
545 return _APP_HANDLER_APPCONTROL;
550 _AppArg::GetCallerPid(bundle* pBundle)
552 const char* pBundleValue = bundle_get_val(pBundle, AUL_K_ORG_CALLER_PID);
553 if (pBundleValue == NULL)
555 pBundleValue = bundle_get_val(pBundle, AUL_K_CALLER_PID);
558 SysTryReturn(NID_APP, pBundleValue != null, -1, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Object not found.");
560 return atoi(pBundleValue);
565 _AppArg::GetCallerAppId(void) const
567 pid_t callerPid = GetCallerPid();
568 SysTryReturn(NID_APP, callerPid > 0, L"", E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Wrong process id: %d.", callerPid);
570 char appId[PATH_MAX] = {0, };
571 SysTryReturn(NID_APP, aul_app_get_appid_bypid(callerPid, appId, sizeof(appId)) == AUL_R_OK, L"", E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Object not found for %d.", callerPid);
573 return String(appId);
578 _AppArg::GetCalleeAppId(void) const
580 const char* pBundleValue = bundle_get_val(__pBundle, AUL_K_CALLEE_PID);
582 SysTryReturn(NID_APP, pBundleValue != null, L"", E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Object not found.");
584 pid_t calleePid = atoi(pBundleValue);
585 SysTryReturn(NID_APP, calleePid > 0, L"", E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Wrong process id: %d.", calleePid);
587 char appId[PATH_MAX] = {0, };
588 SysTryReturn(NID_APP, aul_app_get_appid_bypid(calleePid, appId, sizeof(appId)) == AUL_R_OK, L"", E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Object not found for %d.", calleePid);
591 String retVal = appId;
592 // [INFO] ugly code for submode callee
593 retVal.SubString(11, temp);
594 if (temp == L"_AppControl")
597 retVal.SubString(0, 10, id);
598 const String& name = _PackageManagerImpl::GetInstance()->GetDefaultAppExecutableName(id);
600 retVal = id + L'.' + name;
601 SysLog(NID_APP, "Converted caller Id is %ls", retVal.GetPointer());
609 _AppArg::AddListFromBundle(ArrayList* pList, bundle* bk, const char* key)
611 bundle* pBundle = bk;
613 const char* p = appsvc_get_data(pBundle, key);
616 pList->Add(*new (std::nothrow) String(p));
620 pList->Add(*new (std::nothrow) String(L""));
626 _AppArg::AddStrArray(bundle* b, const String& key, const IList* pList)
628 std::unique_ptr<char[]> pKey(_StringConverter::CopyToCharArrayN(key));
630 return AddStrArray(b, pKey.get(), pList);
635 _AppArg::AddStrArray(bundle* b, const char* key, const IList* pList)
638 SysTryReturnResult(NID_APP, pb != NULL, E_INVALID_ARG, "Empty bundle.");
640 if (pList == null || pList->GetCount() == 0)
642 SysLog(NID_APP, "No element added for bundle.");
647 const int count = pList->GetCount();
649 const char** pSa = new (std::nothrow) const char*[count];
650 SysTryReturnResult(NID_APP, pSa != null, E_OUT_OF_MEMORY, "Memory allocation failure with cound %d.", count);
652 for (i = 0; i < count; i++)
656 const String* pStr = static_cast<const String*>(pList->GetAt(i));
659 pSa[i] = _StringConverter::CopyToCharArrayN(*pStr);
663 result r = E_SUCCESS;
665 int ret = bundle_add_str_array(pb, key, pSa, count);
668 _AppMessageImpl::AddData(pb, pList);
672 SysLog(NID_APP, "Bundle add failre :%d.", ret);
676 _AppMessageImpl::AddData(pb, pList);
679 for (i = 0; i < count; i++)
691 _AppArg::AddStrMap(bundle* b, const IMap* pMap)
694 SysTryReturnResult(NID_APP, pb != NULL, E_INVALID_ARG, "Empty bundle.");
696 if (pMap == null || pMap->GetCount() == 0)
698 SysLog(NID_APP, "No element added for bundle.");
702 std::unique_ptr<IMapEnumerator> pEnum (pMap->GetMapEnumeratorN());
703 while(pEnum->MoveNext() == E_SUCCESS)
705 const String* pKey = static_cast<const String*>(pEnum->GetKey());
706 const Object* pObj = pEnum->GetValue();
710 if (typeid(*pObj) == typeid(const String))
712 const String* pVal = static_cast<const String*>(pEnum->GetValue());
715 _AppMessageImpl::AddData(pb, *pKey, *pVal);
718 else if (typeid(*pObj) == typeid(const ArrayList))
720 const ArrayList* pList = static_cast<const ArrayList*>(pEnum->GetValue());
721 if (pList && *pKey == TIZEN_APPCONTROL_DATA_LEGACY)
723 SysLog(NID_APP, "Legacy AppControl argument");
724 _AppArg::AddStrArray(pb, OSP_K_ARG, pList);
725 _AppMessageImpl::AddData(pb, pList);
728 else if (typeid(*pObj) == typeid(const ByteBuffer))
730 SysLog(NID_APP, "ByteBuffer type");
740 _AppArg::FillMapFromList(IMap* pMap, const IList* pList)
742 if (pMap == null || pList == null)
747 std::unique_ptr<IEnumerator> pEnum(pList->GetEnumeratorN());
748 SysTryReturnResult(NID_APP, pEnum != null, E_OUT_OF_MEMORY, "Getting enumerator failed.");
752 while (pEnum->MoveNext() == E_SUCCESS)
754 String* pStr = dynamic_cast<String*>(pEnum->GetCurrent());
757 if (pStr == null || pStr->IndexOf(L':', 0, index) != E_SUCCESS)
761 pStr->SubString(0, index, key);
767 pStr->SubString(index + 1, value);
769 pMap->Add(new String(key), new String(value));
771 SysLog(NID_APP, "Added (%ls, %ls).", key.GetPointer(), value.GetPointer());
779 _AppArg::FillLegacyAppControlResult(IList& list, int res, const IMap* pArgs, const Tizen::Base::String& aId)
783 case APP_CTRL_RESULT_SUCCEEDED:
784 list.Add(* new (std::nothrow) String(APPCONTROL_RESULT_SUCCEEDED));
786 case APP_CTRL_RESULT_CANCELED:
787 list.Add(* new (std::nothrow) String(APPCONTROL_RESULT_CANCELED));
789 case APP_CTRL_RESULT_TERMINATED:
790 list.Add(* new (std::nothrow) String(APPCONTROL_RESULT_TERMINATED));
792 case APP_CTRL_RESULT_ABORTED:
793 list.Add(* new (std::nothrow) String("aborted"));
795 //case APP_CTRL_RESULT_FAILED:
797 list.Add(* new (std::nothrow) String(APPCONTROL_RESULT_FAILED));
806 bool isPathRegistered = false;
807 // handle APP_CTRL_RESULT_SUCCEEDED only
808 std::unique_ptr<IMapEnumerator> pMapEnum(pArgs->GetMapEnumeratorN());
810 while(pMapEnum->MoveNext() == E_SUCCESS)
812 String* pKey = static_cast<String*>(pMapEnum->GetKey());
815 SysLog(NID_APP, "Invalid entry.");
819 if (*pKey == L"path" || *pKey == L"http://tizen.org/appcontrol/data/selected")
821 if (!isPathRegistered)
823 isPathRegistered = true;
827 SysLog(NID_APP, "Selected path key is already registered.");
832 String* pVal = dynamic_cast<String*>(pMapEnum->GetValue());
835 SysLog(NID_APP, "Adding value (%ls).", pVal->GetPointer());
837 StringTokenizer strTok(*pVal, L';');
838 if (strTok.GetTokenCount() == 0)
840 list.Add(* new (std::nothrow) String(*pVal));
845 while(strTok.HasMoreTokens())
847 strTok.GetNextToken(token);
848 list.Add(* new (std::nothrow) String(token));
849 SysLog(NID_APP, "Adding tokenized value (%ls).", token.GetPointer());
860 _AppArg::GetListN(bundle* b, const char* key)
868 const char** pValArray = null;
871 pValArray = appsvc_get_data_array(b, key, &len);
872 if (len == 0 || pValArray == null)
877 ArrayList* pList = new (std::nothrow) ArrayList;
878 SysTryReturn(NID_APP, pList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
882 for (int i = 0; i < len; i++)
884 pList->Add(*new (std::nothrow) String(pValArray[i]));
892 _AppArg::CreateLaunchArg(bundle* b, const String& arg)
894 SysAssertf(b != null, "Valid bundle should be supplied");
900 const char** pSa = new (std::nothrow) const char*[1];
901 SysTryReturnResult(NID_APP, pSa != null, E_OUT_OF_MEMORY, "Insufficient memory.");
902 pSa[0] = _StringConverter::CopyToCharArrayN(arg);
903 bundle_add_str_array(pb, OSP_K_ARG, pSa, 1);
905 bundle_add(pb, TIZEN_NOTIFICATION_DATA, pSa[0]);
911 bundle_add(pb, OSP_K_LAUNCH_TYPE, OSP_V_LAUNCH_TYPE_LAUNCH);
918 _AppArg::CreateLaunchArg(bundle* b, const IList* pList)
920 SysAssertf(b != null, "Valid bundle should be supplied");
924 AddStrArray(pb, OSP_K_ARG, pList);
926 bundle_add(pb, OSP_K_LAUNCH_TYPE, OSP_V_LAUNCH_TYPE_LAUNCH);
933 _AppArg::CreateAppLaunchConditionArg(bundle* b, const String& condition, const IList* pList)
935 SysAssertf(b != null, "Valid bundle should be supplied");
940 AddStrArray(pb, OSP_K_ARG, pList);
942 std::unique_ptr<char[]> p(_StringConverter::CopyToCharArrayN(condition));
945 bundle_add(pb, OSP_K_COND, p.get());
948 bundle_add(pb, OSP_K_LAUNCH_TYPE, OSP_V_LAUNCH_TYPE_CONDTION);
955 _AppArg::CreateAppControlArg(bundle* b, const _AppControlImpl& ac, const IList* pList)
957 SysAssertf(b != null, "Valid bundle should be supplied");
961 AddStrArray(pb, OSP_K_ARG, pList);
963 std::unique_ptr<char[]> pOperation(_StringConverter::CopyToCharArrayN(ac._opId));
966 appsvc_set_operation(pb, pOperation.get());
969 bundle_add(pb, OSP_K_LAUNCH_TYPE, OSP_V_LAUNCH_TYPE_APPCONTROL);
976 _AppArg::CreateAppControlArg(bundle* b, const _AppControlImpl& ac, const String* pUriData, const String* pMimeType, const IMap* pList)
978 SysAssertf(b != null, "Valid bundle should be supplied");
982 std::unique_ptr<char[]> pOperation(_StringConverter::CopyToCharArrayN(ac._opId));
983 if (pOperation.get())
985 appsvc_set_operation(pb, pOperation.get());
990 std::unique_ptr<char[]> pUri(_StringConverter::CopyToCharArrayN(*pUriData));
993 appsvc_set_uri(pb, pUri.get());
999 std::unique_ptr<char[]> pMime(_StringConverter::CopyToCharArrayN(*pMimeType));
1002 appsvc_set_mime(pb, pMime.get());
1006 AddStrMap(pb, pList);
1008 bundle_add(pb, OSP_K_LAUNCH_TYPE, OSP_V_LAUNCH_TYPE_APPCONTROL);
1016 const int MAX_LEN_DATA_CONTROL_REQ_TYPE = 8;
1019 _AppArg::CreateSqlDataControlArg(bundle* b, const _SqlDataControlImpl& dc, _DataControlRequestType requestType,
1020 const IList* pArgList)
1022 SysAssertf(b != null, "Valid bundle should be supplied");
1024 bundle_add(b, OSP_K_LAUNCH_TYPE, OSP_V_LAUNCH_TYPE_DATACONTROL);
1026 char dataControlRequestType[MAX_LEN_DATA_CONTROL_REQ_TYPE] = {0, };
1027 snprintf(dataControlRequestType, MAX_LEN_DATA_CONTROL_REQ_TYPE, "%d", static_cast<int>(requestType));
1028 bundle_add(b, OSP_K_DATACONTROL_REQUEST_TYPE, dataControlRequestType);
1030 std::unique_ptr<char[]> pProvider(_StringConverter::CopyToCharArrayN(dc.__providerId));
1033 bundle_add(b, OSP_K_DATACONTROL_PROVIDER, pProvider.get());
1036 AddStrArray(b, OSP_K_ARG, pArgList);
1043 _AppArg::CreateMapDataControlArg(bundle* b, const _MapDataControlImpl& dc, _DataControlRequestType requestType,
1044 const IList* pArgList)
1046 SysAssertf(b != null, "Valid bundle should be supplied");
1048 bundle_add(b, OSP_K_LAUNCH_TYPE, OSP_V_LAUNCH_TYPE_DATACONTROL);
1050 char dataControlRequestType[MAX_LEN_DATA_CONTROL_REQ_TYPE] = {0, };
1051 snprintf(dataControlRequestType, MAX_LEN_DATA_CONTROL_REQ_TYPE, "%d", static_cast < int >(requestType));
1052 bundle_add(b, OSP_K_DATACONTROL_REQUEST_TYPE, dataControlRequestType);
1054 std::unique_ptr<char[]> pProvider(_StringConverter::CopyToCharArrayN(dc.__providerId));
1057 bundle_add(b, OSP_K_DATACONTROL_PROVIDER, pProvider.get());
1060 AddStrArray(b, OSP_K_ARG, pArgList);
1067 _AppArg::CreateResultArg(bundle* b, const IList* pList)
1069 SysAssertf(b != null, "Valid bundle should be supplied");
1073 AddStrArray(pb, OSP_K_ARG, pList);
1075 _AppMessageImpl::AddData(pb, pList);
1082 _AppArg::CreateResultArg(bundle* b, const IMap* pMap)
1084 SysAssertf(b != null, "Valid bundle should be supplied");
1088 AddStrMap(pb, pMap);
1095 _AppArg::CreateBundleFromSvc(void* svc)
1097 bundle* pBundle = GetBundleFromSvc(svc);
1100 return bundle_dup(pBundle);
1108 _AppArg::GetBundleFromSvc(void* svc)
1117 DummyS* pDummy = static_cast<DummyS*>(svc);
1119 if (pDummy && pDummy->pData)
1121 return pDummy->pData;
1129 _AppArg::GetRequestId(int num)
1132 str.Format(10, L"req%05d", num);
1138 _AppArg::GetRequestId(const String& str)
1143 result r = str.SubString(3, sub);
1144 SysTryReturn(NID_APP, !IsFailed(r), -1, r, "[%s] Propagating.", GetErrorMessage(r));
1146 r = Integer::Parse(sub, i);
1147 SysTryReturn(NID_APP, !IsFailed(r), -1, r, "[%s] Propagating.", GetErrorMessage(r));
1154 _AppArg::UpdateAppId(bundle* b, const AppId& appId)
1156 SysTryReturnVoidResult(NID_APP, b != null, E_INVALID_STATE, "[E_INVALID_STATE] Improper bundle state.");
1158 std::unique_ptr<char[]> pId(_StringConverter::CopyToCharArrayN(appId));
1159 SysTryReturnVoidResult(NID_APP, pId != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Converting %ls failed.", appId.GetPointer());
1161 bundle_add(b, OSP_K_APPID, pId.get());
1163 appsvc_set_appid(b, pId.get());
1168 _AppArg::UpdateRequestId(bundle* pBundle, int reqId)
1170 SysTryReturnVoidResult(NID_APP, pBundle != null, E_INVALID_STATE, "[E_INVALID_STATE] Improper bundle state.");
1174 //SysLog(NID_APP, "Requested ID is %d", reqId);
1178 char buffer[32] = {0, };
1179 snprintf(buffer, 32, "%d", reqId);
1180 bundle_add(pBundle, OSP_K_REQUEST_ID, buffer);
1185 _AppArg::GetRequestIdFromBundle(bundle* pBundle)
1187 const char* p = appsvc_get_data(pBundle, OSP_K_REQUEST_ID);
1194 return (i < 0) ? -1 : i;
1199 _AppArg::UpdateWindowHandle(bundle* pBundle, long handle)
1203 SysLog(NID_APP, "Invalid window handle.");
1207 char handleName[32] = {0, };
1208 snprintf(handleName, 32, "%ld", handle);
1210 bundle_add(pBundle, BUNDLE_KEY_WINDOW, handleName);
1211 SysLog(NID_APP, "Window Handle 0x%x added.", handle);
1218 _AppArg::PrintSvcHandle(void* svc)
1220 service_h service = static_cast<service_h>(svc);
1222 if (service == null)
1227 Print(GetBundleFromSvc(service));
1232 BundlePrintIterFnCb(const char* pKey, const int type, const bundle_keyval_t* pVal, void* pData)
1240 case BUNDLE_TYPE_STR:
1241 bundle_keyval_get_basic_val(const_cast<bundle_keyval_t*>(pVal), reinterpret_cast<void**>(&pStr), &size);
1244 SysLog(NID_APP, "(%s, %s)", pKey, pStr);
1248 SysLog(NID_APP, "Invalid type for %s : %d", pKey, type);
1255 _AppArg::Print(bundle* b)
1262 const char* p = null;
1263 p = appsvc_get_data(b, AUL_K_CALLER_PID);
1266 SysLog(NID_APP, "CallerPId[%s]", p);
1269 p = appsvc_get_data(b, AUL_K_WAIT_RESULT);
1272 SysLog(NID_APP, "WaitResult[%s]", p);
1275 p = appsvc_get_data(b, OSP_K_COND);
1278 SysLog(NID_APP, "Condition[%s]", p);
1281 p = appsvc_get_operation(b);
1284 SysLog(NID_APP, "operation[%s]", p);
1287 p = appsvc_get_uri(b);
1290 SysLog(NID_APP, "uri[%s]", p);
1293 p = appsvc_get_mime(b);
1296 SysLog(NID_APP, "mime[%s]", p);
1299 p = appsvc_get_category(b);
1302 SysLog(NID_APP, "Category[%s]", p);
1305 bundle_foreach(b, BundlePrintIterFnCb, NULL);
1308 const char** pa = appsvc_get_data_array(b, OSP_K_ARG, &len);
1311 for (int i = 0; i < len; i++)
1315 SysLog(NID_APP, "%dth arg [%s]", i, pa[i]);