Post release version bump
[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 #include "common.h"
28
29 #include <vector>
30 #include <string>
31 #include <memory>
32
33 #define MSOCONTROLBUTTON    1
34 #define MSOCONTROLEDIT      2
35 #define MSOCONTROLDROPDOWN  3
36 #define MSOCONTROLCOMBOBOX  4
37 #define MSOCONTROLPOPUP    10
38
39 enum 
40   {
41     msoButtonAutomatic = 0,
42     msoButtonIcon = 1,
43     msoButtonCaption = 2,
44     msoButtonIconAndCaption = 3,
45     msoButtonIconAndWrapCaption = 7,
46     msoButtonIconAndCaptionBelow = 11,
47     msoButtonWrapCaption = 14,
48     msoButtonIconAndWrapCaptionBelow = 15 
49   };
50
51 enum
52   {
53     msoButtonDown = -1,
54     msoButtonUp = 0,
55     msoButtonMixed = 2
56   };
57
58
59 DEFINE_GUID(GUID_NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
60
61 DEFINE_GUID(IID_IConnectionPoint, 
62             0xb196b286, 0xbab4, 0x101a,
63             0xb6, 0x9c, 0x00, 0xaa, 0x00, 0x34, 0x1d, 0x07);
64 DEFINE_GUID(IID_IConnectionPointContainer, 
65             0xb196b284, 0xbab4, 0x101a,
66             0xb6, 0x9c, 0x00, 0xaa, 0x00, 0x34, 0x1d, 0x07);
67 DEFINE_GUID(IID_IPictureDisp,
68             0x7bf80981, 0xbf32, 0x101a,
69             0x8b, 0xbb, 0x00, 0xaa, 0x00, 0x30, 0x0c, 0xab);
70 DEFINE_GUID(IID_FolderEvents, 0x000630F7, 0x0000, 0x0000,
71             0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
72 DEFINE_GUID(IID_ApplicationEvents, 0x0006304E, 0x0000, 0x0000,
73             0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
74 DEFINE_GUID(IID_ApplicationEvents_11, 0x0006302C, 0x0000, 0x0000,
75             0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
76 DEFINE_GUID(IID_ExplorerEvents, 0x0006300F, 0x0000, 0x0000,
77             0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
78 DEFINE_GUID(IID_ExplorersEvents, 0x00063078, 0x0000, 0x0000,
79             0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
80 DEFINE_GUID(IID_MailItemEvents, 0x0006302B, 0x0000, 0x0000,
81             0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
82 DEFINE_GUID(IID_MailItem, 0x00063034, 0x0000, 0x0000,
83             0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
84 DEFINE_GUID(IID_IMAPISecureMessage, 0x253cc320, 0xeab6, 0x11d0,
85             0x82, 0x22, 0, 0x60, 0x97, 0x93, 0x87, 0xea);
86
87 DEFINE_OLEGUID(IID_IUnknown,                  0x00000000, 0, 0);
88 DEFINE_OLEGUID(IID_IDispatch,                 0x00020400, 0, 0);
89 DEFINE_OLEGUID(IID_IOleWindow,                0x00000114, 0, 0);
90
91 #ifndef PR_SMTP_ADDRESS_DASL
92 #define PR_SMTP_ADDRESS_DASL \
93   "http://schemas.microsoft.com/mapi/proptag/0x39FE001E"
94 #endif
95
96 #ifndef PR_EMS_AB_PROXY_ADDRESSES_DASL
97 #define PR_EMS_AB_PROXY_ADDRESSES_DASL \
98   "http://schemas.microsoft.com/mapi/proptag/0x800F101E"
99 #endif
100
101 #ifndef PR_ATTACHMENT_HIDDEN_DASL
102 #define PR_ATTACHMENT_HIDDEN_DASL \
103   "http://schemas.microsoft.com/mapi/proptag/0x7FFE000B"
104 #endif
105
106 #ifndef PR_ADDRTYPE_DASL
107 #define PR_ADDRTYPE_DASL \
108   "http://schemas.microsoft.com/mapi/proptag/0x3002001E"
109 #endif
110
111 #ifndef PR_EMAIL_ADDRESS_DASL
112 #define PR_EMAIL_ADDRESS_DASL \
113   "http://schemas.microsoft.com/mapi/proptag/0x3003001E"
114 #endif
115
116 #define PR_MESSAGE_CLASS_W_DASL \
117   "http://schemas.microsoft.com/mapi/proptag/0x001A001F"
118 #define GPGOL_ATTACHTYPE_DASL \
119   "http://schemas.microsoft.com/mapi/string/" \
120   "{31805AB8-3E92-11DC-879C-00061B031004}/GpgOL Attach Type/0x00000003"
121 #define GPGOL_UID_DASL \
122   "http://schemas.microsoft.com/mapi/string/" \
123   "{31805AB8-3E92-11DC-879C-00061B031004}/GpgOL UID/0x0000001F"
124 #define PR_ATTACH_DATA_BIN_DASL \
125   "http://schemas.microsoft.com/mapi/proptag/0x37010102"
126 #define PR_BODY_W_DASL \
127   "http://schemas.microsoft.com/mapi/proptag/0x1000001F"
128 #define PR_ATTACHMENT_HIDDEN_DASL \
129   "http://schemas.microsoft.com/mapi/proptag/0x7FFE000B"
130 #define PR_ATTACH_MIME_TAG_DASL \
131   "http://schemas.microsoft.com/mapi/proptag/0x370E001F"
132 #define PR_ATTACH_CONTENT_ID_DASL \
133   "http://schemas.microsoft.com/mapi/proptag/0x3712001F"
134 #define PR_ATTACH_FLAGS_DASL \
135   "http://schemas.microsoft.com/mapi/proptag/0x37140003"
136
137 #define PR_TAG_SENDER_SMTP_ADDRESS \
138   "http://schemas.microsoft.com/mapi/proptag/0x5D01001F"
139 #define PR_TAG_RECEIVED_REPRESENTING_SMTP_ADDRESS \
140   "http://schemas.microsoft.com/mapi/proptag/0x5D08001F"
141 #define PR_PIDNameContentType_DASL \
142   "http://schemas.microsoft.com/mapi/string/{00020386-0000-0000-C000-000000000046}/content-type/0x0000001F"
143 #define PR_BLOCK_STATUS_DASL \
144   "http://schemas.microsoft.com/mapi/proptag/0x10960003"
145 #define PR_SENT_REPRESENTING_EMAIL_ADDRESS_W_DASL \
146   "http://schemas.microsoft.com/mapi/proptag/0x0065001F"
147
148 #define PR_SENDER_NAME_W_DASL \
149   "http://schemas.microsoft.com/mapi/proptag/0x0C1A001F"
150 #define PR_SENT_REPRESENTING_NAME_W_DASL \
151   "http://schemas.microsoft.com/mapi/proptag/0x0042001F"
152
153 #define DISTRIBUTION_LIST_ADDRESS_ENTRY_TYPE 11
154
155 typedef std::shared_ptr<IDispatch> shared_disp_t;
156
157 /* Function to contain the gpgol_release macro */
158 void release_disp (LPDISPATCH obj);
159
160 #define MAKE_SHARED(X) shared_disp_t ((LPDISPATCH)X, &release_disp)
161
162 /* Return the malloced name of an COM+ object.  */
163 char *get_object_name (LPUNKNOWN obj);
164
165 /* Helper to lookup a dispid.  */
166 DISPID lookup_oom_dispid (LPDISPATCH pDisp, const char *name);
167
168 /* Return the OOM object's IDispatch interface described by FULLNAME.  */
169 LPDISPATCH get_oom_object (LPDISPATCH pStart, const char *fullname);
170
171 /* Set the Icon of a CommandBarControl.  */
172 int put_oom_icon (LPDISPATCH pDisp, int rsource_id, int size);
173
174 /* Set the boolean property NAME to VALUE.  */
175 int put_oom_bool (LPDISPATCH pDisp, const char *name, int value);
176
177 /* Set the property NAME to VALUE.  */
178 int put_oom_int (LPDISPATCH pDisp, const char *name, int value);
179
180 /* Set the property NAME to STRING.  */
181 int put_oom_string (LPDISPATCH pDisp, const char *name, const char *string);
182
183 /* Set the property NAME to DISP.  */
184 int put_oom_disp (LPDISPATCH pDisp, const char *name, LPDISPATCH value);
185
186 /* Get the boolean property NAME of the object PDISP.  */
187 int get_oom_bool (LPDISPATCH pDisp, const char *name);
188
189 /* Get the integer property NAME of the object PDISP.  */
190 int get_oom_int (LPDISPATCH pDisp, const char *name);
191
192 /* Get the string property NAME of the object PDISP.  */
193 char *get_oom_string (LPDISPATCH pDisp, const char *name);
194
195 /* Get an IUnknown object from property NAME of PDISP.  */
196 LPUNKNOWN get_oom_iunknown (LPDISPATCH pDisp, const char *name);
197
198 /* Return the control object with tag property value TAG.  */
199 LPDISPATCH get_oom_control_bytag (LPDISPATCH pObj, const char *tag);
200
201 /* Add a new button to an object which supports the add method.
202    Returns the new object or NULL on error.  */
203 LPDISPATCH add_oom_button (LPDISPATCH pObj);
204
205 /* Delete a button.  */
206 void del_oom_button (LPDISPATCH button);
207
208 /* Get the HWND of the active window in the current context */
209 HWND get_oom_context_window (LPDISPATCH context);
210
211 /* Get the address of the recipients as string list.
212    If r_err is not null it is set to true in case of an error. */
213 std::vector<std::string> get_oom_recipients (LPDISPATCH recipients,
214                                              bool *r_err = nullptr);
215
216 /* Same as above but include the AddrEntry object in the result.
217    Caller needs to release the AddrEntry. */
218 std::vector<std::pair<std::string, shared_disp_t> >
219 get_oom_recipients_with_addrEntry (LPDISPATCH recipients,
220                                    bool *r_err = nullptr);
221
222 /* Add an attachment to a dispatcher */
223 int
224 add_oom_attachment (LPDISPATCH disp, const wchar_t* inFile,
225                     const wchar_t *displayName);
226
227 /* Look up a string with the propertyAccessor interface */
228 char *
229 get_pa_string (LPDISPATCH pDisp, const char *property);
230
231 /* Look up a long with the propertyAccessor interface.
232  returns -1 on error.*/
233 int
234 get_pa_int (LPDISPATCH pDisp, const char *property, int *rInt);
235
236 /* Set a variant with the propertyAccessor interface.
237
238    This is tested to work at least vor BSTR variants. Trying
239    to set PR_ATTACH_DATA_BIN_DASL with this failed with
240    hresults 0x80020005 type mismatch or 0x80020008 vad
241    variable type for:
242    VT_ARRAY | VT_UI1 | VT_BYREF
243    VT_SAFEARRAY | VT_UI1 | VT_BYREF
244    VT_BSTR | VT_BYREF
245    VT_BSTR
246    VT_ARRAY | VT_UI1
247    VT_SAFEARRAY | VT_UI1
248
249    No idea whats wrong there. Needs more experiments. The
250    Type is only documented as "Binary". Outlookspy also
251    fails with the same error when trying to modify the
252    property.
253 */
254 int
255 put_pa_string (LPDISPATCH pDisp, const char *dasl_id, const char *value);
256
257 int
258 put_pa_variant (LPDISPATCH pDisp, const char *dasl_id, VARIANT *value);
259
260 int
261 put_pa_int (LPDISPATCH pDisp, const char *dasl_id, int value);
262
263 /* Look up a variant with the propertyAccessor interface */
264 int
265 get_pa_variant (LPDISPATCH pDisp, const char *dasl_id, VARIANT *rVariant);
266
267 /* Look up a LONG with the propertyAccessor interface */
268 LONG
269 get_pa_long (LPDISPATCH pDisp, const char *dasl_id);
270
271 /* Queries the interface of the dispatcher for the id
272    id. Returns NULL on error. The returned Object
273    must be released.
274    Mainly useful to check if an object is what
275    it appears to be. */
276 LPDISPATCH
277 get_object_by_id (LPDISPATCH pDisp, REFIID id);
278
279 /* Obtain the MAPI Message corresponding to the
280    Mailitem. Returns NULL on error.
281
282    The returned Message needs to be released by the
283    caller */
284 LPMESSAGE
285 get_oom_message (LPDISPATCH mailitem);
286
287 /* Obtain the Base MAPI Message of a MailItem.
288    The parameter should be a pointer to a MailItem.
289    returns NULL on error.
290
291    The returned Message needs to be released by the
292    caller.
293 */
294 LPMESSAGE
295 get_oom_base_message (LPDISPATCH mailitem);
296
297 /* Get a strong reference for a mail object by calling
298    Application.GetObjectReference with type strong. The
299    documentation is unclear what this acutally does.
300    This function is left over from experiments about
301    strong references. Maybe there is a use for them.
302    The reference we use in the Mail object is documented
303    as a Weak reference. But changing that does not appear
304    to make a difference.
305 */
306 LPDISPATCH
307 get_strong_reference (LPDISPATCH mail);
308
309 /* Invoke a method of an outlook object.
310    returns true on success false otherwise.
311
312    rVariant should either point to a propery initialized
313    variant (initinalized wiht VariantInit) to hold
314    the return value or a pointer to NULL.
315    */
316 int
317 invoke_oom_method (LPDISPATCH pDisp, const char *name, VARIANT *rVariant);
318
319 /* Invoke a method of an outlook object.
320    returns true on success false otherwise.
321
322    rVariant should either point to a propery initialized
323    variant (initinalized wiht VariantInit) to hold
324    the return value or a pointer to NULL.
325
326    parms can optionally be used to provide a DISPPARAMS structure
327    with parameters for the function.
328    */
329 int
330 invoke_oom_method_with_parms (LPDISPATCH pDisp, const char *name,
331                               VARIANT *rVariant, DISPPARAMS *params);
332
333 /* Try to obtain the mapisession through the Application.
334   returns NULL on error.*/
335 LPMAPISESSION
336 get_oom_mapi_session (void);
337
338 /* Ensure a category of the name name exists.
339
340   Creates the category with the specified color if required.
341
342   returns 0 on success. */
343 void
344 ensure_category_exists (const char *category, int color);
345
346 /* Add a category to a mail if it is not already added. */
347 int
348 add_category (LPDISPATCH mail, const char *category);
349
350 /* Remove a category from a mail if it was added. */
351 int
352 remove_category (LPDISPATCH mail, const char *category, bool exactMatch);
353
354 /* Create the category */
355 int
356 create_category (LPDISPATCH categories, const char *category, int color);
357
358 /* Delete a category from the store. */
359 int delete_category (LPDISPATCH store, const char *category);
360
361 /* Delete categories starting with "string" from all stores. */
362 void delete_all_categories_starting_with (const char *string);
363
364 /* Iterate over application stores and return the one with the ID
365    @storeID */
366 LPDISPATCH get_store_for_id (const char *storeID);
367
368 /* Get a unique identifier for a mail object. The
369    uuid is a custom property. If create is set
370    a new uuid will be added if none exists and the
371    value of that uuid returned.
372
373    The optinal uuid value can be set to be used
374    as uuid instead of a generated one.
375
376    Return value has to be freed by the caller.
377    */
378 char *
379 get_unique_id (LPDISPATCH mail, int create, const char* uuid);
380
381
382 /* Uses the Application->ActiveWindow to determine the hwnd
383    through FindWindow and the caption. Does not use IOleWindow
384    because that was unreliable somhow. */
385 HWND get_active_hwnd (void);
386
387 /* Create a new mailitem and return it */
388 LPDISPATCH create_mail (void);
389
390 LPDISPATCH get_account_for_mail (const char *mbox);
391
392 /* Print all active addins to log */
393 void log_addins (void);
394
395 /* Sender fallbacks. All return either null or a malloced address. */
396 char *get_sender_CurrentUser (LPDISPATCH mailitem);
397 char *get_sender_Sender (LPDISPATCH mailitem);
398 char *get_sender_SenderEMailAddress (LPDISPATCH mailitem);
399
400
401 /* Get the body of the active inline response */
402 char *get_inline_body (void);
403
404 /* Get the major version of the exchange server of the account for the
405    mail address "mbox". Returns -1 if no version could be detected
406    or exchange is not used.*/
407 int get_ex_major_version_for_addr (const char *mbox);
408
409 /* Get the language code used for Outlooks UI */
410 int get_ol_ui_language (void);
411
412 char *get_sender_SendUsingAccount (LPDISPATCH mailitem, bool *r_is_GSuite);
413
414 /* Get the SentRepresentingAddress */
415 char *get_sender_SentRepresentingAddress (LPDISPATCH mailitem);
416
417 /* memtracing query interface */
418 HRESULT gpgol_queryInterface (LPUNKNOWN pObj, REFIID riid, LPVOID FAR *ppvObj);
419
420 HRESULT gpgol_openProperty (LPMAPIPROP obj, ULONG ulPropTag, LPCIID lpiid,
421                             ULONG ulInterfaceOptions, ULONG ulFlags,
422                             LPUNKNOWN FAR * lppUnk);
423
424 /* Check if the preview pane in the explorer is visible */
425 bool is_preview_pane_visible (LPDISPATCH explorer);
426
427 /* Find or add a text user property with that name. */
428 LPDISPATCH find_or_add_text_prop (LPDISPATCH props, const char *name);
429
430 /* Find a user property and return it if found. */
431 LPDISPATCH find_user_prop (LPDISPATCH props, const char *name);
432
433 /* Return true if this message is in the junk folder for this account */
434 bool is_junk_mail (LPDISPATCH mailitem);
435
436 /* Return true if this message is in the draft folder for this account */
437 bool is_draft_mail (LPDISPATCH mailitem);
438
439 /* Returns info about a dispparms variable for debugging. */
440 void format_variant (std::istringstream &stream, VARIANT *var);
441 std::string format_dispparams (DISPPARAMS *p);
442 #endif /*OOMHELP_H*/