Add support for distribution lists (groups)
[gpgol.git] / src / oomhelp.h
index 0859d17..4430b0c 100644 (file)
@@ -1,6 +1,7 @@
 /* oomhelp.h - Defs for helper functions for the Outlook Object Model
- *     Copyright (C) 2009 g10 Code GmbH
- *     Copyright (C) 2015 Intevation GmbH
+ * Copyright (C) 2009 g10 Code GmbH
+ * Copyright (C) 2015 by Bundesamt für Sicherheit in der Informationstechnik
+ * Software engineering by Intevation GmbH
  *
  * This file is part of GpgOL.
  * 
@@ -23,7 +24,9 @@
 
 #include <unknwn.h>
 #include "mymapi.h"
-#include "myexchext.h"
+
+#include <vector>
+#include <string>
 
 #define MSOCONTROLBUTTON    1
 #define MSOCONTROLEDIT      2
@@ -62,8 +65,14 @@ DEFINE_GUID(IID_IConnectionPointContainer,
 DEFINE_GUID(IID_IPictureDisp,
             0x7bf80981, 0xbf32, 0x101a,
             0x8b, 0xbb, 0x00, 0xaa, 0x00, 0x30, 0x0c, 0xab);
+DEFINE_GUID(IID_FolderEvents, 0x000630F7, 0x0000, 0x0000,
+            0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
 DEFINE_GUID(IID_ApplicationEvents, 0x0006304E, 0x0000, 0x0000,
             0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
+DEFINE_GUID(IID_ExplorerEvents, 0x0006300F, 0x0000, 0x0000,
+            0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
+DEFINE_GUID(IID_ExplorersEvents, 0x00063078, 0x0000, 0x0000,
+            0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
 DEFINE_GUID(IID_MailItemEvents, 0x0006302B, 0x0000, 0x0000,
             0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
 DEFINE_GUID(IID_MailItem, 0x00063034, 0x0000, 0x0000,
@@ -80,11 +89,34 @@ DEFINE_OLEGUID(IID_IOleWindow,                0x00000114, 0, 0);
   "http://schemas.microsoft.com/mapi/proptag/0x39FE001E"
 #endif
 
+#ifndef PR_EMS_AB_PROXY_ADDRESSES_DASL
+#define PR_EMS_AB_PROXY_ADDRESSES_DASL \
+  "http://schemas.microsoft.com/mapi/proptag/0x800F101E"
+#endif
+
+#ifndef PR_ATTACHMENT_HIDDEN_DASL
+#define PR_ATTACHMENT_HIDDEN_DASL \
+  "http://schemas.microsoft.com/mapi/proptag/0x7FFE000B"
+#endif
+
+#ifndef PR_ADDRTYPE_DASL
+#define PR_ADDRTYPE_DASL \
+  "http://schemas.microsoft.com/mapi/proptag/0x3002001E"
+#endif
+
+#ifndef PR_EMAIL_ADDRESS_DASL
+#define PR_EMAIL_ADDRESS_DASL \
+  "http://schemas.microsoft.com/mapi/proptag/0x3003001E"
+#endif
+
 #define PR_MESSAGE_CLASS_W_DASL \
   "http://schemas.microsoft.com/mapi/proptag/0x001A001F"
 #define GPGOL_ATTACHTYPE_DASL \
   "http://schemas.microsoft.com/mapi/string/" \
   "{31805AB8-3E92-11DC-879C-00061B031004}/GpgOL Attach Type/0x00000003"
+#define GPGOL_UID_DASL \
+  "http://schemas.microsoft.com/mapi/string/" \
+  "{31805AB8-3E92-11DC-879C-00061B031004}/GpgOL UID/0x0000001F"
 #define PR_ATTACH_DATA_BIN_DASL \
   "http://schemas.microsoft.com/mapi/proptag/0x37010102"
 #define PR_BODY_W_DASL \
@@ -93,12 +125,18 @@ DEFINE_OLEGUID(IID_IOleWindow,                0x00000114, 0, 0);
   "http://schemas.microsoft.com/mapi/proptag/0x7FFE000B"
 #define PR_ATTACH_MIME_TAG_DASL \
   "http://schemas.microsoft.com/mapi/proptag/0x370E001F"
-#ifdef __cplusplus
-extern "C" {
-#if 0
-}
-#endif
-#endif
+#define PR_ATTACH_CONTENT_ID_DASL \
+  "http://schemas.microsoft.com/mapi/proptag/0x3712001F"
+#define PR_TAG_SENDER_SMTP_ADDRESS \
+  "http://schemas.microsoft.com/mapi/proptag/0x5D01001F"
+#define PR_TAG_RECEIVED_REPRESENTING_SMTP_ADDRESS \
+  "http://schemas.microsoft.com/mapi/proptag/0x5D08001F"
+#define PR_PIDNameContentType_DASL \
+  "http://schemas.microsoft.com/mapi/string/{00020386-0000-0000-C000-000000000046}/content-type/0x0000001F"
+#define PR_BLOCK_STATUS_DASL \
+  "http://schemas.microsoft.com/mapi/proptag/0x10960003"
+
+#define DISTRIBUTION_LIST_ADDRESS_ENTRY_TYPE 11
 
 /* Return the malloced name of an COM+ object.  */
 char *get_object_name (LPUNKNOWN obj);
