natfw/natfwclient/src/natfwclient.cpp
changeset 0 1bce908db942
equal deleted inserted replaced
-1:000000000000 0:1bce908db942
       
     1 /*
       
     2 * Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:    Implementation class of the NAT Connectivity FW
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 
       
    21 #include "natfwconnectivityapi.h"
       
    22 #include "natfwpluginapi.h"
       
    23 #include "mnatfwconnectivityobserver.h"
       
    24 #include "natfwcandidate.h"
       
    25 #include "natfwcandidatepair.h"
       
    26 
       
    27 #include "natfwclient.h"
       
    28 #include "cncmconnectionmultiplexer.h"
       
    29 #include "natfwclientlogs.h"
       
    30 #include <cnatfwsettingsapi.h>
       
    31 #include "cnatfwasynccallback.h"
       
    32 
       
    33 #include "natfwsession.h"
       
    34 #include "natfwstream.h"
       
    35 
       
    36 // ======== MEMBER FUNCTIONS ========
       
    37 
       
    38 // ---------------------------------------------------------------------------
       
    39 // CNATFWClient::CNATFWClient
       
    40 // ---------------------------------------------------------------------------
       
    41 //
       
    42 CNATFWClient::CNATFWClient()
       
    43     {
       
    44     __NATFWCLIENT("CNATFWClient::CNATFWClient")
       
    45     }
       
    46 
       
    47 
       
    48 // ---------------------------------------------------------------------------
       
    49 // CNATFWClient::ConstructL
       
    50 // ---------------------------------------------------------------------------
       
    51 //
       
    52 void CNATFWClient::ConstructL()
       
    53     {
       
    54     iConnMux = CNcmConnectionMultiplexer::NewL( *this );
       
    55     iAsyncCallback = CNatFwAsyncCallback::NewL();
       
    56     }
       
    57 
       
    58 
       
    59 // ---------------------------------------------------------------------------
       
    60 // CNATFWClient::NewL
       
    61 // ---------------------------------------------------------------------------
       
    62 //
       
    63 CNATFWClient* CNATFWClient::NewL()
       
    64     {
       
    65     __NATFWCLIENT("CNATFWClient::NewL")
       
    66     CNATFWClient* self = CNATFWClient::NewLC();
       
    67     CleanupStack::Pop( self );
       
    68     return self;
       
    69     }
       
    70 
       
    71 
       
    72 // ---------------------------------------------------------------------------
       
    73 // CNATFWClient::NewLC
       
    74 // ---------------------------------------------------------------------------
       
    75 //
       
    76 CNATFWClient* CNATFWClient::NewLC()
       
    77     {
       
    78     __NATFWCLIENT("CNATFWClient::NewLC")
       
    79     CNATFWClient* self = new( ELeave ) CNATFWClient();
       
    80     CleanupStack::PushL( self );
       
    81     self->ConstructL();
       
    82     return self;
       
    83     }
       
    84 
       
    85 
       
    86 // ---------------------------------------------------------------------------
       
    87 // CNATFWClient::~CNATFWClient()
       
    88 // ---------------------------------------------------------------------------
       
    89 //
       
    90 CNATFWClient::~CNATFWClient()
       
    91     {
       
    92     __NATFWCLIENT("CNATFWClient::~CNATFWClient")
       
    93 
       
    94     iSessions.ResetAndDestroy();
       
    95     iEventRegistry.Close();
       
    96     delete iConnMux;
       
    97     delete iAsyncCallback;
       
    98     }
       
    99 
       
   100 
       
   101 // ---------------------------------------------------------------------------
       
   102 // CNATFWClient::RegisterObserverForEventL
       
   103 // ---------------------------------------------------------------------------
       
   104 //
       
   105 void CNATFWClient::RegisterObserverForEventsL(
       
   106         MNATFWConnectivityObserver& aObserver, TUint16 aEvents )
       
   107     {
       
   108     __NATFWCLIENT_INT1(
       
   109         "CNATFWClient::RegisterObserverForEventsL, EVENTS:", aEvents )
       
   110 
       
   111     for ( TInt i(0); i < iEventRegistry.Count(); ++i )
       
   112         {
       
   113         if ( &iEventRegistry[i].Observer() == &aObserver )
       
   114             {
       
   115             // Observer already in array
       
   116             iEventRegistry[i].ProcessRegistrationL( aEvents );
       
   117             return;
       
   118             }
       
   119         }
       
   120 
       
   121     // A new observer instance detected
       
   122     TNATFWEventRegistration reg = TNATFWEventRegistration( aObserver );
       
   123     reg.ProcessRegistrationL( aEvents );
       
   124     iEventRegistry.AppendL( reg );
       
   125     }
       
   126 
       
   127 // ---------------------------------------------------------------------------
       
   128 // CNATFWClient::UnregisterObserverForEvents
       
   129 // ---------------------------------------------------------------------------
       
   130 //
       
   131 void CNATFWClient::UnregisterObserverForEvents(
       
   132         MNATFWConnectivityObserver& aObserver, TUint16 aEvents )
       
   133     {
       
   134     __NATFWCLIENT_INT1(
       
   135         "CNATFWClient::UnregisterObserverForEvents, EVENTS:", aEvents )
       
   136 
       
   137     for ( TInt i(0); i < iEventRegistry.Count(); ++i )
       
   138         {
       
   139         if ( &iEventRegistry[i].Observer() == &aObserver )
       
   140             {
       
   141             // Observer instance found
       
   142             iEventRegistry[i].ProcessUnregistration( aEvents );
       
   143             if ( !iEventRegistry[i].Events() )
       
   144                 {
       
   145                 // No registered events left, remove the whole entry
       
   146                 iEventRegistry.Remove( i );
       
   147                 }
       
   148             return;
       
   149             }
       
   150         }
       
   151     }
       
   152 
       
   153 
       
   154 // ---------------------------------------------------------------------------
       
   155 // CNATFWClient::CreateSessionL
       
   156 // ---------------------------------------------------------------------------
       
   157 //
       
   158 TUint CNATFWClient::CreateSessionL( TUint32 aIapId, const TDesC8& aDomain )
       
   159     {
       
   160     __NATFWCLIENT("CNATFWClient::CreateSessionL")
       
   161 
       
   162     CNATFWSession* session = CNATFWSession::NewL( *iConnMux, *this,
       
   163         *iAsyncCallback, aDomain, aIapId );
       
   164 
       
   165     CleanupStack::PushL( session );
       
   166     iSessions.AppendL( session );
       
   167     CleanupStack::Pop( session );
       
   168 
       
   169     return session->SessionId();
       
   170     }
       
   171 
       
   172 
       
   173 // ---------------------------------------------------------------------------
       
   174 // CNATFWClient::LoadPluginL
       
   175 // ---------------------------------------------------------------------------
       
   176 //
       
   177 void CNATFWClient::LoadPluginL( TUint aSessionId, const CDesC8Array& aPlugins,
       
   178         TInt& aLoadedPluginInd )
       
   179     {
       
   180     __NATFWCLIENT("CNATFWClient::LoadPluginL")
       
   181 
       
   182     SessionByIdL( aSessionId )->LoadPluginL( aPlugins, aLoadedPluginInd );
       
   183     }
       
   184 
       
   185 
       
   186 // ---------------------------------------------------------------------------
       
   187 // CNATFWClient::CreateStreamL
       
   188 // ---------------------------------------------------------------------------
       
   189 //
       
   190 TUint CNATFWClient::CreateStreamL( TUint aSessionId, TUint aProtocol,
       
   191         TInt aQoS )
       
   192     {
       
   193     __NATFWCLIENT("CNATFWClient::CreateStreamL")
       
   194 
       
   195     return SessionByIdL( aSessionId )->CreateStreamL( aProtocol, aQoS );
       
   196     }
       
   197 
       
   198 
       
   199 // ---------------------------------------------------------------------------
       
   200 // CNATFWClient::CreateWrapperL
       
   201 // ---------------------------------------------------------------------------
       
   202 //
       
   203 MNATFWSocketMediaConnWrapper& CNATFWClient::CreateWrapperL(
       
   204         TUint aSessionId, TUint aStreamId )
       
   205     {
       
   206     __NATFWCLIENT("CNATFWClient::CreateWrapperL")
       
   207 
       
   208     return SessionByIdL( aSessionId )->StreamByIdL( aStreamId)
       
   209         ->CreateWrapperL();
       
   210     }
       
   211 
       
   212 
       
   213 // ---------------------------------------------------------------------------
       
   214 // CNATFWClient::FetchCandidateL
       
   215 // ---------------------------------------------------------------------------
       
   216 //
       
   217 void CNATFWClient::FetchCandidateL( TUint aSessionId, TUint aStreamId,
       
   218         TUint aAddrFamily )
       
   219     {
       
   220     __NATFWCLIENT("CNATFWClient::FetchCandidateL")
       
   221 
       
   222     SessionByIdL( aSessionId )->FetchCandidateL( aStreamId, aAddrFamily );
       
   223     }
       
   224 
       
   225 
       
   226 // ---------------------------------------------------------------------------
       
   227 // CNATFWClient::FetchCandidatesL
       
   228 // ---------------------------------------------------------------------------
       
   229 //
       
   230 void CNATFWClient::FetchCandidatesL( TUint aSessionId, TUint aStreamId,
       
   231         TUint aStreamCollectionId, TUint aComponentId, TUint aAddrFamily )
       
   232     {
       
   233     __NATFWCLIENT("CNATFWClient::FetchCandidatesL")
       
   234 
       
   235     SessionByIdL( aSessionId )->FetchCandidatesL( aStreamId,
       
   236         aStreamCollectionId, aComponentId, aAddrFamily );
       
   237     }
       
   238 
       
   239 
       
   240 // ---------------------------------------------------------------------------
       
   241 // CNATFWClient::SetRoleL
       
   242 // ---------------------------------------------------------------------------
       
   243 //
       
   244 void CNATFWClient::SetRoleL( TUint aSessionId, TNATFWIceRole aRole )
       
   245     {
       
   246     __NATFWCLIENT("CNATFWClient::SetControllingModeL")
       
   247 
       
   248     SessionByIdL( aSessionId )->SetRoleL( aRole );
       
   249     }
       
   250 
       
   251 
       
   252 // ---------------------------------------------------------------------------
       
   253 // CNATFWClient::SetCredentialsL
       
   254 // ---------------------------------------------------------------------------
       
   255 //
       
   256 void CNATFWClient::SetCredentialsL(
       
   257         CNATFWCandidate& aCandidate,
       
   258         const CNATFWCredentials& aCredentials )
       
   259     {
       
   260     __NATFWCLIENT("CNATFWClient::SetCredentialsL")
       
   261 
       
   262     if ( KAFUnspec == aCandidate.TransportAddr().Family() &&
       
   263          aCandidate.TransportDomainAddr().Length() )
       
   264         {
       
   265         // Try resolving from FQDN
       
   266         ResolveFQDNAddrL( aCandidate );
       
   267         }
       
   268 
       
   269     SessionByIdL( aCandidate.SessionId() )
       
   270         ->StreamByIdL( aCandidate.StreamId() )
       
   271             ->SetCredentialsL( aCandidate, aCredentials );
       
   272     }
       
   273 
       
   274 
       
   275 // ---------------------------------------------------------------------------
       
   276 // CNATFWClient::PerformConnectivityChecksL
       
   277 // ---------------------------------------------------------------------------
       
   278 //
       
   279 void CNATFWClient::PerformConnectivityChecksL(
       
   280         TUint aSessionId, RPointerArray<CNATFWCandidate>& aRemoteCandidates )
       
   281     {
       
   282     __NATFWCLIENT("CNATFWClient::PerformConnectivityChecksL")
       
   283 
       
   284     for ( TInt i(0); i < aRemoteCandidates.Count(); i++ )
       
   285         {
       
   286         if ( KAFUnspec == aRemoteCandidates[i]->TransportAddr().Family() &&
       
   287              aRemoteCandidates[i]->TransportDomainAddr().Length() )
       
   288             {
       
   289              // Try resolving from FQDN
       
   290             ResolveFQDNAddrL( *aRemoteCandidates[i] );
       
   291             }
       
   292         }
       
   293 
       
   294     SessionByIdL( aSessionId )
       
   295         ->PerformConnectivityChecksL( aRemoteCandidates );
       
   296     }
       
   297 
       
   298 
       
   299 // ---------------------------------------------------------------------------
       
   300 // CNATFWClient::UpdateIceProcessingL
       
   301 // ---------------------------------------------------------------------------
       
   302 //
       
   303 void CNATFWClient::UpdateIceProcessingL( TUint aSessionId,
       
   304         RPointerArray<CNATFWCandidatePair>& aPeerSelectedPairs )
       
   305     {
       
   306     SessionByIdL( aSessionId )->UpdateIceProcessingL( aPeerSelectedPairs );
       
   307     }
       
   308 
       
   309 
       
   310 // ---------------------------------------------------------------------------
       
   311 // CNATFWClient::UpdateIceProcessingL
       
   312 // ---------------------------------------------------------------------------
       
   313 //
       
   314 void CNATFWClient::UpdateIceProcessingL( TUint aSessionId,
       
   315         RPointerArray<CNATFWCandidate>& aRemoteCands )
       
   316     {
       
   317     for ( TInt i(0); i < aRemoteCands.Count(); i++ )
       
   318         {
       
   319         if ( KAFUnspec == aRemoteCands[i]->TransportAddr().Family() &&
       
   320              aRemoteCands[i]->TransportDomainAddr().Length() )
       
   321             {
       
   322             // Try resolving from FQDN
       
   323             ResolveFQDNAddrL( *aRemoteCands[i] );
       
   324             }
       
   325         }
       
   326 
       
   327     SessionByIdL( aSessionId )->UpdateIceProcessingL( aRemoteCands );
       
   328     }
       
   329 
       
   330 
       
   331 // ---------------------------------------------------------------------------
       
   332 // CNATFWClient::SetReceivingStateL
       
   333 // ---------------------------------------------------------------------------
       
   334 //
       
   335 void CNATFWClient::SetReceivingStateL( 
       
   336         const CNATFWCandidate& aLocalCandidate,
       
   337         TNATFWStreamingState aState )
       
   338     {
       
   339     SessionByIdL( aLocalCandidate.SessionId() )
       
   340         ->StreamByIdL( aLocalCandidate.StreamId() )
       
   341             ->SetReceivingStateL( aLocalCandidate, aState );
       
   342     }
       
   343 
       
   344 
       
   345 // ---------------------------------------------------------------------------
       
   346 // CNATFWClient::SetSendingStateL
       
   347 // ---------------------------------------------------------------------------
       
   348 //
       
   349 void CNATFWClient::SetSendingStateL( 
       
   350         const CNATFWCandidate& aLocalCandidate,
       
   351         TNATFWStreamingState aState, const TInetAddr& aDestAddr )
       
   352     {
       
   353     SessionByIdL( aLocalCandidate.SessionId() )
       
   354         ->StreamByIdL( aLocalCandidate.StreamId() )
       
   355             ->SetSendingStateL( aLocalCandidate, aState, aDestAddr );
       
   356     }
       
   357 
       
   358 
       
   359 // ---------------------------------------------------------------------------
       
   360 // CNATFWClient::SetSendingStateL
       
   361 // ---------------------------------------------------------------------------
       
   362 //
       
   363 void CNATFWClient::SetSendingStateL( 
       
   364         const CNATFWCandidate& aLocalCandidate,
       
   365         TNATFWStreamingState aState,
       
   366         const TDesC8& aDestAddr, TUint aPort )
       
   367     {
       
   368     __NATFWCLIENT_STR8("CNATFWClient::SetSendingStateL - FQDN", aDestAddr )
       
   369     __NATFWCLIENT_INT1("CNATFWClient::SetSendingStateL - PORT", aPort )
       
   370 
       
   371     TInetAddr result;
       
   372     HBufC* addrBuf = HBufC::NewLC( aDestAddr.Length() );
       
   373     TPtr addrPtr( addrBuf->Des() );
       
   374     User::LeaveIfError(
       
   375         CnvUtfConverter::ConvertToUnicodeFromUtf8( addrPtr, aDestAddr ) );
       
   376         
       
   377     KErrNone != result.Input( addrPtr ) ?
       
   378         // This is an FQDN not convertable to an IP address
       
   379         iConnMux->ResolveDestinationAddressL(
       
   380             aLocalCandidate.StreamId(), aDestAddr, aPort, result ) :
       
   381         // Valid IP address
       
   382         result.SetPort( aPort );
       
   383     CleanupStack::PopAndDestroy( addrBuf );
       
   384 
       
   385     SetSendingStateL( aLocalCandidate, aState, result );
       
   386     }
       
   387 
       
   388 
       
   389 // ---------------------------------------------------------------------------
       
   390 // CNATFWClient::CloseStreamL
       
   391 // ---------------------------------------------------------------------------
       
   392 //
       
   393 void CNATFWClient::CloseStreamL( TUint aSessionId, TUint aStreamId )
       
   394     {
       
   395     __NATFWCLIENT("CNATFWClient::CloseStreamL")
       
   396 
       
   397     SessionByIdL( aSessionId )->CloseStreamL( aStreamId );
       
   398     }
       
   399 
       
   400 
       
   401 // ---------------------------------------------------------------------------
       
   402 // CNATFWClient::CloseSessionL
       
   403 // ---------------------------------------------------------------------------
       
   404 //
       
   405 void CNATFWClient::CloseSessionL( TUint aSessionId )
       
   406     {
       
   407     __NATFWCLIENT("CNATFWClient::CloseSessionL")
       
   408 
       
   409     CNATFWSession* session = SessionByIdL( aSessionId );
       
   410 
       
   411     TInt index = iSessions.FindL( session );
       
   412     iSessions.Remove( index );
       
   413     delete session;
       
   414     }
       
   415 
       
   416 
       
   417 // ---------------------------------------------------------------------------
       
   418 // From class MNcmConnectionMultiplexerObserver.
       
   419 // CNATFWClient::Notify
       
   420 // ---------------------------------------------------------------------------
       
   421 //
       
   422 void CNATFWClient::Notify( TUint aSessionId, TUint aStreamId,
       
   423         TNotifyType aType, TInt aError )
       
   424     {
       
   425     __NATFWCLIENT("CNATFWClient::Notify")
       
   426 
       
   427     CNATFWSession* session = NULL;
       
   428 
       
   429     if ( MNcmConnectionMultiplexerObserver::ESessionCreated == aType )
       
   430         {
       
   431         DoNotify( MNATFWConnectivityObserver::ESessionCreated, aSessionId,
       
   432             aStreamId, aError, NULL );
       
   433         }
       
   434     else if ( MNcmConnectionMultiplexerObserver::ESendingActivated ==
       
   435         aType )
       
   436         {
       
   437         TRAP_IGNORE( ( session = SessionByIdL( aSessionId ) ) )
       
   438         if ( session )
       
   439             {
       
   440             const CNATFWPluginApi& dummyParam
       
   441                 = reinterpret_cast<const CNATFWPluginApi&>( *this );
       
   442             session->Notify( dummyParam, aStreamId,
       
   443                 MNATFWPluginObserver::ESendingActivated, aError );
       
   444             }
       
   445         }
       
   446     else if ( MNcmConnectionMultiplexerObserver::ESendingDeactivated ==
       
   447         aType )
       
   448         {
       
   449         TRAP_IGNORE( ( session = SessionByIdL( aSessionId ) ) )
       
   450         if ( session )
       
   451             {
       
   452             const CNATFWPluginApi& dummyParam
       
   453                 = reinterpret_cast<const CNATFWPluginApi&>( *this );
       
   454             session->Notify( dummyParam, aStreamId,
       
   455                 MNATFWPluginObserver::ESendingDeactivated, aError );
       
   456             }
       
   457         }
       
   458     else if ( MNcmConnectionMultiplexerObserver::EReceivingActivated ==
       
   459         aType )
       
   460         {
       
   461         TRAP_IGNORE( ( session = SessionByIdL( aSessionId ) ) )
       
   462         if ( session )
       
   463             {
       
   464             const CNATFWPluginApi& dummyParam
       
   465                 = reinterpret_cast<const CNATFWPluginApi&>( *this );
       
   466             session->Notify( dummyParam, aStreamId,
       
   467                 MNATFWPluginObserver::EReceivingActivated, aError );
       
   468             }
       
   469         }
       
   470     else if ( MNcmConnectionMultiplexerObserver::EReceivingDeactivated ==
       
   471         aType )
       
   472         {
       
   473         TRAP_IGNORE( ( session = SessionByIdL( aSessionId ) ) )
       
   474         if ( session )
       
   475             {
       
   476             const CNATFWPluginApi& dummyParam
       
   477                 = reinterpret_cast<const CNATFWPluginApi&>( *this );
       
   478             session->Notify( dummyParam, aStreamId,
       
   479                 MNATFWPluginObserver::EReceivingDeactivated, aError );
       
   480             }
       
   481         }
       
   482     else
       
   483         {
       
   484         // Show event to the stream so that state info relating to the
       
   485         // stream can be updated.
       
   486         CNATFWStream* stream = FindStreamById( aStreamId );
       
   487         if ( stream )
       
   488             {
       
   489             stream->Notify( aSessionId, aStreamId, aType, aError );
       
   490             }
       
   491         }
       
   492     }
       
   493 
       
   494 
       
   495 // ---------------------------------------------------------------------------
       
   496 // From class MNATFWRegistrationController.
       
   497 // CNATFWClient::Registry
       
   498 // ---------------------------------------------------------------------------
       
   499 //
       
   500 const RArray<TNATFWEventRegistration>& CNATFWClient::Registry()
       
   501     {
       
   502     return iEventRegistry;
       
   503     }
       
   504 
       
   505 
       
   506 // ---------------------------------------------------------------------------
       
   507 // CNATFWClient::SessionByIdL
       
   508 // ---------------------------------------------------------------------------
       
   509 //
       
   510 CNATFWSession* CNATFWClient::SessionByIdL( TUint aSessionId )
       
   511     {
       
   512     __NATFWCLIENT("CNATFWClient::SessionByIdL")
       
   513 
       
   514     TInt ind( iSessions.Count() );
       
   515 
       
   516     while ( ind-- )
       
   517         {
       
   518         if ( iSessions[ind]->SessionId() == aSessionId )
       
   519             {
       
   520             return iSessions[ind];
       
   521             }
       
   522         }
       
   523 
       
   524     User::Leave( KErrNotFound );
       
   525     return NULL;    // lint #527
       
   526     }
       
   527 
       
   528 
       
   529 // ---------------------------------------------------------------------------
       
   530 // CNATFWClient::FindStreamById
       
   531 // ---------------------------------------------------------------------------
       
   532 //
       
   533 CNATFWStream* CNATFWClient::FindStreamById( TUint aStreamId )
       
   534     {
       
   535     __NATFWCLIENT("CNATFWClient::FindStreamById")
       
   536 
       
   537     TInt sessInd( iSessions.Count() );
       
   538 
       
   539     while ( sessInd-- )
       
   540         {
       
   541         CNATFWStream* stream = iSessions[sessInd]->StreamById( aStreamId );
       
   542         if ( stream )
       
   543             {
       
   544             return stream;
       
   545             }
       
   546         }
       
   547 
       
   548     return NULL;
       
   549     }
       
   550 
       
   551 
       
   552 // ---------------------------------------------------------------------------
       
   553 // CNATFWClient::ResolveFQDNAddrL
       
   554 // ---------------------------------------------------------------------------
       
   555 //
       
   556 void CNATFWClient::ResolveFQDNAddrL( CNATFWCandidate& aCandidate )
       
   557     {
       
   558     TInetAddr result;
       
   559     iConnMux->ResolveDestinationAddressL(
       
   560         aCandidate.StreamId(),
       
   561         aCandidate.TransportDomainAddr(),
       
   562         aCandidate.TransportDomainPort(),
       
   563         result );
       
   564     aCandidate.SetTransportAddrL( result );
       
   565     }
       
   566 
       
   567 
       
   568 // ---------------------------------------------------------------------------
       
   569 // CNATFWClient::DoNotify
       
   570 // ---------------------------------------------------------------------------
       
   571 //
       
   572 void CNATFWClient::DoNotify(
       
   573     MNATFWConnectivityObserver::TNATFWConnectivityEvent aEvent,
       
   574     TUint aSessionId, TUint aStreamId, TInt aErrCode,
       
   575     TAny* aEventData )
       
   576     {
       
   577     CNatFwCallbackInfo::TFunction func =
       
   578         static_cast<CNatFwCallbackInfo::TFunction>( aEvent );
       
   579     TRAP_IGNORE( iAsyncCallback->MakeCallbackL( *this,
       
   580         func, aSessionId, aStreamId, aErrCode, aEventData ) )
       
   581     }
       
   582