1ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley/*
2ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * Copyright (C) 2015, The Android Open Source Project
3ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley *
4ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * Licensed under the Apache License, Version 2.0 (the "License");
5ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * you may not use this file except in compliance with the License.
6ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * You may obtain a copy of the License at
7ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley *
8ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley *     http://www.apache.org/licenses/LICENSE-2.0
9ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley *
10ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * Unless required by applicable law or agreed to in writing, software
11ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * distributed under the License is distributed on an "AS IS" BASIS,
12ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * See the License for the specific language governing permissions and
14ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley * limitations under the License.
15ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley */
16ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
17ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley#include "line_reader.h"
18ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
19ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley#include <fstream>
20ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley#include <sstream>
21ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
22ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileyusing std::istringstream;
23ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileyusing std::ifstream;
24ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileyusing std::string;
25ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileyusing std::unique_ptr;
26ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
27ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileynamespace android {
28ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileynamespace aidl {
29ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
30ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileyclass FileLineReader : public LineReader {
31ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley public:
32ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  FileLineReader() = default;
33ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  virtual ~FileLineReader() {
34ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley    input_stream_.close();
35ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  }
36ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
37ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  bool Init(const std::string& file_path) {
38ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley    input_stream_.open(file_path, ifstream::in | ifstream::binary);
39ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley    return input_stream_.is_open() && input_stream_.good();
40ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  }
41ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
42ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  bool ReadLine(string* line) override {
43ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley    if (!input_stream_.good()) {
44ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley      return false;
45ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley    }
46ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley    line->clear();
47ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley    std::getline(input_stream_, *line);
48ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley    return true;
49ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  }
50ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
51ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley private:
52ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  ifstream input_stream_;
53ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
54ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  DISALLOW_COPY_AND_ASSIGN(FileLineReader);
55ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley};  // class FileLineReader
56ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
57ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileyclass MemoryLineReader : public LineReader {
58ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley public:
59e4fecc7754e3829f09abefcc35630ef0b110b01eChih-Hung Hsieh  explicit MemoryLineReader(const string& contents) : input_stream_(contents) {}
60ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  virtual ~MemoryLineReader() = default;
61ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
62ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  bool ReadLine(string* line) override {
63ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley    if (!input_stream_.good()) {
64ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley      return false;
65ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley    }
66ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley    line->clear();
67ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley    std::getline(input_stream_, *line);
68ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley    return true;
69ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  }
70ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
71ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley private:
72ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  istringstream input_stream_;
73ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
74ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  DISALLOW_COPY_AND_ASSIGN(MemoryLineReader);
75ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley};  // class MemoryLineReader
76ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
77ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileyunique_ptr<LineReader> LineReader::ReadFromFile(const string& file_path) {
78ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  unique_ptr<FileLineReader> file_reader(new FileLineReader());
79ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  unique_ptr<LineReader> ret;
80ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  if (file_reader->Init(file_path)) {
81ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley    ret.reset(file_reader.release());
82ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  }
83ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  return ret;
84ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley}
85ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
86ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileyunique_ptr<LineReader> LineReader::ReadFromMemory(const string& contents) {
87ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  return unique_ptr<LineReader>(new MemoryLineReader(contents));
88ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley}
89ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
90ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley}  // namespace android
91ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley}  // namespace aidl
92