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 33using namespace android; 34namespace qClient { 35 36enum { 37 HDMI_CONNECTED = IBinder::FIRST_CALL_TRANSACTION, 38 CEC_MESSAGE_RECEIVED 39}; 40 41class BpQHDMIClient : public BpInterface<IQHDMIClient> 42{ 43public: 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 70IMPLEMENT_META_INTERFACE(QHDMIClient, 71 "android.display.IQHDMIClient"); 72 73status_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