IMPSengine/engsrv/inc/impssession.h
author Fionntina Carville <fionntinac@symbian.org>
Mon, 15 Nov 2010 11:27:49 +0000
branchRCL_3
changeset 22 df9aab66f73e
parent 0 094583676ce7
permissions -rw-r--r--
Bug 3539. Update localisation mappings.

/*
* Copyright (c) 2002-2004 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: Classes used to describe IMSP CSP session.
*              Major for Imps Session.
*/


#ifndef CImpsSession_H
#define CImpsSession_H

//  INCLUDES
#include <e32base.h>
#include "impsclientsrv.h"

// FORWARD DECLARATIONS
class CImpsServer;
class CImpsSubSession;
class CImpsVariant;

// CLASS DECLARATION

/**
*  Common event for all client session types
*/
class CWvEvent : public CBase    // a notify event
    {
    public:
        CWvEvent( TImpsEventType aType );
        ~CWvEvent();
        void Destroy();

        TImpsEventType      iType;      // notification type, see impsconst.h
        TImpsServRequest    iRequestType;
        TImpsMessageType    iMessageType;  // response message
        TInt                iReqMesType;   // request type
        TBool               iSent;      // sent to client
        TInt                iOpCode;    // op-id
        TInt                iStatus;
        TInt                iAux;       // auxiliary for small data
        HBufC8*             iPackedMessage;
        TDblQueLink         iLink;
    };

/**
*  Common request data for all service session types
*/
class CRequest : public CBase
    {
    public:
        CRequest(
            const TDesC& aTID,
            TInt aOpId,
            TImpsServRequest aRequestType,
            TTime aExpiry,
            TImpsMessageType aMessageType );
        ~CRequest();
        void Destroy();

        TBuf<KImpsMaxTID> iTID;          // CSP TID
        TInt             iOpId;
        TImpsServRequest iRequestType;
        TImpsMessageType iMessageType;
        TTime            iExpiry;
        TDblQueLink      iLink;
    };


