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