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