1bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah/*
20de84c911980050d32a6bb35836ce099acfc496dArun Kumar K.R *  Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
3bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah *
4bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah * Redistribution and use in source and binary forms, with or without
5bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah * modification, are permitted provided that the following conditions are
6bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah * met:
7bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah *     * Redistributions of source code must retain the above copyright
8bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah *       notice, this list of conditions and the following disclaimer.
9bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah *     * Redistributions in binary form must reproduce the above
10bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah *       copyright notice, this list of conditions and the following
11bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah *       disclaimer in the documentation and/or other materials provided
12bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah *       with the distribution.
135070c694011ddc30673ec68a9d1d74dc713c49f2Duy Truong *     * Neither the name of The Linux Foundation nor the names of its
14bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah *       contributors may be used to endorse or promote products derived
15bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah *       from this software without specific prior written permission.
16bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah *
17bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah */
29bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
30bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include <QService.h>
31bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
32bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#define QSERVICE_DEBUG 0
33bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
34bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahusing namespace android;
35bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
36bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahnamespace qService {
37bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
38bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh ShahQService* QService::sQService = NULL;
39bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah// ----------------------------------------------------------------------------
40c59c27830019a78f668f6fb2e9518483587ce098Saurabh ShahQService::QService()
41bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah{
42bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    ALOGD_IF(QSERVICE_DEBUG, "QService Constructor invoked");
43bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah}
44bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
45bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh ShahQService::~QService()
46bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah{
47bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    ALOGD_IF(QSERVICE_DEBUG,"QService Destructor invoked");
48bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah}
49bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
50c59c27830019a78f668f6fb2e9518483587ce098Saurabh Shahvoid QService::connect(const sp<qClient::IQClient>& client) {
515a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed    ALOGD_IF(QSERVICE_DEBUG,"HWC client connected");
52c59c27830019a78f668f6fb2e9518483587ce098Saurabh Shah    mClient = client;
53bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah}
54bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
555a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmedvoid QService::connect(const sp<qClient::IQHDMIClient>& client) {
565a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed    ALOGD_IF(QSERVICE_DEBUG,"HWC client connected");
575a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed    mHDMIClient = client;
585a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed}
595a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed
602299e93cfd2fbf8d0ea59e27e775e9baa27bf04aNaseer Ahmedstatus_t QService::dispatch(uint32_t command, const Parcel* inParcel,
612299e93cfd2fbf8d0ea59e27e775e9baa27bf04aNaseer Ahmed        Parcel* outParcel) {
620de84c911980050d32a6bb35836ce099acfc496dArun Kumar K.R    status_t err = (status_t) FAILED_TRANSACTION;
632299e93cfd2fbf8d0ea59e27e775e9baa27bf04aNaseer Ahmed    if (mClient.get()) {
642299e93cfd2fbf8d0ea59e27e775e9baa27bf04aNaseer Ahmed        ALOGD_IF(QSERVICE_DEBUG, "Dispatching command: %d", command);
652299e93cfd2fbf8d0ea59e27e775e9baa27bf04aNaseer Ahmed        err = mClient->notifyCallback(command, inParcel, outParcel);
66effbd25d502916fcdebadd1d2b83988559434e79Arun Kumar K.R    }
672299e93cfd2fbf8d0ea59e27e775e9baa27bf04aNaseer Ahmed    return err;
68effbd25d502916fcdebadd1d2b83988559434e79Arun Kumar K.R}
69effbd25d502916fcdebadd1d2b83988559434e79Arun Kumar K.R
705a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmedvoid QService::onHdmiHotplug(int connected) {
715a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed    if(mHDMIClient.get()) {
725a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed        ALOGD_IF(QSERVICE_DEBUG, "%s: HDMI hotplug", __FUNCTION__);
735a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed        mHDMIClient->onHdmiHotplug(connected);
745a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed    } else {
755a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed        ALOGE("%s: Failed to get a valid HDMI client", __FUNCTION__);
765a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed    }
775a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed}
785a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed
795a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmedvoid QService::onCECMessageReceived(char *msg, ssize_t len) {
805a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed    if(mHDMIClient.get()) {
815a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed        ALOGD_IF(QSERVICE_DEBUG, "%s: CEC message received", __FUNCTION__);
825a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed        mHDMIClient->onCECMessageRecieved(msg, len);
835a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed    } else {
845a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed        ALOGE("%s: Failed to get a valid HDMI client", __FUNCTION__);
855a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed    }
865a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed}
875a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed
885a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed
89c59c27830019a78f668f6fb2e9518483587ce098Saurabh Shahvoid QService::init()
90bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah{
91bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    if(!sQService) {
92c59c27830019a78f668f6fb2e9518483587ce098Saurabh Shah        sQService = new QService();
93bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah        sp<IServiceManager> sm = defaultServiceManager();
94bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah        sm->addService(String16("display.qservice"), sQService);
95bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah        if(sm->checkService(String16("display.qservice")) != NULL)
96bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah            ALOGD_IF(QSERVICE_DEBUG, "adding display.qservice succeeded");
97bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah        else
98bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah            ALOGD_IF(QSERVICE_DEBUG, "adding display.qservice failed");
99bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    }
100bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah}
101bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
102bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah}
103