Cache recipients trough oom and add fallbacks
[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 "myexchext.h"
28
29 #define MSOCONTROLBUTTON    1
30 #define MSOCONTROLEDIT      2
31 #define MSOCONTROLDROPDOWN  3
32 #define MSOCONTROLCOMBOBOX  4
33 #define MSOCONTROLPOPUP    10
34
35 enum 
36   {
37     msoButtonAutomatic = 0,
38     msoButtonIcon = 1,
39     msoButtonCaption = 2,
40     msoButtonIconAndCaption = 3,
41     msoButtonIconAndWrapCaption = 7,
42     msoButtonIconAndCaptionBelow = 11,
43     msoButtonWrapCaption = 14,
44     msoButtonIconAndWrapCaptionBelow = 15 
45   };
46
47 enum
48   {
49     msoButtonDown = -1,
50     msoButtonUp = 0,
51     msoButtonMixed = 2
52   };
53
54
55 DEFINE_GUID(GUID_NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
56
57 DEFINE_GUID(IID_IConnectionPoint, 
58             0xb196b286, 0xbab4, 0x101a,
59             0xb6, 0x9c, 0x00, 0xaa, 0x00, 0x34, 0x1d, 0x07);
60 DEFINE_GUID(IID_IConnectionPointContainer, 
61             0xb196b284, 0xbab4, 0x101a,
62             0xb6, 0x9c, 0x00, 0xaa, 0x00, 0x34, 0x1d, 0x07);
63 DEFINE_GUID(IID_IPictureDisp,
64             0x7bf80981, 0xbf32, 0x101a,
65             0x8b, 0xbb, 0x00, 0xaa, 0x00, 0x30, 0x0c, 0xab);
66 DEFINE_GUID(IID_ApplicationEvents, 0x0006304E, 0x0000, 0x0000,
67             0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
68 DEFINE_GUID(IID_ExplorerEvents, 0x0006300F, 0x0000, 0x0000,
69             0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
70 DEFINE_GUID(IID_ExplorersEvents, 0x00063078, 0x0000, 0x0000,
71             0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
72 DEFINE_GUID(IID_MailItemEvents, 0x0006302B, 0x0000, 0x0000,
73             0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
74 DEFINE_GUID(IID_MailItem, 0x00063034, 0x0000, 0x0000,
75             0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
76 DEFINE_GUID(IID_IMAPISecureMessage, 0x253cc320, 0xeab6, 0x11d0,
77             0x82, 0x22, 0, 0x60, 0x97, 0x93, 0x87, 0xea);
78
79 DEFINE_OLEGUID(IID_IUnknown,                  0x00000000, 0, 0);
80 DEFINE_OLEGUID(IID_IDispatch,                 0x00020400, 0, 0);
81 DEFINE_OLEGUID(IID_IOleWindow,                0x00000114, 0, 0);
82
83 #ifndef PR_SMTP_ADDRESS_DASL
84 #define PR_SMTP_ADDRESS_DASL \
85   "http://schemas.microsoft.com/mapi/proptag/0x39FE001E"
86 #endif
87
88 #ifndef PR_EMS_AB_PROXY_ADDRESSES_DASL
89 #define PR_EMS_AB_PROXY_ADDRESSES_DASL \
90   "http://schemas.microsoft.com/mapi/proptag/0x800F101E"
91 #endif
92
93 #ifndef PR_ATTACHMENT_HIDDEN_DASL
94 #define PR_ATTACHMENT_HIDDEN_DASL \
95   "http://schemas.microsoft.com/mapi/proptag/0x7FFE000B"
96 #endif
97
98 #define PR_MESSAGE_CLASS_W_DASL \
99   "http://schemas.microsoft.com/mapi/proptag/0x001A001F"
100 #define GPGOL_ATTACHTYPE_DASL \
101   "http://schemas.microsoft.com/mapi/string/" \
102   "{31805AB8-3E92-11DC-879C-00061B031004}/GpgOL Attach Type/0x00000003"
103 #define GPGOL_UID_DASL \
104   "http://schemas.microsoft.com/mapi/string/" \
105   "{31805AB8-3E92-11DC-879C-00061B031004}/GpgOL UID/0x0000001F"
106 #define PR_ATTACH_DATA_BIN_DASL \
107   "http://schemas.microsoft.com/mapi/proptag/0x37010102"
108 #define PR_BODY_W_DASL \
109   "http://schemas.microsoft.com/mapi/proptag/0x1000001F"
110 #define PR_ATTACHMENT_HIDDEN_DASL \
111   "http://schemas.microsoft.com/mapi/proptag/0x7FFE000B"
112 #define PR_ATTACH_MIME_TAG_DASL \
113   "http://schemas.microsoft.com/mapi/proptag/0x370E001F"
114 #define PR_ATTACH_CONTENT_ID_DASL \
115   "http://schemas.microsoft.com/mapi/proptag/0x3712001F"
116 #ifdef __cplusplus
117 extern "C" {
118 #if 0
119 }
120 #endif
121 #endif
122
123 /* Return the malloced name of an COM+ object.  */
124 char *get_object_name (LPUNKNOWN obj);
125
126 /* Helper to lookup a dispid.  */
127 DISPID lookup_oom_dispid (LPDISPATCH pDisp, const char *name);
128
129 /* Return the OOM object's IDispatch interface described by FULLNAME.  */
130 LPDISPATCH get_oom_object (LPDISPATCH pStart, const char *fullname);
131
132 /* Set the Icon of a CommandBarControl.  */
133 int put_oom_icon (LPDISPATCH pDisp, int rsource_id, int size);
134
135 /* Set the boolean property NAME to VALUE.  */
136 int put_oom_bool (LPDISPATCH pDisp, const char *name, int value);
137
138 /* Set the property NAME to VALUE.  */
139 int put_oom_int (LPDISPATCH pDisp, const char *name, int value);
140
141 /* Set the property NAME to STRING.  */
142 int put_oom_string (LPDISPATCH pDisp, const char *name, const char *string);
143
144 /* Get the boolean property NAME of the object PDISP.  */
145 int get_oom_bool (LPDISPATCH pDisp, const char *name);
146
147 /* Get the integer property NAME of the object PDISP.  */
148 int get_oom_int (LPDISPATCH pDisp, const char *name);
149
150 /* Get the string property NAME of the object PDISP.  */
151 char *get_oom_string (LPDISPATCH pDisp, const char *name);
152
153 /* Get an IUnknown object from property NAME of PDISP.  */
154 LPUNKNOWN get_oom_iunknown (LPDISPATCH pDisp, const char *name);
155
156 /* Return the control object with tag property value TAG.  */
157 LPDISPATCH get_oom_control_bytag (LPDISPATCH pObj, const char *tag);
158
159 /* Add a new button to an object which supports the add method.
160    Returns the new object or NULL on error.  */
161 LPDISPATCH add_oom_button (LPDISPATCH pObj);
162
163 /* Delete a button.  */
164 void del_oom_button (LPDISPATCH button);
165
166 /* Get the HWND of the active window in the current context */
167 HWND get_oom_context_window (LPDISPATCH context);
168
169 /* Get the address of the recipients as string list */
170 char ** get_oom_recipients (LPDISPATCH recipients);
171
172 /* Add an attachment to a dispatcher */
173 int
174 add_oom_attachment (LPDISPATCH disp, const wchar_t* inFile,
175                     const wchar_t *displayName);
176
177 /* Look up a string with the propertyAccessor interface */
178 char *
179 get_pa_string (LPDISPATCH pDisp, const char *property);
180
181 /* Look up a long with the propertyAccessor interface.
182  returns -1 on error.*/
183 int
184 get_pa_int (LPDISPATCH pDisp, const char *property, int *rInt);
185
186 /* Set a variant with the propertyAccessor interface.
187
188    This is tested to work at least vor BSTR variants. Trying
189    to set PR_ATTACH_DATA_BIN_DASL with this failed with
190    hresults 0x80020005 type mismatch or 0x80020008 vad
191    variable type for:
192    VT_ARRAY | VT_UI1 | VT_BYREF
193    VT_SAFEARRAY | VT_UI1 | VT_BYREF
194    VT_BSTR | VT_BYREF
195    VT_BSTR
196    VT_ARRAY | VT_UI1
197    VT_SAFEARRAY | VT_UI1
198
199    No idea whats wrong there. Needs more experiments. The
200    Type is only documented as "Binary". Outlookspy also
201    fails with the same error when trying to modify the
202    property.
203 */
204 int
205 put_pa_string (LPDISPATCH pDisp, const char *dasl_id, const char *value);
206
207 int
208 put_pa_variant (LPDISPATCH pDisp, const char *dasl_id, VARIANT *value);
209
210 int
211 put_pa_int (LPDISPATCH pDisp, const char *dasl_id, int value);
212
213 /* Look up a variant with the propertyAccessor interface */
214 int
215 get_pa_variant (LPDISPATCH pDisp, const char *dasl_id, VARIANT *rVariant);
216
217 /* Look up a LONG with the propertyAccessor interface */
218 LONG
219 get_pa_long (LPDISPATCH pDisp, const char *dasl_id);
220
221 /* Queries the interface of the dispatcher for the id
222    id. Returns NULL on error. The returned Object
223    must be released.
224    Mainly useful to check if an object is what
225    it appears to be. */
226 LPDISPATCH
227 get_object_by_id (LPDISPATCH pDisp, REFIID id);
228
229 /* Obtain the MAPI Message corresponding to the
230    Mailitem. Returns NULL on error.
231
232    The returned Message needs to be released by the
233    caller */
234 LPMESSAGE
235 get_oom_message (LPDISPATCH mailitem);
236
237 /* Obtain the Base MAPI Message of a MailItem.
238    The parameter should be a pointer to a MailItem.
239    returns NULL on error.
240
241    The returned Message needs to be released by the
242    caller.
243 */
244 LPMESSAGE
245 get_oom_base_message (LPDISPATCH mailitem);
246
247 /* Get a strong reference for a mail object by calling
248    Application.GetObjectReference with type strong. The
249    documentation is unclear what this acutally does.
250    This function is left over from experiments about
251    strong references. Maybe there is a use for them.
252    The reference we use in the Mail object is documented
253    as a Weak reference. But changing that does not appear
254    to make a difference.
255 */
256 LPDISPATCH
257 get_strong_reference (LPDISPATCH mail);
258
259 /* Invoke a method of an outlook object.
260    returns true on success false otherwise.
261
262    rVariant should either point to a propery initialized
263    variant (initinalized wiht VariantInit) to hold
264    the return value or a pointer to NULL.
265    */
266 int
267 invoke_oom_method (LPDISPATCH pDisp, const char *name, VARIANT *rVariant);
268
269 /* Invoke a method of an outlook object.
270    returns true on success false otherwise.
271
272    rVariant should either point to a propery initialized
273    variant (initinalized wiht VariantInit) to hold
274    the return value or a pointer to NULL.
275
276    parms can optionally be used to provide a DISPPARAMS structure
277    with parameters for the function.
278    */
279 int
280 invoke_oom_method_with_parms (LPDISPATCH pDisp, const char *name,
281                               VARIANT *rVariant, DISPPARAMS *params);
282
283 /* Try to obtain the mapisession through the Application.
284   returns NULL on error.*/
285 LPMAPISESSION
286 get_oom_mapi_session (void);
287
288 /* Ensure a category of the name name exists in
289   the session for the Mail mail.
290
291   Creates the category with the specified color if required.
292
293   returns 0 on success. */
294 void
295 ensure_category_exists (LPDISPATCH mail, const char *category, int color);
296
297 /* Add a category to a mail if it is not already added. */
298 int
299 add_category (LPDISPATCH mail, const char *category);
300
301 /* Remove a category from a mail if it was added. */
302 int
303 remove_category (LPDISPATCH mail, const char *category);
304
305 /* Get a unique identifier for a mail object. The
306    uuid is a custom property. If create is set
307    a new uuid will be added if none exists and the
308    value of that uuid returned.
309
310    The optinal uuid value can be set to be used
311    as uuid instead of a generated one.
312
313    Return value has to be freed by the caller.
314    */
315 char *
316 get_unique_id (LPDISPATCH mail, int create, const char* uuid);
317
318
319 /* Uses the Application->ActiveWindow to determine the hwnd
320    through FindWindow and the caption. Does not use IOleWindow
321    because that was unreliable somhow. */
322 HWND get_active_hwnd (void);
323 #ifdef __cplusplus
324 }
325 #endif
326 #endif /*OOMHELP_H*/