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