Home | History | Annotate | Download | only in permissions
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/common/extensions/permissions/usb_device_permission_data.h"
      6 
      7 #include <string>
      8 #include <vector>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/memory/scoped_ptr.h"
     12 #include "base/strings/string_number_conversions.h"
     13 #include "base/strings/string_split.h"
     14 #include "base/values.h"
     15 #include "chrome/common/extensions/permissions/api_permission.h"
     16 #include "chrome/common/extensions/permissions/usb_device_permission.h"
     17 
     18 namespace {
     19 
     20 const char* kProductIdKey = "productId";
     21 const char* kVendorIdKey = "vendorId";
     22 const char* kInterfaceIdKey = "interfaceId";
     23 
     24 }  // namespace
     25 
     26 namespace extensions {
     27 
     28 UsbDevicePermissionData::UsbDevicePermissionData()
     29   : vendor_id_(0), product_id_(0), interface_id_(ANY_INTERFACE) {
     30 }
     31 
     32 UsbDevicePermissionData::UsbDevicePermissionData(uint16 vendor_id,
     33                                                  uint16 product_id,
     34                                                  int interface_id)
     35   : vendor_id_(vendor_id),
     36     product_id_(product_id),
     37     interface_id_(interface_id) {
     38 }
     39 
     40 bool UsbDevicePermissionData::Check(
     41     const APIPermission::CheckParam* param) const {
     42   if (!param)
     43     return false;
     44   const UsbDevicePermission::CheckParam& specific_param =
     45       *static_cast<const UsbDevicePermission::CheckParam*>(param);
     46   return vendor_id_ == specific_param.vendor_id &&
     47       product_id_ == specific_param.product_id &&
     48       interface_id_ == specific_param.interface_id;
     49 }
     50 
     51 scoped_ptr<base::Value> UsbDevicePermissionData::ToValue() const {
     52   base::DictionaryValue* result = new base::DictionaryValue();
     53   result->SetInteger(kVendorIdKey, vendor_id_);
     54   result->SetInteger(kProductIdKey, product_id_);
     55   result->SetInteger(kInterfaceIdKey, interface_id_);
     56   return scoped_ptr<base::Value>(result);
     57 }
     58 
     59 bool UsbDevicePermissionData::FromValue(const base::Value* value) {
     60   if (!value)
     61     return false;
     62 
     63   const base::DictionaryValue* dict_value;
     64   if (!value->GetAsDictionary(&dict_value))
     65     return false;
     66 
     67   int temp;
     68   if (!dict_value->GetInteger(kVendorIdKey, &temp))
     69     return false;
     70   if (temp < 0 || temp > kuint16max)
     71     return false;
     72   vendor_id_ = temp;
     73 
     74   if (!dict_value->GetInteger(kProductIdKey, &temp))
     75     return false;
     76   if (temp < 0 || temp > kuint16max)
     77     return false;
     78   product_id_ = temp;
     79 
     80   if (!dict_value->GetInteger(kInterfaceIdKey, &temp))
     81     interface_id_ = ANY_INTERFACE;
     82   else
     83     interface_id_ = temp;
     84 
     85   return true;
     86 }
     87 
     88 bool UsbDevicePermissionData::operator<(
     89     const UsbDevicePermissionData& rhs) const {
     90   if (vendor_id_ == rhs.vendor_id_) {
     91     if (product_id_ == rhs.product_id_)
     92       return interface_id_ < rhs.interface_id_;
     93 
     94     return product_id_ < rhs.product_id_;
     95   }
     96   return vendor_id_ < rhs.vendor_id_;
     97 }
     98 
     99 bool UsbDevicePermissionData::operator==(
    100     const UsbDevicePermissionData& rhs) const {
    101   return vendor_id_ == rhs.vendor_id_ &&
    102       product_id_ == rhs.product_id_ &&
    103       interface_id_ == rhs.interface_id_;
    104 }
    105 
    106 }  // namespace extensions
    107