Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8b8e0e6d authored by Andreas Huber's avatar Andreas Huber Committed by Android Git Automerger
Browse files

am 744043fc: Update FileSource to also accept a file descriptor and a range.

Merge commit '744043fcbf48c32c2051f222eca552fa2df5dfcb' into eclair-mr2-plus-aosp

* commit '744043fcbf48c32c2051f222eca552fa2df5dfcb':
  Update FileSource to also accept a file descriptor and a range.
parents 35c47da5 03475f5a
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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 &);
+35 −4
Original line number Diff line number Diff line
@@ -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);
}

status_t FileSource::getSize(off_t *size) {
    if (mLength >= 0) {
        *size = mLength;

        return OK;
    }

    fseek(mFile, SEEK_END, 0);
    *size = ftello(mFile);

    return result;
    return OK;
}

}  // namespace android