Modify IsAppInstalled() API
[platform/framework/native/appfw.git] / src / app / package / FAppPkg_PackageManagerImpl.cpp
index f047532..ce53d24 100755 (executable)
@@ -36,6 +36,7 @@
 #include <FBaseSysLog.h>
 #include <FIo.h>
 #include <FIoRegistry.h>
+#include <FSecPrivilegeInfo.h>
 #include <FSysSystemTime.h>
 #include <FBase_StringConverter.h>
 
@@ -49,7 +50,9 @@
 using namespace Tizen::Base;
 using namespace Tizen::Base::Runtime;
 using namespace Tizen::Base::Collection;
+using namespace Tizen::Base::Utility;
 using namespace Tizen::Io;
+using namespace Tizen::Security;
 using namespace Tizen::System;
 
 namespace Tizen { namespace App { namespace Package
@@ -85,15 +88,26 @@ _PackageManagerEvent::FireImpl(IEventListener& listener, const IEventArg& arg)
                }
                else
                {
-                       if (pArg->__install)
+                       if (pArg->__install == false)
                        {
-                               SysLog(NID_APP, "Installation is Completed(Error). [Package = %ls]", pArg->__packageId.GetPointer());
-                               pListener->OnPackageInstallationCompleted(pArg->__packageId, PACKAGE_INSTALLATION_RESULT_INVALID_PACKAGE);
+                               SysLog(NID_APP, "Uninstallation is Completed(Error). [Package = %ls]", pArg->__packageId.GetPointer());
+                               pListener->OnPackageUninstallationCompleted(pArg->__packageId, false);
+                       }
+               }
+       }
+       else if (pArg->__eventKey == L"error")
+       {
+               if (pArg->__install)
+               {
+                       if (pArg->__eventValue == L"62")
+                       {
+                               SysLog(NID_APP, "Installation is Completed(Error = STORAGE_FULL(62)). [Package = %ls]", pArg->__packageId.GetPointer());
+                               pListener->OnPackageInstallationCompleted(pArg->__packageId, PACKAGE_INSTALLATION_RESULT_STORAGE_FULL);
                        }
                        else
                        {
-                               SysLog(NID_APP, "Uninstallation is Completed(Error). [Package = %ls]", pArg->__packageId.GetPointer());
-                               pListener->OnPackageUninstallationCompleted(pArg->__packageId, false);
+                               SysLog(NID_APP, "Installation is Completed(Error). [Package = %ls]", pArg->__packageId.GetPointer());
+                               pListener->OnPackageInstallationCompleted(pArg->__packageId, PACKAGE_INSTALLATION_RESULT_INVALID_PACKAGE);
                        }
                }
        }
