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 32 namespace android { 33 34 class BpCameraService: public BpInterface<ICameraService> 35 { 36 public: 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 110 IMPLEMENT_META_INTERFACE(CameraService, "android.hardware.ICameraService"); 111 112 // ---------------------------------------------------------------------- 113 114 status_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