X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fjobs%2Fwidget_install%2Fjob_widget_install.cpp;h=e2b20865955ed468c741055b3c2e65cf385ecd47;hb=80392791b3b7919b59596326dd9fdd9b25a1be1e;hp=e0a26bbc0efe4c7a627ea8a6db20d6e04edd360c;hpb=ea6ee8f67abbf684843c23b44a3c6bbaae0ff0bd;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 e0a26bb..e2b2086 100644 --- a/src/jobs/widget_install/job_widget_install.cpp +++ b/src/jobs/widget_install/job_widget_install.cpp @@ -48,8 +48,6 @@ #include #include #include -//#include -#include //temporary code #include "root_parser.h" #include "widget_parser.h" @@ -71,14 +69,14 @@ #include #include #include - -#include +#include #include #include #include using namespace WrtDB; +using namespace Jobs::Exceptions; namespace // anonymous { @@ -93,36 +91,10 @@ 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"; const DPL::String SETTING_VALUE_INSTALLTOEXT_NAME = - L"install-location-type"; + L"install-location"; const DPL::String SETTING_VALUE_INSTALLTOEXT_PREPER_EXT = L"prefer-external"; -class InstallerTaskFail : - public DPL::TaskDecl -{ - private: - bool m_deferred; - - void StepFail() - { - if (m_deferred) { - ThrowMsg(Jobs::WidgetInstall::Exceptions::Deferred, - "Widget installation or update deferred!"); - } else { - ThrowMsg(Jobs::WidgetInstall::Exceptions::NotAllowed, - "Widget installation or update not allowed!"); - } - } - - public: - InstallerTaskFail(bool deferred) : - DPL::TaskDecl(this), - m_deferred(deferred) - { - AddStep(&InstallerTaskFail::StepFail); - } -}; - const std::string XML_EXTENSION = ".xml"; bool hasExtension(const std::string& filename, const std::string& extension) @@ -137,35 +109,58 @@ bool hasExtension(const std::string& filename, const std::string& extension) } return (0 == filename.compare(fileLen - extLen, extLen, extension)); } +} // namespace anonymous -bool checkTizenPkgIdExist(const std::string& tizenPkgId) +namespace Jobs { +namespace WidgetInstall { +class InstallerTaskFail : + public DPL::TaskDecl { - std::string installPath = - std::string(GlobalConfig::GetUserInstalledWidgetPath()) + - "/" + tizenPkgId; - std::string preinstallPath = - std::string(GlobalConfig::GetUserPreloadedWidgetPath()) + - "/" + tizenPkgId; + private: + ConfigureResult m_result; - struct stat dirStat; - if ((stat(installPath.c_str(), &dirStat) == 0) || - (stat(preinstallPath.c_str(), &dirStat) == 0)) + void StepFail() { - return true; + if (m_result == ConfigureResult::Deferred) { + ThrowMsg(Jobs::WidgetInstall::Exceptions::Deferred, + "widget installation or update deferred!"); + } else if (m_result == ConfigureResult::Failed_InvalidConfig) { + ThrowMsg(Jobs::WidgetInstall::Exceptions::WidgetConfigFileInvalid, + "invalid config"); + } else if (m_result == ConfigureResult::Failed_LowerVersion) { + ThrowMsg(Jobs::WidgetInstall::Exceptions::PackageLowerVersion, + "package version is lower than installed version"); + } else if (m_result == ConfigureResult::Failed_AlreadyInstalled) { + ThrowMsg(Jobs::WidgetInstall::Exceptions::PackageAlreadyInstalled, + "package is already installed"); + } else if (m_result == ConfigureResult::Failed_WidgetRunning) { + ThrowMsg(Jobs::WidgetInstall::Exceptions::WidgetRunningError, + "widget is running"); + } else if (m_result == ConfigureResult::Failed_DrmError) { + ThrowMsg(Jobs::WidgetInstall::Exceptions::DRMFailed, + "drm failed"); + } else { + ThrowMsg(Jobs::WidgetInstall::Exceptions::NotAllowed, + "widget installation or update not allowed!"); + } } - return false; -} -} // namespace anonymous -namespace Jobs { -namespace WidgetInstall { + public: + InstallerTaskFail(ConfigureResult result) : + DPL::TaskDecl(this), + m_result(result) + { + AddStep(&InstallerTaskFail::StepFail); + } +}; + JobWidgetInstall::JobWidgetInstall( std::string const &widgetPath, const WidgetInstallationStruct & installerStruct) : Job(Installation), JobContextBase(installerStruct), - m_exceptionCaught(Exceptions::Success) + m_exceptionCaught(Jobs::Exceptions::Success) { m_installerContext.m_quiet = m_jobStruct.m_quiet; @@ -199,12 +194,6 @@ JobWidgetInstall::JobWidgetInstall( } 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 == @@ -213,13 +202,20 @@ JobWidgetInstall::JobWidgetInstall( AddTask(new TaskInstallOspsvc(m_installerContext)); } AddTask(new TaskCertificates(m_installerContext)); - AddTask(new TaskPluginsCopy(m_installerContext)); AddTask(new TaskDatabase(m_installerContext)); AddTask(new TaskAceCheck(m_installerContext)); + AddTask(new TaskSmack(m_installerContext)); } else if (result == ConfigureResult::Updated) { LogInfo("Configure installation updated"); LogInfo("Widget Update"); m_installerContext.job->SetProgressFlag(true); + + if (m_jobStruct.m_installMode == + InstallMode::REINSTALL_MODE_DIRECTORY) + { + AddTask(new TaskPrepareReinstall(m_installerContext)); + } + if (m_installerContext.widgetConfig.packagingType != WrtDB::PKG_TYPE_HOSTED_WEB_APP && m_installerContext.widgetConfig.packagingType != @@ -238,15 +234,16 @@ JobWidgetInstall::JobWidgetInstall( } AddTask(new TaskCertify(m_installerContext)); + if (m_needEncryption) { + AddTask(new TaskEncryptResource(m_installerContext)); + } + if (m_installerContext.widgetConfig.packagingType != WrtDB::PKG_TYPE_DIRECTORY_WEB_APP) { AddTask(new TaskUpdateFiles(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) @@ -258,28 +255,29 @@ JobWidgetInstall::JobWidgetInstall( { AddTask(new TaskRemoveBackupFiles(m_installerContext)); } - AddTask(new TaskPluginsCopy(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 + AddTask(new TaskSmack(m_installerContext)); } else if (result == ConfigureResult::Deferred) { // Installation is deferred LogInfo("Configure installation deferred"); - AddTask(new InstallerTaskFail(true)); - } else if (result == ConfigureResult::Failed) { + AddTask(new InstallerTaskFail(result)); + } else if (result >= ConfigureResult::Failed && + result <= ConfigureResult::Failed_DrmError) { // Installation is not allowed to proceed due to widget update policy LogWarning("Configure installation failed!"); - AddTask(new InstallerTaskFail(false)); + AddTask(new InstallerTaskFail(result)); } else { Assert(false && "Invalid configure result!"); } } -JobWidgetInstall::ConfigureResult JobWidgetInstall::PrePareInstallation( +ConfigureResult JobWidgetInstall::PrePareInstallation( const std::string &widgetPath) { ConfigureResult result; @@ -287,15 +285,29 @@ JobWidgetInstall::ConfigureResult JobWidgetInstall::PrePareInstallation( Try { - std::string tempDir = - Jobs::WidgetInstall::createTempPath(m_jobStruct.m_preload); + 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();; + } 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; + return ConfigureResult::Failed_DrmError; } } @@ -307,7 +319,9 @@ JobWidgetInstall::ConfigureResult JobWidgetInstall::PrePareInstallation( widgetPath, tempDir, m_installerContext.widgetConfig.packagingType, - m_isDRM); + m_isDRM, + m_jobStruct.m_installMode == + InstallMode::REINSTALL_MODE_DIRECTORY); LogDebug("widget packaging type : " << m_installerContext.widgetConfig.packagingType.pkgType); @@ -322,7 +336,7 @@ JobWidgetInstall::ConfigureResult JobWidgetInstall::PrePareInstallation( Catch(Exceptions::ExtractFileFailed) { LogError("Failed to create temporary path for widget"); - result = ConfigureResult::Failed; + result = ConfigureResult::Failed_InvalidConfig; } return result; @@ -362,7 +376,7 @@ void JobWidgetInstall::setTizenId( TizenPkgId pkgId = WidgetDAOReadOnly::generatePkgId(); LogDebug("Checking if pkg id is unique"); while (true) { - if (checkTizenPkgIdExist(DPL::ToUTF8String(pkgId))) { + if (!validateTizenPackageID(pkgId)) { //path exist, chose another one pkgId = WidgetDAOReadOnly::generatePkgId(); continue; @@ -435,171 +449,232 @@ void JobWidgetInstall::setTizenId( void JobWidgetInstall::configureWidgetLocation(const std::string & widgetPath, const std::string& tempPath) { - m_installerContext.locations = - WidgetLocation(DPL::ToUTF8String(m_installerContext.widgetConfig. - tzPkgid), - widgetPath, tempPath, - m_installerContext.widgetConfig.packagingType, - m_installerContext.locationType); + 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->registerAppid( DPL::ToUTF8String(m_installerContext.widgetConfig.tzAppid)); LogInfo("widgetSource " << widgetPath); } -JobWidgetInstall::ConfigureResult JobWidgetInstall::ConfigureInstallation( +ConfigureResult JobWidgetInstall::ConfigureInstallation( const std::string &widgetSource, const WrtDB::ConfigParserData &configData, const std::string &tempPath) { - WidgetUpdateInfo update = detectWidgetUpdate( - configData, - m_installerContext. - widgetConfig.webAppType, - m_installerContext. - widgetConfig.tzAppid); - ConfigureResult result = checkWidgetUpdate(update); - - // Validate tizenId - regex_t reg; - if (regcomp(®, REG_TIZENID_PATTERN, REG_NOSUB | REG_EXTENDED) != 0) { - LogDebug("Regcomp failed"); + ConfigureResult result = ConfigureResult::Failed; + WidgetUpdateInfo update; + + // checking installed web application + Try { + // checking existing application is installed + WidgetDAOReadOnly dao(m_installerContext.widgetConfig.tzAppid); + // no excpetion means, it isn't update mode + getInstallerStruct().pkgmgrInterface->sendSignal( + PKGMGR_START_KEY, + PKGMGR_START_UPDATE); + + update = detectWidgetUpdate(configData, + m_installerContext.widgetConfig.tzAppid); + result = checkWidgetUpdate(update); + if (result != ConfigureResult::Updated) { + // Already installed TizenAppId. return failed + return ConfigureResult::Failed_AlreadyInstalled; + } + 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 ((regexec(®, - DPL::ToUTF8String(m_installerContext.widgetConfig.tzAppid). - c_str(), - static_cast(0), NULL, 0) == REG_NOMATCH) || - (checkTizenPkgIdExist(DPL::ToUTF8String(m_installerContext.widgetConfig - .tzPkgid)) && - result != ConfigureResult::Updated)) - { - //it is true when tizenId does not fit REG_TIZENID_PATTERN - LogError("tizen_id provided but not proper or pkgId directory exists"); - //TODO(t.iwanek): appId is unique, what about installation of - // abcdefghij.test1 and abcdefghij.test2? - regfree(®); - return ConfigureResult::Failed; + if (!validateTizenApplicationID( + m_installerContext.widgetConfig.tzAppid)) + { + LogError("tizen application ID is already used"); + return ConfigureResult::Failed_InvalidConfig; + } + if (!validateTizenPackageID(m_installerContext.widgetConfig.tzPkgid)) { + LogError("tizen package ID is already used"); + return ConfigureResult::Failed_AlreadyInstalled; + } } - regfree(®); configureWidgetLocation(widgetSource, tempPath); // Init installer context m_installerContext.installStep = InstallerContext::INSTALL_START; m_installerContext.job = this; - m_installerContext.existingWidgetInfo = update.existingWidgetInfo; m_installerContext.widgetConfig.shareHref = std::string(); return result; } -JobWidgetInstall::ConfigureResult JobWidgetInstall::checkWidgetUpdate( - const WidgetUpdateInfo &update) +bool JobWidgetInstall::validateTizenApplicationID( + const WrtDB::TizenAppId &tizenAppId) { - LogInfo( - "Widget install/update: incoming guid = '" << - update.incomingGUID << "'"); - LogInfo( - "Widget install/update: incoming version = '" << - update.incomingVersion << "'"); - - // Check policy - WidgetUpdateMode::Type updateTypeCheckBit; + LogInfo("tizen application ID = [" << tizenAppId << "]"); - if (update.existingWidgetInfo.isExist == false) { - LogInfo("Widget info does not exist"); - updateTypeCheckBit = WidgetUpdateMode::NotInstalled; - - getInstallerStruct().pkgmgrInterface->sendSignal( - PKGMGR_START_KEY, - PKGMGR_START_INSTALL); + regex_t reg; + if (regcomp(®, REG_TIZENID_PATTERN, REG_NOSUB | REG_EXTENDED) != 0) { + LogDebug("Regcomp failed"); + } - } else { - LogInfo("Widget info exists. appid: " << - update.existingWidgetInfo.tzAppid); + if (regexec(®, DPL::ToUTF8String(tizenAppId).c_str(), 0, NULL, 0) + == REG_NOMATCH) + { + regfree(®); + return false; + } + regfree(®); + return true; +} - getInstallerStruct().pkgmgrInterface->sendSignal( - PKGMGR_START_KEY, - PKGMGR_START_UPDATE); +bool JobWidgetInstall::validateTizenPackageID( + const WrtDB::TizenPkgId &tizenPkgId) +{ + std::string pkgId = DPL::ToUTF8String(tizenPkgId); - TizenAppId tzAppid = update.existingWidgetInfo.tzAppid; + std::string installPath = + std::string(GlobalConfig::GetUserInstalledWidgetPath()) + + "/" + pkgId; + std::string preinstallPath = + std::string(GlobalConfig::GetUserPreloadedWidgetPath()) + + "/" + pkgId; - LogInfo("Widget model exists. tizen app id: " << tzAppid); + struct stat dirStat; + if ((stat(installPath.c_str(), &dirStat) == 0) || + (stat(preinstallPath.c_str(), &dirStat) == 0)) + { + return false; + } + return true; +} - // Check running state - bool isRunning = false; - int retval = app_manager_is_running(DPL::ToUTF8String( - tzAppid).c_str(), &isRunning); - if (APP_MANAGER_ERROR_NONE != retval) { - LogError("Fail to get running state"); - return ConfigureResult::Failed; - } +ConfigureResult JobWidgetInstall::checkWidgetUpdate( + const WidgetUpdateInfo &update) +{ + LogInfo("incoming version = '" << update.incomingVersion); + LogInfo("Tizen AppID = " << update.tzAppId); - if (true == isRunning) { - // Must be deferred when update in progress - if (m_jobStruct.updateMode == WidgetUpdateMode::PolicyWac) { - LogInfo( - "Widget is already running. Policy is update according to WAC"); + if (update.existingVersion.IsNull() || update.incomingVersion.IsNull()) { + return ConfigureResult::Failed; + } - return ConfigureResult::Deferred; - } else { - LogInfo( - "Widget is already running. Policy is not update according to WAC"); + // Check running state + bool isRunning = false; + int ret = + app_manager_is_running(DPL::ToUTF8String(update.tzAppId).c_str(), + &isRunning); + if (APP_MANAGER_ERROR_NONE != ret) { + LogError("Fail to get running state"); + return ConfigureResult::Failed_WidgetRunning; + } - return ConfigureResult::Failed; - } + 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; } - m_installerContext.widgetConfig.tzAppid = tzAppid; - OptionalWidgetVersion existingVersion; - existingVersion = update.existingWidgetInfo.existingVersion; - OptionalWidgetVersion incomingVersion = update.incomingVersion; - - updateTypeCheckBit = CalcWidgetUpdatePolicy(existingVersion, - incomingVersion); - // Calc proceed flag - if ((m_jobStruct.updateMode & updateTypeCheckBit) > 0 || - m_jobStruct.updateMode == - WidgetUpdateMode::PolicyDirectoryForceInstall) - { - LogInfo("Whether widget policy allow proceed ok"); - return ConfigureResult::Updated; + // 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 { - return ConfigureResult::Failed; + 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; + } + LogInfo("terminate application"); } } - return ConfigureResult::Ok; + + 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"); + return ConfigureResult::Updated; + } else { + return ConfigureResult::Failed_LowerVersion; + } + + return ConfigureResult::Failed; } -WidgetUpdateMode::Type JobWidgetInstall::CalcWidgetUpdatePolicy( +bool JobWidgetInstall::isUpperVersion( const OptionalWidgetVersion &existingVersion, - const OptionalWidgetVersion &incomingVersion) const + const OptionalWidgetVersion &incomingVersion) { - // Widget is installed, check versions + LogInfo("Existing version = '" << *existingVersion); + LogInfo("Incoming version = '" << *incomingVersion); + if (!existingVersion && !incomingVersion) { - return WidgetUpdateMode::ExistingVersionEqual; + return false; } else if (!existingVersion && !!incomingVersion) { - return WidgetUpdateMode::ExistingVersionNewer; + return false; } else if (!!existingVersion && !incomingVersion) { - return WidgetUpdateMode::ExistingVersionOlder; + return true; } else { - LogInfo("Existing widget: version = '" << *existingVersion << "'"); - - if (!existingVersion->IsWac() && !incomingVersion->IsWac()) { - return WidgetUpdateMode::BothVersionsNotStd; - } else if (!existingVersion->IsWac()) { - return WidgetUpdateMode::ExistingVersionNotStd; - } else if (!incomingVersion->IsWac()) { - return WidgetUpdateMode::IncomingVersionNotStd; + if (!existingVersion->IsWac() || !incomingVersion->IsWac()) { + return false; } else { - // Both versions are WAC-comparable. Do compare. if (*incomingVersion == *existingVersion) { - return WidgetUpdateMode::ExistingVersionEqual; + return false; } else if (*incomingVersion > *existingVersion) { - return WidgetUpdateMode::ExistingVersionOlder; + return true; } else { - return WidgetUpdateMode::ExistingVersionNewer; + return false; } } } @@ -609,7 +684,8 @@ ConfigParserData JobWidgetInstall::getWidgetDataFromXML( const std::string &widgetSource, const std::string &tempPath, WrtDB::PackagingType pkgType, - bool isDRM) + bool isDRM, + bool isReinstall) { // Parse config ParserRunner parser; @@ -624,7 +700,23 @@ ConfigParserData JobWidgetInstall::getWidgetDataFromXML( DPL::FromUTF32String( L"widget")))); } else if (pkgType == PKG_TYPE_DIRECTORY_WEB_APP) { - parser.Parse(widgetSource + '/' + WITH_OSP_XML, + std::string configPath; + configPath = tempPath; + configPath += "/"; + configPath += WITH_OSP_XML; + + if (isReinstall) { + // checking RDS data directory + if (access(configPath.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; + } + } + parser.Parse(configPath, ElementParserPtr( new RootParser( configInfo, @@ -707,71 +799,29 @@ ConfigParserData JobWidgetInstall::getWidgetDataFromXML( WidgetUpdateInfo JobWidgetInstall::detectWidgetUpdate( const ConfigParserData &configInfo, - const WrtDB::WidgetType appType, const WrtDB::TizenAppId &tizenId) { LogInfo("Checking up widget package for config.xml..."); + OptionalWidgetVersion incomingVersion; - DPL::OptionalString widgetGUID; - OptionalWidgetVersion widgetVersion; - - // Check widget id - widgetGUID = configInfo.widget_id; - - if (widgetGUID.IsNull()) { - LogWarning("Installed widget has no GUID"); - return WidgetUpdateInfo(); - } - - LogDebug("Installed widget GUID: " << *widgetGUID); - - // Locate widget ID with this GUID - // Incoming widget version if (!configInfo.version.IsNull()) { - widgetVersion = + incomingVersion = DPL::Optional( WidgetVersion(*configInfo.version)); } - if (appType == APP_TYPE_WAC20) { - Try - { - // Search widget handle by GUID - WidgetDAOReadOnly dao(widgetGUID); - return WidgetUpdateInfo( - widgetGUID, - widgetVersion, - WidgetUpdateInfo::ExistingWidgetInfo( - dao.getTzAppId(), 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.getTzAppId(), dao.getVersion())); - } - Catch(WidgetDAOReadOnly::Exception::WidgetNotExist) - { - // GUID isn't installed - return WidgetUpdateInfo( - widgetGUID, - widgetVersion, - WidgetUpdateInfo::ExistingWidgetInfo()); - } + WidgetDAOReadOnly dao(tizenId); + + OptionalWidgetVersion optVersion; + DPL::OptionalString version = dao.getVersion(); + if (!version.IsNull()) { + optVersion = OptionalWidgetVersion(WidgetVersion(*version)); } + + return WidgetUpdateInfo( + dao.getTzAppId(), + optVersion, + incomingVersion); } void JobWidgetInstall::SendProgress() @@ -815,10 +865,10 @@ void JobWidgetInstall::SendFinishedSuccess() sync(); if (INSTALL_LOCATION_TYPE_EXTERNAL == m_installerContext.locationType) { - if (false == m_installerContext.existingWidgetInfo.isExist) { - WidgetInstallToExtSingleton::Instance().postInstallation(true); - } else { + if (m_installerContext.isUpdateMode) { WidgetInstallToExtSingleton::Instance().postUpgrade(true); + } else { + WidgetInstallToExtSingleton::Instance().postInstallation(true); } WidgetInstallToExtSingleton::Instance().deinitialize(); } @@ -839,7 +889,7 @@ void JobWidgetInstall::SendFinishedSuccess() LogDebug("Call widget install successfinishedCallback"); getInstallerStruct().finishedCallback(getInstallerStruct().userParam, DPL::ToUTF8String( - tizenId), Exceptions::Success); + tizenId), Jobs::Exceptions::Success); } void JobWidgetInstall::SendFinishedFailure() @@ -848,14 +898,20 @@ void JobWidgetInstall::SendFinishedFailure() // remove widget install information file unlink(m_installerContext.installInfo.c_str()); - LogError("Error in installation step: " << m_exceptionCaught); + LogError("Error number: " << m_exceptionCaught); LogError("Message: " << m_exceptionMessage); TizenAppId & tizenId = m_installerContext.widgetConfig.tzAppid; LogDebug("Call widget install failure finishedCallback"); + std::stringstream errorNum; + errorNum << m_exceptionCaught; // send signal of pkgmgr getInstallerStruct().pkgmgrInterface->sendSignal( + PKGMGR_ERROR, + errorNum.str()); + + getInstallerStruct().pkgmgrInterface->sendSignal( PKGMGR_END_KEY, PKGMGR_END_FAILURE); @@ -866,7 +922,7 @@ void JobWidgetInstall::SendFinishedFailure() void JobWidgetInstall::SaveExceptionData(const Jobs::JobExceptionBase &e) { - m_exceptionCaught = static_cast(e.getParam()); + m_exceptionCaught = static_cast(e.getParam()); m_exceptionMessage = e.GetMessage(); } @@ -897,7 +953,6 @@ void JobWidgetInstall::displayWidgetInfo() localizedInfo.description; out << std::endl << "Widget Id: " << dao.getGUID(); out << std::endl << "Widget recognized: " << dao.isRecognized(); - out << std::endl << "Widget wac signed: " << dao.isWacSigned(); out << std::endl << "Widget distributor signed: " << dao.isDistributorSigned(); out << std::endl << "Widget trusted: " << dao.isTrusted(); @@ -925,8 +980,6 @@ void JobWidgetInstall::displayWidgetInfo() FOREACH(it, list) { out << std::endl << " Name: " << it->name; - out << std::endl << " Required: " << it->required; - out << std::endl << " Params:"; } } @@ -940,8 +993,8 @@ WrtDB::PackagingType JobWidgetInstall::checkPackageType( const std::string &tempPath) { // Check installation type (direcotory/ or config.xml or widget.wgt) - if (WidgetUpdateMode::PolicyDirectoryForceInstall == - m_jobStruct.updateMode) + 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; @@ -1078,7 +1131,7 @@ void JobWidgetInstall::setInstallLocationType( { m_installerContext.locationType = INSTALL_LOCATION_TYPE_NOMAL; - if (true == m_jobStruct.m_preload) { + if (m_jobStruct.m_installMode == InstallMode::INSTALL_MODE_PRELOAD) { m_installerContext.locationType = INSTALL_LOCATION_TYPE_PRELOAD; } else { @@ -1096,54 +1149,17 @@ void JobWidgetInstall::setInstallLocationType( } } -bool JobWidgetInstall::isDRMWidget(std::string widgetPath) +bool JobWidgetInstall::isDRMWidget(std::string /*widgetPath*/) { - /* TODO : - * drm_bool_type_e is_drm_file = DRM_UNKNOWN; - * int ret = -1; - * - * ret = drm_is_drm_file(widgetPath.c_str(), &is_drm_file); - * if(DRM_RETURN_SUCCESS == ret && DRM_TRUE == is_drm_file) { - */ - - /* blow code temporary code for drm. */ - int ret = drm_oem_intel_isDrmFile(const_cast(widgetPath.c_str())); - if (1 == ret) { - return true; - } else { - return false; - } + /* TODO */ + return false; } -bool JobWidgetInstall::DecryptDRMWidget(std::string widgetPath, - std::string destPath) +bool JobWidgetInstall::DecryptDRMWidget(std::string /*widgetPath*/, + std::string /*destPath*/) { - /* TODO : - * drm_trusted_sapps_decrypt_package_info_s package_info; - * - * strncpy(package_info.sadcf_filepath, widgetPath.c_str(), - * sizeof(package_info.sadcf_filepath)); - * strncpy(package_info.decrypt_filepath, destPath.c_str(), - * sizeof(package_info.decrypt_filepath)); - * - * drm_trusted_request_type_e requestType = - * DRM_TRUSTED_REQ_TYPE_SAPPS_DECRYPT_PACKAGE; - * - * int ret = drm_trusted_handle_request(requestType, - * (void *)&package_info, NULL); - * if (DRM_TRUSTED_RETURN_SUCCESS == ret) { - * return true; - * } else { - * return false; - * } - */ - if (drm_oem_intel_decrypt_package(const_cast(widgetPath.c_str()), - const_cast(destPath.c_str())) != 0) - { - return true; - } else { - return false; - } + /* TODO */ + return false; } } //namespace WidgetInstall } //namespace Jobs