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