menucontentsrv/src/menufilter.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 "mcsmenufilter.h"
#include "menuitemattr.h"

#include <s32strm.h>

NONSHARABLE_CLASS( CMenuFilter::TData )
    {

public:     // data

    TUint32 iFlagsOn; ///< These flags should be on.
    TUint32 iFlagsOff; ///< These flags should be off.
    TBuf<KMenuMaxTypeLen> iType; ///< Type filter (empty == filter off).
    RMenuItemAttrArray iAttributes; ///< Attribute filter.

    };

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

// ---------------------------------------------------------
// CMenuFilter::~CMenuFilter
// ---------------------------------------------------------
//
EXPORT_C CMenuFilter::~CMenuFilter()
    {
    if ( iData )
        {
        iData->iAttributes.ResetAndDestroy();
        delete iData;
        }
    }

// ---------------------------------------------------------
// CMenuFilter::NewL
// ---------------------------------------------------------
//
EXPORT_C CMenuFilter* CMenuFilter::NewL()
    {
    CMenuFilter* filter = NewLC();
    CleanupStack::Pop( filter );
    return filter;
    }

// ---------------------------------------------------------
// CMenuFilter::NewLC
// ---------------------------------------------------------
//
EXPORT_C CMenuFilter* CMenuFilter::NewLC()
    {
    CMenuFilter* filter = new (ELeave) CMenuFilter();
    CleanupStack::PushL( filter );
    filter->ConstructL();
    return filter;
    }

// ---------------------------------------------------------
// CMenuFilter::CMenuFilter
// ---------------------------------------------------------
//
CMenuFilter::CMenuFilter()
    {
    }

// ---------------------------------------------------------
// CMenuFilter::ConstructL
// ---------------------------------------------------------
//
void CMenuFilter::ConstructL()
    {
    iData = new (ELeave) CMenuFilter::TData();
    Reset();
    }

// ---------------------------------------------------------
// CMenuFilter::FlagsOn
// ---------------------------------------------------------
//
EXPORT_C TUint32 CMenuFilter::FlagsOn() const
    {
    return iData->iFlagsOn;
    }

// ---------------------------------------------------------
// CMenuFilter::FlagsOff
// ---------------------------------------------------------
//
EXPORT_C TUint32 CMenuFilter::FlagsOff() const
    {
    return iData->iFlagsOff;
    }

// ---------------------------------------------------------
// CMenuFilter::Type
// ---------------------------------------------------------
//
EXPORT_C TPtrC CMenuFilter::Type() const
    {
    return iData->iType;
    }

// ---------------------------------------------------------
// CMenuFilter::NumAttributes
// ---------------------------------------------------------
//
EXPORT_C TInt CMenuFilter::NumAttributes() const
    {
    return iData->iAttributes.Count();
    }

// ---------------------------------------------------------
// CMenuFilter::GetAttribute
// ---------------------------------------------------------
//
EXPORT_C TBool CMenuFilter::GetAttribute
( TInt aIndex, TPtrC& aAttrName, TPtrC& aAttrValue ) const
    {
    CMenuItemAttr* attr = iData->iAttributes[aIndex];
    aAttrName.Set( attr->Name() );
    if ( attr->Value() )
        {
        aAttrValue.Set( *attr->Value() );
        return ETrue;
        }
    return EFalse;
    }

// ---------------------------------------------------------
// CMenuFilter::Reset
// ---------------------------------------------------------
//
EXPORT_C void CMenuFilter::Reset()
    {
    iData->iType = KNullDesC();
    iData->iAttributes.ResetAndDestroy();
    iData->iFlagsOn = 0;
    iData->iFlagsOff = 0;
    }

// ---------------------------------------------------------
// CMenuFilter::SetFlags
// ---------------------------------------------------------
//
EXPORT_C void CMenuFilter::SetFlags( TUint32 aFlagsOn, TUint32 aFlagsOff )
    {
    iData->iFlagsOn = aFlagsOn;
    iData->iFlagsOff = aFlagsOff;
    }

// ---------------------------------------------------------
// CMenuFilter::SetType
// ---------------------------------------------------------
//
EXPORT_C void CMenuFilter::SetType( const TDesC& aType )
    {
    iData->iType = aType;
    }

// ---------------------------------------------------------
// CMenuFilter::HaveAttributeL
// ---------------------------------------------------------
//
EXPORT_C void CMenuFilter::HaveAttributeL
( const TDesC& aAttrName, const TDesC& aAttrValue )
    {
    CMenuItemAttr* attr = NULL;
    TInt i = iData->iAttributes.Find( aAttrName );
    if ( KErrNotFound == i )
        {
        attr = CMenuItemAttr::NewLC( aAttrName );
        iData->iAttributes.AppendL( attr );
        CleanupStack::Pop( attr ); // Now owned by iAttributes.
        }
    else
        {
        attr = iData->iAttributes[i];
        }
    __ASSERT_DEBUG( attr, User::Invariant() );
    attr->SetValue( aAttrValue.AllocL() );
    }

// ---------------------------------------------------------
// CMenuFilter::DoNotHaveAttributeL
// ---------------------------------------------------------
//
EXPORT_C void CMenuFilter::DoNotHaveAttributeL( const TDesC& aAttrName )
    {
    CMenuItemAttr* attr = NULL;
    TInt i = iData->iAttributes.Find( aAttrName );
    if ( KErrNotFound == i )
        {
        attr = CMenuItemAttr::NewLC( aAttrName );
        iData->iAttributes.AppendL( attr );
        CleanupStack::Pop( attr ); // Now owned by iAttributes.
        }
    else
        {
        attr = iData->iAttributes[i];
        }
    __ASSERT_DEBUG( attr, User::Invariant() );
    attr->SetValue( NULL );
    }

// ---------------------------------------------------------
// CMenuFilter::RemoveAttribute
// ---------------------------------------------------------
//
EXPORT_C void CMenuFilter::RemoveAttribute( const TDesC& aAttrName )
    {
    TInt i = iData->iAttributes.Find( aAttrName );
    if ( KErrNotFound != i )
        {
        delete iData->iAttributes[i];
        iData->iAttributes.Remove( i );
        }
    }

// ---------------------------------------------------------
// CMenuFilter::ExternalizeL
// ---------------------------------------------------------
//
void CMenuFilter::ExternalizeL( RWriteStream& aStream ) const
    {
    aStream.WriteUint32L( iData->iFlagsOn );
    aStream.WriteUint32L( iData->iFlagsOff );
    aStream.WriteInt32L( iData->iType.Length() );
    aStream.WriteL( iData->iType );
    iData->iAttributes.ExternalizeL( aStream );
    }

// ---------------------------------------------------------
// CMenuFilter::InternalizeL
// ---------------------------------------------------------
//
void CMenuFilter::InternalizeL( RReadStream& aStream )
    {
    iData->iFlagsOn = aStream.ReadUint32L();
    iData->iFlagsOff = aStream.ReadUint32L();
    TInt len = aStream.ReadInt32L();
    aStream.ReadL( iData->iType, len );
    iData->iAttributes.ResetAndDestroy();
    iData->iAttributes.InternalizeL( aStream );
    }