diff options
Diffstat (limited to 'host/windows/usb/api/adb_interface_enum.cpp')
| -rw-r--r-- | host/windows/usb/api/adb_interface_enum.cpp | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/host/windows/usb/api/adb_interface_enum.cpp b/host/windows/usb/api/adb_interface_enum.cpp new file mode 100644 index 000000000..6e2808cc8 --- /dev/null +++ b/host/windows/usb/api/adb_interface_enum.cpp @@ -0,0 +1,103 @@ +/* + * 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; +} |
