From 06d5c3701b54a01d528cc9855d571601a3534577 Mon Sep 17 00:00:00 2001 From: Lukasz Bardeli Date: Tue, 20 Feb 2018 09:54:28 +0100 Subject: [PATCH] [Package] refactor module Remove setMessageListener from package_api.js and start using from utils_api.js [Verification] Code compiles without error. TCT passrate 100% Change-Id: I5e5f96a4a836dd85e11c3989233092407d681d28 --- src/package/package_api.js | 364 +++++++++++++------------------- src/package/package_instance.cc | 50 +++-- src/package/package_instance.h | 3 +- 3 files changed, 183 insertions(+), 234 deletions(-) diff --git a/src/package/package_api.js b/src/package/package_api.js index fcc9fc47..ce00dbab 100644 --- a/src/package/package_api.js +++ b/src/package/package_api.js @@ -14,73 +14,46 @@ * limitations under the License. */ -var JSON_ = xwalk.JSON; var validator_ = xwalk.utils.validator; var types_ = validator_.Types; - +var native_ = new xwalk.utils.NativeManager(extension); var callbackId = 0; var callbacks = {}; -var infoEventListenerId = -1; - -function invokeListener(result) { - if (result.listener === 'infoEvent') { - var listener = callbacks[infoEventListenerId]; - listener(result); +var listener; +var PACKAGE_INFO_LISTENER_ID = 'PackageInfoListener'; +var PACKAGE_PROGRESS_LISTENER_ID = 'PackageProgressListener_'; + +function PackageInfoChangeCallback(result) { + if (result.status == 'installed') { + listener.oninstalled(new PackageInformation(result.info)); + } else if (result.status == 'updated') { + listener.onupdated(new PackageInformation(result.info)); + } else if (result.status == 'uninstalled') { + listener.onuninstalled(result.id); } } -extension.setMessageListener(function(json) { - var result = JSON_.parse(json); - - if (result.hasOwnProperty('listener')) { - setTimeout(function() { - invokeListener(result); - }, 0); - } else { - var callback = callbacks[result['callbackId']]; - setTimeout(function() { - callback(result); - }, 0); - } -}); - -function nextCallbackId() { - return callbackId++; -} - -function callNative(cmd, args) { - var json = {'cmd': cmd, 'args': args}; - var argjson = JSON_.stringify(json); - var resultString = extension.internal.sendSyncMessage(argjson); - var result = JSON_.parse(resultString); - - if (typeof result !== 'object') { - throw new WebAPIException(WebAPIException.UNKNOWN_ERR); - } - - if (result['status'] == 'success') { - if (undefined !== result['result']) { - return result['result']; - } - return true; - } else if (result['status'] == 'error') { +function PackageProgressCallback(result) { + if (result.status == 'progress') { + callbacks[result['progressCallbackId']].progressCallback.onprogress( + result.id, result.progress); + } else if (result.status == 'complete') { + callbacks[result['progressCallbackId']].progressCallback.oncomplete(result.id); + delete callbacks[result['progressCallbackId']]; + native_.removeListener(PACKAGE_PROGRESS_LISTENER_ID + result['progressCallbackId']); + } else if (result.status == 'error') { var err = result['error']; if (err) { - throw new WebAPIException(err); + callbacks[result['progressCallbackId']].errorCallback(new WebAPIException(err)); + delete callbacks[result['progressCallbackId']]; + native_.removeListener(PACKAGE_PROGRESS_LISTENER_ID + result['progressCallbackId']); } - return false; } } -function callNativeWithCallback(cmd, args, callback) { - if (callback) { - var id = nextCallbackId(); - args['callbackId'] = id; - callbacks[id] = callback; - } - - return callNative(cmd, args); +function nextCallbackId() { + return callbackId++; } function SetReadOnlyProperty(obj, n, v) { @@ -88,21 +61,22 @@ function SetReadOnlyProperty(obj, n, v) { Object.defineProperty( obj, n, {value: v, writable: false, enumerable: true, configurable: true}); else - Object.defineProperty(obj, n, {writable: false, enumerable: true, configurable: true}); + Object.defineProperty( + obj, n, {writable: false, enumerable: true, configurable: true}); } function PackageInformation(obj) { var lastModified = obj.lastModified; obj.lastModified = new Date(lastModified); - 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 + 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; @@ -112,9 +86,10 @@ function PackageInformation(obj) { set: function() {}, get: function() { if (undefined === totalSize) { - try { - totalSize = callNative('PackageManager_getTotalSize', {id: this.id}); - } catch (e) { + var result = native_.callSync('PackageManager_getTotalSize', {id: this.id}); + if (native_.isSuccess(result)) { + totalSize = native_.getResultObject(result); + } else { totalSize = -1; } } @@ -127,9 +102,10 @@ function PackageInformation(obj) { set: function() {}, get: function() { if (undefined === dataSize) { - try { - dataSize = callNative('PackageManager_getDataSize', {id: this.id}); - } catch (e) { + var result = native_.callSync('PackageManager_getDataSize', {id: this.id}); + if (native_.isSuccess(result)) { + dataSize = native_.getResultObject(result); + } else { dataSize = -1; } } @@ -144,45 +120,41 @@ function PackageManager() { var PackageManagerInstall = function() { var args = validator_.validateArgs(arguments, [ - {'name' : 'packageFileURI', 'type' : types_.STRING}, - {'name' : 'progressCallback', - 'type' : types_.LISTENER, - 'values' : ['onprogress', 'oncomplete']}, - {'name' : 'errorCallback', 'type' : types_.FUNCTION, 'optional' : true, 'nullable' : true} + {'name': 'packageFileURI', 'type': types_.STRING}, { + 'name': 'progressCallback', + 'type': types_.LISTENER, + 'values': ['onprogress', 'oncomplete'] + }, + { + 'name': 'errorCallback', + 'type': types_.FUNCTION, + 'optional': true, + 'nullable': true + } ]); + var progressCallbackId = nextCallbackId(); + callbacks[progressCallbackId] = args; + var nativeParam = { - 'packageFileURI': args.packageFileURI + 'packageFileURI': args.packageFileURI, + 'progressCallbackId': progressCallbackId }; - try { - var syncResult = callNativeWithCallback( - 'PackageManager_install', - nativeParam, - function(result) { - if (result.status == 'progress') { - if (args.progressCallback.onprogress) { - args.progressCallback.onprogress(result.id, result.progress); - } - } else if (result.status == 'complete') { - if (args.progressCallback.oncomplete) { - args.progressCallback.oncomplete(result.id); - } - } else if (result.status == 'error') { - var err = result['error']; - if (err) { - args.errorCallback(new WebAPIException(err)); - return; - } - } - - if (result.status == 'complete' || result.status == 'error') { - delete callbacks[result['callbackId']]; - } - }); - } catch (e) { - throw e; + var result = native_.call('PackageManager_install', nativeParam, function(result) { + if (native_.isFailure(result)) { + native_.callIfPossible(args.errorCallback, native_.getErrorObject(result)); + delete callbacks[result['progressCallbackId']]; + } + }); + + if (native_.isFailure(result)) { + delete callbacks[progressCallbackId]; + throw native_.getErrorObject(result); } + + native_.addListener( + PACKAGE_PROGRESS_LISTENER_ID + progressCallbackId, PackageProgressCallback); }; PackageManager.prototype.install = function(packageFileURI, progressCallback) { @@ -191,47 +163,39 @@ PackageManager.prototype.install = function(packageFileURI, progressCallback) { var PackageManagerUninstall = function() { var args = validator_.validateArgs(arguments, [ - {'name' : 'id', 'type' : types_.STRING}, - {'name' : 'progressCallback', - 'type' : types_.LISTENER, - 'values' : ['onprogress', 'oncomplete']}, - {'name' : 'errorCallback', 'type' : types_.FUNCTION, 'optional' : true, 'nullable' : true} + {'name': 'id', 'type': types_.STRING}, { + 'name': 'progressCallback', + 'type': types_.LISTENER, + 'values': ['onprogress', 'oncomplete'] + }, + { + 'name': 'errorCallback', + 'type': types_.FUNCTION, + 'optional': true, + 'nullable': true + } ]); - var nativeParam = { - 'id': args.id - }; + var progressCallbackId = nextCallbackId(); + callbacks[progressCallbackId] = args; + + var nativeParam = {'id': args.id, 'progressCallbackId': progressCallbackId}; - try { - var syncResult = callNativeWithCallback( - 'PackageManager_uninstall', - nativeParam, - function(result) { - if (result.status == 'progress') { - if (args.progressCallback.onprogress) { - args.progressCallback.onprogress(result.id, result.progress); - } - } else if (result.status == 'complete') { - if (args.progressCallback.oncomplete) { - args.progressCallback.oncomplete(result.id); - } - } else if (result.status == 'error') { - var err = result['error']; - if (err) { - args.errorCallback(new WebAPIException(err)); - return; - } - } - - if (result.status == 'complete' || result.status == 'error') { - delete callbacks[result['callbackId']]; - } - }); - } catch (e) { - throw e; + var result = native_.call('PackageManager_uninstall', nativeParam, function(result) { + if (native_.isFailure(result)) { + native_.callIfPossible(args.errorCallback, native_.getErrorObject(result)); + delete callbacks[result['progressCallbackId']]; + } + }); + + if (native_.isFailure(result)) { + delete callbacks[result['progressCallbackId']]; + throw native_.getErrorObject(result); } -}; + native_.addListener( + PACKAGE_PROGRESS_LISTENER_ID + progressCallbackId, PackageProgressCallback); +}; PackageManager.prototype.uninstall = function(id, progressCallback) { PackageManagerUninstall.apply(this, arguments); @@ -239,110 +203,82 @@ PackageManager.prototype.uninstall = function(id, progressCallback) { PackageManager.prototype.getPackagesInfo = function(successCallback, errorCallback) { var args = validator_.validateArgs(arguments, [ - {'name' : 'successCallback', 'type' : types_.FUNCTION}, - {'name' : 'errorCallback', 'type' : types_.FUNCTION, 'optional' : true, 'nullable' : true} + {'name': 'successCallback', 'type': types_.FUNCTION}, { + 'name': 'errorCallback', + 'type': types_.FUNCTION, + 'optional': true, + 'nullable': true + } ]); - var nativeParam = { - }; + var result = native_.call('PackageManager_getPackagesInfo', {}, function(result) { + if (native_.isSuccess(result)) { + for (var i = 0; i < result.informationArray.length; i++) { + result.informationArray[i] = new PackageInformation(result.informationArray[i]); + } + args.successCallback(result.informationArray); + } else if (native_.isFailure(result)) { + native_.callIfPossible(args.errorCallback, native_.getErrorObject(result)); + } + }); - try { - var syncMsg = callNativeWithCallback( - 'PackageManager_getPackagesInfo', - nativeParam, - function(result) { - if (result.status == 'success') { - for (var i = 0; i < result.informationArray.length; i++) { - result.informationArray[i] = new PackageInformation(result.informationArray[i]); - } - args.successCallback(result.informationArray); - } else if (result.status == 'error') { - var err = result['error']; - if (err) { - args.errorCallback(new WebAPIException(err)); - return; - } - } - - delete callbacks[result['callbackId']]; - }); - } catch (e) { - throw e; + if (native_.isFailure(result)) { + throw native_.getErrorObject(result); } }; PackageManager.prototype.getPackageInfo = function() { - var args = validator_.validateArgs(arguments, [ - {'name': 'id', 'type': types_.STRING, 'optional' : true, 'nullable' : true} - ]); + var args = validator_.validateArgs( + arguments, + [{'name': 'id', 'type': types_.STRING, 'optional': true, 'nullable': true}]); - var nativeParam = { - }; + var nativeParam = {}; if (args['id']) { nativeParam['id'] = args.id; } - try { - var syncResult = callNative('PackageManager_getPackageInfo', nativeParam); - return new PackageInformation(syncResult); - } catch (e) { - throw e; + var result = native_.callSync('PackageManager_getPackageInfo', nativeParam); + if (native_.isSuccess(result)) { + return new PackageInformation(native_.getResultObject(result)); + } else { + throw native_.getErrorObject(result); } }; PackageManager.prototype.setPackageInfoEventListener = function(eventCallback) { var args = validator_.validateArgs( - arguments, - [ - {'name' : 'eventCallback', - 'type' : types_.LISTENER, - 'values' : ['oninstalled', 'onupdated', 'onuninstalled']} - ]); + arguments, [{ + 'name': 'eventCallback', + 'type': types_.LISTENER, + 'values': ['oninstalled', 'onupdated', 'onuninstalled'] + }]); - var nativeParam = { - }; + var result = native_.callSync('PackageManager_setPackageInfoEventListener', {}); - try { - var syncResult = callNativeWithCallback( - 'PackageManager_setPackageInfoEventListener', - nativeParam, - function(result) { - if (result.status == 'installed') { - args.eventCallback.oninstalled(new PackageInformation(result.info)); - } else if (result.status == 'updated') { - args.eventCallback.onupdated(new PackageInformation(result.info)); - } else if (result.status == 'uninstalled') { - args.eventCallback.onuninstalled(result.id); - } - }); - - if (infoEventListenerId === -1) { - infoEventListenerId = nativeParam.callbackId; - } else { - delete callbacks[infoEventListenerId]; - infoEventListenerId = nativeParam.callbackId; - } + if (native_.isFailure(result)) { + throw native_.getErrorObject(result); + } - } catch (e) { - throw e; + if (!native_.isListenerSet(PACKAGE_INFO_LISTENER_ID)) { + native_.addListener(PACKAGE_INFO_LISTENER_ID, PackageInfoChangeCallback); } + listener = args.eventCallback; }; PackageManager.prototype.unsetPackageInfoEventListener = function() { - var nativeParam = { - }; + var nativeParam = {}; - try { - var syncResult = callNative('PackageManager_unsetPackageInfoEventListener', nativeParam); - if (syncResult === true) { - delete callbacks[infoEventListenerId]; - infoEventListenerId = -1; - } - } catch (e) { - throw e; + var result = + native_.callSync('PackageManager_unsetPackageInfoEventListener', nativeParam); + + if (native_.isFailure(result)) { + throw native_.getErrorObject(result); + } + + if (native_.isListenerSet(PACKAGE_INFO_LISTENER_ID)) { + native_.removeListener(PACKAGE_INFO_LISTENER_ID); } }; exports = new PackageManager(); - diff --git a/src/package/package_instance.cc b/src/package/package_instance.cc index d0a11470..a44cbda1 100644 --- a/src/package/package_instance.cc +++ b/src/package/package_instance.cc @@ -51,16 +51,16 @@ typedef enum _PackageThreadWorkType { class PackageUserData { public: - PackageUserData(PackageInstance* ins, int id, PackageThreadWorkType task) { + PackageUserData(PackageInstance* ins, int id, PackageThreadWorkType task, + int progress_callback_id = 0) + : instance_(ins), callback_id_(id), work_(task), progress_callback_id_(progress_callback_id) { ScopeLogger(); - instance_ = ins; - callback_id_ = id; - work_ = task; } PackageInstance* instance_; int callback_id_; PackageThreadWorkType work_; + int progress_callback_id_; picojson::object data_; }; typedef std::shared_ptr PackageUserDataPtr; @@ -85,6 +85,10 @@ static gboolean PackageAfterWork(const PackageUserDataPtr& userData) { ScopeLogger(); userData->data_["callbackId"] = picojson::value(static_cast(userData->callback_id_)); + if (PackageThreadWorkNone == userData->work_) { + userData->data_["progressCallbackId"] = + picojson::value(static_cast(userData->progress_callback_id_)); + } picojson::value result = picojson::value(userData->data_); common::Instance::PostMessage(userData->instance_, result.serialize().c_str()); @@ -150,7 +154,7 @@ static void PackageListenerCb(const char* type, const char* package, } picojson::object param; - param["listener"] = picojson::value("infoEvent"); + param["listenerId"] = picojson::value("PackageInfoListener"); LoggerD("Listener type: %d , state: %d, progress: %d", event_type, event_state, progress); if (event_type == PACKAGE_MANAGER_EVENT_TYPE_INSTALL && @@ -280,7 +284,9 @@ void PackageInstance::InvokeCallback(int request_id, picojson::object& param) { int callback_id = callbacks_map_[request_id]; - param["callbackId"] = picojson::value(static_cast(callback_id)); + std::string listenerId = "PackageProgressListener_" + std::to_string(callback_id); + param["listenerId"] = picojson::value(listenerId); + param["progressCallbackId"] = picojson::value(static_cast(callback_id)); picojson::value result = picojson::value(param); Instance::PostMessage(this, result.serialize().c_str()); } @@ -292,14 +298,16 @@ void PackageInstance::PackageManagerInstall(const picojson::value& args, picojso CHECK_EXIST(args, "callbackId", out) CHECK_EXIST(args, "packageFileURI", out) + CHECK_EXIST(args, "progressCallbackId", out) int callback_id = static_cast(args.get("callbackId").get()); const std::string& packageFileURI = convertUriToPath(args.get("packageFileURI").get()); + int progress_callback_id = static_cast(args.get("progressCallbackId").get()); if (!request_) { LoggerE("package_manager_request_h is NULL"); - InvokeErrorCallbackAsync(callback_id, + InvokeErrorCallbackAsync(callback_id, progress_callback_id, UnknownException("It is not allowed to install the package by " "the platform or any other platform error occurs")); return; @@ -311,15 +319,16 @@ void PackageInstance::PackageManagerInstall(const picojson::value& args, picojso if (ret == PACKAGE_MANAGER_ERROR_INVALID_PARAMETER) { LoggerE("The package is not found at the specified location"); InvokeErrorCallbackAsync( - callback_id, NotFoundException("The package is not found at the specified location")); + callback_id, progress_callback_id, + NotFoundException("The package is not found at the specified location")); } else { LoggerE("Failed to install package: %d (%s)", ret, get_error_message(ret)); - InvokeErrorCallbackAsync(callback_id, + InvokeErrorCallbackAsync(callback_id, progress_callback_id, UnknownException("It is not allowed to install the package by " "the platform or any other platform error occurs")); } } else { - RegisterCallback(request_id, callback_id); + RegisterCallback(request_id, progress_callback_id); } ReportSuccess(out); @@ -332,13 +341,15 @@ void PackageInstance::PackageManagerUninstall(const picojson::value& args, picoj CHECK_EXIST(args, "callbackId", out) CHECK_EXIST(args, "id", out) + CHECK_EXIST(args, "progressCallbackId", out) int callback_id = static_cast(args.get("callbackId").get()); const std::string& id = args.get("id").get(); + int progress_callback_id = static_cast(args.get("progressCallbackId").get()); if (!request_) { LoggerE("package_manager_request_h is NULL"); - InvokeErrorCallbackAsync(callback_id, + InvokeErrorCallbackAsync(callback_id, progress_callback_id, UnknownException("It is not allowed to install the package by " "the platform or any other platform error occurs")); return; @@ -350,11 +361,12 @@ void PackageInstance::PackageManagerUninstall(const picojson::value& args, picoj if (ret == PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE) { LoggerE("The package is not found at the specified location"); InvokeErrorCallbackAsync( - callback_id, NotFoundException("The package is not found at the specified location")); + callback_id, progress_callback_id, + NotFoundException("The package is not found at the specified location")); } else { LoggerE("Failed to get package info: %d (%s)", ret, get_error_message(ret)); InvokeErrorCallbackAsync( - callback_id, + callback_id, progress_callback_id, UnknownException("It is not allowed to get package information by the platform or " "any other platform error occurs")); } @@ -366,11 +378,11 @@ void PackageInstance::PackageManagerUninstall(const picojson::value& args, picoj if (ret != PACKAGE_MANAGER_ERROR_NONE) { LoggerE("Failed to uninstall package: %d (%s)", ret, get_error_message(ret)); InvokeErrorCallbackAsync( - callback_id, + callback_id, progress_callback_id, UnknownException("It is not allowed to install the package by the platform or " "any other platform error occurs")); } else { - RegisterCallback(request_id, callback_id); + RegisterCallback(request_id, progress_callback_id); } } @@ -442,8 +454,6 @@ void PackageInstance::PackageManagerSetpackageinfoeventlistener(const picojson:: CHECK_PRIVILEGE_ACCESS(kPrivilegePackageInfo, &out); - CHECK_EXIST(args, "callbackId", out) - if (is_package_info_listener_set_) { LoggerD("Already set"); ReportSuccess(out); @@ -501,12 +511,14 @@ void PackageInstance::PackageManagerUnsetpackageinfoeventlistener(const picojson ReportSuccess(out); } -void PackageInstance::InvokeErrorCallbackAsync(int callback_id, const PlatformException& ex) { +void PackageInstance::InvokeErrorCallbackAsync(int callback_id, int progress_callback_id, + const PlatformException& ex) { ScopeLogger(); picojson::object param; LogAndReportError(ex, param); - PackageUserDataPtr userData(new PackageUserData(this, callback_id, PackageThreadWorkNone)); + PackageUserDataPtr userData( + new PackageUserData(this, callback_id, PackageThreadWorkNone, progress_callback_id)); userData->data_ = param; TaskQueue::GetInstance().Async(PackageAfterWork, userData); } diff --git a/src/package/package_instance.h b/src/package/package_instance.h index 3ae7163b..772d4cb1 100644 --- a/src/package/package_instance.h +++ b/src/package/package_instance.h @@ -43,7 +43,8 @@ class PackageInstance : public common::ParsedInstance { std::map callbacks_map_; // void RegisterCallback(int request_id, int callback_id); - void InvokeErrorCallbackAsync(int callback_id, const common::PlatformException& ex); + void InvokeErrorCallbackAsync(int callback_id, int progress_callback_id, + const common::PlatformException& ex); void PackageManagerInstall(const picojson::value& args, picojson::object& out); void PackageManagerUninstall(const picojson::value& args, picojson::object& out); -- 2.34.1