ximpfw/core/srcprocessor/ximphostimp.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:27:45 +0100
branchRCL_3
changeset 22 113b91e0a2ad
parent 21 cfd5c2994f10
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* 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:  Presence connection host
 *
*/

#ifndef CPSCHOSTIMP_H
#define CPSCHOSTIMP_H

#include <e32base.h>
#include <ximpprotocolconnectionhost.h>
#include <ximpcontext.h>

#include "ximpapiobjbase.h"
#include "ximphost.h"
#include "ximpoperationdefs.h"
#include "ximprequestidbuilder.h"


class CXIMPOperationBase;
class CXIMPEventManager;
class MXIMPObjectFactory;
class CXIMPObjectFactoryImp;
class CXIMPPscContext;
class MPresenceDataCache;
class CPresenceDataCache;
class CXIMPContextStateEventImp;
class CPeriodic;
class MXIMPProtocolConnection;
class CProtocolPresenceAuthorizationDataHostImp;
class MProtocolPresenceAuthorizationDataHost;
class CProtocolPresencePublishingDataHostImp;
class MProtocolPresencePublishingDataHost;
class CProtocolPresenceWatchingDataHostImp;
class MProtocolPresenceWatchingDataHost;
class CProtocolPresentityGroupsDataHostImp;
class MProtocolPresentityGroupsDataHost;
class CXIMPRestrictedCollectionImp;
class CXIMPProtocolRequestCompleteEventImp;
class MProtocolPresenceDataHost;
class CProtocolPresenceDataHostImp;
class MProtocolDataHost;


/**
 * Presence connection host.
 *
 * @lib ximpprocessor.lib
 * @since S60 v3.2
 */
