diff --git a/src/com/hippo/ehviewer/GalleryDownloadInfo.java b/src/com/hippo/ehviewer/GalleryDownloadInfo.java new file mode 100644 index 000000000..dd278101b --- /dev/null +++ b/src/com/hippo/ehviewer/GalleryDownloadInfo.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2014 Hippo Seven + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hippo.ehviewer; + +import com.hippo.ehviewer.data.GalleryInfo; + +public class GalleryDownloadInfo { + + public static final int NONE = 0x0; + public static final int DOWNLOADING = 0x1; + public static final int FINISHED = 0x2; + + public GalleryInfo galleryInfo; + + // For ui set progressbar + public int picNum; + public int downloadNum; + + public int state; + + public GalleryDownloadInfo(GalleryInfo galleryInfo) { + this(galleryInfo, NONE); + } + + public GalleryDownloadInfo(GalleryInfo galleryInfo, int state) { + this.galleryInfo = galleryInfo; + this.state = state == DOWNLOADING ? NONE : FINISHED; + } +} diff --git a/src/com/hippo/ehviewer/GallerysDownloader.java b/src/com/hippo/ehviewer/GallerysDownloader.java index f90259091..b37abf382 100644 --- a/src/com/hippo/ehviewer/GallerysDownloader.java +++ b/src/com/hippo/ehviewer/GallerysDownloader.java @@ -16,66 +16,236 @@ package com.hippo.ehviewer; -import java.util.ArrayList; -import java.util.List; +import java.io.File; +import java.util.LinkedList; +import java.util.Queue; + +import android.content.Context; -import com.hippo.ehviewer.data.Data; -import com.hippo.ehviewer.data.DownloadInfo; import com.hippo.ehviewer.data.GalleryInfo; +import com.hippo.ehviewer.data.PreviewList; +import com.hippo.ehviewer.ehclient.DetailParser; import com.hippo.ehviewer.ehclient.EhClient; import com.hippo.ehviewer.network.HttpHelper; +import com.hippo.ehviewer.util.Config; +import com.hippo.ehviewer.util.Util; -public class GallerysDownloader { - +/** + * Download a gallery + * + * @author Hippo + * + */ + +// TODO For gallerys whose Resized is Originals, +// we can get download info from hathdl + +public class GallerysDownloader implements Runnable { + private static final String TAG = GallerysDownloader.class.getSimpleName(); + + private static final int MAX_RETRY = 3; + + private static final int OK = 0x0; + private static final int FAIL = 0x1; + private static final int STOP = 0x2; + + private static final int MAX_DOWNLOAD_THREAD_NUM = 3; + + private final Context mContext; + private final GalleryInfo mGalleryInfo; + private int mPageIndex; + private int mPageSum; + private int mPagePerDp; + private PreviewList[] mPages; + private final Thread mMainThread; + private final Queue mRequstDetailPage; + private final Queue mRequstPage; + private int downloadThreadNum = 0; + private final File mDownloadDir; + + public GallerysDownloader(Context context, GalleryInfo galleryInfo) { + this(context, galleryInfo, 0); + } + + public GallerysDownloader(Context context, GalleryInfo galleryInfo, int startIndex) { + mContext = context; + mGalleryInfo = galleryInfo; + mPageIndex = startIndex; + mDownloadDir = new File(Config.getDownloadPath(), + Util.rightFileName(mGalleryInfo.gid + '-' + mGalleryInfo.title)); + mDownloadDir.mkdirs(); + // TODO What if these is a file with the same name + + mMainThread = new Thread(this); + mRequstDetailPage = new LinkedList(); + mRequstPage = new LinkedList(); + } + + public void start() { + mMainThread.start(); + } + + private int getDetailPageForPageIndex(int pageIndex) { + return pageIndex / mPagePerDp; + } + + private boolean parserDetailPage(HttpHelper hh, DetailParser dp, int page, int mode) { + int times = 0; + while(times++ < MAX_RETRY) { + hh.reset(); + dp.reset(); + // For get more page url one time + hh.setPreviewMode(Config.PREVIEW_MODE_NORMAL); + String body = hh.get(EhClient.getDetailUrl(mGalleryInfo.gid, mGalleryInfo.token, page)); + if (body == null) + continue; + + if (dp.parser(body, mode) != mode) + continue; + + return true; + } + return false; + } + + /** + * Main thread body + */ + @Override + public void run() { + int detailPageMax = 0; + HttpHelper hh = new HttpHelper(mContext); + DetailParser dp = new DetailParser(); + + // Get detail info, pages, previewsum, previewPerPage + if (parserDetailPage(hh, dp, 0, DetailParser.DETAIL & + DetailParser.PREVIEW_INFO & DetailParser.PREVIEW)) { + // Get Ok + mPageSum = dp.pages; + mPagePerDp = dp.previewPerPage; + mPages = new PreviewList[dp.previewSum]; + mPages[0] = dp.previewList; + detailPageMax = dp.pages / dp.previewPerPage; + } else { + // TODO Get error, do something + } + + int startPageIndex = mPageIndex; + + // Start get + for (downloadThreadNum = 0; downloadThreadNum < MAX_DOWNLOAD_THREAD_NUM; downloadThreadNum++) { + new DownloadThread().start(); + } + + // Start get other page from startindex + int detailPage = getDetailPageForPageIndex(startPageIndex); + // Already get page 0 + if (detailPage == 0) + detailPage++; + for (; detailPage <= detailPageMax; detailPage++) { + if (parserDetailPage(hh, dp, detailPage, DetailParser.PREVIEW)) { + mPages[detailPage] = dp.previewList; + } else { + // TODO Get error, do something + } + } + + + } + + class DownloadThread extends Thread { + + private final HttpHelper mHttpHelper; + + public DownloadThread() { + mHttpHelper = new HttpHelper(mContext); + } + + private int getTargetPageIndex() { + synchronized(mRequstPage) { + if (mRequstPage.isEmpty()) { + return mPageIndex++; + } else { + return mRequstPage.poll(); + } + } + } +/* + private String getImageUrlForPage() { + int times = 0; + while(times++ < MAX_RETRY) { + + } + } + + public int downloadImage(String pageUrl, int index) { + String body = mHttpHelper.get(pageUrl); + + + } +*/ + @Override + public void run() { + + + + + + downloadThreadNum--; + } + } + + + /* private AppContext mAppContext; - + private Data mData; private List mDownloadList; private String[] mPageTokes; private DownloadInfo curDownloadInfo; private OnGalleryDownloadListener mListener; - + private static DownloadInfo emptyDownloadInfo = new DownloadInfo(null); - + public GallerysDownloader(AppContext appContext) { mAppContext = appContext; mPageTokes = null; mData = mAppContext.getData(); mDownloadList = mData.getAllDownloads(); } - + public void setOnGalleryDownloadListener(OnGalleryDownloadListener l) { mListener = l; } - + public synchronized void add(GalleryInfo galleryInfo) { DownloadInfo downloadInfo = new DownloadInfo(galleryInfo); mData.addDownload(downloadInfo); downloadInfo.setDownloadState(DownloadInfo.WAITING); - + checkDownloadThread(); } - + public synchronized boolean start(int index) { DownloadInfo downloadInfo = mDownloadList.get(index); if (downloadInfo.getDownloadState() == DownloadInfo.NONE && downloadInfo.getState() != DownloadInfo.COMPLETED) { downloadInfo.setDownloadState(DownloadInfo.WAITING); - + checkDownloadThread(); return true; } else { return false; } } - + private synchronized void checkDownloadThread() { if (curDownloadInfo == null) { curDownloadInfo = emptyDownloadInfo; new Thread(new DownloadGallery()).start(); } } - + private synchronized DownloadInfo getFirstWaiting() { for (DownloadInfo downloadInfo : mDownloadList) { if (downloadInfo.getDownloadState() == DownloadInfo.WAITING) @@ -83,7 +253,7 @@ public class GallerysDownloader { } return null; } - + private String getUrlContext(HttpHelper hp, String url) { int times = 3; String pageContent; @@ -94,7 +264,7 @@ public class GallerysDownloader { } return null; } - + private class DownloadGallery implements Runnable { @Override public void run() { @@ -102,10 +272,10 @@ public class GallerysDownloader { curDownloadInfo.setDownloadState(DownloadInfo.DOWNLOADING); if (mListener != null) mListener.onGalleryDownloadStart(curDownloadInfo); - + // get GalleryInfo galleryInfo = curDownloadInfo.getGalleryInfo(); - + HttpHelper hp = new HttpHelper(mAppContext); String url = EhClient.getDetailUrl(galleryInfo.gid, galleryInfo.token, curDownloadInfo.getMode()); @@ -116,19 +286,20 @@ public class GallerysDownloader { // New turn new Thread(new DownloadGallery()).start(); } else { - - - - + + + + } } } } - + interface OnGalleryDownloadListener { void onGalleryDownloadStart(DownloadInfo downloadInfo); void onGalleryDownloadStop(DownloadInfo downloadInfo); void onGalleryDownloadFailed(DownloadInfo downloadInfo, String eMsg); void onGalleryDownloadCompleted(DownloadInfo downloadInfo); } + */ } diff --git a/src/com/hippo/ehviewer/data/LargePreviewList.java b/src/com/hippo/ehviewer/data/LargePreviewList.java index a7bdd7f10..55a7f31fd 100644 --- a/src/com/hippo/ehviewer/data/LargePreviewList.java +++ b/src/com/hippo/ehviewer/data/LargePreviewList.java @@ -63,6 +63,13 @@ public class LargePreviewList extends PreviewList { mItemList.add(new Item(imageUrl, pageUrl)); } + @Override + public String getPageUrl(int index) { + if (index >= 0 && index < mItemList.size()) + return mItemList.get(index).mPageUrl; + return null; + } + @Override public void addPreview(AutoWrapLayout viewGroup) { if (mTargetPage != mHolder.getCurPreviewPage()) diff --git a/src/com/hippo/ehviewer/data/NormalPreviewList.java b/src/com/hippo/ehviewer/data/NormalPreviewList.java index 5a7f22aa8..aff462cf4 100644 --- a/src/com/hippo/ehviewer/data/NormalPreviewList.java +++ b/src/com/hippo/ehviewer/data/NormalPreviewList.java @@ -92,6 +92,15 @@ public class NormalPreviewList extends PreviewList{ return sum; } + @Override + public String getPageUrl(int index) { + for (Row row : rowArray) { + if (index < row.startIndex + row.itemArray.size() && index >= row.startIndex) + return row.itemArray.get(index - row.startIndex).url; + } + return null; + } + // TODO reuse the TextView in AutoWrapLayout @Override public void addPreview(AutoWrapLayout viewGroup) { diff --git a/src/com/hippo/ehviewer/data/PreviewList.java b/src/com/hippo/ehviewer/data/PreviewList.java index e344563b5..a69879c5a 100644 --- a/src/com/hippo/ehviewer/data/PreviewList.java +++ b/src/com/hippo/ehviewer/data/PreviewList.java @@ -54,6 +54,13 @@ public abstract class PreviewList { mTargetPage = targetPage; } + /** + * Return page url at target index, null for invalid index + * @param index + * @return + */ + public abstract String getPageUrl(int index); + protected class TextViewWithUrl extends TextView { public String url; diff --git a/src/com/hippo/ehviewer/ehclient/DetailParser.java b/src/com/hippo/ehviewer/ehclient/DetailParser.java index e405e55fc..4b00ea979 100644 --- a/src/com/hippo/ehviewer/ehclient/DetailParser.java +++ b/src/com/hippo/ehviewer/ehclient/DetailParser.java @@ -48,8 +48,6 @@ public class DetailParser { private static final CommentSort cs = new CommentSort(); - private int mMode; - public String eMesg; public String thumb; public String title; @@ -72,11 +70,31 @@ public class DetailParser { public PreviewList previewList; public LinkedList comments; - public void setMode(int mode) { - mMode = mode; + public void reset() { + eMesg = null; + thumb = null; + title = null; + title_jpn = null; + category = 0; + uploader = null; + posted = null; + pages = 0; + size = null; + resized = null; + parent = null; + visible = null; + language = null; + people = 0; + rating = 0; + firstPage = null; + previewPerPage = 0; + previewSum = 0; + tags = null; + previewList = null; + comments = null; } - public int parser(String body) { + public int parser(String body, int mode) { int re = 0; Pattern p; Matcher m; @@ -95,7 +113,7 @@ public class DetailParser { } // Get detail - if ((mMode & DETAIL) != 0) { + if ((mode & DETAIL) != 0) { p = Pattern .compile("
]+/>
" // thumb + "" @@ -148,7 +166,7 @@ public class DetailParser { } } // Get tag - if ((mMode & TAG) != 0) { + if ((mode & TAG) != 0) { tags = new LinkedHashMap>>(); p = Pattern .compile("]*>([^<>]+):(?:]*>]*>[^<>]*[^<>]*]*>\\d+[^<>]*)+"); @@ -164,7 +182,7 @@ public class DetailParser { } // Get preview info - if ((mMode & PREVIEW_INFO) != 0) { + if ((mode & PREVIEW_INFO) != 0) { p = Pattern.compile("

