simpledatamodeladapter/src/presencepluginxdmpresrules.cpp
changeset 0 c8caa15ef882
child 8 aca99fb8a3dd
child 12 e6a66db4e9d0
equal deleted inserted replaced
-1:000000000000 0:c8caa15ef882
       
     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                 
       
   568                 TBool uriMatch = CompareUriWithoutPrefixL( 
       
   569                     aUri, attr->AttributeValue() );
       
   570                  
       
   571                 if ( attr && uriMatch )
       
   572                     {
       
   573                     DP_SDA("RemoveOneFromRule Remove");
       
   574                     //First remove currNode form model
       
   575                     iPresRulesDoc->RemoveFromModelL( currNode );
       
   576                     
       
   577                     //Check how many rules are in group now
       
   578                     DP_SDA("RemoveOneFromRule Find all one field from rule");
       
   579                     User::LeaveIfError( ruleNode->Find( KPresenceOne, ones ) );
       
   580                     TInt oneCount = ones.Count();
       
   581                     DP_SDA2("RemoveOneFromRule ones count %d", oneCount);
       
   582                     //if there is no any ones in rule remove it
       
   583                     if( KErrNone == oneCount )
       
   584                     	{
       
   585                     	//Remove group
       
   586         				DP_SDA("RemoveOneFromRule Remove GROUP");
       
   587         				RemoveRuleGroupL( aRule );	
       
   588                     	}
       
   589                     // Update model to server
       
   590                     iPresRulesDoc->AppendL();
       
   591                     break;
       
   592                     }
       
   593                 }
       
   594             }
       
   595         }
       
   596       
       
   597     CleanupStack::PopAndDestroy( &ones ); // >>> nodes         
       
   598     CleanupStack::PopAndDestroy( &nodes ); // >>> nodes
       
   599     CleanupStack::PopAndDestroy( &rules ); // >>> lists
       
   600     }    
       
   601  
       
   602 // ---------------------------------------------------------------------------
       
   603 // CPresencePluginXdmPresRules::DoOneAddUserL()
       
   604 // ---------------------------------------------------------------------------
       
   605 //
       
   606  void CPresencePluginXdmPresRules::DoOneAddUserL(
       
   607     const TDesC& aRule, const TDesC&  aUri )
       
   608     {
       
   609     DP_SDA("CPresencePluginXdmPresRules::DoOneAddUserL");
       
   610     using namespace NPresencePlugin::NPresence;
       
   611     
       
   612     CXdmDocumentNode* ruleNode = NULL;
       
   613     RPointerArray<CXdmDocumentNode> identityNode;
       
   614     CleanupClosePushL( identityNode );
       
   615     
       
   616     TBool found( EFalse );
       
   617     TBool ruleAvaible( EFalse );
       
   618     
       
   619     using namespace NPresencePlugin::NPresence;
       
   620 
       
   621     RPointerArray<CXdmDocumentNode> rules;
       
   622     CleanupClosePushL( rules );
       
   623     
       
   624 
       
   625     DP_SDA("CPresencePluginXdmPresRules::DoOneAddUserL iPresRulesDoc");
       
   626     if ( iPresRulesDoc )
       
   627         {
       
   628         DP_SDA("DoOneAddUserL iPresRulesDoc Exist");
       
   629         
       
   630         ruleAvaible = FindRuleL( aRule, ETrue );
       
   631         
       
   632         if ( ruleAvaible )
       
   633             {
       
   634 			TRAPD( err, ruleNode =  GetRulesL( aRule, rules ) );
       
   635 			if( !err )
       
   636 			    {
       
   637 			    found = ETrue;
       
   638 			    }
       
   639             }
       
   640         }
       
   641    
       
   642     //Finaly add entity to rules
       
   643     if ( found )
       
   644         {
       
   645         //Check if enity already in list
       
   646         if( !CheckIfOneExistL( aRule, aUri ) )
       
   647             {
       
   648             DP_SDA("CPresencePluginXdmPresRules::DoOneAddUserL Found");
       
   649             // Find identityNode inside rulenode
       
   650             User::LeaveIfError( 
       
   651             ruleNode->Find( KPresenceIdentity, identityNode ) );
       
   652             if ( identityNode[0] )    
       
   653                 {
       
   654                 if ( identityNode[0]->IsEmptyNode() )
       
   655                     {
       
   656                     DP_SDA("DoOneAddUserL rule node empty");
       
   657                     identityNode[0]->SetEmptyNode( EFalse );
       
   658                     }
       
   659                 
       
   660                 // create new one node inside identity
       
   661                 CXdmDocumentNode* newNode =
       
   662                     identityNode[0]->CreateChileNodeL( KPresenceOne );
       
   663                 CXdmNodeAttribute* attributeOneId =
       
   664                     newNode->CreateAttributeL( KPresenceId );
       
   665                 
       
   666                 attributeOneId->SetAttributeValueL( aUri );
       
   667                 iPresRulesDoc->AppendL();
       
   668                 DP_SDA("DoOneAddUserL added");
       
   669                 }
       
   670             }
       
   671         }
       
   672     else
       
   673         {
       
   674         DP_SDA("CPresencePluginXdmPresRules::DoOneAddUserL error not found");
       
   675         User::Leave( KErrNotFound );
       
   676         } 
       
   677     DP_SDA("CPresencePluginXdmPresRules::DoOneAddUserL end");     
       
   678     CleanupStack::PopAndDestroy( 2 );
       
   679               
       
   680     }
       
   681 
       
   682 // ---------------------------------------------------------------------------
       
   683 // CPresencePluginXdmPresRules::GetRulesL()
       
   684 // ---------------------------------------------------------------------------
       
   685 //
       
   686 CXdmDocumentNode* CPresencePluginXdmPresRules::GetRulesL( const TDesC& aRule,
       
   687     RPointerArray<CXdmDocumentNode>& aRuleArray )
       
   688     {
       
   689     DP_SDA("GetRulesL find Again if rule now exist");
       
   690     using namespace NPresencePlugin::NPresence;
       
   691     
       
   692     CXdmDocumentNode* ruleNode = NULL;
       
   693     CXdmNodeAttribute* attr = NULL;
       
   694     
       
   695     TBool result(EFalse);
       
   696     // find if rule tag is exist
       
   697     User::LeaveIfError( iPresRulesDoc->Find( KPresenceRule, aRuleArray ) );
       
   698 
       
   699     // How many rules found
       
   700     TInt count = aRuleArray.Count();
       
   701     DP_SDA2("GetRulesL ruleCount %d ", count);
       
   702 
       
   703     // Check is needed rule id exist
       
   704     for ( TInt i=0; i < count; i++ )
       
   705         {
       
   706         ruleNode = aRuleArray[i];
       
   707         TBuf<KBufSize100> buf;
       
   708         buf.Copy( 
       
   709         ruleNode->Attribute( KPresenceId )->AttributeValue() );
       
   710         DP_SDA2("GetRulesL ruleNode %S", &buf);
       
   711 
       
   712         attr = ruleNode->Attribute( KPresenceId );
       
   713         if ( attr && !attr->AttributeValue().CompareF( aRule ) )
       
   714             {
       
   715             DP_SDA("CPresencePluginXdmPresRules::GetRulesL FOUND");
       
   716             result = ETrue;
       
   717             break;
       
   718             }
       
   719         }
       
   720         
       
   721     // Make second compare
       
   722     if( !result )
       
   723         {
       
   724         User::LeaveIfError(iPresRulesDoc->Find( KPresenceRule, aRuleArray )); 
       
   725         TInt count2 = aRuleArray.Count();
       
   726 
       
   727         for ( TInt i=0; i < count2; i++ )
       
   728             {
       
   729             ruleNode = aRuleArray[i];
       
   730             attr = ruleNode->Attribute( KPresenceId );
       
   731             if ( attr && attr->AttributeValue().CompareF( aRule ) )
       
   732                 {
       
   733                 DP_SDA("CPresencePluginXdmPresRules::GetRulesL NOT FOUND");
       
   734                 User::Leave( KErrNotFound );
       
   735                 }
       
   736             }
       
   737         }
       
   738 
       
   739     return ruleNode;    
       
   740     }
       
   741                                 
       
   742 // ---------------------------------------------------------------------------
       
   743 // CPresencePluginXdmPresRules::FindRuleL()
       
   744 // ---------------------------------------------------------------------------
       
   745 //	
       
   746 TBool CPresencePluginXdmPresRules::FindRuleL( 
       
   747     const TDesC& aRule, TBool aCreateRule )
       
   748     {
       
   749     DP_SDA("CPresencePluginXdmPresRules::FindRuleL");
       
   750     using namespace NPresencePlugin::NPresence;
       
   751     
       
   752    	 if ( iPresRulesDoc )
       
   753         {
       
   754         DP_SDA("CPresencePluginXdmPresRules::FindRuleL pres document exists");
       
   755         RPointerArray<CXdmDocumentNode> rule;
       
   756         CleanupClosePushL( rule );
       
   757         
       
   758         CXdmDocumentNode* ruleNode = NULL;
       
   759         CXdmNodeAttribute* attr = NULL;
       
   760         
       
   761         TBool found = EFalse;
       
   762         //Find all rules from document and but them to array
       
   763         DP_SDA("CPresencePluginXdmPresRules::FindRuleL find rule");
       
   764         TInt err = iPresRulesDoc->Find( KPresenceRule, rule );
       
   765         DP_SDA2("FindRuleL find rule error %d", err);
       
   766         
       
   767         // There is no any rules yet avaible create 
       
   768         if ( err == KErrNotFound && aCreateRule )
       
   769             {
       
   770             DP_SDA("FindRuleL Not any rules exist");
       
   771             if ( iRulesUpdateState == EStateAddToWhiteList )
       
   772                 {
       
   773                 DP_SDA("FindRuleL add white list");
       
   774                 AddWhiteListL( iPresRulesDoc->DocumentRoot() );
       
   775                 CleanupStack::PopAndDestroy( 1 );
       
   776                 return ETrue;
       
   777                 }
       
   778             else if ( iRulesUpdateState == EStateAddToBlockList  )
       
   779                 {
       
   780                 DP_SDA("FindRuleL add black list");
       
   781                 AddBlackListL( iPresRulesDoc->DocumentRoot() );
       
   782                 CleanupStack::PopAndDestroy( 1 );
       
   783                 return ETrue;
       
   784                 }
       
   785             }
       
   786             
       
   787         // if rule element found find if aRule exist
       
   788         TInt count = rule.Count();
       
   789         for ( TInt i=0; i < count; i++ )
       
   790             {
       
   791             ruleNode = rule[i];
       
   792             TBuf<KBufSize100> buf;
       
   793             buf.Copy( 
       
   794                 ruleNode->Attribute( KPresenceId )->AttributeValue() );
       
   795             DP_SDA2("FindRuleL ruleNode %S", &buf);
       
   796       
       
   797             attr = ruleNode->Attribute( KPresenceId );
       
   798             if ( attr && !attr->AttributeValue().CompareF( aRule ) )
       
   799                 {
       
   800                 DP_SDA("CPresencePluginXdmPresRules::FindRuleL FOUND");
       
   801                 found = ETrue;
       
   802                 }
       
   803             }
       
   804                 
       
   805         if ( !found && aCreateRule)
       
   806             {
       
   807             // if rule not found create it
       
   808             DP_SDA("CPresencePluginXdmPresRules::FindRuleL not found");
       
   809             //if rule not found add rule and check again
       
   810             if ( EStateAddToWhiteList == iRulesUpdateState )
       
   811                 {
       
   812                 DP_SDA("FindRuleL add white list2");
       
   813                 AddWhiteListL( iPresRulesDoc->DocumentRoot() );
       
   814                 CleanupStack::PopAndDestroy( 1 );
       
   815                 return ETrue;
       
   816                 }
       
   817                 else if ( EStateAddToBlockList == iRulesUpdateState )
       
   818                 {
       
   819                 DP_SDA("FindRuleL add black list 2");
       
   820                 AddBlackListL( iPresRulesDoc->DocumentRoot() );
       
   821                 CleanupStack::PopAndDestroy( 1 );
       
   822                 return ETrue;
       
   823                 }         
       
   824             }
       
   825         
       
   826         CleanupStack::PopAndDestroy( 1 );    
       
   827         return ETrue;
       
   828         }
       
   829      else
       
   830         {
       
   831         // Should we create presrules document
       
   832         DP_SDA("CPresencePluginXdmPresRules::FindRuleL end");
       
   833         return EFalse;
       
   834         } 
       
   835     }
       
   836 
       
   837 // ---------------------------------------------------------------------------
       
   838 // CPresencePluginXdmPresRules::CheckIfOneExistL
       
   839 // ---------------------------------------------------------------------------
       
   840 //
       
   841 TBool CPresencePluginXdmPresRules::CheckIfOneExistL(
       
   842     const TDesC& aRule,
       
   843     const TDesC& aUri )
       
   844     {
       
   845     using namespace NPresencePlugin::NPresence;
       
   846     DP_SDA("CPresencePluginXdmPresRules::CheckIfOneExistL");
       
   847     
       
   848     using namespace NPresencePlugin::NPresence;
       
   849     
       
   850     CXdmNodeAttribute* attr = NULL;
       
   851     RPointerArray<CXdmDocumentNode> nodes;
       
   852     CleanupClosePushL( nodes );
       
   853     TBool state( EFalse );
       
   854     
       
   855     CXdmDocumentNode* root = iPresRulesDoc->DocumentRoot();
       
   856     CXdmDocumentNode* foundNode = SearchListUnderParentL( root, aRule );
       
   857     
       
   858     if ( foundNode )
       
   859         {
       
   860         DP_SDA("CPresencePluginXdmPresRules::CheckIfOneExistL check nodes");
       
   861         TInt findErr = foundNode->Find( KPresenceOne, nodes );
       
   862         DP_SDA2("CheckIfEnityExist - findErr: %d", findErr );
       
   863 
       
   864         if ( findErr )
       
   865             {
       
   866             DP_SDA("CheckIfOneExistL One not exist ");
       
   867             state = EFalse;
       
   868             }
       
   869         else
       
   870             {
       
   871             DP_SDA("CPresencePluginXdmPresRules::CheckIfOneExistL Else");
       
   872             TInt nodeCount = nodes.Count();
       
   873             for ( TInt i = 0; i < nodeCount; i++ )
       
   874                 {
       
   875                 CXdmDocumentNode* currNode = nodes[i];
       
   876                 attr = ( currNode )->Attribute( KPresenceId );
       
   877                 
       
   878                 TBool uriMatch( EFalse );                
       
   879                 uriMatch = CompareUriWithoutPrefixL( 
       
   880                     aUri, attr->AttributeValue() );
       
   881                 
       
   882                 if ( attr && uriMatch )
       
   883                     {
       
   884                     DP_SDA("CheckIfOneExistL entity exists");
       
   885                     //Enity is exist
       
   886                     state = ETrue;
       
   887                     break;
       
   888                     }
       
   889                 }
       
   890             }
       
   891         }
       
   892     DP_SDA("CPresencePluginXdmPresRules::CheckIfOneExistL Destroy nodes");
       
   893     CleanupStack::PopAndDestroy( &nodes ); // >>> nodes    
       
   894     return state;
       
   895     }
       
   896 
       
   897 // ---------------------------------------------------------------------------
       
   898 // CPresencePluginXdmPresRules::RemoveRuleGroupL( )
       
   899 // ---------------------------------------------------------------------------
       
   900 //
       
   901 void CPresencePluginXdmPresRules::RemoveRuleGroupL( const TDesC& aRule )
       
   902     {
       
   903     DP_SDA("CPresencePluginXdmUtils::RemoveRuleGroupL");
       
   904     CXdmDocumentNode* ruleNode = NULL;
       
   905     CXdmNodeAttribute* attr = NULL;
       
   906     TBool found( EFalse );
       
   907     TBool ruleAvaible( EFalse );
       
   908     
       
   909     using namespace NPresencePlugin::NPresence;
       
   910 
       
   911     RPointerArray<CXdmDocumentNode> rules;
       
   912     CleanupClosePushL( rules );
       
   913 
       
   914     RPointerArray<CXdmDocumentNode> nodes;
       
   915     CleanupClosePushL( nodes );
       
   916 
       
   917     //Find rules
       
   918     if ( iPresRulesDoc )
       
   919         {
       
   920         DP_SDA("RemoveRuleGroupL iPresRulesDoc ok");
       
   921         
       
   922         //Check if rule exist
       
   923         ruleAvaible = FindRuleL( aRule, EFalse );
       
   924         
       
   925         if ( ruleAvaible )
       
   926             {
       
   927             // If rule found get count how many rules are in xml
       
   928             TInt findErr = iPresRulesDoc->Find( KPresenceRule, rules );
       
   929             DP_SDA2("RemoveRuleGroupL findError %d", findErr);
       
   930             if ( !findErr )
       
   931                 {
       
   932                 DP_SDA("RemoveRuleGroupL found EFalse");
       
   933                 found = EFalse;
       
   934                 }
       
   935             else
       
   936                 {
       
   937                 TInt count = rules.Count();
       
   938                 DP_SDA2("RemoveRuleGroupL rule count %d", count);
       
   939                 for ( TInt i=0; i < count; i++ )
       
   940                     {
       
   941                     ruleNode = rules[i];
       
   942                     attr = ruleNode->Attribute( KPresenceId );
       
   943                     if ( attr && !attr->AttributeValue().CompareF( aRule ))
       
   944                         {
       
   945                         found = ETrue;
       
   946                         break;
       
   947                         }
       
   948                     }
       
   949                 }
       
   950             }
       
   951         }
       
   952         
       
   953     if ( found )
       
   954         {
       
   955         User::LeaveIfError( iPresRulesDoc->Find( KPresenceRule, nodes ));
       
   956         TInt ruleCount = nodes.Count();
       
   957         DP_SDA2("L node count %d", ruleCount);
       
   958         for ( TInt i = 0; i < ruleCount; i++ )
       
   959             {
       
   960             CXdmDocumentNode* currNode = nodes[i];
       
   961             attr = currNode->Attribute( KPresenceId );
       
   962             if ( attr && !attr->AttributeValue().CompareF( aRule ))
       
   963                 {
       
   964                 DP_SDA("RemoveRuleGroupL remove rule");
       
   965                 // This is the user we are looking for deletion.
       
   966                 iPresRulesDoc->RemoveFromModelL( currNode );
       
   967                 //Update
       
   968                 iPresRulesDoc->AppendL();
       
   969                 break;
       
   970                 }
       
   971             }
       
   972         }
       
   973     else
       
   974         {
       
   975         User::Leave( KErrNotFound );
       
   976         }
       
   977     CleanupStack::PopAndDestroy( &nodes ); // >>> nodes
       
   978     CleanupStack::PopAndDestroy( &rules ); // >>> rules
       
   979     DP_SDA("CPresencePluginXdmUtils::RemoveRuleGroupL end");
       
   980     } 
       
   981 
       
   982 // ---------------------------------------------------------------------------
       
   983 // CPresencePluginXdmPresRules::UpdateFromServerL()
       
   984 // ---------------------------------------------------------------------------
       
   985 //    
       
   986 TInt CPresencePluginXdmPresRules::UpdateFromServerL( 
       
   987 	MPresRulesAsyncHandler* const aHandler )
       
   988     {
       
   989     DP_SDA("CPresencePluginXdmPresRules::UpdateFromServer");
       
   990     using namespace NPresencePlugin::NPresence;
       
   991     __ASSERT_ALWAYS(aHandler, User::Leave(KErrArgument));
       
   992 
       
   993     if ( IsActive() )
       
   994 	{
       
   995     return KErrAlreadyExists;
       
   996 	}
       
   997 	iPresRulesDoc->ResetContents();
       
   998     iPresRulesDoc->FetchDataL();
       
   999     iAsyncReq = EXdmUpdateRulesFromServer;
       
  1000     iAsyncHandler = aHandler;
       
  1001     iXdmEngine->UpdateL( iPresRulesDoc, iStatus );
       
  1002     SetActive();
       
  1003     DP_SDA("CPresencePluginXdmPresRules::UpdateFromServer end");
       
  1004     return KErrNone;
       
  1005     }
       
  1006 
       
  1007 // ---------------------------------------------------------------------------
       
  1008 // CPresencePluginXdmPresRules::CreateRootIfNeededL()
       
  1009 // ---------------------------------------------------------------------------
       
  1010 //    
       
  1011 void CPresencePluginXdmPresRules::CreateRootIfNeededL()
       
  1012     {
       
  1013     DP_SDA("CPresencePluginXdmPresRules::CreateRootIfNeededL");
       
  1014     using namespace NPresencePlugin::NPresence;
       
  1015 
       
  1016     CXdmDocumentNode* myRootNode = iPresRulesDoc->DocumentRoot();
       
  1017     
       
  1018     if ( myRootNode )
       
  1019         {
       
  1020         DP_SDA("CreateRootIfNeededL document root exists");
       
  1021         myRootNode->SetEmptyNode(EFalse);
       
  1022         return;
       
  1023         }
       
  1024         
       
  1025     DP_SDA("CPresencePluginXdmPresRules::CreateRootIfNeededL create root");    
       
  1026     myRootNode = iPresRulesDoc->CreateRootL();
       
  1027     DP_SDA("CreateRootIfNeededL create root pushL");
       
  1028     CleanupStack::PushL( myRootNode );
       
  1029     myRootNode->SetNameL( KPresenceRuleset );
       
  1030     DP_SDA("CPresencePluginXdmPresRules::CreateRootIfNeededL create root POP");    
       
  1031     CleanupStack::Pop( myRootNode );
       
  1032     DP_SDA("CPresencePluginXdmPresRules::CreateRootIfNeededL create root end");
       
  1033     }
       
  1034 
       
  1035 void CPresencePluginXdmPresRules::ResetAndDestroy1( TAny* aPointerArray )
       
  1036 	{
       
  1037     if ( aPointerArray )
       
  1038         {
       
  1039         RPointerArray<CXdmDocumentNode>* array =
       
  1040             static_cast<RPointerArray<CXdmDocumentNode>*>( aPointerArray );
       
  1041         array->ResetAndDestroy();
       
  1042         array->Close();
       
  1043         }
       
  1044 	}
       
  1045 
       
  1046 void CPresencePluginXdmPresRules::ResetAndDestroy2( TAny* aPointerArray )
       
  1047 	{
       
  1048     if ( aPointerArray )
       
  1049         {
       
  1050         RPointerArray<SXdmAttribute16>* array =
       
  1051             static_cast<RPointerArray<SXdmAttribute16>*>( aPointerArray );
       
  1052         array->ResetAndDestroy();
       
  1053         array->Close();
       
  1054         }
       
  1055 	}
       
  1056 // ---------------------------------------------------------------------------
       
  1057 // CPresencePluginXdmPresRules::SearchListUnderParentL
       
  1058 // ---------------------------------------------------------------------------
       
  1059 //
       
  1060 CXdmDocumentNode* CPresencePluginXdmPresRules::SearchListUnderParentL(
       
  1061     CXdmDocumentNode* aParent,
       
  1062     const TDesC& aName )
       
  1063     {
       
  1064     DP_SDA("CPresencePluginXdmPresRules::SearchListUnderParentL");
       
  1065     
       
  1066     using namespace NPresencePlugin::NPresence;
       
  1067 
       
  1068     if ( !aParent )
       
  1069         {
       
  1070         DP_SDA("CPresencePluginXdmPresRules::SearchListUnderParentL return NULL");
       
  1071         return NULL;
       
  1072         }
       
  1073 
       
  1074     RPointerArray<CXdmDocumentNode> resultArray;
       
  1075     RPointerArray<SXdmAttribute16>  attributeArray;
       
  1076 
       
  1077     CleanupClosePushL( resultArray );           // <<< resultArray
       
  1078     CleanupClosePushL( attributeArray );        // <<< attributeArray
       
  1079 
       
  1080     SXdmAttribute16 attr;
       
  1081     attr.iName.Set( KPresenceId );
       
  1082     attr.iValue.Set( aName );
       
  1083     attributeArray.Append( &attr );
       
  1084     
       
  1085     CXdmDocumentNode* currNode = NULL;
       
  1086     
       
  1087     aParent->Find( KPresenceRule, resultArray, attributeArray );
       
  1088 
       
  1089     TInt count = resultArray.Count();
       
  1090     DP_SDA2("SearchListUnderParentL node count %d",count);
       
  1091     for ( TInt i=0; i < count; i++ )
       
  1092         {
       
  1093         currNode = resultArray[i];
       
  1094         CXdmDocumentNode* parent = currNode->Parent();
       
  1095         if ( parent == aParent )
       
  1096             {
       
  1097             DP_SDA("SearchListUnderParentL parent MATCH");
       
  1098             break;
       
  1099             }
       
  1100         currNode = NULL;
       
  1101         }
       
  1102 
       
  1103     CleanupStack::PopAndDestroy(); // clItem
       
  1104     CleanupStack::PopAndDestroy(); // clItem2
       
  1105     DP_SDA("CPresencePluginXdmPresRules::SearchListUnderParentL return");
       
  1106     return currNode;
       
  1107     }
       
  1108    
       
  1109 
       
  1110 // ---------------------------------------------------------------------------
       
  1111 // CPresencePluginXdmPresRules::SearchListUnderParentL
       
  1112 // ---------------------------------------------------------------------------
       
  1113 //
       
  1114 TBool CPresencePluginXdmPresRules::CompareUriWithoutPrefixL( 
       
  1115     const TDesC& aUri, const TDesC& aAttribute )
       
  1116     {
       
  1117     DP_SDA("CPresencePluginXdmPresRules::CompareUriWithoutPrefixL");
       
  1118     
       
  1119     TBool match( EFalse );
       
  1120     
       
  1121     RBuf uriWithoutPrefix;
       
  1122     CleanupClosePushL( uriWithoutPrefix );
       
  1123     uriWithoutPrefix.CreateL( aUri );
       
  1124     TInt prefixLocation = uriWithoutPrefix.Locate( ':' );
       
  1125                    
       
  1126     if ( KErrNotFound != prefixLocation )
       
  1127         {
       
  1128         uriWithoutPrefix.Delete( 0, ( prefixLocation + 1 ) );
       
  1129         }
       
  1130         
       
  1131      RBuf attributeWithoutprefix;
       
  1132      CleanupClosePushL( attributeWithoutprefix );
       
  1133      attributeWithoutprefix.CreateL( aAttribute );
       
  1134      prefixLocation = attributeWithoutprefix.Locate( ':' );
       
  1135                    
       
  1136      if ( KErrNotFound != prefixLocation )
       
  1137          {
       
  1138          attributeWithoutprefix.Delete( 0, ( prefixLocation + 1 ) );
       
  1139          }
       
  1140                     
       
  1141      DP_SDA2("    --> uri without prefix=%S", &uriWithoutPrefix );
       
  1142      DP_SDA2("    --> attribute without prefix=%S", &attributeWithoutprefix );                 
       
  1143                 
       
  1144      if ( uriWithoutPrefix.Compare( attributeWithoutprefix ) == 0 )
       
  1145          {
       
  1146          match = ETrue;
       
  1147          }
       
  1148                    
       
  1149     CleanupStack::PopAndDestroy( &attributeWithoutprefix );
       
  1150     CleanupStack::PopAndDestroy( &uriWithoutPrefix );
       
  1151     
       
  1152     return match;
       
  1153     }
       
  1154 
       
  1155 // End of file