107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/*
207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Copyright (C) 2010 The Android Open Source Project
307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved.
407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *
507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Not a Contribution, Apache license notifications and license are
607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * retained for attribution purposes only.
707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Licensed under the Apache License, Version 2.0 (the "License");
907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * you may not use this file except in compliance with the License.
1007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * You may obtain a copy of the License at
1107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *
1207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *      http://www.apache.org/licenses/LICENSE-2.0
1307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *
1407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Unless required by applicable law or agreed to in writing, software
1507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * distributed under the License is distributed on an "AS IS" BASIS,
1607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * See the License for the specific language governing permissions and
1807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * limitations under the License.
1907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani */
2007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
2107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <sys/types.h>
2207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <binder/Parcel.h>
2307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <binder/IBinder.h>
2407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <binder/IInterface.h>
2507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <utils/Errors.h>
2607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <IQClient.h>
2707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
2807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniusing namespace android;
2907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
3007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// ---------------------------------------------------------------------------
3107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// XXX: Since qservice currently runs as part of hwc instead of a standalone
3207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// process, the implementation below is overridden and the notifyCallback in
3307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// hwc_qclient is directly called.
3407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
3507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaninamespace qClient {
3607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
3707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanienum {
3807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    NOTIFY_CALLBACK = IBinder::FIRST_CALL_TRANSACTION,
3907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani};
4007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
4107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniclass BpQClient : public BpInterface<IQClient>
4207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani{
4307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanipublic:
4407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    BpQClient(const sp<IBinder>& impl)
4507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        : BpInterface<IQClient>(impl) {}
4607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
4707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual status_t notifyCallback(uint32_t command,
4807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            const Parcel* inParcel,
4907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            Parcel* outParcel) {
5007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        Parcel data;
5107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        Parcel *reply = outParcel;
5207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        data.writeInterfaceToken(IQClient::getInterfaceDescriptor());
5307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        data.writeInt32(command);
5407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        if (inParcel->dataAvail())
5507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            data.appendFrom(inParcel, inParcel->dataPosition(),
5607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                    inParcel->dataAvail());
5707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        status_t result = remote()->transact(NOTIFY_CALLBACK, data, reply);
5807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        return result;
5907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
6007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani};
6107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
6207bbf1e89c031a5d41a7561433e832d396c311a5Prashant MalaniIMPLEMENT_META_INTERFACE(QClient, "android.display.IQClient");
6307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
6407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// ----------------------------------------------------------------------
6507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani//Stub implementation - nothing needed here
6607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanistatus_t BnQClient::onTransact(
6707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
6807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani{
6907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    switch(code) {
7007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        case NOTIFY_CALLBACK: {
7107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            CHECK_INTERFACE(IQClient, data, reply);
7207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            uint32_t command = data.readInt32();
7307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            notifyCallback(command, &data, reply);
7407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            return NO_ERROR;
7507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        } break;
7607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        default:
7707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            return BBinder::onTransact(code, data, reply, flags);
7807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    }
7907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
8007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}
8107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
8207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}; // namespace qClient
83