ICameraService.cpp revision bfc9915f482520eb9676c6d2dbf7f1ac078d937d
1/* 2** 3** Copyright 2008, The Android Open Source Project 4** 5** Licensed under the Apache License, Version 2.0 (the "License"); 6** you may not use this file except in compliance with the License. 7** You may obtain a copy of the License at 8** 9** http://www.apache.org/licenses/LICENSE-2.0 10** 11** Unless required by applicable law or agreed to in writing, software 12** distributed under the License is distributed on an "AS IS" BASIS, 13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14** See the License for the specific language governing permissions and 15** limitations under the License. 16*/ 17 18#include <stdint.h> 19#include <sys/types.h> 20 21#include <binder/Parcel.h> 22#include <binder/IPCThreadState.h> 23#include <binder/IServiceManager.h> 24 25#include <camera/ICameraService.h> 26#include <camera/ICameraServiceListener.h> 27#include <camera/IProCameraUser.h> 28#include <camera/IProCameraCallbacks.h> 29#include <camera/ICamera.h> 30#include <camera/ICameraClient.h> 31 32namespace android { 33 34class BpCameraService: public BpInterface<ICameraService> 35{ 36public: 37 BpCameraService(const sp<IBinder>& impl) 38 : BpInterface<ICameraService>(impl) 39 { 40 } 41 42 // get number of cameras available 43 virtual int32_t getNumberOfCameras() 44 { 45 Parcel data, reply; 46 data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 47 remote()->transact(BnCameraService::GET_NUMBER_OF_CAMERAS, data, &reply); 48 return reply.readInt32(); 49 } 50 51 // get information about a camera 52 virtual status_t getCameraInfo(int cameraId, 53 struct CameraInfo* cameraInfo) { 54 Parcel data, reply; 55 data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 56 data.writeInt32(cameraId); 57 remote()->transact(BnCameraService::GET_CAMERA_INFO, data, &reply); 58 cameraInfo->facing = reply.readInt32(); 59 cameraInfo->orientation = reply.readInt32(); 60 return reply.readInt32(); 61 } 62 63 // connect to camera service 64 virtual sp<ICamera> connect(const sp<ICameraClient>& cameraClient, int cameraId, 65 const String16 &clientPackageName, int clientUid) 66 { 67 Parcel data, reply; 68 data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 69 data.writeStrongBinder(cameraClient->asBinder()); 70 data.writeInt32(cameraId); 71 data.writeString16(clientPackageName); 72 data.writeInt32(clientUid); 73 remote()->transact(BnCameraService::CONNECT, data, &reply); 74 return interface_cast<ICamera>(reply.readStrongBinder()); 75 } 76 77 // connect to camera service (pro client) 78 virtual sp<IProCameraUser> connect(const sp<IProCameraCallbacks>& cameraCb, int cameraId, 79 const String16 &clientPackageName, int clientUid) 80 { 81 Parcel data, reply; 82 data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 83 data.writeStrongBinder(cameraCb->asBinder()); 84 data.writeInt32(cameraId); 85 data.writeString16(clientPackageName); 86 data.writeInt32(clientUid); 87 remote()->transact(BnCameraService::CONNECT_PRO, data, &reply); 88 return interface_cast<IProCameraUser>(reply.readStrongBinder()); 89 } 90 91 virtual status_t addListener(const sp<ICameraServiceListener>& listener) 92 { 93 Parcel data, reply; 94 data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 95 data.writeStrongBinder(listener->asBinder()); 96 remote()->transact(BnCameraService::ADD_LISTENER, data, &reply); 97 return reply.readInt32(); 98 } 99 100 virtual status_t removeListener(const sp<ICameraServiceListener>& listener) 101 { 102 Parcel data, reply; 103 data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 104 data.writeStrongBinder(listener->asBinder()); 105 remote()->transact(BnCameraService::REMOVE_LISTENER, data, &reply); 106 return reply.readInt32(); 107 } 108}; 109 110IMPLEMENT_META_INTERFACE(CameraService, "android.hardware.ICameraService"); 111 112// ---------------------------------------------------------------------- 113 114status_t BnCameraService::onTransact( 115 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 116{ 117 switch(code) { 118 case GET_NUMBER_OF_CAMERAS: { 119 CHECK_INTERFACE(ICameraService, data, reply); 120 reply->writeInt32(getNumberOfCameras()); 121 return NO_ERROR; 122 } break; 123 case GET_CAMERA_INFO: { 124 CHECK_INTERFACE(ICameraService, data, reply); 125 CameraInfo cameraInfo; 126 memset(&cameraInfo, 0, sizeof(cameraInfo)); 127 status_t result = getCameraInfo(data.readInt32(), &cameraInfo); 128 reply->writeInt32(cameraInfo.facing); 129 reply->writeInt32(cameraInfo.orientation); 130 reply->writeInt32(result); 131 return NO_ERROR; 132 } break; 133 case CONNECT: { 134 CHECK_INTERFACE(ICameraService, data, reply); 135 sp<ICameraClient> cameraClient = 136 interface_cast<ICameraClient>(data.readStrongBinder()); 137 int32_t cameraId = data.readInt32(); 138 const String16 clientName = data.readString16(); 139 int32_t clientUid = data.readInt32(); 140 sp<ICamera> camera = connect(cameraClient, cameraId, 141 clientName, clientUid); 142 reply->writeStrongBinder(camera->asBinder()); 143 return NO_ERROR; 144 } break; 145 case CONNECT_PRO: { 146 CHECK_INTERFACE(ICameraService, data, reply); 147 sp<IProCameraCallbacks> cameraClient = interface_cast<IProCameraCallbacks>(data.readStrongBinder()); 148 int32_t cameraId = data.readInt32(); 149 const String16 clientName = data.readString16(); 150 int32_t clientUid = data.readInt32(); 151 sp<IProCameraUser> camera = connect(cameraClient, cameraId, 152 clientName, clientUid); 153 reply->writeStrongBinder(camera->asBinder()); 154 return NO_ERROR; 155 } break; 156 case ADD_LISTENER: { 157 CHECK_INTERFACE(ICameraService, data, reply); 158 sp<ICameraServiceListener> listener = 159 interface_cast<ICameraServiceListener>(data.readStrongBinder()); 160 reply->writeInt32(addListener(listener)); 161 return NO_ERROR; 162 } break; 163 case REMOVE_LISTENER: { 164 CHECK_INTERFACE(ICameraService, data, reply); 165 sp<ICameraServiceListener> listener = 166 interface_cast<ICameraServiceListener>(data.readStrongBinder()); 167 reply->writeInt32(removeListener(listener)); 168 return NO_ERROR; 169 } break; 170 default: 171 return BBinder::onTransact(code, data, reply, flags); 172 } 173} 174 175// ---------------------------------------------------------------------------- 176 177}; // namespace android 178