Add minimalistic protected-headers support
[gpgol.git] / src / application-events.cpp
1 /* application-events.cpp - Event handling for the application.
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
21 /* The event handler classes defined in this file follow the
22    general pattern that they implment the IDispatch interface
23    through the eventsink macros and handle event invocations
24    in their invoke methods.
25 */
26 #ifdef HAVE_CONFIG_H
27 #include <config.h>
28 #endif
29
30 #include "eventsink.h"
31 #include "ocidl.h"
32 #include "common.h"
33 #include "oomhelp.h"
34 #include "mail.h"
35 #include "gpgoladdin.h"
36 #include "windowmessages.h"
37
38 /* Application Events */
39 BEGIN_EVENT_SINK(ApplicationEvents, IDispatch)
40 EVENT_SINK_DEFAULT_CTOR(ApplicationEvents)
41 EVENT_SINK_DEFAULT_DTOR(ApplicationEvents)
42 typedef enum
43   {
44     AdvancedSearchComplete = 0xFA6A,
45     AdvancedSearchStopped = 0xFA6B,
46     AttachmentContextMenuDisplay = 0xFB3E,
47     BeforeFolderSharingDialog = 0xFC01,
48     ContextMenuClose = 0xFBA6,
49     FolderContextMenuDisplay = 0xFB42,
50     ItemContextMenuDisplay = 0xFB41,
51     ItemLoad = 0xFBA7,
52     ItemSend = 0xF002,
53     MAPILogonComplete = 0xFA90,
54     NewMail = 0xF003,
55     NewMailEx = 0xFAB5,
56     OptionsPagesAdd = 0xF005,
57     Quit = 0xF007,
58     Reminder = 0xF004,
59     ShortcutContextMenuDisplay = 0xFB44,
60     Startup = 0xF006,
61     StoreContextMenuDisplay = 0xFB43,
62     ViewContextMenuDisplay = 0xFB40
63   } ApplicationEvent;
64
65 EVENT_SINK_INVOKE(ApplicationEvents)
66 {
67   USE_INVOKE_ARGS
68   switch(dispid)
69     {
70       case ItemLoad:
71         {
72           TSTART;
73           LPDISPATCH mailItem;
74           /* The mailItem should be the first argument */
75           if (!parms || parms->cArgs != 1 ||
76               parms->rgvarg[0].vt != VT_DISPATCH)
77             {
78               log_error ("%s:%s: ItemLoad with unexpected Arguments.",
79                          SRCNAME, __func__);
80               TBREAK;
81             }
82
83           log_debug ("%s:%s: ItemLoad event. Getting object.",
84                      SRCNAME, __func__);
85           mailItem = get_object_by_id (parms->rgvarg[0].pdispVal,
86                                        IID_MailItem);
87           if (!mailItem)
88             {
89               log_debug ("%s:%s: ItemLoad event without mailitem.",
90                          SRCNAME, __func__);
91               TBREAK;
92             }
93           log_debug ("%s:%s: Creating mail object for item: %p",
94                      SRCNAME, __func__, mailItem);
95           new Mail (mailItem);
96           do_in_ui_thread_async (INVALIDATE_LAST_MAIL, nullptr);
97           TBREAK;
98         }
99       case Quit:
100         {
101           log_debug ("%s:%s: Quit event. Shutting down",
102                      SRCNAME, __func__);
103           TBREAK;
104         }
105       default:
106         log_oom ("%s:%s: Unhandled Event: %lx \n",
107                        SRCNAME, __func__, dispid);
108     }
109   /* We always return S_OK even on error so that outlook
110      continues to handle the event and is not disturbed
111      by our errors. There shouldn't be errors in here
112      anyway if everything works as documented. */
113   return S_OK;
114 }
115 END_EVENT_SINK(ApplicationEvents, IID_ApplicationEvents)