15a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed/* 25a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* Copyright (c) 2014 The Linux Foundation. All rights reserved. 35a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* 45a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* Redistribution and use in source and binary forms, with or without 55a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* modification, are permitted provided that the following conditions are 65a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* met: 75a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* * Redistributions of source code must retain the above copyright 85a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* notice, this list of conditions and the following disclaimer. 95a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* * Redistributions in binary form must reproduce the above 105a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* copyright notice, this list of conditions and the following 115a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* disclaimer in the documentation and/or other materials provided 125a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* with the distribution. 135a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* * Neither the name of The Linux Foundation. nor the names of its 145a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* contributors may be used to endorse or promote products derived 155a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* from this software without specific prior written permission. 165a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* 175a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 185a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 195a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 205a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 215a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 225a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 235a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 245a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 255a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 265a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 275a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 285a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed*/ 295a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed#include <utils/Log.h> 305a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed#include <binder/Parcel.h> 315a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed#include "IQHDMIClient.h" 325a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed 335a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmedusing namespace android; 345a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmednamespace qClient { 355a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed 365a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmedenum { 375a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed HDMI_CONNECTED = IBinder::FIRST_CALL_TRANSACTION, 385a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed CEC_MESSAGE_RECEIVED 395a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed}; 405a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed 415a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmedclass BpQHDMIClient : public BpInterface<IQHDMIClient> 425a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed{ 435a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmedpublic: 445a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed BpQHDMIClient(const sp<IBinder>& impl) 455a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed :BpInterface<IQHDMIClient>(impl) 465a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed { 475a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed } 485a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed 495a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed void onHdmiHotplug(int connected) 505a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed { 515a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed Parcel data, reply; 525a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed data.writeInterfaceToken(IQHDMIClient::getInterfaceDescriptor()); 535a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed data.writeInt32(connected); 545a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed remote()->transact(HDMI_CONNECTED, data, &reply, IBinder::FLAG_ONEWAY); 555a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed } 565a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed 575a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed void onCECMessageRecieved(char *msg, ssize_t len) 585a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed { 595a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed Parcel data, reply; 605a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed data.writeInterfaceToken(IQHDMIClient::getInterfaceDescriptor()); 615a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed data.writeInt32(len); 625a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed void *buf = data.writeInplace(len); 635a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed memcpy(buf, msg, len); 645a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed remote()->transact(CEC_MESSAGE_RECEIVED, data, &reply, 655a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed IBinder::FLAG_ONEWAY); 665a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed } 675a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed}; 685a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed 695a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer AhmedIMPLEMENT_META_INTERFACE(QHDMIClient, 705a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed "android.display.IQHDMIClient"); 715a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed 725a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmedstatus_t BnQHDMIClient::onTransact(uint32_t code, const Parcel& data, 735a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed Parcel* reply, uint32_t flags) 745a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed{ 755a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed switch(code) { 765a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed case HDMI_CONNECTED: { 775a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed CHECK_INTERFACE(IQHDMIClient, data, reply); 785a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed int connected = data.readInt32(); 795a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed onHdmiHotplug(connected); 805a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed return NO_ERROR; 815a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed } 825a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed case CEC_MESSAGE_RECEIVED: { 835a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed CHECK_INTERFACE(IQHDMIClient, data, reply); 845a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed ssize_t len = data.readInt32(); 855a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed const void* msg; 865a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed if(len >= 0 && len <= (ssize_t) data.dataAvail()) { 875a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed msg = data.readInplace(len); 885a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed } else { 895a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed msg = NULL; 905a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed len = 0; 915a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed } 925a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed onCECMessageRecieved((char*) msg, len); 935a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed return NO_ERROR; 945a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed } 955a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed default: { 965a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed return BBinder::onTransact(code, data, reply, flags); 975a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed } 985a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed } 995a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed} 1005a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed 1015a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed}; //namespace qClient 102