diff -r 000000000000 -r 1bce908db942 multimediacommsengine/mmcesrv/mmceserver/inc/mcesipmanager.h --- /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 +#include +#include +#include + +// 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& aProfiles, TUint32 profileId ); + TInt FindProfileByRequestUriL( RPointerArray& 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 iClients; + +private: // Owned Data + + //SIP connections + RPointerArray iSIPClientConnections; + //SIP instance + CSIP* iSIP; + //media manager + CMceMediaManager* iMediaManager; + //profile registry + CSIPProfileRegistry* iProfileRegistry; + //SIP session FSM + CMceSipStateMachine* iStateMachine; + //profiles in use + RPointerArray 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