Windows Mail Database Reference
This documentation provides database-related information about the set of interfaces for objects related to Windows Mail (formerly Outlook Express).
New applications should not use this set of interfaces and schemas. These interfaces and schemas exist for backward compatibility with legacy applications. These interfaces and schemas will be unavailable in the future.
An idl such as the DirectDB.idl example in this section defines the IDatabase interface as well as several other supporting interfaces. Headers such as the OEStore6.h and SyncOp.h examples described in this overview define several TABLESCHEMA implementations and supporting structures.
The IDatabase interface enables access to database files written by Outlook Express 6. The extension for IDatabase files is .dbx. The following schemas are used to describe the folder databases:
- g_OE6FolderTableSchema - The schema for the folder databases.
- g_OE6MessageTableSchema - The schema or the message databases.
- g_OE6UidlTableSchema - The schema for a database which stores the state of spooler operations in Outlook Express 6.
- g_OE6SyncOpTableSchema - The schema for the sync operations database.
Interfaces
Topic | Contents |
---|---|
IDatabase | Do not use. Enables legacy Windows Mail database access. |
IDatabaseProgress | Do not use. Enables legacy Windows Mail database progress operations. |
IDatabaseSession | Do not use. Enables legacy Windows Mail database session operations. |
IDatabaseStream | Do not use. Enables streaming operations for legacy Windows Mail database. |
Enums
Topic | Contents |
---|---|
ACCESSTYPE | Do not use. Flags for specifying the type of access needed when accessing a stream. |
COLUMNDATATYPE | Do not use. Used to specify the type of a column of a database. |
COMPAREFLAGS | Do not use. This flag is used when defining indices of a database table. It specifies how database should compare two values. |
REGISTERNOTIFYFLAGS | Do not use. Flags for registering notification. |
SEEKROWSETTYPE | Do not use. Used as a parameter to IDatabase::SeekRowset to specify the starting location of the seek. |
SYMBOLTYPE | Do not use. Specifies the type of symbols being used. |
TABLESCHEMAFLAGS | Do not use. |
TRANSACTIONTYPE | Do not use. Specifies how a transaction affected the database. |
Structures
Topic | Contents |
---|---|
INDEXKEY | Do not use. Describes a key used in an index. |
ORDINALLIST | Do not use. This struct stores the array of index ordinals for two records. These ordinals can be used for seeking to the record in the table. |
SYMBOLINFO | Do not use. Specifies a name for a symbol. |
SYMBOLTABLE | Do not use. Specifies a set of symbols. |
TABLECOLUMN | Do not use. This structure describes a database table column. |
TABLEINDEX | Do not use. This struct represents an index on a table. It can be used to sort the records in the table by any of the columns. |
TABLESCHEMA | Do not use. Describes the schema of a database table. |
Constants
Topic | Contents |
---|---|
CMAX | Do not use. The (CMAX_*) constants are used to specify index limits on databases. |
INDEXORDINAL | Do not use. Connection type values that can be set, and their meaning. |
MISC_DB | Do not use. |
OPENDATABASEFLAGS | Do not use. DWORD that specifies various flags that are used when opening a database. |
RESERVED | Do not use. The RESERVED_ constants are used to define boundries for reserved database identifiers. |
The following is an example idl for Windows Mail database references.
import "ocidl.idl";
import "objidl.idl";
cpp_quote("#include <stddef.h> // for offsetof")
interface IDatabaseSession;
interface IDatabase;
interface IDatabaseProgress;
interface IDatabaseNotify;
interface IDatabaseStream;
cpp_quote("// {4A16043F-676D-11d2-994E-00C04FA309D4}")
cpp_quote("DEFINE_GUID(CLSID_DatabaseSession, 0x4a16043f, 0x676d, 0x11d2, 0x99, 0x4e, 0x0, 0xc0, 0x4f, 0xa3, 0x9, 0xd4);")
cpp_quote("")
cpp_quote("// {4A160440-676D-11d2-994E-00C04FA309D4}")
cpp_quote("DEFINE_GUID(IID_IDatabaseSession, 0x4a160440, 0x676d, 0x11d2, 0x99, 0x4e, 0x0, 0xc0, 0x4f, 0xa3, 0x9, 0xd4);")
cpp_quote("")
cpp_quote("// {7157F0AE-967B-11d1-9A08-00C04FA309D4}")
cpp_quote("DEFINE_GUID(IID_IDatabase, 0x7157f0ae, 0x967b, 0x11d1, 0x9a, 0x8, 0x0, 0xc0, 0x4f, 0xa3, 0x9, 0xd4);")
cpp_quote("")
cpp_quote("// {82EAD219-A6EC-11d1-9A11-00C04FA309D4}")
cpp_quote("DEFINE_GUID(IID_IDatabaseStream, 0x82ead219, 0xa6ec, 0x11d1, 0x9a, 0x11, 0x0, 0xc0, 0x4f, 0xa3, 0x9, 0xd4);")
cpp_quote("")
cpp_quote("// {5E8A5021-AC7C-11d1-9A16-00C04FA309D4}")
cpp_quote("DEFINE_GUID(IID_IDatabaseProgress, 0x5e8a5021, 0xac7c, 0x11d1, 0x9a, 0x16, 0x0, 0xc0, 0x4f, 0xa3, 0x9, 0xd4);")
cpp_quote("")
cpp_quote("// {5E8A5022-AC7C-11d1-9A16-00C04FA309D4}")
cpp_quote("DEFINE_GUID(IID_IDatabaseNotify, 0x5e8a5022, 0xac7c, 0x11d1, 0x9a, 0x16, 0x0, 0xc0, 0x4f, 0xa3, 0x9, 0xd4);")
cpp_quote("#define DB_E_ALREADYOPEN HR_E(300)")
cpp_quote("#define DB_E_CREATEMUTEX HR_E(301)")
cpp_quote("#define DB_E_CREATEFILE HR_E(302)")
cpp_quote("#define DB_E_GETFILESIZE HR_E(303)")
cpp_quote("#define DB_E_CREATEFILEMAPPING HR_E(304)")
cpp_quote("#define DB_E_MAPVIEWOFFILE HR_E(305)")
cpp_quote("#define DB_E_SETENDOFFILE HR_E(306)")
cpp_quote("#define DB_E_SETFILEPOINTER HR_E(307)")
cpp_quote("#define DB_E_BADMAJORVERSION HR_E(308)")
cpp_quote("#define DB_E_INVALIDFILESIGNATURE HR_E(309)")
cpp_quote("#define DB_E_WRITEFILE HR_E(310)")
cpp_quote("#define DB_E_TIMEOUT HR_E(311)")
cpp_quote("#define DB_E_FLUSHVIEWOFFILE HR_E(312)")
cpp_quote("#define DB_E_FLUSHFILEBUFFERS HR_E(313)")
cpp_quote("#define DB_E_DUPLICATE HR_E(314)")
cpp_quote("#define DB_E_CORRUPT HR_E(315)")
cpp_quote("#define DB_E_DISKFULL HR_E(316)")
cpp_quote("#define DB_E_GETTEMPFILENAME HR_E(317)")
cpp_quote("#define DB_E_NOTFOUND HR_E(318)")
cpp_quote("#define DB_E_STREAMTABLEFULL HR_E(319)")
cpp_quote("#define DB_E_NORECORDS HR_E(320)")
cpp_quote("#define DB_E_COMPACT_PREEMPTED HR_E(321)")
cpp_quote("#define DB_E_DATABASE_CHANGED HR_E(322)")
cpp_quote("#define DB_E_COMPACTING HR_E(323)")
cpp_quote("#define DB_E_RECORDVERSIONCHANGED HR_E(324)")
cpp_quote("#define DB_E_CORRUPTRECORD HR_E(325)")
cpp_quote("#define DB_E_BADMINORVERSION HR_E(326)")
cpp_quote("#define DB_E_TOOMANYOPENROWSETS HR_E(328)")
cpp_quote("#define DB_E_LOCKEDFORREAD HR_E(329)")
cpp_quote("#define DB_E_LOCKEDFORWRITE HR_E(330)")
cpp_quote("#define DB_E_FILENOTFOUND HR_E(331)")
cpp_quote("#define DB_E_UNMATCHINGQUOTES HR_E(332)")
cpp_quote("#define DB_E_UNMATCHINGPARENS HR_E(333)")
cpp_quote("#define DB_E_NUMBERTOOBIG HR_E(334)")
cpp_quote("#define DB_E_BADNUMBER HR_E(335)")
cpp_quote("#define DB_E_NOSYMBOLS HR_E(336)")
cpp_quote("#define DB_E_INVALIDSYMBOL HR_E(337)")
cpp_quote("#define DB_E_INVALIDCOLUMN HR_E(338)")
cpp_quote("#define DB_E_BADEXPRESSION HR_E(339)")
cpp_quote("#define DB_E_MOVEFILE HR_E(340)")
cpp_quote("#define DB_E_ACCESSDENIED HR_E(341)")
cpp_quote("#define DB_E_WRONGTHREAD HR_E(342)")
cpp_quote("#define DB_E_ALREADYREGISTERED HR_E(343)")
cpp_quote("#define DB_S_FOUND HR_S(800)")
cpp_quote("#define DB_S_NOTFOUND HR_S(801)")
cpp_quote("#define sizeofMember(s,m) sizeof(((s *)0)->m)")
#ifndef DECLARE_HANDLE
#define DECLARE_HANDLE(name) \
struct name##__ { DWORD unused; }; \
typedef struct name##__ _far* name
#endif
midl_pragma warning(disable:2395)
[
uuid(E462D143-5162-11d1-8A95-00C04FB951F3),
helpstring("Microsoft DirectDB Type Library 1.0"),
version(1.0)
]
library DirectDB
{
importlib("stdole2.tlb");
cpp_quote("#ifndef __LPDATABASE_DEFINED")
cpp_quote("#define __LPDATABASE_DEFINED")
[
object,
uuid(7157F0AE-967B-11d1-9A08-00C04FA309D4),
pointer_default(unique)
]
interface IDatabase : IUnknown
{
typedef IDatabase *LPDATABASE;
const DWORD CMAX_INDEXES = 8;
const DWORD CMAX_KEYS = 8;
const DWORD COLUMNS_ALL = 0xFFFFFFFF;
const DWORD RESERVED_ID_MIN = 0xFFFFFBFF;
const DWORD RESERVED_ID_MAX = 0xFFFFFFFF;
DECLARE_HANDLE(HROWSET);
typedef HROWSET *LPHROWSET;
const HROWSET HROWSET_INVALID = (HROWSET) 0x00000000;
DECLARE_HANDLE(HLOCK);
typedef HLOCK *LPHLOCK;
typedef enum tagSEEKROWSETTYPE {
SEEK_ROWSET_BEGIN,
SEEK_ROWSET_CURRENT,
SEEK_ROWSET_END
} SEEKROWSETTYPE;
typedef enum tagTRANSACTIONTYPE {
TRANSACTION_INSERT,
TRANSACTION_UPDATE,
TRANSACTION_DELETE,
TRANSACTION_INDEX_CHANGED,
TRANSACTION_INDEX_DELETED,
TRANSACTION_COMPACTED
} TRANSACTIONTYPE, *LPTRANSACTIONTYPE;
DECLARE_HANDLE(HTRANSACTION);
typedef HTRANSACTION *LPHTRANSACTION;
typedef DWORD FILEADDRESS;
typedef LPDWORD LPFILEADDRESS;
typedef DWORD INDEXORDINAL;
typedef LPDWORD LPINDEXORDINAL;
cpp_quote("#define INVALID_INDEX_ORDINAL 0xFFFFFFFF")
cpp_quote("#define IINDEX_PRIMARY 0")
typedef BYTE COLUMNORDINAL;
typedef BYTE *LPCOLUMNORDINAL;
typedef DWORD COMPACTFLAGS;
cpp_quote("#define COMPACT_PREEMPTABLE 0x00000001")
cpp_quote("#define COMPACT_YIELD 0x00000002")
typedef DWORD LOCKNOTIFYFLAGS;
typedef DWORD REGISTERNOTIFYFLAGS;
cpp_quote("#define REGISTER_NOTIFY_NOADDREF 0x00000001")
cpp_quote("#define REGISTER_NOTIFY_ORDINALSONLY 0x00000002")
typedef BYTE COMPAREFLAGS;
cpp_quote("#define COMPARE_IGNORECASE 0x00000001")
cpp_quote("#define COMPARE_DESCENDING 0x00000002")
cpp_quote("#define COMPARE_ASANSI 0x00000004")
typedef DWORD TABLESCHEMAFLAGS;
cpp_quote("#define TSF_RESETIFBADVERSION 0x00000001")
cpp_quote("#define TSF_HASSTREAMS 0x00000002")
typedef BYTE INDEXFLAGS;
cpp_quote("#define INDEX_DESCENDING 0x00000001")
typedef DWORD ROWORDINAL;
typedef LPDWORD LPROWORDINAL;
const ROWORDINAL INVALID_ROWORDINAL = 0xffffffff;
typedef enum tagACCESSTYPE {
ACCESS_READ=100,
ACCESS_WRITE=200
} ACCESSTYPE;
typedef enum tagCOLUMNDATATYPE {
CDT_FILETIME,
CDT_FIXSTRA,
CDT_VARSTRA,
CDT_BYTE,
CDT_DWORD,
CDT_WORD,
CDT_STREAM,
CDT_VARBLOB,
CDT_FIXBLOB,
CDT_FLAGS,
CDT_UNIQUE,
CDT_FIXSTRW,
CDT_VARSTRW,
CDT_LASTTYPE
} COLUMNDATATYPE;
typedef enum tagSYMBOLTYPE {
SYMBOL_INVALID,
SYMBOL_COLUMN,
SYMBOL_DWORD,
SYMBOL_METHOD
} SYMBOLTYPE;
typedef struct tagSYMBOLINFO {
SYMBOLTYPE tySymbol;
LPCSTR pszName;
DWORD dwValue;
} SYMBOLINFO, *LPSYMBOLINFO;
typedef struct tagSYMBOLTABLE {
DWORD cSymbols;
SYMBOLINFO rgSymbol[32];
} SYMBOLTABLE, *LPSYMBOLTABLE;
typedef SYMBOLTABLE const *LPCSYMBOLTABLE;
typedef struct tagORDINALLIST {
ROWORDINAL rgiRecord1[CMAX_INDEXES];
ROWORDINAL rgiRecord2[CMAX_INDEXES];
} ORDINALLIST, *LPORDINALLIST;
#pragma pack(1)
typedef struct tagINDEXKEY {
COLUMNORDINAL iColumn; // 1
COMPAREFLAGS bCompare; // 2
DWORD dwBits; // 6
} INDEXKEY, *LPINDEXKEY;
#pragma pack()
typedef INDEXKEY const *LPCINDEXKEY;
#pragma pack(1)
typedef struct tagTABLEINDEX {
BYTE cKeys; // 2
INDEXFLAGS bFlags; // 4
INDEXKEY rgKey[CMAX_KEYS];
} TABLEINDEX, *LPTABLEINDEX;
#pragma pack()
typedef TABLEINDEX const *LPCTABLEINDEX;
typedef struct tagTABLECOLUMN {
COLUMNORDINAL iOrdinal;
COLUMNDATATYPE type;
DWORD ofBinding;
DWORD cbSize;
} TABLECOLUMN, *LPTABLECOLUMN;
typedef TABLECOLUMN const *LPCTABLECOLUMN;
typedef struct tagTABLESCHEMA {
LPVOID pReserved;
DWORD cbBinding;
DWORD ofMemory;
DWORD ofVersion;
DWORD dwReserved;
TABLESCHEMAFLAGS dwFlags;
DWORD cbUserData;
DWORD ofUniqueId;
BYTE cColumns;
LPCTABLECOLUMN prgColumn;
LPCTABLEINDEX pPrimaryIndex;
LPCSYMBOLTABLE pSymbols;
} TABLESCHEMA, *LPTABLESCHEMA;
typedef TABLESCHEMA const *LPCTABLESCHEMA;
cpp_quote("#ifdef DEFINE_DIRECTDB")
cpp_quote("#define BEGIN_TABLE_INDEX(_index, _cKeys) \\")
cpp_quote(" extern const TABLEINDEX _index = { _cKeys, 0, {")
cpp_quote("#else")
cpp_quote("#define BEGIN_TABLE_INDEX(_index, _cKeys)")
cpp_quote("#endif")
cpp_quote("#ifdef DEFINE_DIRECTDB")
cpp_quote("#define DEFINE_KEY(_iColumn, _wCompare, _dwBits) { _iColumn, _wCompare, _dwBits },")
cpp_quote("#else")
cpp_quote("#define DEFINE_KEY(_iColumn, _wCompare, _dwBits)")
cpp_quote("#endif")
cpp_quote("#ifdef DEFINE_DIRECTDB")
cpp_quote("#define END_TABLE_INDEX } };")
cpp_quote("#else")
cpp_quote("#define END_TABLE_INDEX")
cpp_quote("#endif")
cpp_quote("#ifdef DEFINE_DIRECTDB")
cpp_quote("#define BEGIN_COLUMN_ARRAY(_name, _cColumns) const TABLECOLUMN _name[_cColumns] = {")
cpp_quote("#else")
cpp_quote("#define BEGIN_COLUMN_ARRAY(_name, _cColumns)")
cpp_quote("#endif")
cpp_quote("#ifdef DEFINE_DIRECTDB")
cpp_quote("#define DEFINE_COLUMN(_iColumn, _type, _structure, _member)\\")
cpp_quote(" { _iColumn, _type, offsetof(_structure, _member), sizeofMember(_structure, _member) },")
cpp_quote("#else")
cpp_quote("#define DEFINE_COLUMN(_iColumn, _type, _structure, _member)")
cpp_quote("#endif")
cpp_quote("#ifdef DEFINE_DIRECTDB")
cpp_quote("#define END_COLUMN_ARRAY };")
cpp_quote("#else")
cpp_quote("#define END_COLUMN_ARRAY")
cpp_quote("#endif")
cpp_quote("#ifdef DEFINE_DIRECTDB")
cpp_quote("#define BEGIN_SYMBOL_TABLE(_name, _cSymbols) \\")
cpp_quote(" extern const SYMBOLTABLE _name = { _cSymbols, {")
cpp_quote("#else")
cpp_quote("#define BEGIN_SYMBOL_TABLE(_name, _cSymbols)")
cpp_quote("#endif")
cpp_quote("#ifdef DEFINE_DIRECTDB")
cpp_quote("#define DEFINE_SYMBOL(_tySymbol, _pszName, _dwValue) \\")
cpp_quote(" { _tySymbol, (LPCSTR)_pszName, _dwValue },")
cpp_quote("#else")
cpp_quote("#define DEFINE_SYMBOL(_tySymbol, _pszName, _dwValue)")
cpp_quote("#endif")
cpp_quote("#ifdef DEFINE_DIRECTDB")
cpp_quote("#define END_SYMBOL_TABLE } };")
cpp_quote("#else")
cpp_quote("#define END_SYMBOL_TABLE")
cpp_quote("#endif")
cpp_quote("#ifdef DEFINE_DIRECTDB")
cpp_quote("#define BEGIN_TABLE_SCHEMA(_schema, _clsid, _binding) \\")
cpp_quote(" extern const TABLESCHEMA _schema = { \\")
cpp_quote(" &_clsid,\\")
cpp_quote(" sizeof(_binding),\\")
cpp_quote(" offsetof(_binding, pAllocated),\\")
cpp_quote(" offsetof(_binding, bVersion),")
cpp_quote("#else")
cpp_quote("#define BEGIN_TABLE_SCHEMA(_schema, _clsid, _binding)")
cpp_quote("#endif")
cpp_quote("#ifdef DEFINE_DIRECTDB")
cpp_quote("#define SCHEMA_PROPERTY(_value) \\")
cpp_quote(" _value,")
cpp_quote("#else")
cpp_quote("#define SCHEMA_PROPERTY(_value)")
cpp_quote("#endif")
cpp_quote("#ifdef DEFINE_DIRECTDB")
cpp_quote("#define END_TABLE_SCHEMA };")
cpp_quote("#else")
cpp_quote("#define END_TABLE_SCHEMA")
cpp_quote("#endif")
HRESULT Lock(
[out] LPHLOCK phLock);
HRESULT Unlock(
[out] LPHLOCK phLock);
HRESULT InsertRecord(
[in] LPVOID pRecord);
HRESULT UpdateRecord(
[in] LPVOID pRecord);
HRESULT DeleteRecord(
[in] LPVOID pRecord);
HRESULT FindRecord(
[in] INDEXORDINAL iIndex,
[in] DWORD cColumns, // Use COLUMNS_ALL to compare all columns of the index
[in,out] LPVOID pRecord,
[out] LPROWORDINAL piRow);
HRESULT GetRowOrdinal(
[in] INDEXORDINAL iIndex,
[in] LPVOID pRecord,
[out] LPROWORDINAL piRow);
HRESULT FreeRecord(
[in,out] LPVOID pRecord);
HRESULT GetUserData(
[in,out] LPVOID pvUserData,
[in] ULONG cbUserData);
HRESULT SetUserData(
[in] LPVOID pvUserData,
[in] ULONG cbUserData);
HRESULT GetRecordCount(
[in] INDEXORDINAL iIndex,
[out] LPDWORD pcRecords);
HRESULT GetIndexInfo(
[in] INDEXORDINAL iIndex,
[out] LPSTR *ppszFilter,
[out] LPTABLEINDEX pIndex);
HRESULT ModifyIndex(
[in] INDEXORDINAL iIndex,
[in] LPCSTR pszFilter,
[in] LPCTABLEINDEX pIndex);
HRESULT DeleteIndex(
[in] INDEXORDINAL iIndex);
HRESULT CreateRowset(
[in] INDEXORDINAL iIndex,
[in] DWORD dwReserved,
[out] LPHROWSET phRowset);
HRESULT SeekRowset(
[in] HROWSET hRowset,
[in] SEEKROWSETTYPE tySeek,
[in] LONG cRows,
[out] LPROWORDINAL piRowNew);
HRESULT QueryRowset(
[in] HROWSET hRowset,
[in] LONG cWanted,
[in,out] LPVOID *prgpRecord,
[out] LPDWORD pcObtained);
HRESULT CloseRowset(
[in,out] LPHROWSET phRowset);
HRESULT CreateStream(
[out] LPFILEADDRESS pfaStart);
HRESULT DeleteStream(
[in] FILEADDRESS faStart);
HRESULT CopyStream(
[in] IDatabase *pDest,
[in] FILEADDRESS faStream,
[out] LPFILEADDRESS pfaNew);
HRESULT OpenStream(
[in] ACCESSTYPE tyAccess,
[in] FILEADDRESS faStream,
[out] IStream **ppStream);
HRESULT ChangeStreamLock(
[in] IStream *pStream,
[in] ACCESSTYPE tyAccessNew);
HRESULT RegisterNotify(
[in] INDEXORDINAL iIndex,
[in] REGISTERNOTIFYFLAGS dwFlags,
[in] DWORD_PTR dwCookie,
[in] IDatabaseNotify *pNotify);
HRESULT DispatchNotify(
[in] IDatabaseNotify *pNotify);
HRESULT SuspendNotify(
[in] IDatabaseNotify *pNotify);
HRESULT ResumeNotify(
[in] IDatabaseNotify *pNotify);
HRESULT UnregisterNotify(
[in] IDatabaseNotify *pNotify);
HRESULT LockNotify(
[in] LOCKNOTIFYFLAGS dwFlags,
[out] LPHLOCK phLock);
HRESULT UnlockNotify(
[in,out] LPHLOCK phLock);
HRESULT GetTransaction(
[in,out] LPHTRANSACTION phTransaction,
[out] LPTRANSACTIONTYPE ptyTransaction,
[in] LPVOID pRecord1,
[in] LPVOID pRecord2,
[in,out] LPINDEXORDINAL piIndex,
[in] LPORDINALLIST pOrdinals);
HRESULT MoveFile(
[in] LPCWSTR pwszFilePath);
HRESULT SetSize(
[in] DWORD cbSize);
HRESULT Repair(void);
HRESULT Compact(
[in] IDatabaseProgress *pProgress,
[in] COMPACTFLAGS dwFlags);
HRESULT HeapAllocate(
[in] DWORD dwFlags, // HEAP_xxx Flags normally passed to HeapAlloc
[in] DWORD cbSize,
[out] LPVOID *ppBuffer);
HRESULT HeapFree(
[in] LPVOID pBuffer);
HRESULT GenerateId(
[out] LPDWORD pdwId);
HRESULT GetClientCount(
[out] LPDWORD pcClients);
HRESULT GetFile(
[out] LPWSTR *ppwszFile);
HRESULT GetSize(
[out] LPDWORD pcbFile,
[out] LPDWORD pcbAllocated,
[out] LPDWORD pcbFreed,
[out] LPDWORD pcbStreams);
}
cpp_quote("#endif // __LPDATABASE_DEFINED")
cpp_quote("#ifndef __LPDATABASESESSION_DEFINED")
cpp_quote("#define __LPDATABASESESSION_DEFINED")
[
object,
uuid(4A160440-676D-11d2-994E-00C04FA309D4),
pointer_default(unique)
]
interface IDatabaseSession : IUnknown
{
typedef IDatabaseSession *LPDATABASESESSION;
typedef DWORD OPENDATABASEFLAGS;
cpp_quote("#define OPEN_DATABASE_NORESET 0x00000001")
cpp_quote("#define OPEN_DATABASE_EXCLUSIVE 0x00000020")
cpp_quote("#define OPEN_DATABASE_NOCREATE 0x00000040")
HRESULT OpenDatabase(
[in] LPCSTR pszFile,
[in] OPENDATABASEFLAGS dwFlags,
[in] LPCTABLESCHEMA pSchema,
[in] LPVOID pReserved,
[out] IDatabase **ppDB);
HRESULT OpenDatabaseW(
[in] LPCWSTR pwszFile,
[in] OPENDATABASEFLAGS dwFlags,
[in] LPCTABLESCHEMA pSchema,
[in] LPVOID pReserved,
[out] IDatabase **ppDB);
HRESULT OpenQuery(
[in] IDatabase *pDatabase,
[in] LPCSTR pszQuery,
[in] LPVOID *pReserved);
}
cpp_quote("#endif // __LPDATABASESESSION_DEFINED")
cpp_quote("#ifndef __LPDATABASENOTIFY_DEFINED")
cpp_quote("#define __LPDATABASENOTIFY_DEFINED")
[
object,
uuid(7CADFB4C-AC65-11d1-9A16-00C04FA309D4),
pointer_default(unique)
]
interface IDatabaseNotify : IUnknown
{
typedef IDatabaseNotify *LPDATABASENOTIFY;
HRESULT OnTransaction(
[in] HTRANSACTION hTransaction,
[in] DWORD_PTR dwCookie,
[in] IDatabase *pDB);
}
cpp_quote("#endif // __LPDATABASENOTIFY_DEFINED")
cpp_quote("#ifndef __LPDATABASESTREAM_DEFINED")
cpp_quote("#define __LPDATABASESTREAM_DEFINED")
[
object,
uuid(82EAD219-A6EC-11d1-9A11-00C04FA309D4),
pointer_default(unique)
]
interface IDatabaseStream : IStream
{
typedef IDatabaseStream *LPDATABASESTREAM;
HRESULT GetFileAddress(
[out] LPFILEADDRESS pfaStream);
HRESULT CompareDatabase(
[in] IDatabase *pDatabase);
}
cpp_quote("#endif // __LPDATABASESTREAM_DEFINED")
cpp_quote("#ifndef __LPDATABASEPROGRESS_DEFINED")
cpp_quote("#define __LPDATABASEPROGRESS_DEFINED")
[
object,
uuid(7CADFB4B-AC65-11d1-9A16-00C04FA309D4),
pointer_default(unique)
]
interface IDatabaseProgress : IUnknown
{
HRESULT Update(
[in] DWORD cCount);
}
cpp_quote("#endif // __LPDATABASEPROGRESS_DEFINED")
} // DirectDB Library Object Definition
The following example header describes the Windows Mail database store references.
#pragma once
typedef DWORD FLDRFLAGS;
typedef BYTE FOLDERTYPE;
typedef DWORD RULEID;
typedef DWORD MESSAGEFLAGS;
typedef DWORDLONG FOLDERID;
#include "syncop.h"
const DWORD FOLDER_DATABASE_VERSION_OE6 = 5;
DEFINE_GUID(CLSID_MessageDatabase_OE6, 0x6f74fdc5, 0xe366, 0x11d1, 0x9a, 0x4e, 0x0, 0xc0, 0x4f, 0xa3, 0x9, 0xd4);
DEFINE_GUID(CLSID_FolderDatabase_OE6, 0x6f74fdc6, 0xe366, 0x11d1, 0x9a, 0x4e, 0x0, 0xc0, 0x4f, 0xa3, 0x9, 0xd4);
DEFINE_GUID(CLSID_SyncOpDatabase_OE6, 0x26fe9d30, 0x1a8f, 0x11d2, 0xaa, 0xbf, 0x0, 0x60, 0x97, 0xd4, 0x74, 0xc4);
typedef struct tagSTOREUSERDATA_OE6 {
FILETIME ftCreated;
BYTE fConvertedToDBX;
BYTE rgbReserved[255];
} STOREUSERDATA_OE6, *LPSTOREUSERDATA_OE6;
typedef enum tagFLDCOLID_OE6 {
FLDCOL_OE6_ID=0,
FLDCOL_OE6_PARENT,
FLDCOL_OE6_NAME,
FLDCOL_OE6_FILE,
FLDCOL_OE6_DESCRIPTION,
FLDCOL_OE6_ACCOUNTID,
FLDCOL_OE6_FLAGS,
FLDCOL_OE6_MESSAGES,
FLDCOL_OE6_UNREAD,
FLDCOL_OE6_SPECIAL,
FLDCOL_OE6_TYPE,
FLDCOL_OE6_HIERARCHY,
FLDCOL_OE6_LISTSTAMP,
FLDCOL_OE6_SERVERHIGH,
FLDCOL_OE6_SERVERLOW,
FLDCOL_OE6_SERVERCOUNT,
FLDCOL_OE6_CLIENTHIGH,
FLDCOL_OE6_CLIENTLOW,
FLDCOL_OE6_NOTDOWNLOADED,
FLDCOL_OE6_REQUESTED,
FLDCOL_OE6_URLCOMPONENT,
FLDCOL_OE6_READ,
FLDCOL_OE6_THREADUNREAD,
FLDCOL_OE6_VIEWUNREAD,
FLDCOL_OE6_STATUSMSGDELTA,
FLDCOL_OE6_STATUSUNREADDELTA,
FLDCOL_OE6_WATCHEDHIGH,
FLDCOL_OE6_WATCHEDUNREAD,
FLDCOL_OE6_WATCHED,
FLDCOL_OE6_LAST,
} FLDCOLID_OE6;
typedef struct tagFOLDERINFO_OE6 {
BYTE *pAllocated;
BYTE bVersion;
FOLDERID idFolder;
FOLDERID idParent;
LPSTR pszName;
LPSTR pszFile;
LPSTR pszDescription;
LPSTR pszAccountId; // Server Nodes Only
LPSTR pszUrlComponent;
FLDRFLAGS dwFlags;
DWORD cMessages;
DWORD cUnread;
DWORD cWatched;
DWORD cThreadUnreadOld;
DWORD cViewUnreadOld;
DWORD cWatchedUnread;
SPECIALFOLDER tySpecial;
FOLDERTYPE tyFolder;
BYTE bHierarchy;
DWORD dwListStamp;
DWORD dwServerHigh; // highest numbered article on server (news)
DWORD dwServerLow; // lowest numbered article on server (news)
DWORD dwServerCount; // count of articles on server (news)
DWORD dwClientHigh; // highest numbered article known to client (news)
DWORD dwClientLow; // lowest numbered article known to client (news)
DWORD dwStatusMsgDelta; // total number of msgs added via STATUS resp. (IMAP)
DWORD dwStatusUnreadDelta; // number of unread added via STATUS resp. (IMAP)
DWORD dwNotDownloaded;
BLOB Requested;
BLOB Read;
DWORD dwClientWatchedHigh; // Highest numbered article we've checked for watch info (news)
} FOLDERINFO_OE6, *LPFOLDERINFO_OE6;
BEGIN_COLUMN_ARRAY(g_rgOE6FldTblColumns, FLDCOL_OE6_LAST)
DEFINE_COLUMN(FLDCOL_OE6_ID, CDT_UNIQUE, FOLDERINFO_OE6, idFolder)
DEFINE_COLUMN(FLDCOL_OE6_PARENT, CDT_DWORD, FOLDERINFO_OE6, idParent)
DEFINE_COLUMN(FLDCOL_OE6_NAME, CDT_VARSTRA, FOLDERINFO_OE6, pszName)
DEFINE_COLUMN(FLDCOL_OE6_FILE, CDT_VARSTRA, FOLDERINFO_OE6, pszFile)
DEFINE_COLUMN(FLDCOL_OE6_DESCRIPTION, CDT_VARSTRA, FOLDERINFO_OE6, pszDescription)
DEFINE_COLUMN(FLDCOL_OE6_ACCOUNTID, CDT_VARSTRA, FOLDERINFO_OE6, pszAccountId)
DEFINE_COLUMN(FLDCOL_OE6_FLAGS, CDT_FLAGS, FOLDERINFO_OE6, dwFlags)
DEFINE_COLUMN(FLDCOL_OE6_MESSAGES, CDT_DWORD, FOLDERINFO_OE6, cMessages)
DEFINE_COLUMN(FLDCOL_OE6_UNREAD, CDT_DWORD, FOLDERINFO_OE6, cUnread)
DEFINE_COLUMN(FLDCOL_OE6_SPECIAL, CDT_BYTE, FOLDERINFO_OE6, tySpecial)
DEFINE_COLUMN(FLDCOL_OE6_TYPE, CDT_BYTE, FOLDERINFO_OE6, tyFolder)
DEFINE_COLUMN(FLDCOL_OE6_HIERARCHY, CDT_BYTE, FOLDERINFO_OE6, bHierarchy)
DEFINE_COLUMN(FLDCOL_OE6_LISTSTAMP, CDT_DWORD, FOLDERINFO_OE6, dwListStamp)
DEFINE_COLUMN(FLDCOL_OE6_SERVERHIGH, CDT_DWORD, FOLDERINFO_OE6, dwServerHigh)
DEFINE_COLUMN(FLDCOL_OE6_SERVERLOW, CDT_DWORD, FOLDERINFO_OE6, dwServerLow)
DEFINE_COLUMN(FLDCOL_OE6_SERVERCOUNT, CDT_DWORD, FOLDERINFO_OE6, dwServerCount)
DEFINE_COLUMN(FLDCOL_OE6_CLIENTHIGH, CDT_DWORD, FOLDERINFO_OE6, dwClientHigh)
DEFINE_COLUMN(FLDCOL_OE6_CLIENTLOW, CDT_DWORD, FOLDERINFO_OE6, dwClientLow)
DEFINE_COLUMN(FLDCOL_OE6_NOTDOWNLOADED, CDT_DWORD, FOLDERINFO_OE6, dwNotDownloaded)
DEFINE_COLUMN(FLDCOL_OE6_REQUESTED, CDT_VARBLOB, FOLDERINFO_OE6, Requested)
DEFINE_COLUMN(FLDCOL_OE6_URLCOMPONENT, CDT_VARSTRA, FOLDERINFO_OE6, pszUrlComponent)
DEFINE_COLUMN(FLDCOL_OE6_READ, CDT_VARBLOB, FOLDERINFO_OE6, Read)
DEFINE_COLUMN(FLDCOL_OE6_THREADUNREAD, CDT_DWORD, FOLDERINFO_OE6, cThreadUnreadOld)
DEFINE_COLUMN(FLDCOL_OE6_VIEWUNREAD, CDT_DWORD, FOLDERINFO_OE6, cViewUnreadOld)
DEFINE_COLUMN(FLDCOL_OE6_STATUSMSGDELTA, CDT_DWORD, FOLDERINFO_OE6, dwStatusMsgDelta)
DEFINE_COLUMN(FLDCOL_OE6_STATUSUNREADDELTA, CDT_DWORD, FOLDERINFO_OE6, dwStatusUnreadDelta)
DEFINE_COLUMN(FLDCOL_OE6_WATCHEDHIGH, CDT_DWORD, FOLDERINFO_OE6, dwClientWatchedHigh)
DEFINE_COLUMN(FLDCOL_OE6_WATCHEDUNREAD, CDT_DWORD, FOLDERINFO_OE6, cWatchedUnread)
DEFINE_COLUMN(FLDCOL_OE6_WATCHED, CDT_DWORD, FOLDERINFO_OE6, cWatched)
END_COLUMN_ARRAY
BEGIN_SYMBOL_TABLE(g_OE6FldSymbolTable, 2)
DEFINE_SYMBOL(SYMBOL_DWORD, "FOLDER_SUBSCRIBED", FOLDER_SUBSCRIBED)
DEFINE_SYMBOL(SYMBOL_COLUMN, "FLDCOL_FLAGS", FLDCOL_OE6_FLAGS)
END_SYMBOL_TABLE
BEGIN_TABLE_INDEX(g_OE6FldTblPrimaryIndex, 1)
DEFINE_KEY(FLDCOL_OE6_ID, 0, 0)
END_TABLE_INDEX
BEGIN_TABLE_SCHEMA(g_OE6FolderTableSchema, CLSID_FolderDatabase_OE6, FOLDERINFO_OE6)
SCHEMA_PROPERTY(FOLDER_DATABASE_VERSION_OE6)
SCHEMA_PROPERTY(TSF_RESETIFBADVERSION | TSF_HASEXTENSION)
SCHEMA_PROPERTY(sizeof(STOREUSERDATA_OE6))
SCHEMA_PROPERTY(offsetof(FOLDERINFO_OE6, idFolder))
SCHEMA_PROPERTY(FLDCOL_OE6_LAST)
SCHEMA_PROPERTY(g_rgOE6FldTblColumns)
SCHEMA_PROPERTY(&g_OE6FldTblPrimaryIndex)
SCHEMA_PROPERTY(&g_OE6FldSymbolTable)
SCHEMA_PROPERTY(NULL) // Secondary indices
END_TABLE_SCHEMA
extern const TABLESCHEMA g_OE6FolderTableSchema;
const DWORD MESSAGE_DATABASE_VERSION_OE6 = 5;
const DWORD CB_COLUMNS_OE6 = 256;
typedef enum tagMSGTABLECOLID_OE6 {
MSGCOL_OE6_ID=0,
MSGCOL_OE6_FLAGS,
MSGCOL_OE6_DATE,
MSGCOL_OE6_LINECOUNT,
MSGCOL_OE6_STREAM,
MSGCOL_OE6_NORMALSUBJ,
MSGCOL_OE6_DOWNLOADTIME,
MSGCOL_OE6_MESSAGEID,
MSGCOL_OE6_SUBJECT,
MSGCOL_OE6_FROMHEADER,
MSGCOL_OE6_REFERENCES,
MSGCOL_OE6_XREF,
MSGCOL_OE6_SERVER,
MSGCOL_OE6_DISPLAYFROM,
MSGCOL_OE6_EMAILFROM,
MSGCOL_OE6_LANGUAGE,
MSGCOL_OE6_PRIORITY,
MSGCOL_OE6_SIZE,
MSGCOL_OE6_RECEIVEDDATE,
MSGCOL_OE6_DISPLAYTO,
MSGCOL_OE6_EMAILTO,
MSGCOL_OE6_PARTIALINFO,
MSGCOL_OE6_POP3UIDL,
MSGCOL_OE6_USERNAMEOLD,
MSGCOL_OE6_PARTIALID,
MSGCOL_OE6_FORWARDTO,
MSGCOL_OE6_ACCOUNTNAME,
MSGCOL_OE6_ACCOUNTID,
MSGCOL_OE6_OFFSETTABLE,
MSGCOL_OE6_HIGHLIGHT,
MSGCOL_OE6_FOLDER,
MSGCOL_OE6_FINDFOLDER,
MSGCOL_OE6_FINDSOURCE,
MSGCOL_OE6_PARENTOLD,
MSGCOL_OE6_THREADIDOLD,
MSGCOL_OE6_URLCOMPONENT,
MSGCOL_OE6_STREAMIDOLD,
MSGCOL_OE6_VERSION,
MSGCOL_OE6_MSOESREC,
MSGCOL_OE6_LASTID
} MSGTABLECOLID_OE6;
typedef struct tagFOLDERUSERDATA_OE6 {
DWORD fInitialized; // 4 Has this folder been initialized yet
FOLDERTYPE tyFolder; // the folder type
CHAR szAcctId[CCHMAX_ACCOUNT_NAME]; // 276 Account Id that folder belongs to
CHAR szFolder[CCHMAX_FOLDER_NAME]; // 532 Folder Name
SPECIALFOLDER tySpecial; // 536 Special Folder Type
DWORD fSubscribed; // 540 Is the folder subscribed ?
DWORD idSort; // 544 Current View Sort Order
DWORD fAscending; // 548 Current view is ascending ?
DWORD fThreaded; // 552 Current view is threaded
RULEID ridFilter; // 556 Current Filter for this Folder
DWORD dwFilterVersion; // 560 Version of the filter
FOLDERID idFolder; // 564 Id of this folder
DWORD fWelcomeAdded; // 568 I have already added a welcome message...
DWORD dwUIDValidity; // 572 IMAP: Tells us if current acache is invalid
DWORD idMsgSelected; // The last Selected row
BYTE rgbColumns[CB_COLUMNS_OE6]; // Persisted Column Set
DWORD dwReserved1; // Used for sorting children
DWORD dwReserved2; // Reserved
DWORD fExpandAll; // Expand All Threads?
DWORD dwReserved3; // Do we have a dead filter?
BYTE fViewCounts; // Converted to view counts
BYTE fNewThreadModel; // Converted to shared stream table ?
BYTE fWatchedCounts; // Converted to watched unread counts?
BYTE fTotalWatched; // Total Watched has been migrated.
BYTE fShowDeleted; // Current view shows deleted messages
BYTE fShowReplies; // Current view shows message replies
BYTE fNoIndexes; // No more indexes
BYTE rgReserved[717]; // Reserved
} FOLDERUSERDATA_OE6, *LPFOLDERUSERDATA_OE6;
typedef struct tagMESSAGEINFO_OE6 {
BYTE *pAllocated;
BYTE bVersion;
DWORD_PTR dwReserved;
MESSAGEID idMessage;
MESSAGEFLAGS dwFlags;
FILETIME ftSent;
DWORD cLines;
FILEADDRESS faStream;
DWORD idStreamOld;
LPSTR pszNormalSubj;
FILETIME ftDownloaded;
LPSTR pszMessageId;
LPSTR pszSubject;
LPSTR pszFromHeader;
LPSTR pszReferences;
LPSTR pszXref;
LPSTR pszServer;
LPSTR pszDisplayFrom;
LPSTR pszEmailFrom;
WORD wLanguage;
WORD wPriority; // IMSGPRIORITY
DWORD cbMessage;
FILETIME ftReceived;
LPSTR pszDisplayTo;
LPSTR pszEmailTo;
DWORD dwPartial; // Set to MESSAGE_COMBINED to indicate its a combined message
LPSTR pszUidl;
LPSTR pszUserNameOld;
LPSTR pszPartialId;
LPSTR pszForwardTo;
LPSTR pszAcctName;
LPSTR pszAcctId;
LPSTR pszUrlComponent;
BLOB Offsets;
WORD wHighlight;
LPSTR pszFolder; // Only used in a find folder
DWORD iFindFolder; // Only used in a find folder
MESSAGEID idFindSource; // Only used in a find folder
MESSAGEID idParentOld; // Used for Message Threading
BLOB ThreadIdOld; // Used for custom threaded view
BYTE bUnused; // The major version of oe in which this was downloaded by
LPSTR pszMSOESRec;
} MESSAGEINFO_OE6, *LPMESSAGEINFO_OE6;
BEGIN_COLUMN_ARRAY(g_rgOE6MsgTblColumns, MSGCOL_OE6_LASTID)
DEFINE_COLUMN(MSGCOL_OE6_ID, CDT_UNIQUE, MESSAGEINFO_OE6, idMessage)
DEFINE_COLUMN(MSGCOL_OE6_FLAGS, CDT_FLAGS, MESSAGEINFO_OE6, dwFlags)
DEFINE_COLUMN(MSGCOL_OE6_DATE, CDT_FILETIME, MESSAGEINFO_OE6, ftSent)
DEFINE_COLUMN(MSGCOL_OE6_LINECOUNT, CDT_DWORD, MESSAGEINFO_OE6, cLines)
DEFINE_COLUMN(MSGCOL_OE6_STREAM, CDT_STREAM, MESSAGEINFO_OE6, faStream)
DEFINE_COLUMN(MSGCOL_OE6_NORMALSUBJ, CDT_VARSTRA, MESSAGEINFO_OE6, pszNormalSubj)
DEFINE_COLUMN(MSGCOL_OE6_DOWNLOADTIME, CDT_FILETIME, MESSAGEINFO_OE6, ftDownloaded)
DEFINE_COLUMN(MSGCOL_OE6_MESSAGEID, CDT_VARSTRA, MESSAGEINFO_OE6, pszMessageId)
DEFINE_COLUMN(MSGCOL_OE6_SUBJECT, CDT_VARSTRA, MESSAGEINFO_OE6, pszSubject)
DEFINE_COLUMN(MSGCOL_OE6_FROMHEADER, CDT_VARSTRA, MESSAGEINFO_OE6, pszFromHeader)
DEFINE_COLUMN(MSGCOL_OE6_REFERENCES, CDT_VARSTRA, MESSAGEINFO_OE6, pszReferences)
DEFINE_COLUMN(MSGCOL_OE6_XREF, CDT_VARSTRA, MESSAGEINFO_OE6, pszXref)
DEFINE_COLUMN(MSGCOL_OE6_SERVER, CDT_VARSTRA, MESSAGEINFO_OE6, pszServer)
DEFINE_COLUMN(MSGCOL_OE6_DISPLAYFROM, CDT_VARSTRA, MESSAGEINFO_OE6, pszDisplayFrom)
DEFINE_COLUMN(MSGCOL_OE6_EMAILFROM, CDT_VARSTRA, MESSAGEINFO_OE6, pszEmailFrom)
DEFINE_COLUMN(MSGCOL_OE6_LANGUAGE, CDT_WORD, MESSAGEINFO_OE6, wLanguage)
DEFINE_COLUMN(MSGCOL_OE6_PRIORITY, CDT_WORD, MESSAGEINFO_OE6, wPriority)
DEFINE_COLUMN(MSGCOL_OE6_SIZE, CDT_DWORD, MESSAGEINFO_OE6, cbMessage)
DEFINE_COLUMN(MSGCOL_OE6_RECEIVEDDATE, CDT_FILETIME, MESSAGEINFO_OE6, ftReceived)
DEFINE_COLUMN(MSGCOL_OE6_DISPLAYTO, CDT_VARSTRA, MESSAGEINFO_OE6, pszDisplayTo)
DEFINE_COLUMN(MSGCOL_OE6_EMAILTO, CDT_VARSTRA, MESSAGEINFO_OE6, pszEmailTo)
DEFINE_COLUMN(MSGCOL_OE6_PARTIALINFO, CDT_DWORD, MESSAGEINFO_OE6, dwPartial)
DEFINE_COLUMN(MSGCOL_OE6_POP3UIDL, CDT_VARSTRA, MESSAGEINFO_OE6, pszUidl)
DEFINE_COLUMN(MSGCOL_OE6_USERNAMEOLD, CDT_VARSTRA, MESSAGEINFO_OE6, pszUserNameOld)
DEFINE_COLUMN(MSGCOL_OE6_PARTIALID, CDT_VARSTRA, MESSAGEINFO_OE6, pszPartialId)
DEFINE_COLUMN(MSGCOL_OE6_FORWARDTO, CDT_VARSTRA, MESSAGEINFO_OE6, pszForwardTo)
DEFINE_COLUMN(MSGCOL_OE6_ACCOUNTNAME, CDT_VARSTRA, MESSAGEINFO_OE6, pszAcctName)
DEFINE_COLUMN(MSGCOL_OE6_ACCOUNTID, CDT_VARSTRA, MESSAGEINFO_OE6, pszAcctId)
DEFINE_COLUMN(MSGCOL_OE6_OFFSETTABLE, CDT_VARBLOB, MESSAGEINFO_OE6, Offsets)
DEFINE_COLUMN(MSGCOL_OE6_HIGHLIGHT, CDT_WORD, MESSAGEINFO_OE6, wHighlight)
DEFINE_COLUMN(MSGCOL_OE6_FOLDER, CDT_VARSTRA, MESSAGEINFO_OE6, pszFolder)
DEFINE_COLUMN(MSGCOL_OE6_FINDFOLDER, CDT_DWORD, MESSAGEINFO_OE6, iFindFolder)
DEFINE_COLUMN(MSGCOL_OE6_FINDSOURCE, CDT_DWORD, MESSAGEINFO_OE6, idFindSource)
DEFINE_COLUMN(MSGCOL_OE6_PARENTOLD, CDT_DWORD, MESSAGEINFO_OE6, idParentOld)
DEFINE_COLUMN(MSGCOL_OE6_THREADIDOLD, CDT_VARBLOB, MESSAGEINFO_OE6, ThreadIdOld)
DEFINE_COLUMN(MSGCOL_OE6_URLCOMPONENT, CDT_VARSTRA, MESSAGEINFO_OE6, pszUrlComponent)
DEFINE_COLUMN(MSGCOL_OE6_STREAMIDOLD, CDT_DWORD, MESSAGEINFO_OE6, idStreamOld)
DEFINE_COLUMN(MSGCOL_OE6_VERSION, CDT_BYTE, MESSAGEINFO_OE6, bUnused)
DEFINE_COLUMN(MSGCOL_OE6_MSOESREC, CDT_VARSTRA, MESSAGEINFO_OE6, pszMSOESRec)
END_COLUMN_ARRAY
BEGIN_TABLE_INDEX(g_OE6MsgTblPrimaryIndex, 1)
DEFINE_KEY(MSGCOL_OE6_ID, 0, 0)
END_TABLE_INDEX
BEGIN_SYMBOL_TABLE(g_OE6MsgSymbolTable, 21)
DEFINE_SYMBOL(SYMBOL_DWORD, "ARF_READ", ARF_READ)
DEFINE_SYMBOL(SYMBOL_DWORD, "ARF_HASBODY", ARF_HASBODY)
DEFINE_SYMBOL(SYMBOL_DWORD, "ARF_ENDANGERED", ARF_ENDANGERED)
DEFINE_SYMBOL(SYMBOL_COLUMN, "MSGCOL_FLAGS", MSGCOL_OE6_FLAGS)
DEFINE_SYMBOL(SYMBOL_COLUMN, "MSGCOL_EMAILFROM", MSGCOL_OE6_EMAILFROM)
DEFINE_SYMBOL(SYMBOL_DWORD, "ARF_WATCH", ARF_WATCH)
DEFINE_SYMBOL(SYMBOL_DWORD, "ARF_IGNORE", ARF_IGNORE)
DEFINE_SYMBOL(SYMBOL_DWORD, "ARF_HASATTACH", ARF_HASATTACH)
DEFINE_SYMBOL(SYMBOL_DWORD, "ARF_SIGNED", ARF_SIGNED)
DEFINE_SYMBOL(SYMBOL_DWORD, "ARF_ENCRYPTED", ARF_ENCRYPTED)
DEFINE_SYMBOL(SYMBOL_COLUMN, "MSGCOL_PRIORITY", MSGCOL_OE6_PRIORITY)
DEFINE_SYMBOL(SYMBOL_COLUMN, "MSGCOL_SUBJECT", MSGCOL_OE6_SUBJECT)
DEFINE_SYMBOL(SYMBOL_COLUMN, "MSGCOL_FROMHEADER", MSGCOL_OE6_FROMHEADER)
DEFINE_SYMBOL(SYMBOL_COLUMN, "MSGCOL_ACCOUNTID", MSGCOL_OE6_ACCOUNTID)
DEFINE_SYMBOL(SYMBOL_COLUMN, "MSGCOL_LINECOUNT", MSGCOL_OE6_LINECOUNT)
DEFINE_SYMBOL(SYMBOL_DWORD, "IMSG_PRI_HIGH", IMSG_PRI_HIGH)
DEFINE_SYMBOL(SYMBOL_DWORD, "IMSG_PRI_LOW", IMSG_PRI_LOW)
DEFINE_SYMBOL(SYMBOL_COLUMN, "MSGCOL_DISPLAYFROM", MSGCOL_OE6_DISPLAYFROM)
DEFINE_SYMBOL(SYMBOL_DWORD, "ARF_FLAGGED", ARF_FLAGGED)
DEFINE_SYMBOL(SYMBOL_METHOD, "MessageAgeInDays", METHODID_MESSAGEAGEINDAYS)
DEFINE_SYMBOL(SYMBOL_DWORD, "ARF_DELETED_OFFLINE", ARF_DELETED_OFFLINE)
END_SYMBOL_TABLE
BEGIN_TABLE_SCHEMA(g_OE6MessageTableSchema, CLSID_MessageDatabase_OE6, MESSAGEINFO_OE6)
SCHEMA_PROPERTY(MESSAGE_DATABASE_VERSION_OE6)
SCHEMA_PROPERTY(TSF_HASSTREAMS | TSF_RESETIFBADVERSION)
SCHEMA_PROPERTY(sizeof(FOLDERUSERDATA_OE6))
SCHEMA_PROPERTY(offsetof(MESSAGEINFO_OE6, idMessage))
SCHEMA_PROPERTY(MSGCOL_OE6_LASTID)
SCHEMA_PROPERTY(g_rgOE6MsgTblColumns)
SCHEMA_PROPERTY(&g_OE6MsgTblPrimaryIndex)
SCHEMA_PROPERTY(&g_OE6MsgSymbolTable)
SCHEMA_PROPERTY(NULL) // Secondary indices
END_TABLE_SCHEMA
extern const TABLESCHEMA g_OE6MessageTableSchema;
const DWORD POP3UIDL_DATABASE_VERSION_OE6 = 5;
typedef enum tagUIDLCOLID_OE6 {
UIDLCOL_OE6_DLTIME,
UIDLCOL_OE6_DELETED,
UIDLCOL_OE6_DOWNLOADED,
UIDLCOL_OE6_UIDL,
UIDLCOL_OE6_SERVER,
UIDLCOL_OE6_ACCOUNTID,
UIDLCOL_OE6_LAST
} UIDLCOLID_OE6;
typedef struct tagUIDLRECORD_OE6 {
BYTE *pAllocated;
BYTE bVersion;
BYTE fDownloaded;
BYTE fDeleted;
FILETIME ftDownload;
LPSTR pszUidl;
LPSTR pszServer;
LPSTR pszAccountId;
} UIDLRECORD_OE6, *LPUIDLRECORD_OE6;
BEGIN_COLUMN_ARRAY(g_rgOE6UidlTblColumns, UIDLCOL_OE6_LAST)
DEFINE_COLUMN(UIDLCOL_OE6_DLTIME, CDT_FILETIME, UIDLRECORD_OE6, ftDownload)
DEFINE_COLUMN(UIDLCOL_OE6_DELETED, CDT_BYTE, UIDLRECORD_OE6, fDeleted)
DEFINE_COLUMN(UIDLCOL_OE6_DOWNLOADED, CDT_BYTE, UIDLRECORD_OE6, fDownloaded)
DEFINE_COLUMN(UIDLCOL_OE6_UIDL, CDT_VARSTRA, UIDLRECORD_OE6, pszUidl)
DEFINE_COLUMN(UIDLCOL_OE6_SERVER, CDT_VARSTRA, UIDLRECORD_OE6, pszServer)
DEFINE_COLUMN(UIDLCOL_OE6_ACCOUNTID, CDT_VARSTRA, UIDLRECORD_OE6, pszAccountId)
END_COLUMN_ARRAY
BEGIN_TABLE_INDEX(g_OE6UidlTblPrimaryIndex, 3)
DEFINE_KEY(UIDLCOL_OE6_UIDL, COMPARE_ASANSI, 0)
DEFINE_KEY(UIDLCOL_OE6_SERVER, COMPARE_ASANSI | COMPARE_IGNORECASE, 0)
DEFINE_KEY(UIDLCOL_OE6_ACCOUNTID,COMPARE_ASANSI | COMPARE_IGNORECASE, 0)
END_TABLE_INDEX
BEGIN_TABLE_SCHEMA(g_OE6UidlTableSchema, CLSID_Pop3UidlDatabase, UIDLRECORD_OE6)
SCHEMA_PROPERTY(POP3UIDL_DATABASE_VERSION_OE6)
SCHEMA_PROPERTY(TSF_RESETIFBADVERSION)
SCHEMA_PROPERTY(0)
SCHEMA_PROPERTY(0xffffffff)
SCHEMA_PROPERTY(UIDLCOL_OE6_LAST)
SCHEMA_PROPERTY(g_rgOE6UidlTblColumns)
SCHEMA_PROPERTY(&g_OE6UidlTblPrimaryIndex)
SCHEMA_PROPERTY(NULL)
SCHEMA_PROPERTY(NULL) // Secondary indices
END_TABLE_SCHEMA
extern const TABLESCHEMA g_OE6UidlTableSchema;
const DWORD SYNCOP_DATABASE_VERSION_OE6 = 2;
typedef enum tagSYNCOPTABLECOLID_OE6 {
OPCOL_OE6_ID = 0,
OPCOL_OE6_SERVER,
OPCOL_OE6_FOLDER,
OPCOL_OE6_MESSAGE,
OPCOL_OE6_OPTYPE,
OPCOL_OE6_FLAGS,
OPCOL_OE6_ADD_FLAGS,
OPCOL_OE6_REMOVE_FLAGS,
OPCOL_OE6_FOLDER_DEST,
OPCOL_OE6_MESSAGE_DEST,
OPCOL_OE6_LASTID
} SYNCOPTABLECOLID_OE6;
typedef struct tagSYNCOPUSERDATA_OE6 {
DWORD fInitialized; // 4 Has this folder been initialized yet
BYTE rgReserved[248]; // Reserved
} SYNCOPUSERDATA_OE6, *LPSYNCOPUSERDATA_OE6;
typedef struct tagSYNCOPINFO_OE6 {
BYTE *pAllocated;
BYTE bVersion;
SYNCOPID idOperation;
FOLDERID idServer;
FOLDERID idFolder;
MESSAGEID idMessage;
SYNCOPTYPE tyOperation;
SYNCOPFLAGS dwFlags;
MESSAGEFLAGS dwAdd;
MESSAGEFLAGS dwRemove;
FOLDERID idFolderDest;
MESSAGEID idMessageDest;
} SYNCOPINFO_OE6, *LPSYNCOPINFO_OE6;
BEGIN_COLUMN_ARRAY(g_rgOE6OpTblColumns, OPCOL_OE6_LASTID)
DEFINE_COLUMN(OPCOL_OE6_ID, CDT_DWORD, SYNCOPINFO, idOperation)
DEFINE_COLUMN(OPCOL_OE6_SERVER, CDT_DWORD, SYNCOPINFO, idServer)
DEFINE_COLUMN(OPCOL_OE6_FOLDER, CDT_DWORD, SYNCOPINFO, idFolder)
DEFINE_COLUMN(OPCOL_OE6_MESSAGE, CDT_DWORD, SYNCOPINFO, idMessage)
DEFINE_COLUMN(OPCOL_OE6_OPTYPE, CDT_WORD, SYNCOPINFO, tyOperation)
DEFINE_COLUMN(OPCOL_OE6_FLAGS, CDT_DWORD, SYNCOPINFO, dwFlags)
DEFINE_COLUMN(OPCOL_OE6_ADD_FLAGS, CDT_DWORD, SYNCOPINFO, dwAdd)
DEFINE_COLUMN(OPCOL_OE6_REMOVE_FLAGS, CDT_DWORD, SYNCOPINFO, dwRemove)
DEFINE_COLUMN(OPCOL_OE6_FOLDER_DEST, CDT_DWORD, SYNCOPINFO, idFolderDest)
DEFINE_COLUMN(OPCOL_OE6_MESSAGE_DEST, CDT_DWORD, SYNCOPINFO, idMessageDest)
END_COLUMN_ARRAY
BEGIN_TABLE_INDEX(g_OE6OpTblPrimaryIndex, 1)
DEFINE_KEY(OPCOL_OE6_ID, 0, 0)
END_TABLE_INDEX
BEGIN_TABLE_SCHEMA(g_OE6SyncOpTableSchema, CLSID_SyncOpDatabase_OE6, SYNCOPINFO_OE6)
SCHEMA_PROPERTY(SYNCOP_DATABASE_VERSION_OE6)
SCHEMA_PROPERTY(TSF_RESETIFBADVERSION)
SCHEMA_PROPERTY(sizeof(SYNCOPUSERDATA_OE6))
SCHEMA_PROPERTY(offsetof(SYNCOPINFO_OE6, idOperation))
SCHEMA_PROPERTY(OPCOL_OE6_LASTID)
SCHEMA_PROPERTY(g_rgOE6OpTblColumns)
SCHEMA_PROPERTY(&g_OE6OpTblPrimaryIndex)
SCHEMA_PROPERTY(NULL)
SCHEMA_PROPERTY(NULL) // Secondary indices
END_TABLE_SCHEMA
extern const TABLESCHEMA g_OE6SyncOpTableSchema;
The following example header describes the synchronized operations references.
#pragma once
// {26FE9D30-1A8F-11d2-AABF-006097D474C4}
DEFINE_GUID(CLSID_SyncOpDatabase, 0x26fe9d30, 0x1a8f, 0x11d2, 0xaa, 0xbf, 0x0, 0x60, 0x97, 0xd4, 0x74, 0xc4);
DECLARE_HANDLE(SYNCOPID);
typedef SYNCOPID *LPSYNCOPID;
const SYNCOPID SYNCOPID_INVALID = (SYNCOPID)-1;
const DWORD SYNCOP_DATABASE_VERSION = 2;
typedef enum tagSYNCOPTABLECOLID {
OPCOL_ID = 0,
OPCOL_SERVER,
OPCOL_FOLDER,
OPCOL_MESSAGE,
OPCOL_OPTYPE,
OPCOL_FLAGS,
OPCOL_ADD_FLAGS,
OPCOL_REMOVE_FLAGS,
OPCOL_FOLDER_DEST,
OPCOL_MESSAGE_DEST,
OPCOL_LASTID
} SYNCOPTABLECOLID;
typedef struct tagSYNCOPUSERDATA {
DWORD fInitialized; // 4 Has this folder been initialized yet
BYTE rgReserved[248]; // Reserved
} SYNCOPUSERDATA, *LPSYNCOPUSERDATA;
typedef enum tagSYNCOPTYPE {
SYNC_INVALID = 0x0000,
SYNC_SETPROP_MSG = 0x0001,
SYNC_CREATE_MSG = 0x0002,
SYNC_COPY_MSG = 0x0004,
SYNC_MOVE_MSG = 0x0008,
SYNC_DELETE_MSG = 0x0010
} SYNCOPTYPE;
typedef DWORD SYNCOPFLAGS;
#define SOF_ALLFLAGS 0x00000001
typedef struct tagSYNCOPINFO {
BYTE *pAllocated;
BYTE bVersion;
SYNCOPID idOperation;
FOLDERID idServer;
FOLDERID idFolder;
MESSAGEID idMessage;
SYNCOPTYPE tyOperation;
SYNCOPFLAGS dwFlags;
MESSAGEFLAGS dwAdd;
MESSAGEFLAGS dwRemove;
FOLDERID idFolderDest;
MESSAGEID idMessageDest;
} SYNCOPINFO, *LPSYNCOPINFO;
BEGIN_COLUMN_ARRAY(g_rgOpTblColumns, OPCOL_LASTID)
DEFINE_COLUMN(OPCOL_ID, CDT_DWORD, SYNCOPINFO, idOperation)
DEFINE_COLUMN(OPCOL_SERVER, CDT_DWORD, SYNCOPINFO, idServer)
DEFINE_COLUMN(OPCOL_FOLDER, CDT_DWORD, SYNCOPINFO, idFolder)
DEFINE_COLUMN(OPCOL_MESSAGE, CDT_DWORD, SYNCOPINFO, idMessage)
DEFINE_COLUMN(OPCOL_OPTYPE, CDT_WORD, SYNCOPINFO, tyOperation)
DEFINE_COLUMN(OPCOL_FLAGS, CDT_DWORD, SYNCOPINFO, dwFlags)
DEFINE_COLUMN(OPCOL_ADD_FLAGS, CDT_DWORD, SYNCOPINFO, dwAdd)
DEFINE_COLUMN(OPCOL_REMOVE_FLAGS, CDT_DWORD, SYNCOPINFO, dwRemove)
DEFINE_COLUMN(OPCOL_FOLDER_DEST, CDT_DWORD, SYNCOPINFO, idFolderDest)
DEFINE_COLUMN(OPCOL_MESSAGE_DEST, CDT_DWORD, SYNCOPINFO, idMessageDest)
END_COLUMN_ARRAY
BEGIN_TABLE_INDEX(g_OpTblPrimaryIndex, 1)
DEFINE_KEY(OPCOL_ID, 0, 0)
END_TABLE_INDEX
BEGIN_TABLE_INDEX(g_OpFolderIdIndex, 3)
DEFINE_KEY(OPCOL_SERVER, 0, 0)
DEFINE_KEY(OPCOL_FOLDER, 0, 0)
DEFINE_KEY(OPCOL_ID, 0, 0)
END_TABLE_INDEX
extern const TABLEINDEX g_OpFolderIdIndex;
BEGIN_TABLE_SCHEMA(g_SyncOpTableSchema, CLSID_SyncOpDatabase, SYNCOPINFO)
SCHEMA_PROPERTY(SYNCOP_DATABASE_VERSION)
SCHEMA_PROPERTY(TSF_RESETIFBADVERSION)
SCHEMA_PROPERTY(sizeof(SYNCOPUSERDATA))
SCHEMA_PROPERTY(offsetof(SYNCOPINFO, idOperation))
SCHEMA_PROPERTY(OPCOL_LASTID)
SCHEMA_PROPERTY(g_rgOpTblColumns)
SCHEMA_PROPERTY(&g_OpTblPrimaryIndex)
SCHEMA_PROPERTY(NULL)
END_TABLE_SCHEMA
extern const TABLESCHEMA g_SyncOpTableSchema;