fix: LwHttp cache writes
This commit is contained in:
parent
dc74949736
commit
154da99d40
@ -57,7 +57,6 @@ public class LwHttp {
|
||||
private Socket mSocket;
|
||||
private OutputStream mCommandStream;
|
||||
private Buffer mResponseStream;
|
||||
private OutputStream mCacheOutputStream;
|
||||
private long mLastRequest = 0;
|
||||
private SocketAddress mSockAddr;
|
||||
|
||||
@ -109,7 +108,7 @@ public class LwHttp {
|
||||
// to avoid a copy in PbfDecoder one could manage the buffer
|
||||
// array directly and provide access to it.
|
||||
static class Buffer extends BufferedInputStream {
|
||||
OutputStream mCacheOutputstream;
|
||||
OutputStream mCache;
|
||||
int sumRead = 0;
|
||||
int mContentLength;
|
||||
|
||||
@ -118,7 +117,7 @@ public class LwHttp {
|
||||
}
|
||||
|
||||
public void setCache(OutputStream cache) {
|
||||
mCacheOutputstream = cache;
|
||||
mCache = cache;
|
||||
}
|
||||
|
||||
public void start(int length) {
|
||||
@ -126,6 +125,10 @@ public class LwHttp {
|
||||
mContentLength = length;
|
||||
}
|
||||
|
||||
public boolean finishedReading() {
|
||||
return sumRead == mContentLength;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int read() throws IOException {
|
||||
if (sumRead >= mContentLength)
|
||||
@ -138,8 +141,8 @@ public class LwHttp {
|
||||
if (DBG)
|
||||
log.debug("read {} {}", sumRead, mContentLength);
|
||||
|
||||
if (mCacheOutputstream != null)
|
||||
mCacheOutputstream.write(data);
|
||||
if (mCache != null)
|
||||
mCache.write(data);
|
||||
|
||||
return data;
|
||||
}
|
||||
@ -152,20 +155,20 @@ public class LwHttp {
|
||||
return -1;
|
||||
|
||||
int len = super.read(buffer, offset, byteCount);
|
||||
sumRead += len;
|
||||
|
||||
if (DBG)
|
||||
log.debug("read {} {} {}", len, sumRead, mContentLength);
|
||||
|
||||
if (mCacheOutputstream != null)
|
||||
mCacheOutputstream.write(buffer, offset, byteCount);
|
||||
if (len <= 0)
|
||||
return len;
|
||||
|
||||
sumRead += len;
|
||||
|
||||
if (mCache != null)
|
||||
mCache.write(buffer, offset, len);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
public byte[] getArray() {
|
||||
return buf;
|
||||
}
|
||||
}
|
||||
|
||||
public void close() {
|
||||
@ -256,8 +259,6 @@ public class LwHttp {
|
||||
is.reset();
|
||||
is.mark(0);
|
||||
is.skip(end);
|
||||
|
||||
is.setCache(mCacheOutputStream);
|
||||
is.start(contentLength);
|
||||
|
||||
if (mInflateContent)
|
||||
@ -376,16 +377,26 @@ public class LwHttp {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void setOutputStream(OutputStream outputStream) {
|
||||
mCacheOutputStream = outputStream;
|
||||
public void setCache(OutputStream os) {
|
||||
mResponseStream.setCache(os);
|
||||
}
|
||||
|
||||
public void requestCompleted(boolean keepConnection) {
|
||||
public boolean requestCompleted(boolean success) {
|
||||
mLastRequest = System.nanoTime();
|
||||
mCacheOutputStream = null;
|
||||
mResponseStream.setCache(null);
|
||||
|
||||
if (!keepConnection)
|
||||
if (!mResponseStream.finishedReading()) {
|
||||
log.debug("invalid buffer position");
|
||||
close();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!success) {
|
||||
close();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -24,6 +24,8 @@ import java.net.UnknownHostException;
|
||||
|
||||
import org.oscim.tiling.MapTile;
|
||||
import org.oscim.tiling.source.ITileCache;
|
||||
import org.oscim.tiling.source.ITileCache.TileReader;
|
||||
import org.oscim.tiling.source.ITileCache.TileWriter;
|
||||
import org.oscim.tiling.source.ITileDataSink;
|
||||
import org.oscim.tiling.source.ITileDataSource;
|
||||
import org.oscim.tiling.source.ITileDecoder;
|
||||
@ -38,30 +40,27 @@ public class UrlTileDataSource implements ITileDataSource {
|
||||
protected final LwHttp mConn;
|
||||
protected final ITileDecoder mTileDecoder;
|
||||
protected final ITileCache mTileCache;
|
||||
protected final boolean mUseCache;
|
||||
|
||||
public UrlTileDataSource(TileSource tileSource, ITileDecoder tileDecoder, LwHttp conn) {
|
||||
mTileDecoder = tileDecoder;
|
||||
mTileCache = tileSource.tileCache;
|
||||
mUseCache = (mTileCache != null);
|
||||
mConn = conn;
|
||||
}
|
||||
|
||||
@Override
|
||||
public QueryResult executeQuery(MapTile tile, ITileDataSink sink) {
|
||||
|
||||
ITileCache.TileWriter cacheWriter = null;
|
||||
|
||||
if (mTileCache != null) {
|
||||
ITileCache.TileReader c = mTileCache.getTile(tile);
|
||||
if (c == null) {
|
||||
cacheWriter = mTileCache.writeTile(tile);
|
||||
} else {
|
||||
if (mUseCache) {
|
||||
TileReader c = mTileCache.getTile(tile);
|
||||
if (c != null) {
|
||||
InputStream is = c.getInputStream();
|
||||
try {
|
||||
if (mTileDecoder.decode(tile, sink, is)) {
|
||||
if (mTileDecoder.decode(tile, sink, is))
|
||||
return QueryResult.SUCCESS;
|
||||
}
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
log.debug("{} Cache read: {}", tile, e);
|
||||
} finally {
|
||||
IOUtils.closeQuietly(is);
|
||||
}
|
||||
@ -69,16 +68,19 @@ public class UrlTileDataSource implements ITileDataSource {
|
||||
}
|
||||
|
||||
boolean success = false;
|
||||
TileWriter cache = null;
|
||||
try {
|
||||
if (cacheWriter != null)
|
||||
mConn.setOutputStream(cacheWriter.getOutputStream());
|
||||
|
||||
InputStream is;
|
||||
if (!mConn.sendRequest(tile)) {
|
||||
log.debug("{} Request failed", tile);
|
||||
} else if ((is = mConn.readHeader()) == null) {
|
||||
log.debug("{} Network Error", tile);
|
||||
} else {
|
||||
if (mUseCache) {
|
||||
cache = mTileCache.writeTile(tile);
|
||||
mConn.setCache(cache.getOutputStream());
|
||||
}
|
||||
|
||||
success = mTileDecoder.decode(tile, sink, is);
|
||||
}
|
||||
} catch (SocketException e) {
|
||||
@ -92,8 +94,8 @@ public class UrlTileDataSource implements ITileDataSource {
|
||||
} finally {
|
||||
mConn.requestCompleted(success);
|
||||
|
||||
if (cacheWriter != null)
|
||||
cacheWriter.complete(success);
|
||||
if (cache != null)
|
||||
cache.complete(success);
|
||||
}
|
||||
return success ? QueryResult.SUCCESS : QueryResult.FAILED;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user