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