summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/addrbook/src/nsAbWinHelper.h
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/addrbook/src/nsAbWinHelper.h')
-rw-r--r--comm/mailnews/addrbook/src/nsAbWinHelper.h183
1 files changed, 183 insertions, 0 deletions
diff --git a/comm/mailnews/addrbook/src/nsAbWinHelper.h b/comm/mailnews/addrbook/src/nsAbWinHelper.h
new file mode 100644
index 0000000000..5411ae94fd
--- /dev/null
+++ b/comm/mailnews/addrbook/src/nsAbWinHelper.h
@@ -0,0 +1,183 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* 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 nsAbWinHelper_h___
+#define nsAbWinHelper_h___
+
+#include <windows.h>
+#include "../../mapi/include/mapix.h"
+
+#include "nsString.h"
+#include "mozilla/StaticMutex.h"
+
+#define kOutlookDirectoryScheme "moz-aboutlookdirectory:///"
+#define kOutlookCardScheme "moz-aboutlookcard:///"
+#define kDummyDisplayName "__MailUser__"
+
+struct nsMapiEntry {
+ // Can't be assigned since it would double up the reference in `mEntryId`.
+ nsMapiEntry& operator=(nsMapiEntry&) = delete;
+ ULONG mByteCount;
+ LPENTRYID mEntryId;
+
+ nsMapiEntry(void);
+ ~nsMapiEntry(void);
+ nsMapiEntry(ULONG aByteCount, LPENTRYID aEntryId);
+
+ static void Move(nsMapiEntry& target, nsMapiEntry& source);
+ void Assign(ULONG aByteCount, LPENTRYID aEntryId);
+ void Assign(const nsCString& aString);
+ void ToString(nsCString& aString) const;
+ void Dump(void) const;
+};
+
+struct nsMapiEntryArray {
+ nsMapiEntry* mEntries;
+ ULONG mNbEntries;
+
+ nsMapiEntryArray(void);
+ ~nsMapiEntryArray(void);
+
+ void CleanUp(void);
+};
+
+class nsAbWinHelper {
+ public:
+ nsAbWinHelper(void);
+ virtual ~nsAbWinHelper(void);
+
+ // Get the top address books
+ BOOL GetFolders(nsMapiEntryArray& aFolders);
+ // Get a list of entries for cards/mailing lists in a folder/mailing list
+ BOOL GetCards(const nsMapiEntry& aParent, LPSRestriction aRestriction,
+ nsMapiEntryArray& aCards);
+ // Get a list of mailing lists in a folder
+ BOOL GetNodes(const nsMapiEntry& aParent, nsMapiEntryArray& aNodes);
+ // Get the number of cards/mailing lists in a folder/mailing list
+ BOOL GetCardsCount(const nsMapiEntry& aParent, ULONG& aNbCards);
+ // Access last MAPI error
+ HRESULT LastError(void) const { return mLastError; }
+ // Get the value of a MAPI property of type string
+ BOOL GetPropertyString(const nsMapiEntry& aObject, ULONG aPropertyTag,
+ nsCString& aValue);
+ // Same as previous, but string is returned as unicode.
+ BOOL GetPropertyUString(const nsMapiEntry& aObject, ULONG aPropertyTag,
+ nsString& aValue);
+ // Get multiple string MAPI properties in one call.
+ // Retrieves the properties from the associated contact object (IMessage)
+ // not the address book entry (IMailUser).
+ BOOL GetPropertiesUString(const nsMapiEntry& aDir, const nsMapiEntry& aObject,
+ const ULONG aPropertyTags[], ULONG aNbProperties,
+ nsString aValues[], bool aSuccess[]);
+ // Get the value of a MAPI property of type SYSTIME
+ BOOL GetPropertyDate(const nsMapiEntry& aDir, const nsMapiEntry& aObject,
+ bool fromContact, ULONG aPropertyTag, WORD& aYear,
+ WORD& aMonth, WORD& aDay);
+ // Get the value of a MAPI property of type LONG
+ BOOL GetPropertyLong(const nsMapiEntry& aObject, ULONG aPropertyTag,
+ ULONG& aValue);
+ // Get the value of a MAPI property of type BIN
+ BOOL GetPropertyBin(const nsMapiEntry& aObject, ULONG aPropertyTag,
+ nsMapiEntry& aValue);
+ // Get the values of a multiple MAPI properties of type MV BIN
+ BOOL GetPropertiesMVBin(const nsMapiEntry& aDir, const nsMapiEntry& aObject,
+ const ULONG aPropertyTags[], ULONG aNbProperties,
+ nsMapiEntry* aEntryIDs[], ULONG aNbElements[],
+ bool aAllocateMore = false);
+ // Set the value of a MAPI property of type MV BIN
+ BOOL SetPropertiesMVBin(const nsMapiEntry& aDir, const nsMapiEntry& aObject,
+ const ULONG aPropertyTags[], ULONG aNbProperties,
+ nsMapiEntry* aEntryIDs[], ULONG aNbElements[]);
+ // Tests if a container contains an entry
+ BOOL TestOpenEntry(const nsMapiEntry& aContainer, const nsMapiEntry& aEntry);
+ // Delete an entry in the address book
+ BOOL DeleteEntry(const nsMapiEntry& aContainer, const nsMapiEntry& aEntry);
+ // Delete an entry from an Outlook distribution list.
+ BOOL DeleteEntryfromDL(const nsMapiEntry& aTopDir,
+ const nsMapiEntry& aDistList,
+ const nsMapiEntry& aEntry);
+ // Add an entry to an Outlook distribution list.
+ BOOL AddEntryToDL(const nsMapiEntry& aTopDir, const nsMapiEntry& aDistList,
+ const nsMapiEntry& aEntry, const wchar_t* aDisplay,
+ const wchar_t* aEmail);
+ // Set the value of a MAPI property of type string in unicode
+ BOOL SetPropertyUString(const nsMapiEntry& aObject, ULONG aPropertyTag,
+ const char16_t* aValue);
+ // Same as previous, but with a bunch of properties in one call.
+ // Sets the properties on the associated contact object (IMessage)
+ // not the address book entry (IMailUser).
+ BOOL SetPropertiesUString(const nsMapiEntry& aDir, const nsMapiEntry& aObject,
+ const ULONG aPropertyTags[], ULONG aNbProperties,
+ nsString aValues[]);
+ // Set the value of a MAPI property of type SYSTIME
+ BOOL SetPropertyDate(const nsMapiEntry& aDir, const nsMapiEntry& aObject,
+ bool fromContact, ULONG aPropertyTag, WORD aYear,
+ WORD aMonth, WORD aDay);
+ // Create entry in the address book
+ BOOL CreateEntry(const nsMapiEntry& aParent, nsMapiEntry& aNewEntry);
+ // Create a distribution list in the address book
+ BOOL CreateDistList(const nsMapiEntry& aParent, nsMapiEntry& aNewEntry,
+ const wchar_t* aName);
+ // Create entry worker
+ BOOL CreateEntryInternal(const nsMapiEntry& aParent, nsMapiEntry& aNewEntry,
+ const char* aContactClass, const wchar_t* aName);
+ // Is the helper correctly initialised?
+ BOOL IsOK(void) const { return mAddressBook != NULL; }
+ // Helper to get distribution list members tag.
+ BOOL GetDlMembersTag(IMAPIProp* aMsg, ULONG& aDlMembersTag,
+ ULONG& aDlMembersTagOneOff);
+ // Helper to get distribution list name tag.
+ BOOL GetDlNameTag(IMAPIProp* aMsg, ULONG& aDlNameTag);
+ // Helper to compare entry IDs.
+ bool CompareEntryIDs(nsCString& aEntryID1, nsCString& aEntryID2);
+
+ protected:
+ HRESULT mLastError;
+ LPADRBOOK mAddressBook;
+ LPMAPISESSION mAddressSession;
+ LPMAPIFREEBUFFER mAddressFreeBuffer;
+ static uint32_t sEntryCounter;
+ static mozilla::StaticMutex sMutex;
+
+ // Retrieve the contents of a container, with an optional restriction
+ BOOL GetContents(const nsMapiEntry& aParent, LPSRestriction aRestriction,
+ nsMapiEntry** aList, ULONG& aNbElements, ULONG aMapiType);
+ // Retrieve the values of a set of properties on a MAPI object
+ BOOL GetMAPIProperties(const nsMapiEntry& aDir, const nsMapiEntry& aObject,
+ const ULONG aPropertyTags[], ULONG aNbProperties,
+ LPSPropValue& aValues, ULONG& aValueCount,
+ bool aFromContact = false);
+ // Set the values of a set of properties on a MAPI object
+ BOOL SetMAPIProperties(const nsMapiEntry& aDir, const nsMapiEntry& aObject,
+ ULONG aNbProperties, const LPSPropValue& aValues,
+ bool aFromContact);
+ // Delete a set of properties on a MAPI object
+ BOOL DeleteMAPIProperties(const nsMapiEntry& aDir, const nsMapiEntry& aObject,
+ const LPSPropTagArray aProps, bool aFromContact);
+ HRESULT OpenMAPIObject(const nsMapiEntry& aDir, const nsMapiEntry& aObject,
+ bool aFromContact, ULONG aFlags, LPUNKNOWN* aResult);
+ // Clean-up a rowset returned by QueryRows
+ void MyFreeProws(LPSRowSet aSet);
+ // Allocation of a buffer for transmission to interfaces
+ virtual void AllocateBuffer(ULONG aByteCount, LPVOID* aBuffer) = 0;
+ // Destruction of a buffer provided by the interfaces
+ virtual void FreeBuffer(LPVOID aBuffer) = 0;
+
+ private:
+};
+
+class nsAbWinHelperGuard {
+ public:
+ explicit nsAbWinHelperGuard();
+ ~nsAbWinHelperGuard(void);
+
+ nsAbWinHelper* operator->(void) { return mHelper; }
+
+ private:
+ nsAbWinHelper* mHelper;
+};
+
+void makeEntryIdFromURI(const char* aScheme, const char* aUri,
+ nsCString& aEntry);
+#endif // nsAbWinHelper_h___