From 0f61d8f14aa368c9cd7076528e8096e10ed100a0 Mon Sep 17 00:00:00 2001 From: Ruben Brunk Date: Thu, 8 Aug 2013 13:07:18 -0700 Subject: Refactor CameraService to handle errors properly. Bug: 10361136 -Connect calls now return status_t error flags. Change-Id: Idca453b111e5df31327f6c99ebe853bb2e332b95 --- camera/Camera.cpp | 3 ++ camera/CameraBase.cpp | 11 +++++-- camera/ICameraService.cpp | 81 +++++++++++++++++++++++++++++++++++------------ camera/ProCamera.cpp | 4 ++- 4 files changed, 74 insertions(+), 25 deletions(-) (limited to 'camera') diff --git a/camera/Camera.cpp b/camera/Camera.cpp index fd78572..22016a9 100644 --- a/camera/Camera.cpp +++ b/camera/Camera.cpp @@ -39,6 +39,9 @@ Camera::Camera(int cameraId) { } +CameraTraits::TCamConnectService CameraTraits::fnConnectService = + &ICameraService::connect; + // construct a camera client from an existing camera remote sp Camera::create(const sp& camera) { diff --git a/camera/CameraBase.cpp b/camera/CameraBase.cpp index c25c5fd..55376b0 100644 --- a/camera/CameraBase.cpp +++ b/camera/CameraBase.cpp @@ -92,20 +92,25 @@ const sp& CameraBase::getCameraService() template sp CameraBase::connect(int cameraId, - const String16& clientPackageName, + const String16& clientPackageName, int clientUid) { ALOGV("%s: connect", __FUNCTION__); sp c = new TCam(cameraId); sp cl = c; + status_t status = NO_ERROR; const sp& cs = getCameraService(); + if (cs != 0) { - c->mCamera = cs->connect(cl, cameraId, clientPackageName, clientUid); + TCamConnectService fnConnectService = TCamTraits::fnConnectService; + status = (cs.get()->*fnConnectService)(cl, cameraId, clientPackageName, clientUid, + /*out*/ c->mCamera); } - if (c->mCamera != 0) { + if (status == OK && c->mCamera != 0) { c->mCamera->asBinder()->linkToDeath(c); c->mStatus = NO_ERROR; } else { + ALOGW("An error occurred while connecting to camera: %d", cameraId); c.clear(); } return c; diff --git a/camera/ICameraService.cpp b/camera/ICameraService.cpp index 876a2df..3debe22 100644 --- a/camera/ICameraService.cpp +++ b/camera/ICameraService.cpp @@ -120,8 +120,10 @@ public: } // connect to camera service (android.hardware.Camera) - virtual sp connect(const sp& cameraClient, int cameraId, - const String16 &clientPackageName, int clientUid) + virtual status_t connect(const sp& cameraClient, int cameraId, + const String16 &clientPackageName, int clientUid, + /*out*/ + sp& device) { Parcel data, reply; data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); @@ -131,13 +133,19 @@ public: data.writeInt32(clientUid); remote()->transact(BnCameraService::CONNECT, data, &reply); - if (readExceptionCode(reply)) return NULL; - return interface_cast(reply.readStrongBinder()); + if (readExceptionCode(reply)) return -EPROTO; + status_t status = reply.readInt32(); + if (reply.readInt32() != 0) { + device = interface_cast(reply.readStrongBinder()); + } + return status; } // connect to camera service (pro client) - virtual sp connect(const sp& cameraCb, int cameraId, - const String16 &clientPackageName, int clientUid) + virtual status_t connectPro(const sp& cameraCb, int cameraId, + const String16 &clientPackageName, int clientUid, + /*out*/ + sp& device) { Parcel data, reply; data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); @@ -147,16 +155,22 @@ public: data.writeInt32(clientUid); remote()->transact(BnCameraService::CONNECT_PRO, data, &reply); - if (readExceptionCode(reply)) return NULL; - return interface_cast(reply.readStrongBinder()); + if (readExceptionCode(reply)) return -EPROTO; + status_t status = reply.readInt32(); + if (reply.readInt32() != 0) { + device = interface_cast(reply.readStrongBinder()); + } + return status; } // connect to camera service (android.hardware.camera2.CameraDevice) - virtual sp connect( + virtual status_t connectDevice( const sp& cameraCb, int cameraId, const String16& clientPackageName, - int clientUid) + int clientUid, + /*out*/ + sp& device) { Parcel data, reply; data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); @@ -166,8 +180,12 @@ public: data.writeInt32(clientUid); remote()->transact(BnCameraService::CONNECT_DEVICE, data, &reply); - if (readExceptionCode(reply)) return NULL; - return interface_cast(reply.readStrongBinder()); + if (readExceptionCode(reply)) return -EPROTO; + status_t status = reply.readInt32(); + if (reply.readInt32() != 0) { + device = interface_cast(reply.readStrongBinder()); + } + return status; } virtual status_t addListener(const sp& listener) @@ -228,10 +246,17 @@ status_t BnCameraService::onTransact( int32_t cameraId = data.readInt32(); const String16 clientName = data.readString16(); int32_t clientUid = data.readInt32(); - sp camera = connect(cameraClient, cameraId, - clientName, clientUid); + sp camera; + status_t status = connect(cameraClient, cameraId, + clientName, clientUid, /*out*/ camera); reply->writeNoException(); - reply->writeStrongBinder(camera->asBinder()); + reply->writeInt32(status); + if (camera != NULL) { + reply->writeInt32(1); + reply->writeStrongBinder(camera->asBinder()); + } else { + reply->writeInt32(0); + } return NO_ERROR; } break; case CONNECT_PRO: { @@ -241,10 +266,17 @@ status_t BnCameraService::onTransact( int32_t cameraId = data.readInt32(); const String16 clientName = data.readString16(); int32_t clientUid = data.readInt32(); - sp camera = connect(cameraClient, cameraId, - clientName, clientUid); + sp camera; + status_t status = connectPro(cameraClient, cameraId, + clientName, clientUid, /*out*/ camera); reply->writeNoException(); - reply->writeStrongBinder(camera->asBinder()); + reply->writeInt32(status); + if (camera != NULL) { + reply->writeInt32(1); + reply->writeStrongBinder(camera->asBinder()); + } else { + reply->writeInt32(0); + } return NO_ERROR; } break; case CONNECT_DEVICE: { @@ -254,10 +286,17 @@ status_t BnCameraService::onTransact( int32_t cameraId = data.readInt32(); const String16 clientName = data.readString16(); int32_t clientUid = data.readInt32(); - sp camera = connect(cameraClient, cameraId, - clientName, clientUid); + sp camera; + status_t status = connectDevice(cameraClient, cameraId, + clientName, clientUid, /*out*/ camera); reply->writeNoException(); - reply->writeStrongBinder(camera->asBinder()); + reply->writeInt32(status); + if (camera != NULL) { + reply->writeInt32(1); + reply->writeStrongBinder(camera->asBinder()); + } else { + reply->writeInt32(0); + } return NO_ERROR; } break; case ADD_LISTENER: { diff --git a/camera/ProCamera.cpp b/camera/ProCamera.cpp index f6c9ca1..577c760 100644 --- a/camera/ProCamera.cpp +++ b/camera/ProCamera.cpp @@ -26,7 +26,6 @@ #include #include -#include #include #include @@ -47,6 +46,9 @@ ProCamera::ProCamera(int cameraId) { } +CameraTraits::TCamConnectService CameraTraits::fnConnectService = + &ICameraService::connectPro; + ProCamera::~ProCamera() { -- cgit v1.1