xref: /aosp_15_r20/test/dittosuite/include/ditto/binder.h (revision 6fa2df46f119dce7527f5beb2814eca0e6f886ac)
1*6fa2df46SAndroid Build Coastguard Worker // Copyright (C) 2023 The Android Open Source Project
2*6fa2df46SAndroid Build Coastguard Worker //
3*6fa2df46SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*6fa2df46SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*6fa2df46SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*6fa2df46SAndroid Build Coastguard Worker //
7*6fa2df46SAndroid Build Coastguard Worker //      http://www.apache.org/licenses/LICENSE-2.0
8*6fa2df46SAndroid Build Coastguard Worker //
9*6fa2df46SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*6fa2df46SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*6fa2df46SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*6fa2df46SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*6fa2df46SAndroid Build Coastguard Worker // limitations under the License.
14*6fa2df46SAndroid Build Coastguard Worker 
15*6fa2df46SAndroid Build Coastguard Worker #pragma once
16*6fa2df46SAndroid Build Coastguard Worker 
17*6fa2df46SAndroid Build Coastguard Worker #ifdef __ANDROID__
18*6fa2df46SAndroid Build Coastguard Worker 
19*6fa2df46SAndroid Build Coastguard Worker #include <binder/IInterface.h>
20*6fa2df46SAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
21*6fa2df46SAndroid Build Coastguard Worker #include <binder/Parcel.h>
22*6fa2df46SAndroid Build Coastguard Worker 
23*6fa2df46SAndroid Build Coastguard Worker #include <ditto/logger.h>
24*6fa2df46SAndroid Build Coastguard Worker 
25*6fa2df46SAndroid Build Coastguard Worker using android::BnInterface;
26*6fa2df46SAndroid Build Coastguard Worker using android::BpInterface;
27*6fa2df46SAndroid Build Coastguard Worker using android::IBinder;
28*6fa2df46SAndroid Build Coastguard Worker using android::IInterface;
29*6fa2df46SAndroid Build Coastguard Worker using android::NO_ERROR;
30*6fa2df46SAndroid Build Coastguard Worker using android::Parcel;
31*6fa2df46SAndroid Build Coastguard Worker using android::sp;
32*6fa2df46SAndroid Build Coastguard Worker using android::status_t;
33*6fa2df46SAndroid Build Coastguard Worker using android::String16;
34*6fa2df46SAndroid Build Coastguard Worker 
35*6fa2df46SAndroid Build Coastguard Worker namespace dittosuite {
36*6fa2df46SAndroid Build Coastguard Worker 
37*6fa2df46SAndroid Build Coastguard Worker // AIDL interface
38*6fa2df46SAndroid Build Coastguard Worker class IDittoBinder : public IInterface {
39*6fa2df46SAndroid Build Coastguard Worker  public:
40*6fa2df46SAndroid Build Coastguard Worker   DECLARE_META_INTERFACE(DittoBinder);
41*6fa2df46SAndroid Build Coastguard Worker 
42*6fa2df46SAndroid Build Coastguard Worker   enum { START = IBinder::FIRST_CALL_TRANSACTION, END, SYNC, ASYNC };
43*6fa2df46SAndroid Build Coastguard Worker 
44*6fa2df46SAndroid Build Coastguard Worker   // Sends an asynchronous request to the service
45*6fa2df46SAndroid Build Coastguard Worker   virtual void async() = 0;
46*6fa2df46SAndroid Build Coastguard Worker 
47*6fa2df46SAndroid Build Coastguard Worker   // Sends a synchronous request to the service
48*6fa2df46SAndroid Build Coastguard Worker   virtual int8_t sync(int8_t c) = 0;
49*6fa2df46SAndroid Build Coastguard Worker 
50*6fa2df46SAndroid Build Coastguard Worker   // This should be called when a new binder client is created, to refcount
51*6fa2df46SAndroid Build Coastguard Worker   // number of callers.
52*6fa2df46SAndroid Build Coastguard Worker   virtual void start() = 0;
53*6fa2df46SAndroid Build Coastguard Worker 
54*6fa2df46SAndroid Build Coastguard Worker   // This should be called when a binder client finishes. When the refcount
55*6fa2df46SAndroid Build Coastguard Worker   // reaches 0, then the binder server can stop.
56*6fa2df46SAndroid Build Coastguard Worker   virtual void end() = 0;
57*6fa2df46SAndroid Build Coastguard Worker };
58*6fa2df46SAndroid Build Coastguard Worker 
59*6fa2df46SAndroid Build Coastguard Worker // Client
60*6fa2df46SAndroid Build Coastguard Worker class BpDittoBinder : public BpInterface<IDittoBinder> {
61*6fa2df46SAndroid Build Coastguard Worker  public:
62*6fa2df46SAndroid Build Coastguard Worker   BpDittoBinder(const sp<IBinder>& impl);
63*6fa2df46SAndroid Build Coastguard Worker 
64*6fa2df46SAndroid Build Coastguard Worker   virtual void async();
65*6fa2df46SAndroid Build Coastguard Worker   virtual int8_t sync(int8_t c);
66*6fa2df46SAndroid Build Coastguard Worker   virtual void start();
67*6fa2df46SAndroid Build Coastguard Worker   virtual void end();
68*6fa2df46SAndroid Build Coastguard Worker };
69*6fa2df46SAndroid Build Coastguard Worker 
70*6fa2df46SAndroid Build Coastguard Worker // Server
71*6fa2df46SAndroid Build Coastguard Worker class BnDittoBinder : public BnInterface<IDittoBinder> {
72*6fa2df46SAndroid Build Coastguard Worker   virtual status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0);
73*6fa2df46SAndroid Build Coastguard Worker 
74*6fa2df46SAndroid Build Coastguard Worker  protected:
75*6fa2df46SAndroid Build Coastguard Worker   std::atomic_int client_cnt_;
76*6fa2df46SAndroid Build Coastguard Worker   pthread_cond_t* thread_condition_;
77*6fa2df46SAndroid Build Coastguard Worker };
78*6fa2df46SAndroid Build Coastguard Worker 
79*6fa2df46SAndroid Build Coastguard Worker class DittoBinder : public BnDittoBinder {
80*6fa2df46SAndroid Build Coastguard Worker  public:
81*6fa2df46SAndroid Build Coastguard Worker   DittoBinder() = delete;
DittoBinder(pthread_cond_t * thread_condition)82*6fa2df46SAndroid Build Coastguard Worker   DittoBinder(pthread_cond_t* thread_condition) { thread_condition_ = thread_condition; }
83*6fa2df46SAndroid Build Coastguard Worker 
84*6fa2df46SAndroid Build Coastguard Worker  private:
85*6fa2df46SAndroid Build Coastguard Worker   virtual void async();
86*6fa2df46SAndroid Build Coastguard Worker   virtual int8_t sync(int8_t c);
87*6fa2df46SAndroid Build Coastguard Worker   virtual void start();
88*6fa2df46SAndroid Build Coastguard Worker   virtual void end();
89*6fa2df46SAndroid Build Coastguard Worker };
90*6fa2df46SAndroid Build Coastguard Worker 
91*6fa2df46SAndroid Build Coastguard Worker template <class T>
getBinderService(const std::string & service_name)92*6fa2df46SAndroid Build Coastguard Worker android::sp<T> getBinderService(const std::string& service_name) {
93*6fa2df46SAndroid Build Coastguard Worker   LOGD("Getting default Binder ServiceManager");
94*6fa2df46SAndroid Build Coastguard Worker   android::sp<android::IServiceManager> sm = android::defaultServiceManager();
95*6fa2df46SAndroid Build Coastguard Worker   if (!sm) {
96*6fa2df46SAndroid Build Coastguard Worker     LOGF("No Binder ServiceManager found");
97*6fa2df46SAndroid Build Coastguard Worker   }
98*6fa2df46SAndroid Build Coastguard Worker 
99*6fa2df46SAndroid Build Coastguard Worker   LOGD("Getting Binder Service: " + service_name);
100*6fa2df46SAndroid Build Coastguard Worker   android::sp<android::IBinder> binder = sm->waitForService(android::String16(service_name.c_str()));
101*6fa2df46SAndroid Build Coastguard Worker   if (!binder) {
102*6fa2df46SAndroid Build Coastguard Worker     LOGF("Unable to fetch Binder Interface");
103*6fa2df46SAndroid Build Coastguard Worker   }
104*6fa2df46SAndroid Build Coastguard Worker 
105*6fa2df46SAndroid Build Coastguard Worker   LOGD("Getting Binder Service interface");
106*6fa2df46SAndroid Build Coastguard Worker   android::sp<T> interface = android::interface_cast<T>(binder);
107*6fa2df46SAndroid Build Coastguard Worker   if (!interface) {
108*6fa2df46SAndroid Build Coastguard Worker     LOGF("Unable to cast Binder Service");
109*6fa2df46SAndroid Build Coastguard Worker   }
110*6fa2df46SAndroid Build Coastguard Worker 
111*6fa2df46SAndroid Build Coastguard Worker   return interface;
112*6fa2df46SAndroid Build Coastguard Worker }
113*6fa2df46SAndroid Build Coastguard Worker 
114*6fa2df46SAndroid Build Coastguard Worker 
115*6fa2df46SAndroid Build Coastguard Worker }  // namespace dittosuite
116*6fa2df46SAndroid Build Coastguard Worker 
117*6fa2df46SAndroid Build Coastguard Worker #endif
118