Showing ([\\d|,]+) - ([\\d|,]+) of ([\\d|,]+) images

"); m = p.matcher(body); if (m.find()) { @@ -178,7 +196,7 @@ public class DetailParser { } } // Get preview - if ((mMode & PREVIEW) != 0) { + if ((mode & PREVIEW) != 0) { boolean isLargePreview = false; if (body.contains("
Posted on ([^<>]+) by ]+>([^<>]+).*?
(.*?)
"); m = p.matcher(body); diff --git a/src/com/hippo/ehviewer/ehclient/EhClient.java b/src/com/hippo/ehviewer/ehclient/EhClient.java index 2d78e4f25..72db04a5b 100644 --- a/src/com/hippo/ehviewer/ehclient/EhClient.java +++ b/src/com/hippo/ehviewer/ehclient/EhClient.java @@ -403,11 +403,9 @@ public class EhClient { public void onSuccess(Object obj) { String body = (String)obj; DetailParser parser = new DetailParser(); - int mode = DetailParser.DETAIL | DetailParser.TAG + int result = parser.parser(body, DetailParser.DETAIL | DetailParser.TAG | DetailParser.PREVIEW_INFO | DetailParser.PREVIEW - | DetailParser.COMMENT; - parser.setMode(mode); - int result = parser.parser(body); + | DetailParser.COMMENT); if (result == DetailParser.OFFENSIVE) { md.firstPage = "offensive"; listener.onSuccess(md); @@ -471,8 +469,8 @@ public class EhClient { public void onSuccess(Object obj) { String body = (String)obj; DetailParser parser = new DetailParser(); - parser.setMode(DetailParser.PREVIEW); - if (parser.parser(body) == DetailParser.PREVIEW) { + if (parser.parser(body, DetailParser.PREVIEW) == + DetailParser.PREVIEW) { listener.onSuccess(checkFlag, parser.previewList); } else { listener.onFailure(checkFlag, "Parser error"); @@ -914,8 +912,8 @@ public class EhClient { public void onSuccess(Object obj) { String body = (String)obj; DetailParser parser = new DetailParser(); - parser.setMode(DetailParser.COMMENT); - if (parser.parser(body) == DetailParser.COMMENT) { + if (parser.parser(body, DetailParser.COMMENT) == + DetailParser.COMMENT) { listener.onSuccess(parser.comments); } else { listener.onFailure("parser error"); // TODO diff --git a/src/com/hippo/ehviewer/ehclient/EhInfo.java b/src/com/hippo/ehviewer/ehclient/EhInfo.java index 47e004265..93c3eea9d 100644 --- a/src/com/hippo/ehviewer/ehclient/EhInfo.java +++ b/src/com/hippo/ehviewer/ehclient/EhInfo.java @@ -111,14 +111,18 @@ public class EhInfo { updateUconfig(); }; - private void updateUconfig() { - mUconfig = "cats_" + mDefaultCat - + "-ts_" + mPreviewMode + private String getUconfigString(String previewMode) { + return "cats_" + mDefaultCat + + "-ts_" + (previewMode == null ? mPreviewMode : previewMode) + "-xns_" + mExculdeTagGroup + "-xl_" + mExculdeLanguage + "-tl_m-uh_y-tr_2-prn_n-dm_l-ar_0-rc_0-rx_0-ry_0-sa_y-oi_n-qb_n-tf_n-hp_-hk_-ms_n-mt_n"; } + private void updateUconfig() { + mUconfig = getUconfigString(null); + } + public final static EhInfo getInstance(final Context context) { if (sInstance == null) sInstance = new EhInfo(context.getApplicationContext()); @@ -161,12 +165,13 @@ public class EhInfo { } public void setCookie(HttpURLConnection conn) { + setCookie(conn, null); + } + + public void setCookie(HttpURLConnection conn, String previewMode) { String cookie = "ipb_member_id=" + mInfoPref.getString(KEY_MEMBER_ID, DEFAULT_MEMBER_ID) + "; ipb_pass_hash=" + mInfoPref.getString(KEY_PASS_HASH, DEFAULT_PASS_HASH) + - "; uconfig="+ mUconfig; - - android.util.Log.d(TAG, cookie); - + "; uconfig=" + (previewMode == null ? mUconfig : getUconfigString(previewMode)); conn.setRequestProperty("Cookie", cookie); } diff --git a/src/com/hippo/ehviewer/ehclient/ImagePageParser.java b/src/com/hippo/ehviewer/ehclient/ImagePageParser.java new file mode 100644 index 000000000..ed56b5967 --- /dev/null +++ b/src/com/hippo/ehviewer/ehclient/ImagePageParser.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2014 Hippo Seven + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hippo.ehviewer.ehclient; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ImagePageParser { + + public String imageUrl; + public String fullImageUrl; + public int gid; + public String token; + + public void reset() { + imageUrl = null; + fullImageUrl = null; + gid = 0; + token = null; + } + + public boolean parser(String body) { + Pattern p = Pattern.compile("
.+?
.+?)?"); + Matcher m = p.matcher(body); + if (m.matches()) { + imageUrl = m.group(1); + gid = Integer.parseInt(m.group(2)); + token = m.group(3); + fullImageUrl = m.group(4); + return true; + } else { + return false; + } + } +} diff --git a/src/com/hippo/ehviewer/network/HttpHelper.java b/src/com/hippo/ehviewer/network/HttpHelper.java index ee143bb0d..a28a39676 100644 --- a/src/com/hippo/ehviewer/network/HttpHelper.java +++ b/src/com/hippo/ehviewer/network/HttpHelper.java @@ -20,7 +20,6 @@ import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; -import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; @@ -30,6 +29,7 @@ import java.net.SocketTimeoutException; import java.net.URL; import java.net.URLEncoder; import java.net.UnknownHostException; +import java.util.Random; import java.util.zip.GZIPInputStream; import org.apache.http.conn.ConnectTimeoutException; @@ -61,10 +61,25 @@ public class HttpHelper { private static final String TAG = "HttpHelper"; public static final String SAD_PANDA_ERROR = "Sad Panda"; public static final String HAPPY_PANDA_BODY = "Happy Panda"; - public static final String DOWNLOAD_STOP = "Stop"; - public static final String DOWNLOAD_OK = "Download"; - private static String DEFAULT_CHARSET = "utf-8"; - private static String CHARSET_KEY = "charset="; + + public static final String DOWNLOAD_OK_STR = "OK"; + + public static final int DOWNLOAD_OK_CODE = 0x0; + public static final int DOWNLOAD_FAIL_CODE = 0x1; + public static final int DOWNLOAD_STOP_CODE = 0x2; + + private static final String DEFAULT_CHARSET = "utf-8"; + private static final String CHARSET_KEY = "charset="; + private static int sProxyIndex; + private static Object sProxyIndexLock; + + static { + // from 1 to 8 + Random rdm = new Random(System.currentTimeMillis()); + sProxyIndex = rdm.nextInt(7) + 1; + + sProxyIndexLock = new Object(); + } class Package { Object obj; @@ -80,6 +95,7 @@ public class HttpHelper { private Context mContext; private Exception mException; private OnRespondListener mListener; + private String mPreviewMode; public static final void createHandler() { if (mHandler != null) @@ -107,6 +123,12 @@ public class HttpHelper { void onFailure(String eMsg); } + public void reset() { + mListener = null; + mException = null; + mPreviewMode = null; + } + public void setOnRespondListener(OnRespondListener l) { mListener = l; } @@ -167,7 +189,11 @@ public class HttpHelper { return false; } - private Object requst(RequestHelper rh, String urlStr) { + public void setPreviewMode(String previewMode) { + mPreviewMode = previewMode; + } + + private Object requst(RequestHelper rh) { mException = null; int redirectionCount = 0; URL url = null; @@ -177,8 +203,8 @@ public class HttpHelper { if (mListener != null) msg = new Message(); try { - Log.d(TAG, "Requst " + urlStr); - url = new URL(urlStr); + url = rh.getUrl(); + Log.d(TAG, "Requst " + url.toString()); boolean isCookiable = isUrlCookiable(url); while (redirectionCount++ < Constant.MAX_REDIRECTS) { conn = (HttpURLConnection) url.openConnection(); @@ -188,7 +214,7 @@ public class HttpHelper { conn.setReadTimeout(Constant.DEFAULT_TIMEOUT); // Set cookie if necessary if (isCookiable) - EhInfo.getInstance(mContext).setCookie(conn); + EhInfo.getInstance(mContext).setCookie(conn, mPreviewMode); // Do custom staff rh.onBeforeConnect(conn); @@ -239,6 +265,8 @@ public class HttpHelper { msg.what = Constants.FALSE; mHandler.sendMessage(msg); } + // Send exception to helper + rh.onGetException(e); return null; } finally { if (conn != null) @@ -247,12 +275,21 @@ public class HttpHelper { } private interface RequestHelper { + + /** + * Get the URL to connect + * @return + */ + public URL getUrl() throws MalformedURLException; + /** * Add header or do something else for HttpURLConnection before connect * @param conn * @throws Exception */ + public void onBeforeConnect(HttpURLConnection conn) throws Exception; + /** * Get what do you need from HttpURLConnection after connect * Return null means get error @@ -261,12 +298,23 @@ public class HttpHelper { * @throws Exception */ public Object onAfterConnect(HttpURLConnection conn) throws Exception; + + /** + * Handle exception + * @param e + */ + public void onGetException(Exception e); } /** * RequstHelper for check sad panda, use HEAD method */ private class CheckSpHelper implements RequestHelper { + @Override + public URL getUrl() throws MalformedURLException { + return new URL(EhClient.EX_HEADER); + } + @Override public void onBeforeConnect(HttpURLConnection conn) throws Exception { @@ -278,9 +326,23 @@ public class HttpHelper { throws Exception { return HAPPY_PANDA_BODY; } + + @Override + public void onGetException(Exception e) {} } private abstract class GetStringHelper implements RequestHelper { + private String mUrl; + + public GetStringHelper(String url) { + mUrl = url; + } + + @Override + public URL getUrl() throws MalformedURLException { + return new URL(mUrl); + } + @Override public void onBeforeConnect(HttpURLConnection conn) throws Exception { @@ -333,12 +395,20 @@ public class HttpHelper { throws Exception { return getBody(conn); } + + @Override + public void onGetException(Exception e) {} } /** * RequstHelper for GET method */ private class GetHelper extends GetStringHelper { + + public GetHelper(String url) { + super(url); + } + @Override public void onBeforeConnect(HttpURLConnection conn) throws Exception { @@ -353,7 +423,8 @@ public class HttpHelper { private class PostFormHelper extends GetStringHelper { private String[][] mArgs; - public PostFormHelper(String[][] args) { + public PostFormHelper(String url, String[][] args) { + super(url); mArgs = args; } @@ -392,7 +463,8 @@ public class HttpHelper { private class PostJsonHelper extends GetStringHelper { private JSONObject mJo; - public PostJsonHelper(JSONObject jo) { + public PostJsonHelper(String url, JSONObject jo) { + super(url); mJo = jo; } @@ -413,6 +485,17 @@ public class HttpHelper { } private class GetImageHelper implements RequestHelper { + private String mUrl; + + public GetImageHelper(String url) { + mUrl = url; + } + + @Override + public URL getUrl() throws MalformedURLException { + return new URL(mUrl); + } + @Override public void onBeforeConnect(HttpURLConnection conn) throws Exception { @@ -427,6 +510,9 @@ public class HttpHelper { throw new GetBodyException(); return bmp; } + + @Override + public void onGetException(Exception e) {} } public interface OnDownloadListener { @@ -437,14 +523,10 @@ public class HttpHelper { */ public void onDownloadStartDownload(int totalSize); public void onDownloadStatusUpdate(int downloadSize, int totalSize); - /** - * FAILED or COMPLETED or STOPED - * @param status - */ public void onDownloadOver(int status, String eMsg); } - public class DownloadControlor { + public static class DownloadControlor { private boolean mStop = false; public void stop() { @@ -461,24 +543,57 @@ public class HttpHelper { } private class DownloadHelper implements RequestHelper { + private String mUrl; private File mDir; private String mFileName; + private File mFile; + private boolean mIsProxy; private DownloadControlor mControlor; private OnDownloadListener mListener; private int mContentLength; private int mReceivedSize; - public DownloadHelper(File dir, String fileName, DownloadControlor controlor, OnDownloadListener listener) { + public DownloadHelper(String url, File dir, String fileName, boolean isProxy, + DownloadControlor controlor, OnDownloadListener listener) { + mUrl = url; mDir = dir; mFileName = fileName; + mIsProxy = isProxy; mControlor = controlor; mListener = listener; } + public String getProxyUrl() { + String proxyUrl = null; + synchronized(sProxyIndexLock) { + proxyUrl = "http://proxy000" + sProxyIndex + ".herokuapp.com/proxy"; + if (++sProxyIndex > 8) + sProxyIndex = 1; + } + return proxyUrl; + } + + @Override + public URL getUrl() throws MalformedURLException { + return new URL(mIsProxy? getProxyUrl() : mUrl); + } + @Override public void onBeforeConnect(HttpURLConnection conn) throws Exception { - conn.setRequestMethod("GET"); - conn.addRequestProperty("Range", "bytes=0-"); + if (mIsProxy) { + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setUseCaches(false); + conn.setRequestMethod("POST"); + + DataOutputStream out = new DataOutputStream(conn.getOutputStream()); + out.writeBytes("{\"url\":\"" + mUrl + "\"}"); + out.flush(); + out.close(); + } else { + conn.setRequestMethod("GET"); + conn.setRequestProperty("Range", "bytes=0-"); + } mListener.onDownloadStartConnect(); } @@ -516,15 +631,24 @@ public class HttpHelper { // Make sure parent exist mDir.mkdirs(); - File file = new File(mDir, mFileName); - try { - transferData(conn.getInputStream(), new FileOutputStream(file)); - return DOWNLOAD_OK; - } catch (StopRequestException e) { - return DOWNLOAD_STOP; - } catch (Exception e) { - throw e; - } + mFile = new File(mDir, mFileName); + // Transfer + transferData(conn.getInputStream(), new FileOutputStream(mFile)); + // Callback + mListener.onDownloadOver(DOWNLOAD_OK_CODE, null); + return DOWNLOAD_OK_STR; + } + + @Override + public void onGetException(Exception e) { + // Delete unfinished file + if (mFile != null) + mFile.delete(); + // Callback + if (e instanceof StopRequestException) + mListener.onDownloadOver(DOWNLOAD_STOP_CODE, getEMsg()); + else + mListener.onDownloadOver(DOWNLOAD_STOP_CODE, getEMsg()); } private void transferData(InputStream in, OutputStream out) @@ -558,7 +682,7 @@ public class HttpHelper { * @return */ public String checkSadPanda() { - return (String)requst(new CheckSpHelper(), EhClient.EX_HEADER); + return (String)requst(new CheckSpHelper()); } /** @@ -567,7 +691,7 @@ public class HttpHelper { * @return */ public String get(String url) { - return (String)requst(new GetHelper(), url); + return (String)requst(new GetHelper(url)); } /** @@ -577,7 +701,7 @@ public class HttpHelper { * @return */ public String postForm(String url, String[][] args) { - return (String)requst(new PostFormHelper(args), url); + return (String)requst(new PostFormHelper(url, args)); } /** @@ -587,7 +711,7 @@ public class HttpHelper { * @return */ public String postJson(String url, JSONObject json) { - return (String)requst(new PostJsonHelper(json), url); + return (String)requst(new PostJsonHelper(url, json)); } /** @@ -596,13 +720,13 @@ public class HttpHelper { * @return */ public Bitmap getImage(String url) { - return (Bitmap)requst(new GetImageHelper(), url); + return (Bitmap)requst(new GetImageHelper(url)); } - public String download(String url, File dir, String file, + public String download(String url, File dir, String file, boolean isProxy, DownloadControlor controlor, OnDownloadListener listener) { - return (String)requst(new DownloadHelper(dir, file, - controlor, listener), url); + return (String)requst(new DownloadHelper(url, dir, file, isProxy, + controlor, listener)); } /** Exceptions **/ diff --git a/src/com/hippo/ehviewer/ui/DetailSectionFragment.java b/src/com/hippo/ehviewer/ui/DetailSectionFragment.java index 5e07e4c65..68721b47e 100644 --- a/src/com/hippo/ehviewer/ui/DetailSectionFragment.java +++ b/src/com/hippo/ehviewer/ui/DetailSectionFragment.java @@ -811,8 +811,8 @@ public class DetailSectionFragment extends Fragment new SuperToast(mActivity).setMessage(R.string.vote_succeeded).show(); DetailParser parser = new DetailParser(); - parser.setMode(DetailParser.TAG); - if (parser.parser(tagPane) == DetailParser.TAG) { + if (parser.parser(tagPane, DetailParser.TAG) == + DetailParser.TAG) { mGalleryDetail.tags = parser.tags; addTags(); } else { diff --git a/src/com/hippo/ehviewer/util/Config.java b/src/com/hippo/ehviewer/util/Config.java index 2171b6b90..bfd9a1e1e 100644 --- a/src/com/hippo/ehviewer/util/Config.java +++ b/src/com/hippo/ehviewer/util/Config.java @@ -328,7 +328,7 @@ public class Config { private static final int DEFAULT_DEFAULT_CAT = 0; // m for normal, l for large - private static final String KEY_PREVIEW_MODE = "preview_mode"; + public static final String KEY_PREVIEW_MODE = "preview_mode"; public static final String PREVIEW_MODE_NORMAL = "m"; public static final String PREVIEW_MODE_LARGE = "l"; private static final String DEFAULT_PREVIEW_MODE = PREVIEW_MODE_LARGE;