2fea2ce6f8db683eb9b4776604bf8f3d45df5233
[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 #define PR_MESSAGE_CLASS_W_DASL \
103   "http://schemas.microsoft.com/mapi/proptag/0x001A001F"
104 #define GPGOL_ATTACHTYPE_DASL \
105   "http://schemas.microsoft.com/mapi/string/" \
106   "{31805AB8-3E92-11DC-879C-00061B031004}/GpgOL Attach Type/0x00000003"
107 #define GPGOL_UID_DASL \
108   "http://schemas.microsoft.com/mapi/string/" \
109   "{31805AB8-3E92-11DC-879C-00061B031004}/GpgOL UID/0x0000001F"
110 #define PR_ATTACH_DATA_BIN_DASL \
111   "http://schemas.microsoft.com/mapi/proptag/0x37010102"
112 #define PR_BODY_W_DASL \
113   "http://schemas.microsoft.com/mapi/proptag/0x1000001F"
114 #define PR_ATTACHMENT_HIDDEN_DASL \
115   "http://schemas.microsoft.com/mapi/proptag/0x7FFE000B"
116 #define PR_ATTACH_MIME_TAG_DASL \
117   "http://schemas.microsoft.com/mapi/proptag/0x370E001F"
118 #define PR_ATTACH_CONTENT_ID_DASL \
119   "http://schemas.microsoft.com/mapi/proptag/0x3712001F"
120 #define PR_TAG_SENDER_SMTP_ADDRESS \
121   "http://schemas.microsoft.com/mapi/proptag/0x5D01001F"
122 #define PR_TAG_RECEIVED_REPRESENTING_SMTP_ADDRESS \
123   "http://schemas.microsoft.com/mapi/proptag/0x5D08001F"
124 #define PR_PIDNameContentType_DASL \
125   "http://schemas.microsoft.com/mapi/string/{00020386-0000-0000-C000-000000000046}/content-type/0x0000001F"
126 #define PR_BLOCK_STATUS_DASL \
127   "http://schemas.microsoft.com/mapi/proptag/0x10960003"
128
129 /* Return the malloced name of an COM+ object.  */
130 char *get_object_name (LPUNKNOWN obj);
131
132 /* Helper to lookup a dispid.  */
133 DISPID lookup_oom_dispid (LPDISPATCH pDisp, const char *name);
134
135 /* Return the OOM object's IDispatch interface described by FULLNAME.  */
136 LPDISPATCH get_oom_object (LPDISPATCH pStart, const char *fullname);
137
138 /* Set the Icon of a CommandBarControl.  */
139 int put_oom_icon (LPDISPATCH pDisp, int rsource_id, int size);
140
141 /* Set the boolean property NAME to VALUE.  */
142 int put_oom_bool (LPDISPATCH pDisp, const char *name, int value);
143
144 /* Set the property NAME to VALUE.  */
145 int put_oom_int (LPDISPATCH pDisp, const char *name, int value);
146
147 /* Set the property NAME to STRING.  */
148 int put_oom_string (LPDISPATCH pDisp, const char *name, const char *string);
149
150 /* Set the property NAME to DISP.  */
151 int put_oom_disp (LPDISPATCH pDisp, const char *name, LPDISPATCH value);
152
153 /* Get the boolean property NAME of the object PDISP.  */
154 int get_oom_bool (LPDISPATCH pDisp, const char *name);
155
156 /* Get the integer property NAME of the object PDISP.  */
157 int get_oom_int (LPDISPATCH pDisp, const char *name);
158
159 /* Get the string property NAME of the object PDISP.  */
160 char *get_oom_string (LPDISPATCH pDisp, const char *name);
161
162 /* Get an IUnknown object from property NAME of PDISP.  */
163 LPUNKNOWN get_oom_iunknown (LPDISPATCH pDisp, const char *name);
164
165 /* Return the control object with tag property value TAG.  */
166 LPDISPATCH get_oom_control_bytag (LPDISPATCH pObj, const char *tag);
167
168 /* Add a new button to an object which supports the add method.
169    Returns the new object or NULL on error.  */
170 LPDISPATCH add_oom_button (LPDISPATCH pObj);
171
172 /* Delete a button.  */
173 void del_oom_button (LPDISPATCH button);
174
175 /* Get the HWND of the active window in the current context */
176 HWND get_oom_context_window (LPDISPATCH context);
177
178 /* Get the address of the recipients as string list.
179    If r_err is not null it is set to true in case of an error. */
180 std::vector<std::string> get_oom_recipients (LPDISPATCH recipients,
181                                              bool *r_err = nullptr);
182
183 /* Add an attachment to a dispatcher */
184 int
185 add_oom_attachment (LPDISPATCH disp, const wchar_t* inFile,
186                     const wchar_t *displayName);
187
188 /* Look up a string with the propertyAccessor interface */
189 char *
190 get_pa_string (LPDISPATCH pDisp, const char *property);
191
192 /* Look up a long with the propertyAccessor interface.
193  returns -1 on error.*/
194 int
195 get_pa_int (LPDISPATCH pDisp, const char *property, int *rInt);
196
197 /* Set a variant with the propertyAccessor interface.
198
199    This is tested to work at least vor BSTR variants. Trying
200    to set PR_ATTACH_DATA_BIN_DASL with this failed with
201    hresults 0x80020005 type mismatch or 0x80020008 vad
202    variable type for:
203    VT_ARRAY | VT_UI1 | VT_BYREF
204    VT_SAFEARRAY | VT_UI1 | VT_BYREF
205    VT_BSTR | VT_BYREF
206    VT_BSTR
207    VT_ARRAY | VT_UI1
208    VT_SAFEARRAY | VT_UI1
209
210    No idea whats wrong there. Needs more experiments. The
211    Type is only documented as "Binary". Outlookspy also
212    fails with the same error when trying to modify the
213    property.
214 */
215 int
216 put_pa_string (LPDISPATCH pDisp, const char *dasl_id, const char *value);
217
218 int
219 put_pa_variant (LPDISPATCH pDisp, const char *dasl_id, VARIANT *value);
220
221 int
222 put_pa_int (LPDISPATCH pDisp, const char *dasl_id, int value);
223
224 /* Look up a variant with the propertyAccessor interface */
225 int
226 get_pa_variant (LPDISPATCH pDisp, const char *dasl_id, VARIANT *rVariant);
227
228 /* Look up a LONG with the propertyAccessor interface */
229 LONG
230 get_pa_long (LPDISPATCH pDisp, const char *dasl_id);
231
232 /* Queries the interface of the dispatcher for the id
233    id. Returns NULL on error. The returned Object
234    must be released.
235    Mainly useful to check if an object is what
236    it appears to be. */
237 LPDISPATCH
238 get_object_by_id (LPDISPATCH pDisp, REFIID id);
239
240 /* Obtain the MAPI Message corresponding to the
241    Mailitem. Returns NULL on error.
242
243    The returned Message needs to be released by the
244    caller */
245 LPMESSAGE
246 get_oom_message (LPDISPATCH mailitem);
247
248 /* Obtain the Base MAPI Message of a MailItem.
249    The parameter should be a pointer to a MailItem.
250    returns NULL on error.
251
252    The returned Message needs to be released by the
253    caller.
254 */
255 LPMESSAGE
256 get_oom_base_message (LPDISPATCH mailitem);
257
258 /* Get a strong reference for a mail object by calling
259    Application.GetObjectReference with type strong. The
260    documentation is unclear what this acutally does.
261    This function is left over from experiments about
262    strong references. Maybe there is a use for them.
263    The reference we use in the Mail object is documented
264    as a Weak reference. But changing that does not appear
265    to make a difference.
266 */
267 LPDISPATCH
268 get_strong_reference (LPDISPATCH mail);
269
270 /* Invoke a method of an outlook object.
271    returns true on success false otherwise.
272
273    rVariant should either point to a propery initialized
274    variant (initinalized wiht VariantInit) to hold
275    the return value or a pointer to NULL.
276    */
277 int
278 invoke_oom_method (LPDISPATCH pDisp, const char *name, VARIANT *rVariant);
279
280 /* Invoke a method of an outlook object.
281    returns true on success false otherwise.
282
283    rVariant should either point to a propery initialized
284    variant (initinalized wiht VariantInit) to hold
285    the return value or a pointer to NULL.
286
287    parms can optionally be used to provide a DISPPARAMS structure
288    with parameters for the function.
289    */
290 int
291 invoke_oom_method_with_parms (LPDISPATCH pDisp, const char *name,
292                               VARIANT *rVariant, DISPPARAMS *params);
293
294 /* Try to obtain the mapisession through the Application.
295   returns NULL on error.*/
296 LPMAPISESSION
297 get_oom_mapi_session (void);
298
299 /* Ensure a category of the name name exists in
300   the session for the Mail mail.
301
302   Creates the category with the specified color if required.
303
304   returns 0 on success. */
305 void
306 ensure_category_exists (LPDISPATCH mail, const char *category, int color);
307
308 /* Add a category to a mail if it is not already added. */
309 int
310 add_category (LPDISPATCH mail, const char *category);
311
312 /* Remove a category from a mail if it was added. */
313 int
314 remove_category (LPDISPATCH mail, const char *category);
315
316 /* Get a unique identifier for a mail object. The
317    uuid is a custom property. If create is set
318    a new uuid will be added if none exists and the
319    value of that uuid returned.
320
321    The optinal uuid value can be set to be used
322    as uuid instead of a generated one.
323
324    Return value has to be freed by the caller.
325    */
326 char *
327 get_unique_id (LPDISPATCH mail, int create, const char* uuid);
328
329
330 /* Uses the Application->ActiveWindow to determine the hwnd
331    through FindWindow and the caption. Does not use IOleWindow
332    because that was unreliable somhow. */
333 HWND get_active_hwnd (void);
334
335 /* Create a new mailitem and return it */
336 LPDISPATCH create_mail (void);
337
338 LPDISPATCH get_account_for_mail (const char *mbox);
339
340 /* Print all active addins to log */
341 void log_addins (void);
342
343 /* Sender fallbacks. All return either null or a malloced address. */
344 char *get_sender_CurrentUser (LPDISPATCH mailitem);
345 char *get_sender_Sender (LPDISPATCH mailitem);
346 char *get_sender_SenderEMailAddress (LPDISPATCH mailitem);
347
348 /* Get the body of the active inline response */
349 char *get_inline_body (void);
350
351 /* Get the major version of the exchange server of the account for the
352    mail address "mbox". Returns -1 if no version could be detected
353    or exchange is not used.*/
354 int get_ex_major_version_for_addr (const char *mbox);
355
356 /* Get the language code used for Outlooks UI */
357 int get_ol_ui_language (void);
358
359 char *get_sender_SendUsingAccount (LPDISPATCH mailitem, bool *r_is_GSuite);
360 #endif /*OOMHELP_H*/