ICameraService.cpp revision 7b82efe7a376c882f8f938e1c41b8311a8cdda4a
13cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian/* 23cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** 33cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Copyright 2008, The Android Open Source Project 43cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** 53cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Licensed under the Apache License, Version 2.0 (the "License"); 63cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** you may not use this file except in compliance with the License. 73cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** You may obtain a copy of the License at 83cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** 93cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** http://www.apache.org/licenses/LICENSE-2.0 103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** 113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Unless required by applicable law or agreed to in writing, software 123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** distributed under the License is distributed on an "AS IS" BASIS, 133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** See the License for the specific language governing permissions and 153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** limitations under the License. 163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian*/ 173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 18bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin#define LOG_TAG "BpCameraService" 19bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin#include <utils/Log.h> 20bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <stdint.h> 223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <sys/types.h> 233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <binder/Parcel.h> 253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <binder/IPCThreadState.h> 263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <binder/IServiceManager.h> 273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <camera/ICameraService.h> 29bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include <camera/ICameraServiceListener.h> 30c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/IProCameraUser.h> 31c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/IProCameraCallbacks.h> 32c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/ICamera.h> 33c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/ICameraClient.h> 347b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/ICameraDeviceUser.h> 357b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/ICameraDeviceCallbacks.h> 363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiannamespace android { 383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 39bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkinnamespace { 40bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 41bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkinenum { 42bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin EX_SECURITY = -1, 43bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin EX_BAD_PARCELABLE = -2, 44bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin EX_ILLEGAL_ARGUMENT = -3, 45bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin EX_NULL_POINTER = -4, 46bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin EX_ILLEGAL_STATE = -5, 47bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin EX_HAS_REPLY_HEADER = -128, // special; see below 48bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin}; 49bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 50bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkinstatic bool readExceptionCode(Parcel& reply) { 51bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin int32_t exceptionCode = reply.readExceptionCode(); 52bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 53bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin if (exceptionCode != 0) { 54bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin const char* errorMsg; 55bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin switch(exceptionCode) { 56bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin case EX_SECURITY: 57bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin errorMsg = "Security"; 58bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin break; 59bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin case EX_BAD_PARCELABLE: 60bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin errorMsg = "BadParcelable"; 61bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin break; 62bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin case EX_NULL_POINTER: 63bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin errorMsg = "NullPointer"; 64bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin break; 65bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin case EX_ILLEGAL_STATE: 66bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin errorMsg = "IllegalState"; 67bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin break; 68bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin // Binder should be handling this code inside Parcel::readException 69bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin // but lets have a to-string here anyway just in case. 70bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin case EX_HAS_REPLY_HEADER: 71bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin errorMsg = "HasReplyHeader"; 72bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin break; 73bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin default: 74bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin errorMsg = "Unknown"; 75bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin } 76bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 77bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin ALOGE("Binder transmission error %s (%d)", errorMsg, exceptionCode); 78bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin return true; 79bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin } 80bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 81bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin return false; 82bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin} 83bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 84bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin}; 85bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass BpCameraService: public BpInterface<ICameraService> 873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic: 893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian BpCameraService(const sp<IBinder>& impl) 903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian : BpInterface<ICameraService>(impl) 913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian { 923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 9435a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang // get number of cameras available 9535a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang virtual int32_t getNumberOfCameras() 9635a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang { 9735a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang Parcel data, reply; 9835a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 9935a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang remote()->transact(BnCameraService::GET_NUMBER_OF_CAMERAS, data, &reply); 100bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 101bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin if (readExceptionCode(reply)) return 0; 10235a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang return reply.readInt32(); 10335a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang } 10435a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang 105ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang // get information about a camera 106ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang virtual status_t getCameraInfo(int cameraId, 107ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang struct CameraInfo* cameraInfo) { 108ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang Parcel data, reply; 109ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 110ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang data.writeInt32(cameraId); 111ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang remote()->transact(BnCameraService::GET_CAMERA_INFO, data, &reply); 112bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 113bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin if (readExceptionCode(reply)) return -EPROTO; 114bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin status_t result = reply.readInt32(); 115bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin if (reply.readInt32() != 0) { 116bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin cameraInfo->facing = reply.readInt32(); 117bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin cameraInfo->orientation = reply.readInt32(); 118bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin } 119bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin return result; 120ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang } 121ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang 122e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // connect to camera service (android.hardware.Camera) 123ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala virtual sp<ICamera> connect(const sp<ICameraClient>& cameraClient, int cameraId, 124ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala const String16 &clientPackageName, int clientUid) 1253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian { 1263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Parcel data, reply; 1273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 1283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeStrongBinder(cameraClient->asBinder()); 12935a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang data.writeInt32(cameraId); 130ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala data.writeString16(clientPackageName); 131ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala data.writeInt32(clientUid); 1323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian remote()->transact(BnCameraService::CONNECT, data, &reply); 133bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 134bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin if (readExceptionCode(reply)) return NULL; 1353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return interface_cast<ICamera>(reply.readStrongBinder()); 1363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 137634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 138634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // connect to camera service (pro client) 139c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin virtual sp<IProCameraUser> connect(const sp<IProCameraCallbacks>& cameraCb, int cameraId, 140c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin const String16 &clientPackageName, int clientUid) 141634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin { 142634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Parcel data, reply; 143634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 144634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin data.writeStrongBinder(cameraCb->asBinder()); 145634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin data.writeInt32(cameraId); 146c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin data.writeString16(clientPackageName); 147c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin data.writeInt32(clientUid); 148634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin remote()->transact(BnCameraService::CONNECT_PRO, data, &reply); 149bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 150bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin if (readExceptionCode(reply)) return NULL; 151634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return interface_cast<IProCameraUser>(reply.readStrongBinder()); 152634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 153bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin 1547b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala // connect to camera service (android.hardware.camera2.CameraDevice) 155e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual sp<ICameraDeviceUser> connect( 156e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const sp<ICameraDeviceCallbacks>& cameraCb, 157e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int cameraId, 158e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const String16& clientPackageName, 159e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int clientUid) 160e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin { 161e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin Parcel data, reply; 162e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 163e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeStrongBinder(cameraCb->asBinder()); 164e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(cameraId); 165e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeString16(clientPackageName); 166e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(clientUid); 167e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin remote()->transact(BnCameraService::CONNECT_DEVICE, data, &reply); 168e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 169e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (readExceptionCode(reply)) return NULL; 170e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return interface_cast<ICameraDeviceUser>(reply.readStrongBinder()); 171e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 172e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 173bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin virtual status_t addListener(const sp<ICameraServiceListener>& listener) 174bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin { 175bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin Parcel data, reply; 176bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 177bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin data.writeStrongBinder(listener->asBinder()); 178bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin remote()->transact(BnCameraService::ADD_LISTENER, data, &reply); 179bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 180bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin if (readExceptionCode(reply)) return -EPROTO; 181bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin return reply.readInt32(); 182bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin } 183bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin 184bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin virtual status_t removeListener(const sp<ICameraServiceListener>& listener) 185bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin { 186bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin Parcel data, reply; 187bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 188bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin data.writeStrongBinder(listener->asBinder()); 189bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin remote()->transact(BnCameraService::REMOVE_LISTENER, data, &reply); 190bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 191bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin if (readExceptionCode(reply)) return -EPROTO; 192bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin return reply.readInt32(); 193bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin } 1943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; 1953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianIMPLEMENT_META_INTERFACE(CameraService, "android.hardware.ICameraService"); 1973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ---------------------------------------------------------------------- 1993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t BnCameraService::onTransact( 2013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 2023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian switch(code) { 20435a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang case GET_NUMBER_OF_CAMERAS: { 20535a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang CHECK_INTERFACE(ICameraService, data, reply); 206bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin reply->writeNoException(); 20735a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang reply->writeInt32(getNumberOfCameras()); 20835a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang return NO_ERROR; 20935a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang } break; 210ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang case GET_CAMERA_INFO: { 211ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang CHECK_INTERFACE(ICameraService, data, reply); 212bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin CameraInfo cameraInfo = CameraInfo(); 213ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang memset(&cameraInfo, 0, sizeof(cameraInfo)); 214ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang status_t result = getCameraInfo(data.readInt32(), &cameraInfo); 215bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin reply->writeNoException(); 216bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin reply->writeInt32(result); 217bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 218bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin // Fake a parcelable object here 219bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin reply->writeInt32(1); // means the parcelable is included 220ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang reply->writeInt32(cameraInfo.facing); 221ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang reply->writeInt32(cameraInfo.orientation); 222ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang return NO_ERROR; 223ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang } break; 2243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian case CONNECT: { 2253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian CHECK_INTERFACE(ICameraService, data, reply); 226ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala sp<ICameraClient> cameraClient = 227ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala interface_cast<ICameraClient>(data.readStrongBinder()); 228ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala int32_t cameraId = data.readInt32(); 229ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala const String16 clientName = data.readString16(); 230ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala int32_t clientUid = data.readInt32(); 231ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala sp<ICamera> camera = connect(cameraClient, cameraId, 232ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala clientName, clientUid); 233bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin reply->writeNoException(); 2343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian reply->writeStrongBinder(camera->asBinder()); 2353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return NO_ERROR; 2363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } break; 237634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin case CONNECT_PRO: { 238634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin CHECK_INTERFACE(ICameraService, data, reply); 239bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin sp<IProCameraCallbacks> cameraClient = 240bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin interface_cast<IProCameraCallbacks>(data.readStrongBinder()); 241c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin int32_t cameraId = data.readInt32(); 242c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin const String16 clientName = data.readString16(); 243c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin int32_t clientUid = data.readInt32(); 244c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin sp<IProCameraUser> camera = connect(cameraClient, cameraId, 245c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin clientName, clientUid); 246bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin reply->writeNoException(); 247e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeStrongBinder(camera->asBinder()); 248e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return NO_ERROR; 249e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } break; 250e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin case CONNECT_DEVICE: { 251e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CHECK_INTERFACE(ICameraService, data, reply); 252e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin sp<ICameraDeviceCallbacks> cameraClient = 253e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin interface_cast<ICameraDeviceCallbacks>(data.readStrongBinder()); 254e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int32_t cameraId = data.readInt32(); 255e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const String16 clientName = data.readString16(); 256e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int32_t clientUid = data.readInt32(); 257e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin sp<ICameraDeviceUser> camera = connect(cameraClient, cameraId, 258e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin clientName, clientUid); 259e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeNoException(); 260634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin reply->writeStrongBinder(camera->asBinder()); 261634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return NO_ERROR; 262634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } break; 263bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin case ADD_LISTENER: { 264bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin CHECK_INTERFACE(ICameraService, data, reply); 265bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin sp<ICameraServiceListener> listener = 266bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin interface_cast<ICameraServiceListener>(data.readStrongBinder()); 267bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin reply->writeNoException(); 268bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin reply->writeInt32(addListener(listener)); 269bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin return NO_ERROR; 270bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin } break; 271bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin case REMOVE_LISTENER: { 272bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin CHECK_INTERFACE(ICameraService, data, reply); 273bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin sp<ICameraServiceListener> listener = 274bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin interface_cast<ICameraServiceListener>(data.readStrongBinder()); 275bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin reply->writeNoException(); 276bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin reply->writeInt32(removeListener(listener)); 277bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin return NO_ERROR; 278bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin } break; 2793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian default: 2803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return BBinder::onTransact(code, data, reply, flags); 2813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 2823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ---------------------------------------------------------------------------- 2853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; // namespace android 287