1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_USB_ADB_API_PRIVATE_DEFINES_H__
18 #define ANDROID_USB_ADB_API_PRIVATE_DEFINES_H__
19 /** \file
20   This file consists of private definitions used inside the API
21 */
22 
23 #include "adb_api.h"
24 
25 /** \brief Encapsulates an entry in the array of enumerated interfaces.
26 */
27 class AdbInstanceEnumEntry {
28  public:
29   /** \brief Constructs an empty object.
30   */
AdbInstanceEnumEntry()31   AdbInstanceEnumEntry()
32       : flags_(0) {
33     ZeroMemory(&class_id_, sizeof(class_id_));
34   }
35 
36   /** \brief Copy constructor
37   */
AdbInstanceEnumEntry(const AdbInstanceEnumEntry & proto)38   AdbInstanceEnumEntry(const AdbInstanceEnumEntry& proto) {
39     Set(proto.device_name().c_str(), proto.class_id(), proto.flags());
40   }
41 
42   /** \brief Constructs the object with parameters.
43   */
AdbInstanceEnumEntry(const wchar_t * dev_name,GUID cls_id,DWORD flgs)44   AdbInstanceEnumEntry(const wchar_t* dev_name, GUID cls_id, DWORD flgs) {
45     Set(dev_name, cls_id, flgs);
46   }
47 
48   /** \brief Destructs the object.
49   */
~AdbInstanceEnumEntry()50   ~AdbInstanceEnumEntry() {
51   }
52 
53   /// Operator =
54   AdbInstanceEnumEntry& operator=(const AdbInstanceEnumEntry& proto) {
55     Set(proto.device_name().c_str(), proto.class_id(), proto.flags());
56     return *this;
57   }
58 
59   /// Initializes instance with parameters
Set(const wchar_t * dev_name,GUID cls_id,DWORD flgs)60   void Set(const wchar_t* dev_name, GUID cls_id, DWORD flgs) {
61     device_name_ = dev_name;
62     class_id_ = cls_id;
63     flags_ = flgs;
64   }
65 
66   /// Calculates memory size needed to save this entry into AdbInterfaceInfo
67   /// structure
GetFlatSize()68   ULONG GetFlatSize() const {
69     return static_cast<ULONG>(FIELD_OFFSET(AdbInterfaceInfo, device_name) +
70                               (device_name_.length() + 1) * sizeof(wchar_t));
71   }
72 
73   /** \brief Saves this entry into AdbInterfaceInfo structure.
74 
75     @param[in] info Buffer to save this entry to. Must be big enough to fit it.
76            Use GetFlatSize() method to get buffer size needed for that.
77 
78   */
Save(AdbInterfaceInfo * info)79   void Save(AdbInterfaceInfo* info) const {
80     info->class_id = class_id();
81     info->flags = flags();
82     wcscpy(info->device_name, device_name().c_str());
83   }
84 
85   /// Gets interface's device name
device_name()86   const std::wstring& device_name() const {
87     return device_name_;
88   }
89 
90   /// Gets inteface's class id
class_id()91   GUID class_id() const {
92     return class_id_;
93   }
94 
95   /// Gets interface flags
flags()96   DWORD flags() const {
97     return flags_;
98   }
99 
100  private:
101   /// Inteface's class id (see SP_DEVICE_INTERFACE_DATA)
102   GUID          class_id_;
103 
104   /// Interface's device name
105   std::wstring  device_name_;
106 
107   /// Interface flags (see SP_DEVICE_INTERFACE_DATA)
108   DWORD         flags_;
109 };
110 
111 /// Defines array of enumerated interface entries
112 typedef std::vector< AdbInstanceEnumEntry > AdbEnumInterfaceArray;
113 
114 #endif  // ANDROID_USB_ADB_API_PRIVATE_DEFINES_H__
115