Fixed installation failed when new tizenId generated in SDK.
authorSoyoung Kim <sy037.kim@samsung.com>
Mon, 14 Jan 2013 04:03:04 +0000 (13:03 +0900)
committerSoyoung Kim <sy037.kim@samsung.com>
Mon, 14 Jan 2013 11:16:19 +0000 (20:16 +0900)
[Issue#] N_SE-19398
[Problem] when new tizenId genergated, widget installation failed.
[Cause] there is a bug during find existing widget.
[Solution] tizenId is a criterion for find existing widget.
[SCMRequest] N/A

Change-Id: I0c320eac1ad2a88356e467071e027f5e95f4f0b6

src/jobs/widget_install/job_widget_install.cpp
src/jobs/widget_install/job_widget_install.h
src/jobs/widget_install/task_widget_config.cpp
src/jobs/widget_install/task_widget_config.h

index ce93dcd..0ebbc40 100644 (file)
@@ -303,12 +303,14 @@ JobWidgetInstall::ConfigureResult JobWidgetInstall::PrePareInstallation(
             m_isDRM);
         LogDebug("widget packaging type : " <<
                 m_installerContext.widgetConfig.packagingType.pkgType);
-        WidgetUpdateInfo update = detectWidgetUpdate(configData);
+
+        setTizenId(configData);
+        setApplicationType(configData);
         m_needEncryption = detectResourceEncryption(configData);
         setInstallLocationType(configData);
 
         // Configure installation
-        result = ConfigureInstallation(widgetPath, configData, update, tempDir);
+        result = ConfigureInstallation(widgetPath, configData, tempDir);
     }
     Catch(Exceptions::ExtractFileFailed)
     {
@@ -319,18 +321,11 @@ JobWidgetInstall::ConfigureResult JobWidgetInstall::PrePareInstallation(
     return result;
 }
 
-bool JobWidgetInstall::setTizenId(
-        const WrtDB::ConfigParserData &configInfo,
-        const WidgetUpdateInfo &update,
-        bool preload)
+void JobWidgetInstall::setTizenId(
+        const WrtDB::ConfigParserData &configInfo)
 {
     using namespace PackageManager;
-    regex_t reg;
-    if(regcomp(&reg, REG_TIZENID_PATTERN, REG_NOSUB | REG_EXTENDED)!=0){
-        LogDebug("Regcomp failed");
-    }
 
-    ConfigureResult result = checkWidgetUpdate(update);
     if(!!configInfo.tizenId) {
         LogDebug("Setting tizenId provided in config.xml: " << configInfo.tizenId);
         // send start signal of pkgmgr
@@ -340,41 +335,21 @@ bool JobWidgetInstall::setTizenId(
                 PKGMGR_START_KEY,
                 PKGMGR_START_INSTALL);
 
-        if (result == ConfigureResult::Failed) {
-            return false;
-        }
-
-        if ((regexec(&reg, DPL::ToUTF8String(*(configInfo.tizenId)).c_str(),
-             static_cast<size_t>(0), NULL, 0) != REG_NOERROR) ||
-            (checkTizenIdExist(DPL::ToUTF8String(*(configInfo.tizenId))) &&
-             result != ConfigureResult::Updated))
-        {
-            //it is true when tizenId does not fit REG_TIZENID_PATTERN
-            LogError("tizen_id provided but not proper.");
-            regfree(&reg);
-            return false;
-        }
         m_installerContext.widgetConfig.pkgName = *configInfo.tizenId;
 
     } else {
         WidgetPkgName tizenId = WidgetDAOReadOnly::generateTizenId();
-
-        // only for installation, not for update
-        if (result == ConfigureResult::Ok) {
-            //check if there is package with same name and if generate different name
-
-            LogDebug("Checking if tizen id is unique");
-            while (true) {
-                if (checkTizenIdExist(DPL::ToUTF8String(tizenId))) {
-                    //path exist, chose another one
-                    tizenId = WidgetDAOReadOnly::generateTizenId();
-                    continue;
-                }
-                break;
+        LogDebug("Checking if tizen id is unique");
+        while (true) {
+            if (checkTizenIdExist(DPL::ToUTF8String(tizenId))) {
+                //path exist, chose another one
+                tizenId = WidgetDAOReadOnly::generateTizenId();
+                continue;
             }
-
-            m_installerContext.widgetConfig.pkgName = tizenId;
+            break;
         }
+
+        m_installerContext.widgetConfig.pkgName = tizenId;
         LogInfo("tizen_id name was generated by WRT: " << tizenId);
         // send start signal of pkgmgr
         getInstallerStruct().pkgmgrInterface->setPkgname(DPL::ToUTF8String(
@@ -383,11 +358,9 @@ bool JobWidgetInstall::setTizenId(
                 PKGMGR_START_KEY,
                 PKGMGR_START_INSTALL);
     }
-    regfree(&reg);
 
     LogInfo("Tizen Id : " << m_installerContext.widgetConfig.pkgName);
     LogInfo("W3C Widget GUID : " << m_installerContext.widgetConfig.guid);
-    return true;
 }
 
 void JobWidgetInstall::configureWidgetLocation(const std::string & widgetPath,
@@ -405,17 +378,33 @@ void JobWidgetInstall::configureWidgetLocation(const std::string & widgetPath,
 JobWidgetInstall::ConfigureResult JobWidgetInstall::ConfigureInstallation(
         const std::string &widgetSource,
         const WrtDB::ConfigParserData &configData,
-        const WidgetUpdateInfo &update,
         const std::string &tempPath)
 {
+    WidgetUpdateInfo update = detectWidgetUpdate(configData,
+            m_installerContext.widgetConfig.webAppType,
+            m_installerContext.widgetConfig.pkgName);
+    ConfigureResult result = checkWidgetUpdate(update);
 
-    if (!setTizenId(configData, update, m_jobStruct.m_preload)) {
-        return ConfigureResult::Failed;
-    } else {
-        LogInfo("Tizen Id: " << m_installerContext.widgetConfig.pkgName);
+    // Validate tizenId
+    regex_t reg;
+    if(regcomp(&reg, REG_TIZENID_PATTERN, REG_NOSUB | REG_EXTENDED)!=0){
+        LogDebug("Regcomp failed");
+    }
 
-        configureWidgetLocation(widgetSource, tempPath);
+    if ((regexec(&reg,
+                    DPL::ToUTF8String(m_installerContext.widgetConfig.pkgName).c_str(),
+                    static_cast<size_t>(0), NULL, 0) != REG_NOERROR) ||
+            (checkTizenIdExist(DPL::ToUTF8String(m_installerContext.widgetConfig.pkgName)) &&
+             result != ConfigureResult::Updated))
+    {
+        //it is true when tizenId does not fit REG_TIZENID_PATTERN
+        LogError("tizen_id provided but not proper.");
+        regfree(&reg);
+        return ConfigureResult::Failed;
     }
+    regfree(&reg);
+
+    configureWidgetLocation(widgetSource, tempPath);
 
     // Init installer context
     m_installerContext.installStep = InstallerContext::INSTALL_START;
@@ -423,7 +412,7 @@ JobWidgetInstall::ConfigureResult JobWidgetInstall::ConfigureInstallation(
     m_installerContext.existingWidgetInfo = update.existingWidgetInfo;
     m_installerContext.widgetConfig.shareHref = std::string();
 
-    return ConfigureResult::Ok;
+    return result;
 }
 
 JobWidgetInstall::ConfigureResult JobWidgetInstall::checkWidgetUpdate(
@@ -627,7 +616,9 @@ ConfigParserData JobWidgetInstall::getWidgetDataFromXML(
 }
 
 WidgetUpdateInfo JobWidgetInstall::detectWidgetUpdate(
-        const ConfigParserData &configInfo)
+        const ConfigParserData &configInfo,
+        const WrtDB::WidgetType appType,
+        const WrtDB::WidgetPkgName &tizenId)
 {
     LogInfo("Checking up widget package for config.xml...");
 
@@ -652,23 +643,45 @@ WidgetUpdateInfo JobWidgetInstall::detectWidgetUpdate(
                 WidgetVersion(*configInfo.version));
     }
 
-    Try
-    {
-        // Search widget handle by GUID
-        WidgetDAOReadOnly dao(widgetGUID);
-        return WidgetUpdateInfo(
-            widgetGUID,
-            widgetVersion,
-            WidgetUpdateInfo::ExistingWidgetInfo(
-                dao.getPkgName(), dao.getVersion()));
-    }
-    Catch(WidgetDAOReadOnly::Exception::WidgetNotExist)
-    {
-        // GUID isn't installed
-        return WidgetUpdateInfo(
-            widgetGUID,
-            widgetVersion,
-            WidgetUpdateInfo::ExistingWidgetInfo());
+    if (appType == APP_TYPE_WAC20) {
+        Try
+        {
+            // Search widget handle by GUID
+            WidgetDAOReadOnly dao(widgetGUID);
+            return WidgetUpdateInfo(
+                    widgetGUID,
+                    widgetVersion,
+                    WidgetUpdateInfo::ExistingWidgetInfo(
+                        dao.getPkgName(), dao.getVersion()));
+        }
+        Catch(WidgetDAOReadOnly::Exception::WidgetNotExist)
+        {
+            // GUID isn't installed
+            return WidgetUpdateInfo(
+                    widgetGUID,
+                    widgetVersion,
+                    WidgetUpdateInfo::ExistingWidgetInfo());
+        }
+    } else {
+        Try
+        {
+            // Search widget handle by appId
+            WidgetDAOReadOnly dao(tizenId);
+            return WidgetUpdateInfo(
+                    widgetGUID,
+                    widgetVersion,
+                    WidgetUpdateInfo::ExistingWidgetInfo(
+                        dao.getPkgName(), dao.getVersion()));
+        }
+        Catch(WidgetDAOReadOnly::Exception::WidgetNotExist)
+        {
+            // GUID isn't installed
+            return WidgetUpdateInfo(
+                    widgetGUID,
+                    widgetVersion,
+                    WidgetUpdateInfo::ExistingWidgetInfo());
+        }
+
     }
 }
 
@@ -891,6 +904,49 @@ WrtDB::PackagingType JobWidgetInstall::checkPackageType(
     return PKG_TYPE_UNKNOWN;
 }
 
+void JobWidgetInstall::setApplicationType(
+        const WrtDB::ConfigParserData &configInfo)
+{
+
+    FOREACH(iterator, configInfo.nameSpaces) {
+        LogInfo("namespace = [" << *iterator << "]");
+        AppType currentAppType = APP_TYPE_UNKNOWN;
+
+        if (*iterator == ConfigurationNamespace::W3CWidgetNamespaceName) {
+            continue;
+        } else if (
+            *iterator ==
+            ConfigurationNamespace::WacWidgetNamespaceNameForLinkElement ||
+            *iterator ==
+            ConfigurationNamespace::WacWidgetNamespaceName)
+        {
+            currentAppType = APP_TYPE_WAC20;
+        } else if (*iterator ==
+                ConfigurationNamespace::TizenWebAppNamespaceName) {
+            currentAppType = APP_TYPE_TIZENWEBAPP;
+        }
+
+        if (m_installerContext.widgetConfig.webAppType ==
+                APP_TYPE_UNKNOWN) {
+            m_installerContext.widgetConfig.webAppType = currentAppType;
+        } else if (m_installerContext.widgetConfig.webAppType ==
+                currentAppType) {
+            continue;
+        } else {
+            ThrowMsg(Exceptions::WidgetConfigFileInvalid,
+                     "Config.xml has more than one namespace");
+        }
+    }
+
+    // If there is no define, type set to WAC 2.0
+    if (m_installerContext.widgetConfig.webAppType == APP_TYPE_UNKNOWN) {
+        m_installerContext.widgetConfig.webAppType = APP_TYPE_WAC20;
+    }
+
+    LogInfo("type = [" <<
+            m_installerContext.widgetConfig.webAppType.getApptypeToString() << "]");
+}
+
 bool JobWidgetInstall::detectResourceEncryption(const WrtDB::ConfigParserData &configData)
 {
     FOREACH(it, configData.settingsList)
index 1f81498..6066c26 100644 (file)
@@ -59,7 +59,6 @@ class JobWidgetInstall :
     ConfigureResult ConfigureInstallation(const std::string &widgetSource,
                                           const WrtDB::ConfigParserData
                                           &configData,
-                                          const WidgetUpdateInfo &update,
                                           const std::string &tempPath);
     static WrtDB::ConfigParserData getWidgetDataFromXML(
             const std::string &widgetSource,
@@ -67,13 +66,13 @@ class JobWidgetInstall :
             WrtDB::PackagingType pkgType,
             bool isDRM);
     static WidgetUpdateInfo detectWidgetUpdate(
-            const WrtDB::ConfigParserData &configInfo);
+            const WrtDB::ConfigParserData &configInfo,
+            const WrtDB::WidgetType appType,
+            const WrtDB::WidgetPkgName &tizenId);
     WidgetUpdateMode::Type CalcWidgetUpdatePolicy(
             const OptionalWidgetVersion &existingVersion,
             const OptionalWidgetVersion &incomingVersion) const;
-    bool setTizenId(const WrtDB::ConfigParserData &configInfo,
-                    const WidgetUpdateInfo &update,
-                    bool preload);
+    void setTizenId(const WrtDB::ConfigParserData &configInfo);
     void displayWidgetInfo();
     void configureWidgetLocation(const std::string & widgetPath,
                                  const std::string &tempPath);
@@ -88,6 +87,7 @@ class JobWidgetInstall :
     bool DecryptDRMWidget(std::string widgetPath, std::string destPath);
     ConfigureResult PrePareInstallation(const std::string &widgetPath);
     ConfigureResult checkWidgetUpdate(const WidgetUpdateInfo &update);
+    void setApplicationType(const WrtDB::ConfigParserData &configInfo);
 
   public:
     /**
index eefaf0a..54a8f31 100644 (file)
@@ -107,16 +107,6 @@ void TaskWidgetConfig::StepProcessConfigurationFile()
         LogError("Parsing failed.");
         ReThrow(Exceptions::WidgetConfigFileInvalid);
     }
-    Try
-    {
-        // To get widget type for distribute WAC, TIZEN WebApp
-        setApplicationType();
-    }
-    Catch(Exception::ConfigParseFailed)
-    {
-        LogError("Config.xml has more than one namespace");
-        ReThrow(Exceptions::WidgetConfigFileInvalid);
-    }
 
     m_installContext.job->UpdateProgress(
         InstallerContext::INSTALL_WIDGET_CONFIG1,
@@ -518,47 +508,6 @@ void TaskWidgetConfig::StepVerifyFeatures()
         "Widget Config step2 Finished");
 }
 
-void TaskWidgetConfig::setApplicationType()
-{
-    using namespace WrtDB;
-    WidgetRegisterInfo* widgetInfo = &(m_installContext.widgetConfig);
-    ConfigParserData* configInfo = &(widgetInfo->configInfo);
-
-    FOREACH(iterator, configInfo->nameSpaces) {
-        LogInfo("namespace = [" << *iterator << "]");
-        AppType currentAppType = APP_TYPE_UNKNOWN;
-
-        if (*iterator == ConfigurationNamespace::W3CWidgetNamespaceName) {
-            continue;
-        } else if (
-            *iterator ==
-            ConfigurationNamespace::WacWidgetNamespaceNameForLinkElement ||
-            *iterator ==
-            ConfigurationNamespace::WacWidgetNamespaceName)
-        {
-            currentAppType = APP_TYPE_WAC20;
-        } else if (*iterator == ConfigurationNamespace::TizenWebAppNamespaceName) {
-            currentAppType = APP_TYPE_TIZENWEBAPP;
-        }
-
-        if (widgetInfo->webAppType == APP_TYPE_UNKNOWN) {
-            widgetInfo->webAppType = currentAppType;
-        } else if (widgetInfo->webAppType == currentAppType) {
-            continue;
-        } else {
-            ThrowMsg(Exceptions::WidgetConfigFileInvalid,
-                     "Config.xml has more than one namespace");
-        }
-    }
-
-    // If there is no define, type set to WAC 2.0
-    if (widgetInfo->webAppType == APP_TYPE_UNKNOWN) {
-        widgetInfo->webAppType = APP_TYPE_WAC20;
-    }
-
-    LogInfo("type = [" << widgetInfo->webAppType.getApptypeToString() << "]");
-}
-
 bool TaskWidgetConfig::isFeatureAllowed(WrtDB::AppType appType,
                                         DPL::String featureName)
 {
index 2b0b7dc..9b44559 100755 (executable)
@@ -92,7 +92,6 @@ class TaskWidgetConfig :
     void StepCancelWidgetInstallationAfterMinVersion();
     void createInstallPopup(PopupType type, const std::string &label);
     DPL::String createAuthorWidgetInfo() const;
-    void setApplicationType();
     bool isFeatureAllowed(
             WrtDB::AppType appType, DPL::String featureName);
     bool isMinVersionCompatible(