xref: /aosp_15_r20/frameworks/base/tools/aapt2/io/StringStream.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker #ifndef AAPT_IO_STRINGSTREAM_H
18*d57664e9SAndroid Build Coastguard Worker #define AAPT_IO_STRINGSTREAM_H
19*d57664e9SAndroid Build Coastguard Worker 
20*d57664e9SAndroid Build Coastguard Worker #include <memory>
21*d57664e9SAndroid Build Coastguard Worker 
22*d57664e9SAndroid Build Coastguard Worker #include "android-base/macros.h"
23*d57664e9SAndroid Build Coastguard Worker #include "androidfw/Streams.h"
24*d57664e9SAndroid Build Coastguard Worker #include "androidfw/StringPiece.h"
25*d57664e9SAndroid Build Coastguard Worker 
26*d57664e9SAndroid Build Coastguard Worker namespace aapt {
27*d57664e9SAndroid Build Coastguard Worker namespace io {
28*d57664e9SAndroid Build Coastguard Worker 
29*d57664e9SAndroid Build Coastguard Worker class StringInputStream : public android::KnownSizeInputStream {
30*d57664e9SAndroid Build Coastguard Worker  public:
31*d57664e9SAndroid Build Coastguard Worker   explicit StringInputStream(android::StringPiece str);
32*d57664e9SAndroid Build Coastguard Worker 
33*d57664e9SAndroid Build Coastguard Worker   bool Next(const void** data, size_t* size) override;
34*d57664e9SAndroid Build Coastguard Worker 
35*d57664e9SAndroid Build Coastguard Worker   void BackUp(size_t count) override;
36*d57664e9SAndroid Build Coastguard Worker 
37*d57664e9SAndroid Build Coastguard Worker   size_t ByteCount() const override;
38*d57664e9SAndroid Build Coastguard Worker 
HadError()39*d57664e9SAndroid Build Coastguard Worker   inline bool HadError() const override {
40*d57664e9SAndroid Build Coastguard Worker     return false;
41*d57664e9SAndroid Build Coastguard Worker   }
42*d57664e9SAndroid Build Coastguard Worker 
GetError()43*d57664e9SAndroid Build Coastguard Worker   inline std::string GetError() const override {
44*d57664e9SAndroid Build Coastguard Worker     return {};
45*d57664e9SAndroid Build Coastguard Worker   }
46*d57664e9SAndroid Build Coastguard Worker 
47*d57664e9SAndroid Build Coastguard Worker   size_t TotalSize() const override;
48*d57664e9SAndroid Build Coastguard Worker 
49*d57664e9SAndroid Build Coastguard Worker   bool ReadFullyAtOffset(void* data, size_t byte_count, off64_t offset) override;
50*d57664e9SAndroid Build Coastguard Worker 
51*d57664e9SAndroid Build Coastguard Worker  private:
52*d57664e9SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(StringInputStream);
53*d57664e9SAndroid Build Coastguard Worker 
54*d57664e9SAndroid Build Coastguard Worker   android::StringPiece str_;
55*d57664e9SAndroid Build Coastguard Worker   size_t offset_;
56*d57664e9SAndroid Build Coastguard Worker };
57*d57664e9SAndroid Build Coastguard Worker 
58*d57664e9SAndroid Build Coastguard Worker class StringOutputStream : public android::OutputStream {
59*d57664e9SAndroid Build Coastguard Worker  public:
60*d57664e9SAndroid Build Coastguard Worker   explicit StringOutputStream(std::string* str, size_t buffer_capacity = 4096u);
61*d57664e9SAndroid Build Coastguard Worker 
62*d57664e9SAndroid Build Coastguard Worker   ~StringOutputStream();
63*d57664e9SAndroid Build Coastguard Worker 
64*d57664e9SAndroid Build Coastguard Worker   bool Next(void** data, size_t* size) override;
65*d57664e9SAndroid Build Coastguard Worker 
66*d57664e9SAndroid Build Coastguard Worker   void BackUp(size_t count) override;
67*d57664e9SAndroid Build Coastguard Worker 
68*d57664e9SAndroid Build Coastguard Worker   void Flush();
69*d57664e9SAndroid Build Coastguard Worker 
70*d57664e9SAndroid Build Coastguard Worker   size_t ByteCount() const override;
71*d57664e9SAndroid Build Coastguard Worker 
HadError()72*d57664e9SAndroid Build Coastguard Worker   inline bool HadError() const override {
73*d57664e9SAndroid Build Coastguard Worker     return false;
74*d57664e9SAndroid Build Coastguard Worker   }
75*d57664e9SAndroid Build Coastguard Worker 
GetError()76*d57664e9SAndroid Build Coastguard Worker   inline std::string GetError() const override {
77*d57664e9SAndroid Build Coastguard Worker     return {};
78*d57664e9SAndroid Build Coastguard Worker   }
79*d57664e9SAndroid Build Coastguard Worker 
80*d57664e9SAndroid Build Coastguard Worker  private:
81*d57664e9SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(StringOutputStream);
82*d57664e9SAndroid Build Coastguard Worker 
83*d57664e9SAndroid Build Coastguard Worker   void FlushImpl();
84*d57664e9SAndroid Build Coastguard Worker 
85*d57664e9SAndroid Build Coastguard Worker   std::string* str_;
86*d57664e9SAndroid Build Coastguard Worker   size_t buffer_capacity_;
87*d57664e9SAndroid Build Coastguard Worker   size_t buffer_offset_;
88*d57664e9SAndroid Build Coastguard Worker   std::unique_ptr<char[]> buffer_;
89*d57664e9SAndroid Build Coastguard Worker };
90*d57664e9SAndroid Build Coastguard Worker 
91*d57664e9SAndroid Build Coastguard Worker }  // namespace io
92*d57664e9SAndroid Build Coastguard Worker }  // namespace aapt
93*d57664e9SAndroid Build Coastguard Worker 
94*d57664e9SAndroid Build Coastguard Worker #endif  // AAPT_IO_STRINGSTREAM_H
95