/*
* 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__