/* | |
* 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; | |
} |