--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/svgtopt/SVG/SVGImpl/src/SVGMediaElementBase.cpp Thu Jan 07 16:19:02 2010 +0200
@@ -0,0 +1,503 @@
+/*
+* 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: Provides the base class implementation for the media elements.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "SVGMediaElementBase.h"
+#include "SVGAnimTimingParser.h"
+#include "SVGTimeContainer.h"
+
+_LIT( KTmpCanSlip, "canSlip" );
+_LIT( KTmpLocked, "locked" );
+_LIT( KTmpIndependent, "independent" );
+_LIT( KTmpDefault, "default" );
+_LIT( KTmpSyncBehavior, "syncBehavior" );
+_LIT( KTmpSyncTolerance, "syncTolerance" );
+_LIT( KTmpSyncMaster, "syncMaster" );
+// EXTERNAL DATA STRUCTURES
+//extern ?external_data;
+
+// EXTERNAL FUNCTION PROTOTYPES
+//extern ?external_function( ?arg_type,?arg_type );
+
+// CONSTANTS
+//const ?type ?constant_var = ?constant;
+
+// MACROS
+//#define ?macro ?macro_def
+
+// LOCAL CONSTANTS AND MACROS
+//const ?type ?constant_var = ?constant;
+//#define ?macro_name ?macro_def
+
+// MODULE DATA STRUCTURES
+//enum ?declaration
+//typedef ?declaration
+
+// LOCAL FUNCTION PROTOTYPES
+//?type ?function_name( ?arg_type, ?arg_type );
+
+// FORWARD DECLARATIONS
+//class ?FORWARD_CLASSNAME;
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::CSvgMediaElementBase
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CSvgMediaElementBase::CSvgMediaElementBase( CSvgDocumentImpl* aDoc ):
+ CSvgAnimationBase( aDoc ),
+ iSyncMasterConfig( EFalse ),
+ iSyncMasterCurrent( EFalse ),
+ iSyncOffset( 0 )
+ {
+ // Obtain the default sync behaviour/tolerance from the root element
+ CSvgSvgElementImpl* lSvgEle = (CSvgSvgElementImpl* )aDoc->RootElement();
+ if ( lSvgEle )
+ {
+ iSyncBehavior = lSvgEle->SyncBehaviorDefault();
+ iSyncTolerance = lSvgEle->SyncToleranceDefault();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CSvgMediaElementBase::ConstructL( const TUint8 aElemID )
+ {
+ CSvgAnimationBase::ConstructL( aElemID );
+ // Add this element to the time container to recieve runtime sync events
+ ((CSvgDocumentImpl* )iOwnerDocument)->TimeContainer()->AddTimedEntityL( this );
+ }
+
+// Destructor
+CSvgMediaElementBase::~CSvgMediaElementBase()
+ {
+ // Remove this element from the time container
+ ((CSvgDocumentImpl* )iOwnerDocument)->TimeContainer()->DelTimedEntity( this );
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::SetSyncBehavior
+// Set the Synchronised behaviour for the media element
+// -----------------------------------------------------------------------------
+//
+void CSvgMediaElementBase::SetSyncBehavior( const TDesC& aValue )
+ {
+
+ if ( !aValue.CompareF( KTmpCanSlip ) )
+ {
+ iSyncBehavior = ESvgSyncCanSlip;
+ }
+ else if ( !aValue.CompareF( KTmpLocked ) )
+ {
+ iSyncBehavior = ESvgSyncLocked;
+ }
+ else if ( !aValue.CompareF( KTmpIndependent ) )
+ {
+ iSyncBehavior = ESvgSyncIndependent;
+ }
+ else if ( !aValue.CompareF( KTmpDefault ) )
+ {
+ // Obtain the sync behaviour from the root of time container
+ CSvgDocumentImpl* lSvgDoc = (( CSvgDocumentImpl* )
+ iOwnerDocument);
+ CSvgSvgElementImpl* lSvgEle = (CSvgSvgElementImpl* )lSvgDoc->RootElement();
+ if ( lSvgEle )
+ {
+ iSyncBehavior = lSvgEle->SyncBehaviorDefault();
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::SetSyncTolerance
+// Set the Synchronised Tolerance for the media element
+// -----------------------------------------------------------------------------
+//
+void CSvgMediaElementBase::SetSyncTolerance( const TDesC& aValue )
+ {
+ if ( aValue.CompareF( KTmpDefault ) )
+ {
+ CSvgAnimTimingParser* lATParserPtr = NULL;
+ // Treat as clock value
+ TRAPD( lCreateATPErr,
+ {
+ lATParserPtr = CSvgAnimTimingParser::NewL( aValue, this );
+ } );
+
+ if ( lCreateATPErr != KErrNone )
+ {
+ // Error Processing
+ return;
+ }
+
+ TInt32 lClockValue;
+ TLex lLex( aValue );
+ lATParserPtr->ParseClockValue( lLex, lClockValue );
+ delete lATParserPtr;
+ iSyncTolerance = lClockValue;
+ }
+ else
+ {
+ // Get clock value from parent
+ CSvgDocumentImpl* lSvgDoc = (( CSvgDocumentImpl* )
+ iOwnerDocument);
+ CSvgSvgElementImpl* lSvgEle = (CSvgSvgElementImpl* )lSvgDoc->RootElement();
+ if ( lSvgEle )
+ {
+ iSyncTolerance = lSvgEle->SyncToleranceDefault();
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::SetSyncMaster
+// Set the media element as Synchronised Master
+// -----------------------------------------------------------------------------
+//
+void CSvgMediaElementBase::SetSyncMaster( const TDesC& aValue )
+ {
+ if ( !aValue.CompareF(_L("true")) )
+ {
+ iSyncMasterConfig = ETrue;
+ }
+ else
+ {
+ iSyncMasterConfig = EFalse;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::SetSyncBehavior
+// Set the Synchronised behaviour for the media element
+// -----------------------------------------------------------------------------
+//
+void CSvgMediaElementBase::SetSyncBehavior(
+ const TSvgSyncBehaviour aValue )
+ {
+ if ( aValue == ESvgSyncDefault )
+ {
+ // Obtain the sync behaviour from the root of time container
+ CSvgDocumentImpl* lSvgDoc = (( CSvgDocumentImpl* )
+ iOwnerDocument);
+ CSvgSvgElementImpl* lSvgEle = (CSvgSvgElementImpl* )lSvgDoc->RootElement();
+ if ( lSvgEle )
+ {
+ iSyncBehavior = lSvgEle->SyncBehaviorDefault();
+ }
+ }
+ else
+ {
+ iSyncBehavior = aValue;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::SetSyncTolerance
+// Set the Synchronised Tolerance for the media element
+// -----------------------------------------------------------------------------
+//
+void CSvgMediaElementBase::SetSyncTolerance( const TInt32 aValue ,
+ const TBool aUseDefault )
+ {
+ if ( aUseDefault )
+ {
+ // Get clock value from parent
+ CSvgDocumentImpl* lSvgDoc = (( CSvgDocumentImpl* )
+ iOwnerDocument);
+ CSvgSvgElementImpl* lSvgEle = (CSvgSvgElementImpl* )lSvgDoc->RootElement();
+ if ( lSvgEle )
+ {
+ iSyncTolerance = lSvgEle->SyncToleranceDefault();
+ }
+ }
+ else
+ {
+ iSyncTolerance = aValue;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::SetSyncMaster
+// Set the media element as Synchronised Master
+// -----------------------------------------------------------------------------
+//
+void CSvgMediaElementBase::SetSyncMaster( const TBool aValue )
+ {
+ iSyncMasterConfig = aValue;
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::SyncBehavior
+// Accessor for the Synchronised behaviour for the media element
+// -----------------------------------------------------------------------------
+//
+TSvgSyncBehaviour CSvgMediaElementBase::SyncBehavior()
+ {
+ return iSyncBehavior;
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::SyncTolerance
+// Accessor for the Synchronised Tolerance for the media element
+// -----------------------------------------------------------------------------
+//
+TInt32 CSvgMediaElementBase::SyncTolerance()
+ {
+ return iSyncTolerance;
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::SyncMaster
+// Accessor for the Synchronised Mastership for the media element
+// -----------------------------------------------------------------------------
+//
+TBool CSvgMediaElementBase::SyncMaster()
+ {
+ return iSyncMasterConfig;
+ }
+
+// -----------------------------------------------------------------------------
+// SetAttributeL: Called by Contenthandler or decoder to set attributes
+// From CSvgAnimationBase
+// -----------------------------------------------------------------------------
+//
+TInt CSvgMediaElementBase::SetAttributeL( const TDesC& aName,
+ const TDesC& aValue )
+ {
+
+ if ( !aName.CompareF( KTmpSyncBehavior ) )
+ {
+ SetSyncBehavior( aValue );
+ }
+ else if ( !aName.CompareF( KTmpSyncTolerance ) )
+ {
+ SetSyncTolerance( aValue );
+ }
+ else if ( !aName.CompareF( KTmpSyncMaster ) )
+ {
+ SetSyncMaster( aValue );
+ }
+ else
+ {
+ return CSvgAnimationBase::SetAttributeL( aName, aValue );
+ }
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::ParentTimeContainerTick
+// From MSvgTimedEntityInterface
+// -----------------------------------------------------------------------------
+//
+void CSvgMediaElementBase::ParentTimeContainerTick(
+ TSvgTick aTick ) // Current tick information
+ {
+ // Check if the element is currently acting as syncMaster for the locked
+ // group it is part of.
+ // Note element having syncMaster property set doesn't make it master. It
+ // needs to be resolved.
+ TBool lIsCurSyncMaster = EFalse;
+
+ GetCurSyncMasterStatus( lIsCurSyncMaster );
+
+ if ( lIsCurSyncMaster || iSyncBehavior != ESvgSyncLocked )
+ {
+ // Could be locked, or not locked. In both cases, use media
+ // element clock.
+ if ( CanGenerateTick() )
+ {
+ //No action.
+ }
+ else
+ {
+ // Use the Real Time Tick.
+ // Create a timer event with real time tick
+ // Send this event to engine
+ }
+ }
+
+ if( !lIsCurSyncMaster && iSyncBehavior == ESvgSyncLocked)
+ {
+ // The element needs to be in sync with Parent.
+ if ( CanUseParentTick() )
+ {
+ // Run the media element with parent's tick.
+ // Create a timer event with parent's tick
+ // Send this event to engine
+ // Only required at Document Level.
+ }
+ else
+ {
+ // Calculate SyncOffset value
+ // Get the current tick on the element
+ TUint32 lEntityTime;
+ GetEntityCurrentTime( lEntityTime );
+ // Calculate the drift
+ TInt32 iSyncOffset = aTick.iParentTcTick - lEntityTime;
+
+ // Media element running with its own clock, need
+ // to resynchronize if the element is out of sync
+ // wrt to parent clock.
+ if ( Abs( iSyncOffset ) > iSyncTolerance )
+ {
+ // Resynchronize the Media Element wrt to
+ // Parent Clock.
+ ResyncTimedEntity( aTick.iParentTcTick );
+ }
+ }
+ }
+
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::GetEntitySyncBehavior
+// From MSvgTimedEntityInterface
+// -----------------------------------------------------------------------------
+//
+TSvgSyncBehaviour CSvgMediaElementBase::GetEntitySyncBehavior()
+ {
+ return iSyncBehavior;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::GetEntityCurrentTime
+// From MSvgTimedEntityInterface
+// -----------------------------------------------------------------------------
+//
+void CSvgMediaElementBase::GetEntityCurrentTime( TUint32&
+ /* aEntityCurTime*/ ) // Current Entity Time in msecs.
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::GetCnfSyncMasterStatus
+// From MSvgTimedEntityInterface
+// -----------------------------------------------------------------------------
+//
+void CSvgMediaElementBase::GetCnfSyncMasterStatus(
+ TBool& aIsSyncMaster ) // Indicates whether the element is configured as
+ // Sync Master.
+ {
+ aIsSyncMaster = iSyncMasterConfig;
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::GetCurSyncMasterStatus
+// From MSvgTimedEntityInterface
+// -----------------------------------------------------------------------------
+void CSvgMediaElementBase::GetCurSyncMasterStatus(
+ TBool& aIsSyncMaster ) // Indicates whether the element is currrently
+ // Sync Master.
+ {
+ aIsSyncMaster = iSyncMasterCurrent;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::SetCurSyncMasterStatus
+// From MSvgTimedEntityInterface
+// -----------------------------------------------------------------------------
+void CSvgMediaElementBase::SetCurSyncMasterStatus(
+ TBool aSyncMasterStatus ) // Indicates whether the element is currrently
+ // Sync Master.
+ {
+ iSyncMasterCurrent = aSyncMasterStatus;
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::CanGenerateTick
+// From MSvgTimedEntityInterface
+// -----------------------------------------------------------------------------
+TBool CSvgMediaElementBase::CanGenerateTick()
+ {
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::CanUseParentTick
+// From MSvgTimedEntityInterface
+// -----------------------------------------------------------------------------
+TBool CSvgMediaElementBase::CanUseParentTick()
+ {
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::ResyncTimedEntity
+// From MSvgTimedEntityInterface
+// -----------------------------------------------------------------------------
+void CSvgMediaElementBase::ResyncTimedEntity(
+ TUint32 /* aSynctime */ ) // Time for resync in msecs.
+ {
+
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::PauseTimedEntity
+// From MSvgTimedEntityInterface
+// -----------------------------------------------------------------------------
+void CSvgMediaElementBase::PauseTimedEntity()
+ {
+
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::ResumeTimedEntity
+// From MSvgTimedEntityInterface
+// -----------------------------------------------------------------------------
+void CSvgMediaElementBase::ResumeTimedEntity()
+ {
+
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgMediaElementBase::StopTimedEntity
+// From MSvgTimedEntityInterface
+// -----------------------------------------------------------------------------
+void CSvgMediaElementBase::StopTimedEntity()
+ {
+
+ }
+
+
+//From MSvgTimedEntityInterface
+TSvgObjectType CSvgMediaElementBase::ObjectType()
+{
+ return ESvgInvalidReference ;
+}
+
+
+//returns the child time container of the element
+//used in timecontainer
+CSvgTimeContainer* CSvgMediaElementBase::GetChildTimeContainer()
+{
+ return NULL;
+}
+
+// End of File