mirror of https://github.com/lianthony/NT4.0
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.
465 lines
11 KiB
465 lines
11 KiB
/*
|
|
* m s m a i l . h
|
|
*
|
|
* Definitions of services provided by the central thread
|
|
*/
|
|
|
|
|
|
#ifndef MAPIFORM_H
|
|
#include <mapiform.h>
|
|
#endif
|
|
|
|
|
|
#ifndef MAILEXT_H
|
|
#include <commctrl.h>
|
|
#include <exchext.h>
|
|
#include <_exchext.h>
|
|
#endif
|
|
|
|
|
|
/*
|
|
* W h a t w e u s e
|
|
*/
|
|
|
|
|
|
/*
|
|
* What is Capone's thread/proces model?
|
|
*
|
|
* MULTITHREAD is the #define for everything in one multi-threaded process.
|
|
* SINGLETHREAD is the #define for everything in one single-threaded process.
|
|
*/
|
|
#if defined (WIN32) && !defined (MACPORT)
|
|
#define SINGLETHREAD
|
|
#else
|
|
#define SINGLETHREAD
|
|
#endif
|
|
|
|
// USETHREADMUTEX allows synchronization between different threads
|
|
#ifdef MULTITHREAD
|
|
#define USETHREADMUTEX
|
|
#endif
|
|
|
|
// USETASKMUTEX allows synchronization between different tasks
|
|
#if defined (WIN32) && !defined (MACPORT)
|
|
#define USETASKMUTEX
|
|
#endif
|
|
|
|
// USECTL3D is defined on WIN31 and WINNT only
|
|
#if !defined(MACPORT) && !defined(CHICAGO)
|
|
#define USECTL3D
|
|
#endif
|
|
|
|
// USECOPYDATA is defined on WIN32 platforms with multiple processes
|
|
#if defined (WIN32) && !defined(MACPORT)
|
|
#define USECOPYDATA
|
|
#endif
|
|
|
|
// USESPLASH is defined on all platforms except INCABINET
|
|
#if !defined(INCABINET)
|
|
#define USESPLASH
|
|
#endif
|
|
|
|
// USEPEN is defined only on WIN16
|
|
#ifdef WIN16
|
|
#define USEPEN
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
* I n t e r f a c e C a c h i n g S u p p o r t
|
|
*/
|
|
|
|
|
|
// Cross-thread interface caching
|
|
// Code must have an affadavit of OKness to use these macros
|
|
|
|
// Single thread macros: only interfaces in cache
|
|
#ifdef SINGLETHREAD
|
|
typedef struct _icache
|
|
{
|
|
LPUNKNOWN punk;
|
|
}
|
|
ICACHE;
|
|
|
|
#define FCanGetFromPicache(_picache) \
|
|
((_picache)->punk != NULL)
|
|
|
|
SCODE ScGetFromPicache(ICACHE * picache, REFIID riid, LPUNKNOWN * ppunk);
|
|
|
|
SCODE ScAddToPicache(LPUNKNOWN punk, REFIID riid, ICACHE * picache);
|
|
|
|
ULONG ReleasePicache(ICACHE * picache);
|
|
|
|
#define FPunkMatchesPicache(_punk, _picache) \
|
|
(((LPUNKNOWN) (_punk)) == (_picache)->punk)
|
|
#endif
|
|
|
|
// Multi thread macros: interfaces or remoting info in cache
|
|
#ifdef MULTITHREAD
|
|
|
|
// Workaround for inability to use TABLESTRONG stuff
|
|
#define NOTABLESTRONG
|
|
|
|
typedef struct _icache
|
|
{
|
|
LPUNKNOWN punk;
|
|
#ifdef NOTABLESTRONG
|
|
LPUNKNOWN punkInCentral;
|
|
#else
|
|
LPSTREAM pstmUnk;
|
|
#endif
|
|
}
|
|
ICACHE;
|
|
|
|
#ifdef NOTABLESTRONG
|
|
#define FCanGetFromPicache(_picache) \
|
|
((_picache)->punk || (_picache)->punkInCentral)
|
|
#else
|
|
#define FCanGetFromPicache(_picache) \
|
|
((_picache)->punk || (_picache)->pstmUnk)
|
|
#endif
|
|
|
|
SCODE ScGetFromPicache(ICACHE * picache, REFIID riid, LPUNKNOWN * ppunk);
|
|
|
|
SCODE ScAddToPicache(LPUNKNOWN punk, REFIID riid, ICACHE * picache);
|
|
|
|
ULONG ReleasePicache(ICACHE * picache);
|
|
|
|
#define FPunkMatchesPicache(_punk, _picache) \
|
|
(((LPUNKNOWN) (_punk)) == (_picache)->punk)
|
|
#endif
|
|
|
|
|
|
/*
|
|
* N o t e D o V e r b
|
|
*/
|
|
|
|
|
|
// NOTEIVERB specifies the form-specific verbs we understand
|
|
#define NOTEIVERB_OPEN 0
|
|
#define NOTEIVERB_RESERVED_0 100
|
|
#define NOTEIVERB_RESERVED_1 101
|
|
#define NOTEIVERB_REPLY 102
|
|
#define NOTEIVERB_REPLYTOALL 103
|
|
#define NOTEIVERB_FORWARD 104
|
|
#define NOTEIVERB_PRINT 105
|
|
#define NOTEIVERB_SAVEAS 106
|
|
#define NOTEIVERB_DELIVERY 107
|
|
#define NOTEIVERB_CLOSE 200
|
|
#define NOTEIVERB_ADVISE 201
|
|
#define NOTEIVERB_UNADVISE 202
|
|
#define NOTEIVERB_SETMONIKER 203
|
|
#define NOTEIVERB_SETVIEWCONTEXT 204
|
|
#define NOTEIVERB_GETVIEWCONTEXT 205
|
|
#define NOTEIVERB_ISDIRTY 300
|
|
#define NOTEIVERB_SAVE 301
|
|
#define NOTEIVERB_SAVECOMPLETED 302
|
|
#define NOTEIVERB_HANDSOFFMESSAGE 303
|
|
#define NOTEIVERB_RELEASETOZERO 400
|
|
|
|
// NOTEDOVERB specifies information related to launching a form
|
|
typedef struct _notedoverb
|
|
{
|
|
// DoVerb actual arguments
|
|
ICACHE icacheMvc; // View context
|
|
ULONG hwndParent; // Parent window (only used if modal?)
|
|
LPCRECT prcPos; // Where to put note
|
|
|
|
// Supplemental information for other verbs
|
|
ICACHE icacheMsg; // Save, SaveCompleted: Message to save to or
|
|
// Advise: Mvas interface or
|
|
// SetMoniker: Mk interface
|
|
DWORD dwFlags; // Print: ulFirstPage or
|
|
// Save: fSameAsLoad or
|
|
// Close: dwSaveOptions or
|
|
// Advise: ulConnection [out]
|
|
// Unadvise: ulConnection [in]
|
|
// SetMoniker: dwRegisterROT
|
|
}
|
|
NOTEDOVERB;
|
|
|
|
|
|
/*
|
|
* M a i l T h r e a d I n f o
|
|
*/
|
|
|
|
|
|
// WMSWSZ structure for starting a thread to run a command line
|
|
typedef struct
|
|
{
|
|
UINT wm;
|
|
int sw;
|
|
ULONG cbWhatFollows;
|
|
}
|
|
WMSWSZ;
|
|
|
|
// FINDER structure for starting a thread for a message finder
|
|
typedef struct _mfopt
|
|
{
|
|
int ncmdShow;
|
|
|
|
BOOL fHasLPMDB;
|
|
union
|
|
{
|
|
struct // fHasLPMDB == FALSE
|
|
{
|
|
LPENTRYID peid;
|
|
ULONG cbEid;
|
|
} mdbeid;
|
|
LPMDB pmdb; // fHasLPMDB != FALSE
|
|
};
|
|
|
|
BOOL fOpenExisting; // open an existing search folder?
|
|
union
|
|
{
|
|
struct // fOpenExisting == FALSE
|
|
{
|
|
LPENTRYLIST pelToSearch;
|
|
LPSRestriction presCriteria;
|
|
ULONG ulSearchFlags;
|
|
} new;
|
|
struct // fOpenExisting != FALSE
|
|
{
|
|
LPENTRYID peid;
|
|
ULONG cbEid;
|
|
} old;
|
|
};
|
|
}
|
|
MFOPT;
|
|
|
|
// NOTERUN structure for starting a thread for a form's verb
|
|
typedef struct _noterun
|
|
{
|
|
ICACHE icacheMsg; // Message for message (NULL for Compose)
|
|
ICACHE icacheMms; // Message site for message
|
|
ICACHE icacheMvc; // View context if we have one
|
|
ICACHE icacheMvas; // View advise sink if we have one
|
|
ICACHE icacheMk; // Message moniker
|
|
|
|
HWND hwndOwner; // Owner for window if is to be modal
|
|
|
|
BIT fModal : 1; // Is this to be the modal version?
|
|
BIT fOwnerEnabled : 1; // Was owner originally enabled?
|
|
BIT fOwnerActive : 1; // Was owner originally active?
|
|
BIT fInitNew : 1; // Did we get a new pmsg from InitNew?
|
|
BIT fUnused : 12; // For future use
|
|
|
|
#ifdef USEMUTEX
|
|
DWORD dwThreadId; // Thread to post release to if modal
|
|
HANDLE hsema; // Semaphore to release when done
|
|
#endif
|
|
|
|
HRESULT hr; // [out] Result of verb
|
|
HWND hwnd; // [out] Window of form
|
|
}
|
|
NOTERUN;
|
|
|
|
// Viewer structure used when starting a new Viewer.
|
|
typedef struct _viewer
|
|
{
|
|
int nCmdShow; // flag to ShowWindow.
|
|
ULONG cb; //
|
|
LPSPropValue pval; // Contains saved state.
|
|
} VIEWER;
|
|
|
|
// Name of semaphore used for synchronizing initial MAILM_NOTERUN return
|
|
#ifdef USEMUTEX
|
|
#define szNoteRunSema "ML_NoteRun sema"
|
|
#endif
|
|
|
|
// Structure passed to CreateMailThread
|
|
#define MTIT_WMSWSZ 1
|
|
#define MTIT_FINDER 2
|
|
#define MTIT_NOTERUN 3
|
|
#define MTIT_VIEWER 4
|
|
|
|
typedef struct
|
|
{
|
|
ULONG mtit;
|
|
union
|
|
{
|
|
WMSWSZ wmswsz; // MTIT_WMSWSZ
|
|
MFOPT mfopt; // MTIT_FINDER
|
|
NOTERUN noterun; // MTIT_NOTERUN
|
|
VIEWER viewer; // MTIT_VIEWER
|
|
};
|
|
}
|
|
MAILTHREADINFO;
|
|
typedef MAILTHREADINFO FAR * LPMAILTHREADINFO;
|
|
|
|
#define PvWhatFollows(_pmti) ((LPVOID) (((LPMAILTHREADINFO) _pmti) + 1))
|
|
|
|
|
|
/*
|
|
* M e s s a g e T h i e v e s
|
|
*/
|
|
|
|
|
|
// Mail message thief function
|
|
typedef BOOL (CALLBACK * LPFNMSGTHIEF)(DWORD dwCookie, LPMSG pmsg);
|
|
|
|
// Structure passed to *Create functions
|
|
typedef struct _mailwindowinfo
|
|
{
|
|
HWND hwnd;
|
|
LPFNMSGTHIEF pfnmsgthief;
|
|
DWORD dwCookie;
|
|
}
|
|
MAILWINDOWINFO;
|
|
|
|
|
|
/*
|
|
* M e s s a g e s a n d S t r u c t u r e s
|
|
*/
|
|
|
|
|
|
// Structure passed with MAILM_FORMDOVERB message
|
|
typedef struct _formdoverb
|
|
{
|
|
ICACHE icacheSes; // Session for message
|
|
ICACHE icacheMdb; // Store for message
|
|
ICACHE icacheFld; // Folder for message
|
|
ICACHE icacheMsg; // Message for message (NULL for Compose)
|
|
ICACHE icacheMk; // Message moniker
|
|
ICACHE icacheFrm; // Form for message [out]
|
|
|
|
HWND hwnd;
|
|
ULONG cbEidMsg;
|
|
LPENTRYID peidMsg;
|
|
LPTSTR szMsgFile;
|
|
LPTSTR szMessageClass;
|
|
ULONG msgflag;
|
|
LONG iverb;
|
|
LPVOID pvdog;
|
|
LPRECT prcPos;
|
|
EXTEN * pexten;
|
|
}
|
|
FORMDOVERB;
|
|
|
|
#ifdef NOTABLESTRONG
|
|
typedef struct _icinfo
|
|
{
|
|
ICACHE * picache; // Icache to put in/get from
|
|
LPIID piid; // Interface we have/want
|
|
LPSTREAM pstmUnk; // Where to get/put marshalling info
|
|
}
|
|
ICINFO;
|
|
#endif
|
|
|
|
// The class name and window name of Mail Central
|
|
#define szMailCentral TEXT("!Info Center!")
|
|
|
|
// The name of the event that is signalled when central window is created.
|
|
#define szMailCentralEvent TEXT("ML_CentralWnd event")
|
|
|
|
// Messages we can send to the central window
|
|
// MAILM_NOTEDOVERB is sent directly to running note windows, and takes
|
|
// wparam: iverb, lparam: pnotedoverb, returns: hr
|
|
#define MAILM_QUIT (WM_USER + 0x101)
|
|
#define MAILM_CREATETHREAD (WM_USER + 0x102)
|
|
#define MAILM_EXIT (WM_USER + 0x103)
|
|
#define MAILM_ONEMORETHREAD (WM_USER + 0x104)
|
|
#define MAILM_ONELESSTHREAD (WM_USER + 0x105)
|
|
#define MAILM_ADDREF (WM_USER + 0x106)
|
|
#define MAILM_RELEASE (WM_USER + 0x107)
|
|
#define MAILM_NEWNOTE (WM_USER + 0x108)
|
|
#define MAILM_NEWVIEWER (WM_USER + 0x109)
|
|
#define MAILM_NEWFINDER (WM_USER + 0x10A)
|
|
#define MAILM_NEWADRBOOK (WM_USER + 0x10B)
|
|
#define MAILM_OPENMSGFILE (WM_USER + 0x10C)
|
|
#define MAILM_OPENREMOTE (WM_USER + 0x10D)
|
|
#define MAILM_FORMDOVERB (WM_USER + 0x10E)
|
|
#define MAILM_NOTEDOVERB (WM_USER + 0x10F)
|
|
#define MAILM_OPENFREEDOC (WM_USER + 0x110)
|
|
#define MAILM_TASKENDED (WM_USER + 0x111)
|
|
#define MAILM_RESTOREFINDERS (WM_USER + 0x112)
|
|
#define MAILM_RESTOREVIEWERS (WM_USER + 0x113)
|
|
#define MAILM_ENABLEMODELESS (WM_USER + 0x114)
|
|
#define MAILM_ADDTOGSB (WM_USER + 0x115)
|
|
#define MAILM_DELFROMGSB (WM_USER + 0x116)
|
|
#define MAILM_GSBSETMSS (WM_USER + 0x117)
|
|
#define MAILM_SHOWF1HELP (WM_USER + 0x118)
|
|
#define MAILM_PARENTHELP (WM_USER + 0x119)
|
|
|
|
#ifdef CHICAGO
|
|
// Note: TrayNotification and OpenInbox used by Chicago only
|
|
#define MAILM_TRAYNOTIFICATION (WM_USER + 0x119)
|
|
#define MAILM_OPENINBOX (WM_USER + 0x11A)
|
|
#endif
|
|
#ifdef NOTABLESTRONG
|
|
// These only used to work around TABLESTRONG limitation
|
|
#define MAILM_SCADDTOPICACHE (WM_USER + 0x11B)
|
|
#define MAILM_SCGETFROMPICACHE (WM_USER + 0x11C)
|
|
#define MAILM_RELEASEPICACHE (WM_USER + 0x11D)
|
|
#endif
|
|
#ifdef MULTITHREAD
|
|
// Note: These are only here to work around MULTITHREAD issues
|
|
#define MAILM_ROTREVOKE (WM_USER + 0x11E)
|
|
#endif
|
|
|
|
// MSM messages ////////////////////////////////////////
|
|
|
|
#define MSM_TREENOTIFY (WM_USER + 3)
|
|
#define MSM_GETTREELPVLBENUM (WM_USER + 4)
|
|
#define Msmail_GetTreePve(_hwnd) \
|
|
((LPVLBENUM) SendMessage(_hwnd, MSM_GETTREELPVLBENUM, 0, 0))
|
|
#define MSM_GETSAVEVIEWERINFO (WM_USER + 5)
|
|
|
|
// Post Mail quit message
|
|
#if defined (WIN16) && !defined (MACPORT)
|
|
#define PostMailQuitMessage(_dwCookie) \
|
|
PostAppMessage(GetCurrentTask(), MAILM_QUIT, \
|
|
(WPARAM) 0, (LPARAM) _dwCookie)
|
|
#elif !defined (MACPORT)
|
|
#define PostMailQuitMessage(_dwCookie) \
|
|
PostThreadMessage(GetCurrentThreadId(), MAILM_QUIT, \
|
|
(WPARAM) 0, (LPARAM) _dwCookie)
|
|
#endif
|
|
|
|
#ifdef MACPORT
|
|
#define PostMailQuitMessage(_dwCookie) \
|
|
PostThreadMessage(GetCurrentThreadId(), MAILM_QUIT, \
|
|
(WPARAM) 0, (LPARAM) _dwCookie)
|
|
|
|
#endif
|
|
|
|
|
|
// End mail session message names
|
|
#define szQueryEndMailSession "Information Exchange Query End Session"
|
|
#define szEndMailSession "Information Exchange End Session"
|
|
|
|
|
|
/*
|
|
* C e n t r a l A P I
|
|
*/
|
|
|
|
|
|
// Early initialization goodies
|
|
typedef struct _early
|
|
{
|
|
HINSTANCE hinstExe;
|
|
HANDLE hmutexCentral;
|
|
VOID (WINAPI *pfnRegisterPenApp)(UINT, BOOL);
|
|
BOOL fInitializedCtl3d;
|
|
#ifdef USESPLASH
|
|
HWND hwndSplash;
|
|
DWORD ctickSplashDone;
|
|
#endif
|
|
}
|
|
EARLY;
|
|
|
|
typedef VOID (STDAPICALLTYPE * PFNSENDCMDLINE)(HWND hwndCentral,
|
|
LPTSTR szCmdLine, int ncmdShow);
|
|
|
|
// Function startup code calls to get things rolling
|
|
STDAPI_(VOID) CentralThread(EARLY * pearly, PFNSENDCMDLINE pfnSendCmdLine,
|
|
LPTSTR szCmdLine, int ncmdShow);
|
|
typedef VOID (STDAPICALLTYPE * PFNCENTRALTHREAD)(EARLY * pearly,
|
|
PFNSENDCMDLINE pfnSendCmdLine, LPTSTR szCmdLine, int ncmdShow);
|
|
|
|
#ifdef INCABINET
|
|
// Function to call to make sure a central thread exists
|
|
BOOL WINAPI FEnsureCentralThread();
|
|
#endif
|
|
|