simpledatamodeladapter/src/presencepluginxdmpresrules.cpp
changeset 26 04ca1926b01c
parent 20 76bddcd072ba
child 28 d9861ae9169c
child 32 32463a6c57b3
equal deleted inserted replaced
20:76bddcd072ba 26:04ca1926b01c
     1 /*
       
     2 * Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  IETF SIMPLE Protocol implementation for XIMP Framework
       
    15 *
       
    16 */
       
    17 
       
    18 #include <xdmengine.h>
       
    19 #include <xdmprotocolinfo.h>
       
    20 #include <xdmdocument.h>
       
    21 #include <xdmdocumentnode.h>
       
    22 #include <xdmnodeattribute.h>
       
    23 #include <xdmerrors.h>
       
    24 #include <XdmProtocolUidList.h>
       
    25 
       
    26 #include "presencepluginxdmpresrules.h"
       
    27 #include "mpresrulesasynchandler.h"
       
    28 
       
    29 
       
    30 // ======== MEMBER FUNCTIONS ========
       
    31 
       
    32 // ---------------------------------------------------------------------------
       
    33 // CPresencePluginXdmPresRules::NewLC()
       
    34 // ---------------------------------------------------------------------------
       
    35 //
       
    36 CPresencePluginXdmPresRules* CPresencePluginXdmPresRules::NewLC( 
       
    37 	const TInt aSettingId, TBool aLocalMode )
       
    38     {
       
    39     CPresencePluginXdmPresRules* self =
       
    40     	new (ELeave) CPresencePluginXdmPresRules( aSettingId );
       
    41     CleanupStack::PushL( self );
       
    42     self->ConstructL( aSettingId, aLocalMode );
       
    43     return self;
       
    44     }
       
    45 
       
    46 // ---------------------------------------------------------------------------
       
    47 // CPresencePluginXdmPresRules::NewL()
       
    48 // ---------------------------------------------------------------------------
       
    49 //
       
    50 CPresencePluginXdmPresRules* CPresencePluginXdmPresRules::NewL(
       
    51     const TInt aXmdId, TBool aLocalMode )
       
    52     {
       
    53     CPresencePluginXdmPresRules* self =
       
    54         new( ELeave ) CPresencePluginXdmPresRules( aXmdId );
       
    55     CleanupStack::PushL( self );
       
    56     self->ConstructL( aXmdId, aLocalMode  );
       
    57     CleanupStack::Pop( self );
       
    58     return self;
       
    59     }
       
    60 
       
    61 // ---------------------------------------------------------------------------
       
    62 // CPresencePluginXdmPresRules::CPresencePluginXdmPresRules()
       
    63 // ---------------------------------------------------------------------------
       
    64 //
       
    65 CPresencePluginXdmPresRules::CPresencePluginXdmPresRules( const TInt aXdmId )
       
    66     :CActive( EPriorityStandard ),
       
    67     iSettingsId( aXdmId ),
       
    68     iXdmState( EStateIdle ), //Listeting xdState
       
    69     iRulesUpdateState(EStateNoOperation),
       
    70 	iPresXdmOk( EFalse ),
       
    71 	iAsyncReq( ENoOperation )
       
    72     {
       
    73     CActiveScheduler::Add( this );
       
    74     }
       
    75 
       
    76 // ---------------------------------------------------------------------------
       
    77 // CPresencePluginXdmPresRules::ConstructL()
       
    78 // ---------------------------------------------------------------------------
       
    79 //
       
    80 void CPresencePluginXdmPresRules::ConstructL( 
       
    81 	const TInt aXmdId,
       
    82 	TBool aLocalMode )
       
    83     {
       
    84     DP_SDA2("CPresencePluginXdmPresRules::ConstructL - aXdmId: %d", aXmdId );
       
    85     using namespace NPresencePlugin::NPresence;
       
    86     if ( !aLocalMode )
       
    87         {
       
    88         DP_SDA("CPresencePluginXdmPresRules::ConstructL Normal Mode");
       
    89         CXdmProtocolInfo* xdmProtocolInfo = CXdmProtocolInfo::NewL( aXmdId );
       
    90         CleanupStack::PushL( xdmProtocolInfo );
       
    91         DP_SDA("CPresencePluginXdmPresRules::ConstructL - protocol info created");
       
    92         xdmProtocolInfo->SetCacheUsage( EFalse );
       
    93         DP_SDA("CPresencePluginXdmPresRules::ConstructL - create xdm engine");
       
    94         iXdmEngine = CXdmEngine::NewL( *xdmProtocolInfo );
       
    95         CleanupStack::PopAndDestroy( xdmProtocolInfo );
       
    96         DP_SDA("CPresencePluginXdmPresRules::ConstructL - xdm engine created");
       
    97         
       
    98         DP_SDA("CPresencePluginXdmPresRules::ConstructL - create doc model");
       
    99 		//Create empty document model
       
   100 		iPresRulesDoc =
       
   101             iXdmEngine->CreateDocumentModelL( 
       
   102                 KPresencePresRules, EXdmOmaPresenceRules );
       
   103         DP_SDA("CPresencePluginXdmPresRules::ConstructL - create doc model ok");        
       
   104         }
       
   105     else
       
   106         {
       
   107         DP_SDA("CPresencePluginXdmPresRules::ConstructL LocalMode Mode");
       
   108         //Lets Try localmode 
       
   109         CXdmProtocolInfo* xdmProtocolInfo =
       
   110             CXdmProtocolInfo::NewL( 0, KLocalProtocol, KNullDesC );
       
   111         CleanupStack::PushL( xdmProtocolInfo );
       
   112         iXdmEngine = CXdmEngine::NewL( *xdmProtocolInfo );
       
   113         CleanupStack::PopAndDestroy( xdmProtocolInfo );
       
   114 
       
   115 				//Create empty document model
       
   116 		iPresRulesDoc =
       
   117             iXdmEngine->CreateDocumentModelL( 
       
   118                 KPresencePresRules, EXdmOmaPresenceRules );
       
   119         }
       
   120     DP_SDA("CPresencePluginXdmPresRules::ConstructL create root");
       
   121 	CreateRootIfNeededL();
       
   122 	DP_SDA("CPresencePluginXdmPresRules::ConstructL - out" );
       
   123     }
       
   124 
       
   125 // ---------------------------------------------------------------------------
       
   126 // CPresencePluginXdmPresRules::~CPresencePluginXdmPresRules()
       
   127 // ---------------------------------------------------------------------------
       
   128 //
       
   129 CPresencePluginXdmPresRules::~CPresencePluginXdmPresRules()
       
   130     {
       
   131 	DP_SDA("CPresencePluginXdmPresRules::~CPresencePluginXdmPresRules");
       
   132     
       
   133     if ( iPresRulesDoc )
       
   134         {
       
   135         DP_SDA("CPresencePluginXdmPresRules::~CPresencePluginXdmPresRules 2");
       
   136         if ( iXdmEngine )
       
   137             {
       
   138             DP_SDA("CPresencePluginXdmPresRules::~CPresencePluginXdmPresRules 3");
       
   139             TRAP_IGNORE( iXdmEngine->DeleteDocumentModelL( iPresRulesDoc ));
       
   140             }
       
   141         }
       
   142        
       
   143     delete iXdmEngine;  
       
   144     delete iEntityUri;
       
   145 
       
   146     DP_SDA("CPresencePluginXdmPresRules::~CPresencePluginXdmPresRules Done");
       
   147     }
       
   148     
       
   149 // ---------------------------------------------------------------------------
       
   150 // CPresencePluginXdmPresRules::GetXdmRulesL()
       
   151 // ---------------------------------------------------------------------------
       
   152 //    
       
   153 TInt CPresencePluginXdmPresRules::GetXdmRulesL( 
       
   154     MPresRulesAsyncHandler* const aHandler )
       
   155     {
       
   156     DP_SDA("CPresencePluginXdmPresRules::GetXdmRulesL");
       
   157 	__ASSERT_ALWAYS(aHandler, User::Leave(KErrArgument));
       
   158 	if (IsActive())
       
   159         return KErrAlreadyExists;
       
   160 	iAsyncReq = EXdmGetRulesFromServer;
       
   161 	iAsyncHandler = aHandler;
       
   162 	using namespace NPresencePlugin::NPresence;
       
   163 	
       
   164     if ( !iPresXdmOk )
       
   165         {
       
   166         DP_SDA("CPresencePluginXdmPresRules::GetXdmRulesL !iPresXdmOk");
       
   167 
       
   168                 
       
   169         iPresRulesDoc->FetchDataL();
       
   170         DP_SDA("CPresencePluginXdmPresRules::GetXdmRulesL !iPresXdmOk end");
       
   171         }
       
   172     else
       
   173         {
       
   174         // Document already exists, no need to search from a server
       
   175         DP_SDA("CPresencePluginXdmPresRules::GetXdmRulesL Already exists");
       
   176         iStatus = KRequestPending;
       
   177         SetActive();        
       
   178         }
       
   179   	return KErrNone;
       
   180     }
       
   181 
       
   182 // ---------------------------------------------------------------------------
       
   183 // CPresencePluginXdmPresRules::UpdateXdmRulesL()
       
   184 // ---------------------------------------------------------------------------
       
   185 //     
       
   186 TInt CPresencePluginXdmPresRules::UpdateXdmRulesL( 
       
   187 	MPresRulesAsyncHandler* const aHandler )
       
   188     {
       
   189     __ASSERT_ALWAYS(aHandler, User::Leave(KErrArgument));
       
   190     if (IsActive())
       
   191 		{
       
   192 		return KErrAlreadyExists;
       
   193 		}
       
   194 	iAsyncReq = EXdmUpdateRules;
       
   195     iAsyncHandler = aHandler;
       
   196     
       
   197     iPresRulesDoc->AppendL();
       
   198     iXdmEngine->UpdateL(iPresRulesDoc, iStatus);
       
   199     SetActive();
       
   200     return KErrNone;
       
   201     }
       
   202 
       
   203 // ---------------------------------------------------------------------------
       
   204 // CPresencePluginXdmPresRules::MakeInitialRulesDocumentL()
       
   205 // ---------------------------------------------------------------------------
       
   206 //    
       
   207 void CPresencePluginXdmPresRules::MakeInitialRulesDocumentL( 
       
   208     MPresRulesAsyncHandler* const aHandler )
       
   209     {
       
   210     DP_SDA("CPresencePluginXdmPresRules::MakeInitialXdmsDocumentL");
       
   211    	__ASSERT_ALWAYS(aHandler, User::Leave(KErrArgument));
       
   212 	iAsyncReq = EXdmInitialPresDoc;
       
   213 	iAsyncHandler = aHandler;
       
   214 	
       
   215 	CXdmDocumentNode* root = iPresRulesDoc->DocumentRoot();
       
   216 	if ( !root )
       
   217 	    {
       
   218 	    DP_SDA("CPresencePluginXdmPresRules:: Create root");
       
   219 	    root = iPresRulesDoc->CreateRootL();
       
   220 	    }
       
   221    
       
   222     using namespace NPresencePlugin::NPresence;
       
   223     root->SetNameL( KPresenceRuleset );
       
   224 
       
   225     // send to the server and start wait a response
       
   226     iPresRulesDoc->AppendL( root );
       
   227     DP_SDA("CPresencePluginXdmPresRules::MakeInitialXdmsDocumentL append");
       
   228     iAsyncReq = EXdmInitialPresDoc;
       
   229     DP_SDA("CPresencePluginXdmPresRules::MakeInitialXdmsDocumentL end");
       
   230     }
       
   231 
       
   232 // ---------------------------------------------------------------------------
       
   233 // CPresencePluginXdmPresRules::AddWhiteListL()
       
   234 // ---------------------------------------------------------------------------
       
   235 //
       
   236 void CPresencePluginXdmPresRules::AddWhiteListL( CXdmDocumentNode* aRoot )
       
   237     {
       
   238     DP_SDA("CPresencePluginXdmPresRules::AddWhiteList");
       
   239     using namespace NPresencePlugin::NPresence;
       
   240     using namespace NPresencePlugin::NPresenceTransformations;
       
   241     
       
   242     if ( aRoot->IsEmptyNode() )
       
   243         {
       
   244         DP_SDA("AddWhiteList is empty node");
       
   245         aRoot->SetEmptyNode( EFalse );
       
   246         }
       
   247     // whitelist
       
   248     CXdmDocumentNode* child2 = aRoot->CreateChileNodeL( KPresenceRule );
       
   249     CleanupStack::PushL( child2 );
       
   250     CXdmNodeAttribute* name2 = child2->CreateAttributeL( KPresenceId );
       
   251     CleanupStack::PushL( name2 );
       
   252     name2->SetAttributeValueL( KPresenceXdmWhiteList );
       
   253     DP_SDA("CPresencePluginXdmPresRules::AddWhiteList 2");
       
   254     
       
   255     CXdmDocumentNode* conditionsNode2 =
       
   256         child2->CreateChileNodeL( KPresenceConditions );
       
   257 
       
   258     conditionsNode2->CreateChileNodeL( KPresenceIdentity ); 
       
   259     CXdmDocumentNode* actionNode2 =
       
   260         child2->CreateChileNodeL( KPresenceAction );
       
   261         
       
   262     DP_SDA("CPresencePluginXdmPresRules::AddWhiteList 3"); 
       
   263     CXdmDocumentNode* subNode2 = actionNode2->CreateChileNodeL( KPresenceSub );
       
   264     DP_SDA("CPresencePluginXdmPresRules::MakeInitialXdmsDocumentL 4");
       
   265     
       
   266     subNode2->SetLeafNode( ETrue ); 
       
   267     subNode2->SetLeafNodeContentL( KPresenceAllow8 );
       
   268     DP_SDA("CPresencePluginXdmPresRules::AddWhiteList 5"); 
       
   269     
       
   270     //Add transformations
       
   271     /*<transformations>
       
   272     <pr:provide-services>
       
   273     <pr:all-services/>
       
   274     </pr:provide-services>
       
   275     
       
   276     <pr:provide-persons>
       
   277     <pr:all-persons/>
       
   278     </pr:provide-persons>
       
   279     
       
   280     <pr:provide-devices>
       
   281     <pr:all-devices/>
       
   282     </pr:provide-devices>
       
   283     
       
   284     <pr:provide-all-attributes/>
       
   285     </transformations>*/
       
   286 
       
   287     CXdmDocumentNode* trasform2 =
       
   288         child2->CreateChileNodeL( KPresenceTrasformations );
       
   289     CXdmDocumentNode* services2 =
       
   290         trasform2->CreateChileNodeL( KPresenceProvideServices );
       
   291     services2->CreateChileNodeL( KPresenceAllServices );
       
   292     CXdmDocumentNode* person2 =
       
   293         trasform2->CreateChileNodeL( KPresenceProvidePersons );
       
   294     person2->CreateChileNodeL( KPresenceAllPersons );
       
   295     CXdmDocumentNode* devices2 =
       
   296         trasform2->CreateChileNodeL( KPresenceProvidedevices );
       
   297     devices2->CreateChileNodeL( KPresenceAlldevices );
       
   298     trasform2->CreateChileNodeL( KPresenceProvideAllAttributes );
       
   299     
       
   300     CleanupStack::Pop( name2 );
       
   301     CleanupStack::Pop( child2 );
       
   302     }
       
   303     
       
   304 // ---------------------------------------------------------------------------
       
   305 // CPresencePluginXdmPresRules::AddBlackList()
       
   306 // ---------------------------------------------------------------------------
       
   307 //
       
   308 void CPresencePluginXdmPresRules::AddBlackListL( CXdmDocumentNode* aRoot )
       
   309     {
       
   310     DP_SDA("CPresencePluginXdmPresRules::AddBlackList");
       
   311     // add all the list nodes
       
   312     // buddylist
       
   313     using namespace NPresencePlugin::NPresence;
       
   314     using namespace NPresencePlugin::NPresenceTransformations;
       
   315     if ( aRoot->IsEmptyNode() )
       
   316         {
       
   317         DP_SDA("AddBlackList is empty node");
       
   318         aRoot->SetEmptyNode( EFalse );
       
   319         }
       
   320     CXdmDocumentNode* child1 = aRoot->CreateChileNodeL( KPresenceRule );
       
   321     CleanupStack::PushL( child1 );
       
   322     CXdmNodeAttribute* name = child1->CreateAttributeL( KPresenceId );
       
   323     CleanupStack::PushL( name );
       
   324     
       
   325     name->SetAttributeValueL( KPresenceXdmBlockRule );
       
   326     // add condition
       
   327     CXdmDocumentNode* conditionsNode =
       
   328         child1->CreateChileNodeL( KPresenceConditions );
       
   329     conditionsNode->CreateChileNodeL( KPresenceIdentity );
       
   330     
       
   331     CXdmDocumentNode* actionNode =
       
   332         child1->CreateChileNodeL( KPresenceAction );
       
   333         
       
   334     DP_SDA("CPresencePluginXdmPresRules::AddBlackList 1");
       
   335     CXdmDocumentNode* subNode =
       
   336         actionNode->CreateChileNodeL( KPresenceSub );
       
   337     DP_SDA("CPresencePluginXdmPresRules::MakeInitialXdmsDocumentL 1/2");
       
   338     subNode->SetLeafNode(ETrue);
       
   339     subNode->SetLeafNodeContentL( KPresenceBlock8 ); 
       
   340     DP_SDA("CPresencePluginXdmPresRules::AddBlackList 1/3");
       
   341     
       
   342     CXdmDocumentNode* trasform =
       
   343         child1->CreateChileNodeL( KPresenceTrasformations );
       
   344     CXdmDocumentNode* services =
       
   345         trasform->CreateChileNodeL( KPresenceProvideServices );
       
   346     services->CreateChileNodeL( KPresenceAllServices );
       
   347       
       
   348     CXdmDocumentNode* person =
       
   349         trasform->CreateChileNodeL( KPresenceProvidePersons );
       
   350     person->CreateChileNodeL( KPresenceAllPersons );
       
   351     CXdmDocumentNode* devices =
       
   352         trasform->CreateChileNodeL( KPresenceProvidedevices );
       
   353     devices->CreateChileNodeL( KPresenceAlldevices );
       
   354     trasform->CreateChileNodeL( KPresenceProvideAllAttributes );     
       
   355     CleanupStack::Pop( name );
       
   356     CleanupStack::Pop( child1 );
       
   357     }
       
   358 
       
   359 // ---------------------------------------------------------------------------
       
   360 // CPresencePluginXdmPresRules::RunL()
       
   361 // ---------------------------------------------------------------------------
       
   362 //
       
   363 void CPresencePluginXdmPresRules::RunL( )
       
   364     {    
       
   365     DP_SDA("CPresencePluginXdmPresRules::RunL");    
       
   366     TPluginPresRulesXdmOperation origState = iAsyncReq;
       
   367     iAsyncReq = ENoOperation;
       
   368     TInt myStatus = iStatus.Int();
       
   369      
       
   370     DP_SDA2("CPresencePluginXdmPresRules::RunL mystatus %d ", myStatus);
       
   371     DP_SDA2("CPresencePluginXdmPresRules::RunL state %d ", origState);
       
   372     
       
   373     switch( origState )
       
   374         {
       
   375         case EXdmGetRulesFromServer:
       
   376             {
       
   377             DP_SDA("CPresencePluginXdmPresRules::RunL EXdmGetRulesFromServer");
       
   378             iAsyncHandler->HandlePresUpdateDocumentL( 
       
   379                 iStatus.Int() );
       
   380             }     
       
   381         break;
       
   382         case EXdmInitialPresDoc:
       
   383             {
       
   384             DP_SDA("CPresencePluginXdmPresRules::RunL EXdmInitialPresDoc");
       
   385             iAsyncHandler->HandlePresUpdateDocumentL( 
       
   386                 iStatus.Int() );
       
   387             }
       
   388         break;
       
   389         case EXdmUpdateRules:
       
   390             {
       
   391             DP_SDA("CPresencePluginXdmPresRules::RunL EXdmUpdateRules");
       
   392             iAsyncHandler->HandlePresUpdateDocumentL( 
       
   393                 iStatus.Int() );
       
   394             }
       
   395         break;
       
   396         case EXdmUpdateRulesFromServer:
       
   397             {
       
   398             DP_SDA("RunL ExdmUpdateRulesFromServer");
       
   399 			CreateRootIfNeededL(); //This check is added for Openser/OpenXcap
       
   400             iAsyncHandler->HandlePresUpdateDocumentL( iStatus.Int() );           
       
   401             iRulesUpdateState = EStateNoOperation;
       
   402             }
       
   403         break;
       
   404         case ENoOperation:
       
   405         default:
       
   406             break;
       
   407         }
       
   408      DP_SDA("CPresencePluginXdmPresRules::RunL end"); 
       
   409     }
       
   410 
       
   411 // ---------------------------------------------------------------------------
       
   412 // CPresencePluginXdmPresRules::DoCancel()
       
   413 // ---------------------------------------------------------------------------
       
   414 //    
       
   415 void CPresencePluginXdmPresRules::DoCancel(  )
       
   416     {
       
   417 	DP_SDA("CPresencePluginXdmPresRules::DoCancel");
       
   418 	iXdmEngine->CancelUpdate(iPresRulesDoc);
       
   419     iAsyncReq = ECancelDocument;   
       
   420     }
       
   421     
       
   422 // ---------------------------------------------------------------------------
       
   423 // CPresencePluginXdmPresRules::RunError()
       
   424 // ---------------------------------------------------------------------------
       
   425 //
       
   426 TInt CPresencePluginXdmPresRules::RunError( TInt /*aError*/ )
       
   427     {
       
   428 	DP_SDA("CPresencePluginXdmPresRules::RunError");
       
   429     return KErrNone;
       
   430     }
       
   431         
       
   432 // ---------------------------------------------------------------------------
       
   433 // CPresencePluginXdmPresRules::AddEntityToWhiteListL()
       
   434 // ---------------------------------------------------------------------------
       
   435 // 
       
   436 void CPresencePluginXdmPresRules::AddEntityToWhiteListL(
       
   437 	const TDesC&  aUri,
       
   438 	MPresRulesAsyncHandler* const aHandler )
       
   439     {
       
   440     DP_SDA("CPresencePluginXdmPresRules::AddEntityToWhiteListL");
       
   441     iEntityUri = aUri.Alloc();
       
   442     DP_SDA2( "AddEntityToWhiteListL entity %S", iEntityUri );
       
   443     __ASSERT_ALWAYS(aHandler, User::Leave(KErrArgument));
       
   444     
       
   445     iAsyncReq = EXdmUpdateRules;
       
   446     iAsyncHandler = aHandler;
       
   447     iRulesUpdateState = EStateAddToWhiteList;
       
   448     DoOneAddUserL( KPresenceXdmWhiteList, iEntityUri->Des() );
       
   449     
       
   450     UpdateXdmRulesL( aHandler );   
       
   451     }
       
   452     
       
   453 // ---------------------------------------------------------------------------
       
   454 // CPresencePluginXdmPresRules::RemoveEntityFromWhiteListL()
       
   455 // ---------------------------------------------------------------------------
       
   456 //    
       
   457 void CPresencePluginXdmPresRules::RemoveEntityFromWhiteListL(
       
   458 	const TDesC& aUri,
       
   459 	MPresRulesAsyncHandler* const aHandler )
       
   460     {
       
   461     DP_SDA("CPresencePluginXdmPresRules::RemoveEntityFromWhiteListL");
       
   462     iEntityUri =  aUri.Alloc();
       
   463     __ASSERT_ALWAYS(aHandler, User::Leave(KErrArgument));
       
   464     
       
   465     iAsyncReq = EXdmUpdateRules;
       
   466     iAsyncHandler = aHandler;
       
   467     iRulesUpdateState = EStateRemoveFromWhiteList;
       
   468     RemoveOneFromRuleL( KPresenceXdmWhiteList, iEntityUri->Des() );
       
   469     
       
   470     UpdateXdmRulesL( aHandler );
       
   471     }
       
   472 
       
   473 // ---------------------------------------------------------------------------
       
   474 // CPresencePluginXdmPresRules::AddEntityToBlockedRulesL()
       
   475 // ---------------------------------------------------------------------------
       
   476 // 
       
   477 void CPresencePluginXdmPresRules::AddEntityToBlockedRulesL(
       
   478     const TDesC& aUri,
       
   479 	MPresRulesAsyncHandler* const aHandler )
       
   480     {
       
   481     DP_SDA("CPresencePluginXdmPresRules::AddEntityToBlockedRulesL");
       
   482     iEntityUri =  aUri.Alloc();
       
   483      __ASSERT_ALWAYS(aHandler, User::Leave(KErrArgument));
       
   484 
       
   485     iAsyncReq = EXdmUpdateRules;
       
   486     iAsyncHandler = aHandler;
       
   487     iRulesUpdateState = EStateAddToBlockList;
       
   488     DoOneAddUserL( KPresenceXdmBlockRule, iEntityUri->Des() );
       
   489     
       
   490     UpdateXdmRulesL( aHandler );    
       
   491     }
       
   492 
       
   493 // ---------------------------------------------------------------------------
       
   494 // CPresencePluginXdmPresRules::RemoveEntityBlockedRulesL()
       
   495 // ---------------------------------------------------------------------------
       
   496 //
       
   497 void CPresencePluginXdmPresRules::RemoveEntityBlockedRulesL(
       
   498 	const TDesC& aUri,
       
   499 	MPresRulesAsyncHandler* const aHandler )
       
   500     {
       
   501     DP_SDA("CPresencePluginXdmPresRules::RemoveEntityBlockedRulesL");
       
   502     iEntityUri =  aUri.Alloc();
       
   503     __ASSERT_ALWAYS(aHandler, User::Leave(KErrArgument));
       
   504     
       
   505     iAsyncReq = EXdmUpdateRules;
       
   506     iAsyncHandler = aHandler;
       
   507 	iRulesUpdateState = EStateRemoveFromBlackList;
       
   508     RemoveOneFromRuleL( KPresenceXdmBlockRule, iEntityUri->Des() );
       
   509     
       
   510     UpdateXdmRulesL( aHandler );
       
   511     DP_SDA("CPresencePluginXdmPresRules::RemoveEntityBlockedRulesL end");   
       
   512     }    
       
   513 
       
   514 // ---------------------------------------------------------------------------
       
   515 // CPresencePluginXdmPresRules::RemoveOneFromRule()
       
   516 // ---------------------------------------------------------------------------
       
   517 //    
       
   518 void CPresencePluginXdmPresRules::RemoveOneFromRuleL(
       
   519    const TDesC& aRule, const TDesC&  aUri )
       
   520     {
       
   521     DP_SDA("CPresencePluginXdmPresRules::RemoveOneFromRule");
       
   522     CXdmDocumentNode* ruleNode = NULL;
       
   523     CXdmNodeAttribute* attr = NULL;
       
   524     TBool found( EFalse );
       
   525     TBool ruleAvaible( EFalse );
       
   526     
       
   527     using namespace NPresencePlugin::NPresence;
       
   528 
       
   529     RPointerArray<CXdmDocumentNode> rules;
       
   530     CleanupClosePushL( rules );
       
   531 
       
   532     RPointerArray<CXdmDocumentNode> nodes;
       
   533     CleanupClosePushL( nodes );
       
   534     
       
   535     RPointerArray<CXdmDocumentNode> ones;
       
   536     CleanupClosePushL( ones );
       
   537     
       
   538     if ( iPresRulesDoc )
       
   539         {
       
   540         DP_SDA("RemoveOneFromRule iPresRulesDoc ok");
       
   541         
       
   542         //Check if rule exist
       
   543         ruleAvaible = FindRuleL( aRule, EFalse );
       
   544         
       
   545         if ( ruleAvaible )
       
   546             {
       
   547             
       
   548             TRAPD( err, ruleNode =  GetRulesL( aRule, rules ) );
       
   549 			if( !err )
       
   550 			    {
       
   551 			    found = ETrue;
       
   552 			    }
       
   553             }
       
   554         }
       
   555     
       
   556     if ( found )
       
   557         {
       
   558         DP_SDA("CPresencePluginXdmPresRules::RemoveOneFromRule found");
       
   559         TInt findErr = ruleNode->Find( KPresenceOne, nodes );
       
   560         if ( !findErr )
       
   561             {
       
   562             TInt nodeCount = nodes.Count();
       
   563             for ( TInt i = 0; i < nodeCount; i++ )
       
   564                 {
       
   565                 CXdmDocumentNode* currNode = nodes[i];
       
   566                 attr = ( currNode )->Attribute( KPresenceId );
       
   567                 if ( attr && !attr->AttributeValue().CompareF( aUri ))
       
   568                     {
       
   569                     DP_SDA("RemoveOneFromRule Remove");
       
   570                     //First remove currNode form model
       
   571                     iPresRulesDoc->RemoveFromModelL( currNode );
       
   572                     
       
   573                     //Check how many rules are in group now
       
   574                     DP_SDA("RemoveOneFromRule Find all one field from rule");
       
   575                     User::LeaveIfError( ruleNode->Find( KPresenceOne, ones ) );
       
   576                     TInt oneCount = ones.Count();
       
   577                     DP_SDA2("RemoveOneFromRule ones count %d", oneCount);
       
   578                     //if there is no any ones in rule remove it
       
   579                     if( KErrNone == oneCount )
       
   580                     	{
       
   581                     	//Remove group
       
   582         				DP_SDA("RemoveOneFromRule Remove GROUP");
       
   583         				RemoveRuleGroupL( aRule );	
       
   584                     	}
       
   585                     // Update model to server
       
   586                     iPresRulesDoc->AppendL();
       
   587                     break;
       
   588                     }
       
   589                 }
       
   590             }
       
   591         }
       
   592       
       
   593     CleanupStack::PopAndDestroy( &ones ); // >>> nodes         
       
   594     CleanupStack::PopAndDestroy( &nodes ); // >>> nodes
       
   595     CleanupStack::PopAndDestroy( &rules ); // >>> lists
       
   596     }    
       
   597  
       
   598 // ---------------------------------------------------------------------------
       
   599 // CPresencePluginXdmPresRules::DoOneAddUserL()
       
   600 // ---------------------------------------------------------------------------
       
   601 //
       
   602  void CPresencePluginXdmPresRules::DoOneAddUserL(
       
   603     const TDesC& aRule, const TDesC&  aUri )
       
   604     {
       
   605     DP_SDA("CPresencePluginXdmPresRules::DoOneAddUserL");
       
   606     using namespace NPresencePlugin::NPresence;
       
   607     
       
   608     CXdmDocumentNode* ruleNode = NULL;
       
   609     RPointerArray<CXdmDocumentNode> identityNode;
       
   610     CleanupClosePushL( identityNode );
       
   611     
       
   612     TBool found( EFalse );
       
   613     TBool ruleAvaible( EFalse );
       
   614     
       
   615     using namespace NPresencePlugin::NPresence;
       
   616 
       
   617     RPointerArray<CXdmDocumentNode> rules;
       
   618     CleanupClosePushL( rules );
       
   619     
       
   620 
       
   621     DP_SDA("CPresencePluginXdmPresRules::DoOneAddUserL iPresRulesDoc");
       
   622     if ( iPresRulesDoc )
       
   623         {
       
   624         DP_SDA("DoOneAddUserL iPresRulesDoc Exist");
       
   625         
       
   626         ruleAvaible = FindRuleL( aRule, ETrue );
       
   627         
       
   628         if ( ruleAvaible )
       
   629             {
       
   630 			TRAPD( err, ruleNode =  GetRulesL( aRule, rules ) );
       
   631 			if( !err )
       
   632 			    {
       
   633 			    found = ETrue;
       
   634 			    }
       
   635             }
       
   636         }
       
   637    
       
   638     //Finaly add entity to rules
       
   639     if ( found )
       
   640         {
       
   641         //Check if enity already in list
       
   642         if( !CheckIfOneExistL( aRule, aUri ) )
       
   643             {
       
   644             DP_SDA("CPresencePluginXdmPresRules::DoOneAddUserL Found");
       
   645             // Find identityNode inside rulenode
       
   646             User::LeaveIfError( 
       
   647             ruleNode->Find( KPresenceIdentity, identityNode ) );
       
   648             if ( identityNode[0] )    
       
   649                 {
       
   650                     if ( identityNode[0]->IsEmptyNode() )
       
   651                         {
       
   652                         DP_SDA("DoOneAddUserL rule node empty");
       
   653                         identityNode[0]->SetEmptyNode( ETrue );
       
   654                         }
       
   655                     // create new one node inside identity
       
   656                     CXdmDocumentNode* newNode =
       
   657                     identityNode[0]->CreateChileNodeL( KPresenceOne );
       
   658                     newNode->SetEmptyNode( ETrue );
       
   659                     CXdmNodeAttribute* attributeOneId =
       
   660                     newNode->CreateAttributeL( KPresenceId );
       
   661 
       
   662                     attributeOneId->SetAttributeValueL( aUri );
       
   663                     iPresRulesDoc->AppendL();
       
   664                     DP_SDA("DoOneAddUserL added");
       
   665                 }
       
   666             }
       
   667         }
       
   668     else
       
   669         {
       
   670         DP_SDA("CPresencePluginXdmPresRules::DoOneAddUserL error not found");
       
   671         User::Leave( KErrNotFound );
       
   672         } 
       
   673     DP_SDA("CPresencePluginXdmPresRules::DoOneAddUserL end");     
       
   674     CleanupStack::PopAndDestroy( 2 );
       
   675               
       
   676     }
       
   677 
       
   678 // ---------------------------------------------------------------------------
       
   679 // CPresencePluginXdmPresRules::GetRulesL()
       
   680 // ---------------------------------------------------------------------------
       
   681 //
       
   682 CXdmDocumentNode* CPresencePluginXdmPresRules::GetRulesL( const TDesC& aRule,
       
   683     RPointerArray<CXdmDocumentNode>& aRuleArray )
       
   684     {
       
   685     DP_SDA("GetRulesL find Again if rule now exist");
       
   686     using namespace NPresencePlugin::NPresence;
       
   687     
       
   688     CXdmDocumentNode* ruleNode = NULL;
       
   689     CXdmNodeAttribute* attr = NULL;
       
   690     
       
   691     TBool result(EFalse);
       
   692     // find if rule tag is exist
       
   693     User::LeaveIfError( iPresRulesDoc->Find( KPresenceRule, aRuleArray ) );
       
   694 
       
   695     // How many rules found
       
   696     TInt count = aRuleArray.Count();
       
   697     DP_SDA2("GetRulesL ruleCount %d ", count);
       
   698 
       
   699     // Check is needed rule id exist
       
   700     for ( TInt i=0; i < count; i++ )
       
   701         {
       
   702         ruleNode = aRuleArray[i];
       
   703         TBuf<KBufSize100> buf;
       
   704         buf.Copy( 
       
   705         ruleNode->Attribute( KPresenceId )->AttributeValue() );
       
   706         DP_SDA2("GetRulesL ruleNode %S", &buf);
       
   707 
       
   708         attr = ruleNode->Attribute( KPresenceId );
       
   709         if ( attr && !attr->AttributeValue().CompareF( aRule ) )
       
   710             {
       
   711             DP_SDA("CPresencePluginXdmPresRules::GetRulesL FOUND");
       
   712             result = ETrue;
       
   713             break;
       
   714             }
       
   715         }
       
   716         
       
   717     // Make second compare
       
   718     if( !result )
       
   719         {
       
   720         User::LeaveIfError(iPresRulesDoc->Find( KPresenceRule, aRuleArray )); 
       
   721         TInt count2 = aRuleArray.Count();
       
   722 
       
   723         for ( TInt i=0; i < count2; i++ )
       
   724             {
       
   725             ruleNode = aRuleArray[i];
       
   726             attr = ruleNode->Attribute( KPresenceId );
       
   727             if ( attr && attr->AttributeValue().CompareF( aRule ) )
       
   728                 {
       
   729                 DP_SDA("CPresencePluginXdmPresRules::GetRulesL NOT FOUND");
       
   730                 User::Leave( KErrNotFound );
       
   731                 }
       
   732             }
       
   733         }
       
   734 
       
   735     return ruleNode;    
       
   736     }
       
   737                                 
       
   738 // ---------------------------------------------------------------------------
       
   739 // CPresencePluginXdmPresRules::FindRuleL()
       
   740 // ---------------------------------------------------------------------------
       
   741 //	
       
   742 TBool CPresencePluginXdmPresRules::FindRuleL( 
       
   743     const TDesC& aRule, TBool aCreateRule )
       
   744     {
       
   745     DP_SDA("CPresencePluginXdmPresRules::FindRuleL");
       
   746     using namespace NPresencePlugin::NPresence;
       
   747     
       
   748    	 if ( iPresRulesDoc )
       
   749         {
       
   750         DP_SDA("CPresencePluginXdmPresRules::FindRuleL pres document exists");
       
   751         RPointerArray<CXdmDocumentNode> rule;
       
   752         CleanupClosePushL( rule );
       
   753         
       
   754         CXdmDocumentNode* ruleNode = NULL;
       
   755         CXdmNodeAttribute* attr = NULL;
       
   756         
       
   757         TBool found = EFalse;
       
   758         //Find all rules from document and but them to array
       
   759         DP_SDA("CPresencePluginXdmPresRules::FindRuleL find rule");
       
   760         TInt err = iPresRulesDoc->Find( KPresenceRule, rule );
       
   761         DP_SDA2("FindRuleL find rule error %d", err);
       
   762         
       
   763         // There is no any rules yet avaible create 
       
   764         if ( err == KErrNotFound && aCreateRule )
       
   765             {
       
   766             DP_SDA("FindRuleL Not any rules exist");
       
   767             if ( iRulesUpdateState == EStateAddToWhiteList )
       
   768                 {
       
   769                 DP_SDA("FindRuleL add white list");
       
   770                 AddWhiteListL( iPresRulesDoc->DocumentRoot() );
       
   771                 CleanupStack::PopAndDestroy( 1 );
       
   772                 return ETrue;
       
   773                 }
       
   774             else if ( iRulesUpdateState == EStateAddToBlockList  )
       
   775                 {
       
   776                 DP_SDA("FindRuleL add black list");
       
   777                 AddBlackListL( iPresRulesDoc->DocumentRoot() );
       
   778                 CleanupStack::PopAndDestroy( 1 );
       
   779                 return ETrue;
       
   780                 }
       
   781             }
       
   782             
       
   783         // if rule element found find if aRule exist
       
   784         TInt count = rule.Count();
       
   785         for ( TInt i=0; i < count; i++ )
       
   786             {
       
   787             ruleNode = rule[i];
       
   788             TBuf<KBufSize100> buf;
       
   789             buf.Copy( 
       
   790                 ruleNode->Attribute( KPresenceId )->AttributeValue() );
       
   791             DP_SDA2("FindRuleL ruleNode %S", &buf);
       
   792       
       
   793             attr = ruleNode->Attribute( KPresenceId );
       
   794             if ( attr && !attr->AttributeValue().CompareF( aRule ) )
       
   795                 {
       
   796                 DP_SDA("CPresencePluginXdmPresRules::FindRuleL FOUND");
       
   797                 found = ETrue;
       
   798                 }
       
   799             }
       
   800                 
       
   801         if ( !found && aCreateRule)
       
   802             {
       
   803             // if rule not found create it
       
   804             DP_SDA("CPresencePluginXdmPresRules::FindRuleL not found");
       
   805             //if rule not found add rule and check again
       
   806             if ( EStateAddToWhiteList == iRulesUpdateState )
       
   807                 {
       
   808                 DP_SDA("FindRuleL add white list2");
       
   809                 AddWhiteListL( iPresRulesDoc->DocumentRoot() );
       
   810                 CleanupStack::PopAndDestroy( 1 );
       
   811                 return ETrue;
       
   812                 }
       
   813                 else if ( EStateAddToBlockList == iRulesUpdateState )
       
   814                 {
       
   815                 DP_SDA("FindRuleL add black list 2");
       
   816                 AddBlackListL( iPresRulesDoc->DocumentRoot() );
       
   817                 CleanupStack::PopAndDestroy( 1 );
       
   818                 return ETrue;
       
   819                 }         
       
   820             }
       
   821         
       
   822         CleanupStack::PopAndDestroy( 1 );    
       
   823         return ETrue;
       
   824         }
       
   825      else
       
   826         {
       
   827         // Should we create presrules document
       
   828         DP_SDA("CPresencePluginXdmPresRules::FindRuleL end");
       
   829         return EFalse;
       
   830         } 
       
   831     }
       
   832 
       
   833 // ---------------------------------------------------------------------------
       
   834 // CPresencePluginXdmPresRules::CheckIfOneExistL
       
   835 // ---------------------------------------------------------------------------
       
   836 //
       
   837 TBool CPresencePluginXdmPresRules::CheckIfOneExistL(
       
   838     const TDesC& aRule,
       
   839     const TDesC& aUri )
       
   840     {
       
   841     using namespace NPresencePlugin::NPresence;
       
   842     DP_SDA("CPresencePluginXdmPresRules::CheckIfOneExistL");
       
   843     
       
   844     using namespace NPresencePlugin::NPresence;
       
   845     
       
   846     CXdmNodeAttribute* attr = NULL;
       
   847     RPointerArray<CXdmDocumentNode> nodes;
       
   848     CleanupClosePushL( nodes );
       
   849     TBool state( EFalse );
       
   850     
       
   851     CXdmDocumentNode* root = iPresRulesDoc->DocumentRoot();
       
   852     CXdmDocumentNode* foundNode = SearchListUnderParentL( root, aRule );
       
   853     
       
   854     if ( foundNode )
       
   855         {
       
   856         DP_SDA("CPresencePluginXdmPresRules::CheckIfOneExistL check nodes");
       
   857         TInt findErr = foundNode->Find( KPresenceOne, nodes );
       
   858         DP_SDA2("CheckIfEnityExist - findErr: %d", findErr );
       
   859 
       
   860         if ( findErr )
       
   861             {
       
   862             DP_SDA("CheckIfOneExistL One not exist ");
       
   863             state = EFalse;
       
   864             }
       
   865         else
       
   866             {
       
   867             DP_SDA("CPresencePluginXdmPresRules::CheckIfOneExistL Else");
       
   868             TInt nodeCount = nodes.Count();
       
   869             for ( TInt i = 0; i < nodeCount; i++ )
       
   870                 {
       
   871                 CXdmDocumentNode* currNode = nodes[i];
       
   872                 attr = ( currNode )->Attribute( KPresenceId );
       
   873                 if ( attr && !attr->AttributeValue().CompareF( aUri ))
       
   874                     {
       
   875                     DP_SDA("CheckIfOneExistL entity exists");
       
   876                     //Enity is exist
       
   877                     state = ETrue;
       
   878                     break;
       
   879                     }
       
   880                 }
       
   881             }
       
   882         }
       
   883     DP_SDA("CPresencePluginXdmPresRules::CheckIfOneExistL Destroy nodes");
       
   884     CleanupStack::PopAndDestroy( &nodes ); // >>> nodes    
       
   885     return state;
       
   886     }
       
   887 
       
   888 // ---------------------------------------------------------------------------
       
   889 // CPresencePluginXdmPresRules::RemoveRuleGroupL( )
       
   890 // ---------------------------------------------------------------------------
       
   891 //
       
   892 void CPresencePluginXdmPresRules::RemoveRuleGroupL( const TDesC& aRule )
       
   893     {
       
   894     DP_SDA("CPresencePluginXdmUtils::RemoveRuleGroupL");
       
   895     CXdmDocumentNode* ruleNode = NULL;
       
   896     CXdmNodeAttribute* attr = NULL;
       
   897     TBool found( EFalse );
       
   898     TBool ruleAvaible( EFalse );
       
   899     
       
   900     using namespace NPresencePlugin::NPresence;
       
   901 
       
   902     RPointerArray<CXdmDocumentNode> rules;
       
   903     CleanupClosePushL( rules );
       
   904 
       
   905     RPointerArray<CXdmDocumentNode> nodes;
       
   906     CleanupClosePushL( nodes );
       
   907 
       
   908     //Find rules
       
   909     if ( iPresRulesDoc )
       
   910         {
       
   911         DP_SDA("RemoveRuleGroupL iPresRulesDoc ok");
       
   912         
       
   913         //Check if rule exist
       
   914         ruleAvaible = FindRuleL( aRule, EFalse );
       
   915         
       
   916         if ( ruleAvaible )
       
   917             {
       
   918             // If rule found get count how many rules are in xml
       
   919             TInt findErr = iPresRulesDoc->Find( KPresenceRule, rules );
       
   920             DP_SDA2("RemoveRuleGroupL findError %d", findErr);
       
   921             if ( !findErr )
       
   922                 {
       
   923                 DP_SDA("RemoveRuleGroupL found EFalse");
       
   924                 found = EFalse;
       
   925                 }
       
   926             else
       
   927                 {
       
   928                 TInt count = rules.Count();
       
   929                 DP_SDA2("RemoveRuleGroupL rule count %d", count);
       
   930                 for ( TInt i=0; i < count; i++ )
       
   931                     {
       
   932                     ruleNode = rules[i];
       
   933                     attr = ruleNode->Attribute( KPresenceId );
       
   934                     if ( attr && !attr->AttributeValue().CompareF( aRule ))
       
   935                         {
       
   936                         found = ETrue;
       
   937                         break;
       
   938                         }
       
   939                     }
       
   940                 }
       
   941             }
       
   942         }
       
   943         
       
   944     if ( found )
       
   945         {
       
   946         User::LeaveIfError( iPresRulesDoc->Find( KPresenceRule, nodes ));
       
   947         TInt ruleCount = nodes.Count();
       
   948         DP_SDA2("L node count %d", ruleCount);
       
   949         for ( TInt i = 0; i < ruleCount; i++ )
       
   950             {
       
   951             CXdmDocumentNode* currNode = nodes[i];
       
   952             attr = currNode->Attribute( KPresenceId );
       
   953             if ( attr && !attr->AttributeValue().CompareF( aRule ))
       
   954                 {
       
   955                 DP_SDA("RemoveRuleGroupL remove rule");
       
   956                 // This is the user we are looking for deletion.
       
   957                 iPresRulesDoc->RemoveFromModelL( currNode );
       
   958                 //Update
       
   959                 iPresRulesDoc->AppendL();
       
   960                 break;
       
   961                 }
       
   962             }
       
   963         }
       
   964     else
       
   965         {
       
   966         User::Leave( KErrNotFound );
       
   967         }
       
   968     CleanupStack::PopAndDestroy( &nodes ); // >>> nodes
       
   969     CleanupStack::PopAndDestroy( &rules ); // >>> rules
       
   970     DP_SDA("CPresencePluginXdmUtils::RemoveRuleGroupL end");
       
   971     } 
       
   972 
       
   973 // ---------------------------------------------------------------------------
       
   974 // CPresencePluginXdmPresRules::UpdateFromServerL()
       
   975 // ---------------------------------------------------------------------------
       
   976 //    
       
   977 TInt CPresencePluginXdmPresRules::UpdateFromServerL( 
       
   978 	MPresRulesAsyncHandler* const aHandler )
       
   979     {
       
   980     DP_SDA("CPresencePluginXdmPresRules::UpdateFromServer");
       
   981     using namespace NPresencePlugin::NPresence;
       
   982     __ASSERT_ALWAYS(aHandler, User::Leave(KErrArgument));
       
   983 
       
   984     if ( IsActive() )
       
   985 	{
       
   986     return KErrAlreadyExists;
       
   987 	}
       
   988 	iPresRulesDoc->ResetContents();
       
   989     iPresRulesDoc->FetchDataL();
       
   990     iAsyncReq = EXdmUpdateRulesFromServer;
       
   991     iAsyncHandler = aHandler;
       
   992     iXdmEngine->UpdateL( iPresRulesDoc, iStatus );
       
   993     SetActive();
       
   994     DP_SDA("CPresencePluginXdmPresRules::UpdateFromServer end");
       
   995     return KErrNone;
       
   996     }
       
   997 
       
   998 // ---------------------------------------------------------------------------
       
   999 // CPresencePluginXdmPresRules::CreateRootIfNeededL()
       
  1000 // ---------------------------------------------------------------------------
       
  1001 //    
       
  1002 void CPresencePluginXdmPresRules::CreateRootIfNeededL()
       
  1003     {
       
  1004     DP_SDA("CPresencePluginXdmPresRules::CreateRootIfNeededL");
       
  1005     using namespace NPresencePlugin::NPresence;
       
  1006 
       
  1007     CXdmDocumentNode* myRootNode = iPresRulesDoc->DocumentRoot();
       
  1008     
       
  1009     if ( myRootNode )
       
  1010         {
       
  1011         DP_SDA("CreateRootIfNeededL document root exists");
       
  1012         myRootNode->SetEmptyNode(EFalse);
       
  1013         return;
       
  1014         }
       
  1015         
       
  1016     DP_SDA("CPresencePluginXdmPresRules::CreateRootIfNeededL create root");    
       
  1017     myRootNode = iPresRulesDoc->CreateRootL();
       
  1018     DP_SDA("CreateRootIfNeededL create root pushL");
       
  1019     CleanupStack::PushL( myRootNode );
       
  1020     myRootNode->SetNameL( KPresenceRuleset );
       
  1021     DP_SDA("CPresencePluginXdmPresRules::CreateRootIfNeededL create root POP");    
       
  1022     CleanupStack::Pop( myRootNode );
       
  1023     DP_SDA("CPresencePluginXdmPresRules::CreateRootIfNeededL create root end");
       
  1024     }
       
  1025 
       
  1026 void CPresencePluginXdmPresRules::ResetAndDestroy1( TAny* aPointerArray )
       
  1027 	{
       
  1028     if ( aPointerArray )
       
  1029         {
       
  1030         RPointerArray<CXdmDocumentNode>* array =
       
  1031             static_cast<RPointerArray<CXdmDocumentNode>*>( aPointerArray );
       
  1032         array->ResetAndDestroy();
       
  1033         array->Close();
       
  1034         }
       
  1035 	}
       
  1036 
       
  1037 void CPresencePluginXdmPresRules::ResetAndDestroy2( TAny* aPointerArray )
       
  1038 	{
       
  1039     if ( aPointerArray )
       
  1040         {
       
  1041         RPointerArray<SXdmAttribute16>* array =
       
  1042             static_cast<RPointerArray<SXdmAttribute16>*>( aPointerArray );
       
  1043         array->ResetAndDestroy();
       
  1044         array->Close();
       
  1045         }
       
  1046 	}
       
  1047 // ---------------------------------------------------------------------------
       
  1048 // CPresencePluginXdmPresRules::SearchListUnderParentL
       
  1049 // ---------------------------------------------------------------------------
       
  1050 //
       
  1051 CXdmDocumentNode* CPresencePluginXdmPresRules::SearchListUnderParentL(
       
  1052     CXdmDocumentNode* aParent,
       
  1053     const TDesC& aName )
       
  1054     {
       
  1055     DP_SDA("CPresencePluginXdmPresRules::SearchListUnderParentL");
       
  1056     
       
  1057     using namespace NPresencePlugin::NPresence;
       
  1058 
       
  1059     if ( !aParent )
       
  1060         {
       
  1061         DP_SDA("CPresencePluginXdmUtils::SearchListUnderParentL return NULL");
       
  1062         return NULL;
       
  1063         }
       
  1064 
       
  1065     RPointerArray<CXdmDocumentNode> resultArray;
       
  1066     RPointerArray<SXdmAttribute16>  attributeArray;
       
  1067 
       
  1068     CleanupClosePushL( resultArray );           // <<< resultArray
       
  1069     CleanupClosePushL( attributeArray );        // <<< attributeArray
       
  1070 
       
  1071     SXdmAttribute16 attr;
       
  1072     attr.iName.Set( KPresenceId );
       
  1073     attr.iValue.Set( aName );
       
  1074     attributeArray.Append( &attr );
       
  1075     
       
  1076     CXdmDocumentNode* currNode = NULL;
       
  1077     
       
  1078     aParent->Find( KPresenceRule, resultArray, attributeArray );
       
  1079 
       
  1080     TInt count = resultArray.Count();
       
  1081     DP_SDA2("SearchListUnderParentL node count %d",count);
       
  1082     for ( TInt i=0; i < count; i++ )
       
  1083         {
       
  1084         currNode = resultArray[i];
       
  1085         CXdmDocumentNode* parent = currNode->Parent();
       
  1086         if ( parent == aParent )
       
  1087             {
       
  1088             DP_SDA("SearchListUnderParentL parent MATCH");
       
  1089             break;
       
  1090             }
       
  1091         currNode = NULL;
       
  1092         }
       
  1093 
       
  1094     CleanupStack::PopAndDestroy(); // clItem
       
  1095     CleanupStack::PopAndDestroy(); // clItem2
       
  1096     DP_SDA("CPresencePluginXdmUtils::SearchListUnderParentL return");
       
  1097     return currNode;
       
  1098     }
       
  1099    
       
  1100 // End of file