summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/import/src/MapiApi.h
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/import/src/MapiApi.h')
-rw-r--r--comm/mailnews/import/src/MapiApi.h284
1 files changed, 284 insertions, 0 deletions
diff --git a/comm/mailnews/import/src/MapiApi.h b/comm/mailnews/import/src/MapiApi.h
new file mode 100644
index 0000000000..4d9dc7be2a
--- /dev/null
+++ b/comm/mailnews/import/src/MapiApi.h
@@ -0,0 +1,284 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#ifndef MapiApi_h___
+#define MapiApi_h___
+
+#include "nscore.h"
+#include "nsString.h"
+#include "nsTArray.h"
+
+#include <stdio.h>
+
+#include <windows.h>
+#include <mapi.h>
+#include <mapix.h>
+#include <mapidefs.h>
+#include <mapicode.h>
+#include <mapitags.h>
+#include <mapiutil.h>
+// wabutil.h expects mapiutil to define _MAPIUTIL_H but it actually
+// defines _MAPIUTIL_H_
+#define _MAPIUTIL_H
+
+#ifndef PR_INTERNET_CPID
+# define PR_INTERNET_CPID (PROP_TAG(PT_LONG, 0x3FDE))
+#endif
+#ifndef MAPI_NATIVE_BODY
+# define MAPI_NATIVE_BODY (0x00010000)
+#endif
+#ifndef MAPI_NATIVE_BODY_TYPE_RTF
+# define MAPI_NATIVE_BODY_TYPE_RTF (0x00000001)
+#endif
+#ifndef MAPI_NATIVE_BODY_TYPE_HTML
+# define MAPI_NATIVE_BODY_TYPE_HTML (0x00000002)
+#endif
+#ifndef MAPI_NATIVE_BODY_TYPE_PLAINTEXT
+# define MAPI_NATIVE_BODY_TYPE_PLAINTEXT (0x00000004)
+#endif
+#ifndef PR_BODY_HTML_A
+# define PR_BODY_HTML_A (PROP_TAG(PT_STRING8, 0x1013))
+#endif
+#ifndef PR_BODY_HTML_W
+# define PR_BODY_HTML_W (PROP_TAG(PT_UNICODE, 0x1013))
+#endif
+#ifndef PR_BODY_HTML
+# define PR_BODY_HTML (PROP_TAG(PT_TSTRING, 0x1013))
+#endif
+
+class CMapiFolderList;
+class CMsgStore;
+class CMapiFolder;
+
+class CMapiContentIter {
+ public:
+ virtual BOOL HandleContentItem(ULONG oType, ULONG cb, LPENTRYID pEntry) = 0;
+};
+
+class CMapiHierarchyIter {
+ public:
+ virtual BOOL HandleHierarchyItem(ULONG oType, ULONG cb, LPENTRYID pEntry) = 0;
+};
+
+class CMapiApi {
+ public:
+ CMapiApi();
+ ~CMapiApi();
+
+ static BOOL LoadMapi(void);
+ static BOOL LoadMapiEntryPoints(void);
+ static void UnloadMapi(void);
+
+ static HINSTANCE m_hMapi32;
+
+ static void MAPIUninitialize(void);
+ static HRESULT MAPIInitialize(LPVOID lpInit);
+ static SCODE MAPIAllocateBuffer(ULONG cbSize, LPVOID FAR* lppBuffer);
+ static ULONG MAPIFreeBuffer(LPVOID lpBuff);
+ static HRESULT MAPILogonEx(ULONG ulUIParam, LPTSTR lpszProfileName,
+ LPTSTR lpszPassword, FLAGS flFlags,
+ LPMAPISESSION FAR* lppSession);
+ static HRESULT OpenStreamOnFile(LPALLOCATEBUFFER lpAllocateBuffer,
+ LPFREEBUFFER lpFreeBuffer, ULONG ulFlags,
+ LPCTSTR lpszFileName, LPTSTR lpszPrefix,
+ LPSTREAM FAR* lppStream);
+ static void FreeProws(LPSRowSet prows);
+
+ BOOL Initialize(void);
+ BOOL LogOn(void);
+
+ void AddMessageStore(CMsgStore* pStore);
+ void SetCurrentMsgStore(LPMDB lpMdb) { m_lpMdb = lpMdb; }
+
+ // Open any given entry from the current Message Store
+ BOOL OpenEntry(ULONG cbEntry, LPENTRYID pEntryId, LPUNKNOWN* ppOpen);
+ static BOOL OpenMdbEntry(LPMDB lpMdb, ULONG cbEntry, LPENTRYID pEntryId,
+ LPUNKNOWN* ppOpen);
+
+ // Fill in the folders list with the hierarchy from the given
+ // message store.
+ BOOL GetStoreFolders(ULONG cbEid, LPENTRYID lpEid, CMapiFolderList& folders,
+ int startDepth);
+ BOOL GetStoreAddressFolders(ULONG cbEid, LPENTRYID lpEid,
+ CMapiFolderList& folders);
+ BOOL OpenStore(ULONG cbEid, LPENTRYID lpEid, LPMDB* ppMdb);
+
+ // Iteration
+ BOOL IterateStores(CMapiFolderList& list);
+ BOOL IterateContents(CMapiContentIter* pIter, LPMAPIFOLDER pFolder,
+ ULONG flags = 0);
+ BOOL IterateHierarchy(CMapiHierarchyIter* pIter, LPMAPIFOLDER pFolder,
+ ULONG flags = 0);
+
+ // Properties
+ static LPSPropValue GetMapiProperty(LPMAPIPROP pProp, ULONG tag);
+ // If delVal is true, functions will call CMapiApi::MAPIFreeBuffer on pVal.
+ static BOOL GetEntryIdFromProp(LPSPropValue pVal, ULONG& cbEntryId,
+ LPENTRYID& lpEntryId, BOOL delVal = TRUE);
+ static BOOL GetStringFromProp(LPSPropValue pVal, nsCString& val,
+ BOOL delVal = TRUE);
+ static BOOL GetStringFromProp(LPSPropValue pVal, nsString& val,
+ BOOL delVal = TRUE);
+ static LONG GetLongFromProp(LPSPropValue pVal, BOOL delVal = TRUE);
+ static BOOL GetLargeStringProperty(LPMAPIPROP pProp, ULONG tag,
+ nsCString& val);
+ static BOOL GetLargeStringProperty(LPMAPIPROP pProp, ULONG tag,
+ nsString& val);
+ static BOOL IsLargeProperty(LPSPropValue pVal);
+ static ULONG GetEmailPropertyTag(LPMAPIPROP lpProp, LONG nameID);
+
+ static BOOL GetRTFPropertyDecodedAsUTF16(LPMAPIPROP pProp, nsString& val,
+ unsigned long& nativeBodyType,
+ unsigned long codepage = 0);
+
+ // Debugging & reporting stuff
+ static void ListProperties(LPMAPIPROP lpProp, BOOL getValues = TRUE);
+ static void ListPropertyValue(LPSPropValue pVal, nsCString& s);
+
+ protected:
+ BOOL HandleHierarchyItem(ULONG oType, ULONG cb, LPENTRYID pEntry);
+ BOOL HandleContentsItem(ULONG oType, ULONG cb, LPENTRYID pEntry);
+ void GetStoreInfo(CMapiFolder* pFolder, long* pSzContents);
+
+ // array of available message stores, cached so that
+ // message stores are only opened once, preventing multiple
+ // logon's by the user if the store requires a logon.
+ CMsgStore* FindMessageStore(ULONG cbEid, LPENTRYID lpEid);
+ void ClearMessageStores(void);
+
+ static void CStrToUnicode(const char* pStr, nsString& result);
+
+ // Debugging & reporting stuff
+ static void GetPropTagName(ULONG tag, nsCString& s);
+ static void ReportStringProp(const char* pTag, LPSPropValue pVal);
+ static void ReportUIDProp(const char* pTag, LPSPropValue pVal);
+ static void ReportLongProp(const char* pTag, LPSPropValue pVal);
+
+ private:
+ static int m_clients;
+ static BOOL m_initialized;
+ static nsTArray<CMsgStore*>* m_pStores;
+ static LPMAPISESSION m_lpSession;
+ static LPMDB m_lpMdb;
+ static HRESULT m_lastError;
+ static char16_t* m_pUniBuff;
+ static int m_uniBuffLen;
+
+ static BOOL GetLargeProperty(LPMAPIPROP pProp, ULONG tag, void** result);
+};
+
+class CMapiFolder {
+ public:
+ CMapiFolder();
+ explicit CMapiFolder(const CMapiFolder* pCopyFrom);
+ CMapiFolder(const char16_t* pDisplayName, ULONG cbEid, LPENTRYID lpEid,
+ int depth, LONG oType = MAPI_FOLDER);
+ ~CMapiFolder();
+
+ void SetDoImport(BOOL doIt) { m_doImport = doIt; }
+ void SetObjectType(long oType) { m_objectType = oType; }
+ void SetDisplayName(const char16_t* pDisplayName) {
+ m_displayName = pDisplayName;
+ }
+ void SetEntryID(ULONG cbEid, LPENTRYID lpEid);
+ void SetDepth(int depth) { m_depth = depth; }
+ void SetFilePath(const char16_t* pFilePath) { m_mailFilePath = pFilePath; }
+
+ BOOL GetDoImport(void) const { return m_doImport; }
+ LONG GetObjectType(void) const { return m_objectType; }
+ void GetDisplayName(nsString& name) const { name = m_displayName; }
+ void GetFilePath(nsString& path) const { path = m_mailFilePath; }
+ BOOL IsStore(void) const { return m_objectType == MAPI_STORE; }
+ BOOL IsFolder(void) const { return m_objectType == MAPI_FOLDER; }
+ int GetDepth(void) const { return m_depth; }
+
+ LPENTRYID GetEntryID(ULONG* pCb = NULL) const {
+ if (pCb) *pCb = m_cbEid;
+ return (LPENTRYID)m_lpEid;
+ }
+ ULONG GetCBEntryID(void) const { return m_cbEid; }
+
+ private:
+ LONG m_objectType;
+ ULONG m_cbEid;
+ BYTE* m_lpEid;
+ nsString m_displayName;
+ int m_depth;
+ nsString m_mailFilePath;
+ BOOL m_doImport;
+};
+
+class CMapiFolderList {
+ public:
+ CMapiFolderList();
+ ~CMapiFolderList();
+
+ void AddItem(CMapiFolder* pFolder);
+ CMapiFolder* GetItem(int index) {
+ if ((index >= 0) && (index < (int)m_array.Length()))
+ return GetAt(index);
+ else
+ return NULL;
+ }
+ void ClearAll(void);
+
+ // Debugging and reporting
+ void DumpList(void);
+
+ CMapiFolder* GetAt(int index) { return m_array.ElementAt(index); }
+ int GetSize(void) { return m_array.Length(); }
+
+ protected:
+ void EnsureUniqueName(CMapiFolder* pFolder);
+ void GenerateFilePath(CMapiFolder* pFolder);
+ void ChangeName(nsString& name);
+
+ private:
+ nsTArray<CMapiFolder*> m_array;
+};
+
+class CMsgStore {
+ public:
+ explicit CMsgStore(ULONG cbEid = 0, LPENTRYID lpEid = NULL);
+ ~CMsgStore();
+
+ void SetEntryID(ULONG cbEid, LPENTRYID lpEid);
+ BOOL Open(LPMAPISESSION pSession, LPMDB* ppMdb);
+
+ ULONG GetCBEntryID(void) { return m_cbEid; }
+ LPENTRYID GetLPEntryID(void) { return (LPENTRYID)m_lpEid; }
+
+ private:
+ ULONG m_cbEid;
+ BYTE* m_lpEid;
+ LPMDB m_lpMdb;
+};
+
+class CMapiFolderContents {
+ public:
+ CMapiFolderContents(LPMDB lpMdb, ULONG cbEID, LPENTRYID lpEid);
+ ~CMapiFolderContents();
+
+ BOOL GetNext(ULONG* pcbEid, LPENTRYID* ppEid, ULONG* poType, BOOL* pDone);
+
+ ULONG GetCount(void) { return m_count; }
+
+ protected:
+ BOOL SetUpIter(void);
+
+ private:
+ HRESULT m_lastError;
+ BOOL m_failure;
+ LPMDB m_lpMdb;
+ LPMAPIFOLDER m_lpFolder;
+ LPMAPITABLE m_lpTable;
+ ULONG m_fCbEid;
+ BYTE* m_fLpEid;
+ ULONG m_count;
+ ULONG m_iterCount;
+ BYTE* m_lastLpEid;
+ ULONG m_lastCbEid;
+};
+
+#endif /* MapiApi_h__ */