/* | |
* 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. | |
*/ | |
#ifndef ANDROID_USB_API_ADB_API_INSTANCE_H__ | |
#define ANDROID_USB_API_ADB_API_INSTANCE_H__ | |
/** \file | |
This file consists of declaration of class AdbApiInstance that is a main | |
API object representing a device interface that is in the interest of | |
the API client. All device (interface) related operations go through this | |
class first. | |
*/ | |
#include "adb_api.h" | |
#include "adb_api_private_defines.h" | |
/** Class AdbApiInstance is the main API interbal object representing a device | |
interface that is in the interest of the API client. All device (interface) | |
related operations go through this class first. So, before doing anything | |
meaningfull with the API a client must first create instance of the API | |
via CreateAdbApiInstance, select a device interface for that instance and | |
then do everything else. | |
Objects of this class are globally stored in the map that matches | |
ADBAPIINSTANCEHANDLE to the corresponded object. | |
This class is self-referenced with the following reference model: | |
1. When object of this class is created and added to the map, its recount | |
is set to 1. | |
2. Every time the client makes an API call that uses ADBAPIINSTANCEHANDLE | |
a corresponded AdbApiInstance object is looked up in the table and its | |
refcount is incremented. Upon return from the API call that incremented | |
the refcount refcount gets decremented. | |
3. When the client closes ADBAPIINSTANCEHANDLE via DeleteAdbApiInstance call | |
corresponded object gets deleted from the map and its refcount is | |
decremented. | |
So, at the end, this object destroys itself when refcount drops to zero. | |
*/ | |
class AdbApiInstance { | |
public: | |
/** \brief Constructs the object | |
@param handle[in] Instance handle associated with this object | |
*/ | |
AdbApiInstance(); | |
private: | |
/// Destructs the object | |
~AdbApiInstance(); | |
/** \brief | |
This method is called when last reference to this object has been released | |
In this method object is uninitialized and deleted (that is "delete this" | |
is called). | |
*/ | |
void LastReferenceReleased(); | |
public: | |
/// Gets name of the USB interface (device name) for this instance | |
const std::wstring& interface_name() const { | |
return interface_name_; | |
} | |
/// References the object and returns number of references | |
LONG AddRef() { | |
return InterlockedIncrement(&ref_count_); | |
} | |
/** \brief Dereferences the object and returns number of references | |
Object may be deleted in this method, so you cannot touch it after | |
this method returns, even if returned value is not zero, because object | |
can be deleted in another thread. | |
*/ | |
LONG Release() { | |
LONG ret = InterlockedDecrement(&ref_count_); | |
if (0 == ret) | |
LastReferenceReleased(); | |
return ret; | |
} | |
/// Checks if instance has been initialized | |
bool IsInitialized() const { | |
return !interface_name_.empty(); | |
} | |
private: | |
/// Name of the USB interface (device name) for this instance | |
std::wstring interface_name_; | |
/// Instance handle for this object | |
ADBAPIINSTANCEHANDLE instance_handle_; | |
/// Reference counter for this instance | |
LONG ref_count_; | |
}; | |
/// Defines map that matches ADBAPIINSTANCEHANDLE with AdbApiInstance object | |
typedef std::map< ADBAPIINSTANCEHANDLE, AdbApiInstance* > AdbApiInstanceMap; | |
#endif // ANDROID_USB_API_ADB_API_INSTANCE_H__ |