blob: 4a042a6dfefaac24840279261e82c51d71a9e469 [file] [log] [blame]
Mathias Agopian3cf61352010-02-09 17:46:37 -08001/*
2**
3** Copyright 2008, The Android Open Source Project
4**
Ruben Brunk9efdf952015-03-18 23:11:57 -07005** 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
Mathias Agopian3cf61352010-02-09 17:46:37 -08008**
Ruben Brunk9efdf952015-03-18 23:11:57 -07009** http://www.apache.org/licenses/LICENSE-2.0
Mathias Agopian3cf61352010-02-09 17:46:37 -080010**
Ruben Brunk9efdf952015-03-18 23:11:57 -070011** 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
Mathias Agopian3cf61352010-02-09 17:46:37 -080015** limitations under the License.
16*/
17
Igor Murashkinbef3f232013-05-30 17:47:38 -070018#define LOG_TAG "BpCameraService"
19#include <utils/Log.h>
Ruben Brunkd1176ef2014-02-21 10:51:38 -080020#include <utils/Errors.h>
Igor Murashkin65d14b92014-06-17 12:03:20 -070021#include <utils/String16.h>
Igor Murashkinbef3f232013-05-30 17:47:38 -070022
Ruben Brunk6267b532015-04-30 17:44:07 -070023#include <inttypes.h>
Mathias Agopian3cf61352010-02-09 17:46:37 -080024#include <stdint.h>
25#include <sys/types.h>
26
27#include <binder/Parcel.h>
28#include <binder/IPCThreadState.h>
29#include <binder/IServiceManager.h>
30
31#include <camera/ICameraService.h>
Igor Murashkinbfc99152013-02-27 12:55:20 -080032#include <camera/ICameraServiceListener.h>
Igor Murashkinc073ba52013-02-26 14:32:34 -080033#include <camera/ICamera.h>
34#include <camera/ICameraClient.h>
Eino-Ville Talvala7b82efe2013-07-25 17:12:35 -070035#include <camera/camera2/ICameraDeviceUser.h>
36#include <camera/camera2/ICameraDeviceCallbacks.h>
Zhijun He2b59be82013-09-25 10:14:30 -070037#include <camera/CameraMetadata.h>
Ruben Brunkd1176ef2014-02-21 10:51:38 -080038#include <camera/VendorTagDescriptor.h>
Mathias Agopian3cf61352010-02-09 17:46:37 -080039
40namespace android {
41
Igor Murashkinbef3f232013-05-30 17:47:38 -070042namespace {
43
44enum {
45 EX_SECURITY = -1,
46 EX_BAD_PARCELABLE = -2,
47 EX_ILLEGAL_ARGUMENT = -3,
48 EX_NULL_POINTER = -4,
49 EX_ILLEGAL_STATE = -5,
50 EX_HAS_REPLY_HEADER = -128, // special; see below
51};
52
53static bool readExceptionCode(Parcel& reply) {
54 int32_t exceptionCode = reply.readExceptionCode();
55
56 if (exceptionCode != 0) {
57 const char* errorMsg;
58 switch(exceptionCode) {
59 case EX_SECURITY:
60 errorMsg = "Security";
61 break;
62 case EX_BAD_PARCELABLE:
63 errorMsg = "BadParcelable";
64 break;
65 case EX_NULL_POINTER:
66 errorMsg = "NullPointer";
67 break;
68 case EX_ILLEGAL_STATE:
69 errorMsg = "IllegalState";
70 break;
71 // Binder should be handling this code inside Parcel::readException
72 // but lets have a to-string here anyway just in case.
73 case EX_HAS_REPLY_HEADER:
74 errorMsg = "HasReplyHeader";
75 break;
76 default:
77 errorMsg = "Unknown";
78 }
79
80 ALOGE("Binder transmission error %s (%d)", errorMsg, exceptionCode);
81 return true;
82 }
83
84 return false;
85}
86
87};
88
Mathias Agopian3cf61352010-02-09 17:46:37 -080089class BpCameraService: public BpInterface<ICameraService>
90{
91public:
92 BpCameraService(const sp<IBinder>& impl)
93 : BpInterface<ICameraService>(impl)
94 {
95 }
96
Eino-Ville Talvalabad43582015-08-14 13:12:32 -070097 // get number of cameras available that support standard camera operations
Chih-Chung Chang35a055b2010-05-06 16:36:58 +080098 virtual int32_t getNumberOfCameras()
99 {
Eino-Ville Talvalabad43582015-08-14 13:12:32 -0700100 return getNumberOfCameras(CAMERA_TYPE_BACKWARD_COMPATIBLE);
101 }
102
103 // get number of cameras available of a given type
104 virtual int32_t getNumberOfCameras(int type)
105 {
Chih-Chung Chang35a055b2010-05-06 16:36:58 +0800106 Parcel data, reply;
107 data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
Eino-Ville Talvalabad43582015-08-14 13:12:32 -0700108 data.writeInt32(type);
Chih-Chung Chang35a055b2010-05-06 16:36:58 +0800109 remote()->transact(BnCameraService::GET_NUMBER_OF_CAMERAS, data, &reply);
Igor Murashkinbef3f232013-05-30 17:47:38 -0700110
111 if (readExceptionCode(reply)) return 0;
Chih-Chung Chang35a055b2010-05-06 16:36:58 +0800112 return reply.readInt32();
113 }
114
Chih-Chung Changddbdb352010-06-10 13:32:16 +0800115 // get information about a camera
116 virtual status_t getCameraInfo(int cameraId,
117 struct CameraInfo* cameraInfo) {
118 Parcel data, reply;
119 data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
120 data.writeInt32(cameraId);
121 remote()->transact(BnCameraService::GET_CAMERA_INFO, data, &reply);
Igor Murashkinbef3f232013-05-30 17:47:38 -0700122
123 if (readExceptionCode(reply)) return -EPROTO;
124 status_t result = reply.readInt32();
125 if (reply.readInt32() != 0) {
126 cameraInfo->facing = reply.readInt32();
127 cameraInfo->orientation = reply.readInt32();
128 }
129 return result;
Chih-Chung Changddbdb352010-06-10 13:32:16 +0800130 }
131
Zhijun He2b59be82013-09-25 10:14:30 -0700132 // get camera characteristics (static metadata)
133 virtual status_t getCameraCharacteristics(int cameraId,
134 CameraMetadata* cameraInfo) {
135 Parcel data, reply;
136 data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
137 data.writeInt32(cameraId);
138 remote()->transact(BnCameraService::GET_CAMERA_CHARACTERISTICS, data, &reply);
139
140 if (readExceptionCode(reply)) return -EPROTO;
141 status_t result = reply.readInt32();
142
143 CameraMetadata out;
144 if (reply.readInt32() != 0) {
145 out.readFromParcel(&reply);
146 }
147
148 if (cameraInfo != NULL) {
149 cameraInfo->swap(out);
150 }
151
152 return result;
153 }
154
Ruben Brunkd1176ef2014-02-21 10:51:38 -0800155 // Get enumeration and description of vendor tags for camera
156 virtual status_t getCameraVendorTagDescriptor(/*out*/sp<VendorTagDescriptor>& desc) {
157 Parcel data, reply;
158 data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
159 remote()->transact(BnCameraService::GET_CAMERA_VENDOR_TAG_DESCRIPTOR, data, &reply);
160
161 if (readExceptionCode(reply)) return -EPROTO;
162 status_t result = reply.readInt32();
163
164 if (reply.readInt32() != 0) {
165 sp<VendorTagDescriptor> d;
166 if (VendorTagDescriptor::createFromParcel(&reply, /*out*/d) == OK) {
167 desc = d;
168 }
169 }
170 return result;
171 }
172
Igor Murashkine7ee7632013-06-11 18:10:18 -0700173 // connect to camera service (android.hardware.Camera)
Ruben Brunk0f61d8f2013-08-08 13:07:18 -0700174 virtual status_t connect(const sp<ICameraClient>& cameraClient, int cameraId,
Chien-Yu Chen98a668f2015-12-18 14:10:33 -0800175 const String16 &clientPackageName, int clientUid, int clientPid,
Ruben Brunk0f61d8f2013-08-08 13:07:18 -0700176 /*out*/
177 sp<ICamera>& device)
Mathias Agopian3cf61352010-02-09 17:46:37 -0800178 {
179 Parcel data, reply;
180 data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800181 data.writeStrongBinder(IInterface::asBinder(cameraClient));
Chih-Chung Chang35a055b2010-05-06 16:36:58 +0800182 data.writeInt32(cameraId);
Svetoslav Ganov280405a2015-05-12 02:19:27 +0000183 data.writeString16(clientPackageName);
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800184 data.writeInt32(clientUid);
Chien-Yu Chen98a668f2015-12-18 14:10:33 -0800185 data.writeInt32(clientPid);
Eino-Ville Talvalae3afb2c2015-06-03 16:03:30 -0700186
187 status_t status;
188 status = remote()->transact(BnCameraService::CONNECT, data, &reply);
189 if (status != OK) return status;
Igor Murashkinbef3f232013-05-30 17:47:38 -0700190
Ruben Brunk0f61d8f2013-08-08 13:07:18 -0700191 if (readExceptionCode(reply)) return -EPROTO;
Eino-Ville Talvalae3afb2c2015-06-03 16:03:30 -0700192 status = reply.readInt32();
Ruben Brunk0f61d8f2013-08-08 13:07:18 -0700193 if (reply.readInt32() != 0) {
194 device = interface_cast<ICamera>(reply.readStrongBinder());
195 }
196 return status;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800197 }
Igor Murashkin634a5152013-02-20 17:15:11 -0800198
Zhijun Heb10cdad2014-06-16 16:38:35 -0700199 // connect to camera service (android.hardware.Camera)
200 virtual status_t connectLegacy(const sp<ICameraClient>& cameraClient, int cameraId,
201 int halVersion,
Svetoslav Ganov280405a2015-05-12 02:19:27 +0000202 const String16 &clientPackageName, int clientUid,
Zhijun Heb10cdad2014-06-16 16:38:35 -0700203 /*out*/sp<ICamera>& device)
204 {
205 Parcel data, reply;
206 data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800207 data.writeStrongBinder(IInterface::asBinder(cameraClient));
Zhijun Heb10cdad2014-06-16 16:38:35 -0700208 data.writeInt32(cameraId);
209 data.writeInt32(halVersion);
Svetoslav Ganov280405a2015-05-12 02:19:27 +0000210 data.writeString16(clientPackageName);
Zhijun Heb10cdad2014-06-16 16:38:35 -0700211 data.writeInt32(clientUid);
Eino-Ville Talvalae3afb2c2015-06-03 16:03:30 -0700212
213 status_t status;
214 status = remote()->transact(BnCameraService::CONNECT_LEGACY, data, &reply);
215 if (status != OK) return status;
Zhijun Heb10cdad2014-06-16 16:38:35 -0700216
217 if (readExceptionCode(reply)) return -EPROTO;
Eino-Ville Talvalae3afb2c2015-06-03 16:03:30 -0700218 status = reply.readInt32();
Zhijun Heb10cdad2014-06-16 16:38:35 -0700219 if (reply.readInt32() != 0) {
220 device = interface_cast<ICamera>(reply.readStrongBinder());
221 }
222 return status;
223 }
224
Chien-Yu Chen3068d732015-02-09 13:29:57 -0800225 virtual status_t setTorchMode(const String16& cameraId, bool enabled,
226 const sp<IBinder>& clientBinder)
227 {
228 Parcel data, reply;
229 data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
230 data.writeString16(cameraId);
231 data.writeInt32(enabled ? 1 : 0);
232 data.writeStrongBinder(clientBinder);
233 remote()->transact(BnCameraService::SET_TORCH_MODE, data, &reply);
234
235 if (readExceptionCode(reply)) return -EPROTO;
236 return reply.readInt32();
237 }
238
Eino-Ville Talvala7b82efe2013-07-25 17:12:35 -0700239 // connect to camera service (android.hardware.camera2.CameraDevice)
Ruben Brunk0f61d8f2013-08-08 13:07:18 -0700240 virtual status_t connectDevice(
Igor Murashkine7ee7632013-06-11 18:10:18 -0700241 const sp<ICameraDeviceCallbacks>& cameraCb,
242 int cameraId,
Svetoslav Ganov280405a2015-05-12 02:19:27 +0000243 const String16& clientPackageName,
Ruben Brunk0f61d8f2013-08-08 13:07:18 -0700244 int clientUid,
245 /*out*/
246 sp<ICameraDeviceUser>& device)
Igor Murashkine7ee7632013-06-11 18:10:18 -0700247 {
248 Parcel data, reply;
249 data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800250 data.writeStrongBinder(IInterface::asBinder(cameraCb));
Igor Murashkine7ee7632013-06-11 18:10:18 -0700251 data.writeInt32(cameraId);
Svetoslav Ganov280405a2015-05-12 02:19:27 +0000252 data.writeString16(clientPackageName);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700253 data.writeInt32(clientUid);
Eino-Ville Talvalae3afb2c2015-06-03 16:03:30 -0700254
255 status_t status;
256 status = remote()->transact(BnCameraService::CONNECT_DEVICE, data, &reply);
257 if (status != OK) return status;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700258
Ruben Brunk0f61d8f2013-08-08 13:07:18 -0700259 if (readExceptionCode(reply)) return -EPROTO;
Eino-Ville Talvalae3afb2c2015-06-03 16:03:30 -0700260 status = reply.readInt32();
Ruben Brunk0f61d8f2013-08-08 13:07:18 -0700261 if (reply.readInt32() != 0) {
262 device = interface_cast<ICameraDeviceUser>(reply.readStrongBinder());
263 }
264 return status;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700265 }
266
Igor Murashkinbfc99152013-02-27 12:55:20 -0800267 virtual status_t addListener(const sp<ICameraServiceListener>& listener)
268 {
269 Parcel data, reply;
270 data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800271 data.writeStrongBinder(IInterface::asBinder(listener));
Igor Murashkinbfc99152013-02-27 12:55:20 -0800272 remote()->transact(BnCameraService::ADD_LISTENER, data, &reply);
Igor Murashkinbef3f232013-05-30 17:47:38 -0700273
274 if (readExceptionCode(reply)) return -EPROTO;
Igor Murashkinbfc99152013-02-27 12:55:20 -0800275 return reply.readInt32();
276 }
277
278 virtual status_t removeListener(const sp<ICameraServiceListener>& listener)
279 {
280 Parcel data, reply;
281 data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800282 data.writeStrongBinder(IInterface::asBinder(listener));
Igor Murashkinbfc99152013-02-27 12:55:20 -0800283 remote()->transact(BnCameraService::REMOVE_LISTENER, data, &reply);
Igor Murashkinbef3f232013-05-30 17:47:38 -0700284
285 if (readExceptionCode(reply)) return -EPROTO;
Igor Murashkinbfc99152013-02-27 12:55:20 -0800286 return reply.readInt32();
287 }
Igor Murashkin65d14b92014-06-17 12:03:20 -0700288
289 virtual status_t getLegacyParameters(int cameraId, String16* parameters) {
290 if (parameters == NULL) {
291 ALOGE("%s: parameters must not be null", __FUNCTION__);
292 return BAD_VALUE;
293 }
294
295 Parcel data, reply;
Ruben Brunk3450ba72015-06-16 11:00:37 -0700296 data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
Igor Murashkin65d14b92014-06-17 12:03:20 -0700297
298 data.writeInt32(cameraId);
299 remote()->transact(BnCameraService::GET_LEGACY_PARAMETERS, data, &reply);
300 if (readExceptionCode(reply)) return -EPROTO;
301
302 status_t res = data.readInt32();
303 int32_t length = data.readInt32(); // -1 means null
304 if (length > 0) {
305 *parameters = data.readString16();
306 } else {
307 *parameters = String16();
308 }
309
310 return res;
311 }
312
313 virtual status_t supportsCameraApi(int cameraId, int apiVersion) {
314 Parcel data, reply;
315
Ruben Brunk3450ba72015-06-16 11:00:37 -0700316 data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
Igor Murashkin65d14b92014-06-17 12:03:20 -0700317 data.writeInt32(cameraId);
318 data.writeInt32(apiVersion);
319 remote()->transact(BnCameraService::SUPPORTS_CAMERA_API, data, &reply);
320 if (readExceptionCode(reply)) return -EPROTO;
321
322 status_t res = data.readInt32();
323 return res;
324 }
Ruben Brunk36597b22015-03-20 22:15:57 -0700325
Ruben Brunk6267b532015-04-30 17:44:07 -0700326 virtual void notifySystemEvent(int32_t eventId, const int32_t* args, size_t len) {
Ruben Brunk36597b22015-03-20 22:15:57 -0700327 Parcel data, reply;
Ruben Brunk3450ba72015-06-16 11:00:37 -0700328 data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
Ruben Brunk36597b22015-03-20 22:15:57 -0700329 data.writeInt32(eventId);
Ruben Brunk6267b532015-04-30 17:44:07 -0700330 data.writeInt32Array(len, args);
Ruben Brunk36597b22015-03-20 22:15:57 -0700331 remote()->transact(BnCameraService::NOTIFY_SYSTEM_EVENT, data, &reply,
332 IBinder::FLAG_ONEWAY);
333 }
334
Mathias Agopian3cf61352010-02-09 17:46:37 -0800335};
336
337IMPLEMENT_META_INTERFACE(CameraService, "android.hardware.ICameraService");
338
339// ----------------------------------------------------------------------
340
341status_t BnCameraService::onTransact(
342 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
343{
344 switch(code) {
Chih-Chung Chang35a055b2010-05-06 16:36:58 +0800345 case GET_NUMBER_OF_CAMERAS: {
346 CHECK_INTERFACE(ICameraService, data, reply);
Igor Murashkinbef3f232013-05-30 17:47:38 -0700347 reply->writeNoException();
Eino-Ville Talvalabad43582015-08-14 13:12:32 -0700348 reply->writeInt32(getNumberOfCameras(data.readInt32()));
Chih-Chung Chang35a055b2010-05-06 16:36:58 +0800349 return NO_ERROR;
350 } break;
Chih-Chung Changddbdb352010-06-10 13:32:16 +0800351 case GET_CAMERA_INFO: {
352 CHECK_INTERFACE(ICameraService, data, reply);
Igor Murashkinbef3f232013-05-30 17:47:38 -0700353 CameraInfo cameraInfo = CameraInfo();
Chih-Chung Changddbdb352010-06-10 13:32:16 +0800354 memset(&cameraInfo, 0, sizeof(cameraInfo));
355 status_t result = getCameraInfo(data.readInt32(), &cameraInfo);
Igor Murashkinbef3f232013-05-30 17:47:38 -0700356 reply->writeNoException();
357 reply->writeInt32(result);
358
359 // Fake a parcelable object here
360 reply->writeInt32(1); // means the parcelable is included
Chih-Chung Changddbdb352010-06-10 13:32:16 +0800361 reply->writeInt32(cameraInfo.facing);
362 reply->writeInt32(cameraInfo.orientation);
Chih-Chung Changddbdb352010-06-10 13:32:16 +0800363 return NO_ERROR;
364 } break;
Zhijun He2b59be82013-09-25 10:14:30 -0700365 case GET_CAMERA_CHARACTERISTICS: {
366 CHECK_INTERFACE(ICameraService, data, reply);
367 CameraMetadata info;
368 status_t result = getCameraCharacteristics(data.readInt32(), &info);
369 reply->writeNoException();
370 reply->writeInt32(result);
371
372 // out-variables are after exception and return value
373 reply->writeInt32(1); // means the parcelable is included
374 info.writeToParcel(reply);
375 return NO_ERROR;
376 } break;
Ruben Brunkd1176ef2014-02-21 10:51:38 -0800377 case GET_CAMERA_VENDOR_TAG_DESCRIPTOR: {
378 CHECK_INTERFACE(ICameraService, data, reply);
379 sp<VendorTagDescriptor> d;
380 status_t result = getCameraVendorTagDescriptor(d);
381 reply->writeNoException();
382 reply->writeInt32(result);
383
384 // out-variables are after exception and return value
Ruben Brunkd1176ef2014-02-21 10:51:38 -0800385 if (d == NULL) {
386 reply->writeInt32(0);
387 } else {
Igor Murashkine1445da2014-03-17 14:00:29 -0700388 reply->writeInt32(1); // means the parcelable is included
Ruben Brunkd1176ef2014-02-21 10:51:38 -0800389 d->writeToParcel(reply);
390 }
391 return NO_ERROR;
392 } break;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800393 case CONNECT: {
394 CHECK_INTERFACE(ICameraService, data, reply);
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800395 sp<ICameraClient> cameraClient =
396 interface_cast<ICameraClient>(data.readStrongBinder());
397 int32_t cameraId = data.readInt32();
Svetoslav Ganov280405a2015-05-12 02:19:27 +0000398 const String16 clientName = data.readString16();
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800399 int32_t clientUid = data.readInt32();
Chien-Yu Chen98a668f2015-12-18 14:10:33 -0800400 int32_t clientPid = data.readInt32();
Ruben Brunk0f61d8f2013-08-08 13:07:18 -0700401 sp<ICamera> camera;
402 status_t status = connect(cameraClient, cameraId,
Chien-Yu Chen98a668f2015-12-18 14:10:33 -0800403 clientName, clientUid, clientPid, /*out*/camera);
Igor Murashkinbef3f232013-05-30 17:47:38 -0700404 reply->writeNoException();
Ruben Brunk0f61d8f2013-08-08 13:07:18 -0700405 reply->writeInt32(status);
406 if (camera != NULL) {
407 reply->writeInt32(1);
Marco Nelissen06b46062014-11-14 07:58:25 -0800408 reply->writeStrongBinder(IInterface::asBinder(camera));
Ruben Brunk0f61d8f2013-08-08 13:07:18 -0700409 } else {
410 reply->writeInt32(0);
411 }
Mathias Agopian3cf61352010-02-09 17:46:37 -0800412 return NO_ERROR;
413 } break;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700414 case CONNECT_DEVICE: {
415 CHECK_INTERFACE(ICameraService, data, reply);
416 sp<ICameraDeviceCallbacks> cameraClient =
417 interface_cast<ICameraDeviceCallbacks>(data.readStrongBinder());
418 int32_t cameraId = data.readInt32();
Svetoslav Ganov280405a2015-05-12 02:19:27 +0000419 const String16 clientName = data.readString16();
Igor Murashkine7ee7632013-06-11 18:10:18 -0700420 int32_t clientUid = data.readInt32();
Ruben Brunk0f61d8f2013-08-08 13:07:18 -0700421 sp<ICameraDeviceUser> camera;
422 status_t status = connectDevice(cameraClient, cameraId,
Svetoslav Ganov280405a2015-05-12 02:19:27 +0000423 clientName, clientUid, /*out*/camera);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700424 reply->writeNoException();
Ruben Brunk0f61d8f2013-08-08 13:07:18 -0700425 reply->writeInt32(status);
426 if (camera != NULL) {
427 reply->writeInt32(1);
Marco Nelissen06b46062014-11-14 07:58:25 -0800428 reply->writeStrongBinder(IInterface::asBinder(camera));
Ruben Brunk0f61d8f2013-08-08 13:07:18 -0700429 } else {
430 reply->writeInt32(0);
431 }
Igor Murashkine7ee7632013-06-11 18:10:18 -0700432 return NO_ERROR;
433 } break;
Igor Murashkinbfc99152013-02-27 12:55:20 -0800434 case ADD_LISTENER: {
435 CHECK_INTERFACE(ICameraService, data, reply);
436 sp<ICameraServiceListener> listener =
437 interface_cast<ICameraServiceListener>(data.readStrongBinder());
Igor Murashkinbef3f232013-05-30 17:47:38 -0700438 reply->writeNoException();
Igor Murashkinbfc99152013-02-27 12:55:20 -0800439 reply->writeInt32(addListener(listener));
440 return NO_ERROR;
441 } break;
442 case REMOVE_LISTENER: {
443 CHECK_INTERFACE(ICameraService, data, reply);
444 sp<ICameraServiceListener> listener =
445 interface_cast<ICameraServiceListener>(data.readStrongBinder());
Igor Murashkinbef3f232013-05-30 17:47:38 -0700446 reply->writeNoException();
Igor Murashkinbfc99152013-02-27 12:55:20 -0800447 reply->writeInt32(removeListener(listener));
448 return NO_ERROR;
449 } break;
Igor Murashkin65d14b92014-06-17 12:03:20 -0700450 case GET_LEGACY_PARAMETERS: {
451 CHECK_INTERFACE(ICameraService, data, reply);
452 int cameraId = data.readInt32();
453 String16 parameters;
454
455 reply->writeNoException();
456 // return value
457 reply->writeInt32(getLegacyParameters(cameraId, &parameters));
458 // out parameters
459 reply->writeInt32(1); // parameters is always available
460 reply->writeString16(parameters);
461 return NO_ERROR;
462 } break;
463 case SUPPORTS_CAMERA_API: {
464 CHECK_INTERFACE(ICameraService, data, reply);
465 int cameraId = data.readInt32();
466 int apiVersion = data.readInt32();
467
468 reply->writeNoException();
469 // return value
470 reply->writeInt32(supportsCameraApi(cameraId, apiVersion));
471 return NO_ERROR;
472 } break;
Zhijun Heb10cdad2014-06-16 16:38:35 -0700473 case CONNECT_LEGACY: {
474 CHECK_INTERFACE(ICameraService, data, reply);
475 sp<ICameraClient> cameraClient =
476 interface_cast<ICameraClient>(data.readStrongBinder());
477 int32_t cameraId = data.readInt32();
478 int32_t halVersion = data.readInt32();
Svetoslav Ganov280405a2015-05-12 02:19:27 +0000479 const String16 clientName = data.readString16();
Zhijun Heb10cdad2014-06-16 16:38:35 -0700480 int32_t clientUid = data.readInt32();
481 sp<ICamera> camera;
482 status_t status = connectLegacy(cameraClient, cameraId, halVersion,
Svetoslav Ganov280405a2015-05-12 02:19:27 +0000483 clientName, clientUid, /*out*/camera);
Zhijun Heb10cdad2014-06-16 16:38:35 -0700484 reply->writeNoException();
485 reply->writeInt32(status);
486 if (camera != NULL) {
487 reply->writeInt32(1);
Marco Nelissen06b46062014-11-14 07:58:25 -0800488 reply->writeStrongBinder(IInterface::asBinder(camera));
Zhijun Heb10cdad2014-06-16 16:38:35 -0700489 } else {
490 reply->writeInt32(0);
491 }
492 return NO_ERROR;
493 } break;
Chien-Yu Chen3068d732015-02-09 13:29:57 -0800494 case SET_TORCH_MODE: {
495 CHECK_INTERFACE(ICameraService, data, reply);
496 String16 cameraId = data.readString16();
497 bool enabled = data.readInt32() != 0 ? true : false;
498 const sp<IBinder> clientBinder = data.readStrongBinder();
499 status_t status = setTorchMode(cameraId, enabled, clientBinder);
500 reply->writeNoException();
501 reply->writeInt32(status);
502 return NO_ERROR;
503 } break;
Ruben Brunk36597b22015-03-20 22:15:57 -0700504 case NOTIFY_SYSTEM_EVENT: {
505 CHECK_INTERFACE(ICameraService, data, reply);
Ruben Brunk6267b532015-04-30 17:44:07 -0700506 int32_t eventId = data.readInt32();
507 int32_t len = data.readInt32();
508 if (len < 0) {
509 ALOGE("%s: Received poorly formatted length in binder request: notifySystemEvent.",
510 __FUNCTION__);
511 return FAILED_TRANSACTION;
512 }
513 if (len > 512) {
514 ALOGE("%s: Length %" PRIi32 " too long in binder request: notifySystemEvent.",
515 __FUNCTION__, len);
516 return FAILED_TRANSACTION;
517 }
Chih-Hung Hsieh8eddd882015-05-18 15:51:54 -0700518 int32_t events[len];
519 memset(events, 0, sizeof(int32_t) * len);
Ruben Brunk6267b532015-04-30 17:44:07 -0700520 status_t status = data.read(events, sizeof(int32_t) * len);
521 if (status != NO_ERROR) {
522 ALOGE("%s: Received poorly formatted binder request: notifySystemEvent.",
523 __FUNCTION__);
524 return FAILED_TRANSACTION;
525 }
526 notifySystemEvent(eventId, events, len);
Ruben Brunk36597b22015-03-20 22:15:57 -0700527 return NO_ERROR;
528 } break;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800529 default:
530 return BBinder::onTransact(code, data, reply, flags);
531 }
532}
533
534// ----------------------------------------------------------------------------
535
536}; // namespace android