Add support for distribution lists (groups)
[gpgol.git] / src / oomhelp.h
1 /* oomhelp.h - Defs for helper functions for the Outlook Object Model
2  * Copyright (C) 2009 g10 Code GmbH
3  * Copyright (C) 2015 by Bundesamt für Sicherheit in der Informationstechnik
4  * Software engineering by Intevation GmbH
5  *
6  * This file is part of GpgOL.
7  * 
8  * GpgOL is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  * 
13  * GpgOL is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU Lesser General Public License for more details.
17  * 
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this program; if not, see <http://www.gnu.org/licenses/>.
20  */
21
22 #ifndef OOMHELP_H
23 #define OOMHELP_H
24
25 #include <unknwn.h>
26 #include "mymapi.h"
27
28 #include <vector>
29 #include <string>
30
31 #define MSOCONTROLBUTTON    1
32 #define MSOCONTROLEDIT      2
33 #define MSOCONTROLDROPDOWN  3
34 #define MSOCONTROLCOMBOBOX  4
35 #define MSOCONTROLPOPUP    10
36
37 enum 
38   {
39     msoButtonAutomatic = 0,
40     msoButtonIcon = 1,
41     msoButtonCaption = 2,
42     msoButtonIconAndCaption = 3,
43     msoButtonIconAndWrapCaption = 7,
44     msoButtonIconAndCaptionBelow = 11,
45     msoButtonWrapCaption = 14,
46     msoButtonIconAndWrapCaptionBelow = 15 
47   };
48
49 enum
50   {
51     msoButtonDown = -1,
52     msoButtonUp = 0,
53     msoButtonMixed = 2
54   };
55
56
57 DEFINE_GUID(GUID_NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
58
59 DEFINE_GUID(IID_IConnectionPoint, 
60             0xb196b286, 0xbab4, 0x101a,
61             0xb6, 0x9c, 0x00, 0xaa, 0x00, 0x34, 0x1d, 0x07);
62 DEFINE_GUID(IID_IConnectionPointContainer, 
63             0xb196b284, 0xbab4, 0x101a,
64             0xb6, 0x9c, 0x00, 0xaa, 0x00, 0x34, 0x1d, 0x07);
65 DEFINE_GUID(IID_IPictureDisp,
66             0x7bf80981, 0xbf32, 0x101a,
67             0x8b, 0xbb, 0x00, 0xaa, 0x00, 0x30, 0x0c, 0xab);
68 DEFINE_GUID(IID_FolderEvents, 0x000630F7, 0x0000, 0x0000,
69             0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
70 DEFINE_GUID(IID_ApplicationEvents, 0x0006304E, 0x0000, 0x0000,
71             0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
72 DEFINE_GUID(IID_ExplorerEvents, 0x0006300F, 0x0000, 0x0000,
73             0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
74 DEFINE_GUID(IID_ExplorersEvents, 0x00063078, 0x0000, 0x0000,
75             0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
76 DEFINE_GUID(IID_MailItemEvents, 0x0006302B, 0x0000, 0x0000,
77             0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
78 DEFINE_GUID(IID_MailItem, 0x00063034, 0x0000, 0x0000,
79             0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
80 DEFINE_GUID(IID_IMAPISecureMessage, 0x253cc320, 0xeab6, 0x11d0,
81             0x82, 0x22, 0, 0x60, 0x97, 0x93, 0x87, 0xea);
82
83 DEFINE_OLEGUID(IID_IUnknown,                  0x00000000, 0, 0);
84 DEFINE_OLEGUID(IID_IDispatch,                 0x00020400, 0, 0);
85 DEFINE_OLEGUID(IID_IOleWindow,                0x00000114, 0, 0);
86
87 #ifndef PR_SMTP_ADDRESS_DASL
88 #define PR_SMTP_ADDRESS_DASL \
89   "http://schemas.microsoft.com/mapi/proptag/0x39FE001E"
90 #endif
91
92 #ifndef PR_EMS_AB_PROXY_ADDRESSES_DASL
93 #define PR_EMS_AB_PROXY_ADDRESSES_DASL \
94   "http://schemas.microsoft.com/mapi/proptag/0x800F101E"
95 #endif
96
97 #ifndef PR_ATTACHMENT_HIDDEN_DASL
98 #define PR_ATTACHMENT_HIDDEN_DASL \
99   "http://schemas.microsoft.com/mapi/proptag/0x7FFE000B"
100 #endif
101
102 #ifndef PR_ADDRTYPE_DASL
103 #define PR_ADDRTYPE_DASL \
104   "http://schemas.microsoft.com/mapi/proptag/0x3002001E"
105 #endif
106
107 #ifndef PR_EMAIL_ADDRESS_DASL
108 #define PR_EMAIL_ADDRESS_DASL \
109   "http://schemas.microsoft.com/mapi/proptag/0x3003001E"
110 #endif
111
112 #define PR_MESSAGE_CLASS_W_DASL \
113   "http://schemas.microsoft.com/mapi/proptag/0x001A001F"
114 #define GPGOL_ATTACHTYPE_DASL \
115   "http://schemas.microsoft.com/mapi/string/" \
116   "{31805AB8-3E92-11DC-879C-00061B031004}/GpgOL Attach Type/0x00000003"
117 #define GPGOL_UID_DASL \
118   "http://schemas.microsoft.com/mapi/string/" \
119   "{31805AB8-3E92-11DC-879C-00061B031004}/GpgOL UID/0x0000001F"
120 #define PR_ATTACH_DATA_BIN_DASL \
121   "http://schemas.microsoft.com/mapi/proptag/0x37010102"
122 #define PR_BODY_W_DASL \
123   "http://schemas.microsoft.com/mapi/proptag/0x1000001F"
124 #define PR_ATTACHMENT_HIDDEN_DASL \
125   "http://schemas.microsoft.com/mapi/proptag/0x7FFE000B"
126 #define PR_ATTACH_MIME_TAG_DASL \
127   "http://schemas.microsoft.com/mapi/proptag/0x370E001F"
128 #define PR_ATTACH_CONTENT_ID_DASL \
129   "http://schemas.microsoft.com/mapi/proptag/0x3712001F"
130 #define PR_TAG_SENDER_SMTP_ADDRESS \
131   "http://schemas.microsoft.com/mapi/proptag/0x5D01001F"
132 #define PR_TAG_RECEIVED_REPRESENTING_SMTP_ADDRESS \
133   "http://schemas.microsoft.com/mapi/proptag/0x5D08001F"
134 #define PR_PIDNameContentType_DASL \
135   "http://schemas.microsoft.com/mapi/string/{00020386-0000-0000-C000-000000000046}/content-type/0x0000001F"
136 #define PR_BLOCK_STATUS_DASL \
137   "http://schemas.microsoft.com/mapi/proptag/0x10960003"
138
139 #define DISTRIBUTION_LIST_ADDRESS_ENTRY_TYPE 11
140
141 /* Return the malloced name of an COM+ object.  */
142 char *get_object_name (LPUNKNOWN obj);
143
144 /* Helper to lookup a dispid.  */
145 DISPID lookup_oom_dispid (LPDISPATCH pDisp, const char *name);
146
147 /* Return the OOM object's IDispatch interface described by FULLNAME.  */
148 LPDISPATCH get_oom_object (LPDISPATCH pStart, const char *fullname);
149
150 /* Set the Icon of a CommandBarControl.  */
151 int put_oom_icon (LPDISPATCH pDisp, int rsource_id, int size);
152
153 /* Set the boolean property NAME to VALUE.  */
154 int put_oom_bool (LPDISPATCH pDisp, const char *name, int value);
155
156 /* Set the property NAME to VALUE.  */
157 int put_oom_int (LPDISPATCH pDisp, const char *name, int value);
158
159 /* Set the property NAME to STRING.  */
160 int put_oom_string (LPDISPATCH pDisp, const char *name, const char *string);
161
162 /* Set the property NAME to DISP.  */
163 int put_oom_disp (LPDISPATCH pDisp, const char *name, LPDISPATCH value);
164
165 /* Get the boolean property NAME of the object PDISP.  */
166 int get_oom_bool (LPDISPATCH pDisp, const char *name);
167
168 /* Get the integer property NAME of the object PDISP.  */
169 int get_oom_int (LPDISPATCH pDisp, const char *name);
170
171 /* Get the string property NAME of the object PDISP.  */
172 char *get_oom_string (LPDISPATCH pDisp, const char *name);
173
174 /* Get an IUnknown object from property NAME of PDISP.  */
175 LPUNKNOWN get_oom_iunknown (LPDISPATCH pDisp, const char *name);
176
177 /* Return the control object with tag property value TAG.  */
178 LPDISPATCH get_oom_control_bytag (LPDISPATCH pObj, const char *tag);
179
180 /* Add a new button to an object which supports the add method.
181    Returns the new object or NULL on error.  */
182 LPDISPATCH add_oom_button (LPDISPATCH pObj);
183
184 /* Delete a button.  */
185 void del_oom_button (LPDISPATCH button);
186
187 /* Get the HWND of the active window in the current context */
188 HWND get_oom_context_window (LPDISPATCH context);
189
190 /* Get the address of the recipients as string list.
191    If r_err is not null it is set to true in case of an error. */
192 std::vector<std::string> get_oom_recipients (LPDISPATCH recipients,
193                                              bool *r_err = nullptr);
194
195 /* Add an attachment to a dispatcher */
196 int
197 add_oom_attachment (LPDISPATCH disp, const wchar_t* inFile,
198                     const wchar_t *displayName);
199
200 /* Look up a string with the propertyAccessor interface */
201 char *
202 get_pa_string (LPDISPATCH pDisp, const char *property);
203
204 /* Look up a long with the propertyAccessor interface.
205  returns -1 on error.*/
206 int
207 get_pa_int (LPDISPATCH pDisp, const char *property, int *rInt);
208
209 /* Set a variant with the propertyAccessor interface.
210
211    This is tested to work at least vor BSTR variants. Trying
212    to set PR_ATTACH_DATA_BIN_DASL with this failed with
213    hresults 0x80020005 type mismatch or 0x80020008 vad
214    variable type for:
215    VT_ARRAY | VT_UI1 | VT_BYREF
216    VT_SAFEARRAY | VT_UI1 | VT_BYREF
217    VT_BSTR | VT_BYREF
218    VT_BSTR
219    VT_ARRAY | VT_UI1
220    VT_SAFEARRAY | VT_UI1
221
222    No idea whats wrong there. Needs more experiments. The
223    Type is only documented as "Binary". Outlookspy also
224    fails with the same error when trying to modify the
225    property.
226 */
227 int
228 put_pa_string (LPDISPATCH pDisp, const char *dasl_id, const char *value);
229
230 int
231 put_pa_variant (LPDISPATCH pDisp, const char *dasl_id, VARIANT *value);
232
233 int
234 put_pa_int (LPDISPATCH pDisp, const char *dasl_id, int value);
235
236 /* Look up a variant with the propertyAccessor interface */
237 int
238 get_pa_variant (LPDISPATCH pDisp, const char *dasl_id, VARIANT *rVariant);
239
240 /* Look up a LONG with the propertyAccessor interface */
241 LONG
242 get_pa_long (LPDISPATCH pDisp, const char *dasl_id);
243
244 /* Queries the interface of the dispatcher for the id
245    id. Returns NULL on error. The returned Object
246    must be released.
247    Mainly useful to check if an object is what
248    it appears to be. */
249 LPDISPATCH
250 get_object_by_id (LPDISPATCH pDisp, REFIID id);
251
252 /* Obtain the MAPI Message corresponding to the
253    Mailitem. Returns NULL on error.
254
255    The returned Message needs to be released by the
256    caller */
257 LPMESSAGE
258 get_oom_message (LPDISPATCH mailitem);
259
260 /* Obtain the Base MAPI Message of a MailItem.
261    The parameter should be a pointer to a MailItem.
262    returns NULL on error.
263
264    The returned Message needs to be released by the
265    caller.
266 */
267 LPMESSAGE
268 get_oom_base_message (LPDISPATCH mailitem);
269
270 /* Get a strong reference for a mail object by calling
271    Application.GetObjectReference with type strong. The
272    documentation is unclear what this acutally does.
273    This function is left over from experiments about
274    strong references. Maybe there is a use for them.
275    The reference we use in the Mail object is documented
276    as a Weak reference. But changing that does not appear
277    to make a difference.
278 */
279 LPDISPATCH
280 get_strong_reference (LPDISPATCH mail);
281
282 /* Invoke a method of an outlook object.
283    returns true on success false otherwise.
284
285    rVariant should either point to a propery initialized
286    variant (initinalized wiht VariantInit) to hold
287    the return value or a pointer to NULL.
288    */
289 int
290 invoke_oom_method (LPDISPATCH pDisp, const char *name, VARIANT *rVariant);
291
292 /* Invoke a method of an outlook object.
293    returns true on success false otherwise.
294
295    rVariant should either point to a propery initialized
296    variant (initinalized wiht VariantInit) to hold
297    the return value or a pointer to NULL.
298
299    parms can optionally be used to provide a DISPPARAMS structure
300    with parameters for the function.
301    */
302 int
303 invoke_oom_method_with_parms (LPDISPATCH pDisp, const char *name,
304                               VARIANT *rVariant, DISPPARAMS *params);
305
306 /* Try to obtain the mapisession through the Application.
307   returns NULL on error.*/
308 LPMAPISESSION
309 get_oom_mapi_session (void);
310
311 /* Ensure a category of the name name exists in
312   the session for the Mail mail.
313
314   Creates the category with the specified color if required.
315
316   returns 0 on success. */
317 void
318 ensure_category_exists (LPDISPATCH mail, const char *category, int color);
319
320 /* Add a category to a mail if it is not already added. */
321 int
322 add_category (LPDISPATCH mail, const char *category);
323
324 /* Remove a category from a mail if it was added. */
325 int
326 remove_category (LPDISPATCH mail, const char *category);
327
328 /* Get a unique identifier for a mail object. The
329    uuid is a custom property. If create is set
330    a new uuid will be added if none exists and the
331    value of that uuid returned.
332
333    The optinal uuid value can be set to be used
334    as uuid instead of a generated one.
335
336    Return value has to be freed by the caller.
337    */
338 char *
339 get_unique_id (LPDISPATCH mail, int create, const char* uuid);
340
341
342 /* Uses the Application->ActiveWindow to determine the hwnd
343    through FindWindow and the caption. Does not use IOleWindow
344    because that was unreliable somhow. */
345 HWND get_active_hwnd (void);
346
347 /* Create a new mailitem and return it */
348 LPDISPATCH create_mail (void);
349
350 LPDISPATCH get_account_for_mail (const char *mbox);
351
352 /* Print all active addins to log */
353 void log_addins (void);
354
355 /* Sender fallbacks. All return either null or a malloced address. */
356 char *get_sender_CurrentUser (LPDISPATCH mailitem);
357 char *get_sender_Sender (LPDISPATCH mailitem);
358 char *get_sender_SenderEMailAddress (LPDISPATCH mailitem);
359
360 /* Get the body of the active inline response */
361 char *get_inline_body (void);
362
363 /* Get the major version of the exchange server of the account for the
364    mail address "mbox". Returns -1 if no version could be detected
365    or exchange is not used.*/
366 int get_ex_major_version_for_addr (const char *mbox);
367
368 /* Get the language code used for Outlooks UI */
369 int get_ol_ui_language (void);
370
371 char *get_sender_SendUsingAccount (LPDISPATCH mailitem, bool *r_is_GSuite);
372 #endif /*OOMHELP_H*/