windows-nt/Source/XPSP1/NT/ds/security/passport/include/profileschema.h
2020-09-26 16:20:57 +08:00

96 lines
2.2 KiB
C++

#ifndef _PROFILE_SCHEMA_H
#define _PROFILE_SCHEMA_H
#include "BstrHash.h"
#ifndef __no_msxml_dll_import__
#include "xmltlh.h"
//#import <msxml.dll> rename_namespace("MSXML")
//#import "msxml.dll"
//#define MSXML
#endif
typedef CRawCIBstrHash<int> RAWBSTR2INT;
#define INVALID_POS (UINT)(-1)
#define FULL_SCHEMA (DWORD)(-1)
class CProfileSchema
{
public:
// Read the raw blob according to the schema, and output the positions of
// each element. Output array size MUST be >= Count()
HRESULT parseProfile(LPSTR raw, UINT size, UINT* positions, UINT* bitFlagPositions, DWORD* pdwAttrs);
// parck profile ..., when cEles == -1, assuming full schema
BSTR packProfile(void *elements[], DWORD cEles/* = FULL_SCHEMA */);
BSTR packMaskProfile(void *elements[], int maskElemPosition);
enum AttrType {
tText=0,
tChar,
tByte,
tWord,
tLong,
tDate,
tInvalid
};
CProfileSchema();
~CProfileSchema();
BOOL isOk() const { return m_isOk; }
_bstr_t getErrorInfo() const { return m_szReason; }
long GetAgeSeconds() const;
#ifndef __no_msxml_dll_import__
BOOL Read(MSXML::IXMLElementPtr &root);
#endif
BOOL ReadFromArray(UINT numAttributes, LPTSTR names[], AttrType types[], short sizes[], BYTE readOnly[] = NULL);
int m_maskPos;
// Number of attributes
int Count() const { return m_numAtts; }
// Find the index by name
int GetIndexByName(BSTR name) const;
BSTR GetNameByIndex(int index) const;
// Get the type of an attribute
AttrType GetType(UINT index) const;
// Can I write to this attribute?
BOOL IsReadOnly(UINT index) const;
// Get the inherent size of an attribute
// Returns -1 if the type is length prefixed
int GetBitSize(UINT index) const;
int GetByteSize(UINT index) const;
CProfileSchema* AddRef();
void Release();
protected:
long m_refs;
BOOL m_isOk;
_bstr_t m_szReason;
// Valid until this time
SYSTEMTIME m_validUntil;
// Array of attribute types
UINT m_numAtts;
AttrType *m_atts;
short *m_sizes;
BYTE *m_readOnly;
RAWBSTR2INT m_indexes;
};
// Init functions for fixed schemas
CProfileSchema* InitAuthSchema();
CProfileSchema* InitSecureSchema();
#endif