Home | History | Annotate | Download | only in libqservice
      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:
     44     BpQHDMIClient(const sp<IBinder>& impl)
     45             :BpInterface<IQHDMIClient>(impl)
     46     {
     47     }
     48 
     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 
     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 
     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