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