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