1ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* 2ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Copyright (C) 2010 The Android Open Source Project 3ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved. 4ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 5ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Not a Contribution, Apache license notifications and license are 6ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * retained for attribution purposes only. 7ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 8ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 9ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * you may not use this file except in compliance with the License. 10ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * You may obtain a copy of the License at 11ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 12ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * http://www.apache.org/licenses/LICENSE-2.0 13ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 14ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Unless required by applicable law or agreed to in writing, software 15ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * distributed under the License is distributed on an "AS IS" BASIS, 16ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * See the License for the specific language governing permissions and 18ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * limitations under the License. 19ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson */ 20ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 21ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <sys/types.h> 22ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <binder/Parcel.h> 23ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <binder/IBinder.h> 24ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <binder/IInterface.h> 25ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <utils/Errors.h> 26ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <IQClient.h> 27ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 28ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace android; 29ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 30ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// --------------------------------------------------------------------------- 31a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// XXX: Since qservice currently runs as part of hwc instead of a standalone 32a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// process, the implementation below is overridden and the notifyCallback in 33a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// hwc_qclient is directly called. 34ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 35ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace qClient { 36ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 37ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonenum { 38ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson NOTIFY_CALLBACK = IBinder::FIRST_CALL_TRANSACTION, 39ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}; 40ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 41ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonclass BpQClient : public BpInterface<IQClient> 42ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 43ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonpublic: 44ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson BpQClient(const sp<IBinder>& impl) 45ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson : BpInterface<IQClient>(impl) {} 46ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 47a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson virtual status_t notifyCallback(uint32_t command, 48a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const Parcel* inParcel, 49a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Parcel* outParcel) { 50a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Parcel data; 51a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Parcel *reply = outParcel; 52ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson data.writeInterfaceToken(IQClient::getInterfaceDescriptor()); 53a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson data.writeInt32(command); 54a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (inParcel->dataAvail()) 55a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson data.appendFrom(inParcel, inParcel->dataPosition(), 56a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson inParcel->dataAvail()); 57a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson status_t result = remote()->transact(NOTIFY_CALLBACK, data, reply); 58ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return result; 59ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 60ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}; 61ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 62ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon WilsonIMPLEMENT_META_INTERFACE(QClient, "android.display.IQClient"); 63ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 64ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// ---------------------------------------------------------------------- 65a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson//Stub implementation - nothing needed here 66ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatus_t BnQClient::onTransact( 67ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 68ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 69ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson switch(code) { 70ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case NOTIFY_CALLBACK: { 71ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson CHECK_INTERFACE(IQClient, data, reply); 72a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson uint32_t command = data.readInt32(); 73a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson notifyCallback(command, &data, reply); 74ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return NO_ERROR; 75ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } break; 76ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson default: 77ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return BBinder::onTransact(code, data, reply, flags); 78ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 79a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 80ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 81ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 82ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}; // namespace qClient 83