multimediacommsengine/mmcesrv/mmceserver/inc/mcesipmanager.h
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmcesrv/mmceserver/inc/mcesipmanager.h	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,318 @@
+/*
+* Copyright (c) 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:   
+*
+*/
+
+
+
+
+#ifndef CMCESIPMANAGER_H
+#define CMCESIPMANAGER_H
+
+#include "mcesrv.h"
+#include "mceclientserver.h"
+#include "mcemediaobserver.h"
+#include "mceclientresolver.h"
+#include <es_sock.h>
+#include <sipobserver.h>
+#include <sipprofileregistryobserver.h>
+#include <e32base.h>
+
+//  FORWARD DECLARATION
+class CSIP;
+class CSIPProfile;
+class CSIPHttpDigest;
+class CMceServerCore;
+class CMceSipConnection;
+class CMceCsSubSession;
+class CMceCsSessionImplementation;
+class CMceCsSession;
+class CMceMediaManager;
+class TMceIds;
+class CSIPProfileRegistry;
+class CSIPServerTransaction;
+class CSIPClientTransaction;
+class CSIPInviteDialogAssoc;
+class CSIPNotifyDialogAssoc;
+class CMceSipStateMachine;
+class CMceTimerManager;
+
+/**
+* This class provides life-cycle management of 
+* SIP sessions and SIP events. It also acts as an
+* observer for SIP API, SIP Client resolver and
+* Media Mananger.
+*
+*  @lib 
+*  @since
+*/
+class CMceSipManager : public CBase,
+                       public MSIPObserver,
+                       public MSIPProfileRegistryObserver,
+                       public MMceMediaGeneralObserver,
+                       public MMceClientResolverObserver
+	{	
+public: // Constructors and destructor
+
+	/**
+	* Two-phased constructor.
+	* @param aServerCore, reference to server core.
+	*/
+	static CMceSipManager* NewL( CMceServerCore& aServerCore );
+
+	/**
+	* Two-phased constructor.
+	* @param aServerCore, reference to server core.
+	*/
+	static CMceSipManager* NewLC( CMceServerCore& aServerCore );
+
+	/**
+	* Destructor.
+	*/
+	~CMceSipManager();
+
+public: // from MSIPObserver
+
+    /**
+    * A SIP request has been received from the network.        
+    * @pre aTransaction != 0
+    * @param aIapId The IapId from which the SIP request was received.
+    * @param aTransaction contains local address, remote address of a SIP
+    *        message, as well as optional SIP message method, headers and
+    *        body. The ownership is transferred.
+    */
+	void IncomingRequest(TUint32 aIapId,
+		                 CSIPServerTransaction* aTransaction);
+
+    /**
+    * The received SIP request time-outed and it is invalid i.e. cannot be used
+    * anymore.
+    * This will be called if the user fails to create a SIP connection
+    * and does not send an appropriate SIP response.
+    * @param aTransaction The time-outed transaction.
+    */
+    void TimedOut(CSIPServerTransaction& aTransaction);
+
+
+public: // from MMceClientResolverObserver
+
+
+    /**
+    *  Called when client discovery subsystem has resolved
+    *  the client the transaction should go to
+    *
+    *  @param aClientUid Client's uid
+    *  @param aConnection the connection used
+    *  @param aRequest the transaction
+    */
+    void IncomingResolvedRequest( TUid aClientUid,
+                                  CMceSipConnection& aConnection,
+                                  CSIPServerTransaction* aRequest );
+
+
+public: //from MSIPProfileRegistryObserver 
+	
+	/** 
+	* An event related to SIP Profile has accorred
+	* @param aProfileId a profile Id
+	* @param aEvent an occurred event
+	**/
+	void ProfileRegistryEventOccurred(
+	            TUint32 aProfileId, 
+	            MSIPProfileRegistryObserver::TEvent aEvent);
+
+	/**
+	* An asynchronous error has occurred related to SIP profile
+	* Event is send to those observers, who have the
+	* corresponding profile instantiated.
+	* @param aProfileId the id of failed profile 
+	* @param aError an occurred error
+	*/
+	void ProfileRegistryErrorOccurred(TUint32 aProfileId, TInt aError);
+
+public: // from MMceMediaGeneralObserver
+
+	/**
+    * Callback function to indicate about media error
+    * @param aError, error occured	 
+    */
+	void MediaError ( TInt aError );
+
+    
+public: // New
+
+	/**
+	* Reserves new dialog id
+	* @return new dialog id
+	*/
+    TUint32 NextDialogId();
+    
+	/**
+	* Returns ETrue, if manager will consume the transaction
+	* @param aTransaction the pending transaction
+	* @return ETrue, if manager will consume the transaction
+	*/
+    TBool Consumes( CSIPServerTransaction& aTransaction );
+    
+	/**
+	* Registers a client
+	* @param aClientSession the client
+	*/
+    void RegisterClientL( CMceCsSession& aClientSession );
+
+	/**
+	* Un-registers client
+	* @param aClientSession the client
+	*/
+    void UnRegisterClient( CMceCsSession& aClientSession );
+    
+	/**
+	* Creates outgoing (sub) session
+	* @param aClientSession the client
+    * @param aIds set of ids defining ITC call context
+	* @param aParams parameter for dialog
+	* @return sub session 
+	*/
+    CMceCsSubSession* CreateSubSessionL( CMceCsSession& aClientSession, 
+                                         TMceIds& aIds,
+                                         CDesC8Array& aParams );
+    
+	/**
+	* Creates incoming (sub) session
+	* @param aTransaction incoming request, which trigged creation
+    * @param aConnection SIP connection to which session will be attached
+	* @return sub session 
+	*/
+    void CreateSubSessionL( CSIPServerTransaction* aTransaction,
+                            CMceSipConnection& aConnection );
+    
+	/**
+	* Unregisters sub session
+	* @param aSubSession sub session
+	*/
+    void UnRegisterSubSession( CMceCsSubSession& aSubSession );
+
+    /**
+	* Returns media mananger instance
+	* @return media mananger
+	*/
+    CMceMediaManager& MediaManager();
+    
+	/**
+	* Returns timer mananger instance
+	* @return timer mananger
+	*/
+    CMceTimerManager& TimerManager();
+    
+	/**
+	* Returns SIP client instance
+	* @return SIP client
+	*/
+    CSIP& SIPClient();
+
+	/**
+	* Adds orphan sub session
+	* @param aSubSession sub session
+	*/
+    void AddOrphanSubSessionL( CMceCsSubSession* aSubSession );
+    
+    /*
+    * get Orphan Session's Count
+    * @return number of orphan subsessions.
+    */  
+    TInt OrphanSubSessionCount();
+    
+	/**
+	* Cleans up orphans sub sessions
+	*/
+    void Cleanup();
+    
+    /**
+	* Creates incoming sub session
+	* @param aTransaction incoming request, which trigged creation
+	* @param aClient resolved client
+	* @param aConnection IP connection to which session will be attached
+	*/
+    void CreateSubSessionL( CSIPServerTransaction* aTransaction,
+                            CMceCsSession& aClient,
+                            CMceSipConnection& aConnection,
+                            CMceCsSubSession* aAssocSession = NULL );
+	
+	RSocketServ& SocketServ();
+	
+private:
+
+	CMceSipManager (CMceServerCore& aServerCore);
+	void ConstructL ();
+	CSIPProfile& ProfileL( TUint32 aProfileId );
+    CSIPProfile& ProfileL( TUint32 aIapId, 
+                           const CUri8& aRequestUri );
+    CMceSipConnection& ConnectionL( CSIPProfile& aProfile );
+	CMceSipConnection& ConnectionL( TUint32 aIAPId );    
+    TInt FindProfileById( RPointerArray<CSIPProfile>& aProfiles, TUint32 profileId );
+    TInt FindProfileByRequestUriL( RPointerArray<CSIPProfile>& aProfiles, 
+                                   const CUri8& aRequestUri );
+                                   
+    TUint32 ChannelL( CSIPServerTransaction& aRequest );
+
+	/**
+    * When a profile has been updated and its data has been read from Profile
+    * server to aNewProfile, update the sub sessions that point to the old
+    * profile instance, so that they will point to the new instance.
+    * @param aNewProfile Profile's current data
+    * @param aOldProfile Profile's data before it was updated
+    */
+    void UpdateProfileToSubSessions( CSIPProfile& aNewProfile,
+									 CSIPProfile& aOldProfile );
+
+private: // NOT owned Data
+
+    //MCE server core
+	CMceServerCore& iServerCore;
+    //all clients registered to MCE server
+    RPointerArray<CMceCsSession> iClients;
+    
+private: // Owned Data
+
+    //SIP connections
+	RPointerArray<CMceSipConnection> iSIPClientConnections;
+    //SIP instance
+	CSIP* iSIP;
+    //media manager
+	CMceMediaManager* iMediaManager;
+    //profile registry
+	CSIPProfileRegistry* iProfileRegistry;
+    //SIP session FSM
+	CMceSipStateMachine* iStateMachine;
+    //profiles in use
+	RPointerArray<CSIPProfile> iProfiles;
+	//next dialog id
+	TUint32 iNextDialogId;
+	//client resolver
+	CMceClientResolver* iClientResolver;
+	//orphan sub sessions
+	CMceCsSessionImplementation* iOrphanSubSessions;
+    //timer manager
+    CMceTimerManager* iTimerManager;
+    // Socket server handle    
+    RSocketServ iSocketServ;
+
+	//definitions for unit testing
+	MCESRV_UT_DEFINITIONS
+	};
+
+#endif // CMCESIPMANAGER_H
+
+// End of File