1589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian/*
2589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * Copyright (C) 2010 The Android Open Source Project
3589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian *
4589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
5589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * you may not use this file except in compliance with the License.
6589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * You may obtain a copy of the License at
7589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian *
8589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
9589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian *
10589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * Unless required by applicable law or agreed to in writing, software
11589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
12589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * See the License for the specific language governing permissions and
14589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian * limitations under the License.
15589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian */
16589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
17589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <stdint.h>
18589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <sys/types.h>
19589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
20589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/Errors.h>
21589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/RefBase.h>
22589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/Vector.h>
23589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/Timers.h>
24589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
25589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <binder/Parcel.h>
26589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <binder/IInterface.h>
27589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
28589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <gui/Sensor.h>
29589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <gui/ISensorServer.h>
30589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <gui/ISensorEventConnection.h>
31589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
32589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiannamespace android {
33589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ----------------------------------------------------------------------------
34589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
35589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianenum {
36589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    GET_SENSOR_LIST = IBinder::FIRST_CALL_TRANSACTION,
37589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    CREATE_SENSOR_EVENT_CONNECTION,
38a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella    ENABLE_DATA_INJECTION
39589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian};
40589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
41589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianclass BpSensorServer : public BpInterface<ISensorServer>
42589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
43589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianpublic:
44589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    BpSensorServer(const sp<IBinder>& impl)
45589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        : BpInterface<ISensorServer>(impl)
46589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    {
47589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    }
48589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
49d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza    virtual ~BpSensorServer();
50d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
51b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav    virtual Vector<Sensor> getSensorList(const String16& opPackageName)
52589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    {
53589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        Parcel data, reply;
54a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian        data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
55b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav        data.writeString16(opPackageName);
56589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        remote()->transact(GET_SENSOR_LIST, data, &reply);
57589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        Sensor s;
58589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        Vector<Sensor> v;
59d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        uint32_t n = reply.readUint32();
60589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        v.setCapacity(n);
61589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        while (n--) {
628683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian            reply.read(s);
63589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian            v.add(s);
64589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        }
65589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        return v;
66589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    }
67589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
68a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella    virtual sp<ISensorEventConnection> createSensorEventConnection(const String8& packageName,
69b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav             int mode, const String16& opPackageName)
70589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    {
71589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        Parcel data, reply;
72a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian        data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
734949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella        data.writeString8(packageName);
74a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella        data.writeInt32(mode);
75b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav        data.writeString16(opPackageName);
76589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        remote()->transact(CREATE_SENSOR_EVENT_CONNECTION, data, &reply);
77589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        return interface_cast<ISensorEventConnection>(reply.readStrongBinder());
78589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    }
79a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella
80841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akella    virtual int isDataInjectionEnabled() {
81a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella        Parcel data, reply;
82a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella        data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
83a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella        remote()->transact(ENABLE_DATA_INJECTION, data, &reply);
84a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella        return reply.readInt32();
85a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella    }
86589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian};
87589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
88d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// Out-of-line virtual method definition to trigger vtable emission in this
89d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// translation unit (see clang warning -Wweak-vtables)
90d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan StozaBpSensorServer::~BpSensorServer() {}
91d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
92589ce85ee4174829cfedce91b6b2509d2a4002ebMathias AgopianIMPLEMENT_META_INTERFACE(SensorServer, "android.gui.SensorServer");
93589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
94589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ----------------------------------------------------------------------
95589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
96589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianstatus_t BnSensorServer::onTransact(
97589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
98589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
99589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    switch(code) {
100589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        case GET_SENSOR_LIST: {
101589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian            CHECK_INTERFACE(ISensorServer, data, reply);
102b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav            const String16& opPackageName = data.readString16();
103b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav            Vector<Sensor> v(getSensorList(opPackageName));
104589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian            size_t n = v.size();
105d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            reply->writeUint32(static_cast<uint32_t>(n));
106d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            for (size_t i = 0; i < n; i++) {
1078683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian                reply->write(v[i]);
108589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian            }
109589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian            return NO_ERROR;
110d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        }
111589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        case CREATE_SENSOR_EVENT_CONNECTION: {
112589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian            CHECK_INTERFACE(ISensorServer, data, reply);
1134949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella            String8 packageName = data.readString8();
114a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella            int32_t mode = data.readInt32();
115b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav            const String16& opPackageName = data.readString16();
116b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav            sp<ISensorEventConnection> connection(createSensorEventConnection(packageName, mode,
117b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav                    opPackageName));
1182ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(connection));
119589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian            return NO_ERROR;
120d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        }
121a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella        case ENABLE_DATA_INJECTION: {
122a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella            CHECK_INTERFACE(ISensorServer, data, reply);
123841a5926fc9b3f9f0e654ba3aab8e43bea7de7f1Aravind Akella            int32_t ret = isDataInjectionEnabled();
124a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella            reply->writeInt32(static_cast<int32_t>(ret));
125a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella            return NO_ERROR;
126a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella        }
127589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    }
128589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return BBinder::onTransact(code, data, reply, flags);
129589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
130589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
131589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ----------------------------------------------------------------------------
132589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}; // namespace android
133