12ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel/* 22ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* Copyright (c) 2014 The Linux Foundation. All rights reserved. 32ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* 42ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* Redistribution and use in source and binary forms, with or without 52ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* modification, are permitted provided that the following conditions are 62ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* met: 72ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* * Redistributions of source code must retain the above copyright 82ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* notice, this list of conditions and the following disclaimer. 92ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* * Redistributions in binary form must reproduce the above 102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* copyright notice, this list of conditions and the following 112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* disclaimer in the documentation and/or other materials provided 122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* with the distribution. 132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* * Neither the name of The Linux Foundation. nor the names of its 142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* contributors may be used to endorse or promote products derived 152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* from this software without specific prior written permission. 162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* 172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*/ 292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/Log.h> 302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <binder/Parcel.h> 312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include "IQHDMIClient.h" 322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelusing namespace android; 342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelnamespace qClient { 352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelenum { 372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel HDMI_CONNECTED = IBinder::FIRST_CALL_TRANSACTION, 382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel CEC_MESSAGE_RECEIVED 392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}; 402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelclass BpQHDMIClient : public BpInterface<IQHDMIClient> 422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel{ 432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelpublic: 442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel BpQHDMIClient(const sp<IBinder>& impl) 452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel :BpInterface<IQHDMIClient>(impl) 462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel { 472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel void onHdmiHotplug(int connected) 502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel { 512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel data, reply; 522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel data.writeInterfaceToken(IQHDMIClient::getInterfaceDescriptor()); 532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel data.writeInt32(connected); 542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel remote()->transact(HDMI_CONNECTED, data, &reply, IBinder::FLAG_ONEWAY); 552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel void onCECMessageRecieved(char *msg, ssize_t len) 582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel { 592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel data, reply; 602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel data.writeInterfaceToken(IQHDMIClient::getInterfaceDescriptor()); 612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel data.writeInt32((int32_t)len); 622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel void *buf = data.writeInplace(len); 632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (buf != NULL) 642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel memcpy(buf, msg, len); 652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel remote()->transact(CEC_MESSAGE_RECEIVED, data, &reply, 662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel IBinder::FLAG_ONEWAY); 672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}; 692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelIMPLEMENT_META_INTERFACE(QHDMIClient, 712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel "android.display.IQHDMIClient"); 722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelstatus_t BnQHDMIClient::onTransact(uint32_t code, const Parcel& data, 742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel* reply, uint32_t flags) 752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel{ 762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel switch(code) { 772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel case HDMI_CONNECTED: { 782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel CHECK_INTERFACE(IQHDMIClient, data, reply); 792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel int connected = data.readInt32(); 802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel onHdmiHotplug(connected); 812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return NO_ERROR; 822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel case CEC_MESSAGE_RECEIVED: { 842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel CHECK_INTERFACE(IQHDMIClient, data, reply); 852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ssize_t len = data.readInt32(); 862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const void* msg; 872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if(len >= 0 && len <= (ssize_t) data.dataAvail()) { 882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel msg = data.readInplace(len); 892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else { 902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel msg = NULL; 912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel len = 0; 922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (msg != NULL) 942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel onCECMessageRecieved((char*) msg, len); 952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return NO_ERROR; 962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel default: { 982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return BBinder::onTransact(code, data, reply, flags); 992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 1022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}; //namespace qClient 104