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