simpleengine/xdmrlspres/src/prescondidentityone.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:05:17 +0200
changeset 0 c8caa15ef882
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2006 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:    RLS and Presence XDM, This class represents 'one' identity part
*                 of a Presence Condition in a rule
*
*/




// Includes
#include <XdmDocumentNode.h>
#include <XdmNodeAttribute.h>
#include <xcapappusagedef.h>
#include <utf.h>

#include "prescondidentityone.h"
#include "cpresencexdm.h"
#include "rlspresxdmlogger.h"
#include "rlspresxdmconstsint.h"


// ---------------------------------------------------------------------------
// TPresCondIdentityOne::TPresCondIdentityOne()
// ---------------------------------------------------------------------------
//	
EXPORT_C TPresCondIdentityOne::TPresCondIdentityOne(): iPresXDM(NULL)
    {
    OPENG_DP(D_OPENG_LIT( "TPresCondIdentityOne::TPresCondIdentityOne()" ));
    }

// ---------------------------------------------------------------------------
// TPresCondIdentityOne::Init()
// ---------------------------------------------------------------------------
//    
EXPORT_C void TPresCondIdentityOne::Init(CPresenceXDM* const aPresXDM)
    {
    OPENG_DP(D_OPENG_LIT( "TPresCondIdentityOne::Init(%d)" ), aPresXDM);
    iPresXDM = aPresXDM;
    }

// ---------------------------------------------------------------------------
// TPresCondIdentityOne::AddIdentitiesL()
// ---------------------------------------------------------------------------
//
EXPORT_C TInt TPresCondIdentityOne::AddIdentitiesL(const TDesC& aRuleID,
                                                const MDesCArray& aIds)
	{
    OPENG_DP(D_OPENG_LIT( "TPresCondIdentityOne::AddIdentitiesL()" ) );
    OPENG_DP(D_OPENG_LIT( "     aRuleID = %S, aIdsCount = %d" ),&aRuleID, 
                                                        aIds.MdcaCount() );
    
    __ASSERT_ALWAYS(iPresXDM, User::Leave(KErrNotReady));                                                    
    
	CXdmDocumentNode* identityNode = iPresXDM->GetConditionChildNodeL(aRuleID, 
	                                                KXdmIdentity, ETrue);
	if(identityNode==NULL)
	    {
	    OPENG_DP(D_OPENG_LIT( "     return: KErrNotFound" ));
	    return KErrNotFound;
	    }
	    
    CXdmDocumentNode* oneNode(NULL);
    CXdmNodeAttribute* idAttr(NULL);
  	RPointerArray<CXdmDocumentNode> nodes;
  	
	// finding 'one' nodes
    TInt err = identityNode->Find(KXdmOne, nodes);
    OPENG_DP(D_OPENG_LIT( "     nodesCount = %d" ),nodes.Count());

    // putting ids to identity node
    TInt entitiesCount = aIds.MdcaCount();
    for(TInt i=0;i<entitiesCount;i++)
        {
        // find whether its already exist
        if(IsIdExistInNodeArray(nodes, aIds.MdcaPoint(i)) )
            continue;    
        oneNode = identityNode->CreateChileNodeL(KXdmOne);
        idAttr = oneNode->CreateAttributeL(KXdmId);
        idAttr->SetAttributeValueL(aIds.MdcaPoint(i));
        }
    
    nodes.Close();
    OPENG_DP(D_OPENG_LIT( "     return: KErrNone" ));    
    return KErrNone;
	}

// ---------------------------------------------------------------------------
// TPresCondIdentityOne::GetIdentitiesL()
// ---------------------------------------------------------------------------
//	
EXPORT_C void TPresCondIdentityOne::GetIdentitiesL(const TDesC& aRuleID, 
                                                    CDesCArray& aIds)
	{
    OPENG_DP(D_OPENG_LIT( "TPresCondIdentityOne::GetIdentitiesL()" ) );
    OPENG_DP(D_OPENG_LIT( "     aRuleID = %S" ),&aRuleID);
    
    __ASSERT_ALWAYS(iPresXDM, User::Leave(KErrNotReady));
    
	CXdmDocumentNode* identityNode = iPresXDM->GetConditionChildNodeL(aRuleID, 
	                                                KXdmIdentity, EFalse);
	if(identityNode==NULL)
	    return;
	
	RPointerArray<CXdmDocumentNode> nodes;
    CXdmNodeAttribute* idAttr(NULL);
	
	// finding 'one' nodes
    TInt err = identityNode->Find(KXdmOne, nodes);
    OPENG_DP(D_OPENG_LIT( "     nodesCount = %d" ),nodes.Count());

    // extracting ids from ones nodes
    TInt idsCountInNode = nodes.Count();
    for (TInt i=0;i<idsCountInNode;i++)
        { // get the id attribute
        idAttr = (nodes[i])->Attribute(KXdmId);
        // push it to given discriptor array
        aIds.AppendL(idAttr->AttributeValue());
        }

    nodes.Close();    
    return;
	}

