Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

409 lines
12 KiB

#ifndef __MAPISEND_H
#define __MAPISEND_H
///////////////////////////////////////////////////////////////////////////////
/* File: mapisend.h
Description: Implements the most basic MAPI email client to send a message
to one or more recipients. All operations are done without UI.
classes: CMapiSession
CMapiMessage
CMapiMessageBody
CMapiRecipients
MAPI
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
06/18/97 Initial creation. BrianAu
06/22/97 Added class MAPI so clients can dynamically link BrianAu
to MAPI32.DLL.
*/
///////////////////////////////////////////////////////////////////////////////
#ifndef _WINDOWS_
# include <windows.h>
#endif
#ifndef MAPIX_H
# include <mapix.h>
#endif
#ifndef _MAPIUTIL_H_
# include <mapiutil.h>
#endif
#ifndef MAPITAGS_H
# include <mapitags.h>
#endif
//-----------------------------------------------------------------------------
// MAPI
//
// This class allows a MAPI client to dynamically link to MAPI32.DLL instead
// of statically linking to it. This can help performance in that loading
// MAPI is explicitly controlled. The following example shows how to use
// the class.
//
// MAPI mapi;
// HRESULT hr;
//
// hr = mapi.Load(); // This calls LoadLibrary on MAPI32.DLL.
// if SUCCEEDED(hr))
// {
// hr = mapi.Initialize(NULL);
// if (SUCCEEDED(hr))
// {
// LPMAPISESSION pSession;
// hr = mapi.LogonEx(0, // Hwnd for any UI.
// NULL, // Profile name.
// NULL, // Password.
// dwLogonFlags, // Flags
// &pSession); // Session obj ptr (out).
// if (SUCCEEDED(hr))
// {
// //
// // Use MAPI interfaces.
// //
// }
// mapi.Uninitialize();
// }
// mapi.Unload(); // This calls FreeLibrary for MAPI32.DLL
// }
//
//
//-----------------------------------------------------------------------------
//
// Function pointer typedefs for some MAPI functions.
// Used for defining function pointers in class MAPI.
//
//
// HrQueryAllRows
//
typedef HRESULT (STDMETHODCALLTYPE MAPIHRQUERYALLROWS)(
LPMAPITABLE lpTable,
LPSPropTagArray lpPropTags,
LPSRestriction lpRestriction,
LPSSortOrderSet lpSortOrderSet,
LONG crowsMax,
LPSRowSet FAR *lppRows);
typedef MAPIHRQUERYALLROWS FAR *LPMAPIHRQUERYALLROWS;
//
// FreePadrlist
//
typedef VOID (STDAPICALLTYPE MAPIFREEPADRLIST)(LPADRLIST lpAdrList);
typedef MAPIFREEPADRLIST FAR *LPMAPIFREEPADRLIST;
//
// FreeProws
//
typedef VOID (STDAPICALLTYPE MAPIFREEPROWS)(LPSRowSet lpRows);
typedef MAPIFREEPROWS FAR *LPMAPIFREEPROWS;
class MAPI
{
public:
MAPI(VOID);
~MAPI(VOID);
HRESULT Load(VOID);
VOID Unload(VOID);
HRESULT LogonEx(
ULONG ulUIParam,
LPTSTR lpszProfileName,
LPTSTR lpszPassword,
FLAGS flFlags,
LPMAPISESSION FAR * lppSession);
HRESULT Initialize(
LPVOID lpMapiInit);
VOID Uninitialize(VOID);
SCODE AllocateBuffer(
ULONG cbSize,
LPVOID FAR * lppBuffer);
SCODE AllocateMore(
ULONG cbSize,
LPVOID lpObject,
LPVOID FAR * lppBuffer);
ULONG FreeBuffer(
LPVOID lpBuffer);
HRESULT HrQueryAllRows(
LPMAPITABLE lpTable,
LPSPropTagArray lpPropTags,
LPSRestriction lpRestriction,
LPSSortOrderSet lpSortOrderSet,
LONG crowsMax,
LPSRowSet FAR *lppRows);
VOID FreePadrlist(LPADRLIST lpAdrlist);
VOID FreeProws(LPSRowSet lpRows);
private:
static LONG m_cLoadCount;
static HINSTANCE m_hmodMAPI;
static LPMAPIINITIALIZE m_pfnInitialize;
static LPMAPILOGONEX m_pfnLogonEx;
static LPMAPIUNINITIALIZE m_pfnUninitialize;
static LPMAPIALLOCATEBUFFER m_pfnAllocateBuffer;
static LPMAPIALLOCATEMORE m_pfnAllocateMore;
static LPMAPIFREEBUFFER m_pfnFreeBuffer;
static LPMAPIHRQUERYALLROWS m_pfnHrQueryAllRows;
static LPMAPIFREEPADRLIST m_pfnFreePadrlist;
static LPMAPIFREEPROWS m_pfnFreeProws;
//
// Prevent copy.
//
MAPI(const MAPI& rhs);
MAPI& operator = (const MAPI& rhs);
};
//-----------------------------------------------------------------------------
// CMapiRecipients
// Hides the grossness of adding entries and properties to a MAPI
// address list.
//-----------------------------------------------------------------------------
class CMapiRecipients
{
public:
CMapiRecipients(BOOL bUnicode = TRUE);
~CMapiRecipients(VOID);
CMapiRecipients(const CMapiRecipients& rhs);
CMapiRecipients& operator = (const CMapiRecipients& rhs);
//
// Does the address list contain unicode names?
//
BOOL IsUnicode(VOID)
{ return m_bUnicode; }
//
// Add a recipient to the address list.
//
HRESULT AddRecipient(LPCTSTR pszEmailName, DWORD dwType);
//
// Return a count of entries in the address list.
//
INT Count(VOID) const;
//
// Make it easy to use a CMapiRecipients object in calls to MAPI
// functions taking an LPADRLIST. Do note however that by
// giving a MAPI function direct access to the address list,
// you circumvent the automatic growth function built into this
// class. This conversion capability is generally intended for
// resolving names (which modifies the list but doesn't add entries)
// or for read access to the list.
//
operator LPADRLIST() const
{ return m_pal; }
private:
LPADRLIST m_pal; // Ptr to actual address list.
UINT m_cMaxEntries; // Size of list (max entries)
BOOL m_bUnicode; // Contains Ansi or Unicode names?
static UINT m_cGrowIncr; // How many entries we grow by each time.
HRESULT Grow(
UINT cEntries);
HRESULT CopyAdrListEntry(
ADRENTRY& Dest,
ADRENTRY& Src,
BOOL bConvertStrings);
HRESULT CopySPropVal(
LPVOID pvBaseAlloc,
SPropValue& Dest,
SPropValue& Src,
BOOL bConvertStrings);
HRESULT CopyVarLengthSPropVal(
LPVOID pvBaseAlloc,
LPVOID *ppvDest,
LPVOID pvSrc,
INT cb);
HRESULT CopySPropValString(
LPVOID pvBaseAlloc,
LPSTR *ppszDestA,
LPCWSTR pszSrcW);
HRESULT CopySPropValString(
LPVOID pvBaseAlloc,
LPWSTR *ppszDestW,
LPCSTR pszSrcA);
};
//-----------------------------------------------------------------------------
// CMapiMessageBody
// Encapsulates the addition of text into a MAPI message body.
// Maintains body text in an OLE stream so that we can easily append
// text as needed. Provides formatted text input through Append().
//-----------------------------------------------------------------------------
class CMapiMessageBody
{
public:
CMapiMessageBody(VOID);
~CMapiMessageBody(VOID);
CMapiMessageBody(const CMapiMessageBody& rhs);
CMapiMessageBody& operator = (const CMapiMessageBody& rhs);
//
// Append text to the stream.
//
HRESULT Append(LPCTSTR pszFmt, ...);
HRESULT Append(HINSTANCE hInst, UINT idFmt, ...);
HRESULT Append(LPCTSTR pszFmt, va_list *pargs);
HRESULT Append(HINSTANCE hInst, UINT idFmt, va_list *pargs);
BOOL IsValid(VOID)
{ return NULL != m_pStg && NULL != m_pStm; }
operator LPSTREAM()
{ return m_pStm; }
operator LPSTORAGE()
{ return m_pStg; }
private:
LPSTORAGE m_pStg;
LPSTREAM m_pStm;
HRESULT CommonConstruct(VOID);
};
//-----------------------------------------------------------------------------
// CMapiMessage
//-----------------------------------------------------------------------------
class CMapiMessage
{
public:
CMapiMessage(LPMAPIFOLDER pFolder);
CMapiMessage(LPMAPIFOLDER pFolder, CMapiMessageBody& body, LPCTSTR pszSubject = NULL);
~CMapiMessage(VOID);
//
// Set the message's subject line.
//
HRESULT SetSubject(LPCTSTR pszSubject);
//
// Append a line of text to the message body.
//
HRESULT Append(LPCTSTR pszFmt, ...);
HRESULT Append(HINSTANCE hInst, UINT idFmt, ...);
//
// Set the message's recipient list.
//
HRESULT SetRecipients(LPADRLIST pAdrList);
//
// Set props on a message.
//
HRESULT SetProps(ULONG cValues,
LPSPropValue lpPropArray,
LPSPropProblemArray *lppProblems);
//
// Save property changes.
//
HRESULT SaveChanges(ULONG ulFlags);
//
// Send the message.
// Assumes address list is completely resolved.
//
HRESULT Send(LPADRLIST pAdrList = NULL);
private:
LPMESSAGE m_pMsg;
CMapiMessageBody m_body;
HRESULT CommonConstruct(LPMAPIFOLDER pFolder);
//
// Prevent copy.
//
CMapiMessage(const CMapiMessage& rhs);
CMapiMessage& operator = (const CMapiMessage& rhs);
};
//-----------------------------------------------------------------------------
// CMapiSession
// Encapsulates a basic MAPI session for sending very simple text
// messages.
//-----------------------------------------------------------------------------
class CMapiSession
{
public:
CMapiSession(VOID);
~CMapiSession(VOID);
//
// Log on to MAPI, open the default store and open the outbox.
// If this succeeds, you're ready to send messages. The dtor
// will close everything down.
//
HRESULT Initialize(VOID);
//
// Send a message to a list of recipients.
//
HRESULT Send(LPADRLIST pAdrList, LPCTSTR pszSubject, LPCTSTR pszMsg);
HRESULT Send(LPADRLIST pAdrList, LPCTSTR pszSubject, CMapiMessageBody& body);
HRESULT Send(LPADRLIST pAdrList, CMapiMessage& msg);
//
// Get pointer to the address book.
//
HRESULT GetAddressBook(LPADRBOOK *ppAdrBook);
//
// Get pointer to outbox folder.
//
HRESULT GetOutBoxFolder(LPMAPIFOLDER *ppOutBoxFolder);
//
// Resolve a list of adresses.
//
HRESULT ResolveAddresses(LPADRLIST pAdrList);
//
// Get name of current session user.
//
HRESULT GetSessionUser(LPSPropValue *ppProps, ULONG *pcbProps);
//
// Report MAPI errors returned by some MAPI API calls.
// The error information is returned in a MAPIERROR
// structure.
//
VOID ReportErrorsReturned(HRESULT hr, BOOL bLogEvent = FALSE);
private:
LPMAPISESSION m_pSession; // Ptr to MAPI session object.
LPMDB m_pDefMsgStore; // Ptr to MAPI default msg store obj.
LPMAPIFOLDER m_pOutBoxFolder; // Ptr to MAPI outbox folder object.
BOOL m_bMapiInitialized; // Has MAPI been initialized?
HRESULT OpenDefMsgStore(VOID);
HRESULT OpenOutBoxFolder(VOID);
//
// Prevent copy.
//
CMapiSession(const CMapiSession& rhs);
CMapiSession& operator = (const CMapiSession& rhs);
};
#endif //__MAPISEND_H