//================================================================= // // binding.cpp -- Generic association class // // Copyright 1999 Microsoft Corporation // //================================================================= #include #include "precomp.h" #include #include "Assoc.h" #include "Binding.h" bool CompareVariantsNoCase(const VARIANT *v1, const VARIANT *v2) { if (v1->vt == v2->vt) { switch (v1->vt) { case VT_BOOL: return (v1->boolVal == v2->boolVal); case VT_UI1: return (v1->bVal == v2->bVal); case VT_I2: return (v1->iVal == v2->iVal); case VT_I4: return (v1->lVal == v2->lVal); case VT_R4: return (v1->fltVal == v2->fltVal); case VT_R8: return (v1->dblVal == v2->dblVal); case VT_BSTR: return (0 == _wcsicmp(v1->bstrVal, v2->bstrVal)); default: ASSERT_BREAK(0); } } return false; } CBinding::CBinding( LPCWSTR pwszClassName, LPCWSTR pwszNamespaceName, LPCWSTR pwszLeftClassName, LPCWSTR pwszRightClassName, LPCWSTR pwszLeftPropertyName, LPCWSTR pwszRightPropertyName, LPCWSTR pwszLeftBindingPropertyName, LPCWSTR pwszRightBindingPropertyName ) : CAssociation ( pwszClassName, pwszNamespaceName, pwszLeftClassName, pwszRightClassName, pwszLeftPropertyName, pwszRightPropertyName ) { ASSERT_BREAK( ( pwszLeftBindingPropertyName != NULL ) && ( pwszRightBindingPropertyName != NULL) ); m_pwszLeftBindingPropertyName = pwszLeftBindingPropertyName; m_pwszRightBindingPropertyName = pwszRightBindingPropertyName; } CBinding::~CBinding() { } //======================== BOOL CBinding::AreRelated( const CInstance *pLeft, const CInstance *pRight ) { BOOL bRet = FALSE; variant_t LeftBindingPropertyValue, RightBindingPropertyValue; if (pLeft->GetVariant(m_pwszLeftBindingPropertyName, LeftBindingPropertyValue) && pRight->GetVariant(m_pwszRightBindingPropertyName, RightBindingPropertyValue) ) { bRet = CompareVariantsNoCase(&LeftBindingPropertyValue, &RightBindingPropertyValue); } else { ASSERT_BREAK(0); } return bRet; } HRESULT CBinding::GetRightInstances( MethodContext *pMethodContext, TRefPointerCollection *lefts ) { CHString sQuery; sQuery.Format(L"SELECT __RELPATH, %s FROM %s", m_pwszRightBindingPropertyName, m_pwszRightClassName); // 'StaticEnumerationCallback' will get called once for each instance // returned from the query HRESULT hr = CWbemProviderGlue::GetInstancesByQueryAsynch( sQuery, this, StaticEnumerationCallback, NULL, pMethodContext, lefts); return hr; } HRESULT CBinding::GetLeftInstances( MethodContext *pMethodContext, TRefPointerCollection &lefts ) { CHString sQuery; sQuery.Format(L"SELECT __RELPATH, %s FROM %s", m_pwszLeftBindingPropertyName, m_pwszLeftClassName); return CWbemProviderGlue::GetInstancesByQuery(sQuery, &lefts, pMethodContext); } HRESULT CBinding::RetrieveLeftInstance( LPCWSTR lpwszObjPath, CInstance **ppInstance, MethodContext *pMethodContext ) { CHStringArray csaProperties; csaProperties.Add(L"__RELPATH"); csaProperties.Add(m_pwszLeftBindingPropertyName); return CWbemProviderGlue::GetInstancePropertiesByPath(lpwszObjPath, ppInstance, pMethodContext, csaProperties); } HRESULT CBinding::RetrieveRightInstance( LPCWSTR lpwszObjPath, CInstance **ppInstance, MethodContext *pMethodContext ) { CHStringArray csaProperties; csaProperties.Add(L"__RELPATH"); csaProperties.Add(m_pwszRightBindingPropertyName); return CWbemProviderGlue::GetInstancePropertiesByPath(lpwszObjPath, ppInstance, pMethodContext, csaProperties); } // ========================================================================================================= CBinding MyTerminalServiceToSetting( L"Win32_TerminalServiceToSetting", L"root\\cimv2", L"Win32_TerminalService", L"Win32_TerminalServiceSetting", L"Element", L"Setting", L"Name", L"ServerName" ); CBinding MyTerminalTerminalSetting( L"Win32_TerminalTerminalSetting", L"root\\cimv2", L"Win32_Terminal", L"Win32_TerminalSetting", L"Element", L"Setting", L"TerminalName", L"TerminalName" ); CBinding MyTSSessionDirectorySetting( L"Win32_TSSessionDirectorySetting", L"root\\cimv2", L"Win32_TerminalService", L"Win32_TSSessionDirectory", L"Element", L"Setting", L"Name", L"SessionDirectoryActive" ); /* CBinding MyTSPermissionsSetting( L"Win32_TSPermissionsSetting", L"root\\cimv2", L"Win32_Terminal", L"Win32_TSAccount", L"Element", L"Setting", L"TerminalName", L"AccountName" ); CBinding MyTSNetworkAdapterListSetting( L"Win32_TSNetworkAdapterListSetting", L"root\\cimv2", L"Win32_NetworkAdapter", L"Win32_TSNetworkAdapterSetting", L"Element", L"Setting", L"DeviceID", L"TerminalName" ); */ /* CBinding MyNetAdaptToNetAdaptConfig( L"Win32_NetworkAdapterSetting", L"root\\cimv2", L"Win32_NetworkAdapter", L"Win32_NetworkAdapterConfiguration", L"Element", L"Setting", IDS_Index, IDS_Index); CBinding PageFileToPagefileSetting( L"Win32_PageFileElementSetting", L"root\\cimv2", L"Win32_PageFileUsage", L"Win32_PageFileSetting", L"Element", L"Setting", IDS_Name, IDS_Name); CBinding MyPrinterSetting( L"Win32_PrinterSetting", L"root\\cimv2", L"Win32_Printer", L"Win32_PrinterConfiguration", L"Element", L"Setting", IDS_DeviceID, IDS_Name); CBinding MyDiskToPartitionSet( L"Win32_DiskDriveToDiskPartition", L"root\\cimv2", L"Win32_DiskDrive", L"Win32_DiskPartition", IDS_Antecedent, IDS_Dependent, IDS_Index, IDS_DiskIndex ); CBinding assocPOTSModemToSerialPort( L"Win32_POTSModemToSerialPort", L"root\\cimv2", L"Win32_SerialPort", L"Win32_POTSModem", IDS_Antecedent, IDS_Dependent, IDS_DeviceID, IDS_AttachedTo ); CBinding OStoQFE( L"Win32_OperatingSystemQFE", L"root\\cimv2", L"Win32_OperatingSystem", L"Win32_QuickFixEngineering", IDS_Antecedent, IDS_Dependent, IDS_CSName, IDS_CSName ); */