#include <aul.h>
#include <bundle.h>
#include <appsvc/appsvc.h>
-#include <app_manager.h>
-#include <heynoti.h>
+#include <vconf.h>
+#include <pkgmgr-info.h>
#include <FBaseObject.h>
#include <FBaseString.h>
#include "FAppPkg_PackageManagerImpl.h"
#include "FApp_Types.h"
#include "FApp_Aul.h"
+#include "FApp_AppArg.h"
#include "FApp_TemplateUtil.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-extern int aul_listen_app_dead_signal(int (* func)(int, void*), void* data);
-#ifdef __cplusplus
-}
-#endif
using namespace Tizen::App::Package;
using namespace Tizen::Base;
namespace
{
-
-const char _DESKTOP_FILE_PATH[] = "/opt/share/applications";
-const char _DESKTOP_FILE_PATH_FORMAT[] = "%s/%s.desktop";
-
-const char _X_TIZEN_SVC[] = "x-tizen-svc"; //X-TIZEN-SVC=[operation1] | [URI1] | [MIME1] ; [operation2] | [URI2] | [MIME2]
-const int _MAX_TIZEN_SVC_DESC_LEN = 1024;
-
-const int _MAX_CATEGORY = 12;
-const int _MAX_PACKAGE_ID_LENGTH = 10;
+const int _MAX_CATEGORY = 34;
// borrowed from app-svc/include/pri_key.h
#define APP_SVC_K_RES_VAL "__APP_SVC_K_RES_VAL__"
struct _CategoryList
{
const char category[_MAX_CATEGORY];
- _AppType type;
+ const _AppType type;
};
static const _CategoryList _CATEGORY_LIST[] =
{"home-screen", _APP_TYPE_HOME_APP},
{"lock-screen", _APP_TYPE_LOCK_APP},
{"ime", _APP_TYPE_IME_APP},
+ {"http://tizen.org/category/homeapp", _APP_TYPE_HOME_APP},
+ {"http://tizen.org/category/lockapp", _APP_TYPE_LOCK_APP},
+ {"http://tizen.org/category/ime", _APP_TYPE_IME_APP},
};
static const int _NUM_CATEGORY = sizeof(_CATEGORY_LIST) / sizeof(_CategoryList);
}
result
-_Aul::SendResult(bundle* b, appsvc_result_val res)
+_Aul::SendResult(bundle* b, appsvc_result_val res, bool isSubMode, bool isServiceApp)
{
// to skip error handling, of appsvc_send_result, use aul_send_service_result() directly.
//int ret = appsvc_send_result(b, res);
snprintf(tmp, 32, "%d", static_cast<int>(res));
appsvc_add_data(b, APP_SVC_K_RES_VAL, tmp);
+ if (isSubMode)
+ {
+ _AppArg::UpdateSubMode(b);
+ }
+
+ if (isServiceApp)
+ {
+ _AppArg::UpdateServiceApp(b);
+ }
+
const int aul_ret = aul_send_service_result(b);
result r = GetConvertedResult(aul_ret, "SendResult");
bool
-_Aul::IsRunning(const AppId& appId, const String& exeName)
+_Aul::IsRunning(const String& appId)
{
- char slpPackageName[MAX_SLP_PACKAGE_ID] = {0, };
- bool isRunning = false;
-
- _PackageManagerImpl* pPackageManagerImpl = _PackageManagerImpl::GetInstance();
- SysTryReturn(NID_APP, pPackageManagerImpl != null, false, E_INVALID_STATE, "[E_INVALID_STATE] Invalid package instance.");
-
- pPackageManagerImpl->GetPackageName(appId, &exeName, slpPackageName, MAX_SLP_PACKAGE_ID);
+ std::unique_ptr<char[]> pPackageId(_StringConverter::CopyToCharArrayN(appId));
- app_manager_is_running(slpPackageName, &isRunning);
-
- SysLog(NID_APP, "'%s' %s running now.", slpPackageName, (isRunning == true) ? "is" : "is NOT");
+ const bool isRunning = (aul_app_is_running(pPackageId.get()) > 0);
+ SysLog(NID_APP, "'%ls' %s running now.", appId.GetPointer(), (isRunning) ? "is" : "is NOT");
return isRunning;
}
-bool
-_Aul::IsRunning(const String& packageName)
-{
- bool isRunning = false;
- std::unique_ptr<char[]> pSlpPackageName(_StringConverter::CopyToCharArrayN(packageName));
-
- app_manager_is_running(pSlpPackageName.get(), &isRunning);
-
- SysLog(NID_APP, "'%ls' %s running now.", packageName.GetPointer(), (isRunning) ? "is" : "is NOT");
- return isRunning;
-}
-
-
-void
-_Aul::SetOnAppTerminatedCb(int (* pf_app_dead_handler)(int pid, void* pData), void* pData)
-{
- aul_listen_app_dead_signal(pf_app_dead_handler, pData);
- SysLog(NID_APP, "'app_dead_handler is set.");
-}
-
result
_Aul::TerminateApplicationByPid(int pid)
{
- int ret_aul = aul_terminate_pid(pid);
+ int ret_aul = aul_subapp_terminate_request_pid(pid);
return GetConvertedResult(ret_aul, "TerminateApplicationByPid");
}
return r;
}
+typedef void (* cbForVconf)(keynode_t* node, void *pData);
+
result
-_Aul::SetPowerOffNotiListener( void (*powerOffCb)(void *pData), void *pData)
+_Aul::SetPowerOffNotiListener( void (*powerOffCb)(void* node, void *pData), void *pData)
{
+
+#if 1
+ int ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS, (cbForVconf)powerOffCb, pData);
+ SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "It failed to set power off");
+#else
int heyFd = heynoti_init();
SysTryReturnResult(NID_APP, heyFd >= 0, E_SYSTEM, "heynoti_init failed.");
ret = heynoti_attach_handler(heyFd);
SysTryReturnResult(NID_APP, ret >= 0, E_SYSTEM, "heynoti_attach_handler failed.");
+#endif
return E_SUCCESS;
}
+
+// _Aul::GetAppType is provided for installer usage
int
_Aul::GetAppType(const String& category)
{
return ret;
}
-bool _Aul::IsInstalled(const AppId& appId)
+
+bool
+_Aul::IsInstalled(const AppId& appId)
{
String packageId;
packageId = _PackageManagerImpl::GetPackageIdByAppId(appId);
return _PackageManagerImpl::GetInstance()->IsPackageInstalled(packageId);
}
-result
-_Aul::_DesktopFile::MakePath(const AppId& appId, char* path, int size)
-{
- SysTryReturnResult(NID_APP, path != null, E_INVALID_ARG, "");
-
- std::unique_ptr<char[]> pAppId(_StringConverter::CopyToCharArrayN(appId));
- SysTryReturnResult(NID_APP, pAppId != null, E_OUT_OF_MEMORY, "Failed to allocate memory for 'pAppId'");
-
- snprintf(path, size, _DESKTOP_FILE_PATH_FORMAT, _DESKTOP_FILE_PATH, pAppId.get());
-
- return E_SUCCESS;
-}
-
-result
-_Aul::_DesktopFile::UpdateService(const AppId& appId, const char* value)
-{
- char path[FILENAME_MAX] = {0, };
- MakePath(appId, path, FILENAME_MAX);
-
- return UpdateField(path, _X_TIZEN_SVC, value);
-}
-
-result
-_Aul::_DesktopFile::RemoveService(const AppId& appId, const char* operationOnlyValue)
+String
+_Aul::GetMainAppId(const char* appid)
{
- char path[FILENAME_MAX] = {0, };
- MakePath(appId, path, FILENAME_MAX);
-
- return UpdateField(path, _X_TIZEN_SVC, operationOnlyValue, true);
-}
-
-//
-// Update value of specified field.
-// currently only "x-slp-svc" field is supported.
-//
-#define BUFFER_SIZE 1024
-result
-_Aul::_DesktopFile::UpdateField(const char* path, const char* fieldName, const char* value, bool isRemove)
-{
- SysTryReturnResult(NID_APP, path != null, E_INVALID_ARG, "path should not be null.");
- SysTryReturnResult(NID_APP, fieldName != null, E_INVALID_ARG, "fieldName should not be null.");
- SysTryReturnResult(NID_APP, value != null, E_INVALID_ARG, "value should not be null.");
-
- FILE* fp = fopen(path, "r+");
- SysTryReturnResult(NID_APP, fp != null, E_SYSTEM, "falied to open '%s' due to %s", path, strerror(errno));
-
- char buffer[BUFFER_SIZE] = {0, };
- bool found = false;
- int len = 0;
- int pos = 0;
- int foundpos = 0;
- result r = E_SUCCESS;
- int remains = 0;
-
- ArrayListT<char*> buffers;
- buffers.Construct();
-
- char* pCurrent = null;
-
- while (fgets(buffer, BUFFER_SIZE, fp) != NULL)
+ pkgmgrinfo_appinfo_h handle = NULL;
+ int ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle);
+ if (ret != PMINFO_R_OK)
{
- len = strlen(buffer);
- SysTryCatch(NID_APP, len < BUFFER_SIZE, , r = E_INVALID_ARG, "strlen returns invalid value. (%d)", len );
-
- if (found)
- {
- pCurrent = new (std::nothrow) char[len + 1];
- SysTryCatch(NID_APP, pCurrent != null, , r = E_OUT_OF_MEMORY, "failed to allocate mem pCurrent");
-
- strncpy(pCurrent, buffer, len);
- buffers.Add(pCurrent);
- }
- else
- {
- if (strncmp(buffer, fieldName, len) == 0)
- {
- int fieldNameLen = strlen(fieldName);
- SysTryCatch(NID_APP, len > fieldNameLen, , E_INVALID_ARG, "[E_INVALID_ARG] fieldName(%s)", fieldName);
-
- pCurrent = UpdateServiceValueN(buffer + fieldNameLen, value, isRemove);
- SysTryCatch(NID_APP, pCurrent != null, , r = GetLastResult(), "[%s] UpdateServiceValue failed", GetErrorMessage(GetLastResult()));
-
- buffers.Add(pCurrent);
-
- foundpos = pos;
- found = true;
- }
- }
-
- pos += len;
+ return String();
}
- if (found)
- {
- fsetpos(fp, (fpos_t*) &foundpos);
+ char* mainid = NULL;
+ ret = pkgmgrinfo_appinfo_get_submode_mainid(handle, &mainid);
+ SysTryLog(NID_APP, ret == PMINFO_R_OK, "Cannot get main id for %s.", appid);
- remains = buffers.GetCount(); // prevent infinite loop
- while (buffers.GetCount() > 0 && remains-- > 0)
- {
- pCurrent = null;
- buffers.GetAt(0, pCurrent);
- buffers.RemoveAt(0);
- SysTryCatch(NID_APP, pCurrent != null, , r = E_INVALID_STATE, "");
-
- fputs(pCurrent, fp);
- len = strlen(pCurrent);
- pos += len;
- delete[] pCurrent;
- }
-
- int ret = truncate(path, pos);
- SysTryLog(NID_APP, ret == 0, "Truncate failure (%s).", strerror(errno));
- }
- else
- {
- char svctext[_MAX_TIZEN_SVC_DESC_LEN] = {0, };
- snprintf(svctext, _MAX_TIZEN_SVC_DESC_LEN, "%s=%s\n", fieldName, value);
- fputs(svctext, fp);
- }
- fclose(fp);
-
- return E_SUCCESS;
-
-CATCH:
-
- remains = buffers.GetCount(); // prevent infinite loop
- while (buffers.GetCount() > 0 && remains-- > 0)
- {
- pCurrent = null;
- buffers.GetAt(0, pCurrent);
- buffers.RemoveAt(0);
- if (pCurrent != null)
- {
- delete[] pCurrent;
- }
- }
-
- fclose(fp);
-
- return r;
+ const String tmp = String(mainid);
+ pkgmgrinfo_appinfo_destroy_appinfo(handle);
+ return tmp;
}
-//
-// Tizen service string example
-// X-TIZEN-SVC= http://tizen.org/appcontrol/operation/pick|NULL|image/jpge; http://tizen.org/appcontrol/operation/pick|NULL|video/mp4; http://tizen.org/appcontrol/operation/pick|NULL|NULL; http://tizen.org/appcontrol/operation/pview|NULL|NULL
-//
-char*
-_Aul::_DesktopFile::UpdateServiceValueN(char* buffer, const char* newValue, bool isRemove)
-{
- SysTryReturn(NID_APP, buffer != null, null, E_INVALID_ARG, "");
- SysTryReturn(NID_APP, newValue != null, null, E_INVALID_ARG, "");
-
- SysLog(NID_APP, "current(%s), new(%s), isRemove(%s)", buffer, newValue, (isRemove) ? "true" : "false");
-
- String buf(buffer);
- bool found = false;
-
- const String& servicePattern(L"([A-Za-z&=:/\\.\\-]*);?");
-
- ArrayList services;
- String resultString;
- Utility::RegularExpression regex;
- result r = regex.Construct(servicePattern);
- SysTryReturn(NID_APP, !IsFailed(r), null, r, "");
-
- String newOperation;
- String newUrl;
- String newMimeType;
- String newService(newValue);
-
- if (isRemove == false)
- {
- ParseService(newService, newOperation, newUrl, newMimeType);
- }
- else
- {
- newOperation = newValue;
- }
-
- services.Construct();
-
- while (regex.Consume(buf, &services) == true)
+AppId
+_Aul::GetRealAppId(const AppId& appId)
+{
+ String temp;
+ appId.SubString(11, temp);
+ if (temp == String(SUBMODE_NAME))
{
- String* pCurrentService = (String*) services.GetAt(1);
- services.RemoveAll(false);
-
- String operation;
- String url;
- String mimeType;
-
- ParseService(*pCurrentService, operation, url, mimeType);
-
- if (operation == newOperation)
+ std::unique_ptr<char[]> pAppId(_StringConverter::CopyToCharArrayN(appId));
+ const String& main = GetMainAppId(pAppId.get());
+ if (!main.IsEmpty())
{
- if (isRemove == true)
- {
- SysLog(NID_APP, "opreration '%ls' will be removed", operation.GetPointer());
- }
- else
- {
- SysAssertf(found == false, "It's assumed that service doesn't have duplicated operation in tizen desktop file. But it isn't, so now we have to check this case.");
- // replace operation.
- if (found == false) // ( if duplicated operation is already exist, It will be keeped.
- {
- // update value
- AppendServiceValueToString(resultString, newService);
- SysLog(NID_APP, "opreration '%ls;%ls;%ls' will be updated to ;%ls;%ls", operation.GetPointer(), url.GetPointer(), mimeType.GetPointer(), newUrl.GetPointer(), mimeType.GetPointer());
- }
- }
- found = true;
+ SysLog(NID_APP, "main Id is %ls", main.GetPointer());
+ return main;
}
- else
- {
- // add not specified service.
- AppendServiceValueToString(resultString, *pCurrentService);
- }
-
- delete pCurrentService;
- }
-
- if (found == false && isRemove == false)
- {
- AppendServiceValueToString(resultString, newService);
- SysLog(NID_APP, "opreration '%ls;%ls;%ls' will be added", newOperation.GetPointer(), newUrl.GetPointer(), newMimeType.GetPointer());
- }
-
- SysLog(NID_APP, "updated string is '%ls'", resultString.GetPointer());
- return _StringConverter::CopyToCharArrayN(resultString);
-}
-
-
-void
-_Aul::_DesktopFile::AppendServiceValueToString(String& serviceString, const String& newVaue)
-{
- if (serviceString.GetLength() > 0)
- {
- serviceString += ";";
- }
-
- serviceString += newVaue;
-}
-
-
-result
-_Aul::_DesktopFile::ParseService(const String& service, String& operation, String& url, String& mimeType)
-{
- SysLog(NID_APP, "service(%ls)", service.GetPointer());
-
- const String& serviceDetailPattern(L"([A-Za-z&=/\\.\\-]*):(.*://[A-Za-z&=/\\.\\-]*|[A-Za-z&=/\\.\\-]*):([A-Za-z&=/\\.\\-]*)");
-
- Utility::RegularExpression regexDetail;
- result r = regexDetail.Construct(serviceDetailPattern);
- SysTryReturn(NID_APP, !IsFailed(r), null, r, "[%s] RegularExpression::Construct(L\"%ls\") failed.", GetErrorMessage(r), serviceDetailPattern.GetPointer());
-
- ArrayList matchedItems;
- matchedItems.Construct();
- regexDetail.Match(service, true, &matchedItems);
-
- int matchedCount = matchedItems.GetCount();
- SysTryLog(NID_APP, matchedCount == 4, "It's assumed that x-slp-svc value always have operation:url:mime in tizen desktop file. But it isn't or our parser is invalid. so now we have to check this case. %d", matchedItems.GetCount());
-
- if (matchedCount > 1)
- {
- operation = *(String*) matchedItems.GetAt(1);
}
- if (matchedCount > 2)
- {
- url = *(String*) matchedItems.GetAt(2);
- }
-
- if (matchedCount > 3)
- {
- mimeType = *(String*) matchedItems.GetAt(3);
- }
-
- SysLog(NID_APP, "matched(%d) : (%ls;%ls;%ls)", matchedItems.GetCount(), operation.GetPointer(), url.GetPointer(), mimeType.GetPointer());
- matchedItems.RemoveAll(true);
-
- return E_SUCCESS;
+ return appId;
}
} } // Tizen::App