simpledatamodeladapter/inc/presencepluginxdmutils.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 19 Aug 2010 10:19:02 +0300
branchRCL_3
changeset 31 2580314736af
parent 0 c8caa15ef882
child 12 e6a66db4e9d0
permissions -rw-r--r--
Revision: 201027 Kit: 201033

/*
* Copyright (c) 2006-2010 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 CPRESENCEPLUGINXDMUTILS_H
#define CPRESENCEPLUGINXDMUTILS_H

#include <e32base.h>
#include <ximpbase.h>
#include <protocolpresenceauthorization.h>
#include "presenceplugincommon.h"
#include "mpresrulesasynchandler.h"
#include "presencelogger.h"
#include "presenceplugincontactsobs.h"

class CPresencePluginXdmPresRules;
class TXIMPRequestId;
class MXIMPIdentity;
class MXIMPObjectCollection;
class CXdmEngine;
class CXdmDocument;
class CXdmDocumentNode;
class TRequestStatus;
class MPresencePluginConnectionObs;

/**
 * CPresencePluginXdmUtils
 *
 * Simple Engine Connection
 *
 * @lib presenceplugin.dll
 * @since S60 v3.2
 */
NONSHARABLE_CLASS( CPresencePluginXdmUtils ) : public CActive,
    public MPresRulesAsyncHandler,
    public MPresencePluginContactsObs
    {
    public: // Constructor and destructor

        /**
         * Active object asynch states
         */
        enum TPluginXdmState
            {
            EStateIdle,
            /** Get XDM lists 1*/
            EGetXdmLists,
            /** Create XDM lists */
            ECreateXdmLists,
            /** Get XDM lists only, no rules later */
            EGetXdmListsOnly,
            /** Create XDM lists only, no rules later */
            ECreateXdmListsOnly,        
            /** Get RLS service */
            EGetRlsServices,
            /** Create RLS service */
            ECreateRlsServices,
            /** Update RLS service */
            EUpdateRlsServices,
            /** Get rules from server for GrantPresenceForPresentity */
            EGetXdmRules,
            /** Update rules to server for GrantPresenceForPresentity */
            EUpdateXdmRules,
            /** Update XDM List */
            EUpdateXdmList,
            /** Cancel XDM document operation */
            ECancelDocument,
            /** Get Block list */
            EGetXdmBlockList,
            /** Create presence rules */
            ECreateXdmRules,
            /** Subscripe block list */
            ESubsBlockList,
            EGetResourceListFromServer,
            EUpdateBlockedContactPresenceCache
            };

        /**
         * Current operation
         */
        enum TPluginXdmOperation
            {
            ENoOperation,
            EXdmInit,   
            EXdmDeleteAll,
            EXdmCancel,
            EXdmAddUserToGroup,
            EXdmAddGroupToGroup,
            EXdmRemoveUserFromGroup,
            EXdmRemoveGroupFromGroup,
            EXdmGrantForAll,
            EXdmWithdrawFromAll,
            EXdmGetBlockedList,
            EXdmCreateGroup,
            EXdmDeleteGroup,
            EXdmRlsFetch,
            EXdmRlsAdd,
            EXdmRlsRemove,
            EXdmCommitXdm,
            EXdmCommitRls,
            EXdmGetBuddyList,
            EXdmAddUserToRules,
            EXdmRemoveUserFromRules
            };

        /**
         * Operation state for rules update
         */
        enum TPluginPresRulesState
            {
            EStateNoOperation,
            EStateAddToWhiteList,
            EStateAddToBlockList,
            EStateRemoveFromWhiteList,
            EStateRemoveFromBlackList,
            EStateInitializeRules
            };
            
        /**
         * NewL
         * @param aObs callback for complete requests
         * @param aXdmId XDm settings id
         */
        static CPresencePluginXdmUtils* NewL(
            MPresencePluginConnectionObs& aObs,
            TInt aXmdId,
            TBool aLocalMode );

        virtual ~CPresencePluginXdmUtils();

        /**
         * Initialize XDMS and Presence XDM structures in network
         *
         * @since S60 3.2
         * @param aStatus Request status of the caller
         */
        void InitializeXdmL( TRequestStatus& aStatus );
        
        /**
         * Initialize XDMS in network
         *
         * @since S60 3.2
         * @param aStatus Request status of the caller
         */
        void InitializeXdmsOnlyL( TRequestStatus& aStatus );    

        /**
         * Initialize Presence rules document only
         *
         * @since S60 3.2        
         * @param aStatus Request status of the caller
         */
        void InitializePresRulesL( );

        /**
         * Add entity to granted list
         *
         * @since S60 3.2        
         * @param aUri, entity URL
         * @param aStatus, request status
         * @return none
         */
        void AddEntityToGrantedL( 
            const TDesC&  aUri,
            TRequestStatus& aStatus );
         
        /**
         * Remove entity from granted list
         *
         * @since S60 3.2        
         * @param aUri, entity URL
         * @param aStatus, request status
         * @return none
         */
        void RemoveEntityFromGrantedL( 
            const TDesC&  aUri,
            TRequestStatus& aStatus );

        /**
         * Remove entity from blocked list
         *
         * @since S60 3.2        
         * @param aName, entity URL
         * @param aStatus, request status
         * @return none
         */
        void RemoveEntityFromBlockedL( 
            const TDesC&  aName,
            TRequestStatus& aStatus );
        
        /**
         * Add entity to blocked list
         *
         * @since S60 3.2        
         * @param aUri, entity URL
         * @param aStatus, request status
         * @return none
         */
        void AddEntityToBlockedL( 
            const TDesC&  aUri,
            TRequestStatus& aStatus );
    
        /**
         * Get (subscribe) Block List
         *
         * @since S60 3.2        
         * @param aMembers, member list array
         * @return none
         */
        void SubscribeBlockListL( RPointerArray<MXIMPIdentity>& aMembers );

        /**
         * Get (subscribe) Buddy List
         *
         * @since S60 3.2        
         * @param aMembers, member list array
         * @return none
         */
        void SubscribeBuddyListL( RPointerArray<MXIMPIdentity>& aMembers );
        
        /**
         * GetUserListsL
         *
         * @since S60 3.2
         * @param aList, List name
         * @param aColl, XIMP object collection        
         */
        void GetEntitiesInListL(
            const TDesC&  aList, MXIMPObjectCollection& aColl );
        
        /**
         * Add identity to virtual list
         *
         * @since S60 3.2
         * @param aList, List name
         */
        void AddIdentityToVirtualListL(
            const TDesC&  aList );
        
       /**
        * CheckXdmDoc
        *
        * @since S60 3.2
        * @param none
        * @return TBool, state of xdm documents        
        */    
       TBool CheckXdmDoc();
    
    public: //From assync
        
        /**
         * Defined in a base class
         */
        void HandlePresUpdateDocumentL( TInt aErrorCode );
        
        /**
         * Defined in a base class
         */
        void HandlePresUpdateCancelL( TInt aErrorCode );
   
    private:
    
        /**
         * Standard C++ constructor
         *
         * @param aObs, plugin connection observer
         * @param aXmdId, XDM settings id 
         */ 
        CPresencePluginXdmUtils( 
        		MPresencePluginConnectionObs& aObs,
        		TInt aXmdId,
        		TBool aLocalmode );

        /**
         * Performs the 2nd phase of construction.
         */ 
        void ConstructL( );

    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();

    protected: // from MPresencePluginContactsObs

        /**
         * Defined in a base class
         */
        void RequestComplete( TAny* aResult,
            TPresenceContactsOperation aOperation, TInt aError );

    private:
    
        /**
         * DoUpdateXdmLists
         *
         * @since S60 3.2
         * @param aMyStatus, RunL status
         * @return aOrigState, xdm state
         */    
        void DoUpdateXdmListsL( TInt aMyStatus,
            TPluginXdmState aOrigState );
                
        /**
         * DoGetXdmLists
         *
         * @since S60 3.2
         * @param aMyStatus, RunL status
         * @return aOrigState, xdm state
         */    
        void DoGetXdmListsL( TInt aMyStatus,
            TPluginXdmState aOrigState );

        /**
         * DoCreateXdmLists
         *
         * @since S60 3.2
         * @param aMyStatus, RunL status
         * @return aOrigState, xdm state
         */    
        void DoCreateXdmListsL( TInt aMyStatus,
            TPluginXdmState aOrigState,
            TBool aOnlyResourceList );
               
        /**
         * Search list under parent
         *
         * @since S60 3.2        
         * @param none
         * @return none
         */
        CXdmDocumentNode* SearchListUnderParentL(
            CXdmDocumentNode* aParent,
            const TDesC& aName );

        /**
         * Complete client request
         *
         * @since S60 3.2
         * @param aStatus, client status
         * @return none
         */    
        void CompleteClientReq( TInt aStatus );

        /**
         * Get XDM lists
         *
         * @since S60 3.2
         * @param aCreateRules, create new rule document
         * @param aLocalMode, use localmode
         * @return none
         */
        void GetXdmListsL( TBool aCreateRules, TBool aLocalMode );

        /**
         * Create XDM list document model
         *
         * @since S60 3.2
         * @param aCreateRules, create new rule document
         * @return none
         */
        void CreateXdmListsL( TBool aCreateRules );

        /**
         * Update document to server
         *
         * @since S60 3.2
         * @param none
         * @return none
         */
        void UpdateXdmToServerL();
          
        /**
         * Updates XDMS reource lists into server
         *
         * @since S60 3.2
         * @param none
         * @return none
         */  
        void UpdateXdmsL();
        
        /**
         * Updates XDM rules
         *
         * @since S60 3.2
         * @param none
         * @return none
         */        
        void UpdateXdmRulesL();
        
        /**
         * Get XDM rules
         *
         * @since S60 3.2
         * @param none
         * @return none
         */         
        void GetXdmRulesL();
                 
        /**
         * Handle presence document 
         *
         * @since S60 3.2        
         * @param aList, list name
         * @param aUser, entity name
         * @return none
         */
        void DoHandlePresUpdateDocumentL( TInt aErrorCode );

        /**
         * Add User to resource list
         *
         * @since S60 3.2
         * @param aList, list name
         * @param aName, url         
         */
        void DoAddUserToListL(
            const TDesC& aList,
            const TDesC&  aName );
        
        /**
         * Remove user from list
         *
         * @since S60 3.2
         * @param aList, list name
         * @param aUser, entity name
         * @return none
         */
        void DoRemoveUserFromListL(
            const TDesC& aList,
            const TDesC&  aName );

        /**
         * Get member list
         *
         * @since S60 3.2
         * @param aList, list name
         * @param aMembers, member array
         * @return none
         */
        void DoGetListMembersL(
            const TDesC& aList,
            RPointerArray<MXIMPIdentity>& aMembers  );

        /**
         * Get buddy list
         *
         * @since S60 3.2
         * @param aList, list name
         * @return XDM document
         */
        CXdmDocumentNode* DoGetBuddyListL( const TDesC& aParent);

        /**
         * Get buddy list
         *
         * @since S60 3.2
         * @param aList, list name
         * @parma aBuddyList, xdm document node
         * @return XDM document
         */
        CXdmDocumentNode* DoGetUserListL(
            const TDesC& aList,
            CXdmDocumentNode* aBuddyList );
        
        /**
         * Check XDM errors
         *
         * @since S60 3.2
         * @param aMyStatus, XDM error code
         * @return errorcode
         */    
        TInt CheckIfErrorL( TInt aMyStatus );

        /**
         * Check if entity already exist
         *
         * @since S60 3.2
         * @param aList, listname
         * @param aUri, entity url
         * @return TBool
         */
        TBool CheckIfEnityExistL( const TDesC& aList, const TDesC&  aUri );
        
        /**
         * Update document from server
         *
         * @since S60 3.2
         * @param none
         * @return none
         */
        void UpdateFromServerL();
        
        /**
         * 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 );
        
        /**
         * Update blocked contact status to Presence Cache
         *
         * @since S60 5.0
         * @param aMyStatus, error status
         */
        void DoUpdateBlockedContactPresenceCacheL(
            TInt aMyStatus );

    private: // Data

        /**
         * ximp Plugin connection observer
         * Own.
         */
        MPresencePluginConnectionObs& iConnObs;

        /**
         * XDM Settings id
         * Own.
         */
        TInt iSettingsId;

        /**
         * ximp request id
         * Own.         
         */
        TXIMPRequestId iximpId;

        /**
         * ximp request id for own requests
         * Own.         
         */
        TXIMPRequestId iximpIdOwn;

        /**
         * Simple Engine request id
         * Own.         
         */
        TInt iSimpleId;

        /**
         * XDM Engine
         * Own.
         */
        CXdmEngine* iXdmEngine;

        /**
         * XDM document for resource-lists
         * Own.
         */
        CXdmDocument* iXdmDoc;
       
        /**
         * Current state
         * Own.         
         */
        TPluginXdmState iXdmState;
         
        /**
         * Current operation
         * Own.         
         */
        TPluginXdmOperation iOperation;

        /**
         * Whether Presence XDM is up-to-date
         * Own.         
         */
        TBool iPresXdmOk;

        /**
         * Whether XDM is up-to-date
         * Own.         
         */
        TBool iXdmOk;

        /**
         * client statutus.
         * Not own.
         */
        TRequestStatus* iClientStatus;
           
        /**
         * XDM presence rules handling
         * own.
         */
        CPresencePluginXdmPresRules*  iXdmPresRules;
        
        /**
         * Entity uri
         * Own.         
         */
        HBufC* iEntityUri;
        
        /**
         * TPluginPresRulesUpdateState
         * Own.         
         */
        TPluginPresRulesState iRulesUpdateState;
        
        /**
         * XDM localmode
         * Own.         
         */
        TBool iLocalMode;
        
        /**
         * Request results.
         * Is contact blocked request
         */
        TBool iPresenceContactsAsyncReqResult;

        /*
         * Initial blocked contact list
         */
        RPointerArray<HBufC> iBlockedContacts;

        SIMPLE_UNIT_TEST( T_CPresencePluginGroups )
        SIMPLE_UNIT_TEST( T_CPresencePluginWatcher )
        SIMPLE_UNIT_TEST( T_CPresencePluginAuthorization )
        SIMPLE_UNIT_TEST( T_CPresencePluginXdmUtils )
    };

#endif // CPRESENCEPLUGINXDMUTILS_H