Home | History | Annotate | Download | only in sensor
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <sensor/ISensorServer.h>
     18 
     19 #include <stdint.h>
     20 #include <sys/types.h>
     21 
     22 #include <cutils/native_handle.h>
     23 #include <utils/Errors.h>
     24 #include <utils/RefBase.h>
     25 #include <utils/Vector.h>
     26 #include <utils/Timers.h>
     27 
     28 #include <binder/Parcel.h>
     29 #include <binder/IInterface.h>
     30 #include <binder/IResultReceiver.h>
     31 
     32 #include <sensor/Sensor.h>
     33 #include <sensor/ISensorEventConnection.h>
     34 
     35 namespace android {
     36 // ----------------------------------------------------------------------------
     37 
     38 enum {
     39     GET_SENSOR_LIST = IBinder::FIRST_CALL_TRANSACTION,
     40     CREATE_SENSOR_EVENT_CONNECTION,
     41     ENABLE_DATA_INJECTION,
     42     GET_DYNAMIC_SENSOR_LIST,
     43     CREATE_SENSOR_DIRECT_CONNECTION,
     44     SET_OPERATION_PARAMETER,
     45 };
     46 
     47 class BpSensorServer : public BpInterface<ISensorServer>
     48 {
     49 public:
     50     explicit BpSensorServer(const sp<IBinder>& impl)
     51         : BpInterface<ISensorServer>(impl)
     52     {
     53     }
     54 
     55     virtual ~BpSensorServer();
     56 
     57     virtual Vector<Sensor> getSensorList(const String16& opPackageName)
     58     {
     59         Parcel data, reply;
     60         data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
     61         data.writeString16(opPackageName);
     62         remote()->transact(GET_SENSOR_LIST, data, &reply);
     63         Sensor s;
     64         Vector<Sensor> v;
     65         uint32_t n = reply.readUint32();
     66         v.setCapacity(n);
     67         while (n) {
     68             n--;
     69             reply.read(s);
     70             v.add(s);
     71         }
     72         return v;
     73     }
     74 
     75     virtual Vector<Sensor> getDynamicSensorList(const String16& opPackageName)
     76     {
     77         Parcel data, reply;
     78         data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
     79         data.writeString16(opPackageName);
     80         remote()->transact(GET_DYNAMIC_SENSOR_LIST, data, &reply);
     81         Sensor s;
     82         Vector<Sensor> v;
     83         uint32_t n = reply.readUint32();
     84         v.setCapacity(n);
     85         while (n) {
     86             n--;
     87             reply.read(s);
     88             v.add(s);
     89         }
     90         return v;
     91     }
     92 
     93     virtual sp<ISensorEventConnection> createSensorEventConnection(const String8& packageName,
     94              int mode, const String16& opPackageName)
     95     {
     96         Parcel data, reply;
     97         data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
     98         data.writeString8(packageName);
     99         data.writeInt32(mode);
    100         data.writeString16(opPackageName);
    101         remote()->transact(CREATE_SENSOR_EVENT_CONNECTION, data, &reply);
    102         return interface_cast<ISensorEventConnection>(reply.readStrongBinder());
    103     }
    104 
    105     virtual int isDataInjectionEnabled() {
    106         Parcel data, reply;
    107         data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
    108         remote()->transact(ENABLE_DATA_INJECTION, data, &reply);
    109         return reply.readInt32();
    110     }
    111 
    112     virtual sp<ISensorEventConnection> createSensorDirectConnection(const String16& opPackageName,
    113             uint32_t size, int32_t type, int32_t format, const native_handle_t *resource) {
    114         Parcel data, reply;
    115         data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
    116         data.writeString16(opPackageName);
    117         data.writeUint32(size);
    118         data.writeInt32(type);
    119         data.writeInt32(format);
    120         data.writeNativeHandle(resource);
    121         remote()->transact(CREATE_SENSOR_DIRECT_CONNECTION, data, &reply);
    122         return interface_cast<ISensorEventConnection>(reply.readStrongBinder());
    123     }
    124 
    125     virtual int setOperationParameter(int32_t handle, int32_t type,
    126                                       const Vector<float> &floats,
    127                                       const Vector<int32_t> &ints) {
    128         Parcel data, reply;
    129         data.writeInterfaceToken(ISensorServer::getInterfaceDescriptor());
    130         data.writeInt32(handle);
    131         data.writeInt32(type);
    132         data.writeUint32(static_cast<uint32_t>(floats.size()));
    133         for (auto i : floats) {
    134             data.writeFloat(i);
    135         }
    136         data.writeUint32(static_cast<uint32_t>(ints.size()));
    137         for (auto i : ints) {
    138             data.writeInt32(i);
    139         }
    140         remote()->transact(SET_OPERATION_PARAMETER, data, &reply);
    141         return reply.readInt32();
    142     }
    143 };
    144 
    145 // Out-of-line virtual method definition to trigger vtable emission in this
    146 // translation unit (see clang warning -Wweak-vtables)
    147 BpSensorServer::~BpSensorServer() {}
    148 
    149 IMPLEMENT_META_INTERFACE(SensorServer, "android.gui.SensorServer");
    150 
    151 // ----------------------------------------------------------------------
    152 
    153 status_t BnSensorServer::onTransact(
    154     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
    155 {
    156     switch(code) {
    157         case GET_SENSOR_LIST: {
    158             CHECK_INTERFACE(ISensorServer, data, reply);
    159             const String16& opPackageName = data.readString16();
    160             Vector<Sensor> v(getSensorList(opPackageName));
    161             size_t n = v.size();
    162             reply->writeUint32(static_cast<uint32_t>(n));
    163             for (size_t i = 0; i < n; i++) {
    164                 reply->write(v[i]);
    165             }
    166             return NO_ERROR;
    167         }
    168         case CREATE_SENSOR_EVENT_CONNECTION: {
    169             CHECK_INTERFACE(ISensorServer, data, reply);
    170             String8 packageName = data.readString8();
    171             int32_t mode = data.readInt32();
    172             const String16& opPackageName = data.readString16();
    173             sp<ISensorEventConnection> connection(createSensorEventConnection(packageName, mode,
    174                     opPackageName));
    175             reply->writeStrongBinder(IInterface::asBinder(connection));
    176             return NO_ERROR;
    177         }
    178         case ENABLE_DATA_INJECTION: {
    179             CHECK_INTERFACE(ISensorServer, data, reply);
    180             int32_t ret = isDataInjectionEnabled();
    181             reply->writeInt32(static_cast<int32_t>(ret));
    182             return NO_ERROR;
    183         }
    184         case GET_DYNAMIC_SENSOR_LIST: {
    185             CHECK_INTERFACE(ISensorServer, data, reply);
    186             const String16& opPackageName = data.readString16();
    187             Vector<Sensor> v(getDynamicSensorList(opPackageName));
    188             size_t n = v.size();
    189             reply->writeUint32(static_cast<uint32_t>(n));
    190             for (size_t i = 0; i < n; i++) {
    191                 reply->write(v[i]);
    192             }
    193             return NO_ERROR;
    194         }
    195         case CREATE_SENSOR_DIRECT_CONNECTION: {
    196             CHECK_INTERFACE(ISensorServer, data, reply);
    197             const String16& opPackageName = data.readString16();
    198             uint32_t size = data.readUint32();
    199             int32_t type = data.readInt32();
    200             int32_t format = data.readInt32();
    201             native_handle_t *resource = data.readNativeHandle();
    202             sp<ISensorEventConnection> ch =
    203                     createSensorDirectConnection(opPackageName, size, type, format, resource);
    204             native_handle_close(resource);
    205             native_handle_delete(resource);
    206             reply->writeStrongBinder(IInterface::asBinder(ch));
    207             return NO_ERROR;
    208         }
    209         case SET_OPERATION_PARAMETER: {
    210             CHECK_INTERFACE(ISensorServer, data, reply);
    211             int32_t handle;
    212             int32_t type;
    213             Vector<float> floats;
    214             Vector<int32_t> ints;
    215 
    216             handle = data.readInt32();
    217             type = data.readInt32();
    218             floats.resize(data.readUint32());
    219             for (auto &i : floats) {
    220                 i = data.readFloat();
    221             }
    222             ints.resize(data.readUint32());
    223             for (auto &i : ints) {
    224                 i = data.readInt32();
    225             }
    226 
    227             int32_t ret = setOperationParameter(handle, type, floats, ints);
    228             reply->writeInt32(ret);
    229             return NO_ERROR;
    230         }
    231         case SHELL_COMMAND_TRANSACTION: {
    232             int in = data.readFileDescriptor();
    233             int out = data.readFileDescriptor();
    234             int err = data.readFileDescriptor();
    235             int argc = data.readInt32();
    236             Vector<String16> args;
    237             for (int i = 0; i < argc && data.dataAvail() > 0; i++) {
    238                args.add(data.readString16());
    239             }
    240             sp<IBinder> unusedCallback;
    241             sp<IResultReceiver> resultReceiver;
    242             status_t status;
    243             if ((status = data.readNullableStrongBinder(&unusedCallback)) != NO_ERROR) {
    244                 return status;
    245             }
    246             if ((status = data.readNullableStrongBinder(&resultReceiver)) != NO_ERROR) {
    247                 return status;
    248             }
    249             status = shellCommand(in, out, err, args);
    250             if (resultReceiver != nullptr) {
    251                 resultReceiver->send(status);
    252             }
    253             return NO_ERROR;
    254         }
    255     }
    256     return BBinder::onTransact(code, data, reply, flags);
    257 }
    258 
    259 // ----------------------------------------------------------------------------
    260 }; // namespace android
    261