simpledatamodeladapter/inc/presencepluginxdmpresrules.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:23:14 +0100
branchRCL_3
changeset 35 fbd2e7cec7ef
parent 0 c8caa15ef882
child 12 e6a66db4e9d0
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201027 Kit: 201035

/*
* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  IETF SIMPLE Protocol implementation for XIMP Framework
*
*/


#ifndef CPRESENCEPLUGINXDMPRESRULES_H
#define CPRESENCEPLUGINXDMPRESRULES_H

#include <e32base.h>
#include <ximpbase.h>

#include "presenceplugincommon.h"
#include "presencelogger.h"

class CXdmEngine;
class CXdmDocument;
class CXdmDocumentNode;
class TRequestStatus;
class MPresRulesAsyncHandler;

/**
 * CPresencePluginXdmPresRules
 *
 * Simple Engine Connection
 *
 * @lib presenceplugin.dll
 * @since S60 v3.2
 */
NONSHARABLE_CLASS( CPresencePluginXdmPresRules ): public CActive
    {
    public: // Constructor and destructor
         
        /**
         * XDM presrules state
         */
        enum TPluginPresRulesXdmState
            {
 			EStateIdle,
            EGetXdmRules,
            EUpdateXdmRules,
            ECreateXdmPresrules
            };
            
        /**
         * Operation state for rules update
         */     
        enum TPluginPresRulesUpdateState
            {
            EStateNoOperation,
            EStateAddToWhiteList,
            EStateAddToBlockList,
            EStateRemoveFromWhiteList,
            EStateRemoveFromBlackList,
            EStateInitializeRules
            };
            
        /**
         * Current operation
         */
        enum TPluginPresRulesXdmOperation
            {
            ENoOperation,
            ECancelDocument,
            EXdmInit,   
            EXdmDeleteAll,
            EXdmCancel,
            EXdmGetRulesFromServer,
            EXdmInitialPresDoc,
            EXdmUpdateRules,
            EXdmUpdateRulesFromServer
            };
        
        /**
         * Two-phased constructor.
         *         
         * @param aXmdId xdm settings id
         * @param aLocalMode, local or server mode TRUE/FALSE
         */       
        static CPresencePluginXdmPresRules* NewL( const TInt aXmdId, TBool  );

        /**
         * Two-phased constructor.
         *         
         * @param aXmdId xdm settings id
         * @param aLocalMode, local or server mode TRUE/FALSE
         */ 
        static CPresencePluginXdmPresRules* NewLC( 
        		const TInt aSettingId,
        		TBool aLocalMode );

        /**
         * Standard C++ destructor
         */ 
        virtual ~CPresencePluginXdmPresRules( );
    
    public: // Own functions
        
        /**
         * Updates XDM rules into server
         *
         * @since S60 3.2
         * @param aHandler, MPresRulesAssyncHandler
         * @return TInt, Error code
         */
        TInt UpdateXdmRulesL( MPresRulesAsyncHandler* const aHandler );
        
        /** 
         * Add white list tag to presrules document
         *
         * @since S60 3.2
         * @param aRoot, xml document root
         * @return none
         */
        void AddWhiteListL( CXdmDocumentNode* aRoot );
         
        /** 
         * Add black list tag to presrules document
         *
         * @since S60 3.2
         * @param aRoot, xml document root
         * @return none
         */
        void AddBlackListL( CXdmDocumentNode* aRoot );
         
        /**
         * Get presence rules from server
         *
         * @since S60 3.2
         * @param aHandler, PresRules assync handler
         * @return TInt, error code
         */
        TInt GetXdmRulesL( MPresRulesAsyncHandler* const aHandler );
        
        /**
         * Making initial presence rules document
         *
         * @since S60 3.2
         * @param aHandler, PresRules assync handler
         * @return none
         */
        void MakeInitialRulesDocumentL( 
        		MPresRulesAsyncHandler* const aHandler );
            
        /**
         * Remove entiry from blocked rules
         *
         * @since S60 3.2
         * @param aUri, entity url
         * @aHandler, PresRules assync handler 
         * @return none
         */   
        void RemoveEntityBlockedRulesL( 
            const TDesC&  aUri,
            MPresRulesAsyncHandler* const aHandler );
            
        /**
         * Remove entity from presrules white list
         *
         * @since S60 3.2
         * @param aUri, entity url
         * @aHandler, PresRules assync handler 
         * @return none
         */
        void RemoveEntityFromWhiteListL( 
            const TDesC&  aUri,
            MPresRulesAsyncHandler* const aHandler );
                
        /**
         * Add entity to presrules white list
         *
         * @since S60 3.2
         * @param aUri, entity url
         * @aHandler, PresRules assync handler 
         * @return none
         */
        void AddEntityToWhiteListL(
            const TDesC&  aUri,
            MPresRulesAsyncHandler* const aHandler );

        /**
         * Add entity to blocked rules
         *
         * @since S60 3.2
         * @param aUri, entity url
         * @aHandler, PresRules assync handler 
         * @return none
         */
        void AddEntityToBlockedRulesL( 
            const TDesC&  aUri,
            MPresRulesAsyncHandler* const aHandler );
                
        /**
         * Remove one from rule list
         *
         * @since S60 3.2
         * @param aRule, presence rule name
         * @param aUri, entity url 
         * @return none
         */ 
        void RemoveOneFromRuleL(
            const TDesC& aRule,
            const TDesC&  aUri );
        
        /**
         * Add one to rule list
         *
         * @since S60 3.2
         * @param aRule, presence rule name
         * @param aUri, entity url 
         * @return none
         */ 
        void DoOneAddUserL(
            const TDesC& aList,
            const TDesC&  aUri );
          
        /**
         * Update presence document from server
         *
         * @since S60 3.2
         * @param none
         * @return TInt, error code
         */
        TInt UpdateFromServerL( MPresRulesAsyncHandler* const aHandler );
  
    private:
        
        /**
         * Standard C++ constructor
         * @param aXmdId, XDM settings id
         */  
        CPresencePluginXdmPresRules( const TInt aXmdId );

        /**
         * Performs the 2nd phase of construction.
         *
         * @param aXmdId, xdm settings id
         * @param aLocalMode, clinet localmode state
         */   
        void ConstructL( const TInt aXmdId, TBool aLocalMode );
    
    private: // own functions
    
        /**
         * GetRulesL
         *
         * @since S60 3.2
         * @param aRuleArray, rule array
         * @return TBool, rules found
         */        
        CXdmDocumentNode* GetRulesL( const TDesC& aRule,
            RPointerArray<CXdmDocumentNode>& aRuleArray );
    
        /**
         * Remove rule group from pres-rules document
         *
         * @since S60 3.2
         * @param aRule, presence rule name
         * @return none
         */
        void RemoveRuleGroupL( const TDesC& aRule );
        
        /**
         * Search list under parent
         *
         * @since S60 3.2        
         * @param aParent. document node
         * @param aName, name of search
         * @return none
         */        
        CXdmDocumentNode* SearchListUnderParentL(
            CXdmDocumentNode* aParent,
            const TDesC& aName );
    
        /**
         * Create root if need
         *
         * @since S60 3.2
         * @param none
         * @return none
         */
        void CreateRootIfNeededL();
       
        static void ResetAndDestroy1( TAny* aPointerArray );
        static void ResetAndDestroy2( TAny* aPointerArray );
        
        /**
         * Find rule from presrules xml
         *
         * @since S60 3.2
         * @param aRule, rule name
         * @return TBool
         */
        TBool FindRuleL( const TDesC& aRule, TBool aCreateRule );
               
        /**
         * Check if one already exist
         *
         * @since S60 3.2
         * @param aList, listname
         * @param aUri, entity url
         * @return TBool
         */
        TBool CheckIfOneExistL(
            const TDesC& aRule,
            const TDesC& aUri );
        
        /**
         * Compare uri to attribute without prefix. Returns ETrue if match.
         *
         * @since S60 5.0
         * @param aUri, entity url
         * @parram aAttribute url attribute
         * @return TBool
         */
        TBool CompareUriWithoutPrefixL( 
            const TDesC& aUri, const TDesC& aAttribute );
                
    protected: // from base class CActive

        /**
         * Defined in a base class
         */
        void RunL();

        /**
         * Defined in a base class
         */
        TInt RunError( TInt aError );

        /**
         * Defined in a base class
         */
        void DoCancel();

    private: // Data
        
        /**
         * XDM Engine
         * Own.
         */
        CXdmEngine* iXdmEngine;
        
        /**
         * XDM Settings id
         * Own.        
         */
        TInt iSettingsId;
        
        /**
         * Presence rules document
         * Own
         */
        CXdmDocument* iPresRulesDoc;
        
        /**
         * Current state
         * Own.
         */
        TPluginPresRulesXdmState iXdmState;
        
        /**
         * TPluginPresRulesUpdateState
         * Own.
         */
        TPluginPresRulesUpdateState iRulesUpdateState;
         
        /**
         * client statutus.
         * Not own.
         */
        TRequestStatus* iClientStatus;
        
        /**
         * Whether Presence XDM is up-to-date
         * Own.
         */
        TBool iPresXdmOk;
       
        /**
         * Entity uri
         * own
         */
        HBufC*  iEntityUri;
        
        /**
         * Async request
         * Own. 
         */
        TPluginPresRulesXdmOperation iAsyncReq;
        
        /**
         * Async handler
         * Own.
         */
        MPresRulesAsyncHandler* iAsyncHandler;
        
        SIMPLE_UNIT_TEST( T_CPresencePluginXdmPresRules )
    };

#endif // CPRESENCEPLUGINXDMPRESRULES_H