Add minimalistic protected-headers support
[gpgol.git] / src / gpgoladdin.h
1 /* gpgoladdin.h - Connect GpgOL to Outlook as an addin
2  * Copyright (C) 2013 Intevation GmbH
3  *    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 GPGOLADDIN_H
23 #define GPGOLADDIN_H
24
25 #include <windows.h>
26
27 #include "mymapi.h"
28
29 #include <vector>
30 #include <memory>
31
32 class GpgolAddinRibbonExt;
33 class ApplicationEventListener;
34 class DispCache;
35 class CategoryManager;
36
37 /* Enums for the IDTExtensibility2 interface*/
38 typedef enum
39   {
40     ext_cm_AfterStartup = 0,
41     ext_cm_Startup,
42     ext_cm_External,
43     ext_cm_CommandLine,
44     ext_cm_Solution,
45     ext_cm_UISetup
46   }
47 ext_ConnectMode;
48
49 typedef enum
50   {
51     ext_dm_HostShutdown = 0,
52     ext_dm_UserClosed,
53     ext_dm_UISetupComplete,
54     ext_dm_SolutionClosed
55   }
56 ext_DisconnectMode;
57
58 /* Global class locks */
59 extern ULONG addinLocks;
60
61 struct IDTExtensibility2;
62 typedef struct IDTExtensibility2 *LEXTENSIBILTY2;
63
64 /* Interface definitions */
65 DEFINE_GUID(IID_IDTExtensibility2, 0xB65AD801, 0xABAF, 0x11D0, 0xBB, 0x8B,
66             0x00, 0xA0, 0xC9, 0x0F, 0x27, 0x44);
67
68 #undef INTERFACE
69 #define INTERFACE IDTExtensibility2
70 DECLARE_INTERFACE_(IDTExtensibility2, IDispatch)
71 {
72   DECLARE_IUNKNOWN_METHODS;
73   DECLARE_IDISPATCH_METHODS;
74   /*** IDTExtensibility2 methods ***/
75
76   STDMETHOD(OnConnection)(LPDISPATCH, ext_ConnectMode, LPDISPATCH,
77                           SAFEARRAY**) PURE;
78   STDMETHOD(OnDisconnection)(ext_DisconnectMode, SAFEARRAY**) PURE;
79   STDMETHOD(OnAddInsUpdate)(SAFEARRAY **) PURE;
80   STDMETHOD(OnStartupComplete)(SAFEARRAY**) PURE;
81   STDMETHOD(OnBeginShutdown)(SAFEARRAY**) PURE;
82 };
83
84 DEFINE_GUID(IID_IRibbonExtensibility, 0x000C0396, 0x0000, 0x0000, 0xC0, 0x00,
85             0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
86
87 struct IRibbonExtensibility;
88 typedef struct IRibbonExtensibility *LRIBBONEXTENSIBILITY;
89
90 #undef INTERFACE
91 #define INTERFACE IRibbonExtensibility
92 DECLARE_INTERFACE_(IRibbonExtensibility, IDispatch)
93 {
94   DECLARE_IUNKNOWN_METHODS;
95   DECLARE_IDISPATCH_METHODS;
96
97   /*** IRibbonExtensibility methods ***/
98   STDMETHOD(GetCustomUI)(BSTR RibbonID, BSTR * RibbonXml) PURE;
99 };
100
101 DEFINE_GUID(IID_IRibbonCallback, 0xCE895442, 0x9981, 0x4315, 0xAA, 0x85,
102             0x4B, 0x9A, 0x5C, 0x77, 0x39, 0xD8);
103
104 struct IRibbonCallback;
105 typedef struct IRibbonCallback *LRIBBONCALLBACK;
106
107 #undef INTERFACE
108 #define INTERFACE IRibbonCallback
109 DECLARE_INTERFACE_(IRibbonCallback, IUnknown)
110 {
111   DECLARE_IUNKNOWN_METHODS;
112
113   /*** IRibbonCallback methods ***/
114   STDMETHOD(OnRibbonLoad)(IUnknown* pRibbonUIUnk) PURE;
115   STDMETHOD(ButtonClicked)(IDispatch* ribbon) PURE;
116 };
117
118 DEFINE_GUID(IID_IRibbonControl, 0x000C0395, 0x0000, 0x0000, 0xC0, 0x00,
119             0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
120
121 struct IRibbonControl;
122 typedef struct IRibbonControl *LPRIBBONCONTROL;
123
124 #undef INTERFACE
125 #define INTERFACE IRibbonControl
126 DECLARE_INTERFACE_(IRibbonControl, IDispatch)
127 {
128   DECLARE_IUNKNOWN_METHODS;
129   DECLARE_IDISPATCH_METHODS;
130
131   STDMETHOD(get_Id)(BSTR* id) PURE;
132   STDMETHOD(get_Context)(IDispatch** context) PURE;
133   STDMETHOD(get_Tag)(BSTR* Tag) PURE;
134 };
135
136
137 DEFINE_GUID(IID_ICustomTaskPaneConsumer, 0x000C033E, 0x0000, 0x0000, 0xC0,
138             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
139
140 class GpgolRibbonExtender : public IRibbonExtensibility
141 {
142 public:
143   GpgolRibbonExtender(void);
144   virtual ~GpgolRibbonExtender();
145
146   /* IUnknown */
147   STDMETHODIMP QueryInterface (REFIID riid, LPVOID* ppvObj);
148   inline STDMETHODIMP_(ULONG) AddRef() { ++m_lRef;  return m_lRef; };
149   inline STDMETHODIMP_(ULONG) Release()
150     {
151       ULONG lCount = --m_lRef;
152       if (!lCount)
153         delete this;
154       return lCount;
155     };
156
157   /* IDispatch */
158   STDMETHODIMP GetTypeInfoCount (UINT*);
159   STDMETHODIMP GetTypeInfo (UINT, LCID, LPTYPEINFO*);
160   STDMETHODIMP GetIDsOfNames (REFIID, LPOLESTR*, UINT, LCID, DISPID*);
161   STDMETHODIMP Invoke (DISPID, REFIID, LCID, WORD,
162                        DISPPARAMS*, VARIANT*, EXCEPINFO*, UINT*);
163
164   /* IRibbonExtensibility */
165   STDMETHODIMP GetCustomUI (BSTR RibbonID, BSTR* RibbonXml);
166
167 private:
168   ULONG m_lRef;
169
170 };
171
172 class GpgolAddin : public IDTExtensibility2
173 {
174 public:
175   GpgolAddin(void);
176   virtual ~GpgolAddin();
177
178 public:
179
180   /* IUnknown */
181   STDMETHODIMP QueryInterface (REFIID riid, LPVOID* ppvObj);
182   inline STDMETHODIMP_(ULONG) AddRef() { ++m_lRef;  return m_lRef; };
183   inline STDMETHODIMP_(ULONG) Release()
184     {
185       ULONG lCount = --m_lRef;
186       if (!lCount)
187         delete this;
188       return lCount;
189     };
190
191   /* IDispatch */
192   STDMETHODIMP GetTypeInfoCount (UINT*);
193   STDMETHODIMP GetTypeInfo (UINT, LCID, LPTYPEINFO*);
194   STDMETHODIMP GetIDsOfNames (REFIID, LPOLESTR*, UINT, LCID, DISPID*);
195   STDMETHODIMP Invoke (DISPID, REFIID, LCID, WORD,
196                        DISPPARAMS*, VARIANT*, EXCEPINFO*, UINT*);
197
198   /* IDTExtensibility */
199   STDMETHODIMP OnConnection (LPDISPATCH Application,
200                              ext_ConnectMode ConnectMode,
201                              LPDISPATCH AddInInst,
202                              SAFEARRAY** custom);
203   STDMETHODIMP OnDisconnection (ext_DisconnectMode RemoveMode,
204                                 SAFEARRAY**  custom);
205   STDMETHODIMP OnAddInsUpdate (SAFEARRAY** custom);
206   STDMETHODIMP OnStartupComplete (SAFEARRAY** custom);
207   STDMETHODIMP OnBeginShutdown (SAFEARRAY** custom);
208
209 public:
210   static GpgolAddin * get_instance ();
211
212   void registerExplorerSink (LPDISPATCH sink);
213   void unregisterExplorerSink (LPDISPATCH sink);
214   /* Start the shutdown. Unregisters everything and closes all
215      crypto mails. */
216   void shutdown ();
217   LPDISPATCH get_application () { return m_application; }
218   std::shared_ptr<DispCache> get_dispcache () { return m_dispcache; }
219   bool isShutdown() { return m_shutdown; };
220
221   /* Register a ribbon ui component */
222   void addRibbon (LPDISPATCH ribbon);
223
224   /* Invalidate the ribbons. */
225   void invalidateRibbons ();
226
227   std::shared_ptr<CategoryManager> get_category_mngr ();
228
229 private:
230   ULONG m_lRef;
231   GpgolRibbonExtender* m_ribbonExtender;
232
233   LPDISPATCH m_application;
234   LPDISPATCH m_addin;
235   LPDISPATCH m_applicationEventSink;
236   LPDISPATCH m_explorersEventSink;
237   LPDISPATCH m_ribbon_control;
238   bool m_disabled;
239   bool m_shutdown;
240   HHOOK m_hook;
241   std::vector<LPDISPATCH> m_explorerEventSinks;
242   std::shared_ptr<DispCache> m_dispcache;
243   std::vector<LPDISPATCH> m_ribbon_uis;
244   std::shared_ptr<CategoryManager> m_category_mngr;
245 };
246
247 class GpgolAddinFactory: public IClassFactory
248 {
249 public:
250   GpgolAddinFactory(): m_lRef(0){}
251   virtual ~GpgolAddinFactory();
252
253   STDMETHODIMP QueryInterface (REFIID riid, LPVOID* ppvObj);
254   inline STDMETHODIMP_(ULONG) AddRef() { ++m_lRef;  return m_lRef; };
255   inline STDMETHODIMP_(ULONG) Release()
256     {
257       ULONG lCount = --m_lRef;
258       if (!lCount)
259         delete this;
260       return lCount;
261     };
262
263   /* IClassFactory */
264   STDMETHODIMP CreateInstance (LPUNKNOWN unknown, REFIID riid,
265                                LPVOID* ppvObj);
266   STDMETHODIMP LockServer (BOOL lock)
267     {
268       if (lock)
269         ++addinLocks;
270       else
271         --addinLocks;
272       return S_OK;
273     }
274
275 private:
276   ULONG m_lRef;
277 };
278
279 STDAPI DllGetClassObject (REFCLSID rclsid, REFIID riid, LPVOID* ppvObj);
280
281 /* Invalidates the UI XML to trigger a reload of the UI Elements. */
282 void gpgoladdin_invalidate_ui ();
283
284 #endif /*GPGOLADDIN_H*/