menucontentsrv/engsrc/menuengobjectfactory.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:54:17 +0200
changeset 0 79c6a41cd166
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2009 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 "menuengobjectfactory.h"
#include "menuengobject.h"
#include "menuengflags.h"

// ================= MEMBER FUNCTIONS =======================

// ---------------------------------------------------------
// CMenuEngObjectFactory::~CMenuEngObjectFactory
// ---------------------------------------------------------
//
CMenuEngObjectFactory::~CMenuEngObjectFactory()
    {
    }

// ---------------------------------------------------------
// CMenuEngObjectFactory::NewL
// ---------------------------------------------------------
//
CMenuEngObjectFactory* CMenuEngObjectFactory::NewL( CMenuEng& aEng )
    {
    CMenuEngObjectFactory* factory =
        new (ELeave) CMenuEngObjectFactory( aEng );
    return factory;
    }

// ---------------------------------------------------------
// CMenuEngObjectFactory::CMenuEngObjectFactory
// ---------------------------------------------------------
//
CMenuEngObjectFactory::CMenuEngObjectFactory( CMenuEng& aEng )
: iEng( aEng )
    {
    }

// ---------------------------------------------------------
// CMenuEngObjectFactory::GetContentObjectAndSetContextL
// ---------------------------------------------------------
//
CGECOObjectBase* CMenuEngObjectFactory::GetContentObjectAndSetContextL
( const TDesC& aTypeIdentifier )
    {
    // Notes:
    // Here we create an object for all nodes, even for the ones we don't know.
    // (We can't check the type because of extensibility).
    // This is a problem, as not all XML nodes are part of the menu structure,
    // for example the "appshell:data" is not.
    //
    // Is it a solution to use an *exclusion* list of types here??
    CMenuEngObject* object = CMenuEngObject::NewL( iEng, aTypeIdentifier );
    SetContext( object );
    return object;
    }

// ---------------------------------------------------------
// CMenuEngObjectFactory::InitializeObjectL
// ---------------------------------------------------------
//
void CMenuEngObjectFactory::InitializeObjectL
( MGECOAttributeProvider& aAttributeProvider )
    {
    if ( iContext )
        {
        CMenuEngObject* context = (CMenuEngObject*)iContext;
        TPtrC name;
        TPtrC value;
        TBool localized;
        context->Reset();
        const TInt count = aAttributeProvider.NumAttributes();
        for ( TInt i = 0; i < count; i++ )
            {
            aAttributeProvider.AttributeDetailsL( i, name, value, localized );
            if ( KMenuAttrId() == name )
                {
                // "id" -> internal attribute, convert to integer.
                context->SetId( MenuEngId::AsInt( value ) );
                }
            else if ( KMenuAttrFlags() == name )
                {
                // "flags" -> internal attribute, convert to integer.
                context->SetFlags( MenuEngFlags::AsInt( value ), ETrue );
                CGECODefaultObject* defaultContext = (CGECODefaultObject*)context;
                defaultContext->RemoveAttribute(KMenuAttrFlags);
                }
            else
                {
                // Other attributes stored normally, in the object.
                context->SetInitialAttributeL( name, value, localized );
                }
            }
        }
    }

// ---------------------------------------------------------
// CMenuEngObjectFactory::SetContext
// ---------------------------------------------------------
//
TInt CMenuEngObjectFactory::SetContext( CGECOObjectBase* aContext )
    {
    iContext = aContext;
    return KErrNone;
    }

// ---------------------------------------------------------
// CMenuEngObjectFactory::NumAttributes
// ---------------------------------------------------------
//
TInt CMenuEngObjectFactory::NumAttributes()
    {
    TInt count = 0;
    if ( iContext )
        {
        count = 1; // We always have the ID.
        CMenuEngObject* context = (CMenuEngObject*)iContext;
        count += context->NumAttributes();
        if ( context->Flags( ETrue ) )
            {
            // Flags, if any, are written to XML as an attribute
            // named "flags".
            // The object cannot have an attribute with that name.
            count++;
            }
        }
    return count;
    }

// ---------------------------------------------------------
// CMenuEngObjectFactory::AttributeDetailsL
// ---------------------------------------------------------
//
void CMenuEngObjectFactory::AttributeDetailsL(
    const TInt aIndex,
    TPtrC& aAttrName, 
    TPtrC& aAttrValue,
    TBool& aIsLocalized )
    {
    if ( iContext )
        {
        CMenuEngObject* context = (CMenuEngObject*)iContext;
        if ( aIndex < context->NumAttributes() )
            {
            // External attributes retrieved normally, from the object.
            (void)context->GetAttribute
                ( aIndex, aAttrName, aAttrValue, aIsLocalized );
            }
        else if ( aIndex == context->NumAttributes() )
            {
            // "id" -> internal attribute, convert to string.
            MenuEngId::AsString( context->Id(), iBuf );
            aAttrName.Set( KMenuAttrId() );
            aAttrValue.Set( iBuf );
            aIsLocalized = EFalse;
            }
        else
            {
            // "flags" -> internal attribute, convert to string.
            __ASSERT_DEBUG( context->Flags( ETrue ), User::Invariant() );
            MenuEngFlags::AsString( context->Flags( ETrue ), iBuf );
            aAttrName.Set( KMenuAttrFlags() );
            aAttrValue.Set( iBuf );
            aIsLocalized = EFalse;
            }
        }
    }

// ---------------------------------------------------------
// CMenuEngObjectFactory::AttributeDetailsL
// ---------------------------------------------------------
//
void CMenuEngObjectFactory::AttributeDetailsL(
    const TInt aIndex,
    TPtrC& aAttrName, 
    TPtrC& aAttrValue )
    {
    CGECODefaultObjectFactory::AttributeDetailsL( aIndex, aAttrName, aAttrValue);
    }

// ---------------------------------------------------------
// CMenuEngObjectFactory::HasTextData
// ---------------------------------------------------------
//
TBool CMenuEngObjectFactory::HasTextData()
    {
    return EFalse;
    }

// ---------------------------------------------------------
// CMenuEngObjectFactory::TextDetailsL
// ---------------------------------------------------------
//
void CMenuEngObjectFactory::TextDetailsL
( TPtrC& /*aText*/, TBool& /*aIsLocalized*/ )
    {
    }

//  End of File