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