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//#define LOG_NDEBUG 0
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "ICameraClient"
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/ICameraClient.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum {
28d6289b1b03d209219c2dd3126ee8839a45682b33Dave Sparks    NOTIFY_CALLBACK = IBinder::FIRST_CALL_TRANSACTION,
292a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks    DATA_CALLBACK,
3059c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks    DATA_CALLBACK_TIMESTAMP,
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass BpCameraClient: public BpInterface<ICameraClient>
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    BpCameraClient(const sp<IBinder>& impl)
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        : BpInterface<ICameraClient>(impl)
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
412a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks    // generic callback from camera service to app
422a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks    void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2)
432a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks    {
442a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks        LOGV("notifyCallback");
452a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks        Parcel data, reply;
462a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks        data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor());
472a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks        data.writeInt32(msgType);
482a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks        data.writeInt32(ext1);
492a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks        data.writeInt32(ext2);
502a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks        remote()->transact(NOTIFY_CALLBACK, data, &reply, IBinder::FLAG_ONEWAY);
512a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks    }
522a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks
532a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks    // generic data callback from camera service to app with image data
542a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks    void dataCallback(int32_t msgType, const sp<IMemory>& imageData)
552a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks    {
562a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks        LOGV("dataCallback");
572a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks        Parcel data, reply;
582a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks        data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor());
592a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks        data.writeInt32(msgType);
602a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks        data.writeStrongBinder(imageData->asBinder());
612a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks        remote()->transact(DATA_CALLBACK, data, &reply, IBinder::FLAG_ONEWAY);
622a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks    }
632a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks
6459c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks    // generic data callback from camera service to app with image data
6559c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks    void dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& imageData)
6659c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks    {
6759c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks        LOGV("dataCallback");
6859c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks        Parcel data, reply;
6959c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks        data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor());
7059c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks        data.writeInt64(timestamp);
7159c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks        data.writeInt32(msgType);
7259c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks        data.writeStrongBinder(imageData->asBinder());
7359c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks        remote()->transact(DATA_CALLBACK_TIMESTAMP, data, &reply, IBinder::FLAG_ONEWAY);
7459c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks    }
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectIMPLEMENT_META_INTERFACE(CameraClient, "android.hardware.ICameraClient");
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define CHECK_INTERFACE(interface, data, reply) \
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOGW("Call incorrectly routed to " #interface); \
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PERMISSION_DENIED; \
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } } while (0)
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t BnCameraClient::onTransact(
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch(code) {
912a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks        case NOTIFY_CALLBACK: {
922a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks            LOGV("NOTIFY_CALLBACK");
932a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks            CHECK_INTERFACE(ICameraClient, data, reply);
942a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks            int32_t msgType = data.readInt32();
952a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks            int32_t ext1 = data.readInt32();
962a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks            int32_t ext2 = data.readInt32();
972a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks            notifyCallback(msgType, ext1, ext2);
982a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks            return NO_ERROR;
992a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks        } break;
1002a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks        case DATA_CALLBACK: {
10159c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks            LOGV("DATA_CALLBACK");
1022a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks            CHECK_INTERFACE(ICameraClient, data, reply);
1032a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks            int32_t msgType = data.readInt32();
1042a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks            sp<IMemory> imageData = interface_cast<IMemory>(data.readStrongBinder());
1052a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks            dataCallback(msgType, imageData);
1062a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks            return NO_ERROR;
1072a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks        } break;
10859c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks        case DATA_CALLBACK_TIMESTAMP: {
10959c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks            LOGV("DATA_CALLBACK_TIMESTAMP");
11059c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks            CHECK_INTERFACE(ICameraClient, data, reply);
11159c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks            nsecs_t timestamp = data.readInt64();
11259c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks            int32_t msgType = data.readInt32();
11359c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks            sp<IMemory> imageData = interface_cast<IMemory>(data.readStrongBinder());
11459c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks            dataCallbackTimestamp(timestamp, msgType, imageData);
11559c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks            return NO_ERROR;
11659c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks        } break;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
126