1054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*
2054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *  Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
3054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
4054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Redistribution and use in source and binary forms, with or without
5054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * modification, are permitted provided that the following conditions are
6054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * met:
7054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *     * Redistributions of source code must retain the above copyright
8054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *       notice, this list of conditions and the following disclaimer.
9054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *     * Redistributions in binary form must reproduce the above
10054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *       copyright notice, this list of conditions and the following
11054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *       disclaimer in the documentation and/or other materials provided
12054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *       with the distribution.
13054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *     * Neither the name of The Linux Foundation nor the names of its
14054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *       contributors may be used to endorse or promote products derived
15054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *       from this software without specific prior written permission.
16054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
17054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */
29054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
30054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <QService.h>
31054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <binder/Parcel.h>
32054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <binder/IPCThreadState.h>
33054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
34054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define QSERVICE_DEBUG 0
35054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
36054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinusing namespace android;
37054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
38054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinnamespace qService {
39054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
40054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinQService* QService::sQService = NULL;
41054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// ----------------------------------------------------------------------------
42054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinQService::QService()
43054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
44054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ALOGD_IF(QSERVICE_DEBUG, "QService Constructor invoked");
45054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
46054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
47054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinQService::~QService()
48054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
49054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ALOGD_IF(QSERVICE_DEBUG,"QService Destructor invoked");
50054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
51054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
52054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid QService::connect(const sp<qClient::IQClient>& client) {
53054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ALOGD_IF(QSERVICE_DEBUG,"client connected");
54054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mClient = client;
55054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
56054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
57054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatus_t QService::dispatch(uint32_t command, const Parcel* inParcel,
58054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        Parcel* outParcel) {
59054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    status_t err = (status_t) FAILED_TRANSACTION;
60054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    IPCThreadState* ipc = IPCThreadState::self();
61054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    //Rewind parcel in case we're calling from the same process
62054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (ipc->getCallingPid() == getpid())
63054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        inParcel->setDataPosition(0);
64054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (mClient.get()) {
65054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        ALOGD_IF(QSERVICE_DEBUG, "Dispatching command: %d", command);
66054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        err = mClient->notifyCallback(command, inParcel, outParcel);
67054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
68054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return err;
69054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
70054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
71054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid QService::init()
72054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
73054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(!sQService) {
74054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        sQService = new QService();
75054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        sp<IServiceManager> sm = defaultServiceManager();
76054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        sm->addService(String16("display.qservice"), sQService);
77054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if(sm->checkService(String16("display.qservice")) != NULL)
78054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            ALOGD_IF(QSERVICE_DEBUG, "adding display.qservice succeeded");
79054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        else
80054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            ALOGD_IF(QSERVICE_DEBUG, "adding display.qservice failed");
81054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
82054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
83054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
84054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
85