1 /* 2 * Copyright (c) 2014 The Linux Foundation. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * * Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * * Redistributions in binary form must reproduce the above 10 * copyright notice, this list of conditions and the following 11 * disclaimer in the documentation and/or other materials provided 12 * with the distribution. 13 * * Neither the name of The Linux Foundation. nor the names of its 14 * contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 #include <utils/Log.h> 30 #include <binder/Parcel.h> 31 #include "IQHDMIClient.h" 32 33 using namespace android; 34 namespace qClient { 35 36 enum { 37 HDMI_CONNECTED = IBinder::FIRST_CALL_TRANSACTION, 38 CEC_MESSAGE_RECEIVED 39 }; 40 41 class BpQHDMIClient : public BpInterface<IQHDMIClient> 42 { 43 public: 44 BpQHDMIClient(const sp<IBinder>& impl) 45 :BpInterface<IQHDMIClient>(impl) 46 { 47 } 48 49 void onHdmiHotplug(int connected) 50 { 51 Parcel data, reply; 52 data.writeInterfaceToken(IQHDMIClient::getInterfaceDescriptor()); 53 data.writeInt32(connected); 54 remote()->transact(HDMI_CONNECTED, data, &reply, IBinder::FLAG_ONEWAY); 55 } 56 57 void onCECMessageRecieved(char *msg, ssize_t len) 58 { 59 Parcel data, reply; 60 data.writeInterfaceToken(IQHDMIClient::getInterfaceDescriptor()); 61 data.writeInt32(len); 62 void *buf = data.writeInplace(len); 63 memcpy(buf, msg, len); 64 remote()->transact(CEC_MESSAGE_RECEIVED, data, &reply, 65 IBinder::FLAG_ONEWAY); 66 } 67 }; 68 69 IMPLEMENT_META_INTERFACE(QHDMIClient, 70 "android.display.IQHDMIClient"); 71 72 status_t BnQHDMIClient::onTransact(uint32_t code, const Parcel& data, 73 Parcel* reply, uint32_t flags) 74 { 75 switch(code) { 76 case HDMI_CONNECTED: { 77 CHECK_INTERFACE(IQHDMIClient, data, reply); 78 int connected = data.readInt32(); 79 onHdmiHotplug(connected); 80 return NO_ERROR; 81 } 82 case CEC_MESSAGE_RECEIVED: { 83 CHECK_INTERFACE(IQHDMIClient, data, reply); 84 ssize_t len = data.readInt32(); 85 const void* msg; 86 if(len >= 0 && len <= (ssize_t) data.dataAvail()) { 87 msg = data.readInplace(len); 88 } else { 89 msg = NULL; 90 len = 0; 91 } 92 onCECMessageRecieved((char*) msg, len); 93 return NO_ERROR; 94 } 95 default: { 96 return BBinder::onTransact(code, data, reply, flags); 97 } 98 } 99 } 100 101 }; //namespace qClient 102