a8d24de73a39dd65646a5ff0c3d081a6c6453a4c
[gpgol.git] / src / windowmessages.h
1 /* windowmessages.h - Helper functions for Window message exchange.
2  * Copyright (C) 2015 by Bundesamt für Sicherheit in der Informationstechnik
3  * Software engineering by Intevation GmbH
4  *
5  * This file is part of GpgOL.
6  *
7  * GpgOL is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * GpgOL is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public License
18  * along with this program; if not, see <http://www.gnu.org/licenses/>.
19  */
20 #ifndef WINDOWMESSAGES_H
21 #define WINDOWMESSAGES_H
22
23 #include <windows.h>
24
25 #include "config.h"
26
27 #include <gpg-error.h>
28
29 /** Window Message handling for GpgOL.
30   In Outlook only one thread has access to the Outlook Object model
31   and this is the UI Thread. We can work in other threads but
32   to do something with outlooks data we neet to be in the UI Thread.
33   So we create a hidden Window in this thread and use the fact
34   that SendMessage handles Window messages in the thread where the
35   Window was created.
36   This way we can go back to interactct with the Outlook from another
37   thread without working with COM Multithreading / Marshaling.
38
39   The Responder Window should be initalized on startup.
40   */
41 typedef enum _gpgol_wmsg_type
42 {
43   UNKNOWN = 1100, /* A large offset to avoid conflicts */
44   INVALIDATE_UI, /* The UI should be invalidated. */
45   PARSING_DONE, /* A mail was parsed. Data should be a pointer
46                       to the mail object. */
47   RECIPIENT_ADDED, /* A recipient was added. Data should be ptr
48                       to mail */
49   CLOSE, /* Close the message in the next event loop. */
50   CRYPTO_DONE, /* Sign / Encrypt done. */
51   WKS_NOTIFY, /* Show a WKS Notification. */
52   BRING_TO_FRONT, /* Bring the active Outlook window to the front. */
53   INVALIDATE_LAST_MAIL,
54   REVERT_MAIL,
55   CLEAR_REPLY_FORWARD,
56   DO_AUTO_SECURE,
57   DONT_AUTO_SECURE,
58   CONFIG_KEY_DONE,
59   /* External API, keep it stable! */
60   EXT_API_CLOSE = 1301,
61   EXT_API_CLOSE_ALL = 1302,
62 } gpgol_wmsg_type;
63
64 typedef struct
65 {
66   void *data; /* Pointer to arbitrary data depending on msg type */
67   gpgol_wmsg_type wmsg_type; /* Type of the msg. */
68   int err; /* Set to true on error */
69   int delay;
70 } wm_ctx_t;
71
72 /** Create and register the responder window.
73   The responder window should be */
74 HWND
75 create_responder_window ();
76
77 /** Uses send_msg_to_ui_thread to execute the request
78   in the ui thread.  Returns the result. */
79 int
80 do_in_ui_thread (gpgol_wmsg_type type, void *data);
81
82 /** Send a message to the UI thread but returns
83     immediately without waiting for the execution.
84
85     The delay is used in the detached thread to delay
86     the sending of the actual message. */
87 void
88 do_in_ui_thread_async (gpgol_wmsg_type type, void *data, int delay = 0);
89
90 /** Create our filter before outlook Window Messages. */
91 HHOOK
92 create_message_hook();
93
94 /** Block ui invalidation. The idea here is to further reduce
95     UI invalidations because depending on timing they might crash.
96     So we try to block invalidation for as long as it is a bad time
97     for us. */
98 void blockInv ();
99
100 /** Unblock ui invalidation */
101 void unblockInv ();
102
103 DWORD WINAPI
104 delayed_invalidate_ui (LPVOID minsleep_ms = 0);
105
106 DWORD WINAPI
107 close_mail (LPVOID);
108
109 #endif // WINDOWMESSAGES_H