From 548226d7951d5a3435ab4ad4c1f4e7a1aeac3b8d Mon Sep 17 00:00:00 2001 From: Pawel Andruszkiewicz Date: Fri, 26 Jun 2015 11:01:50 +0200 Subject: [PATCH] [Package] Obtain total size and data size on demand. These are time consuming operations, should not be executed unless user explicitly asks for this data Related issue: http://168.219.209.56/jira/browse/TNEF-2498 [Verification] TCT pass rate: 66/66/0/0/0. Change-Id: I3c45a8f81f1406b36599f0709e91de5c1dcb99a2 Signed-off-by: Pawel Andruszkiewicz --- src/package/package_api.js | 64 +++++++++++++++++++-------- src/package/package_info_provider.cc | 65 +++++++++++++++++----------- src/package/package_info_provider.h | 3 ++ src/package/package_instance.cc | 35 +++++++++++++++ src/package/package_instance.h | 4 ++ 5 files changed, 128 insertions(+), 43 deletions(-) diff --git a/src/package/package_api.js b/src/package/package_api.js index 0bd248f3..58e49b44 100644 --- a/src/package/package_api.js +++ b/src/package/package_api.js @@ -56,7 +56,7 @@ function callNative(cmd, args) { } if (result['status'] == 'success') { - if (result['result']) { + if (undefined !== result['result']) { return result['result']; } return true; @@ -90,18 +90,48 @@ function SetReadOnlyProperty(obj, n, v) { function PackageInformation(obj) { var lastModified = obj.lastModified; obj.lastModified = new Date(lastModified); - SetReadOnlyProperty(obj, 'id'); // read only property - SetReadOnlyProperty(obj, 'name'); // read only property - SetReadOnlyProperty(obj, 'iconPath'); // read only property - SetReadOnlyProperty(obj, 'version'); // read only property - SetReadOnlyProperty(obj, 'totalSize'); // read only property - SetReadOnlyProperty(obj, 'dataSize'); // read only property - SetReadOnlyProperty(obj, 'lastModified'); // read only property - SetReadOnlyProperty(obj, 'author'); // read only property - SetReadOnlyProperty(obj, 'description'); // read only property - SetReadOnlyProperty(obj, 'appIds'); // read only property - - return obj; + + SetReadOnlyProperty(this, 'id', obj.id); // read only property + SetReadOnlyProperty(this, 'name', obj.name); // read only property + SetReadOnlyProperty(this, 'iconPath', obj.iconPath); // read only property + SetReadOnlyProperty(this, 'version', obj.version); // read only property + SetReadOnlyProperty(this, 'lastModified', obj.lastModified); // read only property + SetReadOnlyProperty(this, 'author', obj.author); // read only property + SetReadOnlyProperty(this, 'description', obj.description); // read only property + SetReadOnlyProperty(this, 'appIds', obj.appIds); // read only property + + var totalSize; + var dataSize; + + Object.defineProperty(this, 'totalSize', { + enumerable: true, + set: function() {}, + get: function() { + if (undefined === totalSize) { + try { + totalSize = callNative('PackageManager_getTotalSize', {id: this.id}); + } catch (e) { + totalSize = -1; + } + } + return totalSize; + } + }); + + Object.defineProperty(this, 'dataSize', { + enumerable: true, + set: function() {}, + get: function() { + if (undefined === dataSize) { + try { + dataSize = callNative('PackageManager_getDataSize', {id: this.id}); + } catch (e) { + dataSize = -1; + } + } + return dataSize; + } + }); } function PackageManager() { @@ -210,7 +240,7 @@ PackageManager.prototype.getPackagesInfo = function(successCallback, errorCallba function(result) { if (result.status == 'success') { for (var i = 0; i < result.informationArray.length; i++) { - result.informationArray[i] = PackageInformation(result.informationArray[i]); + result.informationArray[i] = new PackageInformation(result.informationArray[i]); } args.successCallback(result.informationArray); } else if (result.status == 'error') { @@ -244,7 +274,7 @@ PackageManager.prototype.getPackageInfo = function() { try { var syncResult = callNative('PackageManager_getPackageInfo', nativeParam); - return PackageInformation(syncResult); + return new PackageInformation(syncResult); } catch (e) { throw e; } @@ -270,9 +300,9 @@ PackageManager.prototype.setPackageInfoEventListener = function(eventCallback) { nativeParam, function(result) { if (result.status == 'installed') { - args.eventCallback.oninstalled(PackageInformation(result.info)); + args.eventCallback.oninstalled(new PackageInformation(result.info)); } else if (result.status == 'updated') { - args.eventCallback.onupdated(PackageInformation(result.info)); + args.eventCallback.onupdated(new PackageInformation(result.info)); } else if (result.status == 'uninstalled') { args.eventCallback.onuninstalled(result.id); } diff --git a/src/package/package_info_provider.cc b/src/package/package_info_provider.cc index 0c829d42..557293e1 100644 --- a/src/package/package_info_provider.cc +++ b/src/package/package_info_provider.cc @@ -27,6 +27,7 @@ #include #include "common/logger.h" +#include "common/tools.h" namespace extension { namespace package { @@ -34,6 +35,11 @@ namespace package { using common::UnknownException; using common::NotFoundException; +using common::ErrorCode; +using common::PlatformResult; +using common::tools::ReportError; +using common::tools::ReportSuccess; + #define REPORT_ERROR(out, exception) \ out["status"] = picojson::value("error"); \ out["error"] = exception.ToJSON(); @@ -212,32 +218,6 @@ bool PackageInfoProvider:: ConvertToPackageToObject( return false; } - pkgmgr_client *pc = pkgmgr_client_new(PC_REQUEST); - if ( pc == NULL ) { - LoggerE("Fail to create pkgmgr client"); - return false; - } else { - int ret = pkgmgr_client_request_service(PM_REQUEST_GET_SIZE, - PM_GET_TOTAL_SIZE, pc, NULL, id, NULL, NULL, NULL); - if ( ret < 0 ) { - LoggerE("Fail to get total size"); - return false; - } else { - LoggerD("totalSize: [%d]", ret); - out["totalSize"] = picojson::value(static_cast(ret)); - } - - ret = pkgmgr_client_request_service(PM_REQUEST_GET_SIZE, PM_GET_DATA_SIZE, - pc, NULL, id, NULL, NULL, NULL); - if ( ret < 0 ) { - LoggerE("Fail to get data size"); - return false; - } else { - LoggerD("dataSize: [%d]", ret); - out["dataSize"] = picojson::value(static_cast(ret)); - } - } - picojson::array array_data; ret = package_info_foreach_app_from_package(package_info, PACKAGE_INFO_ALLAPP, PackageAppInfoCb, &array_data); @@ -255,6 +235,39 @@ bool PackageInfoProvider:: ConvertToPackageToObject( return true; } +namespace { + +void GetSize(const std::string& id, int service_mode, picojson::object* out) { + LoggerD("Enter"); + pkgmgr_client* pc = pkgmgr_client_new(PC_REQUEST); + int size = pkgmgr_client_request_service(PM_REQUEST_GET_SIZE, service_mode, + pc, + NULL, + id.c_str(), NULL, NULL, NULL); + pkgmgr_client_free(pc); + + if (size < 0) { + ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to get size"), + out); + } else { + ReportSuccess(picojson::value(static_cast(size)), *out); + } +} + +} // namespace + +void PackageInfoProvider::GetTotalSize(const std::string& id, + picojson::object* out) { + LoggerD("Enter"); + GetSize(id, PM_GET_TOTAL_SIZE, out); +} + +void PackageInfoProvider::GetDataSize(const std::string& id, + picojson::object* out) { + LoggerD("Enter"); + GetSize(id, PM_GET_DATA_SIZE, out); +} + bool PackageInfoProvider::GetCurrentPackageId( char** package_id) { LoggerD("Enter"); diff --git a/src/package/package_info_provider.h b/src/package/package_info_provider.h index 1e28e410..e08cfee3 100644 --- a/src/package/package_info_provider.h +++ b/src/package/package_info_provider.h @@ -52,6 +52,9 @@ class PackageInfoProvider { static bool ConvertToPackageToObject( const pkgmgrinfo_pkginfo_h info, picojson::object& out); + static void GetTotalSize(const std::string& id, picojson::object* out); + static void GetDataSize(const std::string& id, picojson::object* out); + private: static bool GetCurrentPackageId(char** package_id); }; diff --git a/src/package/package_instance.cc b/src/package/package_instance.cc index 9cdc5b16..d4a23c7c 100644 --- a/src/package/package_instance.cc +++ b/src/package/package_instance.cc @@ -34,6 +34,9 @@ using common::NotFoundException; using common::TypeMismatchException; using common::SecurityException; +using common::ErrorCode; +using common::PlatformResult; + typedef enum _PackageThreadWorkType { PackageThreadWorkNone = 0, PackageThreadWorkGetPackagesInfo, @@ -246,6 +249,10 @@ PackageInstance::PackageInstance() { PackageManagerUnsetpackageinfoeventlistener); REGISTER_SYNC("PackageManager_getPackageInfo", PackageManagerGetpackageinfo); + REGISTER_SYNC("PackageManager_getTotalSize", + PackageManagerGetTotalSize); + REGISTER_SYNC("PackageManager_getDataSize", + PackageManagerGetDataSize); #undef REGISTER_SYNC } @@ -394,6 +401,34 @@ void PackageInstance::PackageManagerGetpackageinfo( } } +void PackageInstance::PackageManagerGetTotalSize(const picojson::value& args, + picojson::object& out) { + LoggerD("Enter"); + + const auto& id = args.get("id"); + + if (id.is()) { + PackageInfoProvider::GetTotalSize(id.get(), &out); + } else { + ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Missing id parameter"), + &out); + } +} + +void PackageInstance::PackageManagerGetDataSize(const picojson::value& args, + picojson::object& out) { + LoggerD("Enter"); + + const auto& id = args.get("id"); + + if (id.is()) { + PackageInfoProvider::GetDataSize(id.get(), &out); + } else { + ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Missing id parameter"), + &out); + } +} + void PackageInstance::InvokeListener(picojson::object& param) { LoggerD("Enter"); picojson::value result = picojson::value(param); diff --git a/src/package/package_instance.h b/src/package/package_instance.h index c1c2426c..2d22d81f 100644 --- a/src/package/package_instance.h +++ b/src/package/package_instance.h @@ -54,6 +54,10 @@ class PackageInstance : public common::ParsedInstance { (const picojson::value& args, picojson::object& out); void PackageManagerGetpackageinfo (const picojson::value& args, picojson::object& out); + void PackageManagerGetTotalSize(const picojson::value& args, + picojson::object& out); + void PackageManagerGetDataSize(const picojson::value& args, + picojson::object& out); void PackageManagerSetpackageinfoeventlistener (const picojson::value& args, picojson::object& out); void PackageManagerUnsetpackageinfoeventlistener -- 2.34.1