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