Home | History | Annotate | Download | only in format
      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 #ifndef AAPT_FORMAT_CONTAINER_H
     18 #define AAPT_FORMAT_CONTAINER_H
     19 
     20 #include <inttypes.h>
     21 
     22 #include "google/protobuf/io/coded_stream.h"
     23 #include "google/protobuf/io/zero_copy_stream.h"
     24 
     25 #include "Resources.pb.h"
     26 #include "ResourcesInternal.pb.h"
     27 #include "io/Io.h"
     28 #include "io/Util.h"
     29 #include "util/BigBuffer.h"
     30 
     31 namespace aapt {
     32 
     33 enum ContainerEntryType : uint8_t {
     34   kResTable = 0x00u,
     35   kResFile = 0x01u,
     36 };
     37 
     38 class ContainerWriter {
     39  public:
     40   explicit ContainerWriter(::google::protobuf::io::ZeroCopyOutputStream* out, size_t entry_count);
     41 
     42   bool AddResTableEntry(const pb::ResourceTable& table);
     43   bool AddResFileEntry(const pb::internal::CompiledFile& file, io::KnownSizeInputStream* in);
     44   bool HadError() const;
     45   std::string GetError() const;
     46 
     47  private:
     48   DISALLOW_COPY_AND_ASSIGN(ContainerWriter);
     49 
     50   ::google::protobuf::io::ZeroCopyOutputStream* out_;
     51   size_t total_entry_count_;
     52   size_t current_entry_count_;
     53   std::string error_;
     54 };
     55 
     56 class ContainerReader;
     57 
     58 class ContainerReaderEntry {
     59  public:
     60   ContainerEntryType Type() const;
     61 
     62   bool GetResTable(pb::ResourceTable* out_table);
     63   bool GetResFileOffsets(pb::internal::CompiledFile* out_file, off64_t* out_offset,
     64                          size_t* out_len);
     65 
     66   bool HadError() const;
     67   std::string GetError() const;
     68 
     69  private:
     70   DISALLOW_COPY_AND_ASSIGN(ContainerReaderEntry);
     71 
     72   friend class ContainerReader;
     73 
     74   explicit ContainerReaderEntry(ContainerReader* reader);
     75 
     76   ContainerReader* reader_;
     77   ContainerEntryType type_ = ContainerEntryType::kResTable;
     78   size_t length_ = 0u;
     79 };
     80 
     81 class ContainerReader {
     82  public:
     83   explicit ContainerReader(io::InputStream* in);
     84 
     85   ContainerReaderEntry* Next();
     86 
     87   bool HadError() const;
     88   std::string GetError() const;
     89 
     90  private:
     91   DISALLOW_COPY_AND_ASSIGN(ContainerReader);
     92 
     93   friend class ContainerReaderEntry;
     94 
     95   io::InputStream* in_;
     96   io::ZeroCopyInputAdaptor adaptor_;
     97   ::google::protobuf::io::CodedInputStream coded_in_;
     98   size_t total_entry_count_;
     99   size_t current_entry_count_;
    100   ContainerReaderEntry entry_;
    101   std::string error_;
    102 };
    103 
    104 }  // namespace aapt
    105 
    106 #endif /* AAPT_FORMAT_CONTAINER_H */
    107