#include #include #include #include #include #include #include //for wmi object path parser #include #include #include 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; } }