// // constr.cpp // // Implementation of CRdpConnectionString // // CRdpConnectionString implements a generic connection string // that can specify a server name and optionally a port and other // connection parameters // // Copyright(C) Microsoft Corporation 2002 // Author: Nadim Abdo (nadima) // #include "stdafx.h" #define TRC_GROUP TRC_GROUP_UI #define TRC_FILE "constr.cpp" #include #include "constr.h" #include "autil.h" CRdpConnectionString::CRdpConnectionString() { DC_BEGIN_FN("CRdpConnectionString"); memset(_szFullConnectionString, 0, sizeof(_szFullConnectionString)); DC_END_FN(); } CRdpConnectionString::CRdpConnectionString(LPCTSTR szConString) { DC_BEGIN_FN("CRdpConnectionString"); SetFullConnectionString(szConString); DC_END_FN(); } CRdpConnectionString::~CRdpConnectionString() { DC_BEGIN_FN("~CRdpConnectionString"); DC_END_FN(); } HRESULT CRdpConnectionString::SetFullConnectionString( IN LPCTSTR szConString ) { HRESULT hr; DC_BEGIN_FN("SetFullConnectionString"); hr = StringCchCopy( _szFullConnectionString, SIZE_TCHARS(_szFullConnectionString), szConString ); DC_END_FN(); return hr; } LPTSTR CRdpConnectionString::GetFullConnectionString( ) { DC_BEGIN_FN("GetFullConnectionString"); DC_END_FN(); return _szFullConnectionString; } // // Retreive the server portion of the connect string e.g. if // // 'nadima3:3389 /connect" then get "nadima3:3389" // HRESULT CRdpConnectionString::GetServerPortion( OUT LPTSTR szServerPortion, IN ULONG cchServerPortionLen ) { HRESULT hr; DC_BEGIN_FN("GetServerPortion"); hr = CUT::GetCanonicalServerNameFromConnectString( _szFullConnectionString, szServerPortion, cchServerPortionLen ); DC_END_FN(); return hr; } // // Retreive the server name portion of the connect string e.g. if // // 'nadima3:3389 /connect" then get "nadima3" // HRESULT CRdpConnectionString::GetServerNamePortion( OUT LPTSTR szServerPortion, IN ULONG cchServerPortionLen ) { HRESULT hr; TCHAR szServerPort[TSC_MAX_ADDRESS_LENGTH]; DC_BEGIN_FN("GetServerNamePortion"); hr = GetServerPortion( szServerPort, SIZE_TCHARS(szServerPort) ); if (SUCCEEDED(hr)) { CUT::GetServerNameFromFullAddress( szServerPort, szServerPortion, cchServerPortionLen ); } DC_END_FN(); return hr; } // // Retreive the args portion of the connect string e.g. if // // 'nadima3:3389 /connect" then get "/connect" // HRESULT CRdpConnectionString::GetArgumentsPortion( OUT LPTSTR szArguments, IN ULONG cchArgLen ) { HRESULT hr = E_FAIL; TCHAR szServerPortion[TSC_MAX_ADDRESS_LENGTH]; DC_BEGIN_FN("GetArgumentsPortion"); if (cchArgLen) { memset(szArguments, 0, sizeof(szArguments)); } else { hr = E_INVALIDARG; DC_QUIT; } hr = GetServerPortion( szServerPortion, SIZE_TCHARS(szServerPortion) ); if (SUCCEEDED(hr)) { ULONG cchLenServerPortion = _tcslen(szServerPortion); ULONG cchLenFull = _tcslen(_szFullConnectionString); if (cchLenFull > cchLenServerPortion) { // // There is stuff after the server name. // Return it as the arguments // LPTSTR szArgStart = _szFullConnectionString + cchLenServerPortion; hr = StringCchCopy(szArguments, cchArgLen, szArgStart); } } if (FAILED(hr) && cchArgLen) { szArguments[0] = 0; } DC_EXIT_POINT: DC_END_FN(); return hr; } // // Validate the server portion // BOOL CRdpConnectionString::ValidateServerPart( IN LPTSTR szConnectionString ) { HRESULT hr; BOOL fIsValid = FALSE; CRdpConnectionString stringToTest; DC_BEGIN_FN("ValidateServerPart"); if (NULL == szConnectionString[0]) { TRC_ERR((TB,_T("0 length server string"))); DC_QUIT; } TCHAR szServer[TSC_MAX_ADDRESS_LENGTH]; hr = stringToTest.SetFullConnectionString( szConnectionString ); if (SUCCEEDED(hr)) { hr = stringToTest.GetServerPortion( szServer, SIZE_TCHARS(szServer) ); if (FAILED(hr)) { TRC_ERR((TB,_T("Fail to get server portion"))); DC_QUIT; } if(CUT::ValidateServerName( szServer, TRUE)) { fIsValid = TRUE; } else { TRC_ERR((TB,_T("ValidateServerName failed"))); } } else { TRC_ERR((TB,_T("Fail to setfull conn string:0x%x"), hr)); } DC_END_FN(); DC_EXIT_POINT: return fIsValid; }