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