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