142 lines
7.5 KiB
C
142 lines
7.5 KiB
C
|
//--------------------------------------------------------------------------
|
||
|
// MsgFldr.h
|
||
|
//--------------------------------------------------------------------------
|
||
|
#ifndef __MSGFLDR_H
|
||
|
#define __MSGFLDR_H
|
||
|
|
||
|
//--------------------------------------------------------------------------
|
||
|
// Depends
|
||
|
//--------------------------------------------------------------------------
|
||
|
#include "dbimpl.h"
|
||
|
|
||
|
//--------------------------------------------------------------------------
|
||
|
// ONLOCKINFO
|
||
|
//--------------------------------------------------------------------------
|
||
|
typedef struct tagONLOCKINFO {
|
||
|
DWORD cLocked;
|
||
|
LONG lMsgs;
|
||
|
LONG lUnread;
|
||
|
LONG lWatchedUnread;
|
||
|
LONG lWatched;
|
||
|
} ONLOCKINFO, *LPONLOCKINFO;
|
||
|
|
||
|
//--------------------------------------------------------------------------
|
||
|
// FOLDERSTATE
|
||
|
//--------------------------------------------------------------------------
|
||
|
typedef DWORD FOLDERSTATE;
|
||
|
#define FOLDER_STATE_RELEASEDB 0x00000001
|
||
|
#define FOLDER_STATE_CANCEL 0x00000002
|
||
|
|
||
|
//--------------------------------------------------------------------------
|
||
|
// CMessageFolder
|
||
|
//--------------------------------------------------------------------------
|
||
|
class CMessageFolder : public IMessageFolder,
|
||
|
public IDatabaseExtension,
|
||
|
public IOperationCancel,
|
||
|
public IServiceProvider
|
||
|
{
|
||
|
public:
|
||
|
//----------------------------------------------------------------------
|
||
|
// Construction
|
||
|
//----------------------------------------------------------------------
|
||
|
CMessageFolder(void);
|
||
|
~CMessageFolder(void);
|
||
|
|
||
|
//----------------------------------------------------------------------
|
||
|
// IUnknown Members
|
||
|
//----------------------------------------------------------------------
|
||
|
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv);
|
||
|
STDMETHODIMP_(ULONG) AddRef(void);
|
||
|
STDMETHODIMP_(ULONG) Release(void);
|
||
|
|
||
|
//----------------------------------------------------------------------
|
||
|
// IMessageFolder Members
|
||
|
//----------------------------------------------------------------------
|
||
|
STDMETHODIMP Initialize(IMessageStore *pStore, IMessageServer *pServer, OPENFOLDERFLAGS dwFlags, FOLDERID idFolder);
|
||
|
STDMETHODIMP SetOwner(IStoreCallback *pDefaultCallback) { return E_NOTIMPL; }
|
||
|
STDMETHODIMP GetFolderId(LPFOLDERID pidFolder);
|
||
|
STDMETHODIMP GetMessageFolderId(MESSAGEID idMessage, LPFOLDERID pidFolder);
|
||
|
STDMETHODIMP Close(void) { return(S_OK); }
|
||
|
STDMETHODIMP Synchronize(SYNCFOLDERFLAGS dwFlags, DWORD cHeaders, IStoreCallback *pCallback) { return(S_OK); }
|
||
|
STDMETHODIMP OpenMessage(MESSAGEID idMessage, OPENMESSAGEFLAGS dwFlags, IMimeMessage **ppMessage, IStoreCallback *pCallback);
|
||
|
STDMETHODIMP SaveMessage(LPMESSAGEID pidMessage, SAVEMESSAGEFLAGS dwOptions, MESSAGEFLAGS dwFlags, IStream *pStream, IMimeMessage *pMessage, IStoreCallback *pCallback);
|
||
|
STDMETHODIMP SetMessageStream(MESSAGEID idMessage, IStream *pStream);
|
||
|
STDMETHODIMP SetMessageFlags(LPMESSAGEIDLIST pList, LPADJUSTFLAGS pFlags, LPRESULTLIST pResults, IStoreCallback *pCallback);
|
||
|
STDMETHODIMP CopyMessages(IMessageFolder *pDest, COPYMESSAGEFLAGS dwFlags, LPMESSAGEIDLIST pList, LPADJUSTFLAGS pFlags, LPRESULTLIST pResults, IStoreCallback *pCallback);
|
||
|
STDMETHODIMP DeleteMessages(DELETEMESSAGEFLAGS dwFlags, LPMESSAGEIDLIST pList, LPRESULTLIST pResults, IStoreCallback *pCallback);
|
||
|
STDMETHODIMP ConnectionAddRef(void) { return(S_OK); }
|
||
|
STDMETHODIMP ConnectionRelease(void) { return(S_OK); }
|
||
|
STDMETHODIMP ResetFolderCounts(DWORD cMessages, DWORD cUnread, DWORD cWatchedUnread, DWORD cWatched);
|
||
|
STDMETHODIMP IsWatched(LPCSTR pszReferences, LPCSTR pszSubject);
|
||
|
STDMETHODIMP GetAdBarUrl(IStoreCallback *pCallback) { return E_NOTIMPL; };
|
||
|
|
||
|
//----------------------------------------------------------------------
|
||
|
// IMessageFolder::GetDatabase Members
|
||
|
//----------------------------------------------------------------------
|
||
|
STDMETHODIMP GetDatabase(IDatabase **ppDB) {
|
||
|
*ppDB = m_pDB;
|
||
|
(*ppDB)->AddRef();
|
||
|
return(S_OK);
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------
|
||
|
// IDatabaseExtension Members
|
||
|
//----------------------------------------------------------------------
|
||
|
STDMETHODIMP Initialize(IDatabase *pDB);
|
||
|
STDMETHODIMP OnLock(void);
|
||
|
STDMETHODIMP OnUnlock(void);
|
||
|
STDMETHODIMP OnRecordInsert(OPERATIONSTATE tyState, LPORDINALLIST pOrdinals, LPVOID pRecord);
|
||
|
STDMETHODIMP OnRecordUpdate(OPERATIONSTATE tyState, LPORDINALLIST pOrdinals, LPVOID pRecordOld, LPVOID pRecordNew);
|
||
|
STDMETHODIMP OnRecordDelete(OPERATIONSTATE tyState, LPORDINALLIST pOrdinals, LPVOID pRecord);
|
||
|
STDMETHODIMP OnExecuteMethod(METHODID idMethod, LPVOID pBinding, LPDWORD pdwResult);
|
||
|
|
||
|
//----------------------------------------------------------------------
|
||
|
// IServiceProvider
|
||
|
//----------------------------------------------------------------------
|
||
|
STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, LPVOID *ppvObject);
|
||
|
|
||
|
//----------------------------------------------------------------------
|
||
|
// IOperationCancel Members
|
||
|
//----------------------------------------------------------------------
|
||
|
STDMETHODIMP Cancel(CANCELTYPE tyCancel) { FLAGSET(m_dwState, FOLDER_STATE_CANCEL); return(S_OK); }
|
||
|
|
||
|
//----------------------------------------------------------------------
|
||
|
// IDatabase Members
|
||
|
//----------------------------------------------------------------------
|
||
|
IMPLEMENT_IDATABASE(TRUE, m_pDB);
|
||
|
|
||
|
private:
|
||
|
//----------------------------------------------------------------------
|
||
|
// Private Methods
|
||
|
//----------------------------------------------------------------------
|
||
|
HRESULT _FixupMessageCharset(IMimeMessage *pMessage, CODEPAGEID cpCurrent);
|
||
|
HRESULT _GetMsgInfoFromMessage(IMimeMessage *pMessage, LPMESSAGEINFO pInfo);
|
||
|
HRESULT _GetMsgInfoFromPropertySet(IMimePropertySet *pPropertySet, LPMESSAGEINFO pInfo);
|
||
|
HRESULT _FreeMsgInfoData(LPMESSAGEINFO pInfo);
|
||
|
HRESULT _SetMessageStream(LPMESSAGEINFO pInfo, BOOL fUpdateRecord, IStream *pStream);
|
||
|
HRESULT _InitializeWatchIgnoreIndex(void);
|
||
|
HRESULT _GetWatchIgnoreParentFlags(LPCSTR pszReferences, LPCSTR pszSubject, MESSAGEFLAGS *pdwFlags);
|
||
|
|
||
|
private:
|
||
|
//----------------------------------------------------------------------
|
||
|
// Private Data
|
||
|
//----------------------------------------------------------------------
|
||
|
LONG m_cRef; // Ref Count
|
||
|
ONLOCKINFO m_OnLock; // OnLock information
|
||
|
FOLDERTYPE m_tyFolder; // Folder Type
|
||
|
SPECIALFOLDER m_tySpecial; // Am I a Special Folder ?
|
||
|
FOLDERID m_idFolder; // Folder Id
|
||
|
FOLDERSTATE m_dwState; // Folder State
|
||
|
IDatabase *m_pDB; // Database Table
|
||
|
IMessageStore *m_pStore; // Store Object
|
||
|
};
|
||
|
|
||
|
//--------------------------------------------------------------------------
|
||
|
// CreateMsgDbExtension
|
||
|
//--------------------------------------------------------------------------
|
||
|
HRESULT CreateMsgDbExtension(IUnknown *pUnkOuter, IUnknown **ppUnknown);
|
||
|
HRESULT WalkThreadAdjustFlags(IDatabase *pDB, LPMESSAGEINFO pMessage,
|
||
|
BOOL fSubThreads, DWORD cIndent, DWORD_PTR dwCookie, BOOL *pfDoSubThreads);
|
||
|
|
||
|
#endif // __MSGFLDR_H
|