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=9e76928fb384758aad44c23a5fea678d511b8404;hpb=f947ed1728ecff4940d183999e2ee9cd8f9cec83;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 old mode 100755 new mode 100644 index 9e76928..e746f01 --- 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,14 +68,14 @@ #include #include #include -#include -#include +#include #include #include #include #include #include +#include using namespace WrtDB; using namespace Jobs::Exceptions; @@ -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,}$"; @@ -90,6 +93,7 @@ const size_t PACKAGE_ID_LENGTH = 10; static const DPL::String SETTING_VALUE_ENCRYPTION = L"encryption"; static const DPL::String SETTING_VALUE_ENCRYPTION_ENABLE = L"enable"; +static const DPL::String SETTING_VALUE_ENCRYPTION_DISABLE = L"disable"; const DPL::String SETTING_VALUE_INSTALLTOEXT_NAME = L"install-location"; const DPL::String SETTING_VALUE_INSTALLTOEXT_PREPER_EXT = @@ -105,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)); } @@ -121,12 +125,15 @@ class InstallerTaskFail : void StepFail() { - if (m_result == ConfigureResult::Deferred) { - ThrowMsg(Jobs::WidgetInstall::Exceptions::Deferred, - "widget installation or update deferred!"); - } else if (m_result == ConfigureResult::Failed_InvalidConfig) { + if (m_result == ConfigureResult::Failed_InvalidConfig) { ThrowMsg(Jobs::WidgetInstall::Exceptions::WidgetConfigFileInvalid, "invalid config"); + } else if (m_result == ConfigureResult::Failed_OpenZipError) { + ThrowMsg(Jobs::WidgetInstall::Exceptions::OpenZipFailed, + "can't open wgt file"); + } else if (m_result == ConfigureResult::Failed_UnzipError) { + ThrowMsg(Jobs::WidgetInstall::Exceptions::ExtractFileFailed, + "can't extract wgt file"); } else if (m_result == ConfigureResult::Failed_LowerVersion) { ThrowMsg(Jobs::WidgetInstall::Exceptions::PackageLowerVersion, "package version is lower than installed version"); @@ -137,8 +144,11 @@ class InstallerTaskFail : ThrowMsg(Jobs::WidgetInstall::Exceptions::WidgetRunningError, "widget is running"); } else if (m_result == ConfigureResult::Failed_DrmError) { - ThrowMsg(Jobs::WidgetInstall::Exceptions::DRMFailed, + ThrowMsg(Jobs::WidgetInstall::Exceptions::DrmDecryptFailed, "drm failed"); + } else if (m_result == ConfigureResult::Failed_NotSupportRDSUpdate) { + ThrowMsg(Jobs::WidgetInstall::Exceptions::NotSupportRDSUpdate, + "RDS update failed"); } else { ThrowMsg(Jobs::WidgetInstall::Exceptions::NotAllowed, "widget installation or update not allowed!"); @@ -162,26 +172,21 @@ JobWidgetInstall::JobWidgetInstall( JobContextBase(installerStruct), m_exceptionCaught(Jobs::Exceptions::Success) { - m_installerContext.m_quiet = m_jobStruct.m_quiet; - - ConfigureResult result = PrePareInstallation(widgetPath); + 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)); - // Create installation tasks - if (m_installerContext.widgetConfig.packagingType != - WrtDB::PKG_TYPE_DIRECTORY_WEB_APP && - m_installerContext.widgetConfig.packagingType != - WrtDB::PKG_TYPE_HOSTED_WEB_APP && - !m_isDRM) - { - AddTask(new TaskUnzip(m_installerContext)); - } - AddTask(new TaskWidgetConfig(m_installerContext)); if (m_installerContext.widgetConfig.packagingType == WrtDB::PKG_TYPE_HOSTED_WEB_APP) @@ -189,47 +194,32 @@ 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)); - // TODO: Update progress information for this task - - //This is sort of quick solution, because ACE verdicts are based upon - //data from DAO (DB). So AceCheck for now has to be AFTER DbUpdate - //task. - AddTask(new TaskSmack(m_installerContext)); - AddTask(new TaskManifestFile(m_installerContext)); if (m_installerContext.widgetConfig.packagingType == PKG_TYPE_HYBRID_WEB_APP) { 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_jobStruct.m_installMode == - InstallMode::REINSTALL_MODE_DIRECTORY) + if (m_installerContext.mode.command == + InstallMode::Command::REINSTALL) { AddTask(new TaskPrepareReinstall(m_installerContext)); } - if (m_installerContext.widgetConfig.packagingType != - WrtDB::PKG_TYPE_HOSTED_WEB_APP && - m_installerContext.widgetConfig.packagingType != - WrtDB::PKG_TYPE_DIRECTORY_WEB_APP && - !m_isDRM) - { - AddTask(new TaskUnzip(m_installerContext)); - } - AddTask(new TaskWidgetConfig(m_installerContext)); if (m_installerContext.widgetConfig.packagingType == @@ -239,86 +229,69 @@ 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)); } - /* TODO : To backup file, save md5 values */ - AddTask(new TaskSmack(m_installerContext)); - AddTask(new TaskManifestFile(m_installerContext)); if (m_installerContext.widgetConfig.packagingType == PKG_TYPE_HYBRID_WEB_APP) { AddTask(new TaskInstallOspsvc(m_installerContext)); } - if (m_installerContext.widgetConfig.packagingType != - WrtDB::PKG_TYPE_DIRECTORY_WEB_APP) - { - AddTask(new TaskRemoveBackupFiles(m_installerContext)); - } AddTask(new TaskDatabase(m_installerContext)); AddTask(new TaskAceCheck(m_installerContext)); //TODO: remove widgetHandle from this task and move before database task // by now widget handle is needed in ace check // Any error in acecheck while update will break widget - } else if (result == ConfigureResult::Deferred) { - // Installation is deferred - LogInfo("Configure installation deferred"); - - AddTask(new InstallerTaskFail(result)); - } else if (result >= ConfigureResult::Failed && - result <= ConfigureResult::Failed_DrmError) { + 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!"); AddTask(new InstallerTaskFail(result)); - } else { - Assert(false && "Invalid configure result!"); } } -ConfigureResult JobWidgetInstall::PrePareInstallation( +ConfigureResult JobWidgetInstall::prepareInstallation( const std::string &widgetPath) { ConfigureResult result; m_needEncryption = false; - Try { std::string tempDir; - if (m_jobStruct.m_installMode == - InstallMode::REINSTALL_MODE_DIRECTORY) - { - std::ostringstream tempPathBuilder; - tempPathBuilder << WrtDB::GlobalConfig::GetUserInstalledWidgetPath(); - tempPathBuilder << WrtDB::GlobalConfig::GetTmpDirPath(); - tempPathBuilder << "/"; - tempPathBuilder << widgetPath; - tempDir = tempPathBuilder.str();; + if (m_installerContext.mode.extension == InstallMode::ExtensionType::DIR) { + if (m_installerContext.mode.command == + InstallMode::Command::REINSTALL) { + std::ostringstream tempPathBuilder; + tempPathBuilder << WrtDB::GlobalConfig::GetUserInstalledWidgetPath(); + tempPathBuilder << WrtDB::GlobalConfig::GetTmpDirPath(); + tempPathBuilder << "/"; + tempPathBuilder << widgetPath; + tempDir = tempPathBuilder.str();; + } else { + tempDir = widgetPath; + } } else { tempDir = Jobs::WidgetInstall::createTempPath( - m_jobStruct.m_installMode == - InstallMode::INSTALL_MODE_PRELOAD); - } - - m_isDRM = isDRMWidget(widgetPath); - if (true == m_isDRM) { - LogDebug("decrypt DRM widget"); - if (DecryptDRMWidget(widgetPath, tempDir)) { - LogDebug("Failed decrypt DRM widget"); - return ConfigureResult::Failed_DrmError; - } + m_installerContext.mode.rootPath == + InstallMode::RootPath::RO); + WidgetUnzip wgtUnzip; + wgtUnzip.unzipWgtFile(widgetPath, tempDir); } LogDebug("widgetPath:" << widgetPath); + LogDebug("tempPath:" << tempDir); m_installerContext.widgetConfig.packagingType = checkPackageType(widgetPath, tempDir); @@ -326,9 +299,7 @@ ConfigureResult JobWidgetInstall::PrePareInstallation( widgetPath, tempDir, m_installerContext.widgetConfig.packagingType, - m_isDRM, - m_jobStruct.m_installMode == - InstallMode::REINSTALL_MODE_DIRECTORY); + m_installerContext.mode.command == InstallMode::Command::REINSTALL); LogDebug("widget packaging type : " << m_installerContext.widgetConfig.packagingType.pkgType); @@ -336,15 +307,43 @@ 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); } + Catch(Exceptions::OpenZipFailed) + { + LogError("Failed to unzip for widget"); + result = ConfigureResult::Failed_OpenZipError; + } Catch(Exceptions::ExtractFileFailed) { - LogError("Failed to create temporary path for widget"); + LogError("Failed to unzip for widget"); + result = ConfigureResult::Failed_UnzipError; + } + Catch(Exceptions::DrmDecryptFailed) + { + 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; } @@ -391,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); } @@ -448,36 +447,26 @@ 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, const std::string& tempPath) { - if (m_jobStruct.m_installMode == - InstallMode::REINSTALL_MODE_DIRECTORY) - { - // replace widget path to installed path - m_installerContext.locations = - WidgetLocation(DPL::ToUTF8String(m_installerContext.widgetConfig. - tzPkgid), - widgetPath, tempPath, - m_installerContext.widgetConfig.packagingType, - m_installerContext.locationType); - } else { - m_installerContext.locations = - WidgetLocation(DPL::ToUTF8String(m_installerContext.widgetConfig. - tzPkgid), - widgetPath, tempPath, - m_installerContext.widgetConfig.packagingType, - m_installerContext.locationType); - } + m_installerContext.locations = + WidgetLocation(DPL::ToUTF8String(m_installerContext.widgetConfig. + tzPkgid), + widgetPath, tempPath, + m_installerContext.widgetConfig.packagingType, + m_installerContext.mode.rootPath == + 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( @@ -504,13 +493,13 @@ ConfigureResult JobWidgetInstall::ConfigureInstallation( // Already installed TizenAppId. return failed return ConfigureResult::Failed_AlreadyInstalled; } + if (!checkSupportRDSUpdate(configData)) { + return ConfigureResult::Failed_NotSupportRDSUpdate; + } m_installerContext.isUpdateMode = true; } Catch(WidgetDAOReadOnly::Exception::WidgetNotExist) { result = ConfigureResult::Ok; - getInstallerStruct().pkgmgrInterface->sendSignal( - PKGMGR_START_KEY, - PKGMGR_START_INSTALL); m_installerContext.isUpdateMode = false; if (!validateTizenApplicationID( @@ -538,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) { @@ -563,13 +552,9 @@ bool JobWidgetInstall::validateTizenPackageID( std::string installPath = std::string(GlobalConfig::GetUserInstalledWidgetPath()) + "/" + pkgId; - std::string preinstallPath = - std::string(GlobalConfig::GetUserPreloadedWidgetPath()) + - "/" + pkgId; struct stat dirStat; - if ((stat(installPath.c_str(), &dirStat) == 0) || - (stat(preinstallPath.c_str(), &dirStat) == 0)) + if ((stat(installPath.c_str(), &dirStat) == 0)) { return false; } @@ -579,77 +564,92 @@ bool JobWidgetInstall::validateTizenPackageID( ConfigureResult JobWidgetInstall::checkWidgetUpdate( const WidgetUpdateInfo &update) { - LogInfo("incoming version = '" << update.incomingVersion); - LogInfo("Tizen AppID = " << update.tzAppId); - if (update.existingVersion.IsNull() || update.incomingVersion.IsNull()) { return ConfigureResult::Failed; } + LogDebug("existing version = '" << update.existingVersion); + LogDebug("incoming version = '" << update.incomingVersion); + LogDebug("Tizen AppID = " << update.tzAppId); + // Check running state bool isRunning = false; - int retval = + int ret = app_manager_is_running(DPL::ToUTF8String(update.tzAppId).c_str(), &isRunning); - if (APP_MANAGER_ERROR_NONE != retval || isRunning) { + if (APP_MANAGER_ERROR_NONE != ret) { LogError("Fail to get running state"); return ConfigureResult::Failed_WidgetRunning; } + if (true == isRunning) { + // get app_context for running application + // app_context must be released with app_context_destroy + app_context_h appCtx = NULL; + ret = + app_manager_get_app_context( + DPL::ToUTF8String(update.tzAppId).c_str(), + &appCtx); + if (APP_MANAGER_ERROR_NONE != ret) { + LogError("Fail to get app_context"); + return ConfigureResult::Failed_WidgetRunning; + } + + // terminate app_context_h + ret = app_manager_terminate_app(appCtx); + if (APP_MANAGER_ERROR_NONE != ret) { + LogError("Fail to terminate running application"); + app_context_destroy(appCtx); + return ConfigureResult::Failed_WidgetRunning; + } else { + app_context_destroy(appCtx); + // app_manager_terminate_app isn't sync API + // wait until application isn't running (50ms * 100) + bool isStillRunning = true; + int checkingloop = 100; + struct timespec duration = { 0, 50 * 1000 * 1000 }; + while (--checkingloop >= 0) { + nanosleep(&duration, NULL); + int ret = + app_manager_is_running( + DPL::ToUTF8String(update.tzAppId).c_str(), + &isStillRunning); + if (APP_MANAGER_ERROR_NONE != ret) { + LogError("Fail to get running state"); + return ConfigureResult::Failed_WidgetRunning; + } + if (!isStillRunning) { + break; + } + } + if (isStillRunning) { + LogError("Fail to terminate running application"); + return ConfigureResult::Failed_WidgetRunning; + } + LogDebug("terminate application"); + } + } + m_installerContext.widgetConfig.tzAppid = update.tzAppId; - if (isUpperVersion(update.existingVersion, update.incomingVersion) || - (m_jobStruct.m_installMode == InstallMode::INSTALL_MODE_DIRECTORY) || - (m_jobStruct.m_installMode == InstallMode::REINSTALL_MODE_DIRECTORY)) - { - LogInfo("Whether widget policy allow proceed ok"); + if (!!update.existingVersion || + m_installerContext.mode.extension == + InstallMode::ExtensionType::DIR) { return ConfigureResult::Updated; - } else { - return ConfigureResult::Failed_LowerVersion; } return ConfigureResult::Failed; } -bool JobWidgetInstall::isUpperVersion( - const OptionalWidgetVersion &existingVersion, - const OptionalWidgetVersion &incomingVersion) -{ - LogInfo("Existing version = '" << *existingVersion); - LogInfo("Incoming version = '" << *incomingVersion); - - if (!existingVersion && !incomingVersion) { - return false; - } else if (!existingVersion && !!incomingVersion) { - return false; - } else if (!!existingVersion && !incomingVersion) { - return true; - } else { - if (!existingVersion->IsWac() || !incomingVersion->IsWac()) { - return false; - } else { - if (*incomingVersion == *existingVersion) { - return false; - } else if (*incomingVersion > *existingVersion) { - return true; - } else { - return false; - } - } - } -} - ConfigParserData JobWidgetInstall::getWidgetDataFromXML( const std::string &widgetSource, const std::string &tempPath, WrtDB::PackagingType pkgType, - bool isDRM, bool isReinstall) { // Parse config ParserRunner parser; ConfigParserData configInfo; - Try { if (pkgType == PKG_TYPE_HOSTED_WEB_APP) { @@ -658,101 +658,53 @@ 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 { - if (!isDRM) { - std::unique_ptr zipFile( - new DPL::ZipInput(widgetSource)); - - std::unique_ptr configFile; - - // Open config.xml file - if (pkgType == PKG_TYPE_HYBRID_WEB_APP) { - configFile.reset(zipFile->OpenFile(WITH_OSP_XML)); - } else { - configFile.reset(zipFile->OpenFile(CONFIG_XML)); - } - // Extract config - DPL::BinaryQueue buffer; - DPL::AbstractWaitableInputAdapter inputAdapter(configFile.get()); - DPL::AbstractWaitableOutputAdapter outputAdapter(&buffer); - DPL::Copy(&inputAdapter, &outputAdapter); - parser.Parse(&buffer, - ElementParserPtr( - new RootParser(configInfo, - DPL:: - FromUTF32String( - L"widget")))); - } else { - // DRM widget - std::string configFile; - if (pkgType == PKG_TYPE_HYBRID_WEB_APP) { - configFile = tempPath + "/" + WITH_OSP_XML; - } else { - configFile = tempPath + "/" + CONFIG_XML; - } - - parser.Parse(configFile, - ElementParserPtr( - new RootParser(configInfo, - DPL:: - FromUTF32String( - L"widget")))); + if(!DPL::Utils::Path(configFile).Exists()) + { + ThrowMsg(Exceptions::MissingConfig, "Config file not exists"); } + + parser.Parse(configFile, + ElementParserPtr( + new RootParser(configInfo, + DPL:: + FromUTF32String( + L"widget")))); } } - Catch(DPL::ZipInput::Exception::OpenFailed) - { - LogError("Failed to open widget package"); - return ConfigParserData(); - } - Catch(DPL::ZipInput::Exception::OpenFileFailed) - { - LogError("Failed to open config.xml file"); - return ConfigParserData(); - } - Catch(DPL::CopyFailed) - { - LogError("Failed to extract config.xml file"); - return ConfigParserData(); - } - Catch(DPL::FileInput::Exception::OpenFailed) - { - LogError("Failed to open config.xml file"); - return ConfigParserData(); - } Catch(ElementParser::Exception::ParseError) { LogError("Failed to parse config.xml file"); return ConfigParserData(); } - Catch(DPL::ZipInput::Exception::SeekFileFailed) + Catch(WidgetDAOReadOnly::Exception::WidgetNotExist) { - LogError("Failed to seek widget archive - corrupted package?"); + LogError("Failed to find installed widget - give proper tizenId"); return ConfigParserData(); } + Catch(Exceptions::WidgetConfigFileNotFound){ + LogError("Failed to find config.xml"); + return ConfigParserData(); + } + return configInfo; } @@ -760,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()) { @@ -944,126 +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_jobStruct.m_installMode == InstallMode::INSTALL_MODE_DIRECTORY || - m_jobStruct.m_installMode == InstallMode::REINSTALL_MODE_DIRECTORY) - { - 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; } - if (m_isDRM) { - std::string configFile = tempPath + "/" + CONFIG_XML; - if (WrtUtilFileExists(configFile)) { - return PKG_TYPE_NOMAL_WEB_APP; - } - - configFile = tempPath + "/" + WITH_OSP_XML; - if (WrtUtilFileExists(configFile)) { - return PKG_TYPE_HYBRID_WEB_APP; - } - } else { - std::unique_ptr zipFile; - - Try - { - // Open zip file - zipFile.reset(new DPL::ZipInput(widgetSource)); - } - Catch(DPL::ZipInput::Exception::OpenFailed) - { - LogDebug("Failed to open widget package"); - return PKG_TYPE_UNKNOWN; - } - Catch(DPL::ZipInput::Exception::SeekFileFailed) - { - LogError("Failed to seek widget package file"); - return PKG_TYPE_UNKNOWN; - } - - Try - { - // Open config.xml file in package root - std::unique_ptr configFile( - zipFile->OpenFile(CONFIG_XML)); - return PKG_TYPE_NOMAL_WEB_APP; - } - Catch(DPL::ZipInput::Exception::OpenFileFailed) - { - LogDebug("Could not find config.xml"); - } - - Try - { - // Open config.xml file in package root - std::unique_ptr configFile( - zipFile->OpenFile(WITH_OSP_XML)); - - return PKG_TYPE_HYBRID_WEB_APP; - } - Catch(DPL::ZipInput::Exception::OpenFileFailed) - { - LogDebug("Could not find wgt/config.xml"); - return PKG_TYPE_UNKNOWN; - } + 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() << "]"); } @@ -1084,18 +960,11 @@ bool JobWidgetInstall::detectResourceEncryption( } void JobWidgetInstall::setInstallLocationType( - const - WrtDB::ConfigParserData & - configData) + const WrtDB::ConfigParserData & configData) { m_installerContext.locationType = INSTALL_LOCATION_TYPE_NOMAL; - - if (m_jobStruct.m_installMode == InstallMode::INSTALL_MODE_PRELOAD) { - m_installerContext.locationType = - INSTALL_LOCATION_TYPE_PRELOAD; - } else { - FOREACH(it, configData.settingsList) - { + if (m_installerContext.mode.installTime != InstallMode::InstallTime::PRELOAD) { + FOREACH(it, configData.settingsList) { if (it->m_name == SETTING_VALUE_INSTALLTOEXT_NAME && it->m_value == SETTING_VALUE_INSTALLTOEXT_PREPER_EXT) @@ -1108,17 +977,39 @@ void JobWidgetInstall::setInstallLocationType( } } -bool JobWidgetInstall::isDRMWidget(std::string /*widgetPath*/) +bool JobWidgetInstall::checkSupportRDSUpdate(const WrtDB::ConfigParserData + &configInfo) { - /* TODO */ - return false; -} + if (m_installerContext.mode.command == + InstallMode::Command::REINSTALL) + { + DPL::String configValue = SETTING_VALUE_ENCRYPTION_DISABLE; + DPL::String dbValue = SETTING_VALUE_ENCRYPTION_DISABLE; -bool JobWidgetInstall::DecryptDRMWidget(std::string /*widgetPath*/, - std::string /*destPath*/) -{ - /* TODO */ - return false; + WidgetDAOReadOnly dao(m_installerContext.widgetConfig.tzAppid); + WrtDB::WidgetSettings widgetSettings; + dao.getWidgetSettings(widgetSettings); + + FOREACH(it, widgetSettings) { + if (it->settingName == SETTING_VALUE_ENCRYPTION) { + dbValue = it->settingValue; + } + } + + FOREACH(data, configInfo.settingsList) + { + if (data->m_name == SETTING_VALUE_ENCRYPTION) + { + configValue = data->m_value; + } + } + if (configValue != dbValue) { + LogError("Not Support RDS mode because of encryption setting"); + return false; + } + } + + return true; } } //namespace WidgetInstall } //namespace Jobs