19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2008, The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License.
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h>
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h>
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
210795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/Parcel.h>
220795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IPCThreadState.h>
230795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IServiceManager.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25000479f9e325b4e426a67033abd92d47da412725Mathias Agopian#include <camera/ICameraService.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass BpCameraService: public BpInterface<ICameraService>
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    BpCameraService(const sp<IBinder>& impl)
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        : BpInterface<ICameraService>(impl)
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang    // get number of cameras available
38e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang    virtual int32_t getNumberOfCameras()
39e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang    {
40e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang        Parcel data, reply;
41e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
42e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang        remote()->transact(BnCameraService::GET_NUMBER_OF_CAMERAS, data, &reply);
43e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang        return reply.readInt32();
44e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang    }
45e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang
46b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    // get information about a camera
47b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    virtual status_t getCameraInfo(int cameraId,
48b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang                                   struct CameraInfo* cameraInfo) {
49b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang        Parcel data, reply;
50b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
51b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang        data.writeInt32(cameraId);
52b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang        remote()->transact(BnCameraService::GET_CAMERA_INFO, data, &reply);
53b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang        cameraInfo->facing = reply.readInt32();
54b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang        cameraInfo->orientation = reply.readInt32();
55b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang        return reply.readInt32();
56b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    }
57b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // connect to camera service
59e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang    virtual sp<ICamera> connect(const sp<ICameraClient>& cameraClient, int cameraId)
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeStrongBinder(cameraClient->asBinder());
64e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang        data.writeInt32(cameraId);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(BnCameraService::CONNECT, data, &reply);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return interface_cast<ICamera>(reply.readStrongBinder());
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectIMPLEMENT_META_INTERFACE(CameraService, "android.hardware.ICameraService");
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t BnCameraService::onTransact(
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch(code) {
78e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang        case GET_NUMBER_OF_CAMERAS: {
79e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang            CHECK_INTERFACE(ICameraService, data, reply);
80e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang            reply->writeInt32(getNumberOfCameras());
81e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang            return NO_ERROR;
82e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang        } break;
83b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang        case GET_CAMERA_INFO: {
84b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang            CHECK_INTERFACE(ICameraService, data, reply);
85b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang            CameraInfo cameraInfo;
86b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang            memset(&cameraInfo, 0, sizeof(cameraInfo));
87b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang            status_t result = getCameraInfo(data.readInt32(), &cameraInfo);
88b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang            reply->writeInt32(cameraInfo.facing);
89b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang            reply->writeInt32(cameraInfo.orientation);
90b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang            reply->writeInt32(result);
91b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang            return NO_ERROR;
92b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang        } break;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case CONNECT: {
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(ICameraService, data, reply);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<ICameraClient> cameraClient = interface_cast<ICameraClient>(data.readStrongBinder());
96e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang            sp<ICamera> camera = connect(cameraClient, data.readInt32());
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeStrongBinder(camera->asBinder());
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
109