From 0b3c503a2f496bd30b1d7b27872ca1c73780e4fb Mon Sep 17 00:00:00 2001 From: Soyoung Kim Date: Fri, 13 Sep 2013 22:38:53 +0900 Subject: [PATCH] Add send signal if there is not enough memory during web app installation [Issue#] WGL-299 [Problem] Unable to get low memory popup when installing widgets. [Cause] There is no way to send out of memory signal to package manager. [Solution] 1. Add step to check condition of low memory before unzip. 2. Add to send signal low memory if there aren't enough memory. [SCMRequest] Depends on https://review.tizendev.org/gerrit/#/c/90132/ [Verification] Check the steps described in http://goo.gl/mgATi1 Change-Id: I57ee5dc4d981a6ecdc54759fd7bdb0ee36e87935 --- src/jobs/widget_install/job_widget_install.cpp | 2 ++ src/jobs/widget_install/job_widget_install.h | 1 + src/jobs/widget_install/task_manifest_file.cpp | 2 +- src/jobs/widget_install/widget_install_errors.h | 2 +- src/jobs/widget_install/widget_unzip.cpp | 24 ++++++++++++++++++++++++ src/jobs/widget_install/widget_unzip.h | 2 +- src/logic/installer_controller.cpp | 5 +++-- src/logic/installer_controller.h | 3 ++- src/logic/installer_logic.cpp | 5 ++--- src/logic/installer_logic.h | 1 + src/wrt-installer/wrt-installer.cpp | 8 ++++++-- src/wrt-installer/wrt_installer_api.cpp | 3 ++- src/wrt-installer/wrt_installer_api.h | 1 + 13 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/jobs/widget_install/job_widget_install.cpp b/src/jobs/widget_install/job_widget_install.cpp index bd43f8d..f7ca2e4 100644 --- a/src/jobs/widget_install/job_widget_install.cpp +++ b/src/jobs/widget_install/job_widget_install.cpp @@ -70,6 +70,7 @@ namespace WidgetInstall { JobWidgetInstall::JobWidgetInstall( std::string const &widgetPath, + std::string const &tzPkgId, const Jobs::WidgetInstall::WidgetInstallationStruct & installerStruct) : Job(UnknownInstallation), @@ -78,6 +79,7 @@ JobWidgetInstall::JobWidgetInstall( { m_installerContext.mode = m_jobStruct.m_installMode; m_installerContext.requestedPath = widgetPath; + m_jobStruct.pkgmgrInterface->setPkgname(tzPkgId); //start configuration of installation AddTask(new TaskConfiguration(m_installerContext)); diff --git a/src/jobs/widget_install/job_widget_install.h b/src/jobs/widget_install/job_widget_install.h index dd68dca..a87337d 100644 --- a/src/jobs/widget_install/job_widget_install.h +++ b/src/jobs/widget_install/job_widget_install.h @@ -54,6 +54,7 @@ class JobWidgetInstall : * @brief Automaticaly sets installation process */ JobWidgetInstall(std::string const & widgetPath, + std::string const &tzPkgId, const Jobs::WidgetInstall::WidgetInstallationStruct &installerStruct); //overrides diff --git a/src/jobs/widget_install/task_manifest_file.cpp b/src/jobs/widget_install/task_manifest_file.cpp index c61645b..12f19bf 100755 --- a/src/jobs/widget_install/task_manifest_file.cpp +++ b/src/jobs/widget_install/task_manifest_file.cpp @@ -1102,7 +1102,7 @@ void TaskManifestFile::setLiveBoxInfo(Manifest& manifest) } FOREACH(it, liveboxList) { - LogDebug("setLiveBoxInfo"); + _D("setLiveBoxInfo"); LiveBoxInfo liveBox; DPL::Optional ConfigInfo = *it; DPL::String appid = m_context.widgetConfig.tzAppid; diff --git a/src/jobs/widget_install/widget_install_errors.h b/src/jobs/widget_install/widget_install_errors.h index 75a97bb..ed0e6fb 100644 --- a/src/jobs/widget_install/widget_install_errors.h +++ b/src/jobs/widget_install/widget_install_errors.h @@ -92,7 +92,7 @@ DECLARE_JOB_EXCEPTION(Base, InstallOspsvcFailed, ErrorInstallOspServcie) DECLARE_JOB_EXCEPTION(Base, PrivilegeLevelViolation, ErrorPrivilegeLevelViolation) DECLARE_JOB_EXCEPTION(Base, NotSupportRDSUpdate, ErrorNotSupportRDSUpdate) DECLARE_JOB_EXCEPTION(Base, SmackTransactionFailed, ErrorFatalError) - +DECLARE_JOB_EXCEPTION(Base, OutOfStorageFailed, ErrorOutOfStorage) } //namespace } //namespace } //namespace diff --git a/src/jobs/widget_install/widget_unzip.cpp b/src/jobs/widget_install/widget_unzip.cpp index 8a7f601..d744b21 100644 --- a/src/jobs/widget_install/widget_unzip.cpp +++ b/src/jobs/widget_install/widget_unzip.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -36,6 +37,7 @@ using namespace WrtDB; namespace { const char *const DRM_LIB_PATH = "/usr/lib/libdrm-service-core-tizen.so"; +const size_t SPACE_SIZE = 1024 * 1024; struct PathAndFilePair { @@ -272,6 +274,8 @@ void WidgetUnzip::unzipWgtFile(const std::string &source, const std::string &des ThrowMsg(Exceptions::ZipEmpty, wgtFile); } + checkAvailableSpace(destination); + // Set iterator to first file m_zipIterator = m_zip->begin(); @@ -297,5 +301,25 @@ void WidgetUnzip::unzipWgtFile(const std::string &source, const std::string &des } } +void WidgetUnzip::checkAvailableSpace(const std::string &destination) +{ + _D("checkAvailableSpace ... "); + + double unCompressedSize = m_zip->GetTotalUncompressedSize(); + _D("unCompressedSize : %ld", unCompressedSize); + + struct statvfs vfs; + if (-1 == statvfs(destination.c_str(), &vfs)) { + ThrowMsg(Exceptions::OutOfStorageFailed, "There is no space for installation"); + } + + double freeSize = (double)vfs.f_bsize * vfs.f_bavail; + _D("Space Size : %ld", freeSize); + + if (unCompressedSize + SPACE_SIZE >= freeSize) { + ThrowMsg(Exceptions::OutOfStorageFailed, "There is no space for installation"); + } +} + } //namespace WidgetInstall } //namespace Jobs diff --git a/src/jobs/widget_install/widget_unzip.h b/src/jobs/widget_install/widget_unzip.h index 25e1293..f9c0d6d 100644 --- a/src/jobs/widget_install/widget_unzip.h +++ b/src/jobs/widget_install/widget_unzip.h @@ -45,7 +45,7 @@ class WidgetUnzip bool decryptDRMPackage(const std::string &source, const std::string &decryptedSource); std::string getDecryptedPackage(const std::string &source); - + void checkAvailableSpace(const std::string &destination); }; } //namespace WidgetInstall diff --git a/src/logic/installer_controller.cpp b/src/logic/installer_controller.cpp index 658ed20..d9b41d5 100644 --- a/src/logic/installer_controller.cpp +++ b/src/logic/installer_controller.cpp @@ -26,8 +26,9 @@ void InstallerController::OnEventReceived( const InstallerControllerEvents::InstallWidgetEvent &event) { std::string fileName = event.GetArg0(); - Jobs::WidgetInstall::WidgetInstallationStruct installerStruct = event.GetArg1(); - m_installerLogic.InstallWidget(fileName, installerStruct); + std::string pkgId = event.GetArg1(); + Jobs::WidgetInstall::WidgetInstallationStruct installerStruct = event.GetArg2(); + m_installerLogic.InstallWidget(fileName, pkgId, installerStruct); } void InstallerController::OnEventReceived( diff --git a/src/logic/installer_controller.h b/src/logic/installer_controller.h index 61093c2..9f04288 100644 --- a/src/logic/installer_controller.h +++ b/src/logic/installer_controller.h @@ -37,8 +37,9 @@ namespace InstallerControllerEvents { * * This event holds std::string witch should be path to widget package */ -DECLARE_GENERIC_EVENT_2(InstallWidgetEvent, +DECLARE_GENERIC_EVENT_3(InstallWidgetEvent, std::string, // zipFileName + std::string, // package id Jobs::WidgetInstall::WidgetInstallationStruct) // installerStruct /** diff --git a/src/logic/installer_logic.cpp b/src/logic/installer_logic.cpp index 8dea334..df67764 100644 --- a/src/logic/installer_logic.cpp +++ b/src/logic/installer_logic.cpp @@ -69,6 +69,7 @@ Jobs::JobHandle InstallerLogic::AddAndStartJob() // But each Job has different constructor, so creating new Job is specific Jobs::JobHandle InstallerLogic::InstallWidget( const std::string & widgetPath, + const std::string & pkgId, const Jobs::WidgetInstall::WidgetInstallationStruct & installerStruct) { @@ -80,9 +81,7 @@ Jobs::JobHandle InstallerLogic::InstallWidget( _D("New Widget Installation:"); - m_job = - new Jobs::WidgetInstall::JobWidgetInstall(widgetPath, installerStruct); - + m_job = new Jobs::WidgetInstall::JobWidgetInstall(widgetPath, pkgId, installerStruct); return AddAndStartJob(); } diff --git a/src/logic/installer_logic.h b/src/logic/installer_logic.h index 4bb4258..abe1b5c 100644 --- a/src/logic/installer_logic.h +++ b/src/logic/installer_logic.h @@ -49,6 +49,7 @@ class InstallerLogic Jobs::JobHandle InstallWidget( const std::string & widgetPath, + const std::string & pkgId, const Jobs::WidgetInstall::WidgetInstallationStruct & installerStruct); diff --git a/src/wrt-installer/wrt-installer.cpp b/src/wrt-installer/wrt-installer.cpp index 8c41ef1..827e216 100644 --- a/src/wrt-installer/wrt-installer.cpp +++ b/src/wrt-installer/wrt-installer.cpp @@ -279,6 +279,10 @@ void WrtInstaller::OnCreate() switch (reqType) { case PackageManager::PkgmgrSignal::RequestType::INSTALL: m_packagePath = m_argv[4]; + if (6 < m_argc) { + m_name = std::string(m_argv[6]); + } + struct stat info; if (-1 != stat(m_argv[4], &info) && S_ISDIR(info.st_mode)) { _D("Installing package directly from directory"); @@ -451,7 +455,7 @@ void WrtInstaller::installStep() m_packagePath.c_str())); wrt_install_widget(packagePath ? packagePath.get() : m_packagePath.c_str(), - this, &staticWrtStatusCallback, + m_name.c_str(), this, &staticWrtStatusCallback, (m_installByPkgmgr) ? &staticWrtInstallProgressCallback : NULL, m_installMode, @@ -704,7 +708,7 @@ void WrtInstaller::staticWrtInitializeToPreloadCallback(std::string tizenId, Wrt std::string(WrtDB::GlobalConfig::GetUserPreloadedWidgetPath()) + "/" + This->m_name; - wrt_install_widget(packagePath.c_str(), + wrt_install_widget(packagePath.c_str(), NULL, This, &staticWrtInitPreloadStatusCallback, NULL, mode, diff --git a/src/wrt-installer/wrt_installer_api.cpp b/src/wrt-installer/wrt_installer_api.cpp index 752f676..ba1ee19 100644 --- a/src/wrt-installer/wrt_installer_api.cpp +++ b/src/wrt-installer/wrt_installer_api.cpp @@ -160,6 +160,7 @@ void wrt_installer_shutdown() void wrt_install_widget( const char *path, + const char *tzPkgId, void* userdata, WrtInstallerStatusCallback status_cb, WrtProgressCallback progress_cb, @@ -182,7 +183,7 @@ void wrt_install_widget( CONTROLLER_POST_EVENT( Logic::InstallerController, InstallerControllerEvents::InstallWidgetEvent( - path, Jobs::WidgetInstall::WidgetInstallationStruct( + path, tzPkgId, Jobs::WidgetInstall::WidgetInstallationStruct( InstallerCallbacksTranslate::installFinishedCallback, InstallerCallbacksTranslate::installProgressCallback, new InstallerCallbacksTranslate::StatusCallbackStruct( diff --git a/src/wrt-installer/wrt_installer_api.h b/src/wrt-installer/wrt_installer_api.h index 694c9d1..eb2be3c 100644 --- a/src/wrt-installer/wrt_installer_api.h +++ b/src/wrt-installer/wrt_installer_api.h @@ -48,6 +48,7 @@ void wrt_installer_init( void wrt_installer_shutdown(void); void wrt_install_widget( const char *path, + const char *tzPkgId, void *user_parameter, WrtInstallerStatusCallback status_callback, WrtProgressCallback progress_callback, -- 2.7.4