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