14a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh/* 24a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* Copyright (c) 2014 The Linux Foundation. All rights reserved. 34a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* 44a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* Redistribution and use in source and binary forms, with or without 54a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* modification, are permitted provided that the following conditions are 64a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* met: 74a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* * Redistributions of source code must retain the above copyright 84a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* notice, this list of conditions and the following disclaimer. 94a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* * Redistributions in binary form must reproduce the above 104a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* copyright notice, this list of conditions and the following 114a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* disclaimer in the documentation and/or other materials provided 124a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* with the distribution. 134a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* * Neither the name of The Linux Foundation. nor the names of its 144a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* contributors may be used to endorse or promote products derived 154a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* from this software without specific prior written permission. 164a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* 174a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 184a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 194a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 204a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 214a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 224a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 234a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 244a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 254a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 264a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 274a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 284a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*/ 294a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <utils/Log.h> 304a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <binder/Parcel.h> 314a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include "IQHDMIClient.h" 324a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 334a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhusing namespace android; 344a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhnamespace qClient { 354a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 364a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhenum { 374a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh HDMI_CONNECTED = IBinder::FIRST_CALL_TRANSACTION, 384a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh CEC_MESSAGE_RECEIVED 394a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh}; 404a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 414a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhclass BpQHDMIClient : public BpInterface<IQHDMIClient> 424a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh{ 434a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhpublic: 444a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh BpQHDMIClient(const sp<IBinder>& impl) 454a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh :BpInterface<IQHDMIClient>(impl) 464a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh { 474a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 484a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 494a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh void onHdmiHotplug(int connected) 504a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh { 514a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh Parcel data, reply; 524a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh data.writeInterfaceToken(IQHDMIClient::getInterfaceDescriptor()); 534a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh data.writeInt32(connected); 544a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh remote()->transact(HDMI_CONNECTED, data, &reply, IBinder::FLAG_ONEWAY); 554a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 564a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 574a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh void onCECMessageRecieved(char *msg, ssize_t len) 584a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh { 594a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh Parcel data, reply; 604a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh data.writeInterfaceToken(IQHDMIClient::getInterfaceDescriptor()); 614a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh data.writeInt32((int32_t)len); 624a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh void *buf = data.writeInplace(len); 634a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh if (buf != NULL) 644a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh memcpy(buf, msg, len); 654a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh remote()->transact(CEC_MESSAGE_RECEIVED, data, &reply, 664a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh IBinder::FLAG_ONEWAY); 674a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 684a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh}; 694a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 704a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain VongsouvanhIMPLEMENT_META_INTERFACE(QHDMIClient, 714a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh "android.display.IQHDMIClient"); 724a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 734a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhstatus_t BnQHDMIClient::onTransact(uint32_t code, const Parcel& data, 744a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh Parcel* reply, uint32_t flags) 754a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh{ 764a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh switch(code) { 774a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh case HDMI_CONNECTED: { 784a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh CHECK_INTERFACE(IQHDMIClient, data, reply); 794a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh int connected = data.readInt32(); 804a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh onHdmiHotplug(connected); 814a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh return NO_ERROR; 824a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 834a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh case CEC_MESSAGE_RECEIVED: { 844a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh CHECK_INTERFACE(IQHDMIClient, data, reply); 854a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh ssize_t len = data.readInt32(); 864a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh const void* msg; 874a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh if(len >= 0 && len <= (ssize_t) data.dataAvail()) { 884a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh msg = data.readInplace(len); 894a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } else { 904a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh msg = NULL; 914a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh len = 0; 924a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 934a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh if (msg != NULL) 944a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh onCECMessageRecieved((char*) msg, len); 954a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh return NO_ERROR; 964a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 974a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh default: { 984a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh return BBinder::onTransact(code, data, reply, flags); 994a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 1004a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh } 1014a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh} 1024a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1034a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh}; //namespace qClient 104