/**MOD+**********************************************************************/ /* Module: nlapi.cpp */ /* */ /* Purpose: Network Layer API */ /* */ /* Copyright(C) Microsoft Corporation 1997-1999 */ /* */ /****************************************************************************/ #include extern "C" { #define TRC_GROUP TRC_GROUP_NETWORK #define TRC_FILE "anlapi" #include } #include "autil.h" #include "nl.h" #include "nc.h" #include "cd.h" #include "snd.h" CNL::CNL(CObjs* objs) { _pClientObjects = objs; } CNL::~CNL() { } /**PROC+*********************************************************************/ /* Name: NL_Init */ /* */ /* Purpose: Initialize the Network Layer */ /* */ /* Returns: None */ /* */ /* Params: IN pCallbacks - callback functions */ /* */ /**PROC-*********************************************************************/ DCVOID DCAPI CNL::NL_Init(PNL_CALLBACKS pCallbacks) { DC_BEGIN_FN("NL_Init"); _pUi = _pClientObjects->_pUiObject; _pCd = _pClientObjects->_pCdObject; _pMcs = _pClientObjects->_pMCSObject; _pNc = _pClientObjects->_pNcObject; _pUt = _pClientObjects->_pUtObject; _pRcv = _pClientObjects->_pRcvObject; TRC_ASSERT((pCallbacks != NULL), (TB, _T("Missing callbacks"))); /************************************************************************/ /* Store the callback functions */ /************************************************************************/ DC_MEMCPY((&_NL.callbacks), pCallbacks, sizeof(NL_CALLBACKS)); /************************************************************************/ /* Start the new thread */ /************************************************************************/ #ifdef OS_WIN32 _pUt->UT_StartThread(CNC::NC_StaticMain, &(_NL.threadData), _pNc); #else _pNc->NC_Init(); #endif /****************************************************************************/ /* Seed the random number generator from the clock */ /****************************************************************************/ #ifdef DC_DEBUG srand((DCUINT)_pUt->UT_GetCurrentTimeMS()); #endif /* DC_DEBUG */ TRC_NRM((TB, _T("Completed NL_Init"))); DC_END_FN(); return; } /* NL_Init */ /**PROC+*********************************************************************/ /* Name: NL_Term */ /* */ /* Purpose: Terminate the network layer. */ /* */ /* Returns: nothing */ /* */ /* Params: none */ /* */ /**PROC-*********************************************************************/ DCVOID DCAPI CNL::NL_Term(DCVOID) { DC_BEGIN_FN("NL_Term"); _pUt->UT_DestroyThread(_NL.threadData); TRC_NRM((TB, _T("Completed NL_Term"))); DC_END_FN(); return; } /* NL_Term */ /**PROC+*********************************************************************/ /* Name: NL_Connect */ /* */ /* Purpose: Connect to a server */ /* */ /* Returns: Nothing */ /* */ /* Params: bInitateConnect - TRUE if initate connection */ /* pServerAddress - address of the Server to connect to */ /* transportType - transport type: NL_TRANSPORT_TCP */ /* pProtocolName - protocol name, one of */ /* - NL_PROTOCOL_T128 */ /* - Er, that's it. */ /* pUserData - user data to pass to Server Security Manager */ /* userDataLength - length of user data */ /* */ /**PROC-*********************************************************************/ HRESULT DCAPI CNL::NL_Connect(BOOL bInitateConnect, PDCTCHAR pServerAddress, DCUINT transportType, PDCTCHAR pProtocolName, PDCVOID pUserData, DCUINT userDataLength) { DCUINT totalLen; NC_CONNECT_DATA connect; HRESULT hr = E_FAIL; DC_BEGIN_FN("NL_Connect"); DC_IGNORE_PARAMETER(transportType); TRC_ASSERT((transportType == NL_TRANSPORT_TCP), (TB, _T("Invalid transport type %d"), transportType)); if( bInitateConnect ) { TRC_ASSERT((pServerAddress != NULL), (TB, _T("No server address"))); } TRC_ASSERT((pProtocolName != NULL), (TB, _T("No protocol name"))); DC_IGNORE_PARAMETER(pProtocolName); if( bInitateConnect ) { TRC_DBG((TB, _T("ServerAddress %s protocol %s, UD len %d"), pServerAddress, pProtocolName, userDataLength)); } else { TRC_DBG((TB, _T("Connect endpoint : protocol %s, UD len %d"), pProtocolName, userDataLength)); } TRC_DATA_DBG("UserData", pUserData, userDataLength); /************************************************************************/ /* Copy data to buffer ready to send to NC. */ /************************************************************************/ if( bInitateConnect ) { connect.addressLen = DC_TSTRBYTELEN(pServerAddress); connect.bInitateConnect = TRUE; } else { connect.addressLen = 0; connect.bInitateConnect = FALSE; } connect.protocolLen = DC_TSTRBYTELEN(pProtocolName); connect.userDataLen = userDataLength; totalLen = connect.addressLen + connect.protocolLen + connect.userDataLen; TRC_DBG((TB, _T("Total length %d"), totalLen)); TRC_ASSERT((totalLen <= NC_CONNECT_DATALEN), (TB, _T("Too much connect data %d"), totalLen)); if( bInitateConnect ) { hr = StringCchCopy((PDCTCHAR)connect.data, SIZE_TCHARS(connect.data), pServerAddress); if (FAILED(hr)) { TRC_ERR((TB,_T("String copy failed for pServerAddress: 0x%x"),hr)); DC_QUIT; } } hr = StringCbCopy((PDCTCHAR)(connect.data + connect.addressLen), totalLen - connect.addressLen, pProtocolName); if (SUCCEEDED(hr)) { DC_MEMCPY(connect.data + connect.addressLen + connect.protocolLen, pUserData, connect.userDataLen); /************************************************************************/ /* Add the header bytes. */ /************************************************************************/ totalLen += FIELDOFFSET(NC_CONNECT_DATA, data[0]); TRC_DATA_DBG("Connect data", &connect, totalLen); _pCd->CD_DecoupleNotification(CD_RCV_COMPONENT, _pNc, CD_NOTIFICATION_FUNC(CNC,NC_Connect), (PDCVOID)&connect, totalLen); hr = S_OK; } else { TRC_ERR((TB,_T("String copy for user data failed: 0x%x"),hr)); DC_QUIT; } DC_EXIT_POINT: DC_END_FN(); return hr; } /* NL_Connect */ /**PROC+*********************************************************************/ /* Name: NL_Disconnect */ /* */ /* Purpose: Disconnect from the Server */ /* */ /* Returns: None */ /* */ /* Params: None */ /* */ /**PROC-*********************************************************************/ DCVOID DCAPI CNL::NL_Disconnect(DCVOID) { DC_BEGIN_FN("NL_Disconnect"); _pCd->CD_DecoupleSimpleNotification(CD_RCV_COMPONENT, _pNc, CD_NOTIFICATION_FUNC(CNC,NC_Disconnect), (ULONG_PTR) 0); DC_END_FN(); return; } /* NL_Disconnect */