#include <aul.h>
#include <app.h>
#include <appsvc/appsvc.h>
+#include <Ecore_X.h>
#include <FBaseInteger.h>
#include <FBaseColArrayList.h>
using namespace Tizen::Base::Utility;
using namespace Tizen::App::Package;
+
+extern "C" int appsvc_allow_transient_app(bundle*, Ecore_X_Window);
+
namespace Tizen { namespace App
{
static const char OSP_V_REQUEST_TYPE_MAP_INSERT[] = "map_insert";
static const char OSP_V_REQUEST_TYPE_MAP_UPDATE[] = "map_update";
static const char OSP_V_REQUEST_TYPE_MAP_DELETE[] = "map_delete";
-static const char BUNDLE_KEY_WINDOW[] = "__APP_SVC_K_WIN_ID__";
static const char BUNDLE_KEY_PREFIX_AUL[] = "__AUL_";
static const char BUNDLE_KEY_PREFIX_SERVICE[] = "__APP_SVC_";
static const char BUNDLE_KEY_PREFIX_OSP[] = "__OSP_";
result
+_AppArg::Construct(const _AppMessageImpl& msg, const String& oId, const String* pUri, const String* pMime)
+{
+ __pBundle = bundle_dup(const_cast<bundle*>(msg.GetBundle()));
+ SysTryReturnResult(NID_APP, __pBundle != null, E_OUT_OF_MEMORY, "Bundle creation failure.");
+
+ return CreateAppControlArg(__pBundle, oId, pUri, pMime, null);
+}
+
+
+result
_AppArg::Construct(const _SqlDataControlImpl& dc, _DataControlRequestType requestType, const IList* pList)
{
__pBundle = bundle_create();
return null;
}
- ArrayList* pList = _AppMessageImpl::GetValueArray(__pBundle, OSP_K_ARG);
+ ArrayList* pList = _AppMessageImpl::GetValueArrayN(__pBundle, OSP_K_ARG);
if (pList)
{
pHashMap->Add(new (std::nothrow) String(TIZEN_APPCONTROL_DATA_LEGACY), pList);
bundle_keyval_get_array_val(const_cast<bundle_keyval_t*>(pVal), &pArr, &size, NULL);
if (pArr && size > 0)
{
- String str = static_cast<char*>(*pArr);
- for (size_t i = 1; i < size; i++)
+ ArrayList* pList = new (std::nothrow) ArrayList(SingleObjectDeleter);
+ if (pList)
{
- str += L';';
- str += static_cast<char*>(*(pArr + i));
+ pList->Construct();
+
+ for (size_t i = 0; i < size; i++)
+ {
+ // type unsafe ugly static casting required
+ pList->Add(new (std::nothrow) String(static_cast<char*>(*(pArr + i))));
+ }
+
+ const int count = pList->GetCount();
+ if (count != 0)
+ {
+ SysLog(NID_APP, "Adding %d elements for %s", count, pKey);
+ pMap->Add(new (std::nothrow) String(pKey), pList);
+ }
+ else
+ {
+ SysLog(NID_APP, "No object for %s", pKey);
+ delete pList;
+ }
}
-
- SysLog(NID_APP, "(%s, %ls)", pKey, str.GetPointer());
- pMap->Add(new (std::nothrow) String(pKey), new (std::nothrow) String(str));
}
else
{
AppId
_AppArg::GetCallerAppId(void) const
{
- pid_t callerPid = GetCallerPid();
- SysTryReturn(NID_APP, callerPid > 0, L"", E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Wrong process id: %d.", callerPid);
+ const char* pBundleValue = bundle_get_val(__pBundle, AUL_K_CALLER_APPID);
- char appId[PATH_MAX] = {0, };
- 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);
-
- return String(appId);
+ return String(pBundleValue);
}
AppId
_AppArg::GetCalleeAppId(void) const
{
- const char* pBundleValue = bundle_get_val(__pBundle, AUL_K_CALLEE_PID);
-
- SysTryReturn(NID_APP, pBundleValue != null, L"", E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Object not found.");
+ const char* pBundleValue = bundle_get_val(__pBundle, AUL_K_CALLEE_APPID);
- pid_t calleePid = atoi(pBundleValue);
- SysTryReturn(NID_APP, calleePid > 0, L"", E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Wrong process id: %d.", calleePid);
-
- char appId[PATH_MAX] = {0, };
- 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);
+ String retVal = pBundleValue;
String temp;
- String retVal = appId;
// [INFO] ugly code for submode callee
retVal.SubString(11, temp);
if (temp == L"_AppControl")
void
-_AppArg::SaveCalleeAppId(void)
-{
- const AppId& appId = GetCalleeAppId();
-
- std::unique_ptr<char[]> pVal(_StringConverter::CopyToCharArrayN(appId));
-
- appsvc_add_data(__pBundle, OSP_K_CALLEE_APPID, pVal.get());
-}
-
-
-void
_AppArg::AddListFromBundle(ArrayList* pList, bundle* bk, const char* key)
{
bundle* pBundle = bk;
result
-_AppArg::AddStrArray(bundle* b, const char* key, const IList* pList)
+_AppArg::AddStrArray(bundle* pb, const char* key, const IList* pList)
{
- bundle* pb = b;
SysTryReturnResult(NID_APP, pb != NULL, E_INVALID_ARG, "Empty bundle.");
if (pList == null || pList->GetCount() == 0)
return E_SUCCESS;
}
- int i = 0;
- const int count = pList->GetCount();
-
- const char** pSa = new (std::nothrow) const char*[count];
- SysTryReturnResult(NID_APP, pSa != null, E_OUT_OF_MEMORY, "Memory allocation failure with cound %d.", count);
-
- for (i = 0; i < count; i++)
- {
- pSa[i] = null;
-
- const String* pStr = static_cast<const String*>(pList->GetAt(i));
- if (pStr)
- {
- pSa[i] = _StringConverter::CopyToCharArrayN(*pStr);
- }
- }
-
- result r = E_SUCCESS;
-
- int ret = bundle_add_str_array(pb, key, pSa, count);
- if (ret >= 0)
- {
- _AppMessageImpl::AddData(pb, pList);
- }
- else
- {
- SysLog(NID_APP, "Bundle add failre :%d.", ret);
- r = E_SYSTEM;
- }
+ _AppMessageImpl::AddValueArray(pb, key, pList);
_AppMessageImpl::AddData(pb, pList);
-//CATCH:
- for (i = 0; i < count; i++)
- {
- delete[] pSa[i];
- }
-
- delete[] pSa;
-
- return r;
+ return E_SUCCESS;
}
else if (typeid(*pObj) == typeid(const ArrayList))
{
const ArrayList* pList = static_cast<const ArrayList*>(pEnum->GetValue());
- if (pList && *pKey == TIZEN_APPCONTROL_DATA_LEGACY)
+ if (pList)
{
- SysLog(NID_APP, "Legacy AppControl argument");
- _AppArg::AddStrArray(pb, OSP_K_ARG, pList);
- _AppMessageImpl::AddData(pb, pList);
+ SysLog(NID_APP, "ArrayList type");
+
+ _AppMessageImpl::AddValueArray(pb, *pKey, pList);
}
}
else if (typeid(*pObj) == typeid(const ByteBuffer))
result
-_AppArg::CreateAppControlArg(bundle* b, const _AppControlImpl& ac, const String* pUriData, const String* pMimeType, const IMap* pList)
+_AppArg::CreateAppControlArg(bundle* b, const _AppControlImpl& ac, const String* pUriData, const String* pMimeType, const IMap* pMap)
+{
+ return CreateAppControlArg(b, ac._opId, pUriData, pMimeType, pMap);
+}
+
+
+result
+_AppArg::CreateAppControlArg(bundle* b, const String& oId, const String* pUriData, const String* pMimeType, const IMap* pMap)
{
SysAssertf(b != null, "Valid bundle should be supplied");
bundle* pb = b;
- std::unique_ptr<char[]> pOperation(_StringConverter::CopyToCharArrayN(ac._opId));
+ std::unique_ptr<char[]> pOperation(_StringConverter::CopyToCharArrayN(oId));
if (pOperation.get())
{
appsvc_set_operation(pb, pOperation.get());
}
}
- AddStrMap(pb, pList);
+ AddStrMap(pb, pMap);
bundle_add(pb, OSP_K_LAUNCH_TYPE, OSP_V_LAUNCH_TYPE_APPCONTROL);
std::unique_ptr<char[]> pId(_StringConverter::CopyToCharArrayN(appId));
SysTryReturnVoidResult(NID_APP, pId != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Converting %ls failed.", appId.GetPointer());
- bundle_add(b, OSP_K_APPID, pId.get());
+ int res = bundle_add(b, OSP_K_APPID, pId.get());
+ if (res < 0 && errno == EPERM) // key exists
+ {
+ bundle_del(b, OSP_K_APPID);
+ bundle_add(b, OSP_K_APPID, pId.get());
+ }
appsvc_set_appid(b, pId.get());
}
char buffer[32] = {0, };
snprintf(buffer, 32, "%d", reqId);
- bundle_add(pBundle, OSP_K_REQUEST_ID, buffer);
+ int res = bundle_add(pBundle, OSP_K_REQUEST_ID, buffer);
+ if (res < 0 && errno == EPERM) // key exists
+ {
+ bundle_del(pBundle, OSP_K_REQUEST_ID);
+ bundle_add(pBundle, OSP_K_REQUEST_ID, buffer);
+ }
}
+void
+_AppArg::UpdateKeyValue(bundle* pBundle, const char* pKey, const String& value)
+{
+ SysTryReturnVoidResult(NID_APP, pBundle != null, E_INVALID_STATE, "[E_INVALID_STATE] Improper bundle state.");
+
+ char pBuffer[128] = {0, };
+ snprintf(pBuffer, 128, "%ls", value.GetPointer());
+ int res = bundle_add(pBundle, pKey, pBuffer);
+ if (res < 0 && errno == EPERM) // key exists
+ {
+ bundle_del(pBundle, pKey);
+ bundle_add(pBundle, pKey, pBuffer);
+ }
+}
int
_AppArg::GetRequestIdFromBundle(bundle* pBundle)
result
_AppArg::UpdateWindowHandle(bundle* pBundle, long handle)
{
- if (handle == -1)
- {
- SysLog(NID_APP, "Invalid window handle.");
- return E_SUCCESS;
- }
-
- char handleName[32] = {0, };
- snprintf(handleName, 32, "%ld", handle);
+ appsvc_allow_transient_app(pBundle, handle);
- bundle_add(pBundle, BUNDLE_KEY_WINDOW, handleName);
SysLog(NID_APP, "Window Handle 0x%x added.", handle);
return E_SUCCESS;