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