@@ -121,6 +159,9 @@ int put_oom_int (LPDISPATCH pDisp, const char *name, int value);
 /* Set the property NAME to STRING.  */
 int put_oom_string (LPDISPATCH pDisp, const char *name, const char *string);
 
+/* Set the property NAME to DISP.  */
+int put_oom_disp (LPDISPATCH pDisp, const char *name, LPDISPATCH value);
+
 /* Get the boolean property NAME of the object PDISP.  */
 int get_oom_bool (LPDISPATCH pDisp, const char *name);
 
@@ -146,8 +187,10 @@ void del_oom_button (LPDISPATCH button);
 /* Get the HWND of the active window in the current context */
 HWND get_oom_context_window (LPDISPATCH context);
 
-/* Get the address of the recipients as string list */
-char ** get_oom_recipients (LPDISPATCH recipients);
+/* Get the address of the recipients as string list.
+   If r_err is not null it is set to true in case of an error. */
+std::vector<std::string> get_oom_recipients (LPDISPATCH recipients,
+                                             bool *r_err = nullptr);
 
 /* Add an attachment to a dispatcher */
 int
@@ -182,7 +225,13 @@ get_pa_int (LPDISPATCH pDisp, const char *property, int *rInt);
    property.
 */
 int
-set_pa_variant (LPDISPATCH pDisp, const char *dasl_id, VARIANT *value);
+put_pa_string (LPDISPATCH pDisp, const char *dasl_id, const char *value);
+
+int
+put_pa_variant (LPDISPATCH pDisp, const char *dasl_id, VARIANT *value);
+
+int
+put_pa_int (LPDISPATCH pDisp, const char *dasl_id, int value);
 
 /* Look up a variant with the propertyAccessor interface */
 int
@@ -218,6 +267,18 @@ get_oom_message (LPDISPATCH mailitem);
 LPMESSAGE
 get_oom_base_message (LPDISPATCH mailitem);
 
+/* Get a strong reference for a mail object by calling
+   Application.GetObjectReference with type strong. The
+   documentation is unclear what this acutally does.
+   This function is left over from experiments about
+   strong references. Maybe there is a use for them.
+   The reference we use in the Mail object is documented
+   as a Weak reference. But changing that does not appear
+   to make a difference.
+*/
+LPDISPATCH
+get_strong_reference (LPDISPATCH mail);
+
 /* Invoke a method of an outlook object.
    returns true on success false otherwise.
 
@@ -228,12 +289,84 @@ get_oom_base_message (LPDISPATCH mailitem);
 int
 invoke_oom_method (LPDISPATCH pDisp, const char *name, VARIANT *rVariant);
 
+/* Invoke a method of an outlook object.
+   returns true on success false otherwise.
+
+   rVariant should either point to a propery initialized
+   variant (initinalized wiht VariantInit) to hold
+   the return value or a pointer to NULL.
+
+   parms can optionally be used to provide a DISPPARAMS structure
+   with parameters for the function.
+   */
+int
+invoke_oom_method_with_parms (LPDISPATCH pDisp, const char *name,
+                              VARIANT *rVariant, DISPPARAMS *params);
+
 /* Try to obtain the mapisession through the Application.
   returns NULL on error.*/
 LPMAPISESSION
 get_oom_mapi_session (void);
 
-#ifdef __cplusplus
-}
-#endif
+/* Ensure a category of the name name exists in
+  the session for the Mail mail.
+
+  Creates the category with the specified color if required.
+
+  returns 0 on success. */
+void
+ensure_category_exists (LPDISPATCH mail, const char *category, int color);
+
+/* Add a category to a mail if it is not already added. */
+int
+add_category (LPDISPATCH mail, const char *category);
+
+/* Remove a category from a mail if it was added. */
+int
+remove_category (LPDISPATCH mail, const char *category);
+
+/* Get a unique identifier for a mail object. The
+   uuid is a custom property. If create is set
+   a new uuid will be added if none exists and the
+   value of that uuid returned.
+
+   The optinal uuid value can be set to be used
+   as uuid instead of a generated one.
+
+   Return value has to be freed by the caller.
+   */
+char *
+get_unique_id (LPDISPATCH mail, int create, const char* uuid);
+
+
+/* Uses the Application->ActiveWindow to determine the hwnd
+   through FindWindow and the caption. Does not use IOleWindow
+   because that was unreliable somhow. */
+HWND get_active_hwnd (void);
+
+/* Create a new mailitem and return it */
+LPDISPATCH create_mail (void);
+
+LPDISPATCH get_account_for_mail (const char *mbox);
+
+/* Print all active addins to log */
+void log_addins (void);
+
+/* Sender fallbacks. All return either null or a malloced address. */
+char *get_sender_CurrentUser (LPDISPATCH mailitem);
+char *get_sender_Sender (LPDISPATCH mailitem);
+char *get_sender_SenderEMailAddress (LPDISPATCH mailitem);
+
+/* Get the body of the active inline response */
+char *get_inline_body (void);
+
+/* Get the major version of the exchange server of the account for the
+   mail address "mbox". Returns -1 if no version could be detected
+   or exchange is not used.*/
+int get_ex_major_version_for_addr (const char *mbox);
+
+/* Get the language code used for Outlooks UI */
+int get_ol_ui_language (void);
+
+char *get_sender_SendUsingAccount (LPDISPATCH mailitem, bool *r_is_GSuite);
 #endif /*OOMHELP_H*/