[datacontrol][common] Simplify instance methods registration (2)
[platform/core/api/webapi-plugins.git] / src / download / download_api.js
index a1388d4..5ea0cf7 100755 (executable)
  *    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() {
@@ -39,65 +38,32 @@ extension.setMessageListener(function(json) {
             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) {
@@ -110,7 +76,8 @@ var DownloadState = {
     PAUSED: 'PAUSED',
     CANCELED: 'CANCELED',
     COMPLETED: 'COMPLETED',
-    FAILED: 'FAILED'
+    FAILED: 'FAILED',
+    ABANDONED: 'ABANDONED'
 };
 
 var DownloadNetworkType = {
@@ -213,25 +180,25 @@ DownloadManager.prototype.start = function() {
         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() {
@@ -249,10 +216,10 @@ 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);
     }
 };
 
@@ -271,11 +238,35 @@ DownloadManager.prototype.pause = function() {
             '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() {
@@ -293,10 +284,10 @@ 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);
     }
 };
 
@@ -315,10 +306,12 @@ DownloadManager.prototype.getState = function() {
             '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);
     }
 };
 
@@ -351,10 +344,12 @@ DownloadManager.prototype.getMIMEType = function() {
             '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);
     }
 };
 
@@ -368,6 +363,9 @@ DownloadManager.prototype.setListener = function() {
         }
     ]);
 
+    if (!native_.isListenerSet(DOWNLOAD_MANAGER_LISTENER_ID)) {
+        native_.addListener(DOWNLOAD_MANAGER_LISTENER_ID, DownloadManagerChangeCallback);
+    }
     callbacks[args.downloadId] = args.downloadCallback;
 };