📄 scutil.cxx
字号:
extern const DWORD ccHttpPrefix = SVSUTIL_CONSTSTRLEN(cszHttpPrefix);
extern const DWORD ccHttpsPrefix = SVSUTIL_CONSTSTRLEN(cszHttpsPrefix);
BOOL IsUriHttp(const WCHAR *szQueue) {
return (0 == _wcsnicmp(szQueue,cszHttpPrefix,ccHttpPrefix));
}
BOOL IsUriHttps(const WCHAR *szQueue) {
return (0 == _wcsnicmp(szQueue,cszHttpsPrefix,ccHttpsPrefix));
}
//---------------------------------------------------------
//
// Parse direct token type infix string.
// Return next char to parse on success, 0 on failure.
//
LPCWSTR ParseDirectTokenString(LPCWSTR p, DIRECT_TOKEN_TYPE& dtt)
{
const int unique = 0;
//-----------------------v-------------------
ASSERT(L'O' == FN_DIRECT_OS_TOKEN [unique]);
ASSERT(L'T' == FN_DIRECT_TCP_TOKEN [unique]);
ASSERT(L'S' == FN_DIRECT_SPX_TOKEN [unique]);
//-----------------------^-------------------
//
// accelarate token recognition by checking 1st character
//
switch(towupper(p[unique]))
{
// Os:
case L'O':
dtt = DT_OS;
if(_wcsnicmp(p, FN_DIRECT_OS_TOKEN, FN_DIRECT_OS_TOKEN_LEN) == 0)
return (p + FN_DIRECT_OS_TOKEN_LEN);
break;
// Tcp:
case L'T':
dtt = DT_TCP;
if(_wcsnicmp(p, FN_DIRECT_TCP_TOKEN, FN_DIRECT_TCP_TOKEN_LEN) == 0)
return (p + FN_DIRECT_TCP_TOKEN_LEN);
break;
// Spx:
case L'S':
dtt = DT_SPX;
if(_wcsnicmp(p, FN_DIRECT_SPX_TOKEN, FN_DIRECT_SPX_TOKEN_LEN) == 0)
return (p + FN_DIRECT_SPX_TOKEN_LEN);
break;
// http:// or https://
case L'H':
if (IsUriHttp(p))
{
dtt = DT_HTTP;
return p + ccHttpPrefix;
}
if (IsUriHttps(p))
{
dtt = DT_HTTPS;
return p + ccHttpsPrefix;
}
break;
}
return 0;
}
//---------------------------------------------------------
//
// Parse queue name string, (private, public)
// N.B. queue name must end with either format name suffix
// delimiter aka ';' or with end of string '\0'
// Return next char to parse on success, 0 on failure.
//
static LPCWSTR ParseQueueNameString(LPCWSTR p, BOOL* pfPrivate)
{
if(_wcsnicmp(p, PRIVATE_QUEUE_PATH_INDICATIOR, PRIVATE_QUEUE_PATH_INDICATIOR_LENGTH) == 0)
{
*pfPrivate = TRUE;
p += PRIVATE_QUEUE_PATH_INDICATIOR_LENGTH;
}
else
{
*pfPrivate = FALSE;
}
//
// Zero length queue name is illeagal
//
if(*p == L'\0')
return 0;
while(
(*p != L'\0') &&
(*p != PN_DELIMITER_C) &&
(*p != FN_SUFFIX_DELIMITER_C)
)
{
++p;
}
//
// Path name delimiter is illeagal in queue name
//
if(*p == PN_DELIMITER_C)
return 0;
return p;
}
//---------------------------------------------------------
//
// Parse machine name in a path name
// N.B. machine name must end with a path name delimiter aka slash '\\'
// Return next char to parse on success, 0 on failure.
//
static LPCWSTR ParseMachineNameString(LPCWSTR p)
{
//
// Zero length machine name is illeagal
// don't fall off the string (p++)
//
if(*p == PN_DELIMITER_C)
return 0;
if((p = FindPathNameDelimiter(p)) == 0)
return 0;
return (p + 1);
}
//---------------------------------------------------------
//
// Check if this is an expandable machine path. i.e., ".\\"
//
inline BOOL IsExpandableMachinePath(LPCWSTR p)
{
return ((p[0] == PN_LOCAL_MACHINE_C) && (p[1] == PN_DELIMITER_C));
}
//---------------------------------------------------------
//
// Optionally expand a path name with local machine name.
// N.B. expansion is done if needed.
// return pointer to new/old string
//
static LPCWSTR ExpandPathName(LPCWSTR pStart, ULONG offset, LPWSTR* ppStringToFree)
{
if((ppStringToFree == 0) || !IsExpandableMachinePath(&pStart[offset]))
return pStart;
int len = wcslen(pStart);
int iHostNameLen = wcslen (gMachine->lpszHostName);
LPWSTR pCopy = (WCHAR *)g_funcAlloc (sizeof(WCHAR) * (len + iHostNameLen + 1 - 1), g_pvAllocData);
//
// copy prefix, till offset '.'
//
memcpy(
pCopy,
pStart,
offset * sizeof(WCHAR)
);
//
// copy computer name to offset
//
memcpy(
pCopy + offset,
gMachine->lpszHostName,
iHostNameLen * sizeof(WCHAR)
);
//
// copy rest of string not including dot '.'
//
memcpy(
pCopy + offset + iHostNameLen,
pStart + offset + 1, // skip dot
(len - offset - 1 + 1) * sizeof(WCHAR) // skip dot, include '\0'
);
*ppStringToFree = pCopy;
return pCopy;
}
//---------------------------------------------------------
//
// Parse OS direct format string. (check validity of path
// name and optionally expand it)
// ppDirectFormat - expended direct format string. (in out)
// ppStringToFree - return string to free if needed.
// Return next char to parse on success, 0 on failure.
//
static LPCWSTR ParseDirectOSString(LPCWSTR p, LPCWSTR* ppDirectFormat, LPWSTR* ppStringToFree)
{
LPCWSTR pMachineName = p;
LPCWSTR pStringToCopy = *ppDirectFormat;
if((p = ParseMachineNameString(p)) == 0)
return 0;
BOOL fPrivate;
if((p = ParseQueueNameString(p, &fPrivate)) == 0)
return 0;
*ppDirectFormat = ExpandPathName(pStringToCopy, (pMachineName - pStringToCopy), ppStringToFree);
return p;
}
//---------------------------------------------------------
//
// Parse net (tcp/spx) address part of direct format string.
// Return next char to parse on success, 0 on failure.
//
static LPCWSTR ParseNetAddressString(LPCWSTR p)
{
//
// Zero length address string is illeagal
// don't fall off the string (p++)
//
if(*p == PN_DELIMITER_C)
return 0;
if((p = FindPathNameDelimiter(p)) == 0)
return 0;
return (p + 1);
}
//---------------------------------------------------------
//
// Parse HTTP / HTTPS direct format string.
// Return next char to parse on success, 0 on failure.
//
LPCWSTR
ParseDirectHttpString(
LPCWSTR p,
LPCWSTR* ppDirectFormat,
LPWSTR* ppStringToFree
)
{
size_t MachineNameOffset = p - *ppDirectFormat;
//
// Check host name is available
//
if(wcschr(FN_HTTP_SEPERATORS, *p) != 0)
return NULL;
for(; *p != L'\0' && *p != FN_SUFFIX_DELIMITER_C && *p != FN_MQF_SEPARATOR_C; p++) {
NULL;
}
*ppDirectFormat = ExpandPathName(*ppDirectFormat, MachineNameOffset, ppStringToFree);
return p;
}
//---------------------------------------------------------
//
// Parse net (tcp/spx) direct format string. (check validity of queue name)
// Return next char to parse on success, 0 on failure.
//
static LPCWSTR ParseDirectNetString(LPCWSTR p)
{
if((p = ParseNetAddressString(p)) == 0)
return 0;
BOOL fPrivate;
if((p = ParseQueueNameString(p, &fPrivate)) == 0)
return 0;
return p;
}
//---------------------------------------------------------
//
// Parse direct format string.
// return expended direct format string.
// return string to free if needed.
// Return next char to parse on success, 0 on failure.
//
static LPCWSTR ParseDirectString(LPCWSTR p, LPCWSTR* ppExpandedDirectFormat, LPWSTR* ppStringToFree)
{
*ppExpandedDirectFormat = p;
DIRECT_TOKEN_TYPE dtt;
if((p = ParseDirectTokenString(p, dtt)) == 0)
return 0;
switch(dtt)
{
case DT_OS:
p = ParseDirectOSString(p, ppExpandedDirectFormat, ppStringToFree);
break;
case DT_TCP:
case DT_SPX:
p = ParseDirectNetString(p);
break;
case DT_HTTP:
case DT_HTTPS:
p = ParseDirectHttpString(p, ppExpandedDirectFormat, ppStringToFree);
break;
default:
ASSERT(0);
}
if (p) {
SVSUTIL_ASSERT(*p != FN_SUFFIX_DELIMITER_C);
}
return p;
}
//---------------------------------------------------------
//
// Parse format name suffix string.
// Return next char to parse on success, 0 on failure.
//
static LPCWSTR ParseSuffixString(LPCWSTR p, QUEUE_SUFFIX_TYPE& qst)
{
const int unique = 5;
//---------------01234v----------------------
ASSERT(L'N' == FN_JOURNAL_SUFFIX [unique]);
ASSERT(L'L' == FN_DEADLETTER_SUFFIX [unique]);
ASSERT(L'X' == FN_DEADXACT_SUFFIX [unique]);
ASSERT(L'O' == FN_XACTONLY_SUFFIX [unique]);
//---------------01234^----------------------
//
// we already know that first character is ";"
//
ASSERT(*p == FN_SUFFIX_DELIMITER_C);
//
// accelarate token recognition by checking 6th character
//
switch(towupper(p[unique]))
{
// ;jourNal
case L'N':
qst = QUEUE_SUFFIX_TYPE_JOURNAL;
if(_wcsnicmp(p, FN_JOURNAL_SUFFIX, FN_JOURNAL_SUFFIX_LEN) == 0)
return (p + FN_JOURNAL_SUFFIX_LEN);
break;
// ;deadLetter
case L'L':
qst = QUEUE_SUFFIX_TYPE_DEADLETTER;
if(_wcsnicmp(p, FN_DEADLETTER_SUFFIX, FN_DEADLETTER_SUFFIX_LEN) == 0)
return (p + FN_DEADLETTER_SUFFIX_LEN);
break;
// ;deadXact
case L'X':
qst = QUEUE_SUFFIX_TYPE_DEADXACT;
if(_wcsnicmp(p, FN_DEADXACT_SUFFIX, FN_DEADXACT_SUFFIX_LEN) == 0)
return (p + FN_DEADXACT_SUFFIX_LEN);
break;
// ;xactOnly
case L'O':
qst = QUEUE_SUFFIX_TYPE_XACTONLY;
if(_wcsnicmp(p, FN_XACTONLY_SUFFIX, FN_XACTONLY_SUFFIX_LEN) == 0)
return (p + FN_XACTONLY_SUFFIX_LEN);
break;
}
return 0;
}
//---------------------------------------------------------
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -