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