From 7a182e91c2ce7bbc7b325ddddee182f2b2909482 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: I77f468427312909a48f0989bd08ee5d6532b7571 --- src/jobs/widget_install/job_widget_install.cpp | 1 + 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 | 1 + 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 | 6 ++++-- src/wrt-installer/wrt_installer_api.cpp | 3 ++- src/wrt-installer/wrt_installer_api.h | 1 + 13 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/jobs/widget_install/job_widget_install.cpp b/src/jobs/widget_install/job_widget_install.cpp index 55ab2c0..72b1052 100644 --- a/src/jobs/widget_install/job_widget_install.cpp +++ b/src/jobs/widget_install/job_widget_install.cpp @@ -69,6 +69,7 @@ namespace WidgetInstall { JobWidgetInstall::JobWidgetInstall( std::string const &widgetPath, + std::string const &tzPkgId, const Jobs::WidgetInstall::WidgetInstallationStruct & installerStruct) : Job(UnknownInstallation), 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 47898ff..48562eb 100755 --- a/src/jobs/widget_install/task_manifest_file.cpp +++ b/src/jobs/widget_install/task_manifest_file.cpp @@ -1082,7 +1082,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 473d9cb..31a46cc 100644 --- a/src/jobs/widget_install/widget_install_errors.h +++ b/src/jobs/widget_install/widget_install_errors.h @@ -91,6 +91,7 @@ DECLARE_JOB_EXCEPTION(Base, EncryptionFailed, ErrorEncryptionFailed) DECLARE_JOB_EXCEPTION(Base, InstallOspsvcFailed, ErrorInstallOspServcie) DECLARE_JOB_EXCEPTION(Base, PrivilegeLevelViolation, ErrorPrivilegeLevelViolation) DECLARE_JOB_EXCEPTION(Base, NotSupportRDSUpdate, ErrorNotSupportRDSUpdate) +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 d41b890..06a1d88 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 { @@ -286,6 +288,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(); @@ -311,5 +315,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..5cfda82 100644 --- a/src/wrt-installer/wrt-installer.cpp +++ b/src/wrt-installer/wrt-installer.cpp @@ -279,6 +279,8 @@ void WrtInstaller::OnCreate() switch (reqType) { case PackageManager::PkgmgrSignal::RequestType::INSTALL: m_packagePath = m_argv[4]; + m_name = 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 +453,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 +706,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