1 /*
2 * Copyright (C) 2015, 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 #include "line_reader.h"
18
19 #include <fstream>
20 #include <sstream>
21
22 using std::istringstream;
23 using std::ifstream;
24 using std::string;
25 using std::unique_ptr;
26
27 namespace android {
28 namespace aidl {
29
30 class FileLineReader : public LineReader {
31 public:
32 FileLineReader() = default;
~FileLineReader()33 ~FileLineReader() override {
34 input_stream_.close();
35 }
36
37 // non-copyable, non-movable
38 FileLineReader(const FileLineReader&) = delete;
39 FileLineReader(FileLineReader&&) = delete;
40 FileLineReader& operator=(const FileLineReader&) = delete;
41 FileLineReader& operator=(FileLineReader&&) = delete;
42
Init(const std::string & file_path)43 bool Init(const std::string& file_path) {
44 input_stream_.open(file_path, ifstream::in | ifstream::binary);
45 return input_stream_.is_open() && input_stream_.good();
46 }
47
ReadLine(string * line)48 bool ReadLine(string* line) override {
49 if (!input_stream_.good()) {
50 return false;
51 }
52 line->clear();
53 std::getline(input_stream_, *line);
54 return true;
55 }
56
57 private:
58 ifstream input_stream_;
59 }; // class FileLineReader
60
61 class MemoryLineReader : public LineReader {
62 public:
MemoryLineReader(const string & contents)63 explicit MemoryLineReader(const string& contents) : input_stream_(contents) {}
64 ~MemoryLineReader() override = default;
65
66 // non-copyable, non-movable
67 MemoryLineReader(const MemoryLineReader&) = delete;
68 MemoryLineReader(MemoryLineReader&&) = delete;
69 MemoryLineReader& operator=(const MemoryLineReader&) = delete;
70 MemoryLineReader& operator=(MemoryLineReader&&) = delete;
71
ReadLine(string * line)72 bool ReadLine(string* line) override {
73 if (!input_stream_.good()) {
74 return false;
75 }
76 line->clear();
77 std::getline(input_stream_, *line);
78 return true;
79 }
80
81 private:
82 istringstream input_stream_;
83 }; // class MemoryLineReader
84
ReadFromFile(const string & file_path)85 unique_ptr<LineReader> LineReader::ReadFromFile(const string& file_path) {
86 unique_ptr<FileLineReader> file_reader(new FileLineReader());
87 unique_ptr<LineReader> ret;
88 if (file_reader->Init(file_path)) {
89 ret.reset(file_reader.release());
90 }
91 return ret;
92 }
93
ReadFromMemory(const string & contents)94 unique_ptr<LineReader> LineReader::ReadFromMemory(const string& contents) {
95 return unique_ptr<LineReader>(new MemoryLineReader(contents));
96 }
97
98 } // namespace aidl
99 } // namespace android
100