--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/mmapi_qt/baseline/src/cmmacamerawindow.cpp Fri May 14 15:47:24 2010 +0300
@@ -0,0 +1,977 @@
+/*
+* 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: This class implements MMMADisplayWindow functionality
+* for Camera viewfinder usage.
+*
+*/
+
+
+// Include Files
+#include <eikenv.h>
+#include <gdi.h>
+#include <logger.h>
+#include <AknsUtils.h>
+#include <AknsDrawUtils.h>
+#include "cmmacanvasdisplay.h"
+#include "logger.h"
+
+class CMMACanvasDisplay;
+
+//#include <cameraapp.mbg>
+
+// Used for iDisplay member
+
+#include "cmmacamerawindow.h"
+
+// Camera viewfinder start delay
+const TInt KStarterTimeout = 100000; //100 msecs
+
+// Margin of icon displayed instead of viewfinder in case of error
+const TInt KErrorIconMargin = 5; //5 pixels
+
+
+_LIT(KCameraAppBitmapFile, "z:\\resource\\apps\\cameraapp.mif");
+
+
+// ---------------------------------------------------------------------------
+// CMMACameraWindow::NewL
+// Two-phased constructor.
+// Use this method to create a CMMACameraWindow instance.
+// ---------------------------------------------------------------------------
+//
+CMMACameraWindow* CMMACameraWindow::NewL(TInt aCameraHandle)
+{
+ CMMACameraWindow* self = new(ELeave)CMMACameraWindow(aCameraHandle);
+ return self;
+}
+
+
+// ---------------------------------------------------------------------------
+// CMMACameraWindow::~CMMACameraWindow
+// Destructor.
+// NOTE: iUICamera have to be deleted by ReleaseUiResources() called
+// from UI thread
+// ---------------------------------------------------------------------------
+//
+CMMACameraWindow::~CMMACameraWindow()
+{
+ // It's not allowed to delete any nonsharable object here.
+ // This must be done in Destroy().
+ // If the iDisplay is set,
+ // instance should be deleted by sending
+ // event from UI to be received by MUiEventConsumer.
+}
+
+
+// ---------------------------------------------------------------------------
+// CMMACameraWindow::ViewFinderActive
+// Gets an information if the viewfinder is started.
+// ---------------------------------------------------------------------------
+//
+TBool CMMACameraWindow::ViewFinderActive()
+{
+ return iUICamera && iViewFinderVisible;
+}
+
+
+// ---------------------------------------------------------------------------
+// CMMACameraWindow::SetStarted
+// Notifies window about Started state change.
+// If started, tries to start viewfinder.
+// If not started, stops viewfinder.
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::SetStarted(TBool aStarted)
+{
+ iStarted = aStarted;
+ if (iDisplay)
+ {
+ if (iStarted)
+ {
+ // iDisplay->UIGetCallback(
+ // *this, CMMACameraWindow::EShowViewFinder);
+ LOG(EJavaMMAPI,EInfo,"CMMACameraWindow::SetStarted : before GetCallbackInUiThread + EShowViewFinder");
+ iDisplay->GetCallbackInUiThread((TInt)CMMACameraWindow::EShowViewFinder);
+ LOG(EJavaMMAPI,EInfo,"CMMACameraWindow::SetStarted : before GetCallbackInUiThread - EShowViewFinder");
+ }
+ else
+ {
+ // iDisplay->UIGetCallback(
+ // *this, CMMACameraWindow::EHideViewFinder);
+ LOG(EJavaMMAPI,EInfo,"CMMACameraWindow::SetStarted : before GetCallbackInUiThread + EHideViewFinder");
+ iDisplay->GetCallbackInUiThread((TInt)CMMACameraWindow::EHideViewFinder);
+ LOG(EJavaMMAPI,EInfo,"CMMACameraWindow::SetStarted : before GetCallbackInUiThread - EHideViewFinder");
+ }
+ }
+}
+
+
+// ---------------------------------------------------------------------------
+// CMMACameraWindow::SetDisplay
+// Sets iDisplay used to invoke callbacks from UI thread.
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::SetDisplay(MMMADisplay *aDisplay)
+{
+ if (iDisplay != aDisplay)
+ {
+ if (iDisplay)
+ {
+ // Clear the resources created within the old Display
+ //iDisplay->UIGetCallback(
+ // *this, CMMACameraWindow::EDeleteViewFinder);
+
+
+ // instead make a call to java, shift to ui thread and call ReleaseUiResources() method in UI thread
+
+ // here jobject and jclass is valid since the flow is first creat CMMACanvasDisplay and then
+ // call setdeisplay of cameraplayer
+ /*iJavaDisplayObject = iDisplay->GetJavaDisplayObject();
+ iJavaDisplayClass = iDisplay->GetJavaDisplayClass();
+ iJni = iDisplay->GetJNIEnv();
+
+ jmethodID releaseUiResourceID = iJni->GetMethodID(
+ iJavaDisplayClass,
+ "releaseUiResource",
+ "()I");
+
+ iJni->CallIntMethod(iJavaDisplayObject,releaseUiResourceID);*/
+ //MMAPI UI 3.x req.
+ LOG(EJavaMMAPI,EInfo,"CMMACameraWindow::SetDisplay : before GetCallbackInUiThread +");
+ iDisplay->GetCallbackInUiThread((TInt)CMMACameraWindow::EDeleteViewFinder);
+ LOG(EJavaMMAPI,EInfo,"CMMACameraWindow::SetDisplay : before GetCallbackInUiThread -");
+ }
+
+ // Set the new Display
+ iDisplay = aDisplay;
+
+ if (iDisplay)
+ {
+ // Get a DSA resources for the new Display
+ // iDisplay->UIGetDSAResources(*this, MMMADisplay::EMmaThread);
+
+ }
+ }
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MMMADisplayWindow
+// CMMACameraWindow::SetDestinationBitmapL
+//
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::SetDestinationBitmapL(CFbsBitmap* /*aBitmap*/)
+{
+ // Ignored, this window will not be used for actual drawing
+ LOG(EJavaMMAPI,EInfo,"CMMACameraWindow::SetDestinationBitmapL");
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MMMADisplayWindow
+// CMMACameraWindow::DrawFrameL
+//
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::DrawFrameL(const CFbsBitmap* /*aBitmap*/)
+{
+ // Ignored, this window will not be used for actual drawing
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MMMADisplayWindow
+// CMMACameraWindow::SetDrawRect
+//
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::SetDrawRect(const TRect& aRect)
+{
+ // MMAPI thread
+ LOG2(EJavaMMAPI,EInfo,"MMA::CMMACameraWindow::SetDrawRect TL:%d,%d",
+ aRect.iTl.iX, aRect.iTl.iY);
+ LOG2(EJavaMMAPI,EInfo,"MMA::CMMACameraWindow::SetDrawRect BR:%d,%d",
+ aRect.iBr.iX, aRect.iBr.iY);
+
+ iDrawRect = aRect;
+
+ if (iDisplay)
+ {
+ //iDisplay->UIGetCallback(*this, CMMACameraWindow::EResetViewFinder);
+ LOG(EJavaMMAPI,EInfo,"CMMACameraWindow::SetDisplay : before GetCallbackInUiThread + EResetViewFinder");
+ iDisplay->GetCallbackInUiThread((TInt)CMMACameraWindow::EResetViewFinder);
+ LOG(EJavaMMAPI,EInfo,"CMMACameraWindow::SetDisplay : before GetCallbackInUiThread - EResetViewFinder");
+
+ }
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MMMADisplayWindow
+// CMMACameraWindow::SetDrawRectThread
+//
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::SetDrawRectThread(const TRect& aRect)
+{
+ LOG2( EJavaMMAPI, EInfo, "MMA::CMMACameraWindow::SetDrawRectThread TL:%d,%d",
+ aRect.iTl.iX, aRect.iTl.iY);
+ LOG2( EJavaMMAPI, EInfo, "MMA::CMMACameraWindow::SetDrawRectThread BR:%d,%d",
+ aRect.iBr.iX, aRect.iBr.iY);
+
+ // Note: Runs in UI thread only
+
+ // Bitmap window's rect can be set in any thread.
+ if (iDrawRect != aRect)
+ {
+ iDrawRect = aRect;
+
+ // Stop and start ViewFinder to update position
+ ResetViewFinder();
+ }
+
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MMMADisplayWindow
+// CMMACameraWindow::DrawRect
+//
+// ---------------------------------------------------------------------------
+//
+const TRect& CMMACameraWindow::DrawRect()
+{
+ return iDrawRect;
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MMMADisplayWindow
+// CMMACameraWindow::WindowSize
+//
+// ---------------------------------------------------------------------------
+//
+TSize CMMACameraWindow::WindowSize()
+{
+ return iDrawRect.Size();
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MMMADisplayWindow
+// CMMACameraWindow::SetPosition
+//
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::SetPosition(const TPoint& aPosition)
+{
+ // Note: Runs in UI thread only
+ SetDrawRectThread(TRect(aPosition, iDrawRect.Size()));
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MMMADisplayWindow
+// CMMACameraWindow::SetVisible
+//
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::SetVisible(TBool aVisible, TBool aUseEventServer)
+{
+ iVisible = aVisible;
+
+ if (aUseEventServer)
+ {
+ // We are in UI thread now.
+ SetViewFinderVisibility(aVisible);
+ }
+ else
+ {
+ // MMAPI thread
+ if (iDisplay)
+ {
+ if (aVisible)
+ {
+ // iDisplay->UIGetCallback(
+ // *this, CMMACameraWindow::EShowViewFinder);
+ LOG(EJavaMMAPI,EInfo,"CMMACameraWindow::SetVisible : before GetCallbackInUiThread - EShowViewFinder");
+ iDisplay->GetCallbackInUiThread((TInt)CMMACameraWindow::EShowViewFinder);
+ LOG(EJavaMMAPI,EInfo,"CMMACameraWindow::SetVisible : before GetCallbackInUiThread - EShowViewFinder");
+ }
+ else
+ {
+ // iDisplay->UIGetCallback(
+ // *this, CMMACameraWindow::EHideViewFinder);
+ LOG(EJavaMMAPI,EInfo,"CMMACameraWindow::SetVisible : before GetCallbackInUiThread - EHideViewFinder");
+ iDisplay->GetCallbackInUiThread((TInt)CMMACameraWindow::EHideViewFinder);
+ LOG(EJavaMMAPI,EInfo,"CMMACameraWindow::SetVisible : before GetCallbackInUiThread - EHideViewFinder");
+ }
+ }
+ }
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MMMADisplayWindow
+// CMMACameraWindow::SetWindowRect
+//
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::SetWindowRect(
+ const TRect& aRect,
+ MMMADisplay::TThreadType aThreadType)
+{
+ LOG2( EJavaMMAPI, EInfo, "MMA::CMMACameraWindow::SetWindowRect TL:%d,%d",
+ aRect.iTl.iX, aRect.iTl.iY);
+ LOG2( EJavaMMAPI, EInfo, "MMA::CMMACameraWindow::SetWindowRect BR:%d,%d",
+ aRect.iBr.iX, aRect.iBr.iY);
+
+ if (iClientRect != aRect)
+ {
+ iClientRect = aRect;
+
+ if (aThreadType == MMMADisplay::EUiThread)
+ {
+ ResetViewFinder();
+ }
+ else
+ {
+ // iDisplay->UIGetCallback(
+ // *this, CMMACameraWindow::EResetViewFinder);
+ LOG(EJavaMMAPI,EInfo,"CMMACameraWindow::SetWindowRect : before GetCallbackInUiThread + EResetViewFinder");
+ iDisplay->GetCallbackInUiThread((TInt)CMMACameraWindow::EHideViewFinder);
+ LOG(EJavaMMAPI,EInfo,"CMMACameraWindow::SetWindowRect : before GetCallbackInUiThread - EResetViewFinder");
+ }
+ }
+
+
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MMMADisplayWindow
+// CMMACameraWindow::WindowRect
+//
+// ---------------------------------------------------------------------------
+//
+const TRect& CMMACameraWindow::WindowRect()
+{
+ return iClientRect;
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MMMADisplayWindow
+// CMMACameraWindow::GetDisplayWindowType
+//
+// ---------------------------------------------------------------------------
+//
+MMMADisplayWindow::TDisplayWindowType
+CMMACameraWindow::GetDisplayWindowType() const
+{
+ return EDisplayWindowTypeIsCamera;
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MMMADisplayWindow
+// CMMACameraWindow::IsVisible
+//
+// ---------------------------------------------------------------------------
+//
+TBool CMMACameraWindow::IsVisible() const
+{
+ return iVisible;
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MMMADisplayWindow
+// CMMACameraWindow::ContainerSet
+//
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::ContainerSet()
+{
+ // We are in UI thread now
+
+ // Container was probably not set when
+ // iDisplay was set,
+ // we can now try get the DSA stuff again
+ if (!iUICamera && iDisplay)
+ {
+ // Get a DSA stuff for the new Display
+ // iDisplay->UIGetDSAResources(*this, MMMADisplay::EUiThread);
+ }
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MMMADisplayWindow
+// CMMACameraWindow::ContainerDestroyed
+//
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::ContainerDestroyed()
+{
+ // We are in UI thread now
+ ReleaseUiResources();
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MCameraObserver
+// CMMACameraWindow::ReserveComplete
+//
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::ReserveComplete(TInt aError)
+{
+ LOG1(EJavaMMAPI,EInfo,"MMA::CMMACameraWindow::ReserveComplete %d", aError);
+
+ if (aError == KErrNone)
+ {
+ // camera will notify completion with PowerOnComplete method.
+ iUICamera->PowerOn();
+ }
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MCameraObserver
+// CMMACameraWindow::PowerOnComplete
+//
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::PowerOnComplete(TInt aError)
+{
+ ELOG1( EJavaMMAPI, "MMA::CMMACameraWindow::PowerOnComplete %d", aError);
+
+ if (aError == KErrNone)
+ {
+ iCameraPowerOn = ETrue;
+ SetViewFinderVisibility(ETrue);
+ }
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MCameraObserver
+// CMMACameraWindow::ViewFinderFrameReady
+//
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::ViewFinderFrameReady(CFbsBitmap& /*aFrame*/)
+{
+ // Empty implementation of the interface method
+ LOG(EJavaMMAPI,EInfo,"MMA::CMMACameraWindow::ViewFinderFrameReady");
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MCameraObserver
+// CMMACameraWindow::ImageReady
+//
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::ImageReady(CFbsBitmap* /*aBitmap*/,
+ HBufC8* /*aData*/,
+ TInt /*aError*/)
+{
+ // Empty implementation of the interface method
+ LOG(EJavaMMAPI,EInfo,"MMA::CMMACameraWindow::ImageReady");
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MCameraObserver
+// CMMACameraWindow::FrameBufferReady
+//
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::FrameBufferReady(MFrameBuffer* /*aFrameBuffer*/,
+ TInt /*aError*/)
+{
+ // Empty implementation of the interface method
+ LOG(EJavaMMAPI,EInfo,"MMA::CMMACameraWindow::FrameBufferReady");
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MDirectScreenAccess.
+// CMMACameraWindow::AbortNow
+//
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::AbortNow(
+ RDirectScreenAccess::TTerminationReasons /*aReasons*/)
+{
+ SetViewFinderVisibility(EFalse);
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MDirectScreenAccess.
+// CMMACameraWindow::Restart
+//
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::Restart(
+ RDirectScreenAccess::TTerminationReasons /*aReasons*/)
+{
+ SetViewFinderVisibility(ETrue);
+}
+
+
+// ---------------------------------------------------------------------------
+// CMMACameraWindow::CMMACameraWindow
+// C++ constructor.
+// ---------------------------------------------------------------------------
+//
+CMMACameraWindow::CMMACameraWindow(TInt aCameraHandle):
+ iVisible(EFalse),
+ iStarted(EFalse),
+ iViewFinderVisible(EFalse),
+ iCameraPowerOn(EFalse),
+ iDrawRect(0, 0, 0, 0),
+ iClientRect(0, 0, 0, 0),
+ iCameraHandle(aCameraHandle),
+ iUICamera(NULL),
+ iDisplay(NULL),
+ iStarterTimer(NULL),
+ iDirectAccess(NULL),
+ iErrorIconBitmap(NULL),
+ iErrorIconMaskBitmap(NULL),
+ iRWindowRect(0, 0, 0, 0)
+{
+}
+
+
+// ---------------------------------------------------------------------------
+// CMMACameraWindow::UIStartViewFinder
+// Creates UI Camera.
+// This CCamera instance is duplicated from handle given to the constructor.
+// Have to be called from the thread which UI Camera will be controlled from.
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::UIStartViewFinder(
+ RWsSession &aWs,
+ CWsScreenDevice &aScreenDevice,
+ RWindowBase &aWindow)
+{
+ LOG(EJavaMMAPI,EInfo,"MMA::CMMACameraWindow::UIStartViewFinder");
+
+ iWs = &aWs;
+ iScreenDevice = &aScreenDevice;
+ iWindow = &aWindow;
+
+ if (!iUICamera)
+ {
+ TRAPD(error, iUICamera =
+ CCamera::NewDuplicateL(*this, iCameraHandle));
+
+ ELOG1( EJavaMMAPI,
+ "MMA::CMMACameraWindow::UIStartViewFinder - NewDuplicateL %d",
+ error);
+
+ if (error == KErrNone)
+ {
+ iUICamera->Reserve();
+ }
+ }
+}
+
+
+// ---------------------------------------------------------------------------
+// CMMACameraWindow::SetViewFinderVisibility
+// If UI Camera have been created, it starts/hides the DirectViewFinder.
+// Have to be called from UI thread in which iUICamera instance was created.
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::SetViewFinderVisibility(TBool aVisible)
+{
+ LOG1( EJavaMMAPI, EInfo, "MMA::CMMACameraWindow::SetViewFinderVisibility - %d",
+ aVisible);
+
+ if (!iUICamera || !iCameraPowerOn || iViewFinderVisible == aVisible)
+ {
+ return;
+ }
+
+ if (aVisible)
+ {
+ // Viewfinder is going to start
+ if (!iVisible || !iStarted)
+ {
+ return;
+ }
+
+ iViewFinderVisible = ETrue;
+
+ if (!iStarterTimer)
+ {
+ // If starter timer haven't been created yet, create an instance
+ TRAPD(
+ timerErr,
+ iStarterTimer = CPeriodic::NewL(CActive::EPriorityIdle));
+
+ if (timerErr != KErrNone)
+ {
+ ELOG1( EJavaMMAPI,
+ "MMA::CMMACameraWindow::SetViewFinderVisibility - timer error = %d",
+ timerErr);
+ __ASSERT_DEBUG(EFalse, User::Invariant());
+ }
+ }
+
+ if (!iStarterTimer->IsActive())
+ {
+ iStarterTimer->Start(
+ KStarterTimeout,
+ 0,
+ TCallBack(StarterTimerCallback, this));
+ }
+ }
+ else
+ {
+ // Viewfinder is going to be cancelled
+ LOG(EJavaMMAPI,EInfo,
+ "MMA::CMMACameraWindow::SetViewFinderVisibility - Stopping VF");
+
+ if (iStarterTimer && iStarterTimer->IsActive())
+ {
+ // Cancel the running starter timer
+ iStarterTimer->Cancel();
+ }
+
+ if (iUICamera->ViewFinderActive())
+ {
+ iUICamera->StopViewFinder();
+ }
+ if (iDirectAccess->IsActive())
+ {
+ iDirectAccess->Cancel();
+ }
+
+ iViewFinderVisible = EFalse;
+ }
+}
+
+
+// ---------------------------------------------------------------------------
+// CMMACameraWindow::StarterTimerCallback
+// Executed at the expiry of the iStartedTimer.
+// ---------------------------------------------------------------------------
+//
+TInt CMMACameraWindow::StarterTimerCallback(TAny* aThis)
+{
+ CMMACameraWindow* self = static_cast<CMMACameraWindow*>(aThis);
+ ASSERT(self);
+
+ self->StartViewFinder();
+
+ // We don't want to run the callback again
+ return EFalse;
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MMMADisplayWindow
+// CMMACameraWindow::SetRWindowRect
+//
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::SetRWindowRect(const TRect& aRect,
+ MMMADisplay::TThreadType aThreadType)
+{
+ ELOG2( EJavaMMAPI,
+ "MID::CMMACameraWindow::SetRWindowRect TL %d %d",
+ aRect.iTl.iX, aRect.iTl.iY);
+ ELOG2( EJavaMMAPI,
+ "MID::CMMACameraWindow::SetRWindowRect BR %d %d",
+ aRect.iBr.iX, aRect.iBr.iY);
+ iRWindowRect = aRect;
+
+ if (MMMADisplay::EMmaThread == aThreadType)
+ {
+ if (iDisplay)
+ {
+ //iDisplay->UIGetCallback(*this,
+ // CMMACameraWindow::EResetViewFinder);
+ }
+ }
+ else if (MMMADisplay::EUiThread == aThreadType)
+ {
+ ResetViewFinder();
+ }
+}
+
+
+// ---------------------------------------------------------------------------
+// CMMACameraWindow::StartViewFinder
+// Starts viewfinder.
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::StartViewFinder()
+{
+ LOG(EJavaMMAPI,EInfo," < StartViewFinder");
+
+ ASSERT(iUICamera);
+ ASSERT(iCameraPowerOn);
+ ASSERT(iStarted);
+
+ iStarterTimer->Cancel();
+
+ // align client rect to RWindow, viewfinder
+ // display co-ordinates is w.r.t to RWindow
+ TRect relativeClientRect;
+ relativeClientRect = iClientRect;
+ relativeClientRect.Move(-iRWindowRect.iTl);
+
+ // Set the drawing area
+ TRect drawRect(iDrawRect);
+ drawRect.Move(relativeClientRect.iTl);
+
+ LOG2( EJavaMMAPI, EInfo,
+ "MMA::CMMACameraWindow::StartViewFinder - Starting VF TL:%d,%d",
+ drawRect.iTl.iX,
+ drawRect.iTl.iY);
+ LOG2( EJavaMMAPI, EInfo,
+ "MMA::CMMACameraWindow::StartViewFinder - Starting VF BR:%d,%d",
+ drawRect.iBr.iX,
+ drawRect.iBr.iY);
+
+ TRAPD(vfError, iUICamera->StartViewFinderDirectL(
+ *iWs, *iScreenDevice, *iWindow, drawRect));
+
+ if (vfError == KErrNone)
+ {
+ LOG(EJavaMMAPI,EInfo,"MMA::CMMACameraWindow::StartViewFinder - Start OK");
+ }
+ else
+ {
+ LOG1( EJavaMMAPI, EInfo,
+ "MMA::CMMACameraWindow::StartViewFinder() - \
+StartViewFinderDirectL error=%d", vfError);
+
+ TRAP_IGNORE(DrawViewFinderErrorL(vfError, drawRect));
+ }
+
+ LOG(EJavaMMAPI,EInfo," > StartViewFinder");
+}
+
+
+// ---------------------------------------------------------------------------
+// CMMACameraWindow::DrawViewFinderError()
+// Draws the error message to specified area.
+// Used in cases when viewfinder is unable to start.
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::DrawViewFinderErrorL(
+ const TInt /*aError*/,
+ const TRect& aDrawRect)
+{
+
+ ASSERT(iDirectAccess);
+ TInt dcError = KErrNone;
+ if (!iDirectAccess->IsActive())
+ {
+ TRAP(dcError, iDirectAccess->StartL());
+ }
+
+ TRect drawRect(aDrawRect);
+
+ if (dcError == KErrNone)
+ {
+ drawRect.Intersection(iClientRect);
+ drawRect.Move(-iWindow->AbsPosition());
+
+ CFbsBitGc* directGc = iDirectAccess->Gc();
+ directGc->SetClippingRect(drawRect);
+ directGc->SetBrushColor(TRgb(128,128,128));
+ directGc->SetPenColor(TRgb(128,0,0));
+ directGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
+ directGc->SetPenStyle(CGraphicsContext::ESolidPen);
+ directGc->SetDrawMode(CGraphicsContext::EDrawModeWriteAlpha);
+ directGc->DrawRect(drawRect);
+
+ if (!iErrorIconBitmap || !iErrorIconMaskBitmap)
+ {
+ if (iErrorIconBitmap)
+ {
+ delete iErrorIconBitmap;
+ iErrorIconBitmap = NULL;
+ }
+
+ if (iErrorIconMaskBitmap)
+ {
+ delete iErrorIconMaskBitmap;
+ iErrorIconMaskBitmap = NULL;
+ }
+/*
+ AknsUtils::CreateIconL(
+ AknsUtils::SkinInstance(),
+ KAknsIIDQgnIndiCam4Camera,
+ iErrorIconBitmap,
+ iErrorIconMaskBitmap,
+ KCameraAppBitmapFile,
+ EMbmCameraappQgn_indi_cam4_camera,
+ EMbmCameraappQgn_indi_cam4_camera_mask
+ );
+ */
+ }
+
+ //TRect iconRect
+ drawRect.iTl.iX += KErrorIconMargin;
+ drawRect.iTl.iY += KErrorIconMargin;
+ drawRect.iBr.iX -= KErrorIconMargin;
+ drawRect.iBr.iY -= KErrorIconMargin;
+
+ if (iErrorIconBitmap->SizeInPixels() != drawRect.Size())
+ {
+ AknIconUtils::SetSize(iErrorIconBitmap, drawRect.Size());
+ AknIconUtils::SetSize(iErrorIconMaskBitmap, drawRect.Size());
+ }
+
+ directGc->BitBltMasked(
+ drawRect.iTl, iErrorIconBitmap,
+ TRect(iErrorIconBitmap->SizeInPixels()),
+ iErrorIconMaskBitmap, EFalse);
+
+ iDirectAccess->ScreenDevice()->Update();
+ }
+
+}
+
+
+// ---------------------------------------------------------------------------
+// CMMACameraWindow::ReleaseUiResources()
+// Stops the DirectViewFinder and deletes UI Camera instance
+// Have to be called from UI thread in which UI Camera
+// have been created before the CMMACameraWindow instance
+// is deleted.
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::ReleaseUiResources()
+{
+ if (iUICamera)
+ {
+ SetViewFinderVisibility(EFalse);
+ // iStarterTimer is cancelled by previous call
+ // it can be deleted now
+ delete iStarterTimer;
+ iStarterTimer = NULL;
+ iUICamera->Release();
+ delete iUICamera;
+ iUICamera = NULL;
+ iCameraPowerOn = EFalse;
+ iDirectAccess->Cancel();
+ delete iDirectAccess;
+ iDirectAccess = NULL;
+ delete iErrorIconBitmap;
+ iErrorIconBitmap = NULL;
+ delete iErrorIconMaskBitmap;
+ iErrorIconMaskBitmap = NULL;
+ }
+}
+
+
+// ---------------------------------------------------------------------------
+// CMMACameraWindow::ResetViewFinder
+// Resets (stops and starts) viewfinder
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::ResetViewFinder()
+{
+
+ if (iStarterTimer && !iStarterTimer->IsActive() && iStarted)
+ {
+ SetViewFinderVisibility(EFalse);
+ SetViewFinderVisibility(ETrue);
+ }
+}
+
+
+// ---------------------------------------------------------------------------
+// CMMACameraWindow::Destroy
+// Deletes this object.
+// ---------------------------------------------------------------------------
+//
+void CMMACameraWindow::Destroy()
+{
+ // Delete itself
+ delete this;
+}
+
+
+// ---------------------------------------------------------------------------
+// From class MUiEventConsumer.
+// CMMACameraWindow::MdcDSAResourcesCallback
+// Callback to iDisplay->UIGetDSAResources().
+// Invoked asynchronously from UI Event Server thread.
+// ---------------------------------------------------------------------------
+//
+/*void CMMACameraWindow::MdcDSAResourcesCallback(
+ RWsSession &aWs,
+ CWsScreenDevice &aScreenDevice,
+ RWindowBase &aWindow)
+{
+ TRAPD(error, iDirectAccess = CDirectScreenAccess::NewL(aWs,
+ aScreenDevice,
+ aWindow,
+ *this));
+ LOG1(EJavaMMAPI,EInfo,"MMA::CMMACameraWindow::MdcDSAResourcesCallback, error = %d", error);
+ if (KErrNone != error)
+ {
+ return;
+ }
+ this->UIStartViewFinder(aWs, aScreenDevice, aWindow);
+}
+*/
+
+// ---------------------------------------------------------------------------
+// From class MUiEventConsumer.
+// CMMACameraWindow::MdcUICallback
+// Callback to iDisplay->UIGetCallback().
+// Invoked asynchronously from UI Event Server thread.
+// ---------------------------------------------------------------------------
+//
+
+void CMMACameraWindow::UICallback(TInt aCallbackId)
+{
+ LOG(EJavaMMAPI,EInfo,"MMA::CMMACameraWindow::MdcUICallback");
+
+ switch (aCallbackId)
+ {
+ case EDeleteViewFinder:
+ ReleaseUiResources();
+ break;
+ case EHideViewFinder:
+ SetViewFinderVisibility(EFalse);
+ break;
+ case EShowViewFinder:
+ SetViewFinderVisibility(ETrue);
+ break;
+ case EResetViewFinder:
+ ResetViewFinder();
+ break;
+ case EDestroyWindow:
+ Destroy();
+ break;
+ }
+}
+
+
+// END OF FILE