Concatenate body parts.
[gpgol.git] / src / user-events.cpp
1 /* user-events.cpp - Subclass impl of IExchExtUserEvents
2  *      Copyright (C) 2007, 2008 g10 Code GmbH
3  * 
4  * This file is part of GpgOL.
5  * 
6  * GpgOL is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  * 
11  * GpgOL is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU Lesser General Public License for more details.
15  * 
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #ifdef HAVE_CONFIG_H
21 #include <config.h>
22 #endif
23
24 #include <windows.h>
25
26 #include "mymapi.h"
27 #include "mymapitags.h"
28 #include "myexchext.h"
29 #include "display.h"
30 #include "common.h"
31 #include "msgcache.h"
32 #include "engine.h"
33 #include "mapihelp.h"
34
35 #include "olflange-def.h"
36 #include "olflange.h"
37 #include "user-events.h"
38
39
40 #define TRACEPOINT() do { log_debug ("%s:%s:%d: tracepoint\n", \
41                                      SRCNAME, __func__, __LINE__); \
42                         } while (0)
43
44
45 /* Wrapper around UlRelease with error checking. */
46 // static void 
47 // ul_release (LPVOID punk, const char *func, int lnr)
48 // {
49 //   ULONG res;
50   
51 //   if (!punk)
52 //     return;
53 //   res = UlRelease (punk);
54 //   log_debug ("%s:%s:%d: UlRelease(%p) had %lu references\n", 
55 //              SRCNAME, func, lnr, punk, res);
56 // }
57
58
59
60
61 /* Our constructor.  */
62 GpgolUserEvents::GpgolUserEvents (GpgolExt *pParentInterface)
63
64   m_pExchExt = pParentInterface;
65   m_lRef = 0; 
66 }
67
68
69 /* The QueryInterface which does the actual subclassing.  */
70 STDMETHODIMP 
71 GpgolUserEvents::QueryInterface (REFIID riid, LPVOID FAR *ppvObj)
72 {   
73   *ppvObj = NULL;
74   if (riid == IID_IExchExtUserEvents)
75     {
76       *ppvObj = (LPVOID)this;
77       AddRef();
78       return S_OK;
79     }
80   if (riid == IID_IUnknown)
81     {
82       *ppvObj = (LPVOID)m_pExchExt;  
83       m_pExchExt->AddRef();
84       return S_OK;
85     }
86   return E_NOINTERFACE;
87 }
88
89
90
91 /* Called from Outlook for all selection changes.
92
93    PEECB is a pointer to the IExchExtCallback interface.  */
94 STDMETHODIMP_ (VOID)
95 GpgolUserEvents::OnSelectionChange (LPEXCHEXTCALLBACK eecb) 
96 {
97   HRESULT hr;
98   ULONG count, objtype;
99   char msgclass[256];
100
101   log_debug ("%s:%s: received\n", SRCNAME, __func__);
102
103   hr = eecb->GetSelectionCount (&count);
104   if (SUCCEEDED (hr) && count > 0)
105     {
106       /* Get the first selected item.  */
107       hr = eecb->GetSelectionItem (0L, NULL, NULL, &objtype,
108                                    msgclass, sizeof msgclass -1, NULL, 0L);
109       if (SUCCEEDED(hr) && objtype == MAPI_MESSAGE)
110         {
111           log_debug ("%s:%s: message class: %s\n",
112                      SRCNAME, __func__, msgclass);
113
114           /* If SMIME has been enabled and the current message is of
115              class SMIME or in the past processed by CryptoEx, we
116              change the message class. */ 
117           // Unfortunaltely we can't use this because:
118           // 1. GetSelectionItem is as usual heavily undocumented and
119           // we need to guess a bit to see how to get message from the
120           // EntryID (2nd and 3rd arg).  2.  There are reports that
121           // OL2007 crashes when changing the message here.
122 //           if (opt.enable_smime 
123 //               && (!strncmp (msgclass, "IPM.Note.SMIME", 14)
124 //                   || !strncmp (msgclass, "IPM.Note.Secure.Cex", 19)))
125 //             {
126 //               LPMESSAGE message = NULL;
127 //               LPMDB mdb = NULL;
128
129 //               hr = eecb->GetObject (&mdb, (LPMAPIPROP *)&message);
130 //               if (SUCCEEDED (hr) && !mapi_has_sig_status (message))
131 //                 {
132 //                   log_debug ("%s:%s: message class not yet checked"
133 //                              " - doing now\n", SRCNAME, __func__);
134 //                   mapi_change_message_class (message);
135 //                 }
136 //               ul_release (message, __func__, __LINE__);
137 //               ul_release (mdb, __func__, __LINE__);
138 //             }
139         }
140       else if (SUCCEEDED(hr) && objtype == MAPI_FOLDER)
141         {
142           log_debug ("%s:%s: objtype: %lu\n",
143                      SRCNAME, __func__, objtype);
144         }
145     }
146
147 }
148
149 /* I assume this is called from Outlook for all object changes.
150
151    PEECB is a pointer to the IExchExtCallback interface.  */
152 STDMETHODIMP_ (VOID)
153 GpgolUserEvents::OnObjectChange (LPEXCHEXTCALLBACK eecb) 
154
155   log_debug ("%s:%s: received\n", SRCNAME, __func__);
156
157 }
158