Home | History | Annotate | Download | only in util
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #pragma once
     18 
     19 #include <cstdint>
     20 #include <string>
     21 
     22 #include <android/util/EncodedBuffer.h>
     23 
     24 namespace android {
     25 namespace util {
     26 
     27 /**
     28  * A ProtoReader on top of a file descriptor.
     29  */
     30 class ProtoFileReader : public ProtoReader
     31 {
     32 public:
     33     /**
     34      * Read from this file descriptor.
     35      */
     36     ProtoFileReader(int fd);
     37 
     38     /**
     39      * Does NOT close the file.
     40      */
     41     virtual ~ProtoFileReader();
     42 
     43     // From ProtoReader.
     44     virtual ssize_t size() const;
     45     virtual size_t bytesRead() const;
     46     virtual uint8_t const* readBuffer();
     47     virtual size_t currentToRead();
     48     virtual bool hasNext();
     49     virtual uint8_t next();
     50     virtual uint64_t readRawVarint();
     51     virtual void move(size_t amt);
     52 
     53     status_t getError() const;
     54 private:
     55     int mFd;                // File descriptor for input.
     56     status_t mStatus;       // Any errors encountered during read.
     57     ssize_t mSize;          // How much total data there is, or -1 if we can't tell.
     58     size_t mPos;            // How much data has been read so far.
     59     size_t mOffset;         // Offset in current buffer.
     60     size_t mMaxOffset;      // How much data is left to read in mBuffer.
     61     const int mChunkSize;   // Size of mBuffer.
     62     uint8_t mBuffer[32*1024];
     63 
     64     /**
     65      * If there is currently more data to read in the buffer, returns true.
     66      * If there is not more, then tries to read.  If more data can be read,
     67      * it does so and returns true.  If there is no more data, returns false.
     68      * Resets mOffset and mMaxOffset as necessary.  Does not advance mOffset.
     69      */
     70     bool ensure_data();
     71 };
     72 
     73 }
     74 }
     75 
     76