Home | History | Annotate | Download | only in libqservice
      1 /*
      2  *  Copyright (c) 2012-2014, 2016, 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 
     30 #include <QService.h>
     31 #include <binder/Parcel.h>
     32 #include <binder/IPCThreadState.h>
     33 
     34 #define QSERVICE_DEBUG 0
     35 
     36 using namespace android;
     37 
     38 namespace qService {
     39 
     40 QService* QService::sQService = NULL;
     41 // ----------------------------------------------------------------------------
     42 QService::QService()
     43 {
     44     ALOGD_IF(QSERVICE_DEBUG, "QService Constructor invoked");
     45 }
     46 
     47 QService::~QService()
     48 {
     49     ALOGD_IF(QSERVICE_DEBUG,"QService Destructor invoked");
     50 }
     51 
     52 void QService::connect(const sp<qClient::IQClient>& client) {
     53     ALOGD_IF(QSERVICE_DEBUG,"HWC client connected");
     54     mClient = client;
     55 }
     56 
     57 void QService::connect(const sp<qClient::IQHDMIClient>& client) {
     58     ALOGD_IF(QSERVICE_DEBUG,"HDMI client connected");
     59     mHDMIClient = client;
     60 }
     61 
     62 status_t QService::dispatch(uint32_t command, const Parcel* inParcel,
     63         Parcel* outParcel) {
     64     status_t err = (status_t) FAILED_TRANSACTION;
     65     IPCThreadState* ipc = IPCThreadState::self();
     66     //Rewind parcel in case we're calling from the same process
     67     bool sameProcess = (ipc->getCallingPid() == getpid());
     68     if(sameProcess)
     69         inParcel->setDataPosition(0);
     70     if (mClient.get()) {
     71         ALOGD_IF(QSERVICE_DEBUG, "Dispatching command: %d", command);
     72         err = mClient->notifyCallback(command, inParcel, outParcel);
     73         //Rewind parcel in case we're calling from the same process
     74         if (sameProcess)
     75             outParcel->setDataPosition(0);
     76     }
     77     return err;
     78 }
     79 
     80 void QService::onHdmiHotplug(int connected) {
     81     if(mHDMIClient.get()) {
     82         ALOGD_IF(QSERVICE_DEBUG, "%s: HDMI hotplug", __FUNCTION__);
     83         mHDMIClient->onHdmiHotplug(connected);
     84     } else {
     85         ALOGW("%s: Failed to get a valid HDMI client", __FUNCTION__);
     86     }
     87 }
     88 
     89 void QService::onCECMessageReceived(char *msg, ssize_t len) {
     90     if(mHDMIClient.get()) {
     91         ALOGD_IF(QSERVICE_DEBUG, "%s: CEC message received", __FUNCTION__);
     92         mHDMIClient->onCECMessageRecieved(msg, len);
     93     } else {
     94         ALOGW("%s: Failed to get a valid HDMI client", __FUNCTION__);
     95     }
     96 }
     97 
     98 
     99 void QService::init()
    100 {
    101     if(!sQService) {
    102         sQService = new QService();
    103         sp<IServiceManager> sm = defaultServiceManager();
    104         sm->addService(String16("display.qservice"), sQService);
    105         if(sm->checkService(String16("display.qservice")) != NULL)
    106             ALOGD_IF(QSERVICE_DEBUG, "adding display.qservice succeeded");
    107         else
    108             ALOGD_IF(QSERVICE_DEBUG, "adding display.qservice failed");
    109     }
    110 }
    111 
    112 }
    113