diff -r 000000000000 -r 79c6a41cd166 menucontentsrv/srvsrc/mcssuiteparser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/menucontentsrv/srvsrc/mcssuiteparser.cpp Thu Dec 17 08:54:17 2009 +0200 @@ -0,0 +1,200 @@ +/* +* Copyright (c) 2008 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 FILES +#include +#include +#include + +#include "mcssuiteparser.h" +#include "mcssuiteobject.h" +#include "mcsdef.h" +#include "mcssuiteobjectfactory.h" + + +// --------------------------------------------------------- +// CSuiteObject::CSuiteParser +// --------------------------------------------------------- +// +CSuiteParser::CSuiteParser() + { + // No implementation required + } + +// --------------------------------------------------------- +// CSuiteObject::~CSuiteParser +// --------------------------------------------------------- +// +CSuiteParser::~CSuiteParser() + { + iFileName.Close(); + delete iContentEngine; + delete iObjectFactory; + delete iActiveScheduler; + delete iContentTree; + } + +// --------------------------------------------------------- +// CSuiteObject::NewLC +// --------------------------------------------------------- +// +CSuiteParser* CSuiteParser::NewLC( const TDesC& aFileName ) + { + CSuiteParser* self = new (ELeave) CSuiteParser(); + CleanupStack::PushL(self); + self->ConstructL( aFileName ); + return self; + } + +// --------------------------------------------------------- +// CSuiteObject::NewL +// --------------------------------------------------------- +// +CSuiteParser* CSuiteParser::NewL( const TDesC& aFileName ) + { + CSuiteParser* self = CSuiteParser::NewLC( aFileName ); + CleanupStack::Pop( self ); // self; + return self; + } + +// --------------------------------------------------------- +// CSuiteObject::ConstructL +// --------------------------------------------------------- +// +void CSuiteParser::ConstructL( const TDesC& aFileName ) + { + iFileName.CreateL( aFileName ); + iActiveScheduler = new ( ELeave ) CActiveSchedulerWait(); + iObjectFactory = CSuiteObjectFactory::NewL(); + iContentEngine = CXCFWEngine::NewL( this ); + iContentEngine->RegisterObjectFactoryL( iObjectFactory ); + } + +// ----------------------------------------------------------------------------- +// CSuiteParser::GetSuitsArrayL +// ----------------------------------------------------------------------------- +// +TInt CSuiteParser::GetSuitsArrayL( RPointerArray& aSuitesArray ) + { + TInt err; + iContentTree = CXCFWTree::NewL( ); + iContentEngine->LoadL( *iContentTree, iFileName ); + + iActiveScheduler->Start( ); + + if ( iCompletionStatus == 0 /*TSuiteParsingStatus::ECompleted*/ ) + { + //this trap ensures stoping the ActiveSheduler + //in case a leave occurs when updating data + TRAP( err, HandleEntriesL( aSuitesArray ) ); + } + + delete iContentTree; + iContentTree = NULL; + return err; + } + +// --------------------------------------------------------- +// CSuiteObject::HandleEngineEventL +// --------------------------------------------------------- +// +void CSuiteParser::HandleEngineEventL( TXCFWEngineEvent aEvent ) + { + // handle completion + if ( aEvent == EEvtParsingComplete ) + { + TSuiteParsingStatus status = ECompleted; + HandleCompletionL( status ); + } + // else => ignore + } + +// --------------------------------------------------------- +// CSuiteObject::HandleEngineErrorL +// --------------------------------------------------------- +// +void CSuiteParser::HandleEngineErrorL( TInt /*aErrorCode*/) + { + HandleCompletionL( EFailed ); + } + +// --------------------------------------------------------- +// CSuiteObject::HandleCompletionL +// --------------------------------------------------------- +// +void CSuiteParser::HandleCompletionL( + TSuiteParsingStatus aStatus ) + { + iCompletionStatus = aStatus; + iActiveScheduler->AsyncStop( ); + } + + +// --------------------------------------------------------- +// CSuiteObject::HandleEntriesL +// --------------------------------------------------------- +// +void CSuiteParser::HandleEntriesL( RPointerArray& aSuitesArray ) + { + MXCFWNode* root = iContentTree->Root( ); + // get children + RNodeArray suites; + CleanupClosePushL( suites ); + iContentTree->GetChildNodesL( root, suites ); + for ( TInt i = 0; i < suites.Count( ); i++ ) + { + CSuiteObject* suite = CreateSuiteLC( suites[i] ); + aSuitesArray.AppendL( suite ); + CleanupStack::Pop( suite ); + } + + // clean up + CleanupStack::PopAndDestroy( &suites ); + } + +// --------------------------------------------------------- +// CSuiteObject::CreateSuiteLC +// --------------------------------------------------------- +// +CSuiteObject* CSuiteParser::CreateSuiteLC( MXCFWNode* aNode ) + { + TInt lastBackSlash = iFileName.Length() - + iFileName.LocateReverseF( KBackSlashSuite ) - 1; + CSuiteObject* suite = + CSuiteObject::NewLC( iFileName.Right( lastBackSlash ) ); + + CGECODefaultObject* node= + static_cast( aNode->Data() ); + + TPtrC name; + TPtrC value; + TInt attrCount = node->NumAttributes(); + TBool isLocalized = EFalse; + + for( TInt i = 0; i < attrCount; i++ ) + { + node->AttributeDetailsL( i, name, value, isLocalized ); + if( name == KMenuAttSuiteName() ) + { + suite->SetSuiteNameL( value ); + } + suite->SetInitialAttributeL( name, value, isLocalized ); + } + + return suite; + } +