1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#ifndef EXTENSIONS_COMMON_PERMISSIONS_USB_DEVICE_PERMISSION_DATA_H_
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define EXTENSIONS_COMMON_PERMISSIONS_USB_DEVICE_PERMISSION_DATA_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "extensions/common/permissions/api_permission.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Value;
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace base
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions {
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A pattern that can be used to match a USB device permission.
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Should be of the format: vendorId:productId, where both vendorId and
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// productId are decimal strings representing uint16 values.
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class UsbDevicePermissionData {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  enum SpecialInterfaces {
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // A special interface id for stating permissions for an entire USB device,
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // no specific interface. This value must match value of Rule::ANY_INTERFACE
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // from ChromeOS permission_broker project.
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ANY_INTERFACE = -1,
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // A special interface id for |Check| to indicate that interface field is
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // not to be checked. Not used in manifest file.
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    UNSPECIFIED_INTERFACE = -2
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UsbDevicePermissionData();
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UsbDevicePermissionData(uint16 vendor_id,
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          uint16 product_id,
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          int interface_id);
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check if |param| (which must be a UsbDevicePermissionData::CheckParam)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // matches the vendor and product IDs associated with |this|.
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool Check(const APIPermission::CheckParam* param) const;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Convert |this| into a base::Value.
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> ToValue() const;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Populate |this| from a base::Value.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool FromValue(const base::Value* value);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool operator<(const UsbDevicePermissionData& rhs) const;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool operator==(const UsbDevicePermissionData& rhs) const;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const uint16& vendor_id() const { return vendor_id_; }
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const uint16& product_id() const { return product_id_; }
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // These accessors are provided for IPC_STRUCT_TRAITS_MEMBER.  Please
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // think twice before using them for anything else.
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint16& vendor_id() { return vendor_id_; }
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint16& product_id() { return product_id_; }
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint16 vendor_id_;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint16 product_id_;
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int interface_id_;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace extensions
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif  // EXTENSIONS_COMMON_PERMISSIONS_USB_DEVICE_PERMISSION_DATA_H_
72