#ifndef _PROFILE_SCHEMA_H #define _PROFILE_SCHEMA_H #include "BstrHash.h" #ifndef __no_msxml_dll_import__ #include "xmltlh.h" //#import rename_namespace("MSXML") //#import "msxml.dll" //#define MSXML #endif typedef CRawCIBstrHash 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