natfw/natfwconnectionmultiplexer/inc/cncmsession.h
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/natfw/natfwconnectionmultiplexer/inc/cncmsession.h	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,323 @@
+/*
+* Copyright (c) 2006-2008 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:    Connection multiplexer session abstraction.
+*
+*/
+
+
+
+
+#ifndef C_CNCMSESSION_H
+#define C_CNCMSESSION_H
+
+#include <e32base.h>
+#include <in_sock.h>
+#include <commdbconnpref.h>
+
+#include "mncmicmpobserver.h"
+
+class CNcmStream;
+class MNcmConnectionMultiplexerObserver;
+class MNcmSessionObserver;
+class CNcmPortStore;
+class CNcmIcmpV4Receiver;
+class CNcmIcmpV6Receiver;
+
+/**
+ *  Connection multiplexer session abstraction.
+ *
+ *  @lib connectionmux.lib
+ *  @since S60 v3.2
+ */
+NONSHARABLE_CLASS( CNcmSession ) : public CActive,
+    public MNcmIcmpObserver
+    {
+
+public:
+
+    /**
+     * Two-phased constructor
+     *
+     * @param   aSessionId          The ID identifying session
+     * @param   aIapId              IAP id
+     * @param   aPortRangeStart     Port range start for session
+     * @param   aPortRangeStop      Port range stop for session
+     * @param   aObserver           Observer
+     * @param   aSessionObserver    Session observer 
+     */
+    static CNcmSession* NewL( TUint aSessionId, TUint32 aIapId,
+        TUint aPortRangeStart, TUint aPortRangeStop,
+        MNcmConnectionMultiplexerObserver& aObserver,
+        MNcmSessionObserver& aSessionObserver );
+
+    /**
+     * Two-phased constructor
+     *
+     * @param   aSessionId          The ID identifying session
+     * @param   aIapId              IAP id
+     * @param   aPortRangeStart     Port range start for session
+     * @param   aPortRangeStop      Port range stop for session
+     * @param   aObserver           Observer
+     * @param   aSessionObserver    Session observer 
+     */
+    static CNcmSession* NewLC( TUint aSessionId, TUint32 aIapId,
+        TUint aPortRangeStart, TUint aPortRangeStop,
+        MNcmConnectionMultiplexerObserver& aObserver,
+        MNcmSessionObserver& aSessionObserver );
+        
+    /**
+     * Destructor
+     */
+    virtual ~CNcmSession();
+
+    /**
+     * Creates a new stream. On return the client receives a
+     * stream ID. 
+     *
+     * @since   S60 3.2
+     * @param   aQos            The desired quality of service.
+     * @param   aProtocol       KProtocolInetUdp / KProtocolInetTcp
+     * @return  The ID for the created stream
+     */     
+    TUint CreateStreamL( TInt aQos, TUint aProtocol );
+    
+    /**
+     * Removes stream and all its connections. 
+     *
+     * @since   S60 3.2
+     * @param   aStreamId       The ID identifying stream
+     * @return  void
+     */
+    void RemoveStreamL( TUint aStreamId );
+    
+    /**
+     * Get session Id
+     *
+     * @since   S60 v3.2
+     * @return  Session ID
+     */
+    TUint SessionId() const;
+    
+    /**
+     * Get IAP Id
+     *
+     * @since   S60 v3.2
+     * @return  IAP ID
+     */
+    TUint32 IapId() const;
+    
+    /**
+     * Gets RSocketServ used on this session
+     *
+     * @since   S60 v3.2
+     * @return  RSocketServ used by this session
+     */
+    RSocketServ& SocketServer();
+    
+    /**
+     * Gets RConnection used on this session
+     *
+     * @since S60 v3.2
+     * @return RConnection used by this session
+     */
+    RConnection& Connection();
+    
+    /**
+     * Gets the unique name of an RConnection used on this session
+     *
+     * @since   S60 v3.2
+     * @param   aConnectionName     The unique name of an RConnection
+     * @return  system-wide error code
+     */
+    TInt GetConnectionName( TName& aConnectionName );
+    
+    /**
+     * Returns stream by identifier. Leaves with KErrNotFound if stream
+     * isn't found.
+     *
+     * @since   S60 3.2
+     * @param   aStreamId           The ID identifying stream
+     * @return  Stream
+     */
+    CNcmStream* StreamByIdL( TUint aStreamId );
+    
+    /**
+     * Receives port store
+     *
+     * @since   S60 v3.2
+     * @return  port store used on this session
+     */     
+    CNcmPortStore& PortStore() const;
+            
+    /**
+     * Return session initialization status
+     *
+     * @since   S60 v3.2
+     * @return  Initialization state    ETrue if initialized,
+     *                                  EFalse if not initialized
+     */
+    TBool Initialized() const;
+    
+    /**
+     * Resolve the destination IP address from FQDN.
+     * ( Address and port )
+     *
+     * @since   S60 v3.2
+     * @param   aAddress       The Destination FQDN
+     * @param   aPort          The Destination port
+     * @param   aResult        On return contains the resolved IP address
+     * @return  void
+     */
+    void ResolveDestinationAddressL( const TDesC8& aAddress, TUint aPort,
+        TInetAddr& aResult );
+    
+    /**
+     * Gets the local IPv4 address.
+     *
+     * @since   S60 v3.2
+     * @return  Local IPv4 address
+     */
+    TInetAddr& LocalIPv4Address();
+
+    /**
+     * Gets the local IPv6 address.
+     *
+     * @since   S60 v3.2
+     * @return  Local IPv6 address
+     */
+    TInetAddr& LocalIPv6Address();
+    
+    /**
+     * From MNcmIcmpObserver
+     *
+     * Notifies that an ICMP error is occurred using
+     * the specified remote address. Gets a local address and
+     * a remote address to be used in the creation of the ICMP message.
+     *
+     * @since   S60 v3.2
+     * @param   aAddress        Remote address on which the error occurred
+     * @param   aLocalAddress   Reference to local address
+     * @param   aRemoteAddress  Reference to remote address
+     * @return  void
+     */
+    void IcmpError( const TInetAddr& aAddress, TInetAddr& aLocalAddress,
+        TInetAddr& aRemoteAddress );
+        
+protected:
+
+    // from base class CActive
+
+    void RunL();
+        
+    void DoCancel();
+    
+    TInt RunError( TInt aError );
+    
+private:
+
+    CNcmSession( TUint aSessionId, TUint32 aIapId,
+        MNcmConnectionMultiplexerObserver& aObserver,
+        MNcmSessionObserver& aSessionObserver );
+
+    void ConstructL( TUint aPortRangeStart, TUint aPortRangeStop );
+    
+    TUint StreamIndexL( TUint aStreamId );
+    
+    TUint GenerateStreamId() const;
+    
+    void HandleIcmpErrorL( const TInetAddr& aAddress,
+        TInetAddr& aLocalAddress, TInetAddr& aRemoteAddress );
+
+private: // data
+
+    /**
+     * Unique session identifier
+     */
+     TUint iSessionId;
+     
+    /**
+     * Internet access point identifier
+     */
+    TUint32 iIapId;
+    
+    /** 
+     * Connection for socket
+     * Own.
+     */
+    RConnection iConnection;
+
+    /**
+     * Socket server for this connection
+     * Own.
+     */
+    RSocketServ iSocketServ;
+    
+    /**
+     * Streams created into the session
+     * Own.
+     */
+    RPointerArray<CNcmStream> iStreams;
+       
+    /**
+     * Handler for connection multiplexer observer
+     */
+    MNcmConnectionMultiplexerObserver& iObserver; 
+    
+    /**
+     * Handler for multiplexer session observer
+     */
+    MNcmSessionObserver& iSessionObserver;  
+    
+    /**
+     * Store where local ports are obtained
+     * Own.
+     */
+    CNcmPortStore* iPortStore;    
+    
+    /**
+     * Flag to indicate whether session is initilized
+     */
+    TBool iInitialized;
+
+    /**
+     * Local IPv4 address
+     */    
+    TInetAddr iIpv4Addr;
+
+    /**
+     * Local IPv6 address
+     */     
+    TInetAddr iIpv6Addr;
+
+    /**
+     * Connection preferences 
+     */      
+    TCommDbConnPref iConnPref;
+
+    /**
+     * Receives and handles ICMPv4 errors.
+     * Not own.
+     */    
+    CNcmIcmpV4Receiver* iIcmpV4receiver;
+
+    /**
+     * Receives and handles ICMPv6 errors.
+     * Not own.
+     */    
+    CNcmIcmpV6Receiver* iIcmpV6receiver;    
+    };
+
+
+#endif // C_CNCMSESSION_H
+