* 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) {
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;
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;
}
}
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;
}
}
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) {
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);
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();
-
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<PackageUserData> PackageUserDataPtr;
ScopeLogger();
userData->data_["callbackId"] = picojson::value(static_cast<double>(userData->callback_id_));
+ if (PackageThreadWorkNone == userData->work_) {
+ userData->data_["progressCallbackId"] =
+ picojson::value(static_cast<double>(userData->progress_callback_id_));
+ }
picojson::value result = picojson::value(userData->data_);
common::Instance::PostMessage(userData->instance_, result.serialize().c_str());
}
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 &&
int callback_id = callbacks_map_[request_id];
- param["callbackId"] = picojson::value(static_cast<double>(callback_id));
+ std::string listenerId = "PackageProgressListener_" + std::to_string(callback_id);
+ param["listenerId"] = picojson::value(listenerId);
+ param["progressCallbackId"] = picojson::value(static_cast<double>(callback_id));
picojson::value result = picojson::value(param);
Instance::PostMessage(this, result.serialize().c_str());
}
CHECK_EXIST(args, "callbackId", out)
CHECK_EXIST(args, "packageFileURI", out)
+ CHECK_EXIST(args, "progressCallbackId", out)
int callback_id = static_cast<int>(args.get("callbackId").get<double>());
const std::string& packageFileURI =
convertUriToPath(args.get("packageFileURI").get<std::string>());
+ int progress_callback_id = static_cast<int>(args.get("progressCallbackId").get<double>());
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;
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);
CHECK_EXIST(args, "callbackId", out)
CHECK_EXIST(args, "id", out)
+ CHECK_EXIST(args, "progressCallbackId", out)
int callback_id = static_cast<int>(args.get("callbackId").get<double>());
const std::string& id = args.get("id").get<std::string>();
+ int progress_callback_id = static_cast<int>(args.get("progressCallbackId").get<double>());
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;
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"));
}
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);
}
}
CHECK_PRIVILEGE_ACCESS(kPrivilegePackageInfo, &out);
- CHECK_EXIST(args, "callbackId", out)
-
if (is_package_info_listener_set_) {
LoggerD("Already set");
ReportSuccess(out);
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<PackageUserData>(PackageAfterWork, userData);
}