adb_interface_enum.cpp revision 5c11852110eeb03dc5a69111354b383f98d15336
15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * you may not use this file except in compliance with the License.
65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * You may obtain a copy of the License at
75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * See the License for the specific language governing permissions and
145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * limitations under the License.
155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/** \file
185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  This file consists of implementation of AdbInterfaceEnumObject class that
195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  encapsulates enumerator of USB interfaces available through this API.
205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "stdafx.h"
235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "adb_api.h"
245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "adb_interface_enum.h"
255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "adb_helper_routines.h"
265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectAdbInterfaceEnumObject::AdbInterfaceEnumObject()
285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    : AdbObjectHandle(AdbObjectTypeInterfaceEnumerator) {
295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  current_interface_ = interfaces_.begin();
305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectAdbInterfaceEnumObject::~AdbInterfaceEnumObject() {
335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbool AdbInterfaceEnumObject::InitializeEnum(GUID class_id,
365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                                            bool exclude_not_present,
375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                                            bool exclude_removed,
385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                                            bool active_only) {
395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  // Calc flags for SetupDiGetClassDevs
405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  DWORD flags = DIGCF_DEVICEINTERFACE;
415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (exclude_not_present)
425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    flags |= DIGCF_PRESENT;
435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  // Do the enum
455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  bool ret = EnumerateDeviceInterfaces(class_id,
465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                                       flags,
475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                                       exclude_removed,
485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                                       active_only,
49                                       &interfaces_);
50
51  // If enum was successfull set current enum pointer
52  // to the beginning of the array
53  if (ret)
54    current_interface_ = interfaces_.begin();
55
56  return ret;
57}
58
59bool AdbInterfaceEnumObject::Next(AdbInterfaceInfo* info, ULONG* size) {
60  // Make sure that it's opened
61  if (!IsOpened()) {
62    SetLastError(ERROR_INVALID_HANDLE);
63    return false;
64  }
65
66  ATLASSERT(NULL != size);
67  if (NULL == size) {
68    SetLastError(ERROR_INVALID_PARAMETER);
69    return false;
70  }
71
72  // Lets see if enum is over
73  if (interfaces_.end() == current_interface_) {
74    SetLastError(ERROR_NO_MORE_ITEMS);
75    return false;
76  }
77
78  AdbInstanceEnumEntry& entry = *current_interface_;
79
80  // Big enough?
81  if ((NULL == info) || (*size < entry.GetFlatSize())) {
82    *size = entry.GetFlatSize();
83    SetLastError(ERROR_INSUFFICIENT_BUFFER);
84    return false;
85  }
86
87  // All checks passed
88  entry.Save(info);
89  current_interface_++;
90  return true;
91}
92
93bool AdbInterfaceEnumObject::Reset() {
94  // Make sure that it's opened
95  if (!IsOpened()) {
96    SetLastError(ERROR_INVALID_HANDLE);
97    return false;
98  }
99
100  current_interface_ = interfaces_.begin();
101
102  return true;
103}
104