2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 var JSON_ = xwalk.JSON;
18 var privUtils_ = xwalk.utils;
19 var validator_ = xwalk.utils.validator;
20 var types_ = validator_.Types;
21 var check_ = xwalk.utils.type;
22 var converter_ = xwalk.utils.converter;
28 extension.setMessageListener(function(json) {
29 var result = JSON_.parse(json);
30 var callback = callbacks[result.callbackId];
31 //privUtils_.log("PostMessage received: " + result.status);
34 privUtils_.log('Ignoring unknown callback: ' + result.callbackId);
37 setTimeout(function() {
38 if (result.status == 'progress') {
39 if (callback.onprogress) {
40 var receivedSize = result.receivedSize;
41 var totalSize = result.totalSize;
42 callback.onprogress(result.callbackId, receivedSize, totalSize);
44 } else if (result.status == 'paused') {
45 if (callback.onpaused) {
46 callback.onpaused(result.callbackId);
48 } else if (result.status == 'canceled') {
49 if (callback.oncanceled) {
50 callback.oncanceled(result.callbackId);
52 } else if (result.status == 'completed') {
53 if (callback.oncompleted) {
54 var fullPath = result.fullPath;
55 callback.oncompleted(result.callbackId, fullPath);
57 } else if (result.status == 'error') {
58 if (callback.onfailed) {
59 callback.onfailed(result.callbackId, new WebAPIException(result.error));
65 function nextCallbackId() {
69 function callNative(cmd, args) {
70 var json = { cmd: cmd, args: args };
71 var argjson = JSON_.stringify(json);
72 var resultString = extension.internal.sendSyncMessage(argjson);
73 var result = JSON_.parse(resultString);
75 if (typeof result !== 'object') {
76 throw new WebAPIException(WebAPIException.UNKNOWN_ERR);
79 if (result.status == 'success') {
84 } else if (result.status == 'error') {
85 var err = result.error;
87 throw new WebAPIException(err);
93 function callNativeWithCallback(cmd, args, callback) {
95 var id = nextCallbackId();
97 callbacks[id] = callback;
100 return callNative(cmd, args);
103 function SetReadOnlyProperty(obj, n, v) {
104 Object.defineProperty(obj, n, { value: v, writable: false });
107 var DownloadState = {
109 DOWNLOADING: 'DOWNLOADING',
111 CANCELED: 'CANCELED',
112 COMPLETED: 'COMPLETED',
116 var DownloadNetworkType = {
117 CELLULAR: 'CELLULAR',
122 tizen.DownloadRequest = function(url, destination, fileName, networkType, httpHeader) {
123 validator_.isConstructorCall(this, tizen.DownloadRequest);
125 var url_ = converter_.toString(url);
126 var destination_ = destination === undefined ? '' : converter_.toString(destination);
127 var fileName_ = fileName === undefined ? '' : converter_.toString(fileName);
131 if (networkType === undefined || !(networkType in DownloadNetworkType)) {
132 networkType_ = 'ALL';
134 networkType_ = networkType;
137 Object.defineProperties(this, {
143 set: function(value) {
144 if (value !== null) {
145 url_ = converter_.toString(value);
154 set: function(value) {
155 if (value !== null) {
156 destination_ = converter_.toString(value);
165 set: function(value) {
166 if (value !== null) {
167 fileName_ = converter_.toString(value);
176 set: function(value) {
177 if (value === null || value in DownloadNetworkType) {
178 networkType_ = value;
185 value: httpHeader === undefined ? {} : httpHeader
190 function DownloadManager() {
191 // constructor of DownloadManager
194 DownloadManager.prototype.start = function() {
195 var args = validator_.validateArgs(arguments, [
197 name: 'downloadRequest',
198 type: types_.PLATFORM_OBJECT,
199 values: tizen.DownloadRequest
202 name: 'downloadCallback',
203 type: types_.LISTENER,
204 values: ['onprogress', 'onpaused', 'oncanceled', 'oncompleted', 'onfailed'],
211 url: args.downloadRequest.url,
212 destination: args.downloadRequest.destination,
213 fileName: args.downloadRequest.fileName,
214 networkType: args.downloadRequest.networkType,
215 httpHeader: args.downloadRequest.httpHeader,
216 callbackId: nextCallbackId()
219 if (args.downloadCallback) {
220 this.setListener(nativeParam.callbackId, args.downloadCallback);
224 callNative('DownloadManager_start', nativeParam);
226 if ('NetworkError' === e.name) {
232 requests[nativeParam.callbackId] = args.downloadRequest;
234 return nativeParam.callbackId;
237 DownloadManager.prototype.cancel = function() {
238 var args = validator_.validateArgs(arguments, [
239 { name: 'downloadId', type: types_.LONG, nullable: false, optional: false }
243 downloadId: args.downloadId
246 if (typeof requests[args.downloadId] === 'undefined')
247 throw new WebAPIException(
248 WebAPIException.INVALID_VALUES_ERR,
249 'the identifier does not match any download operation in progress'
253 callNative('DownloadManager_cancel', nativeParam);
259 DownloadManager.prototype.pause = function() {
260 var args = validator_.validateArgs(arguments, [
261 { name: 'downloadId', type: types_.LONG, nullable: false, optional: false }
265 downloadId: args.downloadId
268 if (typeof requests[args.downloadId] === 'undefined')
269 throw new WebAPIException(
270 WebAPIException.INVALID_VALUES_ERR,
271 'the identifier does not match any download operation in progress'
275 callNative('DownloadManager_pause', nativeParam);
281 DownloadManager.prototype.resume = function() {
282 var args = validator_.validateArgs(arguments, [
283 { name: 'downloadId', type: types_.LONG, nullable: false, optional: false }
287 downloadId: args.downloadId
290 if (typeof requests[args.downloadId] === 'undefined')
291 throw new WebAPIException(
292 WebAPIException.INVALID_VALUES_ERR,
293 'the identifier does not match any download operation in progress'
297 callNative('DownloadManager_resume', nativeParam);
303 DownloadManager.prototype.getState = function() {
304 var args = validator_.validateArgs(arguments, [
305 { name: 'downloadId', type: types_.LONG, nullable: false, optional: false }
309 downloadId: args.downloadId
312 if (typeof requests[args.downloadId] === 'undefined')
313 throw new WebAPIException(
314 WebAPIException.INVALID_VALUES_ERR,
315 'the identifier does not match any download operation in progress'
319 return callNative('DownloadManager_getState', nativeParam);
325 DownloadManager.prototype.getDownloadRequest = function() {
326 var args = validator_.validateArgs(arguments, [
327 { name: 'downloadId', type: types_.LONG, nullable: false, optional: false }
330 if (typeof requests[args.downloadId] === 'undefined')
331 throw new WebAPIException(
332 WebAPIException.INVALID_VALUES_ERR,
333 'the identifier does not match any download operation in progress'
336 return requests[args.downloadId];
339 DownloadManager.prototype.getMIMEType = function() {
340 var args = validator_.validateArgs(arguments, [
341 { name: 'downloadId', type: types_.LONG, nullable: false, optional: false }
345 downloadId: args.downloadId
348 if (typeof requests[args.downloadId] === 'undefined')
349 throw new WebAPIException(
350 WebAPIException.INVALID_VALUES_ERR,
351 'the identifier does not match any download operation in progress'
355 return callNative('DownloadManager_getMIMEType', nativeParam);
361 DownloadManager.prototype.setListener = function() {
362 var args = validator_.validateArgs(arguments, [
363 { name: 'downloadId', type: types_.LONG },
365 name: 'downloadCallback',
366 type: types_.LISTENER,
367 values: ['onprogress', 'onpaused', 'oncanceled', 'oncompleted', 'onfailed']
371 callbacks[args.downloadId] = args.downloadCallback;
374 exports = new DownloadManager();