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