/**
*  SOS Client-server framework session for WV engine
*/
class CImpsSession : public CSession2
    {
    public:  // Constructors and destructor

        /**
        * C++ default constructor.
        * @param aClient client thread
        */
        CImpsSession( RMessage2& aMsg );

        /**
        * Destructor.
        */
        virtual ~CImpsSession();

    public: // New functions

        /**
        * Handles a client request; tests the opcode and gives
        * service according to that. ServiceL calls this.
        * @param aMessage service request from client
        */
        void DispatchMessageL( const RMessage2& aMessage );

        /**
        * Search pending request using CSP transaction-id
        * @param aTid transaction-id
        * @param aOpId op-id if matching one found (OUT)
        * @param aRequestType request type if found (OUT)
        * @param aReqMsgType request CSP primitive if found (OUT)
        * @param aCSP CSP connection id
        * @return subsession handle if search match
        */
        TUint CheckRequests(
            const TDesC& aTid,
            TInt& aOpId,
            TImpsServRequest& aRequestType,
            TImpsMessageType& aReqMsgType,
            TImpsSessIdent aCSP );

        /**
        * Discard expired pending requests and send error event to client
        * @param aExpiryTime expiry time interval
        * @param aServiceType service type considered
        * @param aSess CSP session entity
        */
        void DiscardRequests(
            TTime aExpiryTime,
            TImpsEventType aServiceType,
            TImpsSessIdent aCSP,
            MImpsCSPSession* aSess );

        /**
        * Discard expired pending requests and send error event to client
        * @param aError error code to be sent
        * @param aServiceType service type considered
        * @param aSess CSP session entity
        */
        void DiscardRequests(
            TInt aError,
            TImpsEventType aServiceType,
            TImpsSessIdent aCSP,
            MImpsCSPSession* aSess );

        /**
        * Discard a pending request and send an error event to client
        * @param aTid transaction-id
        * @param aServiceType service type considered
        * @param aCode error code
        * @param aSess CSP session entity
        * @return ETrue if request found and deleted
        */
        TBool DiscardRequest(
            const TDesC& aTid,
            TImpsEventType aServiceType,
            TInt aCode,
            TImpsSessIdent aCSP );

        /**
        * Minimum expiry time accessor
        * @return expiry time of subsession in seconds
        */
        TInt ExpiryTime();


        /**
        * Send or buffer new event to client
        * @param aFields data to be sent
        * @param aOpId corresponding op-id
        * @param aRequestType request type
        * @param aReqMsgType requesting CSP primitive starting
        *        transaction if this client has initiated it.
        * @param aHandle subsession handle
        */
        void SendEvent(
            CImpsFields* aFields,
            TInt aOpId,
            TImpsServRequest aRequestType,
            TImpsMessageType aReqMsgType,
            TUint aHandle );

        /**
        * Send Logout event only for Access clients (=session type)
        * @param aRespStatus response status caused this
        * @param aOpId op-id, optional
        * @param aSub subsession that is ignored.
        * @param aHandle subsession that is handled only.
        */
        void SendLogoutEvent(
            TInt aRespStatus,
            TInt aOpId,
            CImpsSubSession* aSub,
            TUint aHandle );

        /**
        * Send or buffer new status event to client
        * @param aStatus new status
        */
        void SendEvent(
            EImpsInternalStatus aStatus );

        /**
        * Check if notification should be sent when TID not given
        * This means usually SAP originated transaction.
        * @param aFields data received from SAP.
        * @param aCSP CSP connection id
        * @return ETrue if matching client found (client-id and
        * media type ok)
        */
        TBool CheckNotifications( CImpsFields* aFields, TImpsSessIdent aCSP );

        /**
        * Check all orphan messages from engine
        */
        void HandleAllOrphans();

        /**
        * Close the session
        */
        void CloseSession();

        /**
        * Delete all waiting client requests.
        */
        void DeleteAllRequests( );

        /**
        * Delete all waiting client requests.
        * @param aCSP CSP connection indetification
        */
        void DeleteAllRequests( TImpsSessIdent* aCSP );

        /**
        * Delete a specified client request
        * @param aOpId corresponding op-id
        * @param aSubHandle subsession handle
        */
        void DeleteRequest( TInt aOpId, TUint aSubHandle );

        /**
        * ApplicationId accessor
        * @return ApplicationId
        */
        TPtrC ApplicationId();

        /**
        * Complete the pending message and set the session status
        * @param aStatus completation status
        */
        void CompleteMe( TInt aStatus );

        /**
        * Reads the 8-bit data from client to the buffer
        * @param aIndex pointer to the message index
        * @param aBuffer target buffer in server memory.
        *        Buffer is reallocated if necessary.
        * @return ETrue if new buffer is allocated
        */
        TBool ReadBuffer8L(
            TInt aIndex,
            HBufC8*& aBuffer );

        /**
        * Delete a subsession
        * @param aHandle subsession id
        */
        void DeleteSubSession( TUint aHandle );

        /**
        * Check if CSP session connection matches
        * @param aCSP CSP connection indetification
        * @return aTrue if matches
        */
        TBool MatchSession( TImpsSessIdent aCSP );

        /**
        * Indicate that the message request has been completed
        */
        inline void SetCompleted();

        /**
        * Server accessor, wrapper for CSharableSession::Server()
        * @return current server instance
        */
        inline CImpsServer* CImpsSession::Server();  //lint !e1511

        /**
        * Get current message of this session
        * That's for CImpsServer only
        * @return last data sent by client API
        */
        inline CImpsFields* ImpsFields() const;

        /**
        * Get buffer for streamed message
        * @return buffer
        */
        inline HBufC8* StreamBuf() const;

        /**
        * Get buffer for streamed message
        * @return buffer
        */
        inline HBufC8** StreamBufAddr();

        /**
        * Create new data structure without deleting old one.
        * That's for a server if it has to queue current request.
        */
        void NewFieldsL();

        /**
        * Is this CIR watcher session
        * @return ETrue this is CIR watcher session.
        */
        inline TBool IsCIRWatcherSession() const;

        /**
        * Subsession (service) types of this session
        * @return event type bit mask
        */
        inline TInt Types() const;

        /**
        * Number of subsessions
        */
        inline TInt NbrSubs() const;

        /**
        * Current message
        */
        inline RMessagePtr2 Message() const;

        // multi:
        /**
        * user-id mutator
        * @param aId user-id
        */
        void SetUserIdL( const TDesC& aId );

        /**
        * Clean CSP session-id
        */
        void CleanSID();

        /**
        * CSP Session-id mutator
        * @param aSID session-id
        */
        void ModifySIDL( const TDesC& aSID );

        /**
        * CSP Session-id accessor
        * @return aId user-id
        */
        inline TPtrC SID( ) const;

        /**
        * client-id accessor
        * @return aId user-id
        */
        inline TPtrC UserId( ) const;

        /**
        * SAP mutator
        * @param aId SAP address
        */
        void SetSAPL( const TDesC& aId );

        /**
        * SAP accessor
        * @return aId user-id
        */
        inline TPtrC SAP( ) const;

        /**
        * Is this session logged in
        */
        inline TBool IsThisLogged() const;


    public: // Functions from base classes

        /**
         * From CSharableSession (pure virtual)
         * Handles service request messages from clients.
         * @param aMessage message from client
         */
        void ServiceL( const RMessage2& aMessage );

    protected:  // Functions from base classes

        /**
        * From CSharableSession::CreateL
        * @param aServer WV engine server core and soul
        */
        // void CreateL( const CServer& aServer );
        void CreateL();

    private: // New functions

        /**
        * New subsession creation
        * @param aType subsession type
        * @param aMessage client request
        */
        void NewSubSessionL(
            TImpsEventType aType,
            const RMessage2& aMessage );

        /**
        * Subsession handle accessor
        * @param aHandle 4th client-server parameter
        * @return Subsession entity
        */
        CImpsSubSession* ConnectionFromHandle( TUint aHandle );

        /**
        * Panics the client thread
        * @param aPanic panic reason
        */
        void PanicClient( TImpsPanic aPanic ) const;

        /**
        * Current service tree
        * Sends current negotiated service tree to a client thread.
        */
        void CurrentServicesL();

        /**
        * Push message generation
        */
        void PushMessageL();

        /**
        * set this client session inactive, i.e. messages should not be sent
        * Login request makes this session active again althogh creation
        * of new session is preferred way to make a new CSP login.
        */
        void SetThisInactive();

        /**
        * Assign the application id
        */
        void AssignIdL();

        // By default, prohibit copy constructor
        CImpsSession( const CImpsSession& );
        // Prohibit assigment operator
        CImpsSession& operator= ( const CImpsSession& );

        /**
        * Is this client session active, i.e. messages should be sent
        * @return ETrue if this is active
        */
        inline TBool IsThisActive() const;

        /**
        * CSP session specific client-server session counter
        * @return number of sessions
        */
        TInt NbrOfSessionsL( );


    private:    // Data
        TBool               iCanceled;

        HBufC*              iApplicationId;  // application id
        HBufC*              iSID;       // CSP Session-id
        HBufC*              iSAP;
        HBufC*              iUserId;    // CSP user-id

        TBuf<KImpsMaxTID>   iLogoutTID;

        HBufC8*             iStream;   // message stream between client->server
        CImpsFields*        iFields;   // current message in unpacked form
        TBool               iMessageCompleted;  // if the session is not active

        TBool               iCIRSess;   // Is this CIR watcher session

        CObjectIx*          iSubSessions; // object index which stores subsessions
        CObjectCon*         iContainer;   // object container for this session
        TInt                iResourceCount;
        TUint               iTypes; // bit mask of supported services

        RMessagePtr2        iMsgR;      // current client-server request
    };

#include "ImpsSession.inl"

#endif

// End of File