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