/* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** \file This file consists of implementation of AdbInterfaceEnumObject class that encapsulates enumerator of USB interfaces available through this API. */ #include "stdafx.h" #include "adb_api.h" #include "adb_interface_enum.h" #include "adb_helper_routines.h" AdbInterfaceEnumObject::AdbInterfaceEnumObject() : AdbObjectHandle(AdbObjectTypeInterfaceEnumerator) { current_interface_ = interfaces_.begin(); } AdbInterfaceEnumObject::~AdbInterfaceEnumObject() { } bool AdbInterfaceEnumObject::InitializeEnum(GUID class_id, bool exclude_not_present, bool exclude_removed, bool active_only) { // Calc flags for SetupDiGetClassDevs DWORD flags = DIGCF_DEVICEINTERFACE; if (exclude_not_present) flags |= DIGCF_PRESENT; // Do the enum bool ret = EnumerateDeviceInterfaces(class_id, flags, exclude_removed, active_only, &interfaces_); // If enum was successfull set current enum pointer // to the beginning of the array if (ret) current_interface_ = interfaces_.begin(); return ret; } bool AdbInterfaceEnumObject::Next(AdbInterfaceInfo* info, ULONG* size) { // Make sure that it's opened if (!IsOpened()) { SetLastError(ERROR_INVALID_HANDLE); return false; } ATLASSERT(NULL != size); if (NULL == size) { SetLastError(ERROR_INVALID_PARAMETER); return false; } // Lets see if enum is over if (interfaces_.end() == current_interface_) { SetLastError(ERROR_NO_MORE_ITEMS); return false; } AdbInstanceEnumEntry& entry = *current_interface_; // Big enough? if ((NULL == info) || (*size < entry.GetFlatSize())) { *size = entry.GetFlatSize(); SetLastError(ERROR_INSUFFICIENT_BUFFER); return false; } // All checks passed entry.Save(info); current_interface_++; return true; } bool AdbInterfaceEnumObject::Reset() { // Make sure that it's opened if (!IsOpened()) { SetLastError(ERROR_INVALID_HANDLE); return false; } current_interface_ = interfaces_.begin(); return true; }