12ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel/* 22ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * Copyright (C) 2010 The Android Open Source Project 32ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved. 42ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * 52ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * Not a Contribution, Apache license notifications and license are 62ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * retained for attribution purposes only. 72ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 82ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * Licensed under the Apache License, Version 2.0 (the "License"); 92ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * you may not use this file except in compliance with the License. 102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * You may obtain a copy of the License at 112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * 122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * http://www.apache.org/licenses/LICENSE-2.0 132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * 142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * Unless required by applicable law or agreed to in writing, software 152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * distributed under the License is distributed on an "AS IS" BASIS, 162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * See the License for the specific language governing permissions and 182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * limitations under the License. 192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel */ 202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <sys/types.h> 222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <binder/Parcel.h> 232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <binder/IBinder.h> 242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <binder/IInterface.h> 252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/Errors.h> 262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <IQClient.h> 272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelusing namespace android; 292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// --------------------------------------------------------------------------- 312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// XXX: Since qservice currently runs as part of hwc instead of a standalone 322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// process, the implementation below is overridden and the notifyCallback in 332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// hwc_qclient is directly called. 342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelnamespace qClient { 362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelenum { 382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel NOTIFY_CALLBACK = IBinder::FIRST_CALL_TRANSACTION, 392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}; 402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelclass BpQClient : public BpInterface<IQClient> 422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel{ 432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelpublic: 442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel BpQClient(const sp<IBinder>& impl) 452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel : BpInterface<IQClient>(impl) {} 462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel virtual status_t notifyCallback(uint32_t command, 482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const Parcel* inParcel, 492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel* outParcel) { 502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel data; 512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Parcel *reply = outParcel; 522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel data.writeInterfaceToken(IQClient::getInterfaceDescriptor()); 532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel data.writeInt32(command); 542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (inParcel->dataAvail()) 552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel data.appendFrom(inParcel, inParcel->dataPosition(), 562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inParcel->dataAvail()); 572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel status_t result = remote()->transact(NOTIFY_CALLBACK, data, reply); 582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return result; 592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}; 612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelIMPLEMENT_META_INTERFACE(QClient, "android.display.IQClient"); 632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// ---------------------------------------------------------------------- 652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel//Stub implementation - nothing needed here 662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelstatus_t BnQClient::onTransact( 672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel{ 692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel switch(code) { 702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel case NOTIFY_CALLBACK: { 712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel CHECK_INTERFACE(IQClient, data, reply); 722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel uint32_t command = data.readInt32(); 732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel notifyCallback(command, &data, reply); 742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return NO_ERROR; 752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } break; 762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel default: 772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return BBinder::onTransact(code, data, reply, flags); 782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}; // namespace qClient 83