windows-nt/Source/XPSP1/NT/admin/wmi/wbem/winmgmt/queries/metadata.cpp
2020-09-26 16:20:57 +08:00

117 lines
2.7 KiB
C++

/*++
Copyright (C) 1996-2001 Microsoft Corporation
Module Name:
METADATA.CPP
Abstract:
History:
--*/
#include "metadata.h"
#include <stdio.h>
HMM_CLASS_RELATION CMetaData::GetClassRelation(LPCWSTR wszClass1,
LPCWSTR wszClass2)
{
char ch;
printf("Is %S derived from %S? ", wszClass1, wszClass2);
scanf("%c%*c", &ch);
if(ch == 'y' || ch == 'Y')
return SECOND_IS_PARENT;
printf("Is %S derived from %S? ", wszClass2, wszClass1);
scanf("%c%*c", &ch);
if(ch == 'y' || ch == 'Y')
return FIRST_IS_PARENT;
else
return SEPARATE_BRANCHES;
}
RELEASE_ME IHmmClassObject* CMetaData::ConvertSource(
IHmmPropertySource* pSource,
IHmmPropertyList* pList = NULL)
{
HRESULT hres;
VARIANT v;
VariantInit(&v);
// Get the class
// =============
if(FAILED(pSource->GetPropertyValue(L"__CLASS", 0, &v)))
return NULL;
if(V_VT(&v) != VT_BSTR)
{
VariantClear(&v);
return NULL;
}
IHmmClassObject* pClass;
hres = m_pNamespace->GetObject(V_BSTR(&v), 0, &pClass, NULL);
VariantClear(&v);
if(FAILED(hres))
return NULL;
// Spawn an instance
// =================
IHmmClassObject* pInstance;
pClass->SpawnInstance(0, &pInstance);
pClass->Release();
// Either enumerate all properties in the list, or in the class
// ============================================================
if(pList != NULL)
{
long lNumProps;
HMM_WSTR* aProps;
pList->GetList(0, &lNumProps, &aProps);
for(long l = 0; l < lNumProps; l++)
{
if(SUCCEEDED(pSource->PropertyValue(aProps[l], 0, &v)))
{
if(FAILED(pInstance->Put(aProps[l], 0, &v, 0)))
{
// requested property not in the class. So what.
}
}
else
{
// requested property not available. So what.
}
VariantClear(&v);
}
}
else
{
pInstance->BeginEnumeration(HMM_FLAG_NONSYSTEM_ONLY);
BSTR strName;
while(pInstance->Next(&strName, NULL, NULL, NULL))
{
if(SUCCEEDED(pSource->PropertyValue(strName, 0, &v)))
{
if(FAILED(pInstance->Put(strName, 0, &v, 0)))
{
// requested property not in the class. So what.
}
}
else
{
// requested property not available. So what.
}
VariantClear(&v);
}
}
return pInstance;
}