14a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh/*
24a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* Copyright (c) 2014 The Linux Foundation. All rights reserved.
34a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*
44a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* Redistribution and use in source and binary forms, with or without
54a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* modification, are permitted provided that the following conditions are
64a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* met:
74a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*    * Redistributions of source code must retain the above copyright
84a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*      notice, this list of conditions and the following disclaimer.
94a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*    * Redistributions in binary form must reproduce the above
104a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*      copyright notice, this list of conditions and the following
114a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*      disclaimer in the documentation and/or other materials provided
124a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*      with the distribution.
134a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*    * Neither the name of The Linux Foundation. nor the names of its
144a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*      contributors may be used to endorse or promote products derived
154a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*      from this software without specific prior written permission.
164a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*
174a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
184a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
194a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
204a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
214a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
224a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
234a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
244a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
254a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
264a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
274a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
284a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*/
294a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <utils/Log.h>
304a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <binder/Parcel.h>
314a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include "IQHDMIClient.h"
324a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
334a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhusing namespace android;
344a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhnamespace qClient {
354a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
364a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhenum {
374a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    HDMI_CONNECTED = IBinder::FIRST_CALL_TRANSACTION,
384a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    CEC_MESSAGE_RECEIVED
394a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh};
404a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
414a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhclass BpQHDMIClient : public BpInterface<IQHDMIClient>
424a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh{
434a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhpublic:
444a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    BpQHDMIClient(const sp<IBinder>& impl)
454a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh            :BpInterface<IQHDMIClient>(impl)
464a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    {
474a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    }
484a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
494a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    void onHdmiHotplug(int connected)
504a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    {
514a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh        Parcel data, reply;
524a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh        data.writeInterfaceToken(IQHDMIClient::getInterfaceDescriptor());
534a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh        data.writeInt32(connected);
544a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh        remote()->transact(HDMI_CONNECTED, data, &reply, IBinder::FLAG_ONEWAY);
554a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    }
564a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
574a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    void onCECMessageRecieved(char *msg, ssize_t len)
584a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    {
594a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh        Parcel data, reply;
604a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh        data.writeInterfaceToken(IQHDMIClient::getInterfaceDescriptor());
614a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh        data.writeInt32((int32_t)len);
624a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh        void *buf = data.writeInplace(len);
634a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh        if (buf != NULL)
644a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh            memcpy(buf, msg, len);
654a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh        remote()->transact(CEC_MESSAGE_RECEIVED, data, &reply,
664a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh                IBinder::FLAG_ONEWAY);
674a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    }
684a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh};
694a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
704a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain VongsouvanhIMPLEMENT_META_INTERFACE(QHDMIClient,
714a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh        "android.display.IQHDMIClient");
724a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
734a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhstatus_t BnQHDMIClient::onTransact(uint32_t code, const Parcel& data,
744a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh        Parcel* reply, uint32_t flags)
754a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh{
764a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    switch(code) {
774a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh        case HDMI_CONNECTED: {
784a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh            CHECK_INTERFACE(IQHDMIClient, data, reply);
794a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh            int connected = data.readInt32();
804a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh            onHdmiHotplug(connected);
814a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh            return NO_ERROR;
824a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh        }
834a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh        case CEC_MESSAGE_RECEIVED: {
844a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh            CHECK_INTERFACE(IQHDMIClient, data, reply);
854a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh            ssize_t len = data.readInt32();
864a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh            const void* msg;
874a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh            if(len >= 0 && len <= (ssize_t) data.dataAvail()) {
884a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh                msg = data.readInplace(len);
894a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh            } else {
904a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh                msg = NULL;
914a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh                len = 0;
924a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh            }
934a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh            if (msg != NULL)
944a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh                onCECMessageRecieved((char*) msg, len);
954a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh            return NO_ERROR;
964a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh        }
974a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh        default: {
984a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh            return BBinder::onTransact(code, data, reply, flags);
994a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh        }
1004a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    }
1014a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh}
1024a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
1034a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh}; //namespace qClient
104