xref: /aosp_15_r20/frameworks/native/include/private/gui/BitTube.h (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2010 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #pragma once
18*38e8c45fSAndroid Build Coastguard Worker 
19*38e8c45fSAndroid Build Coastguard Worker #include <android-base/unique_fd.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <binder/Parcelable.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <utils/Errors.h>
22*38e8c45fSAndroid Build Coastguard Worker 
23*38e8c45fSAndroid Build Coastguard Worker namespace android {
24*38e8c45fSAndroid Build Coastguard Worker 
25*38e8c45fSAndroid Build Coastguard Worker class Parcel;
26*38e8c45fSAndroid Build Coastguard Worker 
27*38e8c45fSAndroid Build Coastguard Worker namespace gui {
28*38e8c45fSAndroid Build Coastguard Worker 
29*38e8c45fSAndroid Build Coastguard Worker class BitTube : public Parcelable {
30*38e8c45fSAndroid Build Coastguard Worker public:
31*38e8c45fSAndroid Build Coastguard Worker     // creates an uninitialized BitTube (to unparcel into)
32*38e8c45fSAndroid Build Coastguard Worker     BitTube() = default;
33*38e8c45fSAndroid Build Coastguard Worker 
34*38e8c45fSAndroid Build Coastguard Worker     // creates a BitTube with a a specified send and receive buffer size
35*38e8c45fSAndroid Build Coastguard Worker     explicit BitTube(size_t bufsize);
36*38e8c45fSAndroid Build Coastguard Worker 
37*38e8c45fSAndroid Build Coastguard Worker     // creates a BitTube with a default (4KB) send buffer
38*38e8c45fSAndroid Build Coastguard Worker     struct DefaultSizeType {};
39*38e8c45fSAndroid Build Coastguard Worker     static constexpr DefaultSizeType DefaultSize{};
40*38e8c45fSAndroid Build Coastguard Worker     explicit BitTube(DefaultSizeType);
41*38e8c45fSAndroid Build Coastguard Worker 
42*38e8c45fSAndroid Build Coastguard Worker     explicit BitTube(const Parcel& data);
43*38e8c45fSAndroid Build Coastguard Worker 
44*38e8c45fSAndroid Build Coastguard Worker     virtual ~BitTube() = default;
45*38e8c45fSAndroid Build Coastguard Worker 
46*38e8c45fSAndroid Build Coastguard Worker     // check state after construction
47*38e8c45fSAndroid Build Coastguard Worker     status_t initCheck() const;
48*38e8c45fSAndroid Build Coastguard Worker 
49*38e8c45fSAndroid Build Coastguard Worker     // get receive file-descriptor
50*38e8c45fSAndroid Build Coastguard Worker     int getFd() const;
51*38e8c45fSAndroid Build Coastguard Worker 
52*38e8c45fSAndroid Build Coastguard Worker     // get the send file-descriptor.
53*38e8c45fSAndroid Build Coastguard Worker     int getSendFd() const;
54*38e8c45fSAndroid Build Coastguard Worker 
55*38e8c45fSAndroid Build Coastguard Worker     // moves the receive file descriptor out of this BitTube
56*38e8c45fSAndroid Build Coastguard Worker     base::unique_fd moveReceiveFd();
57*38e8c45fSAndroid Build Coastguard Worker 
58*38e8c45fSAndroid Build Coastguard Worker     // resets this BitTube's receive file descriptor to receiveFd
59*38e8c45fSAndroid Build Coastguard Worker     void setReceiveFd(base::unique_fd&& receiveFd);
60*38e8c45fSAndroid Build Coastguard Worker 
61*38e8c45fSAndroid Build Coastguard Worker     // resets this BitTube's send file descriptor to sendFd
62*38e8c45fSAndroid Build Coastguard Worker     void setSendFd(base::unique_fd&& sendFd);
63*38e8c45fSAndroid Build Coastguard Worker 
64*38e8c45fSAndroid Build Coastguard Worker     // send objects (sized blobs). All objects are guaranteed to be written or the call fails.
65*38e8c45fSAndroid Build Coastguard Worker     template <typename T>
sendObjects(BitTube * tube,T const * events,size_t count)66*38e8c45fSAndroid Build Coastguard Worker     static ssize_t sendObjects(BitTube* tube, T const* events, size_t count) {
67*38e8c45fSAndroid Build Coastguard Worker         return sendObjects(tube, events, count, sizeof(T));
68*38e8c45fSAndroid Build Coastguard Worker     }
69*38e8c45fSAndroid Build Coastguard Worker 
70*38e8c45fSAndroid Build Coastguard Worker     // receive objects (sized blobs). If the receiving buffer isn't large enough, excess messages
71*38e8c45fSAndroid Build Coastguard Worker     // are silently discarded.
72*38e8c45fSAndroid Build Coastguard Worker     template <typename T>
recvObjects(BitTube * tube,T * events,size_t count)73*38e8c45fSAndroid Build Coastguard Worker     static ssize_t recvObjects(BitTube* tube, T* events, size_t count) {
74*38e8c45fSAndroid Build Coastguard Worker         return recvObjects(tube, events, count, sizeof(T));
75*38e8c45fSAndroid Build Coastguard Worker     }
76*38e8c45fSAndroid Build Coastguard Worker 
77*38e8c45fSAndroid Build Coastguard Worker     // implement the Parcelable protocol. Only parcels the receive file descriptor
78*38e8c45fSAndroid Build Coastguard Worker     status_t writeToParcel(Parcel* reply) const;
79*38e8c45fSAndroid Build Coastguard Worker     status_t readFromParcel(const Parcel* parcel);
80*38e8c45fSAndroid Build Coastguard Worker 
81*38e8c45fSAndroid Build Coastguard Worker private:
82*38e8c45fSAndroid Build Coastguard Worker     void init(size_t rcvbuf, size_t sndbuf);
83*38e8c45fSAndroid Build Coastguard Worker 
84*38e8c45fSAndroid Build Coastguard Worker     // send a message. The write is guaranteed to send the whole message or fail.
85*38e8c45fSAndroid Build Coastguard Worker     ssize_t write(void const* vaddr, size_t size);
86*38e8c45fSAndroid Build Coastguard Worker 
87*38e8c45fSAndroid Build Coastguard Worker     // receive a message. the passed buffer must be at least as large as the write call used to send
88*38e8c45fSAndroid Build Coastguard Worker     // the message, excess data is silently discarded.
89*38e8c45fSAndroid Build Coastguard Worker     ssize_t read(void* vaddr, size_t size);
90*38e8c45fSAndroid Build Coastguard Worker 
91*38e8c45fSAndroid Build Coastguard Worker     mutable base::unique_fd mSendFd;
92*38e8c45fSAndroid Build Coastguard Worker     mutable base::unique_fd mReceiveFd;
93*38e8c45fSAndroid Build Coastguard Worker 
94*38e8c45fSAndroid Build Coastguard Worker     static ssize_t sendObjects(BitTube* tube, void const* events, size_t count, size_t objSize);
95*38e8c45fSAndroid Build Coastguard Worker 
96*38e8c45fSAndroid Build Coastguard Worker     static ssize_t recvObjects(BitTube* tube, void* events, size_t count, size_t objSize);
97*38e8c45fSAndroid Build Coastguard Worker };
98*38e8c45fSAndroid Build Coastguard Worker 
99*38e8c45fSAndroid Build Coastguard Worker } // namespace gui
100*38e8c45fSAndroid Build Coastguard Worker } // namespace android
101