tikhomirov@673: /* tikhomirov@673: * Copyright (c) 2013 TMate Software Ltd tikhomirov@673: * tikhomirov@673: * This program is free software; you can redistribute it and/or modify tikhomirov@673: * it under the terms of the GNU General Public License as published by tikhomirov@673: * the Free Software Foundation; version 2 of the License. tikhomirov@673: * tikhomirov@673: * This program is distributed in the hope that it will be useful, tikhomirov@673: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@673: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@673: * GNU General Public License for more details. tikhomirov@673: * tikhomirov@673: * For information on how to redistribute this software under tikhomirov@673: * the terms of a license other than GNU General Public License tikhomirov@673: * contact TMate Software at support@hg4j.com tikhomirov@673: */ tikhomirov@673: package org.tmatesoft.hg.internal; tikhomirov@673: tikhomirov@673: import java.io.IOException; tikhomirov@673: import java.io.InputStream; tikhomirov@673: tikhomirov@673: /** tikhomirov@673: * Wrap our internal API into a public one tikhomirov@673: * tikhomirov@673: * @author Artem Tikhomirov tikhomirov@673: * @author TMate Software Ltd. tikhomirov@673: */ tikhomirov@673: public class DataAccessInputStream extends InputStream { tikhomirov@673: tikhomirov@673: private final DataAccess da; tikhomirov@673: private int bytesLeft = -1; tikhomirov@673: tikhomirov@673: public DataAccessInputStream(DataAccess dataAccess) { tikhomirov@673: da = dataAccess; tikhomirov@673: } tikhomirov@673: tikhomirov@673: @Override tikhomirov@673: public int available() throws IOException { tikhomirov@673: initAvailable(); tikhomirov@673: return bytesLeft; tikhomirov@673: } tikhomirov@673: tikhomirov@673: @Override tikhomirov@673: public int read() throws IOException { tikhomirov@673: initAvailable(); tikhomirov@673: if (bytesLeft == 0) { tikhomirov@673: return -1; tikhomirov@673: } tikhomirov@673: int rv = da.readByte(); tikhomirov@673: bytesLeft--; tikhomirov@673: return rv; tikhomirov@673: } tikhomirov@673: tikhomirov@673: @Override tikhomirov@673: public int read(byte[] b, int off, int len) throws IOException { tikhomirov@673: initAvailable(); tikhomirov@673: if (bytesLeft == 0) { tikhomirov@673: return -1; tikhomirov@673: } tikhomirov@673: if (len == 0) { tikhomirov@673: return 0; tikhomirov@673: } tikhomirov@673: int x = Math.min(len, bytesLeft); tikhomirov@673: da.readBytes(b, off, x); tikhomirov@673: bytesLeft -= x; tikhomirov@673: return x; tikhomirov@673: } tikhomirov@673: tikhomirov@673: tikhomirov@673: private void initAvailable() throws IOException { tikhomirov@673: da.reset(); tikhomirov@673: if (bytesLeft == -1) { tikhomirov@673: bytesLeft = da.length(); tikhomirov@673: } tikhomirov@673: } tikhomirov@673: }