Update FileSource to also accept a file descriptor and a range.

This commit is contained in:
Andreas Huber
2009-11-16 15:34:01 -08:00
parent 8c80818724
commit 744043fcbf
2 changed files with 40 additions and 4 deletions

View File

@@ -29,16 +29,21 @@ namespace android {
class FileSource : public DataSource {
public:
FileSource(const char *filename);
FileSource(int fd, int64_t offset, int64_t length);
virtual status_t initCheck() const;
virtual ssize_t readAt(off_t offset, void *data, size_t size);
virtual status_t getSize(off_t *size);
protected:
virtual ~FileSource();
private:
FILE *mFile;
int64_t mOffset;
int64_t mLength;
Mutex mLock;
FileSource(const FileSource &);

View File

@@ -20,7 +20,17 @@
namespace android {
FileSource::FileSource(const char *filename)
: mFile(fopen(filename, "rb")) {
: mFile(fopen(filename, "rb")),
mOffset(0),
mLength(-1) {
}
FileSource::FileSource(int fd, int64_t offset, int64_t length)
: mFile(fdopen(fd, "rb")),
mOffset(offset),
mLength(length) {
CHECK(offset >= 0);
CHECK(length >= 0);
}
FileSource::~FileSource() {
@@ -37,12 +47,33 @@ status_t FileSource::initCheck() const {
ssize_t FileSource::readAt(off_t offset, void *data, size_t size) {
Mutex::Autolock autoLock(mLock);
int err = fseeko(mFile, offset, SEEK_SET);
if (mLength >= 0) {
if (offset >= mLength) {
return 0; // read beyond EOF.
}
int64_t numAvailable = mLength - offset;
if ((int64_t)size > numAvailable) {
size = numAvailable;
}
}
int err = fseeko(mFile, offset + mOffset, SEEK_SET);
CHECK(err != -1);
ssize_t result = fread(data, 1, size, mFile);
return fread(data, 1, size, mFile);
}
return result;
status_t FileSource::getSize(off_t *size) {
if (mLength >= 0) {
*size = mLength;
return OK;
}
fseek(mFile, SEEK_END, 0);
*size = ftello(mFile);
return OK;
}
} // namespace android