117 lines
2.7 KiB
C++
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;
|
|
}
|
|
|