windows-nt/Source/XPSP1/NT/termsrv/remdsk/rds/t120/mst120/erncglbl.cpp

201 lines
6.6 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/****************************************************************************/
/* */
/* ERNCGLBL.CPP */
/* */
/* RNC global functions. */
/* */
/* Copyright Data Connection Ltd. 1995 */
/* */
/****************************************************************************/
/* Changes: */
/* */
/* 11Sep95 NFC Created. */
/* 21Sep95 NFC Initialize all combo boxes. */
/* 11Oct95 PM Remove GCC_BAD_PASSWORD */
/* */
/****************************************************************************/
#include "precomp.h"
#include "ms_util.h"
#include "ernccons.h"
#include "nccglbl.hpp"
#include "erncvrsn.hpp"
#include <cuserdta.hpp>
#include "erncconf.hpp"
#include "ernctrc.h"
/****************************************************************************/
/* GCC error table. This must macth exactly the enumeration in NCUI.H */
/****************************************************************************/
const GCCResult rcGCCTable[] =
{
GCC_RESULT_SUCCESSFUL, // NO_ERROR
GCC_RESULT_ENTRY_ALREADY_EXISTS, // UI_RC_ALREADY_IN_CONFERENCE
GCC_RESULT_ENTRY_ALREADY_EXISTS, // UI_RC_CONFERENCE_ALREADY_EXISTS
GCC_RESULT_INVALID_PASSWORD, // UI_RC_INVALID_PASSWORD,
GCC_RESULT_INVALID_CONFERENCE, // UI_RC_NO_CONFERENCE_NAME,
GCC_RESULT_UNSPECIFIED_FAILURE, // UI_RC_T120_FAILURE,
GCC_RESULT_INVALID_CONFERENCE, // UI_RC_UNKNOWN_CONFERENCE,
GCC_RESULT_INCOMPATIBLE_PROTOCOL, // UI_RC_BAD_TRANSPORT_NAME
GCC_RESULT_USER_REJECTED, // UI_RC_USER_REJECTED,
GCC_RESULT_UNSPECIFIED_FAILURE // UI_RC_ERROR > LAST_RC_GCC_MAPPED_ERROR
};
/****************************************************************************/
/* GCC error table. This must macth exactly the enumeration in GCC.H */
/****************************************************************************/
typedef struct
{
GCCError rc;
HRESULT hr;
}
RC2HR;
const RC2HR c_aRc2Hr[] =
{
{ GCC_ALREADY_INITIALIZED, UI_RC_T120_ALREADY_INITIALIZED },
{ GCC_INVALID_CONFERENCE, UI_RC_UNKNOWN_CONFERENCE },
{ GCC_CONFERENCE_ALREADY_EXISTS, UI_RC_CONFERENCE_ALREADY_EXISTS },
{ GCC_SECURITY_FAILED, UI_RC_T120_SECURITY_FAILED },
};
/****************************************************************************/
/* GCC result table.This must macth exactly the enumeration in GCC.H */
/****************************************************************************/
typedef struct
{
GCCResult result;
HRESULT hr;
}
RESULT2HR;
const RESULT2HR c_aResult2Hr[] =
{
{ GCC_RESULT_INVALID_CONFERENCE, UI_RC_UNKNOWN_CONFERENCE },
{ GCC_RESULT_INVALID_PASSWORD, UI_RC_INVALID_PASSWORD },
{ GCC_RESULT_USER_REJECTED, UI_RC_USER_REJECTED },
{ GCC_RESULT_ENTRY_ALREADY_EXISTS, UI_RC_CONFERENCE_ALREADY_EXISTS },
{ GCC_RESULT_CANCELED, UI_RC_T120_FAILURE },
{ GCC_RESULT_CONNECT_PROVIDER_REMOTE_NO_SECURITY, UI_RC_T120_REMOTE_NO_SECURITY },
{ GCC_RESULT_CONNECT_PROVIDER_REMOTE_DOWNLEVEL_SECURITY, UI_RC_T120_REMOTE_DOWNLEVEL_SECURITY },
{ GCC_RESULT_CONNECT_PROVIDER_REMOTE_REQUIRE_SECURITY, UI_RC_T120_REMOTE_REQUIRE_SECURITY },
{ GCC_RESULT_CONNECT_PROVIDER_AUTHENTICATION_FAILED, UI_RC_T120_AUTHENTICATION_FAILED },
};
HRESULT GetGCCRCDetails(GCCError rc)
{
if (GCC_NO_ERROR == rc)
{
return NO_ERROR;
}
for (int i = 0; i < sizeof(c_aRc2Hr) / sizeof(c_aRc2Hr[0]); i++)
{
if (c_aRc2Hr[i].rc == rc)
{
return c_aRc2Hr[i].hr;
}
}
return UI_RC_T120_FAILURE;
}
HRESULT GetGCCResultDetails(GCCResult result)
{
if (GCC_RESULT_SUCCESSFUL == result)
{
return NO_ERROR;
}
for (int i = 0; i < sizeof(c_aResult2Hr) / sizeof(c_aResult2Hr[0]); i++)
{
if (c_aResult2Hr[i].result == result)
{
return c_aResult2Hr[i].hr;
}
}
return UI_RC_T120_FAILURE;
}
GCCResult MapRCToGCCResult(HRESULT rc)
{
// Called to map an error code to a GCC result to give to GCC.
TRACE_FN("MapRCToGCCResult");
ASSERT(sizeof(rcGCCTable)/sizeof(rcGCCTable[0]) - (LAST_RC_GCC_MAPPED_ERROR & 0x00ff) - 2 == 0);
return (rcGCCTable[(UINT) rc > (UINT) LAST_RC_GCC_MAPPED_ERROR ? (LAST_RC_GCC_MAPPED_ERROR & 0x00ff) + 1 : (rc & 0x00ff)]);
}
HRESULT GetUnicodeFromGCC(PCSTR szGCCNumeric,
PCWSTR wszGCCUnicode,
PWSTR * pwszText)
{
// Obtain a Unicode string from a funky GCCString that may be
// ANSI numeric or Unicode text. Note that a new Unicode
// string is always allocated or NULL returned.
LPWSTR wszText;
HRESULT Status = NO_ERROR;
ASSERT(pwszText);
if (! ::IsEmptyStringW(wszGCCUnicode))
{
wszText = ::My_strdupW(wszGCCUnicode);
}
else if (! ::IsEmptyStringA(szGCCNumeric))
{
wszText = ::AnsiToUnicode(szGCCNumeric);
}
else
{
*pwszText = NULL;
return(Status);
}
if (!wszText)
{
Status = UI_RC_OUT_OF_MEMORY;
}
*pwszText = wszText;
return(Status);
}
HRESULT GetGCCFromUnicode
(
LPCWSTR pcwszText,
GCCNumericString * pGCCNumeric,
LPWSTR * pGCCUnicode
)
{
// Construct a funky GCCString that may be ANSI numeric or Unicode text
// from a Unicode string. Note that only a new ANSI numeric string may
// be constructed - the Unicode string passed is is used.
HRESULT hr = NO_ERROR;
if (! ::IsEmptyStringW(pcwszText) && ::UnicodeIsNumber(pcwszText))
{
*pGCCUnicode = NULL;
if (NULL == (*pGCCNumeric = (GCCNumericString) ::UnicodeToAnsi(pcwszText)))
{
hr = UI_RC_OUT_OF_MEMORY;
}
}
else
{
*pGCCUnicode = (LPWSTR) pcwszText;
*pGCCNumeric = NULL;
}
return hr;
}