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