windows-nt/Source/XPSP1/NT/net/wlbs/wmi/utils.cpp
2020-09-26 16:20:57 +08:00

237 lines
5.1 KiB
C++

#include <crtdbg.h>
#include <comdef.h>
#include <iostream>
#include <memory>
#include <string>
#include <wbemprov.h>
#include <genlex.h> //for wmi object path parser
#include <objbase.h>
#include <wlbsconfig.h>
#include <ntrkcomm.h>
using namespace std;
#include "objpath.h"
#include "debug.h"
#include "utils.h"
////////////////////////////////////////////////////////////////////////////////
//
// CErrorWlbsControl::CErrorWlbsControl
//
// Purpose: This object is ultimately caught and used to send WLBS error codes
// back to the user via an __ExtendedStatus object. Strings are not
// sent back in release mode due to localization concerns.
//
////////////////////////////////////////////////////////////////////////////////
CErrorWlbsControl::CErrorWlbsControl
(
DWORD a_dwError,
WLBS_COMMAND a_CmdCommand,
BOOL a_bAllClusterCall
)
{
#ifdef DBG
static char* pszWlbsCommand[] =
{
"WlbsAddPortRule",
"WlbsAddressToName",
"WlbsAddressToString",
"WlbsAdjust",
"WlbsCommitChanges",
"WlbsDeletePortRule",
"WlbsDestinationSet",
"WlbsDisable",
"WlbsDrain",
"WlbsDrainStop",
"WlbsEnable",
"WlbsFormatMessage",
"WlbsGetEffectiveVersion",
"WlbsGetNumPortRules",
"WlbsEnumPortRules",
"WlbsGetPortRule",
"WlbsInit",
"WlbsPasswordSet",
"WlbsPortSet",
"WlbsQuery",
"WlbsReadReg",
"WlbsResolve",
"WlbsResume",
"WlbsSetDefaults",
"WlbsSetRemotePassword",
"WlbsStart",
"WlbsStop",
"WlbsSuspend",
"WlbsTimeoutSet",
"WlbsWriteReg"
};
char buf[512];
if (a_CmdCommand <= CmdWlbsWriteReg)
{
if (a_CmdCommand != CmdWlbsQuery || a_dwError != WLBS_TIMEOUT)
{
sprintf(buf, "wlbsprov: %s failed, AllCluster = %d, error = %d\n",
pszWlbsCommand[a_CmdCommand], (int)a_bAllClusterCall, a_dwError);
}
}
else
{
sprintf(buf, "wlbsprov: %d failed, AllCluster = %d, error = %d\n",
a_CmdCommand, (int)a_bAllClusterCall, a_dwError);
}
OutputDebugStringA(buf);
#endif
WlbsFormatMessageWrapper( a_dwError,
a_CmdCommand,
a_bAllClusterCall,
m_wstrDescription );
m_dwError = a_dwError;
}
////////////////////////////////////////////////////////////////////////////////
//
// AddressToString
//
// Purpose: Converts a DWORD address to a wstring in dotted notation. This
// function wraps the WlbsAddressToString function.
//
//
////////////////////////////////////////////////////////////////////////////////
void AddressToString( DWORD a_dwAddress, wstring& a_szIPAddress )
{
DWORD dwLenIPAddress = 32;
WCHAR *szIPAddress = new WCHAR[dwLenIPAddress];
if( !szIPAddress )
throw _com_error( WBEM_E_OUT_OF_MEMORY );
try {
for( short nTryTwice = 2; nTryTwice > 0; nTryTwice--) {
if( ::WlbsAddressToString( a_dwAddress, szIPAddress, &dwLenIPAddress ) )
break;
delete [] szIPAddress;
szIPAddress = new WCHAR[dwLenIPAddress];
if( !szIPAddress )
throw _com_error( WBEM_E_OUT_OF_MEMORY );
}
if( !nTryTwice )
throw _com_error( WBEM_E_FAILED );
a_szIPAddress = szIPAddress;
if ( szIPAddress ) {
delete [] szIPAddress;
szIPAddress = NULL;
}
}
catch(...) {
if ( szIPAddress )
delete [] szIPAddress;
throw;
}
}
////////////////////////////////////////////////////////////////////////////////
//
// CWmiWlbsCluster::FormatMessage
//
// Purpose: Obtains a descriptive string associated with a WLBS return value.
//
////////////////////////////////////////////////////////////////////////////////
void WlbsFormatMessageWrapper
(
DWORD a_dwError,
WLBS_COMMAND a_Command,
BOOL a_bClusterWide,
wstring& a_wstrMessage
)
{
DWORD dwBuffSize = 255;
TCHAR* pszMessageBuff = new WCHAR[dwBuffSize];
if( !pszMessageBuff )
throw _com_error( WBEM_E_OUT_OF_MEMORY );
try {
for( short nTryTwice = 2; nTryTwice > 0; nTryTwice-- ) {
if( WlbsFormatMessage( a_dwError,
a_Command,
a_bClusterWide,
pszMessageBuff,
&dwBuffSize)
) break;
delete [] pszMessageBuff;
pszMessageBuff = new WCHAR[dwBuffSize];
if( !pszMessageBuff )
throw _com_error( WBEM_E_OUT_OF_MEMORY );
}
if( !nTryTwice )
throw _com_error( WBEM_E_FAILED );
a_wstrMessage = pszMessageBuff;
delete pszMessageBuff;
} catch (...) {
if( pszMessageBuff )
delete [] pszMessageBuff;
throw;
}
}
////////////////////////////////////////////////////////////////////////////////
//
// ClusterStatusOK
//
// Purpose:
//
////////////////////////////////////////////////////////////////////////////////
BOOL ClusterStatusOK(DWORD a_dwStatus)
{
if( a_dwStatus > 0 && a_dwStatus <= WLBS_MAX_HOSTS )
return TRUE;
switch( a_dwStatus ) {
case WLBS_SUSPENDED:
case WLBS_STOPPED:
case WLBS_DRAINING:
case WLBS_CONVERGING:
case WLBS_CONVERGED:
return TRUE;
break;
default:
return FALSE;
}
}