X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fjobs%2Fwidget_install%2Fjob_widget_install.cpp;h=e746f0161e91cf09046ac526275ca008e1e4be2a;hb=253c98d93cddcecefe06429babf6ee11d323f970;hp=c10e6e86174a185a5358b57d5fff123ac0756a42;hpb=a599d8c8880c986ac7e6b3a2c01d39bbca00e2c4;p=framework%2Fweb%2Fwrt-installer.git diff --git a/src/jobs/widget_install/job_widget_install.cpp b/src/jobs/widget_install/job_widget_install.cpp index c10e6e8..e746f01 100644 --- a/src/jobs/widget_install/job_widget_install.cpp +++ b/src/jobs/widget_install/job_widget_install.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -54,6 +55,7 @@ #include "parser_runner.h" #include #include +#include #include #include #include @@ -66,7 +68,7 @@ #include #include #include -#include +#include #include #include @@ -82,6 +84,7 @@ namespace // anonymous { const char * const CONFIG_XML = "config.xml"; const char * const WITH_OSP_XML = "res/wgt/config.xml"; +const char * const OSP_MANIFEST_XML = "info/manifest.xml"; //allowed: a-z, A-Z, 0-9 const char* REG_TIZENID_PATTERN = "^[a-zA-Z0-9]{10}.{1,}$"; @@ -106,7 +109,7 @@ bool hasExtension(const std::string& filename, const std::string& extension) if (fileLen < extLen) { LogError("Filename " << filename << " is shorter than extension " << extension); - return false; + false; } return (0 == filename.compare(fileLen - extLen, extLen, extension)); } @@ -170,10 +173,16 @@ JobWidgetInstall::JobWidgetInstall( m_exceptionCaught(Jobs::Exceptions::Success) { m_installerContext.mode = m_jobStruct.m_installMode; + getInstallerStruct().pkgmgrInterface->sendSignal( + PKGMGR_START_KEY, + PKGMGR_START_INSTALL); + getInstallerStruct().pkgmgrInterface->sendSignal( + PKGMGR_PROGRESS_KEY, + PKGMGR_START_VALUE); ConfigureResult result = prepareInstallation(widgetPath); if (result == ConfigureResult::Ok) { - LogInfo("Configure installation succeeded"); + LogDebug("Configure installation succeeded"); m_installerContext.job->SetProgressFlag(true); AddTask(new TaskRecovery(m_installerContext)); @@ -185,10 +194,10 @@ JobWidgetInstall::JobWidgetInstall( AddTask(new TaskPrepareFiles(m_installerContext)); } AddTask(new TaskCertify(m_installerContext)); + AddTask(new TaskCertifyLevel(m_installerContext)); if (m_needEncryption) { AddTask(new TaskEncryptResource(m_installerContext)); } - AddTask(new TaskFileManipulation(m_installerContext)); AddTask(new TaskManifestFile(m_installerContext)); if (m_installerContext.widgetConfig.packagingType == @@ -196,13 +205,13 @@ JobWidgetInstall::JobWidgetInstall( { AddTask(new TaskInstallOspsvc(m_installerContext)); } - AddTask(new TaskCertificates(m_installerContext)); AddTask(new TaskDatabase(m_installerContext)); AddTask(new TaskAceCheck(m_installerContext)); AddTask(new TaskSmack(m_installerContext)); + AddTask(new TaskPkgInfoUpdate(m_installerContext)); } else if (result == ConfigureResult::Updated) { - LogInfo("Configure installation updated"); - LogInfo("Widget Update"); + LogDebug("Configure installation updated"); + LogDebug("Widget Update"); m_installerContext.job->SetProgressFlag(true); if (m_installerContext.mode.command == @@ -220,13 +229,12 @@ JobWidgetInstall::JobWidgetInstall( } AddTask(new TaskCertify(m_installerContext)); + AddTask(new TaskCertifyLevel(m_installerContext)); if (m_needEncryption) { AddTask(new TaskEncryptResource(m_installerContext)); } - - if (m_installerContext.widgetConfig.packagingType != - WrtDB::PKG_TYPE_DIRECTORY_WEB_APP) - { + if (m_installerContext.mode.extension != + InstallMode::ExtensionType::DIR) { AddTask(new TaskUpdateFiles(m_installerContext)); AddTask(new TaskFileManipulation(m_installerContext)); } @@ -237,7 +245,6 @@ JobWidgetInstall::JobWidgetInstall( { AddTask(new TaskInstallOspsvc(m_installerContext)); } - AddTask(new TaskCertificates(m_installerContext)); AddTask(new TaskDatabase(m_installerContext)); AddTask(new TaskAceCheck(m_installerContext)); //TODO: remove widgetHandle from this task and move before database task @@ -245,6 +252,7 @@ JobWidgetInstall::JobWidgetInstall( // Any error in acecheck while update will break widget AddTask(new TaskSmack(m_installerContext)); AddTask(new TaskRemoveBackupFiles(m_installerContext)); + AddTask(new TaskPkgInfoUpdate(m_installerContext)); } else { // Installation is not allowed to proceed due to widget update policy LogWarning("Configure installation failed!"); @@ -258,7 +266,6 @@ ConfigureResult JobWidgetInstall::prepareInstallation( { ConfigureResult result; m_needEncryption = false; - Try { std::string tempDir; @@ -300,6 +307,9 @@ ConfigureResult JobWidgetInstall::prepareInstallation( setApplicationType(configData); m_needEncryption = detectResourceEncryption(configData); setInstallLocationType(configData); + m_installerContext.callerPkgId = + DPL::FromUTF8String(getInstallerStruct().pkgmgrInterface->getCallerId()); + LogDebug("Caller Package Id : " << m_installerContext.callerPkgId); // Configure installation result = ConfigureInstallation(widgetPath, configData, tempDir); @@ -319,6 +329,21 @@ ConfigureResult JobWidgetInstall::prepareInstallation( LogError("Failed to unzip for widget"); result = ConfigureResult::Failed_DrmError; } + Catch(Exceptions::MissingConfig) + { + LogError("Failed to localize config.xml"); + result = ConfigureResult::Failed_InvalidConfig; + } + Catch(Exceptions::WidgetConfigFileInvalid) + { + LogError("Invalid configuration file"); + result = ConfigureResult::Failed_InvalidConfig; + } + Catch(DPL::Exception) + { + LogError("Unknown exception"); + result = ConfigureResult::Failed; + } return result; } @@ -365,7 +390,7 @@ void JobWidgetInstall::setTizenId( break; } m_installerContext.widgetConfig.tzPkgid = pkgId; - LogInfo("tizen_id name was generated by WRT: " << + LogDebug("tizen_id name was generated by WRT: " << m_installerContext.widgetConfig.tzPkgid); } @@ -422,9 +447,9 @@ void JobWidgetInstall::setTizenId( m_installerContext. widgetConfig. tzPkgid)); - LogInfo("Tizen App Id : " << m_installerContext.widgetConfig.tzAppid); - LogInfo("Tizen Pkg Id : " << m_installerContext.widgetConfig.tzPkgid); - LogInfo("W3C Widget GUID : " << m_installerContext.widgetConfig.guid); + LogDebug("Tizen App Id : " << m_installerContext.widgetConfig.tzAppid); + LogDebug("Tizen Pkg Id : " << m_installerContext.widgetConfig.tzPkgid); + LogDebug("W3C Widget GUID : " << m_installerContext.widgetConfig.guid); } void JobWidgetInstall::configureWidgetLocation(const std::string & widgetPath, @@ -436,11 +461,12 @@ void JobWidgetInstall::configureWidgetLocation(const std::string & widgetPath, widgetPath, tempPath, m_installerContext.widgetConfig.packagingType, m_installerContext.mode.rootPath == - InstallMode::RootPath::RO); + InstallMode::RootPath::RO, + m_installerContext.mode.extension); m_installerContext.locations->registerAppid( DPL::ToUTF8String(m_installerContext.widgetConfig.tzAppid)); - LogInfo("widgetSource " << widgetPath); + LogDebug("widgetSource " << widgetPath); } ConfigureResult JobWidgetInstall::ConfigureInstallation( @@ -474,9 +500,6 @@ ConfigureResult JobWidgetInstall::ConfigureInstallation( } Catch(WidgetDAOReadOnly::Exception::WidgetNotExist) { result = ConfigureResult::Ok; - getInstallerStruct().pkgmgrInterface->sendSignal( - PKGMGR_START_KEY, - PKGMGR_START_INSTALL); m_installerContext.isUpdateMode = false; if (!validateTizenApplicationID( @@ -504,7 +527,7 @@ ConfigureResult JobWidgetInstall::ConfigureInstallation( bool JobWidgetInstall::validateTizenApplicationID( const WrtDB::TizenAppId &tizenAppId) { - LogInfo("tizen application ID = [" << tizenAppId << "]"); + LogDebug("tizen application ID = [" << tizenAppId << "]"); regex_t reg; if (regcomp(®, REG_TIZENID_PATTERN, REG_NOSUB | REG_EXTENDED) != 0) { @@ -545,9 +568,9 @@ ConfigureResult JobWidgetInstall::checkWidgetUpdate( return ConfigureResult::Failed; } - LogInfo("existing version = '" << update.existingVersion); - LogInfo("incoming version = '" << update.incomingVersion); - LogInfo("Tizen AppID = " << update.tzAppId); + LogDebug("existing version = '" << update.existingVersion); + LogDebug("incoming version = '" << update.incomingVersion); + LogDebug("Tizen AppID = " << update.tzAppId); // Check running state bool isRunning = false; @@ -603,7 +626,7 @@ ConfigureResult JobWidgetInstall::checkWidgetUpdate( LogError("Fail to terminate running application"); return ConfigureResult::Failed_WidgetRunning; } - LogInfo("terminate application"); + LogDebug("terminate application"); } } @@ -627,7 +650,6 @@ ConfigParserData JobWidgetInstall::getWidgetDataFromXML( // Parse config ParserRunner parser; ConfigParserData configInfo; - Try { if (pkgType == PKG_TYPE_HOSTED_WEB_APP) { @@ -636,34 +658,28 @@ ConfigParserData JobWidgetInstall::getWidgetDataFromXML( new RootParser(configInfo, DPL::FromUTF32String( L"widget")))); - } else if (pkgType == PKG_TYPE_DIRECTORY_WEB_APP) { - std::string configPath; - configPath = tempPath; - configPath += "/"; - configPath += WITH_OSP_XML; + } else { + std::string configFile; + configFile = tempPath + "/" + CONFIG_XML; + if (!WrtUtilFileExists(configFile)) { + configFile = tempPath + "/" + WITH_OSP_XML; + } if (isReinstall) { // checking RDS data directory - if (access(configPath.c_str(), F_OK) != 0) { + if (access(configFile.c_str(), F_OK) != 0) { std::string tzAppId = widgetSource.substr(widgetSource.find_last_of("/")+1); WidgetDAOReadOnly dao(WidgetDAOReadOnly::getTzAppId(DPL::FromUTF8String(tzAppId))); - configPath = DPL::ToUTF8String(*dao.getWidgetInstalledPath()); - configPath += "/"; - configPath += WITH_OSP_XML; + configFile = DPL::ToUTF8String(*dao.getWidgetInstalledPath()); + configFile += "/"; + configFile += WITH_OSP_XML; } } - parser.Parse(configPath, - ElementParserPtr( - new RootParser( - configInfo, - DPL::FromUTF32String(L"widget")))); - } else { - std::string configFile; - if (pkgType == PKG_TYPE_HYBRID_WEB_APP) { - configFile = tempPath + "/" + WITH_OSP_XML; - } else { - configFile = tempPath + "/" + CONFIG_XML; + + if(!DPL::Utils::Path(configFile).Exists()) + { + ThrowMsg(Exceptions::MissingConfig, "Config file not exists"); } parser.Parse(configFile, @@ -684,6 +700,10 @@ ConfigParserData JobWidgetInstall::getWidgetDataFromXML( LogError("Failed to find installed widget - give proper tizenId"); return ConfigParserData(); } + Catch(Exceptions::WidgetConfigFileNotFound){ + LogError("Failed to find config.xml"); + return ConfigParserData(); + } return configInfo; } @@ -692,7 +712,7 @@ WidgetUpdateInfo JobWidgetInstall::detectWidgetUpdate( const ConfigParserData &configInfo, const WrtDB::TizenAppId &tizenId) { - LogInfo("Checking up widget package for config.xml..."); + LogDebug("Checking up widget package for config.xml..."); OptionalWidgetVersion incomingVersion; if (!configInfo.version.IsNull()) { @@ -876,78 +896,50 @@ void JobWidgetInstall::displayWidgetInfo() out << std::endl; - LogInfo(out.str()); + LogDebug(out.str()); } WrtDB::PackagingType JobWidgetInstall::checkPackageType( const std::string &widgetSource, const std::string &tempPath) { - // Check installation type (direcotory/ or config.xml or widget.wgt) - if (m_installerContext.mode.extension == InstallMode::ExtensionType::DIR) { - LogDebug("Install directly from directory"); - return PKG_TYPE_DIRECTORY_WEB_APP; - } if (hasExtension(widgetSource, XML_EXTENSION)) { - LogInfo("Hosted app installation"); + LogDebug("Hosted app installation"); return PKG_TYPE_HOSTED_WEB_APP; } - std::string configFile = tempPath + "/" + CONFIG_XML; - if (WrtUtilFileExists(configFile)) { - return PKG_TYPE_NOMAL_WEB_APP; - } - - configFile = tempPath + "/" + WITH_OSP_XML; + std::string configFile = tempPath + "/" + OSP_MANIFEST_XML; if (WrtUtilFileExists(configFile)) { return PKG_TYPE_HYBRID_WEB_APP; } - return PKG_TYPE_UNKNOWN; + return PKG_TYPE_NOMAL_WEB_APP; } void JobWidgetInstall::setApplicationType( const WrtDB::ConfigParserData &configInfo) { + AppType widgetAppType = APP_TYPE_UNKNOWN; 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; - } + LogDebug("namespace = [" << *iterator << "]"); - if (m_installerContext.widgetConfig.webAppType == - APP_TYPE_UNKNOWN) - { - m_installerContext.widgetConfig.webAppType = currentAppType; - } else if (m_installerContext.widgetConfig.webAppType == - currentAppType) - { - continue; + if (*iterator == ConfigurationNamespace::TizenWebAppNamespaceName) { + if (widgetAppType != APP_TYPE_UNKNOWN && + widgetAppType != APP_TYPE_TIZENWEBAPP) + { + LogError("To many namespaces declared in configuration fileA."); + ThrowMsg(Exceptions::WidgetConfigFileInvalid, + "Config.xml has more than one valid namespace"); + } + widgetAppType = APP_TYPE_TIZENWEBAPP; } else { - ThrowMsg(Exceptions::WidgetConfigFileInvalid, - "Config.xml has more than one namespace"); + LogDebug("Namespace ignored."); } } - // 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; - } + m_installerContext.widgetConfig.webAppType = widgetAppType; - LogInfo("type = [" << + LogDebug("type = [" << m_installerContext.widgetConfig.webAppType.getApptypeToString() << "]"); }