@@ -114,32 +128,24 @@ _PackageManagerImpl::GetPackageIdByAppId(const AppId& appId)
 {
        SysTryReturn(NID_APP, appId.IsEmpty() == false, L"", E_INVALID_ARG, "appId is empty");
 
-       String packageId;
-
-       if (appId.StartsWith(L".", 10) == true)
-       {
-               appId.SubString(0, 10, packageId);
-       }
-       else
-       {
-               int result = 0;
-               char* pPackageId = null;
-               pkgmgrinfo_appinfo_h pAppInfoHandle = null;
+       PackageId packageId;
+       int result = 0;
+       char* pPackageId = null;
+       pkgmgrinfo_appinfo_h pAppInfoHandle = null;
 
-               std::unique_ptr<char[]> pAppId(_StringConverter::CopyToCharArrayN(appId));
-               SysTryReturn(NID_APP, pAppId, L"", E_OUT_OF_MEMORY, "pAppId is null");
+       std::unique_ptr<char[]> pAppId(_StringConverter::CopyToCharArrayN(appId));
+       SysTryReturn(NID_APP, pAppId, L"", E_OUT_OF_MEMORY, "pAppId is null");
 
-               result = pkgmgrinfo_appinfo_get_appinfo(pAppId.get(), &pAppInfoHandle);
-               SysTryReturn(NID_APP, result == 0, L"", E_PKG_NOT_INSTALLED, "pkgmgrinfo_appinfo_get_appinfo() failed. result=[%d], app=[%s]", result, pAppId.get());
+       result = pkgmgrinfo_appinfo_get_appinfo(pAppId.get(), &pAppInfoHandle);
+       SysTryReturn(NID_APP, result == 0, L"", E_PKG_NOT_INSTALLED, "pkgmgrinfo_appinfo_get_appinfo() failed. result=[%d], app=[%s]", result, pAppId.get());
 
-               result = pkgmgrinfo_appinfo_get_pkgname(pAppInfoHandle, &pPackageId);
+       result = pkgmgrinfo_appinfo_get_pkgname(pAppInfoHandle, &pPackageId);
 
-               packageId.Append(pPackageId);
+       packageId.Append(pPackageId);
 
-               if(pAppInfoHandle)
-               {
-                       pkgmgrinfo_appinfo_destroy_appinfo(pAppInfoHandle);
-               }
+       if(pAppInfoHandle)
+       {
+               pkgmgrinfo_appinfo_destroy_appinfo(pAppInfoHandle);
        }
 
        SysLog(NID_APP, "app = [%ls], package = [%ls]", appId.GetPointer(), packageId.GetPointer());
@@ -380,12 +386,9 @@ _PackageManagerImpl::InstallPackage(const PackageId& packageId, const String& pa
                return E_SYSTEM;
        }
 
-       // optionalData = 12345abcde:StoreClientId=XXXXX12345
-       PackageId StoreClientId = _AppInfo::GetPackageId();
+       // optionalData = 12345abcde
        String optionalData;
        optionalData.Append(packageId);
-       optionalData.Append(":StoreClientId=");
-       optionalData.Append(StoreClientId);
 
        std::unique_ptr<char[]> pOptionalData(_StringConverter::CopyToCharArrayN(optionalData));
        SysTryReturnResult(NID_APP, pOptionalData, E_OUT_OF_MEMORY, "pOptionalData is null.");
@@ -668,13 +671,21 @@ _PackageManagerImpl::InstallationEventHandler(int reqId, const char* pType, cons
                                pListener->OnPackageInstallationResponseReceived(pPackageId, PACKAGE_INSTALLATION_RESULT_SUCCESS);
                                SysLog(NID_APP, "OnPackageInstallationResponseReceived(PACKAGE_INSTALLATION_RESULT_SUCCESS)");
                        }
+
+                       delete pListener;
+               }
+               else if (strcmp(pKey, "error") == 0)
+               {
+                       if (strcmp(pVal, "62") == 0)
+                       {
+                               pListener->OnPackageInstallationResponseReceived(pPackageId, PACKAGE_INSTALLATION_RESULT_STORAGE_FULL);
+                               SysLog(NID_APP, "OnPackageInstallationResponseReceived(PACKAGE_INSTALLATION_RESULT_STORAGE_FULL)");
+                       }
                        else
                        {
                                pListener->OnPackageInstallationResponseReceived(pPackageId, PACKAGE_INSTALLATION_RESULT_INVALID_PACKAGE);
                                SysLog(NID_APP, "OnPackageInstallationResponseReceived(PACKAGE_INSTALLATION_RESULT_INVALID_PACKAGE)");
                        }
-
-                       delete pListener;
                }
                else if (strcmp(pKey, "install_percent") == 0)
                {
@@ -771,6 +782,33 @@ _PackageManagerImpl::GetPackageInfoFromFileN(const String& filePath) const
                pPackageInfoImpl->SetAuthor(pPkgInfo->author);
                pPackageInfoImpl->SetMainAppId(pPkgInfo->pkg_name);
 
+               if (IsHybridPackage(filePath) == true)
+               {
+                       PackageInfo hybridServiceInfo;
+                       _PackageParser packageParser;
+
+                       res = packageParser.Construct(&hybridServiceInfo);
+                       SysTryReturn(NID_APP, res, null, E_PARSING_FAILED, "Construct() is failed. [%s]", pPackagePath.get());
+
+                       res = packageParser.Parse(filePath);
+                       SysTryReturn(NID_APP, res, null, E_PARSING_FAILED, "Parse() is failed. [%s]", pPackagePath.get());
+
+                       IList* pList = hybridServiceInfo.GetPrivilegeListN();
+                       if (pList)
+                       {
+                               for (int i = 0; i < pList->GetCount(); i++)
+                               {
+                                       PrivilegeInfo* pPrivilegeInfo = dynamic_cast < PrivilegeInfo* >(pList->GetAt(i));
+                                       if (pPrivilegeInfo)
+                                       {
+                                               String privilege = pPrivilegeInfo->GetId();
+                                               pPackageInfoImpl->AddPrivilege(*new (std::nothrow) String(privilege));
+                                               SysLog(NID_APP, "privilege[%ls] is added for hybrid.", privilege.GetPointer());
+                                       }
+                                }
+                       }
+               }
+
                if (pPkgInfo->privilege_list)
                {
                        GList* pList = null;
@@ -818,6 +856,7 @@ _PackageManagerImpl::GetPackageInfoFromFileN(const String& filePath) const
                SysTryReturn(NID_APP, false, null, E_UNSUPPORTED_FORMAT, "invalid extension! - packagePath = [%s], extension = [%s]", pPackagePath.get(), pExtension.get());
        }
 
+       SetLastResult(E_SUCCESS);
        return pPackageInfo.release();
 }
 
@@ -1318,6 +1357,34 @@ _PackageManagerImpl::PackageAppInfoMetadataHandler(const pkgmgrinfo_appinfo_h ha
        return 0;
 }
 
+bool
+_PackageManagerImpl::IsHybridPackage(const String& filePath) const
+{
+       SysTryReturn(NID_APP, filePath.IsEmpty() == false, false, E_INVALID_ARG, "filePath is empty.");
+
+       bool res = true;
+       FileUnzipper unzipper;
+       ZipEntry zipEntry;
+
+       result r = unzipper.Construct(filePath);
+       SysTryReturn(NID_APP, !IsFailed(r), false, E_SYSTEM, "unzipper.Construct() failed.");
+
+       r = unzipper.GetEntry(L"info/manifest.xml", zipEntry);
+       if (!IsFailed(r))
+       {
+               SysLog(NID_APP, "It's hybrid package. [%ls]", filePath.GetPointer());
+               res = true;
+       }
+       else
+       {
+               SysLog(NID_APP, "It's not hybrid package. [%ls]", filePath.GetPointer());
+               res = false;
+       }
+
+       SetLastResult(E_SUCCESS);
+       return res;
+}
+
 _PackageManagerImpl*
 _PackageManagerImpl::GetInstance(void)
 {
@@ -1353,7 +1420,9 @@ _PackageManagerImpl::SendPackageEvent(PackageType type, const PackageId& package
 
        if (strcmp(pEventKey, "start") == 0)
        {
-               if ((strcmp(pEventValue, "install") == 0) || (strcmp(pEventValue, "uninstall") == 0))
+               if ((strcmp(pEventValue, "install") == 0)
+                               || (strcmp(pEventValue, "update") == 0)
+                               ||(strcmp(pEventValue, "uninstall") == 0))
                {
                        String* pAppId = new (std::nothrow) String(packageId);
                        SysTryReturnVoidResult(NID_APP, pAppId != null, E_OUT_OF_MEMORY, "pAppId instance must not be null.");
@@ -1707,25 +1776,28 @@ CATCH:
 bool
 _PackageManagerImpl::IsAppInstalled(const AppId& appId)
 {
-       if (appId == _AppInfo::GetPackageId())
-       {
-               return true;
-       }
+       SysTryReturn(NID_APP, appId.IsEmpty() == false, false, E_INVALID_ARG, "appId is empty.");
 
        int result = 0;
-       pkgmgrinfo_pkginfo_h pPackageInfoHandle = null;
+       pkgmgrinfo_appinfo_h pAppInfoHandle = null;
 
-       std::unique_ptr<char[]> pPackageId(_StringConverter::CopyToCharArrayN(appId));
-       SysTryReturn(NID_APP, pPackageId, false, E_OUT_OF_MEMORY, "pPackageId is null");
+       std::unique_ptr<char[]> pAppId(_StringConverter::CopyToCharArrayN(appId));
+       SysTryReturn(NID_APP, pAppId, false, E_OUT_OF_MEMORY, "pAppId is null.");
 
-       result = pkgmgrinfo_pkginfo_get_pkginfo(pPackageId.get(), &pPackageInfoHandle);
-       SysTryReturn(NID_APP, result == 0, false, E_APP_NOT_INSTALLED, "pkgmgrinfo_pkginfo_get_pkginfo() failed. result=[%d], package=[%s]", result, pPackageId.get());
+       result = pkgmgrinfo_appinfo_get_appinfo(pAppId.get(), &pAppInfoHandle);
+       if (result != 0)
+       {
+               SysLog(NID_APP, "pkgmgrinfo_appinfo_get_appinfo() failed. result=[%d], app=[%s]", result, pAppId.get());
+               return false;
+       }
 
-       if(pPackageInfoHandle)
+       if(pAppInfoHandle)
        {
-               pkgmgrinfo_pkginfo_destroy_pkginfo(pPackageInfoHandle);
+               pkgmgrinfo_appinfo_destroy_appinfo(pAppInfoHandle);
        }
 
+       SysLog(NID_APP, "app = [%ls] is installed.", appId.GetPointer());
+
        return true;
 }