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((int32_t)len); 62 void *buf = data.writeInplace(len); 63 if (buf != NULL) 64 memcpy(buf, msg, len); 65 remote()->transact(CEC_MESSAGE_RECEIVED, data, &reply, 66 IBinder::FLAG_ONEWAY); 67 } 68 }; 69 70 IMPLEMENT_META_INTERFACE(QHDMIClient, 71 "android.display.IQHDMIClient"); 72 73 status_t BnQHDMIClient::onTransact(uint32_t code, const Parcel& data, 74 Parcel* reply, uint32_t flags) 75 { 76 switch(code) { 77 case HDMI_CONNECTED: { 78 CHECK_INTERFACE(IQHDMIClient, data, reply); 79 int connected = data.readInt32(); 80 onHdmiHotplug(connected); 81 return NO_ERROR; 82 } 83 case CEC_MESSAGE_RECEIVED: { 84 CHECK_INTERFACE(IQHDMIClient, data, reply); 85 ssize_t len = data.readInt32(); 86 const void* msg; 87 if(len >= 0 && len <= (ssize_t) data.dataAvail()) { 88 msg = data.readInplace(len); 89 } else { 90 msg = NULL; 91 len = 0; 92 } 93 if (msg != NULL) 94 onCECMessageRecieved((char*) msg, len); 95 return NO_ERROR; 96 } 97 default: { 98 return BBinder::onTransact(code, data, reply, flags); 99 } 100 } 101 } 102 103 }; //namespace qClient 104