multimediacommsengine/mmcecli/src/mcecamerasource.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmcecli/src/mcecamerasource.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,702 @@
+/*
+* Copyright (c) 2006 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 "mcecamerasource.h"
+#include "mcecomcamerasource.h"
+#include "mcesession.h"
+#include "mcemediastream.h"
+#include "mceitcsender.h"
+#include "mcemanager.h"
+#include "mce.h"
+#include "mceserial.h"
+#include "mceclilogs.h"
+
+
+#define _FLAT_DATA static_cast<CMceComCameraSource*>( iFlatData )
+#define FLAT_DATA( data ) _FLAT_DATA->data
+
+
+const TInt KMinDigitalZoom = 0;
+const TInt KMinContrast = -100;
+const TInt KMaxContrast = 100;
+const TInt KMinBrightness = -100;
+const TInt KMaxBrightness = 100; 
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMceCameraSource* CMceCameraSource::NewL( CMceManager& aManager )
+    {
+    CMceCameraSource* self = CMceCameraSource::NewLC( aManager );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMceCameraSource* CMceCameraSource::NewLC( CMceManager& aManager )
+    {
+    CMceCameraSource* self = new (ELeave) CMceCameraSource();
+    CleanupStack::PushL( self );
+    self->ConstructL( &aManager );
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMceCameraSource::~CMceCameraSource()
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMceCameraSource::EnableL()
+    {
+    MCECLI_DEBUG("CMceCameraSource::EnableL, Entry");
+    
+    CMceMediaSource::DoEnableL();
+
+    MCECLI_DEBUG("CMceCameraSource::EnableL, Exit");
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMceCameraSource::DisableL()
+    { 
+    MCECLI_DEBUG("CMceCameraSource::DisableL, Entry");
+    
+    CMceMediaSource::DoDisableL();
+    
+    MCECLI_DEBUG("CMceCameraSource::DisableL, Exit");
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//	    
+EXPORT_C TInt CMceCameraSource::CamerasAvailable() const
+    {
+    return FLAT_DATA( iCamerasAvailable );
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMceCameraSource::SetCameraIndexL( TInt aCameraIndex )	  
+    {
+    MCECLI_DEBUG("CMceCameraSource::SetCameraIndexL, Entry");
+    MCECLI_DEBUG_DVALUE("index", aCameraIndex );
+    
+    
+    __ASSERT_ALWAYS( aCameraIndex >= 0 &&
+                     aCameraIndex < this->CamerasAvailable(),
+                     User::Leave( KErrArgument ) );
+                     
+    if ( MCE_ENDPOINT_ITC_ALLOWED( *this ) )
+        {
+        
+        
+        FLAT_DATA( iCameraInfo ) = SetITCCameraIndexL( aCameraIndex );
+        FLAT_DATA( iCameraIndex ) = aCameraIndex;
+        
+        
+        }
+    else
+        {
+    	FLAT_DATA( iCameraIndex ) = aCameraIndex;
+        MCECLI_DEBUG("CMceCameraSource::SetCameraIndexL, done locally");
+        }                 
+        
+    MCECLI_DEBUG("CMceCameraSource::SetCameraIndexL, Exit");
+    
+    }          
+     
+       
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//	     
+EXPORT_C void CMceCameraSource::GetCameraInfo( TCameraInfo& aInfo ) const
+    {
+    aInfo = FLAT_DATA( iCameraInfo );
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CMceCameraSource::SetZoomFactorL( TInt aZoomFactor )
+    {
+    MCECLI_DEBUG("CMceCameraSource::SetZoomFactorL, Entry");
+    MCECLI_DEBUG_DVALUE("factor", aZoomFactor );
+    
+    __ASSERT_ALWAYS( aZoomFactor >= FLAT_DATA( iCameraInfo.iMinZoom ) &&
+                     aZoomFactor <= FLAT_DATA( iCameraInfo.iMaxZoom ), 
+                     User::Leave( KErrArgument ) );
+    
+    if ( MCE_ENDPOINT_ITC_ALLOWED( *this ) )
+        {
+        FLAT_DATA( iZoomFactor ) = SetITCValueL( EMceItcSetZoomFactor,
+                                                 aZoomFactor ); 
+        }
+    else
+        {
+    	FLAT_DATA( iZoomFactor ) = aZoomFactor;
+        MCECLI_DEBUG("CMceCameraSource::SetZoomFactorL, done locally");
+        }       
+        
+    MCECLI_DEBUG("CMceCameraSource::SetZoomFactorL, Exit");
+    
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C TInt CMceCameraSource::ZoomFactorL()
+    {
+    MCECLI_DEBUG("CMceCameraSource::ZoomFactorL, Entry");
+    if ( MCE_ENDPOINT_ITC_ALLOWED( *this ) )
+        {
+        FLAT_DATA( iZoomFactor ) = GetITCValueL( EMceItcZoomFactor );
+        }
+    else
+        {
+        //NOP
+        MCECLI_DEBUG("CMceCameraSource::ZoomFactorL, done locally");
+        }
+
+    MCECLI_DEBUG("CMceCameraSource::ZoomFactorL, Exit");
+        
+    return FLAT_DATA( iZoomFactor ); 
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CMceCameraSource::SetDigitalZoomFactorL( TInt aDigitalZoomFactor )
+    {
+    MCECLI_DEBUG("CMceCameraSource::SetDigitalZoomFactorL, Entry");
+    MCECLI_DEBUG_DVALUE("factor", aDigitalZoomFactor );
+    
+    __ASSERT_ALWAYS( aDigitalZoomFactor >= KMinDigitalZoom &&
+                aDigitalZoomFactor <= FLAT_DATA( iCameraInfo.iMaxDigitalZoom ), 
+                User::Leave( KErrArgument ) );
+    
+    if ( MCE_ENDPOINT_ITC_ALLOWED( *this ) )
+        {
+        FLAT_DATA( iDigitalZoomFactor ) = 
+                SetITCValueL( EMceItcSetDigitalZoomFactor,
+                              aDigitalZoomFactor ); 
+        }
+    else
+        {
+    	FLAT_DATA( iDigitalZoomFactor ) = aDigitalZoomFactor;
+        MCECLI_DEBUG("CMceCameraSource::SetDigitalZoomFactorL, done locally");
+        }       
+    
+    MCECLI_DEBUG("CMceCameraSource::SetDigitalZoomFactorL, Exit");
+    
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C TInt CMceCameraSource::DigitalZoomFactorL()
+    {
+    MCECLI_DEBUG("CMceCameraSource::DigitalZoomFactorL, Entry");
+    if ( MCE_ENDPOINT_ITC_ALLOWED( *this ) )
+        {
+        FLAT_DATA( iDigitalZoomFactor ) = 
+                    GetITCValueL( EMceItcDigitalZoomFactor );
+        }                          
+    else
+        {
+        //NOP
+        MCECLI_DEBUG("CMceCameraSource::DigitalZoomFactorL, done locally");
+        }
+
+    MCECLI_DEBUG("CMceCameraSource::DigitalZoomFactorL, Exit");
+    return FLAT_DATA( iDigitalZoomFactor );
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CMceCameraSource::SetContrastL( TInt aContrast )
+    {
+    MCECLI_DEBUG("CMceCameraSource::SetContrastL, Entry");
+    MCECLI_DEBUG_DVALUE("contrast", aContrast );
+    
+    __ASSERT_ALWAYS( ( FLAT_DATA( iCameraInfo.iOptionsSupported ) & 
+                       TCameraInfo::EContrastSupported ) ==
+                     TCameraInfo::EContrastSupported,
+                     User::Leave( KErrNotSupported ) );
+                    
+    __ASSERT_ALWAYS( (( aContrast >= KMinContrast &&
+                        aContrast <= KMaxContrast ) ||
+                        aContrast == CCamera::EContrastAuto ),
+                     User::Leave( KErrArgument ) );
+                      
+                                           
+    if ( MCE_ENDPOINT_ITC_ALLOWED( *this ) )
+        {
+        FLAT_DATA( iContrast ) = SetITCValueL( EMceItcSetContrast,
+                                               aContrast ); 
+        }
+    else
+        {
+    	FLAT_DATA( iContrast ) = aContrast;
+        MCECLI_DEBUG("CMceCameraSource::SetContrastL, done locally");
+        }
+        
+    MCECLI_DEBUG("CMceCameraSource::SetContrastL, Exit");
+    
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C TInt CMceCameraSource::ContrastL()
+    {
+    MCECLI_DEBUG("CMceCameraSource::ContrastL, Entry");
+    
+    if ( MCE_ENDPOINT_ITC_ALLOWED( *this ) )
+        {
+        FLAT_DATA( iContrast ) = GetITCValueL( EMceItcContrast );
+        }
+    else
+        {
+        //NOP
+        MCECLI_DEBUG("CMceCameraSource::ContrastL, done locally");
+        }
+    
+    MCECLI_DEBUG("CMceCameraSource::ContrastL, Exit");
+    return FLAT_DATA( iContrast );
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CMceCameraSource::SetBrightnessL( TInt aBrightness )
+    {
+    MCECLI_DEBUG("CMceCameraSource::SetBrightnessL, Entry");
+    MCECLI_DEBUG_DVALUE("brightness", aBrightness );
+    
+    __ASSERT_ALWAYS( ( FLAT_DATA( iCameraInfo.iOptionsSupported ) & 
+                       TCameraInfo::EBrightnessSupported ) ==
+                     TCameraInfo::EBrightnessSupported,
+                     User::Leave( KErrNotSupported ) );
+                   
+    __ASSERT_ALWAYS( (( aBrightness >= KMinBrightness &&
+                        aBrightness <= KMaxBrightness ) ||
+                        aBrightness == CCamera::EBrightnessAuto ),
+                     User::Leave( KErrArgument ) );
+    
+    if ( MCE_ENDPOINT_ITC_ALLOWED( *this ) )
+        {
+        FLAT_DATA( iBrightness ) = SetITCValueL( EMceItcSetBrightness,
+                                                 aBrightness ); 
+        }
+    else
+        {
+    	FLAT_DATA( iBrightness ) = aBrightness;
+        MCECLI_DEBUG("CMceCameraSource::SetBrightnessL, done locally");
+        }
+        
+    MCECLI_DEBUG("CMceCameraSource::SetBrightnessL, Exit");
+
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C TInt CMceCameraSource::BrightnessL()
+    {
+    MCECLI_DEBUG("CMceCameraSource::BrightnessL, Entry");
+    if ( MCE_ENDPOINT_ITC_ALLOWED( *this ) )
+        {
+        FLAT_DATA( iBrightness ) = GetITCValueL( EMceItcBrightness );
+        }
+    else
+        {
+        //NOP
+        MCECLI_DEBUG("CMceCameraSource::BrightnessL, done locally");
+        }
+
+    MCECLI_DEBUG("CMceCameraSource::BrightnessL, Exit");
+    return FLAT_DATA( iBrightness ); 
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CMceCameraSource::SetExposureL( CCamera::TExposure aExposure )
+    {
+    MCECLI_DEBUG("CMceCameraSource::SetExposureL, Entry");
+    MCECLI_DEBUG_DVALUE("exposure", aExposure );
+    
+    __ASSERT_ALWAYS( 
+          ( FLAT_DATA( iCameraInfo.iExposureModesSupported ) & aExposure ) ==
+                        aExposure,
+                        User::Leave( KErrNotSupported ) );
+    
+    if ( MCE_ENDPOINT_ITC_ALLOWED( *this ) )
+        {
+        FLAT_DATA( iExposure ) = SetITCValueL( EMceItcSetExposure,
+                                               aExposure ); 
+        }
+    else
+        {
+    	FLAT_DATA( iExposure ) = aExposure;
+        MCECLI_DEBUG("CMceCameraSource::SetExposureL, done locally");
+        }
+        
+    MCECLI_DEBUG("CMceCameraSource::SetExposureL, Exit");
+        
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C CCamera::TExposure CMceCameraSource::ExposureL()
+    {
+    MCECLI_DEBUG("CMceCameraSource::ExposureL, Entry");
+    
+    if ( MCE_ENDPOINT_ITC_ALLOWED( *this ) )
+        {
+        FLAT_DATA( iExposure ) = GetITCValueL( EMceItcExposure );
+        }
+    else
+        {
+        //NOP
+        MCECLI_DEBUG("CMceCameraSource::ExposureL, done locally");
+        }
+
+    MCECLI_DEBUG("CMceCameraSource::ExposureL, Exit");
+    
+    return static_cast<CCamera::TExposure>( FLAT_DATA( iExposure ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void CMceCameraSource::SetWhiteBalanceL( 
+                                    CCamera::TWhiteBalance aWhiteBalance )
+    {
+    MCECLI_DEBUG("CMceCameraSource::SetWhiteBalanceL, Entry");
+    MCECLI_DEBUG_DVALUE("white balance", aWhiteBalance );
+    
+    __ASSERT_ALWAYS( 
+        ( FLAT_DATA( iCameraInfo.iWhiteBalanceModesSupported ) & aWhiteBalance ) == 
+        aWhiteBalance,
+        User::Leave( KErrNotSupported ) );
+   
+    if ( MCE_ENDPOINT_ITC_ALLOWED( *this ) )
+        {
+        FLAT_DATA( iWhiteBalance ) = SetITCValueL( EMceItcSetWhiteBalance,
+                                                   aWhiteBalance ); 
+        }
+    else
+        {
+    	FLAT_DATA( iWhiteBalance ) = aWhiteBalance;
+        MCECLI_DEBUG("CMceCameraSource::SetWhiteBalanceL, done locally");
+        }
+        
+    MCECLI_DEBUG("CMceCameraSource::SetWhiteBalanceL, Exit");
+    
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C CCamera::TWhiteBalance CMceCameraSource::WhiteBalanceL()
+    {
+    MCECLI_DEBUG("CMceCameraSource::WhiteBalanceL, Entry");
+    
+    if ( MCE_ENDPOINT_ITC_ALLOWED( *this ) )
+        {
+        FLAT_DATA( iWhiteBalance ) = GetITCValueL( EMceItcWhiteBalance );
+        }
+    else
+        {
+        //NOP
+        MCECLI_DEBUG("CMceCameraSource::WhiteBalanceL, done locally");
+        }
+    
+    MCECLI_DEBUG("CMceCameraSource::WhiteBalanceL, Exit");
+    return static_cast<CCamera::TWhiteBalance>( FLAT_DATA( iWhiteBalance ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMceCameraSource::InitializeL( CMceManager* aManager )
+    {
+    __ASSERT_ALWAYS( aManager, User::Leave( KErrArgument ) );
+
+    if ( !FLAT_DATA( iInitialInfoRetrieved ) )
+        {   
+        // Receive available camera count
+        MCECLI_DEBUG("CMceCameraSource::InitializeL, querying available cameras");
+        TMceIds ids;
+        ids.iAppUID = aManager->AppUid().iUid;
+
+    	TMceItcArgTInt camerasAvailable;
+    	
+        _FLAT_DATA->SenderL( 
+            aManager->ServerSession() ).ReadL( ids, EMceItcCamerasAvailable, 
+                                               camerasAvailable );
+    	
+        FLAT_DATA( iCamerasAvailable ) = camerasAvailable();
+
+        MCECLI_DEBUG_DVALUE("CMceCameraSource::InitializeL,\
+querying camera info for camera ", FLAT_DATA( iCameraIndex ) );
+        
+        // Receive TCameraInfo
+        GetITCCameraInfoL( *aManager, FLAT_DATA( iCameraInfo ) );
+    
+        FLAT_DATA( iInitialInfoRetrieved ) = ETrue;
+        
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CMceCameraSource::GetITCCameraInfoL( CMceManager& aManager, 
+                                          TCameraInfo& aInfo ) const
+    {
+    
+    // Receive TCameraInfo
+    TMceCameraInfo info;
+    info.iIndex = FLAT_DATA( iCameraIndex );
+    
+    TMceItcArgTCameraInfo cameraInfo( info );
+    
+    TMceIds infoIds;
+    infoIds.iAppUID = aManager.AppUid().iUid;
+    _FLAT_DATA->SenderL( 
+        aManager.ServerSession() ).ReadL( infoIds, EMceItcCameraInfo, 
+                                          cameraInfo );
+    
+    aInfo = cameraInfo().iInfo;
+    
+    }
+
+
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+TCameraInfo CMceCameraSource::SetITCCameraIndexL( TInt aCameraIndex ) const
+    {
+    CMceSession* session = NULL;
+    
+    if ( iStream )
+        {
+        session = iStream->Session();
+        }
+    
+    if ( !session )
+        {
+        User::Leave( KErrNotReady );
+        }
+    
+    TMceIds ids;
+    session->PrepareForITC( ids );
+    ids.iMediaID   = iStream->Id();
+    ids.iSourceID  = Id();
+    
+    TMceCameraInfo info;
+    info.iIndex = aCameraIndex;
+    
+    TMceItcArgTCameraInfo value( info );
+    
+    session->ITCSender().ReadL( ids, EMceItcSetCameraIndex, value );
+    
+    
+    return value().iInfo;
+    }
+
+
+// -----------------------------------------------------------------------------
+// Factory method to inner usage
+// -----------------------------------------------------------------------------
+//
+CMceCameraSource* CMceCameraSource::NewL()
+    {
+    CMceCameraSource* self = CMceCameraSource::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// Factory method to inner usage
+// -----------------------------------------------------------------------------
+//
+CMceCameraSource* CMceCameraSource::NewLC()
+    {
+    CMceCameraSource* self = new (ELeave) CMceCameraSource();
+    CleanupStack::PushL( self );
+    self->ConstructL( NULL );
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CMceCameraSource::GetITCValueL( TUint8 aITCFunction )
+    {
+    CMceSession* session = NULL;
+    
+    if ( iStream )
+        {
+        session = iStream->Session();
+        }
+    
+    if ( !session )
+        {
+        User::Leave( KErrNotReady );
+        }
+    
+    TMceIds ids;
+	session->PrepareForITC( ids );
+	ids.iMediaID  = iStream->Id();
+	ids.iSourceID = Id();
+	
+	TMceItcArgTInt value;
+	
+	session->ITCSender().ReadL( ids, 
+	    static_cast<TMceItcFunctions>(aITCFunction), value );
+    
+    return value();
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CMceCameraSource::SetITCValueL( TUint8 aITCFunction, 
+                                     TInt aValue )
+    {
+    CMceSession* session = NULL;
+    
+    if ( iStream )
+        {
+        session = iStream->Session();
+        }
+    
+    if ( !session )
+        {
+        User::Leave( KErrNotReady );
+        }
+
+	TMceIds ids;
+	session->PrepareForITC( ids );
+	ids.iMediaID   = iStream->Id();
+	ids.iSourceID  = Id();
+	
+	TMceItcArgTInt value( aValue );
+	
+    session->ITCSender().WriteL( ids, 
+        static_cast<TMceItcFunctions>(aITCFunction), value );
+    
+    return value();
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+CMceCameraSource::CMceCameraSource()
+    :CMceMediaSource()
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CMceCameraSource::ConstructL( CMceManager* aManager )
+    {
+    CMceComCameraSource* mic = CMceComCameraSource::NewLC();
+    CMceMediaSource::ConstructL( mic );
+    CleanupStack::Pop( mic );
+    
+    if ( aManager )
+        {
+        InitializeL( aManager );
+        }
+    }
+