| // Copyright (c) 2013 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "mist/config_loader.h" |
| |
| #include <fcntl.h> |
| |
| #include <utility> |
| |
| #include <base/files/file_path.h> |
| #include <base/files/scoped_file.h> |
| #include <base/posix/eintr_wrapper.h> |
| #include <google/protobuf/io/zero_copy_stream_impl.h> |
| #include <google/protobuf/text_format.h> |
| |
| #include "mist/proto_bindings/config.pb.h" |
| #include "mist/proto_bindings/usb_modem_info.pb.h" |
| |
| using base::FilePath; |
| using std::unique_ptr; |
| |
| namespace mist { |
| |
| namespace { |
| |
| const char kDefaultConfigFile[] = "/usr/share/mist/default.conf"; |
| |
| } // namespace |
| |
| ConfigLoader::ConfigLoader() {} |
| |
| ConfigLoader::~ConfigLoader() {} |
| |
| bool ConfigLoader::LoadDefaultConfig() { |
| return LoadConfig(FilePath(kDefaultConfigFile)); |
| } |
| |
| bool ConfigLoader::LoadConfig(const FilePath& file_path) { |
| int fd = HANDLE_EINTR(open(file_path.MaybeAsASCII().c_str(), O_RDONLY)); |
| if (fd == -1) { |
| PLOG(ERROR) << "Could not open config file '" << file_path.MaybeAsASCII() |
| << "'"; |
| return false; |
| } |
| |
| base::ScopedFD scoped_fd(fd); |
| google::protobuf::io::FileInputStream file_stream(fd); |
| |
| unique_ptr<Config> config(new Config()); |
| if (!google::protobuf::TextFormat::Parse(&file_stream, config.get())) { |
| LOG(ERROR) << "Could not parse config file '" << file_path.MaybeAsASCII() |
| << "'"; |
| return false; |
| } |
| |
| config_ = std::move(config); |
| return true; |
| } |
| |
| const UsbModemInfo* ConfigLoader::GetUsbModemInfo( |
| uint16_t vendor_id, uint16_t product_id) const { |
| if (!config_) |
| return nullptr; |
| |
| for (int i = 0; i < config_->usb_modem_info_size(); ++i) { |
| const UsbModemInfo& usb_modem_info = config_->usb_modem_info(i); |
| const UsbId& usb_id = usb_modem_info.initial_usb_id(); |
| if (usb_id.vendor_id() == vendor_id && usb_id.product_id() == product_id) |
| return &usb_modem_info; |
| } |
| |
| return nullptr; |
| } |
| |
| } // namespace mist |