📄 utilx.cpp
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft shared
// source or premium shared source license agreement under which you licensed
// this source code. If you did not accept the terms of the license agreement,
// you are not authorized to use this source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the SOURCE.RTF on your install media or the root of your tools installation.
// THE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
//=--------------------------------------------------------------------------=
// utilx.Cpp
//=--------------------------------------------------------------------------=
//
// various routines et all that aren't in a file for a particular automation
// object, and don't need to be in the generic ole automation code.
//
//
#include <windows.h>
#include "utilx.h"
#include "mq.h"
#include "limits.h"
#include "time.h"
#include <svsutil.hxx>
//=--------------------------------------------------------------------------=
// HELPER: GetSafeArrayDataOfVariant
//=--------------------------------------------------------------------------=
// Gets safe array out of variant
//
// Parameters:
// pvarSrc [in] source variant containing array
// ppbBuf [out] points to array data
// pcbBuf [out] data size
//
// Output:
//
// Notes:
//
HRESULT GetSafeArrayDataOfVariant(
VARIANT *pvarSrc,
BYTE **ppbBuf,
ULONG *pcbBuf)
{
SAFEARRAY *psa = NULL;
UINT nDim, i, cbElem, cbBuf;
long lLBound, lUBound;
VOID *pvData;
HRESULT hresult = NOERROR;
// UNDONE: for now only support arrays
if (!V_ISARRAY(pvarSrc)) {
return E_INVALIDARG;
}
*pcbBuf = cbBuf = 0;
//
// array: compute byte count
//
psa = V_ISBYREF(pvarSrc) ?
*pvarSrc->pparray :
pvarSrc->parray;
if (psa) {
nDim = SafeArrayGetDim(psa);
cbElem = SafeArrayGetElemsize(psa);
for (i = 1; i <= nDim; i++) {
IfFailRet(SafeArrayGetLBound(psa, i, &lLBound));
IfFailRet(SafeArrayGetUBound(psa, i, &lUBound));
cbBuf += (lUBound - lLBound + 1) * cbElem;
}
IfFailRet(SafeArrayAccessData(psa, &pvData));
*ppbBuf = (BYTE *)pvData;
}
*pcbBuf = cbBuf;
if (psa) {
SafeArrayUnaccessData(psa);
}
return hresult;
}
//=--------------------------------------------------------------------------=
// HELPER: GetSafeArrayOfVariant
//=--------------------------------------------------------------------------=
// Gets safe array out of variant and puts in user-supplied
// byte buffer.
//
// Parameters:
// pvarSrc [in] source variant containing array
// prgbBuf [out] target buffer
// pcbBuf [out] buffer size
//
// Output:
//
// Notes:
//
HRESULT GetSafeArrayOfVariant(
VARIANT *pvarSrc,
BYTE **prgbBuf,
ULONG *pcbBuf)
{
BYTE *pbBuf = NULL;
ULONG cbBuf;
HRESULT hresult = NOERROR;
IfFailRet(GetSafeArrayDataOfVariant(
pvarSrc,
&pbBuf,
&cbBuf));
if (pbBuf) {
//
// delete current buffer
//
delete [] *prgbBuf;
//
// create new buffer and copy data
//
IfNullRet(*prgbBuf = new BYTE[cbBuf]);
memcpy(*prgbBuf, pbBuf, cbBuf);
}
*pcbBuf = cbBuf;
// fall through...
return hresult;
}
//=--------------------------------------------------------------------------=
// HELPER: PutSafeArrayOfBuffer
//=--------------------------------------------------------------------------=
// Converts byte buffer into safe array.
//
// Parameters:
// rgbBuf [in] byte buffer to convert
// cbBuf [in] buffer size
// pvarDest [out] destination variant to place safe array
//
// Output:
//
// Notes:
//
HRESULT PutSafeArrayOfBuffer(
BYTE *rgbBuf,
UINT cbBuf,
VARIANT FAR* pvarDest)
{
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
long rgIndices[1];
UINT i;
HRESULT hresult = NOERROR, hresult2 = NOERROR;
ASSERT(pvarDest);
VariantClear(pvarDest);
// create a 1D byte array
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = cbBuf;
IfNullRet(psa = SafeArrayCreate(VT_UI1, 1, rgsabound));
if (rgbBuf) {
//
// now copy array
//
for (i = 0; i < cbBuf; i++) {
rgIndices[0] = i;
IfFailGo(SafeArrayPutElement(psa, rgIndices, (VOID *)&rgbBuf[i]));
}
}
// set variant to reference safearray of bytes
V_VT(pvarDest) = VT_ARRAY | VT_UI1;
pvarDest->parray = psa;
return hresult;
Error:
hresult2 = SafeArrayDestroy(psa);
if (FAILED(hresult2)) {
return hresult2;
}
return hresult;
}
////////////////////////////////////////////////////////////////////////////////////////////
// AllocateCauVector Allocates a body of a Falcon message, of type CAUI1.
// This allocation must be freed by DeleteCauVector.
//
UCHAR *AllocateCauVector(CAUB *pcaub)
{
if (pcaub->pElems) {
delete [] pcaub->pElems;
}
// Allocating buffer.
pcaub->pElems = new unsigned char[pcaub->cElems];
return pcaub->pElems;
}
////////////////////////////////////////////////////////////////////////////////////////////
// DeleteCauVector free a body of a Falcon message, of type CAUI1, that was allocated by
// AllocateCauVector.
void DeleteCauVector(CAUB *pcaub)
{
delete [] pcaub->pElems;
pcaub->cElems = 0;
pcaub->pElems = NULL;
}
//=--------------------------------------------------------------------------=
// HELPERS: GetFormatNameType, Is{Private, Public, Direct}OfFormatName
//=--------------------------------------------------------------------------=
// Determines kind of queue: direct, private, public
//
//
// Parameters:
// bstrFormatName [in] names queue
//
// Output:
// QUEUE_FORMAT_TYPE
//
// Notes:
// Inspects format name string up to first "=" for
// literal "DIRECT", "PRIVATE", "PUBLIC"
//
//
// Find out the type of a format name (private, public or direct).
//
QUEUE_FORMAT_TYPE
GetFormatNameType(BSTR bstrFormatName)
{
LPWSTR lpwcsEqualSign;
DWORD dwIDLen;
while (*bstrFormatName != L'\0' && iswspace(*bstrFormatName)) {
bstrFormatName++;
}
if (*bstrFormatName == L'\0') {
return QUEUE_FORMAT_TYPE_UNKNOWN;
}
lpwcsEqualSign = wcschr(bstrFormatName, FORMAT_NAME_EQUAL_SIGN);
if (!lpwcsEqualSign) {
return QUEUE_FORMAT_TYPE_UNKNOWN;
}
while ((lpwcsEqualSign > bstrFormatName) && iswspace(*(--lpwcsEqualSign)));
dwIDLen = (lpwcsEqualSign - bstrFormatName) + 1;
if (dwIDLen == PRIVATE_QUEUE_INDICATOR_LENGTH) {
if (_wcsnicmp(bstrFormatName, PRIVATE_QUEUE_INDICATOR, dwIDLen) == 0) {
return QUEUE_FORMAT_TYPE_PRIVATE;
}
}
if (dwIDLen == PUBLIC_QUEUE_INDICATOR_LENGTH) {
if (_wcsnicmp(bstrFormatName, PUBLIC_QUEUE_INDICATOR, dwIDLen) == 0) {
return QUEUE_FORMAT_TYPE_PUBLIC;
}
}
if (dwIDLen == DIRECT_QUEUE_INDICATOR_LENGTH) {
if (_wcsnicmp(bstrFormatName, DIRECT_QUEUE_INDICATOR, dwIDLen) == 0) {
return QUEUE_FORMAT_TYPE_DIRECT;
}
}
if (dwIDLen == MACHINE_QUEUE_INDICATOR_LENGTH) {
if (_wcsnicmp(bstrFormatName, MACHINE_QUEUE_INDICATOR, dwIDLen) == 0) {
return QUEUE_FORMAT_TYPE_MACHINE;
}
}
if (dwIDLen == CONNECTOR_QUEUE_INDICATOR_LENGTH) {
if (_wcsnicmp(bstrFormatName, CONNECTOR_QUEUE_INDICATOR, dwIDLen) == 0) {
return QUEUE_FORMAT_TYPE_CONNECTOR;
}
}
return QUEUE_FORMAT_TYPE_UNKNOWN;
}
BOOL IsPrivateQueueOfFormatName(BSTR bstrFormatName)
{
return GetFormatNameType(bstrFormatName) == QUEUE_FORMAT_TYPE_PRIVATE;
}
BOOL IsPublicQueueOfFormatName(BSTR bstrFormatName)
{
return GetFormatNameType(bstrFormatName) == QUEUE_FORMAT_TYPE_PUBLIC;
}
BOOL IsDirectQueueOfFormatName(BSTR bstrFormatName)
{
return GetFormatNameType(bstrFormatName) == QUEUE_FORMAT_TYPE_DIRECT;
}
//=--------------------------------------------------------------------------=
// SystemTimeOfTime
//=--------------------------------------------------------------------------=
// Converts time into systemtime
//
//
// Parameters:
// iTime [in] time
//
// Output:
// [out] SYSTEMTIME
//
// Notes:
// Various weird conversions: off-by-one months, 1900 blues.
//
BOOL SystemTimeOfTime(time_t iTime, SYSTEMTIME *psystime)
{
tm *ptmTime = NULL;
/* TODO: Find an implementation of localtime()
ptmTime = localtime(&iTime);
*/
if (ptmTime == NULL) {
//
// can't convert time
//
return FALSE;
}
psystime->wYear = ptmTime->tm_year + 1900;
psystime->wMonth = ptmTime->tm_mon + 1;
psystime->wDayOfWeek = ptmTime->tm_wday;
psystime->wDay = ptmTime->tm_mday;
psystime->wHour = ptmTime->tm_hour;
psystime->wMinute = ptmTime->tm_min;
psystime->wSecond = ptmTime->tm_sec;
psystime->wMilliseconds = 0;
return TRUE;
}
//=--------------------------------------------------------------------------=
// TimeOfSystemTime
//=--------------------------------------------------------------------------=
// Converts systemtime into time
//
//
// Parameters:
// [in] SYSTEMTIME
//
// Output:
// piTime [out] time
//
// Notes:
// Various weird conversions: off-by-one months, 1900 blues.
//
BOOL TimeOfSystemTime(SYSTEMTIME *psystime, time_t *piTime)
{
tm tmTime;
tmTime.tm_year = psystime->wYear - 1900;
tmTime.tm_mon = psystime->wMonth - 1;
tmTime.tm_wday = psystime->wDayOfWeek;
tmTime.tm_mday = psystime->wDay;
tmTime.tm_hour = psystime->wHour;
tmTime.tm_min = psystime->wMinute;
tmTime.tm_sec = psystime->wSecond;
/* TODO: Find an implementation of mktime
*piTime = mktime(&tmTime);
*/
*piTime = (DWORD)-1; // mimic a failure from mktime
return (*piTime == -1);
}
//=--------------------------------------------------------------------------=
// TimeToVariantTime(time_t iTime, pvtime)
// Converts time_t to Variant time
//
// Parameters:
// iTime [in] time
// pvtime [out]
//
// Output:
// TRUE if successful else FALSE.
//
// Notes:
//
BOOL TimeToVariantTime(time_t iTime, double *pvtime)
{
SYSTEMTIME systemtime;
if (SystemTimeOfTime(iTime, &systemtime)) {
return SystemTimeToVariantTime(&systemtime, pvtime);
}
return FALSE;
}
//=--------------------------------------------------------------------------=
// VariantTimeToTime
// Converts Variant time to time_t
//
// Parameters:
// pvarTime [in] Variant datetime
// piTime [out] time_t
//
// Output:
// TRUE if successful else FALSE.
//
// Notes:
//
BOOL VariantTimeToTime(VARIANT *pvarTime, time_t *piTime)
{
// WORD wFatDate, wFatTime;
SYSTEMTIME systemtime;
double vtime;
vtime = GetDateVal(pvarTime);
if (vtime == 0) {
return FALSE;
}
if (VariantTimeToSystemTime(vtime, &systemtime)) {
return TimeOfSystemTime(&systemtime, piTime);
}
return FALSE;
}
//=--------------------------------------------------------------------------=
// GetVariantTimeOfTime
//=--------------------------------------------------------------------------=
// Converts time to variant time
//
// Parameters:
// iTime [in] time to convert to variant
// pvarTime - [out] variant time
//
// Output:
//
// Notes:
//
HRESULT GetVariantTimeOfTime(time_t iTime, VARIANT FAR* pvarTime)
{
double vtime;
VariantInit(pvarTime);
if (TimeToVariantTime(iTime, &vtime)) {
V_VT(pvarTime) = VT_DATE;
V_DATE(pvarTime) = vtime;
}
else {
V_VT(pvarTime) = VT_ERROR;
V_ERROR(pvarTime) = 13; // UNDONE: VB type mismatch
}
return NOERROR;
}
//=--------------------------------------------------------------------------=
// BstrOfTime
//=--------------------------------------------------------------------------=
// Converts time into a displayable string in user's locale
//
//
// Parameters:
// iTime [in] time
//
// Output:
// [out] string representation
//
// Notes:
//
BSTR BstrOfTime(time_t iTime)
{
SYSTEMTIME sysTime;
WCHAR bufDate[128], bufTime[128];
UINT cbDate, cbTime;
BSTR bstrDate = NULL;
SystemTimeOfTime(iTime, &sysTime);
cbDate = GetDateFormat(
LOCALE_USER_DEFAULT,
DATE_SHORTDATE, // flags specifying function options
&sysTime, // date to be formatted
0, // date format string - zero means default for locale
bufDate, // buffer for storing formatted string
SVSUTIL_ARRLEN(bufDate) // size of buffer
);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -