menucontentsrv/srvsrc/mcssuiteparser.cpp
changeset 0 79c6a41cd166
--- /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 <xcfwtree.h>
+#include <gecoobjectbase.h>
+#include <gecodefaultobject.h>
+
+#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<CSuiteObject>& 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<CSuiteObject>& 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<CGECODefaultObject*>( 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;
+	}
+