camerauis/cameraxui/cxengine/src/cxecameradevice.cpp
changeset 19 d9aefe59d544
child 21 fa6d9f75d6a6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/camerauis/cameraxui/cxengine/src/cxecameradevice.cpp	Fri Apr 16 14:51:30 2010 +0300
@@ -0,0 +1,209 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+#include <ECamOrientationCustomInterface2.h>
+#include <ecamfacetrackingcustomapi.h>
+
+#include "cxecameradevice.h"
+#include "cxeerrormappingsymbian.h"
+#include "cxutils.h"
+
+#include "cxedummycamera.h"
+
+CxeCameraDevice::CxeCameraDevice() :
+    mCamera(NULL),
+    mAdvancedSettings(NULL),
+    mImageProcessor(NULL),
+    mCameraSnapshot(NULL),
+    mCameraOrientation(NULL),
+    mFaceTracking(NULL)
+{
+
+}
+
+CxeCameraDevice::~CxeCameraDevice()
+{
+    CX_DEBUG_ENTER_FUNCTION();
+    // Exiting, release all resources
+    releaseResources();
+    CX_DEBUG_EXIT_FUNCTION();
+}
+
+void CxeCameraDevice::deleteCamera()
+{
+    CX_DEBUG_ENTER_FUNCTION();
+
+    emit prepareForCameraDelete();
+
+    // preparing for new camera, release old resources
+    releaseResources();
+
+    CX_DEBUG_EXIT_FUNCTION();
+}
+
+void CxeCameraDevice::releaseCamera()
+{
+    CX_DEBUG_ENTER_FUNCTION();
+
+    if (mCamera) {
+        emit prepareForRelease();
+        mCamera->Release();
+    }
+
+    CX_DEBUG_EXIT_FUNCTION();
+}
+
+void CxeCameraDevice::setCamera( CCamera *camera )
+{
+    CX_DEBUG_ENTER_FUNCTION();
+
+    if (mCamera != camera) {
+
+        // new camera, delete old resources
+        releaseResources();
+
+        mCamera = camera;
+
+        // initialize resources
+        CxeError::Id err = initResources();
+
+        emit cameraAllocated(err);
+    }
+
+    CX_DEBUG_EXIT_FUNCTION();
+}
+
+CCamera* CxeCameraDevice::camera()
+{
+    return mCamera;
+}
+
+CCamera::CCameraAdvancedSettings* CxeCameraDevice::advancedSettings()
+{
+    return mAdvancedSettings;
+}
+
+CCamera::CCameraImageProcessing* CxeCameraDevice::imageProcessor()
+{
+    return mImageProcessor;
+}
+
+
+CCamera::CCameraSnapshot* CxeCameraDevice::cameraSnapshot()
+{
+    return mCameraSnapshot;
+}
+
+
+MCameraOrientation* CxeCameraDevice::cameraOrientation()
+{
+    return mCameraOrientation;
+}
+
+MCameraFaceTracking* CxeCameraDevice::faceTracking()
+{
+    return mFaceTracking;
+}
+
+CxeError::Id CxeCameraDevice::initResources()
+{
+    CX_DEBUG_ENTER_FUNCTION();
+
+    TInt status = KErrNone;
+
+    if (mCamera) {
+        CX_DEBUG(("Get CCamera extensions.."));
+
+        mCameraOrientation = static_cast<MCameraOrientation*>(
+            mCamera->CustomInterface(KCameraOrientationUid));
+        CX_DEBUG(("MCameraOrientation interface 0x%08x", mCameraOrientation));
+
+        mFaceTracking = static_cast<MCameraFaceTracking*>(
+            mCamera->CustomInterface(KCameraFaceTrackingUid));
+        CX_DEBUG(("MCameraFaceTracking interface 0x%08x", mFaceTracking));
+
+        TRAPD(errorAdvSet, mAdvancedSettings =
+              CCamera::CCameraAdvancedSettings::NewL(*mCamera));
+        CX_DEBUG(("CCameraAdvancedSettings status: %d", errorAdvSet));
+
+        TRAPD(errorImgPr, mImageProcessor =
+              CCamera::CCameraImageProcessing::NewL(*mCamera));
+        CX_DEBUG(("CCameraImageProcessing status: %d", errorImgPr));
+
+        TRAPD(errorSnap, mCameraSnapshot =
+              CCamera::CCameraSnapshot::NewL(*mCamera));
+        CX_DEBUG(("CCameraSnapshot status: %d", errorSnap));
+
+        // Check all statuses and set first error code encountered.
+        // Imageprocessing is not supported by 2nd camera so we just ignore the error.
+        status = errorAdvSet != KErrNone
+                 ? errorAdvSet : errorSnap;
+        CX_DEBUG(("Total status: %d", status));
+    }
+
+    CX_DEBUG_EXIT_FUNCTION();
+    return CxeErrorHandlingSymbian::map(status);
+}
+
+void CxeCameraDevice::releaseResources()
+{
+    CX_DEBUG_ENTER_FUNCTION();
+
+    // not owned.
+    mCameraOrientation = NULL;
+    mFaceTracking = NULL;
+
+    delete mCameraSnapshot;
+    mCameraSnapshot = NULL;
+
+    delete mAdvancedSettings;
+    mAdvancedSettings = NULL;
+
+    delete mImageProcessor;
+    mImageProcessor = NULL;
+
+    delete mCamera;
+    mCamera = NULL;
+
+    CX_DEBUG_EXIT_FUNCTION();
+}
+
+CxeError::Id CxeCameraDevice::newCamera( Cxe::CameraIndex cameraIndex, MCameraObserver2 *observer )
+{
+    CX_DEBUG_ENTER_FUNCTION();
+    CX_DEBUG(("Cxe: using camera index %d", cameraIndex));
+
+    CX_DEBUG_ASSERT(cameraIndex == Cxe::PrimaryCameraIndex || cameraIndex == Cxe::SecondaryCameraIndex);
+
+    CCamera* camera = NULL;
+
+#if defined(CXE_USE_DUMMY_CAMERA) || defined(__WINSCW__)
+    TRAPD(err, camera = CxeDummyCamera::NewL(*observer, cameraIndex, 100, 2));
+    CX_DEBUG(("CxeCameraDevice::newCamera <> new CxeDummyCamera"));
+#else
+    TRAPD(err, camera = CCamera::New2L(*observer, cameraIndex, 100 /*KCameraClientPriority*/));
+    CX_DEBUG(("CxeCameraDevice::newCamera <> new CCamera"));
+#endif
+
+    if (!err) {
+        setCamera(camera);
+    }
+
+    CX_DEBUG_EXIT_FUNCTION();
+    return CxeErrorHandlingSymbian::map(err);
+}
+
+// end of file