123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- /*
- * Copyright (C) 2005 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_IINTERFACE_H
- #define ANDROID_IINTERFACE_H
- #include <binder/Binder.h>
- namespace android {
- // ----------------------------------------------------------------------
- class IInterface : public virtual RefBase
- {
- public:
- IInterface();
- static sp<IBinder> asBinder(const IInterface*);
- static sp<IBinder> asBinder(const sp<IInterface>&);
- protected:
- virtual ~IInterface();
- virtual IBinder* onAsBinder() = 0;
- };
- // ----------------------------------------------------------------------
- template<typename INTERFACE>
- inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj)
- {
- return INTERFACE::asInterface(obj);
- }
- // ----------------------------------------------------------------------
- template<typename INTERFACE>
- class BnInterface : public INTERFACE, public BBinder
- {
- public:
- virtual sp<IInterface> queryLocalInterface(const String16& _descriptor);
- virtual const String16& getInterfaceDescriptor() const;
- protected:
- virtual IBinder* onAsBinder();
- };
- // ----------------------------------------------------------------------
- template<typename INTERFACE>
- class BpInterface : public INTERFACE, public BpRefBase
- {
- public:
- BpInterface(const sp<IBinder>& remote);
- protected:
- virtual IBinder* onAsBinder();
- };
- // ----------------------------------------------------------------------
- #define DECLARE_META_INTERFACE(INTERFACE) \
- static const android::String16 descriptor; \
- static android::sp<I##INTERFACE> asInterface( \
- const android::sp<android::IBinder>& obj); \
- virtual const android::String16& getInterfaceDescriptor() const; \
- I##INTERFACE(); \
- virtual ~I##INTERFACE(); \
- #define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) \
- const android::String16 I##INTERFACE::descriptor(NAME); \
- const android::String16& \
- I##INTERFACE::getInterfaceDescriptor() const { \
- return I##INTERFACE::descriptor; \
- } \
- android::sp<I##INTERFACE> I##INTERFACE::asInterface( \
- const android::sp<android::IBinder>& obj) \
- { \
- android::sp<I##INTERFACE> intr; \
- if (obj != NULL) { \
- intr = static_cast<I##INTERFACE*>( \
- obj->queryLocalInterface( \
- I##INTERFACE::descriptor).get()); \
- if (intr == NULL) { \
- intr = new Bp##INTERFACE(obj); \
- } \
- } \
- return intr; \
- } \
- I##INTERFACE::I##INTERFACE() { } \
- I##INTERFACE::~I##INTERFACE() { } \
- #define CHECK_INTERFACE(interface, data, reply) \
- if (!data.checkInterface(this)) { return PERMISSION_DENIED; } \
- // ----------------------------------------------------------------------
- // No user-serviceable parts after this...
- template<typename INTERFACE>
- inline sp<IInterface> BnInterface<INTERFACE>::queryLocalInterface(
- const String16& _descriptor)
- {
- if (_descriptor == INTERFACE::descriptor) return this;
- return NULL;
- }
- template<typename INTERFACE>
- inline const String16& BnInterface<INTERFACE>::getInterfaceDescriptor() const
- {
- return INTERFACE::getInterfaceDescriptor();
- }
- template<typename INTERFACE>
- IBinder* BnInterface<INTERFACE>::onAsBinder()
- {
- return this;
- }
- template<typename INTERFACE>
- inline BpInterface<INTERFACE>::BpInterface(const sp<IBinder>& remote)
- : BpRefBase(remote)
- {
- }
- template<typename INTERFACE>
- inline IBinder* BpInterface<INTERFACE>::onAsBinder()
- {
- return remote();
- }
-
- // ----------------------------------------------------------------------
- }; // namespace android
- #endif // ANDROID_IINTERFACE_H
|