// ---------------------------------------------------------------------------
// TPresCondIdentityOne::DeleteIdentitiesL()
// ---------------------------------------------------------------------------
//	
EXPORT_C void TPresCondIdentityOne::DeleteIdentitiesL(const TDesC& aRuleID,
                                                    const MDesCArray& aIds)
	{
    OPENG_DP(D_OPENG_LIT( "TPresCondIdentityOne::DeleteIdentitiesL()" ) );
    OPENG_DP(D_OPENG_LIT( "     aRuleID = %S, aIdsCount = %d" ),&aRuleID, 
                                                        aIds.MdcaCount() );
	
    __ASSERT_ALWAYS(iPresXDM, User::Leave(KErrNotReady));                                                    
	
	CXdmDocumentNode* identityNode = iPresXDM->GetConditionChildNodeL(aRuleID, 
	                                                KXdmIdentity, EFalse);
	if(identityNode==NULL)
	    return;
	
	RPointerArray<CXdmDocumentNode> nodes;
    CXdmNodeAttribute* idAttr(NULL);
	
	// finding 'one' nodes
    TInt err = identityNode->Find(KXdmOne, nodes);

    // extracting ids from ones nodes
    TInt idsCountInNode = nodes.Count();
    OPENG_DP(D_OPENG_LIT( "     nodesCount = %d" ),idsCountInNode);

    TInt entitiesCount = aIds.MdcaCount();
    for (TInt i=0;i<idsCountInNode;i++)
        { // get the id attribute
        idAttr = (nodes[i])->Attribute(KXdmId);
        // match it with all given entries
        for (TInt j=0;j<entitiesCount ; j++)
            {
            if ((aIds.MdcaPoint(j))==(idAttr->AttributeValue()))
                {
                OPENG_DP(D_OPENG_LIT( "     RemoveFromModelL i=%d,j=%d" ),i,j);
                iPresXDM->RemoveFromModelL(nodes[i]);
                break;               
                }
            }
        }

    nodes.Close();    
    return;
	}

// ---------------------------------------------------------------------------
// TPresCondIdentityOne::DeleteAllIdentitiesL()
// ---------------------------------------------------------------------------
//
EXPORT_C void TPresCondIdentityOne::DeleteAllIdentitiesL(const TDesC& aRuleID)
	{
    OPENG_DP(D_OPENG_LIT( "TPresCondIdentityOne::DeleteAllIdentitiesL()" ) );
    OPENG_DP(D_OPENG_LIT( "     aRuleID = %S"),&aRuleID);
	
    __ASSERT_ALWAYS(iPresXDM, User::Leave(KErrNotReady));
	
	CXdmDocumentNode* identityNode = iPresXDM->GetConditionChildNodeL(aRuleID, 
	                                                KXdmIdentity, EFalse);
	if(identityNode==NULL)
	    return;
	
	RPointerArray<CXdmDocumentNode> nodes;
	
	// finding 'one' nodes
    TInt err = identityNode->Find(KXdmOne, nodes);
    
    // extracting ids from ones nodes
    TInt idsCountInNode = nodes.Count();
    OPENG_DP(D_OPENG_LIT( "     nodesCount = %d" ),idsCountInNode);
    
    for (TInt i=0;i<idsCountInNode;i++)
        {
        iPresXDM->RemoveFromModelL(nodes[i]);
        }

    nodes.Close();    
    return;
	}

// ---------------------------------------------------------------------------
// TPresCondIdentityOne::AddIdentityL()
// ---------------------------------------------------------------------------
//	
EXPORT_C TInt TPresCondIdentityOne::AddIdentityL(const TDesC& aRuleID, 
                                                        const TDesC& aId)
	{
    OPENG_DP(D_OPENG_LIT( "TPresCondIdentityOne::AddIdentityL()" ) );
    OPENG_DP(D_OPENG_LIT( "     aRuleID = %S, aId = %S"),&aRuleID, &aId);
	
    __ASSERT_ALWAYS(iPresXDM, User::Leave(KErrNotReady));
	
	CXdmDocumentNode* identityNode = iPresXDM->GetConditionChildNodeL(aRuleID, 
	                                                KXdmIdentity, ETrue);
	if(identityNode==NULL)
	    return KErrNotFound;
	
	if(IsIdentityExistL(aRuleID,aId))
	    return KErrAlreadyExists;
	
    CXdmDocumentNode* oneNode(NULL);
    CXdmNodeAttribute* idAttr(NULL);
   
    oneNode = identityNode->CreateChileNodeL(KXdmOne);
    idAttr = oneNode->CreateAttributeL(KXdmId);
    idAttr->SetAttributeValueL(aId);
    
    OPENG_DP(D_OPENG_LIT( "     return: KErrNone"));
    return KErrNone;
	}

