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
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
|