Merge "Update deprecated libprivilege-control API functions." into tizen
[platform/framework/native/appfw.git] / src / app / FApp_AppControlImpl.cpp
index 2e0aca6..d11820d 100644 (file)
@@ -56,8 +56,8 @@ using namespace Tizen::Io;
 namespace
 {
 
-static const int _REQ_ID_INVALID = -1;
 const wchar_t ACTL_IMPLICIT_PLUGIN[] = L"libosp-ac-implicit.so";
+const wchar_t TIZEN_ALIAS_APPID_PREFIX[] = L"tizen.";
 
 }
 
@@ -66,9 +66,9 @@ namespace Tizen { namespace App
 
 _AppControlImpl::_AppControlImpl(const AppControl& value)
        : _appControl(value)
-       , _reqId(_REQ_ID_INVALID)
+       , _reqId(APPCONTROL_REQUEST_ID_INVALID)
        , _property(_APPCONTROL_PROPERTY_NONE)
-       , _processId(_REQ_ID_INVALID)
+       , _processId(APPCONTROL_REQUEST_ID_INVALID)
 {
        __appControlResponseEventList.Construct();
 }
@@ -104,7 +104,17 @@ _AppControlImpl::CreateN(const String& path, const String& aId, const String& oI
 {
        SysTryReturn(NID_APP, !path.IsEmpty(), null, E_INVALID_ARG, "[E_INVALID_ARG] Path is empty.");
        SysTryReturn(NID_APP, !aId.IsEmpty(), null, E_INVALID_ARG, "[E_INVALID_ARG] Provider Id is empty.");
-       SysTryReturn(NID_APP, !oId.IsEmpty(), null, E_INVALID_ARG, "[E_INVALID_ARG] Operation Id is empty.");
+
+       String actualAppId = aId;
+       if (aId.StartsWith(TIZEN_ALIAS_APPID_PREFIX, 0))
+       {
+               // little bit of performance tweak
+               actualAppId = _AppControlRegistry::GetInstance()->GetAliasAppId(aId);
+       }
+
+       const bool isInstalled = _Aul::IsInstalled(actualAppId);
+       SysTryReturn(NID_APP, isInstalled, null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] %ls not installed.", actualAppId.GetPointer());
+
 
        AppControl* pAc = new (std::nothrow) AppControl;
        SysTryReturn(NID_APP, pAc != null, null, E_OUT_OF_MEMORY, "AppControl allocation failure.");
@@ -114,25 +124,13 @@ _AppControlImpl::CreateN(const String& path, const String& aId, const String& oI
 
        pImpl->_path = path;
        pImpl->_appId = aId;
-       pImpl->_opId = oId;
+       pImpl->_opId = (oId.IsEmpty()) ? TIZEN_OPERATION_MAIN : oId;
        pImpl->_property = prop;
 
        return pAc;
 }
 
 
-const _AppControlImpl*
-_AppControlImpl::GetInstance(const AppControl& ac)
-{
-       return ac.__pAppControlImpl;
-}
-
-_AppControlImpl*
-_AppControlImpl::GetInstance(AppControl& ac)
-{
-       return ac.__pAppControlImpl;
-}
-
 _IAppControlPluginProvider*
 _AppControlImpl::GetAppControlPluginProvider(const String& path)
 {
@@ -169,25 +167,7 @@ _AppControlImpl::FindAndStart(const String& operationId, const String* pUriPatte
 
        if (pDataType)
        {
-               String mimeType = *pDataType;
-
-               if ((*pDataType)[0] == L'.')
-               {
-                       SysLog(NID_APP, "Extension to MIME conversion for %ls", pDataType->GetPointer());
-
-#if 0
-                       String ext;
-                       pDataType->SubString(1, ext);
-
-                       result r = _AppControlManager::GetMimeFromExt(ext, mimeType);
-
-                       SysTryReturn(NID_APP, !IsFailed(r), null, r, "[%s] MIME type conversion failure for %ls.", GetErrorMessage(r), ext.GetPointer());
-
-                       pMimeType = &mimeType;
-
-                       SysLog(NID_APP, "Conversion : %ls -> %ls.", pDataType->GetPointer(), pMimeType->GetPointer());
-#endif
-               }
+               const String& mimeType = _AppControlManager::GetMimeTypeFromDataType(*pDataType);
 
                _AppMessageImpl::SetMime(pBundle.get(), mimeType);
        }
@@ -205,7 +185,7 @@ result
 _AppControlImpl::StartImplicit(const _AppMessageImpl& msg, IEventListener* pListener, bool isLegacy)
 {
        SysLog(NID_APP, "Enter");
-       int req = _REQ_ID_INVALID;
+       int req = APPCONTROL_REQUEST_ID_INVALID;
 
        _IAppControlPluginProvider* pProvider = GetAppControlPluginProvider(ACTL_IMPLICIT_PLUGIN);
        if (pProvider == null)
@@ -271,7 +251,7 @@ _AppControlImpl::Start(const IList* pDataList, IAppControlEventListener* pListen
        _InProcessInfo* pInfo = _AppControlManager::GetInstance()->__inAppManager.FindItem(_reqId);
        SysTryReturnResult(NID_APP, pInfo == null, E_IN_PROGRESS, "Request ID %d is already in progress.", _reqId);
 
-       int req = _REQ_ID_INVALID;
+       int req = APPCONTROL_REQUEST_ID_INVALID;
 
        _IAppControlPluginProvider* pProvider = GetAppControlPluginProvider(_path);
        if (pProvider == null)
@@ -296,7 +276,6 @@ _AppControlImpl::Start(const IList* pDataList, IAppControlEventListener* pListen
                pProvider->Release();
        }
 
-       // after acquring request number, pLib should be managed from the list, not CATCH
        if (IsFailed(r))
        {
                _AppControlManager::GetInstance()->__inAppManager.RemoveItem(req);
@@ -318,7 +297,7 @@ _AppControlImpl::Start(const String* pUriData, const String* pMimeType, const IM
        _InProcessInfo* pInfo = _AppControlManager::GetInstance()->__inAppManager.FindItem(_reqId);
        SysTryReturnResult(NID_APP, pInfo == null, E_IN_PROGRESS, "Request ID %d is already in progress.", _reqId);
 
-       int req = _REQ_ID_INVALID;
+       int req = APPCONTROL_REQUEST_ID_INVALID;
        result r = E_SUCCESS;
 
        _IAppControlPluginProvider* pProvider = GetAppControlPluginProvider(_path);
@@ -336,7 +315,8 @@ _AppControlImpl::Start(const String* pUriData, const String* pMimeType, const IM
                        req = _AppControlManager::GetInstance()->__inAppManager.InsertItem(pItem);
                }
 
-               if (_ThreadImpl::GetCurrentThreadImpl()->GetThreadType() == THREAD_TYPE_EVENT_DRIVEN)
+               const _ThreadImpl* pThreadImpl = _ThreadImpl::GetCurrentThreadImpl();
+               if (pThreadImpl && pThreadImpl->GetThreadType() == THREAD_TYPE_EVENT_DRIVEN)
                {
                        _AppControlResponseEvent* pAppControlResponseEvent = new (std::nothrow) _AppControlResponseEvent();
 
@@ -366,7 +346,6 @@ _AppControlImpl::Start(const String* pUriData, const String* pMimeType, const IM
                pProvider->Release();
        }
 
-       // after acquring request number, pLib should be managed from the list, not CATCH
        if (IsFailed(r))
        {
                _AppControlManager::GetInstance()->__inAppManager.RemoveItem(req);
@@ -404,7 +383,14 @@ _AppControlImpl::InvokeStartAppControl(_IAppControlPluginProvider* pProvider, in
 result
 _AppControlImpl::InvokeStartAppControl(_IAppControlPluginProvider* pProvider, int req, const String& appId, const String& oId, const String* pUri, const String* pMime, const IMap* pMap)
 {
-       _AppMessageImpl msg(appId, oId, pUri, pMime, pMap);
+       String data;
+
+       if (pMime)
+       {
+               data = _AppControlManager::GetMimeTypeFromDataType(*pMime);
+       }
+
+       _AppMessageImpl msg(appId, oId, pUri, &data, pMap);
 
        return InvokeStartAppControl(pProvider, req, appId, msg);
 }
@@ -419,156 +405,71 @@ _AppControlImpl::InvokeStartAppControl(_IAppControlPluginProvider* pProvider, in
 }
 
 
-static bool
-IsValidAppControl(const String& appcontrolID)
-{
-       return ((appcontrolID == L"osp.appcontrol.provider.audio")
-               || (appcontrolID == L"osp.appcontrol.provider.bluetooth")
-               || (appcontrolID == L"osp.appcontrol.provider.calendar")
-               || (appcontrolID == L"osp.appcontrol.provider.camera")
-               || (appcontrolID == L"osp.appcontrol.provider.contact")
-               || (appcontrolID == L"osp.appcontrol.provider.certificatemanager")
-               || (appcontrolID == L"osp.appcontrol.provider.email")
-               || (appcontrolID == L"osp.appcontrol.provider.image")
-               || (appcontrolID == L"osp.appcontrol.provider.media")
-               || (appcontrolID == L"osp.appcontrol.provider.message")
-               || (appcontrolID == L"osp.appcontrol.provider.video")
-               || (appcontrolID == L"osp.appcontrol.provider.imageeditor")
-               || (appcontrolID == L"osp.appcontrol.provider.allshare")
-               || (appcontrolID == L"tizen.filemanager")
-               || (appcontrolID == L"tizen.camera")
-               || (appcontrolID == L"tizen.gallery")
-               || (appcontrolID == L"tizen.imageviewer")
-               || (appcontrolID == L"tizen.videoplayer")
-               || (appcontrolID == L"tizen.memo")
-               || (appcontrolID == L"tizen.contacts")
-               || (appcontrolID == L"tizen.calendar")
-               || (appcontrolID == L"tizen.todo")
-               || (appcontrolID == L"tizen.email")
-               || (appcontrolID == L"tizen.settings")
-               || (appcontrolID == L"tizen.messages")
-               || (appcontrolID == L"tizen.musicplayer")
-               || (appcontrolID == L"tizen.bluetooth")
-               || (appcontrolID == L"samsung.snote")
-               || (appcontrolID == L"0pnxz8hbsr.MyFiles")
-               || (appcontrolID == L"hdufar9ycj.Camera")
-               || (appcontrolID == L"ijudt7w61q.Gallery")
-               || (appcontrolID == L"jysyv9o1dc.ImageViewer")
-               || (appcontrolID == L"npwf0scb88.VideoPlayer")
-               || (appcontrolID == L"zunqjlsnce.Memo")
-               || (appcontrolID == L"f9uev8hsyo.Contacts")
-               || (appcontrolID == L"ph1vq2phrp.Calendar")
-               || (appcontrolID == L"vxqbrefica.Email")
-               || (appcontrolID == L"kto5jikgul.Settings")
-               || (appcontrolID == L"8r4r5ddzzn.Messages")
-               || (appcontrolID == L"dhrul6qzj3.MusicPlayer")
-               || (appcontrolID == L"smemo-efl"));
-}
-
 result
 _AppControlImpl::Stop(void)
 {
-       const String appcontrolID(GetAppControlProviderId());
-       SysTryReturnResult(NID_APP, IsValidAppControl(appcontrolID), E_INVALID_OPERATION, "Invalid appcontrolID(%ls)", appcontrolID.GetPointer());
-
+       result r = E_SUCCESS;
        result (*pStop)(int req) = null;
 
-       if (_reqId != _REQ_ID_INVALID)
+       if (_reqId != APPCONTROL_REQUEST_ID_INVALID)
        {
                _InProcessInfo* pInfo = _AppControlManager::GetInstance()->__inAppManager.FindItem(_reqId);
                SysTryReturnResult(NID_APP, pInfo != null, E_INVALID_OPERATION, "Request ID %d is not found.", _reqId);
 
                if (pInfo->pProvider)
                {
-                       pInfo->pProvider->StopAppControlPlugin(_reqId);
+                       r = pInfo->pProvider->StopAppControlPlugin(_reqId);
                }
 
                _AppControlManager::GetInstance()->__inAppManager.RemoveItem(_reqId);
 
-               _reqId = _REQ_ID_INVALID;
+               _reqId = APPCONTROL_REQUEST_ID_INVALID;
        }
        else
        {
                _IAppControlPluginProvider* pProvider = GetAppControlPluginProvider(_path);
                if (pProvider)
                {
-                       pProvider->StopAppControlPlugin(-1);
-                       SysLog(NID_APP, "Request is stopped.");
+                       r = pProvider->StopAppControlPlugin(-1);
 
                        pProvider->Release();
                }
        }
 
-       return E_SUCCESS;
+       SysLog(NID_APP, "[%s] Request is stopped.", GetErrorMessage(r));
+
+       return r;
 }
 
 String
-_AppControlImpl::GetAppName(void)
+_AppControlImpl::GetAppName(void) const
 {
        if (_appName.IsEmpty())
        {
                AppId appId = GetAppId();
-               AppId aliasAppId = _AppControlRegistry::GetInstance()->GetAliasAppId(appId);
+               const AppId& aliasAppId = _AppControlRegistry::GetInstance()->GetAliasAppId(appId);
                if (!aliasAppId.IsEmpty())
                {
                        appId = aliasAppId;
                }
 
+               appId = _Aul::GetRealAppId(appId);
+
                std::unique_ptr<PackageAppInfo> pInfo(_PackageManagerImpl::GetInstance()->GetPackageAppInfoN(appId));
                if (pInfo.get())
                {
-                       SysLog(NID_APP, "PackageInfo of appId(%ls) exists", appId.GetPointer());
-                       const String& name = pInfo->GetAppName();
-                       if (name == L"_AppControl")
-                       {
-                               // workaround for special case: requery with actual appId
-                               const PackageId& packageId = _PackageManagerImpl::GetPackageIdByAppId(appId);
-                               const String& defaultName = _PackageManagerImpl::GetInstance()->GetDefaultAppExecutableName(packageId);
-
-                               const String& convertedAppId = packageId + L'.' + defaultName;
-
-                               std::unique_ptr<PackageAppInfo> pNewInfo(_PackageManagerImpl::GetInstance()->GetPackageAppInfoN(convertedAppId));
-
-                               if (pNewInfo.get())
-                               {
-                                       _appName = pNewInfo->GetAppDisplayName();
-                               }
-                               else
-                               {
-                                       SysLog(NID_APP, "No default applicaiton information, possible database error.");
-                               }
-                       }
-                       else
-                       {
-                               _appName = pInfo->GetAppDisplayName();
-                       }
+                       SysLog(NID_APP, "PackageInfo of [%ls] exists.", appId.GetPointer());
+                       _appName = pInfo->GetAppDisplayName();
                }
                else
                {
-                       SysLog(NID_APP, "PackageInfo of appId(%ls) does not exist", appId.GetPointer());
+                       SysLog(NID_APP, "PackageInfo of [%ls] does not exist.", appId.GetPointer());
                }
        }
 
        return _appName;
 }
 
-String
-_AppControlImpl::GetAppId(void) const
-{
-       return _appId;
-}
-
-const String&
-_AppControlImpl::GetAppControlProviderId(void) const
-{
-       return _appId;
-}
-
-const String&
-_AppControlImpl::GetOperationId(void) const
-{
-       return _opId;
-}
 
 IList*
 _AppControlImpl::GetCategoryListN(void) const
@@ -576,7 +477,7 @@ _AppControlImpl::GetCategoryListN(void) const
        AppId appId = GetAppId();
        SysTryReturn(NID_APP, !appId.IsEmpty(), null, E_SYSTEM, "[E_SYSTEM] Empty appId.");
 
-       AppId aliasAppId = _AppControlRegistry::GetInstance()->GetAliasAppId(appId);
+       const AppId& aliasAppId = _AppControlRegistry::GetInstance()->GetAliasAppId(appId);
        if (!aliasAppId.IsEmpty())
        {
                appId = aliasAppId;
@@ -609,7 +510,7 @@ _AppControlImpl::OnAppControlResponseEventReceivedN(const Tizen::Base::Runtime::
                {
                        if(pEventArg->GetType() == _APPCONTROL_RESPONSETYPE_COMPLETE)
                        {
-                               _AppControlManager::InvokeAppControlCompleteListener(*pResponseListener, pEventArg->GetAppId(), pEventArg->GetOperationId(), pEventArg->GetAppControlResult(), pEventArg->GetExtraData(), pEventArg->IsSubMode());
+                               _AppControlManager::InvokeAppControlCompleteListener(*pResponseListener, pEventArg->GetAppId(), pEventArg->GetOperationId(), pEventArg->GetAppControlResult(), pEventArg->GetExtraData(), pEventArg->IsRaiseMode());
 
                                _AppControlResponseEvent* pResponseEvent = null;
                                _AppControlManager::GetInstance()->GetAppControlResponseEventContainer()->GetValue(pEventArg->GetRequestId(), pResponseEvent);