|
|
#include "stdafx.h"
ULONG _ICQ_PEER::CreateShadowMappingPriorToConnection(PDispatchReply DispatchReplyp) /*++
Routine Description:
Creates the ShadowMapping According to the given values Arguments:
none.
Return Value:
--*/ { ULONG Error = NO_ERROR; ULONG DstIp = 0, NewDstIp = 0, SrcIp = 0, NewSrcIp = 0; USHORT DstPort = 0, NewDstPort = 0, SrcPort = 0, NewSrcPort = 0; ICQ_TRC(TM_MSG, TL_TRACE, (" Creating Shadow mapping "));
//
// Create Shadow mapping
DstIp = NewDstIp = DispatchReplyp->dispatch.dstIp;
DstPort = NewDstPort = DispatchReplyp->dispatch.dstPort;
Error = g_IAlgServicesp->GetBestSourceAddressForDestinationAddress(DstIp, TRUE, &SrcIp);
if( FAILED(Error) ) { ASSERT(FALSE); }
if(this->MappingDirection is IcqFlagIncoming) { this->ToClientSocketp->NhQueryLocalEndpointSocket ( NULL, &SrcPort );
this->ToPeerSocketp->NhQueryRemoteEndpointSocket ( &NewSrcIp, &NewSrcPort );
Error = g_IAlgServicesp->PrepareSourceModifiedProxyConnection(eALG_TCP, SrcIp, SrcPort, DstIp, DstPort, NewSrcIp, NewSrcPort, &ShadowRedirectp); } else // if outgoing
{ this->ToPeerSocketp ->NhQueryLocalEndpointSocket(NULL, &SrcPort);
NewSrcPort = SrcPort;
Error = g_IAlgServicesp->PrepareProxyConnection(eALG_TCP, SrcIp, SrcPort, DstIp, DstPort, FALSE, &ShadowRedirectp); } if( FAILED(Error) ) { ICQ_TRC(TM_MSG, TL_ERROR, ("** !! ShadowRedirect has Failed")); } else { ICQ_TRC(TM_MSG, TL_INFO, ("** Peer Shadow - Mapping Report **"));
ICQ_TRC(TM_MSG, TL_INFO, (" DstIp-DstPort %s:%hu", INET_NTOA(DstIp), htons(DstPort))); ICQ_TRC(TM_MSG, TL_INFO, (" SrcIp-SrcPort %s:%hu", INET_NTOA(SrcIp), htons(SrcPort))); ICQ_TRC(TM_MSG, TL_INFO, (" NewDstIp-NewDstPort %s:%hu", INET_NTOA(NewDstIp), htons(NewDstPort))); ICQ_TRC(TM_MSG, TL_INFO, (" NewSrcIp-NewSrcPort %s:%hu", INET_NTOA(NewSrcIp), htons(NewSrcPort))); } return Error; }
ULONG _ICQ_PEER::InitiatePeerConnection(PDispatchReply DispatchReplyp) /*++
Routine Description:
Should create the Shadow mapping and then try to fire the connection Request stuff.
Arguments:
none.
Return Value:
--*/ { PCNhSock tempSocketp = NULL; PCNhSock * sockHolder; ULONG Error = NO_ERROR; ULONG DstIp=0; USHORT DstPort = 0; PICQ_PEER IcqPeerp = this;
ICQ_TRC(TM_MSG, TL_TRACE, (" > Initiate Peer CONNECTION"));
NEW_OBJECT(tempSocketp, CNhSock); //tempSocketp = new CNhSock();
if(tempSocketp is NULL) { return E_FAIL; }
//
// Create Socket but first get the best IP address for this.
Error = g_IAlgServicesp->GetBestSourceAddressForDestinationAddress(DispatchReplyp->dispatch.dstIp, FALSE, &DstIp); if ( FAILED(DstIp) ) { ICQ_TRC(TM_MSG, TL_ERROR, ("Error Can't get the best source addr"));
DstIp = g_MyPublicIp; }
Error = tempSocketp->NhCreateStreamSocket(DstIp, 0, NULL);
if ( Error ) { ICQ_TRC(TM_MSG, TL_ERROR, ("Error - Connection Socket can't be created"));
DEREF_COMPONENT( tempSocketp, eRefInitialization );
return E_INVALIDARG; }
//
//
//
if ( this->MappingDirection is IcqFlagOutgoing ) { this->ToPeerSocketp = tempSocketp; sockHolder = &this->ToPeerSocketp ; } else { this->ToClientSocketp = tempSocketp; sockHolder = & this->ToClientSocketp ; }
DstIp = DispatchReplyp->dispatch.dstIp;
DstPort = DispatchReplyp->dispatch.dstPort;
if( CreateShadowMappingPriorToConnection(DispatchReplyp) ) { ICQ_TRC(TM_MSG, TL_ERROR, ("Error - Shadow Mapping Creation Error"));
*sockHolder = NULL;
DEREF_COMPONENT( tempSocketp, eRefInitialization );
return E_INVALIDARG; }
ICQ_TRC(TM_MSG, TL_TRACE, (" ISSUE CONNECTion to %s:%hu", INET_NTOA(DstIp), htons(DstPort)));
//
// Reference "this" due to the CONNECT
//
REF_COMPONENT( IcqPeerp, eRefIoConnect ); //this
//
// Call the Connection Request
//
Error = tempSocketp->NhConnectStreamSocket ( g_IcqComponentReferencep, DstIp, DstPort, NULL, IcqPeerConnectionCompletionRoutine, NULL, IcqPeerp, //this
NULL );
if(Error) { ICQ_TRC(TM_MSG, TL_ERROR, ("** !! Error - Connect to Peer/Client has failed"));
ErrorOut();
this->ShadowRedirectp->Cancel();
this->ShadowRedirectp->Release();
this->ShadowRedirectp = NULL;
DEREF_COMPONENT( IcqPeerp, eRefIoConnect ); //this
STOP_COMPONENT( tempSocketp );
DEREF_COMPONENT( tempSocketp, eRefInitialization );
*sockHolder = NULL;
return Error; }
return Error; }
|