From 93952f56286b8aac5a0a32b595d25197fbeea6d5 Mon Sep 17 00:00:00 2001 From: Gebing Date: Tue, 21 May 2013 19:58:50 +0800 Subject: [PATCH 1/4] It has 3 major enhancement and bugfix for AbstractAjaxCallback.java: 1. in function clear(), reset all local variables in order to reuse same AbstractAjaxCallback instance. 2. in function httpDo(), add code for IOException processing to remove partial content file in cache. 3. in function filePut(), add code for remove cache file when user called status.invalidate() in case of status.getFile() is not null --- .../callback/AbstractAjaxCallback.java | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/com/androidquery/callback/AbstractAjaxCallback.java b/src/com/androidquery/callback/AbstractAjaxCallback.java index 1fbb68a7..861526de 100644 --- a/src/com/androidquery/callback/AbstractAjaxCallback.java +++ b/src/com/androidquery/callback/AbstractAjaxCallback.java @@ -165,6 +165,34 @@ private void clear(){ transformer = null; ah = null; act = null; + callback = null; + targetFile = null; + cacheDir = null; + cookies = null; + headers = null; + params = null; + proxy = null; + networkUrl = null; + url = null; + result = null; + type = null; + status = null; + + abort = false; + blocked = false; + completed = false; + fileCache = false; + memCache = false; + reauth = false; + refresh = false; + + method = Constants.METHOD_DETECT; + policy = Constants.CACHE_DEFAULT; + lastStatus = 200; + expire = 0; + retry = 0; + timeout = 0; + uiCallback = true; } /** @@ -1183,6 +1211,11 @@ private void filePut(){ } } + }else if(status.getFile() != null && status.getSource() == AjaxStatus.NETWORK && status.getInvalid()){ + File file = status.getFile(); + if (file != null && file.exists()) { + file.delete(); + } } }catch(Exception e){ AQUtility.debug(e); @@ -1663,7 +1696,15 @@ private void httpDo(HttpUriRequest hr, String url, Map headers, file = null; } } - + + }catch(IOException e){ + if (file != null) { + AQUtility.close(os); + os = null; + file.delete(); + } + throw e; + }finally{ AQUtility.close(is); AQUtility.close(os); From a17d43b5d72bbf7cd42e743db082364cc7a3769a Mon Sep 17 00:00:00 2001 From: Gebing Date: Tue, 21 May 2013 21:04:11 +0800 Subject: [PATCH 2/4] in function clear(), remove some reset operations on variables which have public getXXX() functions --- src/com/androidquery/callback/AbstractAjaxCallback.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/com/androidquery/callback/AbstractAjaxCallback.java b/src/com/androidquery/callback/AbstractAjaxCallback.java index 861526de..b5c3df63 100644 --- a/src/com/androidquery/callback/AbstractAjaxCallback.java +++ b/src/com/androidquery/callback/AbstractAjaxCallback.java @@ -165,6 +165,7 @@ private void clear(){ transformer = null; ah = null; act = null; + callback = null; targetFile = null; cacheDir = null; @@ -173,10 +174,6 @@ private void clear(){ params = null; proxy = null; networkUrl = null; - url = null; - result = null; - type = null; - status = null; abort = false; blocked = false; @@ -1213,7 +1210,7 @@ private void filePut(){ }else if(status.getFile() != null && status.getSource() == AjaxStatus.NETWORK && status.getInvalid()){ File file = status.getFile(); - if (file != null && file.exists()) { + if (file.exists()) { file.delete(); } } From d82915935482f3915b40caa99cc398aea12387d5 Mon Sep 17 00:00:00 2001 From: Gebing Date: Tue, 21 May 2013 21:33:15 +0800 Subject: [PATCH 3/4] Add the feature to support resume download file --- src/com/androidquery/AbstractAQuery.java | 40 ++++++++++++++++++- .../callback/AbstractAjaxCallback.java | 18 +++++++-- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/src/com/androidquery/AbstractAQuery.java b/src/com/androidquery/AbstractAQuery.java index 07141fa9..a166d0ff 100644 --- a/src/com/androidquery/AbstractAQuery.java +++ b/src/com/androidquery/AbstractAQuery.java @@ -2707,5 +2707,43 @@ public T download(String url, File target, Object handler, String callback){ return download(url, target, cb); } - + + + /** + * Download a file asynchronously. + * + * @param url url + * @param target the file to be saved + * @param resume resume download flag + * @param cb callback to be called when done + * @return self + * + */ + + public T download(String url, File target, boolean resume, AjaxCallback cb){ + + cb.url(url).type(File.class).targetFile(target).resume(resume); + return ajax(cb); + + } + + /** + * Download a file asynchronously. + * + * @param url url + * @param target the file to be saved + * @param resume resume download flag + * @param handler the callback handler + * @param callback the callback method + * @return self + * + */ + + public T download(String url, File target, boolean resume, Object handler, String callback){ + + AjaxCallback cb = new AjaxCallback(); + cb.weakHandler(handler, callback); + return download(url, target, resume, cb); + + } } diff --git a/src/com/androidquery/callback/AbstractAjaxCallback.java b/src/com/androidquery/callback/AbstractAjaxCallback.java index b5c3df63..60c9fc80 100644 --- a/src/com/androidquery/callback/AbstractAjaxCallback.java +++ b/src/com/androidquery/callback/AbstractAjaxCallback.java @@ -1553,6 +1553,11 @@ private HttpResponse execute(HttpUriRequest hr, DefaultHttpClient client, HttpCo return response; } + private boolean resume; + public K resume(boolean resume){ + this.resume = resume; + return self(); + } private void httpDo(HttpUriRequest hr, String url, Map headers, AjaxStatus status) throws ClientProtocolException, IOException{ @@ -1576,6 +1581,13 @@ private void httpDo(HttpUriRequest hr, String url, Map headers, hr.addHeader("Cookie", cookie); } + if(resume && targetFile != null){ + long len = targetFile.length(); + if (len > 0){ + hr.addHeader("Range", "bytes=" + len); + } + } + if(ah != null){ ah.applyToken(this, hr); } @@ -1672,8 +1684,8 @@ private void httpDo(HttpUriRequest hr, String url, Map headers, if(file == null){ os = new PredefinedBAOS(size); }else{ - file.createNewFile(); - os = new BufferedOutputStream(new FileOutputStream(file)); + if(!resume || !file.exists()) file.createNewFile(); + os = new BufferedOutputStream(new FileOutputStream(file, true)); } is = entity.getContent(); @@ -1695,7 +1707,7 @@ private void httpDo(HttpUriRequest hr, String url, Map headers, } }catch(IOException e){ - if (file != null) { + if (file != null && !resume) { AQUtility.close(os); os = null; file.delete(); From 0434ca12d3b7830f6db8ac0e0b732842213a0180 Mon Sep 17 00:00:00 2001 From: gebing Date: Fri, 7 Jun 2013 10:43:46 +0800 Subject: [PATCH 4/4] Update AbstractAjaxCallback.java Modify setting HTTP Range value. --- src/com/androidquery/callback/AbstractAjaxCallback.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/androidquery/callback/AbstractAjaxCallback.java b/src/com/androidquery/callback/AbstractAjaxCallback.java index 60c9fc80..4e5d5252 100644 --- a/src/com/androidquery/callback/AbstractAjaxCallback.java +++ b/src/com/androidquery/callback/AbstractAjaxCallback.java @@ -1584,7 +1584,7 @@ private void httpDo(HttpUriRequest hr, String url, Map headers, if(resume && targetFile != null){ long len = targetFile.length(); if (len > 0){ - hr.addHeader("Range", "bytes=" + len); + hr.addHeader("Range", "bytes=" + len + "-"); } }