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

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




#ifndef CSIMPLEPLUGINXDMUTILS_H
#define CSIMPLEPLUGINXDMUTILS_H

#include <e32std.h>

#include <badesca.h>

#include <mrlspresxdmasynchandler.h>

#include "simpleplugincommon.h"

// Test suite
class MSimplePluginTestObs;

class MSimplePluginSettings;

class CPresenceXDM;
class CRLSXDM;
class CXdmEngine;
class CXdmDocument;
class CXdmDocumentNode;

class TPresenceActionXDM;
class TPresenceTransformXDM;
class TPresCondMisc;


// notice: class CPtrCArray;  after PrFw headers fixed.

class TRequestStatus;


/**
 * CSimplePluginXdmUtils
 *
 * Simple Engine Connection
 *
 * @lib ?library
 * @since s60 v5.0
 */
NONSHARABLE_CLASS( CSimplePluginXdmUtils ) : public CActive,
    public MRLSPresXDMAsyncHandler
    {
public:


    /**
     * Active object asynch states
     */
    enum TPluginXdmState
        {
        EStateIdle,
        /** Get OMA XDM lists */
        EGetXdmOMALists,
        /** Create OMA XDM lists */
        ECreateXdmOMALists,
        /** Get OMA XDM lists only, no rules later */
        EGetXdmOMAListsOnly,
        /** Create OMA XDM lists only, no rules later */
        ECreateXdmOMAListsOnly,
        /** Get RLS service */
        EGetRlsServices,
        /** Update RLS service */
        EUpdateRlsServices,
        /** Get rules from server for GrantPresenceForPresentity */
        EGetXdmRules,
        /** Update rules to server for GrantPresenceForPresentity */
        EUpdateXdmRules,
        /** Update XDM OMA List */
        EUpdateXdmOMAList,
        /** Cancel XDM document operation */
        ECancelDocument,
        /** Re-Update RLS service - 409 HTTP error handling*/
        EReUpdateRlsServices        
        };

    /**
     * Current operation
     */
    enum TPluginXdmOperation
        {
        ENoOperation,
        EXdmInit,
        EXdmInitXdmsOnly,
        EXdmDeleteAll,
        EXdmCancel,
        EXdmAddUserToGroup,
        EXdmAddGroupToGroup,
        EXdmRemoveUserFromGroup,
        EXdmRemoveGroupFromGroup,
        EXdmGrantForAll,
        EXdmWithdrawFromAll,
        EXdmGetBlockedList,
        EXdmCreateGroup,
        EXdmDeleteGroup,
        EXdmRlsFetch,
        EXdmRlsAdd,
        EXdmRlsRemove,
        EXdmGrantGroup,
        EXdmWithdrawGroup,
        EXdmSetReactiveAuth,
        EXdmSetProactiveAuth
        };
               

    /**
     * Constructor.
     * @param aConnSets connection settings
     * @param aXdmId XDm settings id
     */
    static CSimplePluginXdmUtils* NewL(
        MSimplePluginSettings& aConnSets,
        TInt aXdmId);

    virtual ~CSimplePluginXdmUtils();
    
    /**
     * Cancel non active wrappers
     */
    void CancelWrappers();
     
    /**
     * Initialize XDMS and Presence XDM structures in network.
     * @param aStatus Request status of the caller
     */
    void InitializeXdmL( TRequestStatus& aStatus );

    /**
     * Initialize XDMS in network
     * @param aStatus Request status of the caller
     */
    void InitializeXdmsOnlyL( TRequestStatus& aStatus );

    /**
     * Add resource-list into RLS document, overwrite old document
     * @param aStatus Request status of the caller
     */
    void FetchRlsL( TRequestStatus& aStatus );

    /**
     * Add resource-list into RLS document.
     * FetchRlsL must be called before this method.
     * @param aName list name
     */
    void AddRlsGroupL(
        const TDesC& aName );

    /**
     * Remove resource-list in RLS document
     * FetchRlsL must be called before this method.
     * Use RemoveRlsServiceByResourceListL instead when possible.      
     * @param aName list name
     */
    void RemoveRlsGroupL( const TDesC& aName );
    
    /**
     * Remove service URI in RLS document by corresponding shared XDM document entry.
     * The document in the server is updated when needed.
     * FetchRlsL must be called before this method.
     * This completes without error if the service was not found. 
     * @param aGroup user's group name, that's converted to resource-list value and used
     * to match the service resource-list in the rls-services document.
     * @param aStatus Request status of the caller.     
     */
    void RemoveRlsServiceByResourceListL( const TDesC& aGroup, TRequestStatus& aStatus  );    
    
    
    /**
     * Access service URI in RLS document by corresponding shared XDM document entry.
     * FetchRlsL must be called before this method.
     * Leaves with KErrNotFound if RLS service is not found.
     * @param aGroup user's group name, that's converted to resource-list value and used
     * to match the service resource-list in the rls-services document.
     * @return Access service URI in RLS document, ownership is transferred. May be NULL.
     */
    HBufC* RlsServiceByResourceListLC( const TDesC& aGroup );     

    /**
     * Add entity to granted list.
     * InitializeXdmL must be called before this method.
     * @param aUri entity URI to be granted
     * @param aStatus Request status of the caller
     */
    void AddEntityToGrantedL( const TDesC& aUri, TRequestStatus& aStatus );

    /**
     * Remove entity from granted list.
     * InitializeXdmL must be called before this method.
     * @param aUri entity URI to be removed
     * @param aStatus Request status of the caller
     */
    void RemoveEntityFromGrantedL(
        const TDesC&  aUri, TRequestStatus& aStatus );

    /**
     * Add entity to blocked list.
     * InitializeXdmL must be called before this method.
     * @param aUri entity URI to be blocked
     * @param aStatus Request status of the caller
     */
    void AddEntityToBlockedL( const TDesC& aUri, TRequestStatus& aStatus );

    /**
     * Remove entity from blocked list.
     * InitializeXdmL must be called before this method.
     * @param aUri entity URI to be removed
     * @param aStatus Request status of the caller
     */
    void RemoveEntityFromBlockedL(
        const TDesC&  aUri, TRequestStatus& aStatus );

    /**
     * Add group to granted.
     * InitializeXdmL must be called before this method.
     * @param aName a group to be granted
     * @param aStatus Request status of the caller
     */
    void AddGroupToGrantedL( const TDesC& aName, TRequestStatus& aStatus );

    /**
     * Remove group from granted list.
     * InitializeXdmL must be called before this method.
     * @param aName a group to be removed from granted list
     * @param aStatus Request status of the caller
     */
    void RemoveGroupFromGrantedL(
        const TDesC&  aName, TRequestStatus& aStatus );

    /**
     * Grant right for everyone, proactive authorization is set on.
     * InitializeXdmL must be called before this method.
     * @param aStatus Request status of the caller
     */
    void GrantForEveryoneL( TRequestStatus& aStatus );

    /**
     * Withdraw right from eveyone, reactive authorization is set on.
     * InitializeXdmL must be called before this method.
     * @param aStatus Request status of the caller
     */
    void WithdrawFromEveryoneL( TRequestStatus& aStatus );
    
    /**
     * Set reactive authorization policy.
     * Default rule is set to CONFIRM.
     */
    void SetReactiveAuthL( TRequestStatus& aStatus ); 
    
    /**
     * Set proactive authorization policy.
     * Default rule is set to ALLOW if it was CONFIRM.
     */
    void SetProactiveAuthL( TRequestStatus& aStatus );      

    /**
     * Get (subscribe) Block List.
     * InitializeXdmL must be called before this method.
     * @param aMembers blocked users [OUT].
     */
    void SubscribeBlockListL( CPtrCArray& aMembers );

    /**
     * Unsubscribe Block List.
     * @param aStatus Request status of the caller
     */
    void UnsubscribeBlockListL( TRequestStatus& aStatus );

    /**
     * Create entity's own group
     * InitializeXdmL or InitilaizeXdmsOnlyL must be called before this method.
     * @param aName group name
     * @param aDisplayName group's display name
     */
    void CreateEntityGroupL(
        const TDesC&  aName,
        const TDesC&  aDisplayName );

    /**
     * Delete entity's own group
     * InitializeXdmL or InitilaizeXdmsOnlyL must be called before this method.
     */
    void DeleteEntityGroupL( const TDesC&  aName );

    /**
     * Add group member
     * InitializeXdmL or InitilaizeXdmsOnlyL must be called before this method.
     * @param aGroup group name
     * @param aUser member
     * @param aDispName display name
     * @param aStatus Request status of the caller
     */
    void AddPresentityGroupMemberL(
        const TDesC&  aGroup,
        const TDesC&  aUser,
        const TDesC&  aDispName,
        TRequestStatus& aStatus );

    /**
     * Remove group member
     * InitializeXdmL or InitilaizeXdmsOnlyL must be called before this method.
     * @param aGroup group name
     * @param aUser member
     * @param aStatus Request status of the caller
     */
    void RemovePresentityGroupMemberL(
        const TDesC&  aGroup,
        const TDesC&  aUser,
        TRequestStatus& aStatus );

    /**
     * GetUserListsL
     * InitializeXdmL or InitilaizeXdmsOnlyL must be called before this method.
     * The size of the parameter arrays are same.
     * @param aIds sip id array [OUT]
     * @param aDispNames display name array [OUT]
     */
    void GetUserListsL( CDesCArrayFlat& aIds, CDesCArrayFlat& aDispNames );

    /**
     * GetEntitiesInListL
     * InitializeXdmL or InitilaizeXdmsOnlyL must be called before this method.
     * The size of the parameter arrays are same.
     * @param aList naem of the user's list [IN]
     * @param aIds sip id array [OUT]
     * @param aDispNames display name array [OUT]
     */
    void GetEntitiesInListL(
        const TDesC&  aList, CPtrCArray& aIds, CPtrCArray& aDispNames);

    /**
     * Updates XDM reource lists into server
     * @param aStatus Request status of the caller
     */
    void CommitXdmL( TRequestStatus& aStatus );

    /**
     * Updates RLS reource lists into server
     * @param aStatus Request status of the caller
     */
    void CommitRlsL( TRequestStatus& aStatus );

    /**
     * Test Suite setter
     * @param aObs test observer, may be NULL
     */
    void SetTestObserver( MSimplePluginTestObs* aObs );

    /**
     * Generate RLS document URI based on URI template located in CentRep variation definition.
     * @param aGroup grouup name
     * @param aPresentityUri presntity's URI, may be SIP or TEL URI. Domain part is stripped from SIP URI.
     * @param aDomain domain part of the URI,  
                      Leading '@' is stripped off and it must be hard coded in a template when needed.
     * @return RLS document URI     
     */
    HBufC16* CreateRlsDocumentUri16LC(
        const TDesC16& aGroup,
        const TDesC16& aPresentityUri,
        const TDesC16& aDomain );                

private:

    CSimplePluginXdmUtils(
        MSimplePluginSettings& aObs, TInt aXdmId );

    void ConstructL( );

  TBool DoesUserListExistsL( const TDesC& aName );


public:

// from base class MRLSPresXDMAsyncHandler

    /**
     * Defined in a base class
     */
    void HandleRLSUpdateDocumentL(TInt aErrorCode);

    /**
     * Defined in a base class
     */
    void HandleRLSUpdateCancelL(TInt aErrorCode);

    /**
     * Defined in a base class
     */
    void HandleRLSDeleteAllEmptyListsL(TInt aErrorCode);

    /**
     * Defined in a base class
     */
    void HandlePresUpdateDocumentL(TInt aErrorCode);

    /**
     * Defined in a base class
     */
    void HandlePresUpdateCancelL(TInt aErrorCode);



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:

    /**
     * Complete client request
     * @param aStatus return code
     */
    void CompleteClientReq( TInt aStatus );

    /**
     * Get XDm OMA lists from a server
     */
    void GetXdmOMAListsL();

    /**
     * Create OMA Shared Xdm Lists when needed.
     * @return true if a list is created.
     */
    TBool CreateXdmOMAListsIfNeededL( );

    /**
     * Create a specified OMA Shared Xdm List when needed.
     *
     * @param aRoot parent for the new list
     * @param aName name for the new list
     * Leave with KErrAlreadyExists if all the lists already exist.
     * @return true is list was added into root node.
     */
    TBool CreateXdmOMAListIfNeededL( CXdmDocumentNode* aRoot, const TDesC& aName );

    /**
     * Create Resource List in shared xdm document
     * @param aParent parent for the new list
     * @param aName name for the new list
     */
    void CreateResourceListL(
        CXdmDocumentNode* aParent, const TDesC& aName );

    /**
     * Search List under a parent list, one level only
     * @param aParent parent list node
     * @param aName list to be searched for
     * @return child node found or NULL if not found.
     */
    CXdmDocumentNode* SearchListUnderParentL(
        CXdmDocumentNode* aParent, const TDesC& aName );

    void GetXdmRulesL();

    /**
     * Make Rls list URI
     * @param aXCapUri XCAP URI
     * @param aListName a list to be referred
     * @return URI, ownerhisp is transferred
     */
    HBufC* MakeRlsUriL(
        const TDesC& aXcapUri, const TDesC& aListName );

    /**
     * Make Rls list URI
     * @param aXCapUri XCAP URI
     * @param aListName a list to be referred
     * @return URI, ownerhisp is transferred
     */
    HBufC* MakeRlsBuddyUriL(
        const TDesC& aXcapUri, const TDesC& aListName );

    void MakeInitialXdmsDocumentL();

    /**
     * Updates XDM rules into server
     */
    void UpdateXdmRulesL();

    /**
     * Updates XDMS reource lists into server
     */
    void UpdateXdmsL();

    /**
     * Updates RLS document into server
     */
    void UpdateRlsL();

    /**
     * Handles pres auth rules document callback method
     * @param aErrorCode returned error code
     */
    void DoHandlePresUpdateDocumentL( TInt aErrorCode );
    
    /**
     * Handles RLS document callback method
     * @param aErrorCode returned error code
     */
    void DoHandleRLSUpdateDocumentL(TInt aErrorCode);    

    void DoAddUserToListL(
        const TDesC& aList, const TDesC&  aName );

    void DoAddUserToUserListL(
        const TDesC& aList, const TDesC&  aUser, const TDesC&  aDispName );

    void DoAddListIntoGrantRuleL( const TDesC& aListUri );

    void DoRemoveListFromGrantRuleL( const TDesC& aListUri );

    void DoRemoveUserFromListL(
        const TDesC& aList, const TDesC&  aName );

    void DoRemoveUserFromUserListL( const TDesC& aList, const TDesC&  aUser );

    void DoGrantForAllL();

    void DoWithdrawFromAllL();
    
    void DoSetReactiveAuthL(); 
    
    /**
     * Set Proactive authorization
     */
    void DoSetProactiveAuthL();        

    void DoGetListMembersL(
        const TDesC& aList, CPtrCArray& aMembers  );

    void DoCreateEntityGroupL( const TDesC& aList, const TDesC& aDisName  );

    void DoDeleteEntityGroupL( const TDesC& aList );

    /**
     * Search OMA Buddy List
     * Leaves with KErrNotFound if not found
     * @return list node
     */
    CXdmDocumentNode* DoGetBuddyListL();

    /**
     * Search a specific user XDM list
     * Leaves with KErrNotFound if not found
     * @param aList list name
     * @param aBuddyList parent buddy list
     * @return list node
     */
    CXdmDocumentNode* DoGetUserListL(
        const TDesC& aList, CXdmDocumentNode* aBuddyList );
        
    /**
     * Remove service URI in RLS document by corresponding shared XDM document entry.
     * FetchRlsL must be called before this method.
     * @param aResourceList resource-list entry value, a reference to Shared XDM document.
     * @return ETrue if service is found and removed.
     */
    TBool DoRemoveRlsServiceByResourceListL( const TDesC& aResourceList ); 
    
    /**
     * Access service URI in RLS document by corresponding shared XDM document entry.
     * FetchRlsL must be called before this method.
     * @param aResourceList resource-list entry value, a reference to Shared XDM document.
     * @return service URI, ownership is transferred.
     */
    HBufC* DoGetRlsServiceByResourceListL( const TDesC& aResourceList );  
    
    /**
     * Accesor for iAuxBuffer that contains last negotiated RLS service URI
     * @return buffer content
     */    
    TPtrC AuxBuffer(); 
    
    /**
     * Run next XDM routines
     * @param aOrigState original XDM state
     * @param aStatus error status
     */
    void DoXdmRunL( TPluginXdmState aOrigState, TInt aStatus ); 
    
    /**
     * Handle RLS service URI negatioation
     */
    void RlsServiceUriNegotiationL();
    
    /**
     * Make default auth rule
     * @param aRuleId Rule id
     * @param aAction action class initialized
     * @param aTransform transform class initialized
     */
    void MakeDefaultRuleL( 
        TDes& aRuleId, 
        TPresenceActionXDM& aAction, 
        TPresenceTransformXDM& aTransform,
        TPresCondMisc& aMisc );
      
    /**
     * Replace Group tag in URI
     * @param aBuf URI buffer [IN,OUT]
     * @param aGroup Group name
     */         
    static void ReplaceGroupTag( HBufC16* aBuf, const TDesC16& aGroup );
        
    /**
     * Replace Domain tag in URI
     * @param aBuf URI buffer [IN,OUT]
     * @param aDomain Domain value
     */          
    static void ReplaceDomainTag( HBufC16* aBuf, const TDesC16& aDomain );
        
    /**
     * Replace User tag in URI
     * @param aBuf URI buffer [IN,OUT]
     * @param aPresentityUri User URI value
     */    
    static void ReplaceUserTag( 
        HBufC16* aBuf, const TDesC16& aPresentityUri );


private: // Data

    /**
     * PrFw Plugin connection observer
     */
    MSimplePluginSettings& iConnSets;

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

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

    /**
     * Subscribed items. Bitmask.
     */
    TUint iSubscribed;

    /**
     * Presence XDM Client
     * Own.
     */
    CPresenceXDM* iPresenceXdm;

    /**
     * RlsXDM Client
     * Own.
     */
    CRLSXDM* iRlsXdm;

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

    /**
     * XDM document for resource-lists
     * Own.
     */
    CXdmDocument* iXdmDoc;

    /**
     * Current state
     */
    TPluginXdmState iXdmState;

    /**
     * Current operation
     */
    TPluginXdmOperation iOperation;

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

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

    /**
     * client statutus.
     * Not own.
     */
    TRequestStatus* iClientStatus;

    /**
     * Test suite observer
     * Not own.
     */
    MSimplePluginTestObs* iTestObs;
    
    /**
     * Auxiliary buffer for for Negotiated RLS service URI
     */
    HBufC* iAuxBuffer;
    
    /**
     * Auxiliary buffer for for Negotiated RLS service URI
     */
    HBufC* iAuxBuffer2;    
         
    };



#endif // CSimplePluginXdmUtils_H