summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/addrbook/src/nsAbWinHelper.h
blob: 5411ae94fd7105b557bf5f8ea5333d985a777be6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
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___