// ---------------------------------------------------------------------------
// TPresCondIdentityOne::DeleteIdentityL()
// ---------------------------------------------------------------------------
//	
EXPORT_C TInt TPresCondIdentityOne::DeleteIdentityL(const TDesC& aRuleID, 
                                                        const TDesC& aId)
	{
    OPENG_DP(D_OPENG_LIT( "TPresCondIdentityOne::DeleteIdentityL()" ) );
    OPENG_DP(D_OPENG_LIT( "     aRuleID = %S, aId = %S"),&aRuleID, &aId);
	
    __ASSERT_ALWAYS(iPresXDM, User::Leave(KErrNotReady));
	
	TInt ret(KErrNotFound);
	
	CXdmDocumentNode* identityNode = iPresXDM->GetConditionChildNodeL(aRuleID, 
	                                                KXdmIdentity, EFalse);
	if(identityNode==NULL)
	    return ret;

	RPointerArray<CXdmDocumentNode> nodes;
    CXdmNodeAttribute* idAttr(NULL);
	
	// finding 'one' nodes
    if ( (identityNode->Find(KXdmOne, nodes))==KErrNone)
        {
        // extracting ids from ones nodes
        TInt idsCountInNode = nodes.Count();
        OPENG_DP(D_OPENG_LIT( "     nodesCount = %d" ),idsCountInNode);
       
        for (TInt i=0;i<idsCountInNode;i++)
            { // get the id attribute
            idAttr = (nodes[i])->Attribute(KXdmId);
            if (aId==(idAttr->AttributeValue()))
                {
                OPENG_DP(D_OPENG_LIT( "     RemoveFromModelL: i=%d" ),i);
                iPresXDM->RemoveFromModelL(nodes[i]);
                ret = KErrNone;
                break;               
                }
            }
        }
    nodes.Close();    
    return ret;
	}

// ---------------------------------------------------------------------------
// TPresCondIdentityOne::IsIdentityExistL()
// ---------------------------------------------------------------------------
//	
EXPORT_C TBool TPresCondIdentityOne::IsIdentityExistL(const TDesC& aRuleID, 
                                                    const TDesC& aId)
	{
    OPENG_DP(D_OPENG_LIT( "TPresCondIdentityOne::IsIdentityExist()" ) );
    OPENG_DP(D_OPENG_LIT( "     aRuleID = %S, aId = %S"),&aRuleID, &aId);

    __ASSERT_ALWAYS(iPresXDM, User::Leave(KErrNotReady));

	CXdmDocumentNode* identityNode = iPresXDM->GetConditionChildNodeL(aRuleID, 
	                                                KXdmIdentity, EFalse);
	if(identityNode==NULL)
	    return EFalse;

	RPointerArray<CXdmDocumentNode> nodes;
    CXdmNodeAttribute* idAttr(NULL);
	
	// finding 'one' nodes
    TInt err = identityNode->Find(KXdmOne, nodes);
    
    // extracting ids from ones nodes
    TInt idsCountInNode = nodes.Count();
    OPENG_DP(D_OPENG_LIT( "     nodesCount = %d" ),idsCountInNode);
    
    for (TInt i=0;i<idsCountInNode;i++)
        { // get the id attribute
        idAttr = (nodes[i])->Attribute(KXdmId);
        if (aId==(idAttr->AttributeValue()))
            {
            OPENG_DP(D_OPENG_LIT( "     ETrue"));
            nodes.Close();
            return ETrue;               
            }
        }

    nodes.Close();    
    return EFalse;
	}
	
// ---------------------------------------------------------------------------
// TPresCondIdentityOne::IsIdExistInNodeArray()
// ---------------------------------------------------------------------------
//
TBool TPresCondIdentityOne::IsIdExistInNodeArray(
                        const RPointerArray<CXdmDocumentNode>& nodes, 
                                                    const TDesC& aId)
    {
    OPENG_DP(D_OPENG_LIT( " TPresCondIdentityOne::IsIdExistInNodeArray()" ) );
    OPENG_DP(D_OPENG_LIT( "     IsIdExistInNodeArray aId = %S"), &aId);

    TInt idsCountInNode = nodes.Count();
    CXdmNodeAttribute* idAttr(NULL);
    for (TInt i=0;i<idsCountInNode;i++)
        { // get the id attribute
        idAttr = (nodes[i])->Attribute(KXdmId);
        if (aId==(idAttr->AttributeValue()))
            {
            OPENG_DP(D_OPENG_LIT( "     IsIdExistInNodeArray True"));
            return ETrue;               
            }
        }
    return EFalse;  
    }
    
// end of file