* limitations under the License.
*/
-var JSON_ = xwalk.JSON;
var privUtils_ = xwalk.utils;
var validator_ = xwalk.utils.validator;
var types_ = validator_.Types;
-var check_ = xwalk.utils.type;
var converter_ = xwalk.utils.converter;
+var native_ = new xwalk.utils.NativeManager(extension);
-var callbackId = 0;
+var DOWNLOAD_MANAGER_LISTENER_ID = 'DownloadManagerListener';
+
+var downloadId = 0;
var callbacks = {};
var requests = {};
-extension.setMessageListener(function(json) {
- var result = JSON_.parse(json);
- var callback = callbacks[result.callbackId];
- //privUtils_.log("PostMessage received: " + result.status);
+function DownloadManagerChangeCallback(result) {
+ var callback = callbacks[result.downloadId];
if (!callback) {
- privUtils_.log('Ignoring unknown callback: ' + result.callbackId);
+ privUtils_.log('Ignoring unknown callback: ' + result.downloadId);
return;
}
setTimeout(function() {
if (callback.onprogress) {
var receivedSize = result.receivedSize;
var totalSize = result.totalSize;
- callback.onprogress(result.callbackId, receivedSize, totalSize);
+ callback.onprogress(result.downloadId, receivedSize, totalSize);
}
} else if (result.status == 'paused') {
if (callback.onpaused) {
- callback.onpaused(result.callbackId);
+ callback.onpaused(result.downloadId);
}
} else if (result.status == 'canceled') {
if (callback.oncanceled) {
- callback.oncanceled(result.callbackId);
+ callback.oncanceled(result.downloadId);
}
} else if (result.status == 'completed') {
if (callback.oncompleted) {
var fullPath = result.fullPath;
- callback.oncompleted(result.callbackId, fullPath);
+ callback.oncompleted(result.downloadId, fullPath);
+ delete callbacks[result.downloadId];
}
} else if (result.status == 'error') {
if (callback.onfailed) {
- callback.onfailed(result.callbackId, new WebAPIException(result.error));
+ callback.onfailed(result.downloadId, new WebAPIException(result.error));
}
}
}, 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 (result.result) {
- return result.result;
- }
- return true;
- } else if (result.status == 'error') {
- var err = result.error;
- if (err) {
- throw new WebAPIException(err);
- }
- return false;
- }
}
-function callNativeWithCallback(cmd, args, callback) {
- if (callback) {
- var id = nextCallbackId();
- args.callbackId = id;
- callbacks[id] = callback;
- }
-
- return callNative(cmd, args);
+function nextDownloadId() {
+ return ++downloadId;
}
function SetReadOnlyProperty(obj, n, v) {
PAUSED: 'PAUSED',
CANCELED: 'CANCELED',
COMPLETED: 'COMPLETED',
- FAILED: 'FAILED'
+ FAILED: 'FAILED',
+ ABANDONED: 'ABANDONED'
};
var DownloadNetworkType = {
fileName: args.downloadRequest.fileName,
networkType: args.downloadRequest.networkType,
httpHeader: args.downloadRequest.httpHeader,
- callbackId: nextCallbackId()
+ downloadId: nextDownloadId()
};
if (args.downloadCallback) {
- this.setListener(nativeParam.callbackId, args.downloadCallback);
+ this.setListener(nativeParam.downloadId, args.downloadCallback);
}
- try {
- callNative('DownloadManager_start', nativeParam);
- } catch (e) {
- if ('NetworkError' === e.name) {
+ var result = native_.callSync('DownloadManagerStart', nativeParam);
+
+ if (native_.isFailure(result)) {
+ if ('NetworkError' === result.error.name) {
return -1;
}
- throw e;
+ throw native_.getErrorObject(result);
}
- requests[nativeParam.callbackId] = args.downloadRequest;
+ requests[nativeParam.downloadId] = args.downloadRequest;
- return nativeParam.callbackId;
+ return nativeParam.downloadId;
};
DownloadManager.prototype.cancel = function() {
'the identifier does not match any download operation in progress'
);
- try {
- callNative('DownloadManager_cancel', nativeParam);
- } catch (e) {
- throw e;
+ var result = native_.callSync('DownloadManagerCancel', nativeParam);
+
+ if (native_.isFailure(result)) {
+ throw native_.getErrorObject(result);
}
};
'the identifier does not match any download operation in progress'
);
- try {
- callNative('DownloadManager_pause', nativeParam);
- } catch (e) {
- throw e;
+ var result = native_.callSync('DownloadManagerPause', nativeParam);
+
+ if (native_.isFailure(result)) {
+ throw native_.getErrorObject(result);
+ }
+};
+
+DownloadManager.prototype.abandon = function() {
+ var args = validator_.validateArgs(arguments, [
+ { name: 'downloadId', type: types_.LONG, nullable: false, optional: false }
+ ]);
+
+ var nativeParam = {
+ downloadId: args.downloadId
+ };
+
+ if (typeof requests[args.downloadId] === 'undefined')
+ throw new WebAPIException(
+ WebAPIException.INVALID_VALUES_ERR,
+ 'the identifier does not match any download operation in progress'
+ );
+
+ var result = native_.callSync('DownloadManagerAbandon', nativeParam);
+
+ if (native_.isFailure(result)) {
+ throw native_.getErrorObject(result);
}
+
+ delete callbacks[args.downloadId];
};
DownloadManager.prototype.resume = function() {
'the identifier does not match any download operation in progress'
);
- try {
- callNative('DownloadManager_resume', nativeParam);
- } catch (e) {
- throw e;
+ var result = native_.callSync('DownloadManagerResume', nativeParam);
+
+ if (native_.isFailure(result)) {
+ throw native_.getErrorObject(result);
}
};
'the identifier does not match any download operation in progress'
);
- try {
- return callNative('DownloadManager_getState', nativeParam);
- } catch (e) {
- throw e;
+ var result = native_.callSync('DownloadManagerGetState', nativeParam);
+
+ if (native_.isSuccess(result)) {
+ return native_.getResultObject(result);
+ } else {
+ throw native_.getErrorObject(result);
}
};
'the identifier does not match any download operation in progress'
);
- try {
- return callNative('DownloadManager_getMIMEType', nativeParam);
- } catch (e) {
- throw e;
+ var result = native_.callSync('DownloadManagerGetMimeType', nativeParam);
+
+ if (native_.isSuccess(result)) {
+ return native_.getResultObject(result);
+ } else {
+ throw native_.getErrorObject(result);
}
};
}
]);
+ if (!native_.isListenerSet(DOWNLOAD_MANAGER_LISTENER_ID)) {
+ native_.addListener(DOWNLOAD_MANAGER_LISTENER_ID, DownloadManagerChangeCallback);
+ }
callbacks[args.downloadId] = args.downloadCallback;
};