--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/IMPSengine/engsrv/inc/impsserver.h Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,788 @@
+/*
+* Copyright (c) 2002-2005 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: Including CImpsScheduler: WV engine thread scheduler.
+* Including CImpsConn: CSP session connections.
+* Including CImpsCSPDestroyer : This deletes CSP session entity asynchronously
+*/
+
+
+#ifndef CIMPSSERVER_H
+#define CIMPSSERVER_H
+
+// INCLUDES
+#include <e32base.h>
+#include <s32file.h>
+#include "impsconst.h"
+#include "impsservercommon.h"
+#include "impsservices.h"
+#include "impsmessageinterpreterapi.h"
+#include "impsdataaccessorapi.h"
+#include "impssrvutils.h"
+#include "impscspsessionapi.h"
+#include "impscommonenums.h"
+
+// DATA TYPES
+
+// Server operations (states)
+enum TImpsSrvOperation
+ {
+ EImpsSrvNone,
+ EImpsSrvShuttingDown,
+ EImpsSrvFinish // no return back, scheduler will be stopped
+ };
+
+// Terminal off-line states
+enum TImpsSR2TOff
+ {
+ EImpsSR2TOffNone,
+ EImpsSR2TOffStarted
+ };
+
+
+// FORWARD DECLARATIONS
+class CImpsSession;
+class CImpsSubSession;
+class CImpsFields;
+class CImpsShutdownTimer;
+class CImpsExpiryTimer;
+class CImpsVariant;
+class CImpsOrphans;
+class CImpsCSPDestroyer;
+class MImpsCSPSession;
+class CImpsTOffObserver;
+
+// CLASS DECLARATION
+
+/**
+* CImpsScheduler
+* WV engine thread scheduler.
+*/
+class CImpsScheduler: public CActiveScheduler
+ {
+ public: // from base class
+
+ /**
+ * Error handling that ignores leaves of
+ * active object RunL methods
+ */
+ void Error( TInt anError ) const;
+ };
+
+/**
+* CSP session connections
+*/
+class CImpsConn : public CBase
+ {
+ public:
+
+ /** Two-phased constructor.
+ * @param aSess CSP session entiry
+ * @param aServer server entity
+ * @return CImpsConn
+ */
+ static CImpsConn* CImpsConn::NewL(
+ MImpsCSPSession* aSess, CImpsServer& aServer );
+
+ /**
+ * Delete the CSP session asynchronously, i.e. this
+ * can be deleted inside transport response.
+ */
+ void DeleteCSPAsynch();
+
+ /**
+ * Match with a a specific CSP session entity
+ * @param aCSP CSP connection id
+ * @return ETrue if matches
+ */
+ TBool MatchCSP( TImpsSessIdent aCSP );
+
+ /**
+ * destructors
+ */
+ ~CImpsConn();
+
+ /**
+ * This deletes related CSP session entity and cancels
+ * peninding asynchrounous deletion if such exists.
+ */
+ void Destroy();
+
+ /**
+ * Session accesor
+ * @return CSP session entity
+ */
+ MImpsCSPSession* Sess();
+
+ private: // methods
+
+ /**
+ * contructor
+ * @param aServer server entity
+ */
+ void ConstructL( CImpsServer& aServer );
+
+ /**
+ * contructor
+ * @param aSess CSP session entity
+ * @param aTimer delay timer for delayed off-line events
+ */
+ CImpsConn( MImpsCSPSession* aSess );
+
+ private: // data
+ MImpsCSPSession* iSess;
+ CImpsCSPDestroyer* iRemover;
+ public:
+ TDblQueLink iLink; //lint !e1925
+ };
+
+
+/**
+* CImpsCSPDestroyer
+* This deletes CSP session entity asynchronously
+*/
+class CImpsCSPDestroyer: public CActive
+ {
+ public:
+ /**
+ * Constructor
+ * @param aServer WV engine server
+ * @param aSess CSP session entity
+ * @param aPriority active object priority
+ */
+ CImpsCSPDestroyer(
+ CImpsServer& aServer,
+ MImpsCSPSession& aSess,
+ TInt aPriority );
+
+ /**
+ * Destructor
+ */
+ virtual ~CImpsCSPDestroyer();
+
+ /**
+ * Start deletion.
+ */
+ void DeleteCSPAsynch();
+
+ protected:
+ // From base class
+ void RunL();
+ void DoCancel();
+ private:
+ CImpsServer& iServer;
+ MImpsCSPSession& iSess;
+ TBool iCanceled;
+
+ };
+
+/**
+* CImpsServer.
+* The core of the whole WV engine.
+*/
+
+class CImpsServer : public CPolicyServer
+
+ {
+ public: // Constructors and destructor
+
+ /**
+ * constructs and starts the server.
+ */
+ static CImpsServer* New();
+
+ /**
+ * Destructor.
+ */
+ virtual ~CImpsServer();
+
+ public: // New functions
+
+ /**
+ * Memory allocations. Called by a thread start function!
+ */
+ void ConstructL();
+
+ /**
+ * Deletes this session's first buffered event from the list and sends the next
+ * one if there are any waiting.
+ *
+ * @param aSession the session concerned
+ *
+ */
+ void NextEvent( CImpsSession* aSession );
+
+ /**
+ * Close client-server session.
+ * Cancel transport and start idle timer if there is only one session.
+ * @param aCSP CSP connection id
+ * @param aComplete TRUE is session entity creation is complete
+ */
+ void CloseSession( TImpsSessIdent aCSP, TBool aComplete );
+
+ /**
+ * Stop the engine right now
+ */
+ void DoShutDown();
+
+ /**
+ * Server bootstrap code.
+ *
+ * @param aSignal signal that's used to inform the client thread when the server
+ * is up.
+ *
+ */
+ IMPORT_C static TInt ThreadStart( TImpsSignal& aSignal );
+
+ /**
+ * Login WV server
+ * @param aUser User-id (max 50 characters)
+ * @param aPsw password (max 50 characters)
+ * @param aClientId client id used to log in server.
+ * The client-id having prefix '+' or number is considered
+ * as MSISDN number (E.164),
+ * otherwise it is handled as URL (max 200 character).
+ * This MAY be used for CIR addressing if SAP is not able to
+ * detect MSISDN number in other way
+ * @param aServer SAP URI, may include port number
+ * @param aAP CommDb id for access point
+ * @param aAnyAP ETrue if any other open access point is accepted
+ * @param aKey1 future option
+ * @param aKey2 future option
+ * @param aSub requesting subsession
+ * @param aLoginExpiry epiry time of login request
+ * @param aReactive reactive presence auth negotiation
+ * @return TID
+ */
+ TPtrC LoginL(
+ const TDesC& aUser,
+ const TDesC& aPassword,
+ const TDesC& aClientId,
+ const TDesC& aSAP,
+ TUint32 aAP,
+ const TDesC& aKey1,
+ const TDesC& aKey2,
+ CImpsSubSession* aSub,
+ const TTime aLoginExpiry,
+ TBool aReactive );
+
+ /**
+ * Logout SAP
+ * @param aCancel ETrue if login cancel functionaliy wanted
+ * @param aCSP CSP connection id
+ * @return TID
+ */
+ TPtrC LogoutL(
+ TBool aCancel,
+ TImpsSessIdent aCSP );
+
+ /**
+ * CIR message handler
+ * @param aCookie entire session cookie message
+ */
+ void CirMessageL(
+ const TDesC8& aCookie );
+
+ /**
+ * Send data from session current data to WV server.
+ * Login must have been done.
+ * @param aSession requestion client session
+ * @param aCSP CSP connection id
+ * @return transaction-id
+ */
+ TPtrC SendDataL(
+ CImpsSubSession* aSession,
+ TImpsSessIdent aCSP
+ );
+
+ /**
+ * Get number of client sessions
+ * @param aIgnoreCIR ETrue if CIR watcher session is ignored
+ * @return number of sessions
+ */
+ TInt NbrSessions( TBool aIgnoreCIR );
+
+ /**
+ * Get number of client sessions for the specified CSP connection
+ * @param aIgnoreCIR ETrue if CIR watcher session is ignored
+ * @param aCSP CSP connection id
+ * @return number of sessions
+ */
+ TInt NbrSessions( TBool aIgnoreCIR, TImpsSessIdent aCSP );
+
+ /**
+ * Stop the idle timer
+ */
+ void StopTimer() const;
+
+ /**
+ * Is the CSP session logged in
+ * @param aCSP CSP connection id. If all values are zero length then
+ * check if any session is logged in
+ * @param password, OUTPUT, optional
+ * @return ETrue if logged in
+ */
+ TBool IsLogged( TImpsSessIdent aCSP, TPtrC* aPsw );
+
+ /**
+ * CSP session-id accessor
+ * @param aCSP CSP connection id. If all values are zero length then
+ * check if any session is logged in
+ * @return CSP session-id
+ */
+ TPtrC SID( TImpsSessIdent aCSP );
+
+ /**
+ * Is the CSP session capabilities negotiated
+ * @param aCSP CSP connection id
+ * @return ETrue if negotiated
+ */
+ TBool IsNegotiated( TImpsSessIdent aCSP );
+
+ /**
+ * Transport status change indicator
+ * @param aConnectionState new status, on_line, off_line or no_iap
+ */
+ void TransportStatus( EImpsInternalStatus aConnectionState,
+ MImpsCSPSession* aSess );
+
+ /**
+ * Active services accessor
+ * @param aCSP CSP connection id
+ * @return current WV services
+ */
+ TImpsServices* Services( TImpsSessIdent aCSP );
+
+ /**
+ * Is there pendig login operation
+ * @param aCSP CSP connection id
+ * @return ETrue if yes
+ */
+ TBool IsPendingLogin( TImpsSessIdent aCSP );
+
+ /**
+ * Generate expiry time
+ * @param aMsgType WV message primitive
+ * @return expiry time
+ */
+ TTime ExpiryTime( TImpsMessageType aMsgType );
+
+ /**
+ * Generate expiry time
+ * @param aSrv WV service type
+ * @return expiry time
+ */
+ TTime ExpiryTime( TImpsEventType aSrv );
+
+ /**
+ * Generate expiry time
+ * @param aExpiry expiry time in seconds
+ * @return expiry time
+ */
+ TTime ExpiryTime( TInt aExpiry );
+
+ /**
+ * Default Expiry time accessor
+ * @param aSrv WV service type
+ * @return expiry time in seconds
+ */
+ TInt ExpirySeconds( TImpsEventType aSrv );
+
+ /**
+ * check expired messages
+ * @param aType WV service type
+ */
+ void CheckExpiryL( TImpsEventType aType );
+
+ /**
+ * check expired messages
+ * @param aType WV service type
+ */
+ void CheckExpiryL( TImpsEventType aType, TTime aExpiry );
+
+ /**
+ * Cancel a transaction.
+ * Removes request from server's transaction queue and
+ * asks transport to cancel the request too.
+ * @param aTID transaction id to identify the request.
+ * @param aCSP CSP session id
+ */
+ void CancelTrans( const TDesC& aTID, TImpsSessIdent aCSP );
+
+ /**
+ * Cancel a transaction.
+ * Removes request from server's transaction queue and
+ * asks transport to cancel the request too.
+ * @param aTID transaction id to identify the request.
+ * @param aSess CSP session entity
+ */
+ void CancelTrans( const TDesC& aTID, MImpsCSPSession* aSess );
+
+ /**
+ * Do the logout routines
+ * @param aOpId operation id, KImpsNullId means SAP initiated logout
+ * @param aCSPDis if CSP session really disconnected (existed)
+ */
+ void DoLogoutSrv( TInt aOpId, TBool aCSPDis,
+ MImpsCSPSession* aSess );
+
+ /**
+ * Create container
+ * @return container
+ */
+ CObjectCon* NewContainerL();
+
+ /**
+ * Remove container
+ * @param aCon container
+ */
+ void RemoveContainer( CObjectCon* aCon );
+
+ /**
+ * Maximum transaction content
+ * @return max size for WV message
+ */
+ TInt BufferSize();
+
+ /**
+ * Receive terminal off_line/on_line indication
+ * @param aParam True if connections allowed, else False.
+ */
+ void SetConnAllowed( TBool aParam );
+
+ /**
+ * Decodes accessor
+ * Subsession needs this to build XML-formatted response
+ * @return Message decoder
+ */
+ inline MImpsDecoder& Decoder() const;
+
+ /**
+ * iConnAllowed accessor
+ * @retuns ETrue if connection allowed and terminal is not OFF-LINE
+ */
+ inline TBool IsConAllowed() const;
+
+ /**
+ * Discard a request from a session
+ * @param aTid transaction-id to be discarded
+ * @param aType event type (service type)
+ * @param aCode an error code to a client request
+ * @param aCSP CSP session id
+ */
+ void DiscardRequest(
+ const TDesC& aTid,
+ TImpsEventType aType,
+ TInt aCode,
+ TImpsSessIdent aCSP );
+
+ /**
+ * Discard a request from a session
+ * @param aType event type (service type)
+ * @param aExpiry request expiration time
+ * @param aCSP CSP session id
+ * @param aSess CSP session entity
+ */
+ void DiscardRequests(
+ TImpsEventType aType,
+ TTime aExpiry,
+ TImpsSessIdent aCSP,
+ MImpsCSPSession* aSess );
+
+ /**
+ * Discard all requests from a session
+ * @param aType event type (service type)
+ * @param aError error code to be sent
+ * @param aCSP CSP session id
+ * @param aSess CSP session entity
+ */
+ void DiscardRequests(
+ TImpsEventType aType,
+ TInt aError,
+ TImpsSessIdent aCSP,
+ MImpsCSPSession* aSess );
+
+ /**
+ * Discard Logout request that actually sends logout events to clients
+ * @param aTID transaction-id
+ * @param aCSP CSP session id
+ */
+ void DiscardLogout(
+ const TDesC& aTID,
+ TImpsSessIdent aCSP );
+
+ /**
+ * Make and send simple error event to certain type of sessions
+ * @param aType session event type
+ * @param aCode error code
+ * @param aOpId operation-id
+ * @param aCSP CSP session id
+ */
+ void SendErrorEvent(
+ TImpsEventType aType,
+ TInt aCode,
+ TInt aOpId,
+ TImpsSessIdent aCSP );
+
+ /**
+ * Send online status change events to clients
+ * @param aStatus new engine status
+ * @param aCSP CSP session id
+ */
+ void SendStatusEvents(
+ EImpsInternalStatus aStatus,
+ TImpsSessIdent aCSP );
+
+ /**
+ * Handle notification orders for incoming message.
+ * Create corresponding events
+ * @param aFields response message
+ * @param aCSP CSP session id
+ * @return True if matching subsession is found.
+ * (client-id and media type ok)
+ */
+ TBool CheckNotifications(
+ CImpsFields* aFields,
+ TImpsSessIdent aCSP );
+
+ /**
+ * Handles pending requests for the incoming message
+ * @param aFields response message
+ * @param aFound OUT: true if found request
+ * @param aCSP CSP session id
+ * @return error code
+ */
+ void CheckRequestsL(
+ CImpsFields* aFields,
+ TBool& aFound,
+ TImpsSessIdent aCSP );
+
+ /**
+ * Handle orphan message
+ * @param aFields msg, CImpsServer takes the ownership of this msg.
+ * @param aCSP CSP session id
+ */
+ void HandleOrphanL( CImpsFields* aFields, TImpsSessIdent aCSP );
+
+ /**
+ * Get next orphan message for the subsession
+ * @param aCID client-id
+ * @param aServiceType the type of the client which requests the message
+ * @param aCSP CSP session id
+ * @return new message, NULL if no match. Ownership of the msg is
+ * passed to the caller of this method.
+ */
+ CImpsFields* NextOrphanLC(
+ const TDesC& aCID,
+ TImpsEventType aServiceType,
+ TImpsSessIdent aCSP );
+
+ /**
+ * Check all orphans messages and send them to clients.
+ * This is called when a client session starts to share
+ * an existing CSP session.
+ */
+ void HandleAllOrphans();
+
+ /**
+ * Get matching CSP session entity
+ * @param aCSP CSP connection id
+ * @param aAll sessions shutting down are returned too
+ * @returm matching CSP session or NULL
+ */
+ MImpsCSPSession* GetCSP( TImpsSessIdent aCSP,
+ TBool aAll );
+
+ /**
+ * Create CSP session entity
+ * @param aCSP CSP connection id
+ * @param aVer CSP version
+ * @returm CSP session
+ */
+ MImpsCSPSession* NewCSPL( TImpsSessIdent aCSP, TImpsCspVersion aVer );
+
+ /**
+ * Delete CSP session entity
+ * @param aSess CSP session entity
+ */
+ void DeleteCSP( MImpsCSPSession* aSess );
+
+ /**
+ * CSP session entity counter
+ * @return number of CSP sessions
+ */
+ TInt NbrCSPs();
+
+ /**
+ * CSP session id seed to generate unique ids across CSP sessions
+ */
+ TInt TidSeed();
+
+ /**
+ * Close all CSP sessions immediately and go to SHUTTING_DOWN state
+ */
+ void LogoutAll();
+
+ /**
+ * CSP version
+ */
+ inline TImpsCspVersion CspVersion();
+
+ /**
+ * Is shutting down?
+ * @return ETrue if state is SHUTTING_DOWN
+ */
+ inline TBool IsShuttingDown();
+
+ /**
+ * Current settings accessor
+ * @return current variant settings
+ */
+ inline const TImpsSrvSettings* Settings() const;
+
+ /**
+ * Reset expiry timer if needed
+ * The time may decrease only
+ * @param aSeconds subsession expiry time in seconds. 0 means undefined and default values are used.
+ * @param aInit set this in login so that timer is started first time.
+ */
+ void SetExpiryTimer( TInt aSeconds, TBool aInit );
+
+ /**
+ * Reset expiry timer if needed
+ * The time may increase only when a subsession is closed
+ * @param aSeconds subsession expiry time in seconds. 0 means undefined value.
+ */
+ void ResetExpiryTimer( TInt aSeconds );
+
+
+ public: // Functions from base classes
+
+ /**
+ * Opens a new session to the server.
+ *
+ * @param aVersion required version of the server.
+ * @param aMessage client request
+ * @return pointer to a new session
+ *
+ * Leaves if:
+ * - Required version not supported (KErrNotSupported)
+ * - In very rare case when engine is going down (KErrNotReady)
+ */
+ CSession2* NewSessionL( const TVersion& aVersion, const RMessage2& aMessage ) const;
+
+ protected: // Functions from base classes
+
+ /**
+ * C++ default constructor.
+ */
+ CImpsServer();
+
+ private: // Functions from base classes
+
+
+ // From CPolicyServer
+ CPolicyServer::TCustomResult CustomSecurityCheckL(
+ const RMessage2& aMsg, TInt& aAction, TSecurityInfo& aMissing );
+
+
+ void GetCSPVersion();
+
+ private:
+
+ // By default, prohibit copy constructor
+ CImpsServer( const CImpsServer& );
+ // Prohibit assigment operator
+ CImpsServer& operator= ( const CImpsServer& );
+
+ /**
+ * Send extra events to HandleLogoutL methods to clients
+ * @param aSub subsession to be ignored
+ * IF NULL the all subsessions handled
+ * @param aOpId operation-id, -1 means SAP initiated disconnect
+ * @param aCSP CSP connection id
+ */
+ void SendLogoutEvents( CImpsSubSession* aSub,
+ TInt aOpId, TImpsSessIdent aCSP );
+
+ /**
+ * Transport status change indicator
+ * @param aConnectionState new status, on_line, off_line or no_iap
+ * @param aSess CSP session entity
+ */
+ void DoTransportStatusL( EImpsInternalStatus aConnectionState,
+ MImpsCSPSession* aSess );
+
+ /**
+ * Do the logout routines
+ * @param aSub requesting subsession, logout event ignored for this
+ * @param aOpId operation id, KImpsNullId means SAP initiated logout
+ * @param aCSPDis true if CSP really disconnected
+ * @param aCSP CSP connection id
+ */
+ void DoLogoutNow(
+ CImpsSubSession* aSub,
+ TInt aOpId,
+ TBool aCSPDis,
+ TImpsSessIdent aCSP );
+
+ /**
+ * Close all CSP session emtities
+ * @param aCSP CSP connection id
+ */
+ void CloseAllCSPs();
+
+ /**
+ * Start to delete CSP session entity asynchronously
+ * @param aSess CSP session entity
+ */
+ void DeleteCSPAsynch( MImpsCSPSession* aSess );
+
+ public: // Data
+
+ protected: // Data
+
+ private: // Data
+ CObjectConIx* iContainerIndex;
+ RFs iFs;
+
+ CImpsFields* iSnd; // internal data structure
+
+ CImpsShutdownTimer* iShutTimer;
+ CImpsExpiryTimer* iExpiryTimer;
+
+ TImpsSrvSettings iSettings;
+
+ CImpsVariant* iVariant;
+ TBool iConAllowed; // Is network connections allowed
+
+ TImpsCspVersion iCSPVersion;
+ TImpsSrvOperation iOperation;
+
+ CImpsOrphans* iOrphans;
+ TDblQue<CImpsConn> iCSPList;
+
+ TInt iSeed;
+ CImpsTOffObserver* iObserver;
+ TInt iExpiryInterval; // current expiry times value
+ };
+
+#ifdef __WINS__
+EXPORT_C TInt ThreadFunction( TAny* aThreadParams );
+#endif
+
+#include "ImpsServer.inl"
+
+#endif // ?INCLUDE_H
+
+// End of File