16310a8261c922533a692fb3e74ece2da98d4bafaColin Cross/*
26310a8261c922533a692fb3e74ece2da98d4bafaColin Cross * Copyright (C) 2010 The Android Open Source Project
36310a8261c922533a692fb3e74ece2da98d4bafaColin Cross *
46310a8261c922533a692fb3e74ece2da98d4bafaColin Cross * Licensed under the Apache License, Version 2.0 (the "License");
56310a8261c922533a692fb3e74ece2da98d4bafaColin Cross * you may not use this file except in compliance with the License.
66310a8261c922533a692fb3e74ece2da98d4bafaColin Cross * You may obtain a copy of the License at
76310a8261c922533a692fb3e74ece2da98d4bafaColin Cross *
86310a8261c922533a692fb3e74ece2da98d4bafaColin Cross *      http://www.apache.org/licenses/LICENSE-2.0
96310a8261c922533a692fb3e74ece2da98d4bafaColin Cross *
106310a8261c922533a692fb3e74ece2da98d4bafaColin Cross * Unless required by applicable law or agreed to in writing, software
116310a8261c922533a692fb3e74ece2da98d4bafaColin Cross * distributed under the License is distributed on an "AS IS" BASIS,
126310a8261c922533a692fb3e74ece2da98d4bafaColin Cross * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136310a8261c922533a692fb3e74ece2da98d4bafaColin Cross * See the License for the specific language governing permissions and
146310a8261c922533a692fb3e74ece2da98d4bafaColin Cross * limitations under the License.
156310a8261c922533a692fb3e74ece2da98d4bafaColin Cross */
166310a8261c922533a692fb3e74ece2da98d4bafaColin Cross
176310a8261c922533a692fb3e74ece2da98d4bafaColin Cross#ifndef _INIT_INIT_PARSER_H_
186310a8261c922533a692fb3e74ece2da98d4bafaColin Cross#define _INIT_INIT_PARSER_H_
196310a8261c922533a692fb3e74ece2da98d4bafaColin Cross
20b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry#include <map>
2100ede7d2626f9343d330dc6f5286bba3e99e41d0Yabin Cui#include <string>
22bac3299720623f4226bca103b26260052732ad30Tom Cherry#include <vector>
2300ede7d2626f9343d330dc6f5286bba3e99e41d0Yabin Cui
24b7349902a945903f9e36a569051f5131beb0bc24Tom Cherryclass SectionParser {
25b7349902a945903f9e36a569051f5131beb0bc24Tom Cherrypublic:
26b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry    virtual ~SectionParser() {
27b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry    }
28b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry    virtual bool ParseSection(const std::vector<std::string>& args,
29b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry                              std::string* err) = 0;
30b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry    virtual bool ParseLineSection(const std::vector<std::string>& args,
31b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry                                  const std::string& filename, int line,
32b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry                                  std::string* err) const = 0;
33b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry    virtual void EndSection() = 0;
34b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry    virtual void EndFile(const std::string& filename) = 0;
35b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry};
366310a8261c922533a692fb3e74ece2da98d4bafaColin Cross
37b7349902a945903f9e36a569051f5131beb0bc24Tom Cherryclass Parser {
38b7349902a945903f9e36a569051f5131beb0bc24Tom Cherrypublic:
39b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry    static Parser& GetInstance();
40b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry    void DumpState() const;
41b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry    bool ParseConfig(const std::string& path);
42b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry    void AddSectionParser(const std::string& name,
43b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry                          std::unique_ptr<SectionParser> parser);
446310a8261c922533a692fb3e74ece2da98d4bafaColin Cross
45b7349902a945903f9e36a569051f5131beb0bc24Tom Cherryprivate:
46b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry    Parser();
47b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry
48b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry    void ParseData(const std::string& filename, const std::string& data);
49b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry    bool ParseConfigFile(const std::string& path);
50b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry    bool ParseConfigDir(const std::string& path);
51b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry
52b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry    std::map<std::string, std::unique_ptr<SectionParser>> section_parsers_;
53b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry};
548d82ea05cb0945ba6cb8bf321b9ffbd0b6932745Elliott Hughes
556310a8261c922533a692fb3e74ece2da98d4bafaColin Cross#endif
56