class CXIMPHost : public CXIMPApiObjBase,
                 public MXIMPProtocolConnectionHost,
                 public MXIMPHost

    {
public:
    /** The class ID. */
    enum { KClassId = XIMPIMP_CLSID_CXIMPPSCHOST };

public:

    IMPORT_C static CXIMPHost* NewLC( MXIMPProtocolConnection& aConnection, TInt32 aProtocolUid );

    /**
     * Mark a reference to this object.
     */
    void Open();

    /**
     * Remove a reference to this object.
     * Once all references are removed, the class destroys itself.
     */
    void Close();

protected:

    /**
     * Reference counted. Use Close to remove a reference, and Open to open it.
     * Can't be CObject-derived, since already derives from another C-class.
     */
    virtual ~CXIMPHost();

    CXIMPHost( MXIMPProtocolConnection& aConnection, TInt32 aProtocolUid );
    void ConstructL();

public: // From MXIMPBase

    /**
     * Implementation of MXIMPBase interface methods
     * @see MXIMPBase
     */
    XIMPIMP_DECLARE_IF_BASE_METHODS


public: // From MXIMPProtocolConnectionHost

    void HandleRequestCompleted( TXIMPRequestId aReqId, TInt aResultCode );
    void HandleRequestCompleted( TXIMPRequestId aReqId, MXIMPStatus* aResult );
    void HandleRequestCompleted( TXIMPRequestId aReqId,
                                 MXIMPStatus* aResult,
                                 MXIMPBase* aParameter );
    TXIMPRequestId HandleConnectionTerminated( MXIMPStatus* aReason );
    MXIMPObjectFactory& ObjectFactory();
    MProtocolPresenceDataHost& ProtocolPresenceDataHost();
    

   
    void RegisterObserverL(
            MXIMPProtocolConnectionHostObserver& aObserver,
            const TArray<TInt32>* aEventFilter = NULL );
    void UnregisterConnectionHostObserver(
            MXIMPProtocolConnectionHostObserver& aObserver );


public: // MXIMPHost

    MXIMPProtocolConnection& GetConnection() const;

    void AddEventL( CXIMPApiEventBase& aEvent, MXIMPPscContext* aContext  );
    void ActivateEventL( CXIMPApiEventBase& aEvent, MXIMPPscContext* aContext );

    void UnregisterSession( CXIMPPscContext* aContext );

    void FakeCompleteRequest( TXIMPRequestId aReqId, TInt aResult );
    void HandleAdaptationRequestCompleted( TXIMPRequestId aReqId, TInt aResult );
    void HandleSessionMgmtRequestCompleted( TXIMPRequestId aReqId, TInt aResult );
    void HandleInternalRequestCompleted( TXIMPRequestId aReqId, TInt aResult );

    CProtocolPresenceDataHostImp& PresenceDataAccess();
    

    // get corresponding protocol host from the array of hosts
    TAny* GetProtocolHost(TInt aInterfaceId) ;
    
/*    CPresenceDataCache& DataAccess();
    CProtocolPresenceAuthorizationDataHostImp& AuthorizationDataAccess();
    CProtocolPresencePublishingDataHostImp& PublishingDataAccess();
    CProtocolPresenceWatchingDataHostImp& WatchingDataAccess();
    CProtocolPresentityGroupsDataHostImp& GroupsDataAccess();
*/
    void AddNewOperationL( CXIMPOperationBase& aOperation );
    TXIMPRequestId AddNewOperationL( CXIMPOperationBase* aOperation );

    void ForcedTeardownL();

    void StartCleanerTimer();
    
    TXIMPRequestId AddNewOperationL( 
                TInt aOperation, MXIMPBase* aParam, MXIMPBase* aParam2 = NULL );    
    TXIMPRequestId AddNewOperationL( 
                TInt aOperation, CXIMPRestrictedObjectCollectionImp* aParams );
    
    TInt32 ProtocolUID( );
    
    // to set the specific prtocol hosts
    void SetProtocolHosts();

public: // New functions

    void AddEventL( CXIMPApiEventBase& aEvent, CXIMPPscContext* aContext  );
    void ActivateEventL( CXIMPApiEventBase& aEvent, CXIMPPscContext* aContext );


    void RegisterSessionL( CXIMPPscContext* aContext );

private:

    /**
     * Delete old operation and try to launch processing.
     */
    void StartProcessing();

    /**
     * Activate next operation for processing and start processing.
     */
    void ActivateProcessing();

    /**
     * Helper for completing the request, to avoid cyclical
     * call chain from StartProcessingL to HandleRequestCompleted and back.
     * @param aResult The error code
     * @see HandleRequestCompleted
     */
    void CompleteRequest( TXIMPRequestId aReqId );

    /**
     * Callback method for process starting.
     */
    static TInt StartProcessCallback( TAny *aInstance );

    /**
     * Leaving version of Callback method for process starting.
     */
    void DoStartProcessCallback();

    /**
     * Callback method for request complete.
     */
    static TInt CompleteRequestCallback( TAny *aInstance );
    static TInt CompleteAdaptationRequestCallback( TAny* aInstance );
    static TInt CompleteSessionMgmtRequestCallback( TAny* aInstance );
    static TInt CompleteInternalRequestCallback( TAny* aInstance );

    /**
     * Leaving version of Callback method for request complete.
     */
    void DoCompleteRequestCallback();
    void DoCompleteAdaptationRequestCallback();
    void DoCompleteSessionMgmtRequestCallback();
    void DoCompleteInternalRequestCallback();

    /**
     * Callback for timer cleaner
     * @see TCallBack
     */
    static TInt CleanerCallback( TAny* aMyself );

    /**
     * Actual callback called from CleanerCallback.
     */
    void DoCleanerCallback();

    /**
     * Leaving version of cleaner timer callback.
     */
    void DoCleanerCallbackL();
    
    /**
     * This panics if active operation is not found for requestid.
     */
    CXIMPOperationBase& OperationForRequestId( TXIMPRequestId aReqId );

    TXIMPRequestId AddNewOperationL( NXIMPOps::TXIMPOpTypes aOpType );
    
     /**
     * This is to load all the protocol hosts 
     */
    void LoadDataHostArrayL() ;
    
private: // data

    /**
     * iConnection
     */
    MXIMPProtocolConnection& iConnection;

    /**
     * Uid for protocol to use for request id builder
     */
    TInt32 iProtocolUid;
    
    /**
     * Reference counter
     */
    TInt iReferences;

    /**
     * State identifier
     */
     TBool iProcessing;

    /**
     * Container for the operations. Owns the operations.
     * Own.
     */
    RXIMPObjOwningPtrArray< CXIMPOperationBase > iOperations;

    TBool iRunFromContextActivated;
    CXIMPOperationBase* iCurrentOperation;

    // not owned

    CXIMPEventManager* iEventManager;


    /**
     * Container for session datas that are registered to this
     * host.
     * Shared ownership. Cleanup for items must be done with close method. Not delete.
     */
    RPointerArray< CXIMPPscContext > iRegSessions;

    /**
     * Internal state of the host
     */
    NXIMPHost::THostStates iState;

    /**
     * Timer for clean operation creation.
     */
    CPeriodic* iCleanerTimer;

    /**
     * Object factory.
     */
    CXIMPObjectFactoryImp*  iObjFactory;

    /**
     * Data cache
     */
//    CPresenceDataCache* iDataCache;

    /**
     * Data hosts
     */
     
    CProtocolPresenceDataHostImp* iPresenceDataHost;
    
    /**
     * array to hold data hosts
     */
    CArrayFixFlat<MProtocolDataHost*>* iDataHostArray;
    
/*    CProtocolPresenceAuthorizationDataHostImp* iAuthDataHost;
    CProtocolPresencePublishingDataHostImp* iPublishingDataHost;
    CProtocolPresenceWatchingDataHostImp* iWatchingDataHost;
    CProtocolPresentityGroupsDataHostImp* iGroupsDataHost;
*/
    /**
     * Operation index for host-originated operations
     * (currently only reconnect operation)
     */
    TInt iHostOriginatedOpIndex;

    /**
     * Active object for async calls.
     */
    //CAsyncCallBack* iCallBack;
    enum
        {
        ECompleteRequestCallback = 0,
        ECompleteAdaptationRequestCallback,
        ECompleteSessionMgmtRequestCallback,
        ECompleteInternalRequestCallback,
        EStartProcessCallback
        };
    RPointerArray< CAsyncCallBack > iCallBack;

    /**
     *
     */
    TInt iAdaptationOperationIndex;


    /**
     * Builder for TXIMPRequestIds. Owned.
     */
    TXIMPRequestIdBuilder iReqIdBuilder;
    
    /**
     * Observers for adaptation requests.
     */
    RPointerArray< MXIMPProtocolConnectionHostObserver > iConnectionHostObservers;
    
    
    /**
     * Adaptation request complete event.
     */
    CXIMPProtocolRequestCompleteEventImp* iAdaptationReqCompleteEvent;
    
    /**
     * Forced tear down flag.
    */
    
    TBool iForcedTearDown;
    };


#endif // CPSCHOST_H