Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

179 lines
4.0 KiB

//
// tfprop.h
//
#ifndef TFPROP_H
#define TFPROP_H
#include "mem.h"
typedef struct _PROXY_BLOB
{
ULONG cb;
BYTE rgBytes[1]; // 0 or more...
static struct _PROXY_BLOB *Alloc(ULONG cb)
{
return (struct _PROXY_BLOB *)cicMemAlloc(sizeof(ULONG)+cb);
}
static struct _PROXY_BLOB *Clone(struct _PROXY_BLOB *blobOrg)
{
struct _PROXY_BLOB *blobNew;
if ((blobNew = Alloc(blobOrg->cb)) == NULL)
return FALSE;
blobNew->cb = blobOrg->cb;
memcpy(blobNew->rgBytes, blobOrg->rgBytes, blobOrg->cb);
return blobNew;
}
static void Free(struct _PROXY_BLOB *blob)
{
cicMemFree(blob);
}
} PROXY_BLOB;
typedef enum
{
TF_PT_NONE = 0,
TF_PT_UNKNOWN = 1,
TF_PT_DWORD = 2,
TF_PT_GUID = 3,
TF_PT_BSTR = 4
} TfPropertyType;
typedef struct tagTFPROPERTY
{
TfPropertyType type;
union
{
IUnknown * punk;
DWORD dw;
TfGuidAtom guidatom;
BSTR bstr;
PROXY_BLOB * blob;
};
} TFPROPERTY;
inline BOOL IsValidCiceroVarType(VARTYPE vt)
{
return (vt == VT_I4 || vt == VT_UNKNOWN || vt == VT_EMPTY || vt == VT_BSTR);
}
typedef enum { ADDREF, NO_ADDREF } AddRefCmd;
inline HRESULT VariantToTfProp(TFPROPERTY *ptfp, const VARIANT *pvar, AddRefCmd arc, BOOL fVTI4ToGuidAtom)
{
HRESULT hr = S_OK;
switch (pvar->vt)
{
case VT_I4:
if (fVTI4ToGuidAtom)
ptfp->type = TF_PT_GUID;
else
ptfp->type = TF_PT_DWORD;
ptfp->dw = pvar->lVal;
break;
case VT_UNKNOWN:
ptfp->type = TF_PT_UNKNOWN;
ptfp->punk = pvar->punkVal;
if (arc == ADDREF)
{
if (ptfp->punk)
ptfp->punk->AddRef();
}
break;
case VT_BSTR:
ptfp->type = TF_PT_BSTR;
ptfp->bstr = SysAllocString(pvar->bstrVal);
if (ptfp->bstr == NULL)
{
hr = E_OUTOFMEMORY;
}
break;
default:
Assert(pvar->vt == VT_EMPTY); // only valid value left
ptfp->type = TF_PT_NONE;
ptfp->dw = 0;
break;
}
return hr;
}
inline HRESULT TfPropToVariant(VARIANT *pvar, TFPROPERTY *ptfp, AddRefCmd arc)
{
HRESULT hr = S_OK;
QuickVariantInit(pvar);
switch (ptfp->type)
{
case TF_PT_DWORD:
case TF_PT_GUID:
pvar->vt = VT_I4;
pvar->lVal = ptfp->dw;
break;
case TF_PT_UNKNOWN:
pvar->vt = VT_UNKNOWN;
pvar->punkVal = ptfp->punk;
if (arc == ADDREF)
{
if (pvar->punkVal)
pvar->punkVal->AddRef();
}
break;
case TF_PT_BSTR:
pvar->vt = VT_BSTR;
if (arc == ADDREF)
{
pvar->bstrVal = SysAllocString(ptfp->bstr);
if (pvar->bstrVal == NULL)
{
hr = E_OUTOFMEMORY;
}
}
else
pvar->bstrVal = ptfp->bstr;
break;
default:
Assert(ptfp->type == TF_PT_NONE);
pvar->lVal = 0;
break;
}
return hr;
}
inline VARTYPE TfPropTypeToVarType(TfPropertyType tftype)
{
switch (tftype)
{
case TF_PT_DWORD:
case TF_PT_GUID:
return VT_I4;
case TF_PT_UNKNOWN:
return VT_UNKNOWN;
case TF_PT_BSTR:
return VT_BSTR;
default:
Assert(tftype == TF_PT_NONE);
return VT_EMPTY;
}
}
#endif // TFPROP_H