diff -r 8bda91a87a00 -r 8ee96d21d9bf profilesservices/RingingTone3DPlugin/src/C3DAudioXMLParser.cpp --- a/profilesservices/RingingTone3DPlugin/src/C3DAudioXMLParser.cpp Thu Aug 19 10:12:30 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2073 +0,0 @@ -/* -* Copyright (c) 2005 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: XML-Parser used to parse motion patterns. -* -*/ - - -// INCLUDE FILES -#include "C3DAudioXMLParser.h" -#include "tdaudioconstants.h" // K3DAudioRepositoryUid -#include // RFs -#include // RBufWriteStream -#include // CRepository - - -#include "RingingTone3DPluginDebug.h" -#include // for TProfile3DToneEffect and TProfile3DToneEcho - -#include -#include -#include - - -//CONSTANTS -const TInt32 KRingingTone3DAudioEComPluginUID = 0x10208ADF; - - -// 3DTone pattern dir -_LIT( K3DTonesDir, "3DTones" ); - -// 3DTone pattern files -_LIT( KPatternCircle, "1circular.xml" ); -_LIT( KPatternFlyBy, "2flyby.xml" ); -_LIT( KPatternZigZag, "3zigzag.xml" ); -_LIT( KPatternRandomWalk, "4meander.xml" ); -_LIT( KPatternChaos, "5random.xml" ); - - -// Elements -_LIT8( KInitElement, "initialization"); -_LIT8( KPositionElement, "position" ); -_LIT8( KUpdateElement, "update" ); -_LIT8( KVelocityElement, "velocity" ); -_LIT8( KLoopElement, "loop" ); - -// Attribute names. -_LIT8( KPatternName, "name" ); -_LIT8( KPatternReverb, "reverb" ); -_LIT8( KPatternDoppler, "doppler" ); -_LIT8( KXCoordinate, "x" ); -_LIT8( KYCoordinate, "y" ); -_LIT8( KZCoordinate, "z" ); -_LIT8( KDTime, "dTime" ); -_LIT8( KScalarVelocity, "scalar" ); -_LIT8( KLoopCount, "count" ); - -// Attribute values -_LIT8( KReverbPresetOne, "Livingroom" ); -_LIT8( KReverbPresetTwo, "Cave" ); -_LIT8( KReverbPresetThree, "Stone Corridor" ); -_LIT8( KReverbPresetFour, "Forest" ); -_LIT8( KReverbPresetFive, "Sewerpipe" ); -_LIT8( KReverbPresetSix, "Underwater" ); -_LIT8( KBooleanTrue, "true" ); - - - -/****************************************************************************** - * class C3DAudioXMLParser - ******************************************************************************/ - - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::NewL -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -C3DAudioXMLParser* C3DAudioXMLParser::NewL() - { - C3DAudioXMLParser* self = C3DAudioXMLParser::NewLC(); - CleanupStack::Pop( self ); - return self; - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::NewLC -// Two-phased constructor. Leaves pointer on cleanup stack. -// ----------------------------------------------------------------------------- -// -C3DAudioXMLParser* C3DAudioXMLParser::NewLC() - { - C3DAudioXMLParser * self = new ( ELeave ) C3DAudioXMLParser(); - CleanupStack::PushL( self ); - self->ConstructL(); - return self; - } - - -// Destructor -C3DAudioXMLParser::~C3DAudioXMLParser() - { - delete iParser; - delete iParsedPattern; - iFsSession.Close(); - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::C3DAudioXMLParser -// C++ default constructor can NOT contain any code, that -// might leave. -// ----------------------------------------------------------------------------- -// -C3DAudioXMLParser::C3DAudioXMLParser(): - iParser( NULL ), - iParsedPattern( NULL ) - { - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::ConstructL -// Symbian 2nd phase constructor can leave. -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::ConstructL() - { - _LIT8( KParserMimeType, "text/xml" ); - - iPatternId = KErrNotFound; - - iParser = Xml::CParser::NewL( KParserMimeType, *this ); - - User::LeaveIfError( iFsSession.Connect() ); - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::Count -// -// ----------------------------------------------------------------------------- -// -TInt C3DAudioXMLParser::CountL() - { - User::LeaveIfNull( iParsedPattern ); - const RArray& script = iParsedPattern->Script(); - - return script.Count(); - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::PositionL -// -// ----------------------------------------------------------------------------- -// -const T3DPosition& C3DAudioXMLParser::PositionL( TInt aIndex ) - { - User::LeaveIfNull( iParsedPattern ); - const RArray& script = iParsedPattern->Script(); - - if ( aIndex < 0 || aIndex >= script.Count() ) - { - User::Leave( KErrArgument ); - } - - return script[ aIndex ].iPosition; - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::VelocityL -// -// ----------------------------------------------------------------------------- -// -const T3DVelocity& C3DAudioXMLParser::VelocityL( TInt aIndex ) - { - User::LeaveIfNull( iParsedPattern ); - const RArray& script = iParsedPattern->Script(); - - if ( aIndex < 0 || aIndex >= script.Count() ) - { - User::Leave( KErrArgument ); - } - - return script[ aIndex ].iVelocity; - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::TimeL -// -// ----------------------------------------------------------------------------- -// -const TInt& C3DAudioXMLParser::TimeL( TInt aIndex ) - { - User::LeaveIfNull( iParsedPattern ); - const RArray& script = iParsedPattern->Script(); - - if ( aIndex < 0 || aIndex >= script.Count() ) - { - User::Leave( KErrArgument ); - } - - return script[ aIndex ].iDTime; - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::Attribute -// -// ----------------------------------------------------------------------------- -// -TInt C3DAudioXMLParser::Attribute( TInt aKey ) - { - TInt num = KErrNotFound; - - switch ( aKey ) - { - case EKeyPatternId: - { - num = iPatternId; - break; - } - case EKeyDopplerUsed: - { - num = iParsedPattern->DopplerAvailable(); - break; - } - case EKeyVelocity: - { - num = KMotionPatternDefaultVelocity; - break; - } - default: - { - break; - } - } - - return num; - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::ParseL -// -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::ParseL( TInt aPatternId ) - { - FLOG( _L("C3DAudioXMLParser::ParseL START") ); - - if ( ReadFromPatternCacheL( aPatternId ) ) - { - -#ifdef _DEBUG - // parsed pattern data found in cache (publish and subcribe) - FlogPatternL( aPatternId ); -#endif - - } - else - { - GetPatternFullPathL( iFullPath, aPatternId ); - ParseL( iFullPath ); - - WriteToPatternCacheL( aPatternId ); - - FLOG( _L("pattern '%S' parsed and written to cache"), &iFullPath ); - } - - iPatternId = aPatternId; - -#ifdef _DEBUG - AssertParseDataL( aPatternId ); -#endif - - - FLOG( _L("C3DAudioXMLParser::ParseL END") ); - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::ParseL -// -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::ParseL( const TDesC& aFileName ) - { - delete iParsedPattern; - iParsedPattern = NULL; - iParsedPattern = C3DAudioPattern::NewL(); - - // - // read xml-format pattern file into descriptor - // - CBufFlat* buf = ReadPatternFileL( aFileName ); - CleanupStack::PushL( buf ); - - // - // parse xml-format pattern into C3DAudioPattern - // - TPtr8 ptr = buf->Ptr( 0 ); - iParser->ParseL( ptr ); - iParser->ParseEndL(); - - RArray script = iParsedPattern->Script(); - if ( script.Count() == 0 ) - { - User::Leave( KErrNotFound ); - } - - CleanupStack::PopAndDestroy( buf ); - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::ReadFromPatternCacheL -// -// ----------------------------------------------------------------------------- -// -TBool C3DAudioXMLParser::ReadFromPatternCacheL( TInt aPatternId ) - { - C3DPatternPS* pubSub = C3DPatternPS::NewLC( KRingingTone3DAudioEComPluginUID ); - - TInt patternId = pubSub->IntL( C3DPatternPS::EKeyPatternId ); - if ( patternId == aPatternId ) - { - // buffer for 3D pattern data - CBufFlat* buf = pubSub->DataLC(); - - // readstream to construct the pattern. - RBufReadStream readstream( *buf ); - CleanupClosePushL( readstream ); - - // create C3DAudioPattern for accessing 3D ringing tone data - delete iParsedPattern; - iParsedPattern = NULL; - iParsedPattern = C3DAudioPattern::NewL( readstream ); - - CleanupStack::PopAndDestroy( &readstream ); - CleanupStack::PopAndDestroy( buf ); - } - - CleanupStack::PopAndDestroy( pubSub ); - - if ( patternId == aPatternId ) - { - return ETrue; - } - return EFalse; - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::WriteToPatternCacheL -// -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::WriteToPatternCacheL( TInt aPatternId ) - { - const TInt KGranularity = 1024; - - C3DPatternPS* pubSub = C3DPatternPS::NewLC( KRingingTone3DAudioEComPluginUID ); - - // - // write binary-format (parsed) pattern data into descriptor - // - CBufFlat* buf = CBufFlat::NewL( KGranularity ); - CleanupStack::PushL( buf ); - - RBufWriteStream writestream( *buf ); - CleanupClosePushL( writestream ); - iParsedPattern->ExternalizeL( writestream ); - writestream.CommitL(); - CleanupStack::PopAndDestroy( &writestream ); - -#ifdef _DEBUG - TInt oldPatternId = pubSub->IntL( C3DPatternPS::EKeyPatternId ); - FlogPatternsL( oldPatternId, aPatternId ); -#endif - - // - // write pattern data and attributes into public and subscribe - // - pubSub->SetIntL( C3DPatternPS::EKeyPatternId, KErrNotFound ); - pubSub->SetIntL( C3DPatternPS::EKeyDopplerUsed, iParsedPattern->DopplerAvailable() ); - pubSub->SetIntL( C3DPatternPS::EKeyVelocity, KMotionPatternDefaultVelocity ); - pubSub->SetDataL( buf->Ptr( 0 ) ); - pubSub->SetIntL( C3DPatternPS::EKeyPatternId, aPatternId ); - - CleanupStack::PopAndDestroy( buf ); - - CleanupStack::PopAndDestroy( pubSub ); - } - - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::OnStartDocumentL -// Leave if error, otherwise nothing to do. -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::OnStartDocumentL( - const Xml::RDocumentParameters& /*aDocParam*/, - TInt aErrorCode ) - { - // Leave if error occurred. - User::LeaveIfError( aErrorCode ); - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::OnEndDocumentL -// Leave if error, otherwise nothing to do. -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::OnEndDocumentL( - TInt aErrorCode ) - { - // Leave if error occurred. - User::LeaveIfError( aErrorCode ); - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::OnStartElementL -// Proceed depending on the element. -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::OnStartElementL( - const Xml::RTagInfo& aElement, - const Xml::RAttributeArray& aAttributes, - TInt aErrorCode ) - { - // Leave if error occurred. - User::LeaveIfError( aErrorCode ); - - CopyL( iElementName, aElement.LocalName().DesC() ); - - // Proceed depending of the element. - if ( iElementName.CompareC( KUpdateElement ) == 0 ) - { - ProcessUpdateAttributesL( aAttributes ); - iLastTag = EUpdate; - } - else if ( iElementName.CompareC( KPositionElement ) == 0 ) - { - // Do not take position in initialization in account. - if ( iLastTag == EUpdate ) - { - ProcessPositionAttributesL( aAttributes ); - } - } - else if ( iElementName.CompareC( KVelocityElement ) == 0 ) - { - // Do not take velocity in initialization in account. - if ( iLastTag == EUpdate ) - { - ProcessVelocityAttributesL( aAttributes ); - } - } - else if ( iElementName.CompareC( KInitElement ) == 0 ) - { - // pasi - // Create new motion pattern and process the attributes of it. - delete iParsedPattern; - iParsedPattern = NULL; - iParsedPattern = C3DAudioPattern::NewL(); - - ProcessInitAttributesL( aAttributes ); - iLastTag = EInitialization; - } - else if ( iElementName.CompareC( KLoopElement ) == 0 ) - { - ProcessLoopAttributesL( aAttributes ); - } - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::OnEndElementL -// Proceed for elements that need processing. -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::OnEndElementL( const Xml::RTagInfo& aElement, TInt aErrorCode ) - { - // Leave if error occurred. - User::LeaveIfError( aErrorCode ); - - CopyL( iElementName, aElement.LocalName().DesC() ); - - if ( iElementName.CompareC( KUpdateElement ) == 0 ) - { - // Update-element ended, add the update to script. - iParsedPattern->AddUpdateL( iCurrentUpdate ); - } - else if ( iElementName.CompareC( KLoopElement ) == 0 ) - { - // Loop-element ended, end the loop. - iParsedPattern->EndLoop(); - } - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::OnContentL -// Leave if error, otherwise nothing to do. -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::OnContentL( const TDesC8& /*aBytes*/, TInt aErrorCode ) - { - // Leave if error occurred. - User::LeaveIfError( aErrorCode ); - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::OnStartPrefixMappingL -// Leave if error, otherwise nothing to do. -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::OnStartPrefixMappingL( const RString& /*aPrefix*/, - const RString& /*aUri*/, - TInt aErrorCode ) - { - // Leave if error occurred. - User::LeaveIfError( aErrorCode ); - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::OnEndPrefixMappingL -// Leave if error, otherwise nothing to do. -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::OnEndPrefixMappingL( const RString& /*aPrefix*/, - TInt aErrorCode ) - { - // Leave if error occurred. - User::LeaveIfError( aErrorCode ); - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::OnIgnorableWhiteSpaceL -// Leave if error, otherwise nothing to do. -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::OnIgnorableWhiteSpaceL( const TDesC8& /*aBytes*/, - TInt aErrorCode ) - { - // Leave if error occurred. - User::LeaveIfError( aErrorCode ); - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::OnSkippedEntityL -// Leave if error, otherwise nothing to do. -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::OnSkippedEntityL( const RString& /*aName*/, - TInt aErrorCode ) - { - // Leave if error occurred. - User::LeaveIfError( aErrorCode ); - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::OnProcessingInstructionL -// Leave if error, otherwise nothing to do. -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::OnProcessingInstructionL( const TDesC8& /*aTarget*/, - const TDesC8& /*aData*/, - TInt aErrorCode ) - { - // Leave if error occurred. - User::LeaveIfError( aErrorCode ); - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::OnError -// Print error code to debug. -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::OnError( TInt aErrorCode ) - { - if ( aErrorCode != KErrNone ) - { - FLOG( _L("### C3DAudioXMLParser::OnError (%d) ###"), aErrorCode ); - } - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::GetExtendedInterface -// Not implemented -// ----------------------------------------------------------------------------- -// -TAny* C3DAudioXMLParser::GetExtendedInterface( const TInt32 /*aUid*/ ) - { - return NULL; - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::ProcessInitAttributesL -// Process the initialization attributes. -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::ProcessInitAttributesL( const Xml::RAttributeArray& aAttributes ) - { - // Check each attribute. - for ( TUint i = 0; i < aAttributes.Count(); ++i ) - { - CopyL( iAttributeName, aAttributes[i].Attribute().LocalName().DesC() ); - CopyL( iAttributeValue, aAttributes[i].Value().DesC() ); - - // Set the name of the pattern. - if ( iAttributeName.CompareC( KPatternName ) == 0 ) - { - iParsedPattern->SetNameL( iAttributeValue ); - } - else if ( iAttributeName.CompareC( KPatternReverb ) == 0 ) - { - TUint selectedReverb = EReverbNotEnabled; - - // Determine the reverberation. - if ( iAttributeValue.CompareC( KReverbPresetOne ) == 0 ) - { - selectedReverb = EReverbPresetOne; - } - else if ( iAttributeValue.CompareC( KReverbPresetTwo ) == 0 ) - { - selectedReverb = EReverbPresetTwo; - } - else if ( iAttributeValue.CompareC( KReverbPresetThree ) == 0 ) - { - selectedReverb = EReverbPresetThree; - } - else if ( iAttributeValue.CompareC( KReverbPresetFour ) == 0 ) - { - selectedReverb = EReverbPresetFour; - } - else if ( iAttributeValue.CompareC( KReverbPresetFive ) == 0 ) - { - selectedReverb = EReverbPresetFive; - } - else if ( iAttributeValue.CompareC( KReverbPresetSix ) == 0 ) - { - selectedReverb = EReverbPresetSix; - } - - // Set the reverberation to pattern. - iParsedPattern->SetReverb( selectedReverb ); - } - else if ( iAttributeName.CompareC( KPatternDoppler ) == 0) - { - // Set doppler. - if ( iAttributeValue.CompareC( KBooleanTrue ) == 0 ) - { - iParsedPattern->SetDoppler( ETrue ); - } - } - } - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::ProcessLoopAttributes -// Process the loop-element attributes. -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::ProcessLoopAttributesL( const Xml::RAttributeArray& aAttributes ) - { - TLex8 lex; - - for ( TUint i = 0; i < aAttributes.Count(); ++i ) - { - CopyL( iAttributeName, aAttributes[i].Attribute().LocalName().DesC() ); - CopyL( iAttributeValue, aAttributes[i].Value().DesC() ); - - lex.Assign( iAttributeValue ); - - if ( iAttributeName.CompareC( KLoopCount ) == 0 ) - { - TUint loopCount; - User::LeaveIfError ( lex.Val( loopCount ) ); - - // Start the loop in pattern. - iParsedPattern->StartLoopL( loopCount ); - } - } - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::ProcessPositionAttributes -// Process the position-element attributes. -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::ProcessPositionAttributesL( const Xml::RAttributeArray& aAttributes ) - { - TLex8 lex; - T3DPosition position = T3DPosition(); - - TInt count = aAttributes.Count(); - for ( TUint i = 0; i < count; ++i ) - { - CopyL( iAttributeName, aAttributes[i].Attribute().LocalName().DesC() ); - CopyL( iAttributeValue, aAttributes[i].Value().DesC() ); - - lex.Assign( iAttributeValue ); - - if ( iAttributeName.CompareC( KXCoordinate ) == 0 ) - { - User::LeaveIfError( lex.Val( position.iX ) ); - } - else if ( iAttributeName.CompareC( KYCoordinate ) == 0 ) - { - User::LeaveIfError( lex.Val( position.iY ) ); - } - else if ( iAttributeName.CompareC( KZCoordinate ) == 0) - { - User::LeaveIfError( lex.Val( position.iZ ) ); - } - } - - // Set position for current update. - iCurrentUpdate.iPosition = position; - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::ProcessUpdateAttributes -// Process the update-element attributes. -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::ProcessUpdateAttributesL( const Xml::RAttributeArray& aAttributes ) - { - TLex8 lex; - // New update-element. - iCurrentUpdate = T3DScriptUpdate(); - - for ( TUint i = 0; i < aAttributes.Count(); ++i ) - { - CopyL( iAttributeName, aAttributes[i].Attribute().LocalName().DesC() ); - CopyL( iAttributeValue, aAttributes[i].Value().DesC() ); - - lex.Assign( iAttributeValue ); - - if ( iAttributeName.CompareC( KDTime ) == 0 ) - { - // Set the dTime for the update. - User::LeaveIfError( lex.Val( iCurrentUpdate.iDTime ) ); - } - } - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::ProcessVelocityAttributes -// Process the velocity-element attributes. -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::ProcessVelocityAttributesL( const Xml::RAttributeArray& aAttributes ) - { - TLex8 lex; - T3DVelocity velocity = T3DVelocity(); - - for ( TUint i = 0; i < aAttributes.Count(); ++i ) - { - CopyL( iAttributeName, aAttributes[i].Attribute().LocalName().DesC() ); - CopyL( iAttributeValue, aAttributes[i].Value().DesC() ); - - lex.Assign( iAttributeValue ); - - if ( iAttributeName.CompareC( KScalarVelocity ) == 0 ) - { - velocity.iScalar = ETrue; - User::LeaveIfError( lex.Val( velocity.iScalarVelocity ) ); - velocity.iXVector = 0; - velocity.iYVector = 0; - velocity.iZVector = 0; - break; - } - else if ( iAttributeName.CompareC( KXCoordinate ) == 0 ) - { - User::LeaveIfError( lex.Val( velocity.iXVector ) ); - } - else if ( iAttributeName.CompareC( KYCoordinate ) == 0 ) - { - User::LeaveIfError( lex.Val( velocity.iYVector ) ); - } - else if ( iAttributeName.CompareC( KZCoordinate ) == 0) - { - User::LeaveIfError( lex.Val( velocity.iZVector ) ); - } - } - // Set velocity for current update. - iCurrentUpdate.iVelocity = velocity; - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::CopyL -// -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::CopyL( TDes8& aTarget, const TDesC8& aSource ) - { - if ( aSource.Length() > aTarget.MaxLength() ) - { - -#ifdef _DEBUG - Panic( KErrArgument ); -#endif - - User::Leave( KErrTooBig ); - } - - aTarget.Copy( aSource ); - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::Panic() -// -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::Panic(TInt aReason) - { - _LIT(KPanicCategory,"RingingTone3DAudioPlugin"); - - User::Panic(KPanicCategory, aReason); - } - - -// ------------------------------------------------------------------------------- -// C3DAudioXMLParser::ReadPatternFileL -// -// ------------------------------------------------------------------------------- -// -CBufFlat* C3DAudioXMLParser::ReadPatternFileL( const TDesC& aFullName ) - { - const TInt KGranularity = 1024; - - RFile file; - User::LeaveIfError( file.Open( iFsSession, aFullName, EFileRead ) ); - CleanupClosePushL( file ); - - CBufFlat* buf = CBufFlat::NewL( KGranularity ); - CleanupStack::PushL( buf ); - - TInt size = 0; - file.Size( size ); - buf->ResizeL( size ); - - TPtr8 ptr = buf->Ptr( 0 ); - User::LeaveIfError( file.Read( ptr ) ); - - CleanupStack::Pop( buf ); - CleanupStack::PopAndDestroy( &file ); - - return buf; - } - - -// ------------------------------------------------------------------------------- -// C3DAudioXMLParser::GetPatternFullPathL -// -// ------------------------------------------------------------------------------- -// -void C3DAudioXMLParser::GetPatternFullPathL(TDes& aText, TInt aPatternId) - { - _LIT( KFormatString, "%S%S%S\\%S"); - - TBuf pattern; - - // emulator dir "\epoc32\release\winscw\udeb\Z\resource\3DTones" - // hardware dir "z:\data\Z\resource\3DTones" - - switch (aPatternId) - { - case EProfile3DEffectCircle: - { - pattern = KPatternCircle; - break; - } - case EProfile3DEffectFlyby: - { - pattern = KPatternFlyBy; - break; - } - case EProfile3DEffectZigZag: - { - pattern = KPatternZigZag; - break; - } - case EProfile3DEffectRandomWalk: - { - pattern = KPatternRandomWalk; - break; - } - case EProfile3DEffectChaos: - { - pattern = KPatternChaos; - break; - } - default: - { - User::Leave( KErrNotSupported ); - break; - } - } - - TDriveUnit drive( EDriveZ ); - TDriveName driveName = drive.Name(); - - aText.Format(KFormatString, &driveName, &KDC_RESOURCE_FILES_DIR, &K3DTonesDir, &pattern); - } - - - - - - -#ifdef _DEBUG - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::AssertParseDataL -// -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::AssertParseDataL( TInt aPatternId ) - { - const TInt KGranularity = 1024; - - C3DPatternPS* ps = C3DPatternPS::NewLC( KRingingTone3DAudioEComPluginUID ); - - CBufFlat* buf = CBufFlat::NewL( KGranularity ); - CleanupStack::PushL( buf ); - - RBufWriteStream writestream( *buf ); - CleanupClosePushL( writestream ); - iParsedPattern->ExternalizeL( writestream ); - writestream.CommitL(); - CleanupStack::PopAndDestroy( &writestream ); - - CBufFlat* buf2 = ps->DataLC(); - - - TInt id = ps->IntL(C3DPatternPS::EKeyPatternId); - if ( id != aPatternId ) - { - Panic( KErrGeneral ); - } - - TPtr8 p1 = buf->Ptr( 0 ); - TPtr8 p2 = buf2->Ptr( 0 ); - - TInt ret = p1.Compare( p2 ); - if ( ret != 0 ) - { - Panic( KErrGeneral ); - } - TInt doppler = ps->IntL( C3DPatternPS::EKeyDopplerUsed ); - if ( doppler != iParsedPattern->DopplerAvailable() ) - { - Panic( KErrGeneral ); - } - TInt velocity = ps->IntL( C3DPatternPS::EKeyVelocity ); - if (velocity != KMotionPatternDefaultVelocity) - { - Panic( KErrGeneral ); - } - - CleanupStack::PopAndDestroy( buf2 ); - CleanupStack::PopAndDestroy( buf ); - CleanupStack::PopAndDestroy( ps ); - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::FlogPatternsL() -// -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::FlogPatternsL(TInt aOldPattern, TInt aNewPattern) - { - TBuf<128> buf; TBuf<128> buf2; - - GetPatternString(buf, aOldPattern); - GetPatternString(buf2, aNewPattern); - FLOG( _L("pattern changed from '%S' to '%S'"), &buf, &buf2 ); - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::FlogPatternL() -// -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::FlogPatternL(TInt aPattern) - { - TBuf<128> buf; - - GetPatternString(buf, aPattern); - FLOG( _L("pattern '%S' found in cache"), &buf ); - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::GetPatternString() -// -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::GetPatternString(TDes& aText, TInt aPattern) - { - switch (aPattern) - { - case EProfile3DEffectOff: - aText = _L("EProfile3DEffectOff"); - break; - case EProfile3DEffectCircle: - aText = _L("EProfile3DEffectCircle"); - break; - case EProfile3DEffectFlyby: - aText = _L("EProfile3DEffectFlyby"); - break; - case EProfile3DEffectZigZag: - aText = _L("EProfile3DEffectZigZag"); - break; - case EProfile3DEffectRandomWalk: - aText = _L("EProfile3DEffectRandomWalk"); - break; - case EProfile3DEffectChaos: - aText = _L("EProfile3DEffectChaos"); - break; - case EProfile3DEffectStereoWidening: - aText = _L("EProfile3DEffectStereoWidening"); - break; - case KErrNotFound: - aText = _L("KErrNotFound"); - break; - - default: - aText = _L("### unknown pattern ###"); - break; - } - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::FlogPubSubL() -// -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::FlogPubSubL(TInt aEcho) - { - FLOG( _L("------ start pubsub data ------") ); - - TInt num = 0; - TBuf<128> buf; - - C3DPatternPS* pubSub = C3DPatternPS::NewLC( KRingingTone3DAudioEComPluginUID ); - - num = pubSub->IntL(C3DPatternPS::EKeyPatternId); - C3DAudioXMLParser::GetPatternString(buf, num); - FLOG( _L("pattern: %S (%d)"), &buf, num ); - - GetEchoString(buf, aEcho); - FLOG( _L("echo: %S (%d)"), &buf, aEcho ); - - num = pubSub->IntL(C3DPatternPS::EKeyVelocity); - FLOG( _L("velocity: %d"), num ); - - num = pubSub->IntL(C3DPatternPS::EKeyDopplerUsed); - FLOG( _L("doppler: %d"), num ); - - num = pubSub->IntL(C3DPatternPS::EKeyDataSize); - FLOG( _L("data size: %d"), num ); - - CleanupStack::PopAndDestroy( pubSub ); - - FLOG( _L("------ end pubsub data ------") ); - } - - -// ----------------------------------------------------------------------------- -// C3DAudioXMLParser::GetEchoString() -// -// ----------------------------------------------------------------------------- -// -void C3DAudioXMLParser::GetEchoString(TDes& aText, TInt aEcho) - { - switch (aEcho) - { - case EProfile3DEchoOff: - aText = _L("EProfile3DEchoOff"); - break; - case EProfile3DEchoLivingRoom: - aText = _L("EProfile3DEchoLivingRoom"); - break; - case EProfile3DEchoCave: - aText = _L("EProfile3DEchoCave"); - break; - case EProfile3DEchoStoneCorridor: - aText = _L("EProfile3DEchoStoneCorridor"); - break; - case EProfile3DEchoForest: - aText = _L("EProfile3DEchoForest"); - break; - case EProfile3DEchoSewerPipe: - aText = _L("EProfile3DEchoSewerPipe"); - break; - case EProfile3DEchoUnderwater: - aText = _L("EProfile3DEchoUnderwater"); - break; - default: - aText = _L("### unknown echo ###"); - break; - } - } - -#endif // _DEBUG - - - - -/****************************************************************************** - * class C3DPatternPS - ******************************************************************************/ - - - -// ----------------------------------------------------------------------------- -// C3DPatternPS::NewLC -// -// ----------------------------------------------------------------------------- -// -C3DPatternPS* C3DPatternPS::NewLC( TInt aStoreId ) - { - C3DPatternPS* self = new ( ELeave ) C3DPatternPS( aStoreId ); - CleanupStack::PushL( self ); - self->ConstructL(); - return self; - } - - -// Destructor -C3DPatternPS::~C3DPatternPS() - { - iProperty.Close(); - } - - -// ----------------------------------------------------------------------------- -// C3DPatternPS::C3DPatternPS -// C++ default constructor can NOT contain any code, that -// might leave. -// ----------------------------------------------------------------------------- -// -C3DPatternPS::C3DPatternPS( TInt aStoreId ) - { - iStoreUid.iUid = aStoreId; - } - - -// ----------------------------------------------------------------------------- -// C3DPatternPS::ConstructL -// -// ----------------------------------------------------------------------------- -// -void C3DPatternPS::ConstructL() - { - TBool ret = DefineKeyL( EKeyPatternId, RProperty::EInt ); - if ( ret ) - { - // first time initialization - TInt err = iProperty.Set( iStoreUid, EKeyPatternId, KErrNotFound ); - User::LeaveIfError( err ); - } - - DefineKeyL( EKeyDopplerUsed, RProperty::EInt ); - DefineKeyL( EKeyVelocity, RProperty::EInt ); - DefineKeyL( EKeyDataSize, RProperty::EInt ); - DefineKeyL( EKeyPatternData, RProperty::ELargeText ); - } - - -// ----------------------------------------------------------------------------- -// C3DPatternPS::DefineKeyL -// -// ----------------------------------------------------------------------------- -// -TBool C3DPatternPS::DefineKeyL( TInt aKeyId, TInt aKeyType ) - { - TInt err = iProperty.Define( iStoreUid, aKeyId, aKeyType ); - - if ( err != KErrNone && err != KErrAlreadyExists ) - { - User::Leave( err ); - } - - if ( err == KErrNone ) - { - return ETrue; // key was created - } - - return EFalse; // key already existed - } - - - -// ----------------------------------------------------------------------------- -// C3DPatternPS::IntL -// -// ----------------------------------------------------------------------------- -// -TInt C3DPatternPS::IntL( TInt aKey ) - { - TInt num = KErrNotFound; - TInt err = iProperty.Get( iStoreUid, aKey, num ); - User::LeaveIfError( err ); - - return num; - } - - -// ----------------------------------------------------------------------------- -// C3DPatternPS::SetIntL -// -// ----------------------------------------------------------------------------- -// -void C3DPatternPS::SetIntL( TInt aKey, TInt aValue ) - { - TInt err = iProperty.Set( iStoreUid, aKey, aValue ); - User::LeaveIfError( err ); - } - - -// ----------------------------------------------------------------------------- -// C3DPatternPS::SetDataL -// -// ----------------------------------------------------------------------------- -// -void C3DPatternPS::SetDataL( const TDesC8& aData ) - { - const TInt KMaxSize = 65536; - - if ( aData.Size() > KMaxSize ) - { - User::Leave( KErrOverflow ); - } - - TInt err = iProperty.Set( iStoreUid, EKeyPatternData, aData ); - User::LeaveIfError( err ); - - TInt size = aData.Size(); - err = iProperty.Set( iStoreUid, EKeyDataSize, size ); - User::LeaveIfError( err ); - } - - -// ----------------------------------------------------------------------------- -// C3DPatternPS::GetDataL -// -// ----------------------------------------------------------------------------- -// -void C3DPatternPS::GetDataL( TDes8& aData ) - { - TInt err = iProperty.Get( iStoreUid, EKeyPatternData, aData ); - User::LeaveIfError( err ); - } - - -// ----------------------------------------------------------------------------- -// C3DPatternPS::DataLC -// -// ----------------------------------------------------------------------------- -// -CBufFlat* C3DPatternPS::DataLC() - { - const TInt KGranularity = 1024; - - CBufFlat* buf = CBufFlat::NewL( KGranularity ); - CleanupStack::PushL( buf ); - - TInt size = IntL( C3DPatternPS::EKeyDataSize ); - buf->ResizeL( size ); - TPtr8 ptr8 = buf->Ptr( 0 ); - GetDataL( ptr8 ); - - return buf; - } - - - - - - -////////////////////////////////////// START TEST CODE ////////////////////////// - -// element names -_LIT(KKInitElement, "initialization"); -_LIT(KKUpdateElement, "update"); -_LIT(KKPositionElement, "position"); -_LIT(KKVelocityElement, "velocity"); - -// attribute names -_LIT( KKXCoordinate, "x" ); -_LIT( KKYCoordinate, "y" ); -_LIT( KKZCoordinate, "z" ); - -_LIT( KKPatternName, "name" ); -_LIT( KKEchoName, "reverb" ); -_LIT( KKDoppler, "doppler" ); -_LIT( KKDTime, "dTime" ); - -// attribute values -_LIT( KKBooleanTrue, "true" ); - - - - -// "Z:\\resource\\10208ADF\\3zigzag.xml" - - -// ----------------------------------------------------------------------------- -// C3DPatternParser::NewL -// -// ----------------------------------------------------------------------------- -// -C3DPatternParser* C3DPatternParser::NewL() - { - C3DPatternParser* self = new (ELeave) C3DPatternParser(); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(self); - - return self; - } - - -// ----------------------------------------------------------------------------- -// Destructor -// -// ----------------------------------------------------------------------------- -// -C3DPatternParser::~C3DPatternParser() - { - iPositionList.Close(); - iVelocityList.Close(); - delete iParser; - iFsSession.Close(); - } - - -// ----------------------------------------------------------------------------- -// C3DPatternParser::C3DPatternParser -// -// ----------------------------------------------------------------------------- -// -C3DPatternParser::C3DPatternParser() - { - } - - -// ----------------------------------------------------------------------------- -// C3DPatternParser::ConstructL -// -// ----------------------------------------------------------------------------- -// -void C3DPatternParser::ConstructL() - { - _LIT8(KMimeType, "text/xml"); - - iParser = Xml::CParser::NewL( KMimeType, *this ); - - User::LeaveIfError( iFsSession.Connect() ); - } - - -// ----------------------------------------------------------------------------- -// C3DPatternParser::ReadFileL -// -// ----------------------------------------------------------------------------- -// -CBufFlat* C3DPatternParser::ReadDocumentL(const TDesC& aFullName) - { - const TInt KGranularity = 1024; - - RFile file; - User::LeaveIfError( file.Open(iFsSession, aFullName, EFileRead) ); - CleanupClosePushL(file); - - CBufFlat* buffer = CBufFlat::NewL(KGranularity); - CleanupStack::PushL(buffer); - - TInt size = 0; - file.Size(size); - buffer->ResizeL(size); - - TPtr8 ptr = buffer->Ptr(0); - User::LeaveIfError( file.Read(ptr) ); - - CleanupStack::Pop(buffer); - CleanupStack::PopAndDestroy(&file); - - return buffer; - } - - -// ----------------------------------------------------------------------------- -// C3DPatternParser::ParseDocumentL -// -// ----------------------------------------------------------------------------- -// -void C3DPatternParser::ParseDocumentL(const TDesC& aFullName) - { - iVelocityUsed = EFalse; - iDopplerUsed = EFalse; - - iPositionList.Reset(); - iVelocityList.Reset(); - - - CBufFlat* buf = ReadDocumentL(aFullName); - CleanupStack::PushL(buf); - TPtr8 ptr = buf->Ptr(0); - - iParser->ParseL(ptr); - - iParser->ParseEndL(); - - ///Print(); - - CleanupStack::PopAndDestroy(buf); - } - - -// ----------------------------------------------------------------------------- -// C3DPatternParser::ParseDocumentL -// -// ----------------------------------------------------------------------------- -// -void C3DPatternParser::ParseDocumentL(TInt aPatternId) - { - TFileName name; - GetPatternFileNameL(name, aPatternId); - - ParseDocumentL(name); - } - - -// ----------------------------------------------------------------------------- -// C3DPatternParser::GetPatternName -// -// ----------------------------------------------------------------------------- -// -void C3DPatternParser::GetPatternName(TDes& aText) - { - StrCopy(aText, iPatternName); - } - - -// ----------------------------------------------------------------------------- -// C3DPatternParser::GetEchoName -// -// ----------------------------------------------------------------------------- -// -void C3DPatternParser::GetEchoName(TDes& aText) - { - StrCopy(aText, iEchoName); - } - - -// ----------------------------------------------------------------------------- -// C3DPatternParser::GetEchoName -// -// ----------------------------------------------------------------------------- -// -TBool C3DPatternParser::DopplerEnabled() - { - return iDopplerUsed; - } - - -// ----------------------------------------------------------------------------- -// C3DPatternParser::PositionCount -// -// ----------------------------------------------------------------------------- -// -TInt C3DPatternParser::PositionCount() - { - return iPositionList.Count(); - } - - -// ----------------------------------------------------------------------------- -// C3DPatternParser::Position -// -// ----------------------------------------------------------------------------- -// -T3DPatternData& C3DPatternParser::Position(TInt aIndex) - { - if (aIndex < 0 || aIndex >= iPositionList.Count()) - { - Panic(KErrArgument); - } - - return iPositionList[aIndex]; - } - - -// ----------------------------------------------------------------------------- -// C3DPatternParser::Velocity -// -// ----------------------------------------------------------------------------- -// -T3DPatternData& C3DPatternParser::Velocity(TInt aIndex) - { - if (aIndex < 0 || aIndex >= iVelocityList.Count()) - { - Panic(KErrArgument); - } - - return iVelocityList[aIndex]; - } - - -// ----------------------------------------------------------------------------- -// C3DPatternParser::AssertPosition -// -// ----------------------------------------------------------------------------- -// -void C3DPatternParser::AssertPosition(TInt aIndex, TInt aX, TInt aY, TInt aZ) - { - T3DPatternData d = Position(aIndex); - - if (d.iX != aX || d.iY != aY || d.iZ != aZ) - { - Panic(KErrArgument); - } - } - - -// ----------------------------------------------------------------------------- -// C3DPatternParser::AssertVelocity -// -// ----------------------------------------------------------------------------- -// -void C3DPatternParser::AssertVelocity(TInt aIndex, TInt aX, TInt aY, TInt aZ) - { - T3DPatternData d = Velocity(aIndex); - - if (d.iX != aX || d.iY != aY || d.iZ != aZ) - { - Panic(KErrArgument); - } - } - - -// ----------------------------------------------------------------------------- -// C3DPatternParser::AssertTime -// -// ----------------------------------------------------------------------------- -// -void C3DPatternParser::AssertTime(TInt aIndex, TInt aTime) - { - T3DPatternData d = Position(aIndex); - - if (d.iTime != aTime) - { - Panic(KErrArgument); - } - } - - -// ------------------------------------------------------------------------------- -// C3DPatternParser::StrCopy -// -// String copy with lenght check. -// ------------------------------------------------------------------------------- -// -void C3DPatternParser::StrCopy(TDes& aTarget, const TDesC8& aSource) - { - TInt len = aTarget.MaxLength(); - if(len < aSource.Length()) - { - aTarget.Copy(aSource.Left(len)); - return; - } - aTarget.Copy(aSource); - } - - -// ------------------------------------------------------------------------------- -// C3DPatternParser::StrCopy -// -// String copy with lenght check. -// ------------------------------------------------------------------------------- -// -void C3DPatternParser::StrCopy(TDes& aTarget, const TDesC& aSource) - { - TInt len = aTarget.MaxLength(); - if(len < aSource.Length()) - { - aTarget.Copy(aSource.Left(len)); - return; - } - aTarget.Copy(aSource); - } - - -// ------------------------------------------------------------------------------- -// C3DPatternParser::StrToIntL -// -// ------------------------------------------------------------------------------- -// -TInt C3DPatternParser::StrToIntL(const TDesC& aText) - { - TInt num = KErrNotFound; - - TLex lex(aText); - - User::LeaveIfError( lex.Val(num) ); - return num; - } - -// ----------------------------------------------------------------------------- -// C3DPatternParser::Panic -// -// ----------------------------------------------------------------------------- -// -void C3DPatternParser::Panic(TInt aReason) - { - _LIT(KPanicCategory,"C3DPatternParser"); - - User::Panic(KPanicCategory, aReason); - } - - -// ------------------------------------------------------------------------------- -// C3DPatternParser::GetPatternFileNameL -// -// ------------------------------------------------------------------------------- -// -void C3DPatternParser::GetPatternFileNameL(TDes& aText, TInt aPatternId) - { - _LIT( KFormatString, "%S%S%S%S"); - _LIT( KPatternDir, "3DTones\\" ); - - _LIT( KPatternCircle, "1circular.xml" ); - _LIT( KPatternFlyBy, "2flyby.xml" ); - _LIT( KPatternZigZag, "3zigzag.xml" ); - _LIT( KPatternRandomWalk, "4meander.xml" ); - _LIT( KPatternChaos, "5random.xml" ); - - TBuf pattern; - - switch (aPatternId) - { - case EProfile3DEffectCircle: - { - pattern = KPatternCircle; - break; - } - case EProfile3DEffectFlyby: - { - pattern = KPatternFlyBy; - break; - } - case EProfile3DEffectZigZag: - { - pattern = KPatternZigZag; - break; - } - case EProfile3DEffectRandomWalk: - { - pattern = KPatternRandomWalk; - break; - } - case EProfile3DEffectChaos: - { - pattern = KPatternChaos; - break; - } - default: - { - User::Leave( KErrNotSupported ); - break; - } - } - - TDriveUnit drive(EDriveZ); - TDriveName driveName = drive.Name(); - - aText.Format(KFormatString, &driveName, &KDC_RESOURCE_FILES_DIR, &KPatternDir, &pattern); - } - - -// ------------------------------------------------------------------------------- -// C3DPatternParser::ReadPositionAttributesL -// -// ------------------------------------------------------------------------------- -// -void C3DPatternParser::ReadPositionAttributesL(const Xml::RAttributeArray& aAttributes) - { - TInt count = aAttributes.Count(); - - for (TUint i=0; i buf; TBuf buf2; - - GetPatternName(buf); - GetEchoName(buf2); - FLOG( _L("pattern: '%S' echo: '%S' doppler: %d"), &buf, &buf2, iDopplerUsed); - - FLOG( _L("init position and velocity:") ); - PrintCoordinates(iInitPosition, EFalse); - PrintCoordinates(iInitVelocity, ETrue); - - FLOG( _L("positions and velocities:") ); - - TInt count = PositionCount(); - for (TInt i=0; i