1054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*
2054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Copyright (C) 2010 The Android Open Source Project
3054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved.
4054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
5054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Not a Contribution, Apache license notifications and license are
6054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * retained for attribution purposes only.
7054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
8054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Licensed under the Apache License, Version 2.0 (the "License");
9054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * you may not use this file except in compliance with the License.
10054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * You may obtain a copy of the License at
11054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
12054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *      http://www.apache.org/licenses/LICENSE-2.0
13054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
14054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Unless required by applicable law or agreed to in writing, software
15054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * distributed under the License is distributed on an "AS IS" BASIS,
16054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * See the License for the specific language governing permissions and
18054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * limitations under the License.
19054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */
20054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
21054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <sys/types.h>
22054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <binder/Parcel.h>
23054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <binder/IBinder.h>
24054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <binder/IInterface.h>
25054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <utils/Errors.h>
26054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <IQClient.h>
27054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
28054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinusing namespace android;
29054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
30054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// ---------------------------------------------------------------------------
31054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// XXX: Since qservice currently runs as part of hwc instead of a standalone
32054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// process, the implementation below is overridden and the notifyCallback in
33054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// hwc_qclient is directly called.
34054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
35054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinnamespace qClient {
36054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
37054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinenum {
38054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    NOTIFY_CALLBACK = IBinder::FIRST_CALL_TRANSACTION,
39054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin};
40054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
41054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinclass BpQClient : public BpInterface<IQClient>
42054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
43054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinpublic:
44054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    BpQClient(const sp<IBinder>& impl)
45054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        : BpInterface<IQClient>(impl) {}
46054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
47054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual status_t notifyCallback(uint32_t command,
48054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            const Parcel* inParcel,
49054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            Parcel* outParcel) {
50054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        Parcel data;
51054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        Parcel *reply = outParcel;
52054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        data.writeInterfaceToken(IQClient::getInterfaceDescriptor());
53054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        data.writeInt32(command);
54054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (inParcel->dataAvail())
55054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            data.appendFrom(inParcel, inParcel->dataPosition(),
56054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    inParcel->dataAvail());
57054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        status_t result = remote()->transact(NOTIFY_CALLBACK, data, reply);
58054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return result;
59054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
60054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin};
61054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
62054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinIMPLEMENT_META_INTERFACE(QClient, "android.display.IQClient");
63054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
64054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// ----------------------------------------------------------------------
65054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin//Stub implementation - nothing needed here
66054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatus_t BnQClient::onTransact(
67054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
68054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
69054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    switch(code) {
70054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case NOTIFY_CALLBACK: {
71054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            CHECK_INTERFACE(IQClient, data, reply);
72054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            uint32_t command = data.readInt32();
73054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            notifyCallback(command, &data, reply);
74054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            return NO_ERROR;
75054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        } break;
76054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        default:
77054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            return BBinder::onTransact(code, data, reply, flags);
78054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
79054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
80054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
81054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
82054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}; // namespace qClient
83