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