Modify DataControl manager for thread-safe
[platform/framework/native/appfw.git] / src / app / FApp_AppInfo.cpp
index 86c0ec3..bb8d05a 100644 (file)
@@ -37,6 +37,7 @@
 #include <FBase_StringConverter.h>
 
 #include "FAppPkg_PackageInfoImpl.h"
+#include "FApp_Aul.h"
 #include "FApp_AppInfo.h"
 
 using namespace Tizen::App::Package;
@@ -99,6 +100,7 @@ _AppInfo::_AppInfo(void)
        : __appState(TERMINATED)
        , __appType(_APP_TYPE_NONE)
        , __appRootDirFd(-1)
+       , __appSdDirFd(-1)
        , __appHandlerType(_APP_HANDLER_NONE)
        , __parentWindowHandle(-1)
        , __pAppName(null)
@@ -106,6 +108,7 @@ _AppInfo::_AppInfo(void)
        , __isPackageInfoInitialized(false)
        , __isSubMode(false)
        , __isVirtualRoot(false)
+       , __isMultiWindow(false)
 {
        SysStaticAssert(sizeof(pid_t) == sizeof(int));
 
@@ -119,6 +122,7 @@ _AppInfo::~_AppInfo(void)
 
        // closing may or may not succeed
        close(__appRootDirFd);
+       close(__appSdDirFd);
 }
 
 _AppInfo*
@@ -140,17 +144,21 @@ _AppInfo::Construct(void)
        const char* pPackageId = appinfo_get_packageid();
        const char* pExecName = appinfo_get_execname();
 
-
        if (strncmp(pExecName, SUBMODE_NAME, strlen(SUBMODE_NAME)) == 0)
        {
                SysLog(NID_APP, "Handling for submode.");
-               const String& name = _PackageManagerImpl::GetInstance()->GetDefaultAppExecutableName(String(pPackageId));
-
-               __isSubMode = true;
 
-               std::unique_ptr<char[]> pActualExec(_StringConverter::CopyToCharArrayN(name));
-               appinfo_update_submode_execname_and_appid(pActualExec.get());
-               SysLog(NID_APP, "Executable name is changed to %s.", pActualExec.get());
+               const char* pAppId = appinfo_get_appid();
+               const String& mainId = _Aul::GetMainAppId(pAppId);
+               if (!mainId.IsEmpty())
+               {
+                       std::unique_ptr<char[]> pMainId(_StringConverter::CopyToCharArrayN(mainId));
+                       appinfo_update_submode_appid(pMainId.get());
+               
+                       __isSubMode = true;
+               
+                       SysLog(NID_APP, "Executable name is changed to %s.", pMainId.get());
+               }
        }
 
        result r = E_SUCCESS;
@@ -176,6 +184,14 @@ _AppInfo::Construct(void)
                pFile = fdopen(fd, "r");
                SysTryCatch(NID_APP, pFile != NULL, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Opening appinfo file (%s) failed : %s.", appInfoPath, strerror(errno));
 
+               // sdcard
+               char sdInfoPath[PATH_MAX] = {0, };
+               strncpy(sdInfoPath, "/opt/storage/sdcard/app2sd/", strlen("/opt/storage/sdcard/app2sd/"));
+               strncat(sdInfoPath, pPackageId, MAX_APPID);
+
+               __appSdDirFd = open(sdInfoPath, O_RDONLY);
+               SysLog(NID_APP, "sd root directory (%s:%d) open.", sdInfoPath, __appSdDirFd);
+
                char apiVersion[MAX_APIVERSION] = {0, };
                char* pRet = fgets(apiVersion, MAX_APIVERSION - 1, pFile);
                SysTryCatch(NID_APP, pRet != NULL, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Reading appinfo file (%s) failed : %s.", appInfoPath, strerror(errno));
@@ -268,7 +284,12 @@ _AppInfo::UpdateAppInfoFromPackageInfo(const PackageId& packageId)
 
        result r = E_SUCCESS;
        std::unique_ptr<PackageInfo> pInfo(pPkg->GetPackageInfoN(packageId));
-       SysTryReturn(NID_APP, pInfo != null, r, r, "[%s] Propagating.", GetErrorMessage(r));
+       if (pInfo.get() == null)
+       {
+               r = GetLastResult();
+               SysPropagate(NID_APP, r);
+               return r;
+       }
 
        const _PackageInfoImpl* pPkgInfo = _PackageInfoImpl::GetInstance(pInfo.get());
        SysTryReturnResult(NID_APP, pPkgInfo != null, E_INVALID_STATE, "Invalid PackageInfo instance.");
@@ -470,4 +491,16 @@ _AppInfo::UpdatePackageInfo(bool update)
        GetInstance()->__isPackageInfoInitialized = !update;
 }
 
+bool
+_AppInfo::IsMultiWindow(void)
+{
+       return GetInstance()->__isMultiWindow;
+}
+
+void
+_AppInfo::SetMultiWindow(bool enable)
+{
+       GetInstance()->__isMultiWindow = enable;
+}
+
 }} // Tizen::App