1 // CpEpEngine.h : Declaration of the CpEpEngine
4 #include "resource.h" // main symbols
6 #include "pEpComServerAdapter_i.h"
7 #include "locked_queue.hh"
8 #include "utf8_helper.h"
9 #include "pEp_utility.h"
12 #if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
13 #error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
17 using namespace utility;
18 using namespace pEp::utility;
23 class ATL_NO_VTABLE CpEpEngine :
24 public CComObjectRootEx<CComObjectThreadModel>,
25 public CComCoClass<CpEpEngine, &CLSID_pEpEngine>,
26 public ISupportErrorInfo,
30 static int examine_identity(pEp_identity *ident, void *management);
33 CpEpEngine() : keymanagement_thread(NULL), identity_queue(NULL), verbose_mode(false)
35 PEP_STATUS status = ::init(&m_session);
36 assert(status == PEP_STATUS_OK);
37 ::register_examine_function(m_session, CpEpEngine::examine_identity, (void *)this);
38 ::log_event(m_session, "Startup", "pEp COM Adapter", NULL, NULL);
44 StopKeyserverLookup();
45 ::log_event(m_session, "Shutdown", "pEp COM Adapter", NULL, NULL);
49 DECLARE_REGISTRY_RESOURCEID(IDR_PEPENGINE)
51 DECLARE_NOT_AGGREGATABLE(CpEpEngine)
53 BEGIN_COM_MAP(CpEpEngine)
54 COM_INTERFACE_ENTRY(IpEpEngine)
55 COM_INTERFACE_ENTRY(ISupportErrorInfo)
59 STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
62 DECLARE_PROTECT_FINAL_CONSTRUCT()
64 HRESULT FinalConstruct()
81 session(CpEpEngine *myself)
84 me->session_mutex.lock();
89 me->session_mutex.unlock();
92 operator PEP_SESSION const ()
100 return session(this);
103 typedef locked_queue<pEp_identity_cpp> identity_queue_t;
104 static ::pEp_identity * retrieve_next_identity(void *management);
105 static PEP_STATUS messageToSend(void * obj, message *msg);
106 static PEP_STATUS showHandshake(void * obj, pEp_identity *self, pEp_identity *partner);
109 HRESULT error(_bstr_t msg);
110 HRESULT error(_bstr_t msg, PEP_STATUS errorcode);
112 void verbose(string text)
116 ss << __FILE__ << ":" << __LINE__ << " " << text;
117 ::log_event(get_session(), "verbose", "pEp COM Server Adapter", ss.str().c_str(), NULL);
122 PEP_SESSION m_session;
124 atomic< identity_queue_t * > identity_queue;
125 thread *keymanagement_thread;
128 IpEpEngineCallbacks* client_callbacks = NULL;
129 IpEpEngineCallbacks* client_callbacks_on_sync_thread = NULL;
132 static int inject_sync_msg(void *msg, void* management);
133 static void* retrieve_next_sync_msg(void* management);
134 void start_keysync();
135 static void do_keysync_in_thread(CpEpEngine* self, LPSTREAM marshaled_callbacks);
138 std::mutex keysync_mutex;
139 std::condition_variable keysync_condition;
140 std::thread *keysync_thread = NULL;
141 std::queue<void*> keysync_queue;
142 bool keysync_abort_requested = false;
143 PEP_SESSION keysync_session;
146 // runtime config of the adapter
148 STDMETHOD(VerboseLogging)(VARIANT_BOOL enable);
150 // runtime config of the engine
152 STDMETHOD(PassiveMode)(VARIANT_BOOL enable);
153 STDMETHOD(UnencryptedSubject)(VARIANT_BOOL enable);
157 STDMETHOD(ExportKey)(BSTR fpr, BSTR * keyData);
158 STDMETHOD(Log)(BSTR title, BSTR entity, BSTR description, BSTR comment);
159 STDMETHOD(Trustwords)(BSTR fpr, BSTR lang, LONG max_words, BSTR * words);
160 STDMETHOD(GetTrustwords)(struct pEpIdentity *id1, struct pEpIdentity *id2, BSTR lang, VARIANT_BOOL full, BSTR *words);
161 STDMETHOD(GetCrashdumpLog)(LONG maxlines, BSTR * log);
162 STDMETHOD(GetEngineVersion)(BSTR * engineVersion);
163 STDMETHOD(GetLanguageList)(BSTR * languages);
167 STDMETHOD(StartKeyserverLookup)();
168 STDMETHOD(StopKeyserverLookup)();
170 STDMETHOD(Myself)(struct pEpIdentity *ident, struct pEpIdentity *result);
171 STDMETHOD(UpdateIdentity)(struct pEpIdentity *ident, struct pEpIdentity *result);
172 STDMETHOD(KeyMistrusted)(struct pEpIdentity *ident);
173 STDMETHOD(KeyResetTrust)(struct pEpIdentity *ident);
174 STDMETHOD(TrustPersonalKey)(struct pEpIdentity *ident, struct pEpIdentity *result);
179 STDMETHOD(BlacklistAdd)(BSTR fpr);
180 STDMETHOD(BlacklistDelete)(BSTR fpr);
181 STDMETHOD(BlacklistIsListed)(BSTR fpr, VARIANT_BOOL *listed);
182 STDMETHOD(BlacklistRetrieve)(SAFEARRAY **blacklist);
186 STDMETHOD(EncryptMessage)(TextMessage * src, TextMessage * dst, SAFEARRAY * extra, pEpEncryptFlags flags);
187 STDMETHOD(DecryptMessage)(TextMessage * src, TextMessage * dst, SAFEARRAY ** keylist, pEpDecryptFlags* flags, pEpRating *rating);
188 STDMETHOD(OutgoingMessageRating)(TextMessage *msg, pEpRating * pVal);
189 STDMETHOD(IdentityRating)(pEpIdentity * ident, pEpRating * pVal);
190 STDMETHOD(ColorFromRating)(pEpRating rating, pEpColor * pVal);
194 STDMETHOD(RegisterCallbacks)(IpEpEngineCallbacks *new_callback);
195 STDMETHOD(UnregisterCallbacks)();
197 // PGP compatibility functions
198 STDMETHOD(OpenPGPListKeyinfo)(BSTR search_pattern, LPSAFEARRAY* keyinfo_list);
201 HRESULT Fire_MessageToSend(
202 /* [in] */ struct TextMessage *msg);
204 HRESULT Fire_ShowHandshake(
205 /* [in] */ struct pEpIdentity *self,
206 /* [in] */ struct pEpIdentity *partner,
207 /* [retval][out] */ SyncHandshakeResult *result);
210 OBJECT_ENTRY_AUTO(__uuidof(pEpEngine), CpEpEngine)