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
17801ea093b0e923a61b832f2adba698a273479880Mathias Agopian#include <sensor/ISensorServer.h>
18801ea093b0e923a61b832f2adba698a273479880Mathias Agopian
19589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <stdint.h>
20589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <sys/types.h>
21589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
22e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu#include <cutils/native_handle.h>
23589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/Errors.h>
24589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/RefBase.h>
25589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/Vector.h>
26589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <utils/Timers.h>
27589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
28589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <binder/Parcel.h>
29589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian#include <binder/IInterface.h>
30e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov#include <binder/IResultReceiver.h>
31589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
32801ea093b0e923a61b832f2adba698a273479880Mathias Agopian#include <sensor/Sensor.h>
33801ea093b0e923a61b832f2adba698a273479880Mathias Agopian#include <sensor/ISensorEventConnection.h>
34589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
35589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopiannamespace android {
36589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ----------------------------------------------------------------------------
37589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
38589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianenum {
39589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    GET_SENSOR_LIST = IBinder::FIRST_CALL_TRANSACTION,
40589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    CREATE_SENSOR_EVENT_CONNECTION,
412576cb63b3fe1592f54816625036566b9eb0793aPeng Xu    ENABLE_DATA_INJECTION,
422576cb63b3fe1592f54816625036566b9eb0793aPeng Xu    GET_DYNAMIC_SENSOR_LIST,
43e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    CREATE_SENSOR_DIRECT_CONNECTION,
44dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu    SET_OPERATION_PARAMETER,
45589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian};
46589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
47589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianclass BpSensorServer : public BpInterface<ISensorServer>
48589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
49589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianpublic:
50e2347b7953f70232541bdc1b392230d6231aaeb9Chih-Hung Hsieh    explicit BpSensorServer(const sp<IBinder>& impl)
51589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        : BpInterface<ISensorServer>(impl)
52589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    {
53589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    }
54589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
55d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza    virtual ~BpSensorServer();
56d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
57b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav    virtual Vector<Sensor> getSensorList(const String16& opPackageName)
58589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    {
59589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        Parcel data, reply;
60a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian        data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
61b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav        data.writeString16(opPackageName);
62589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        remote()->transact(GET_SENSOR_LIST, data, &reply);
63589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        Sensor s;
64589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        Vector<Sensor> v;
65d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        uint32_t n = reply.readUint32();
66589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        v.setCapacity(n);
677acfd3175237197b0440e9a337d1db9ebdf20c55Ivan Lozano        while (n) {
687acfd3175237197b0440e9a337d1db9ebdf20c55Ivan Lozano            n--;
698683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian            reply.read(s);
70589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian            v.add(s);
71589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        }
72589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        return v;
73589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    }
74589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
752576cb63b3fe1592f54816625036566b9eb0793aPeng Xu    virtual Vector<Sensor> getDynamicSensorList(const String16& opPackageName)
762576cb63b3fe1592f54816625036566b9eb0793aPeng Xu    {
772576cb63b3fe1592f54816625036566b9eb0793aPeng Xu        Parcel data, reply;
782576cb63b3fe1592f54816625036566b9eb0793aPeng Xu        data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
792576cb63b3fe1592f54816625036566b9eb0793aPeng Xu        data.writeString16(opPackageName);
802576cb63b3fe1592f54816625036566b9eb0793aPeng Xu        remote()->transact(GET_DYNAMIC_SENSOR_LIST, data, &reply);
812576cb63b3fe1592f54816625036566b9eb0793aPeng Xu        Sensor s;
822576cb63b3fe1592f54816625036566b9eb0793aPeng Xu        Vector<Sensor> v;
832576cb63b3fe1592f54816625036566b9eb0793aPeng Xu        uint32_t n = reply.readUint32();
842576cb63b3fe1592f54816625036566b9eb0793aPeng Xu        v.setCapacity(n);
857acfd3175237197b0440e9a337d1db9ebdf20c55Ivan Lozano        while (n) {
867acfd3175237197b0440e9a337d1db9ebdf20c55Ivan Lozano            n--;
872576cb63b3fe1592f54816625036566b9eb0793aPeng Xu            reply.read(s);
882576cb63b3fe1592f54816625036566b9eb0793aPeng Xu            v.add(s);
892576cb63b3fe1592f54816625036566b9eb0793aPeng Xu        }
902576cb63b3fe1592f54816625036566b9eb0793aPeng Xu        return v;
912576cb63b3fe1592f54816625036566b9eb0793aPeng Xu    }
922576cb63b3fe1592f54816625036566b9eb0793aPeng Xu
93a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella    virtual sp<ISensorEventConnection> createSensorEventConnection(const String8& packageName,
94b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav             int mode, const String16& opPackageName)
95589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    {
96589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        Parcel data, reply;
97a7352c9f4a6e642c29782b19db5bc0bd98feddc8Mathias Agopian        data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
984949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella        data.writeString8(packageName);
99a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella        data.writeInt32(mode);
100b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav        data.writeString16(opPackageName);
101589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        remote()->transact(CREATE_SENSOR_EVENT_CONNECTION, data, &reply);
102589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        return interface_cast<ISensorEventConnection>(reply.readStrongBinder());
103589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    }
104a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella
1055c538053346107a8ec704d8769059ab6a23ebeefAravind Akella    virtual int isDataInjectionEnabled() {
106a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella        Parcel data, reply;
107a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella        data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
108a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella        remote()->transact(ENABLE_DATA_INJECTION, data, &reply);
109a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella        return reply.readInt32();
110a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella    }
111e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu
112e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    virtual sp<ISensorEventConnection> createSensorDirectConnection(const String16& opPackageName,
113e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu            uint32_t size, int32_t type, int32_t format, const native_handle_t *resource) {
114e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu        Parcel data, reply;
115e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu        data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
116e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu        data.writeString16(opPackageName);
117e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu        data.writeUint32(size);
118e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu        data.writeInt32(type);
119e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu        data.writeInt32(format);
120e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu        data.writeNativeHandle(resource);
121e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu        remote()->transact(CREATE_SENSOR_DIRECT_CONNECTION, data, &reply);
122e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu        return interface_cast<ISensorEventConnection>(reply.readStrongBinder());
123e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu    }
124dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu
12588711e8755e729682f32ee304d1cf0f60a3642bfAlexey Polyudov    virtual int setOperationParameter(int32_t handle, int32_t type,
12688711e8755e729682f32ee304d1cf0f60a3642bfAlexey Polyudov                                      const Vector<float> &floats,
12788711e8755e729682f32ee304d1cf0f60a3642bfAlexey Polyudov                                      const Vector<int32_t> &ints) {
128dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu        Parcel data, reply;
129dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu        data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
13088711e8755e729682f32ee304d1cf0f60a3642bfAlexey Polyudov        data.writeInt32(handle);
131dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu        data.writeInt32(type);
132dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu        data.writeUint32(static_cast<uint32_t>(floats.size()));
133dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu        for (auto i : floats) {
134dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu            data.writeFloat(i);
135dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu        }
136dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu        data.writeUint32(static_cast<uint32_t>(ints.size()));
137dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu        for (auto i : ints) {
138dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu            data.writeInt32(i);
139dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu        }
140dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu        remote()->transact(SET_OPERATION_PARAMETER, data, &reply);
141dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu        return reply.readInt32();
142dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu    }
143589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian};
144589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
145d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// Out-of-line virtual method definition to trigger vtable emission in this
146d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// translation unit (see clang warning -Wweak-vtables)
147d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan StozaBpSensorServer::~BpSensorServer() {}
148d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
149589ce85ee4174829cfedce91b6b2509d2a4002ebMathias AgopianIMPLEMENT_META_INTERFACE(SensorServer, "android.gui.SensorServer");
150589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
151589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ----------------------------------------------------------------------
152589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
153589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopianstatus_t BnSensorServer::onTransact(
154589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
155589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian{
156589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    switch(code) {
157589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        case GET_SENSOR_LIST: {
158589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian            CHECK_INTERFACE(ISensorServer, data, reply);
159b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav            const String16& opPackageName = data.readString16();
160b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav            Vector<Sensor> v(getSensorList(opPackageName));
161589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian            size_t n = v.size();
162d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            reply->writeUint32(static_cast<uint32_t>(n));
163d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            for (size_t i = 0; i < n; i++) {
1648683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian                reply->write(v[i]);
165589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian            }
166589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian            return NO_ERROR;
167d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        }
168589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian        case CREATE_SENSOR_EVENT_CONNECTION: {
169589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian            CHECK_INTERFACE(ISensorServer, data, reply);
1704949c50372de4c7fdb57de1dc0c1f5bb3ac463ebAravind Akella            String8 packageName = data.readString8();
171a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella            int32_t mode = data.readInt32();
172b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav            const String16& opPackageName = data.readString16();
173b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav            sp<ISensorEventConnection> connection(createSensorEventConnection(packageName, mode,
174b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav                    opPackageName));
1752ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(connection));
176589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian            return NO_ERROR;
177d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        }
178a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella        case ENABLE_DATA_INJECTION: {
179a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella            CHECK_INTERFACE(ISensorServer, data, reply);
1805c538053346107a8ec704d8769059ab6a23ebeefAravind Akella            int32_t ret = isDataInjectionEnabled();
181a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella            reply->writeInt32(static_cast<int32_t>(ret));
182a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella            return NO_ERROR;
183a9e6cc387072e25706a6d847a97b02a6f25a918bAravind Akella        }
1842576cb63b3fe1592f54816625036566b9eb0793aPeng Xu        case GET_DYNAMIC_SENSOR_LIST: {
1852576cb63b3fe1592f54816625036566b9eb0793aPeng Xu            CHECK_INTERFACE(ISensorServer, data, reply);
1862576cb63b3fe1592f54816625036566b9eb0793aPeng Xu            const String16& opPackageName = data.readString16();
1872576cb63b3fe1592f54816625036566b9eb0793aPeng Xu            Vector<Sensor> v(getDynamicSensorList(opPackageName));
1882576cb63b3fe1592f54816625036566b9eb0793aPeng Xu            size_t n = v.size();
1892576cb63b3fe1592f54816625036566b9eb0793aPeng Xu            reply->writeUint32(static_cast<uint32_t>(n));
1902576cb63b3fe1592f54816625036566b9eb0793aPeng Xu            for (size_t i = 0; i < n; i++) {
1912576cb63b3fe1592f54816625036566b9eb0793aPeng Xu                reply->write(v[i]);
1922576cb63b3fe1592f54816625036566b9eb0793aPeng Xu            }
1932576cb63b3fe1592f54816625036566b9eb0793aPeng Xu            return NO_ERROR;
1942576cb63b3fe1592f54816625036566b9eb0793aPeng Xu        }
195e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu        case CREATE_SENSOR_DIRECT_CONNECTION: {
196e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu            CHECK_INTERFACE(ISensorServer, data, reply);
197e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu            const String16& opPackageName = data.readString16();
198e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu            uint32_t size = data.readUint32();
199e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu            int32_t type = data.readInt32();
200e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu            int32_t format = data.readInt32();
201e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu            native_handle_t *resource = data.readNativeHandle();
202e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu            sp<ISensorEventConnection> ch =
203e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu                    createSensorDirectConnection(opPackageName, size, type, format, resource);
204e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu            native_handle_close(resource);
205e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu            native_handle_delete(resource);
206e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu            reply->writeStrongBinder(IInterface::asBinder(ch));
207e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu            return NO_ERROR;
208e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu        }
209dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu        case SET_OPERATION_PARAMETER: {
210dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu            CHECK_INTERFACE(ISensorServer, data, reply);
21188711e8755e729682f32ee304d1cf0f60a3642bfAlexey Polyudov            int32_t handle;
212dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu            int32_t type;
213dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu            Vector<float> floats;
214dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu            Vector<int32_t> ints;
215dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu
21688711e8755e729682f32ee304d1cf0f60a3642bfAlexey Polyudov            handle = data.readInt32();
217dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu            type = data.readInt32();
218dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu            floats.resize(data.readUint32());
219dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu            for (auto &i : floats) {
220dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu                i = data.readFloat();
221dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu            }
222dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu            ints.resize(data.readUint32());
223dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu            for (auto &i : ints) {
224dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu                i = data.readInt32();
225dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu            }
226dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu
22788711e8755e729682f32ee304d1cf0f60a3642bfAlexey Polyudov            int32_t ret = setOperationParameter(handle, type, floats, ints);
228dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu            reply->writeInt32(ret);
229dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu            return NO_ERROR;
230dd5c5cb3b8f3df9b458dff74e247b9a542befee7Peng Xu        }
231e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov        case SHELL_COMMAND_TRANSACTION: {
232e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov            int in = data.readFileDescriptor();
233e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov            int out = data.readFileDescriptor();
234e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov            int err = data.readFileDescriptor();
235e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov            int argc = data.readInt32();
236e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov            Vector<String16> args;
237e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov            for (int i = 0; i < argc && data.dataAvail() > 0; i++) {
238e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov               args.add(data.readString16());
239e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov            }
240e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov            sp<IBinder> unusedCallback;
241e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov            sp<IResultReceiver> resultReceiver;
242e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov            status_t status;
243e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov            if ((status = data.readNullableStrongBinder(&unusedCallback)) != NO_ERROR) {
244e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov                return status;
245e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov            }
246e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov            if ((status = data.readNullableStrongBinder(&resultReceiver)) != NO_ERROR) {
247e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov                return status;
248e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov            }
249e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov            status = shellCommand(in, out, err, args);
250e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov            if (resultReceiver != nullptr) {
251e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov                resultReceiver->send(status);
252e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov            }
253e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov            return NO_ERROR;
254e752a5cc64b78f799525aa4e44e5f74e8c402465Svet Ganov        }
255589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    }
256589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian    return BBinder::onTransact(code, data, reply, flags);
257589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}
258589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian
259589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian// ----------------------------------------------------------------------------
260589ce85ee4174829cfedce91b6b2509d2a4002ebMathias Agopian}; // namespace android
261