/* * Copyright (C) 2013 Peng fei Pan <sky@xiaopan.me> * * 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 me.xiaopan.sketch.request; import java.util.HashSet; import java.util.Set; import me.xiaopan.sketch.SLogType; import me.xiaopan.sketch.Sketch; import me.xiaopan.sketch.cache.DiskCache; import me.xiaopan.sketch.util.SketchUtils; /** * 支持顺风车功能的下载请求 */ public class FreeRideDownloadRequest extends DownloadRequest implements FreeRideManager.DownloadFreeRide { private Set<FreeRideManager.DownloadFreeRide> downloadFreeRideSet; public FreeRideDownloadRequest(Sketch sketch, DownloadInfo info, DownloadOptions options, DownloadListener downloadListener, DownloadProgressListener downloadProgressListener) { super(sketch, info, options, downloadListener, downloadProgressListener); } @Override public String getDownloadFreeRideKey() { return getRealUri(); } @Override public String getDownloadFreeRideLog() { return String.format("%s@%s", SketchUtils.toHexString(this), getKey()); } @Override public boolean canByDownloadFreeRide() { DiskCache diskCache = getConfiguration().getDiskCache(); return !diskCache.isClosed() && !diskCache.isDisabled() && !getOptions().isCacheInDiskDisabled() && !isSync() && !getConfiguration().getRequestExecutor().isShutdown(); } @Override protected void submitRunDownload() { // 可以坐顺风车的话,就先尝试坐别人的,坐不上就自己成为顺风车主让别人坐 if (canByDownloadFreeRide()) { FreeRideManager freeRideManager = getConfiguration().getFreeRideManager(); if (freeRideManager.byDownloadFreeRide(this)) { return; } else { freeRideManager.registerDownloadFreeRideProvider(this); } } super.submitRunDownload(); } @Override protected void runDownload() { super.runDownload(); // 由于在submitRunDownload中会将自己注册成为顺风车主,因此一定要保证在这里取消注册 if (canByDownloadFreeRide()) { FreeRideManager freeRideManager = getConfiguration().getFreeRideManager(); freeRideManager.unregisterDownloadFreeRideProvider(this); } } @Override public synchronized void byDownloadFreeRide(FreeRideManager.DownloadFreeRide request) { if (downloadFreeRideSet == null) { synchronized (this) { if (downloadFreeRideSet == null) { downloadFreeRideSet = new HashSet<FreeRideManager.DownloadFreeRide>(); } } } downloadFreeRideSet.add(request); } @Override public Set<FreeRideManager.DownloadFreeRide> getDownloadFreeRideSet() { return downloadFreeRideSet; } @Override public synchronized boolean processDownloadFreeRide() { DiskCache diskCache = getConfiguration().getDiskCache(); DiskCache.Entry diskCacheEntry = diskCache.get(getDiskCacheKey()); if (diskCacheEntry != null) { if (SLogType.REQUEST.isEnabled()) { printLogD("from diskCache", "processDownloadFreeRide"); } downloadResult = new DownloadResult(diskCacheEntry, ImageFrom.DISK_CACHE); downloadCompleted(); return true; } else { submitRunDownload(); return false; } } }