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