blob: 5b9ec6a47034f8dd3cb45e2549f91932ead8f867 [file] [log] [blame]
// 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/usb_modem_switch_context.h"
#include <memory>
#include <base/check.h>
#include <base/strings/stringprintf.h>
#include <brillo/udev/udev.h>
#include <brillo/udev/udev_device.h>
#include "mist/config_loader.h"
#include "mist/context.h"
#include "mist/proto_bindings/usb_modem_info.pb.h"
#include "mist/usb_device_event_notifier.h"
namespace mist {
UsbModemSwitchContext::UsbModemSwitchContext()
: bus_number_(0),
device_address_(0),
vendor_id_(0),
product_id_(0),
modem_info_(nullptr) {}
UsbModemSwitchContext::UsbModemSwitchContext(const std::string& sys_path,
uint8_t bus_number,
uint8_t device_address,
uint16_t vendor_id,
uint16_t product_id,
const UsbModemInfo* modem_info)
: sys_path_(sys_path),
bus_number_(bus_number),
device_address_(device_address),
vendor_id_(vendor_id),
product_id_(product_id),
modem_info_(modem_info) {}
bool UsbModemSwitchContext::InitializeFromSysPath(const Context* context,
const std::string& sys_path) {
CHECK(context);
std::unique_ptr<brillo::UdevDevice> device(
context->udev()->CreateDeviceFromSysPath(sys_path.c_str()));
if (!device) {
VLOG(1) << "Could not find device '" << sys_path << "'.";
return false;
}
uint8_t bus_number;
uint8_t device_address;
uint16_t vendor_id;
uint16_t product_id;
if (!context->usb_device_event_notifier()->GetDeviceAttributes(
device.get(), &bus_number, &device_address, &vendor_id,
&product_id)) {
VLOG(1) << "Could not get attributes of device '" << sys_path << "'.";
return false;
}
const UsbModemInfo* modem_info =
context->config_loader()->GetUsbModemInfo(vendor_id, product_id);
if (!modem_info) {
VLOG(1) << "Could not find USB modem info for device '" << sys_path << "'.";
return false;
}
sys_path_ = sys_path;
bus_number_ = bus_number;
device_address_ = device_address;
vendor_id_ = vendor_id;
product_id_ = product_id;
modem_info_ = modem_info;
VLOG(1) << base::StringPrintf(
"Initialized UsbModemSwitchContext("
"SysPath=%s, "
"BusNumber=%03u, "
"DeviceAddress=%03u, "
"VendorId=0x%04x, "
"ProductId=0x%04x)",
sys_path_.c_str(), bus_number_, device_address_, vendor_id_, product_id_);
return true;
}
} // namespace mist