summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/mapi/mapihook/src/msgMapiFactory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/mapi/mapihook/src/msgMapiFactory.cpp')
-rw-r--r--comm/mailnews/mapi/mapihook/src/msgMapiFactory.cpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/comm/mailnews/mapi/mapihook/src/msgMapiFactory.cpp b/comm/mailnews/mapi/mapihook/src/msgMapiFactory.cpp
new file mode 100644
index 0000000000..cb99fc04fd
--- /dev/null
+++ b/comm/mailnews/mapi/mapihook/src/msgMapiFactory.cpp
@@ -0,0 +1,64 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#undef UNICODE
+#undef _UNICODE
+
+#include "msgMapiFactory.h"
+#include "msgMapiImp.h"
+#include "msgMapi.h"
+
+CMapiFactory ::CMapiFactory() : m_cRef(1) {}
+
+CMapiFactory::~CMapiFactory() {}
+
+STDMETHODIMP CMapiFactory::QueryInterface(const IID& aIid, void** aPpv) {
+ if ((aIid == IID_IUnknown) || (aIid == IID_IClassFactory)) {
+ *aPpv = static_cast<IClassFactory*>(this);
+ } else {
+ *aPpv = nullptr;
+ return E_NOINTERFACE;
+ }
+ reinterpret_cast<IUnknown*>(*aPpv)->AddRef();
+ return S_OK;
+}
+
+STDMETHODIMP_(ULONG) CMapiFactory::AddRef() { return ++m_cRef; }
+
+STDMETHODIMP_(ULONG) CMapiFactory::Release() {
+ int32_t temp = --m_cRef;
+ if (m_cRef == 0) {
+ delete this;
+ return 0;
+ }
+
+ return temp;
+}
+
+STDMETHODIMP CMapiFactory::CreateInstance(IUnknown* aUnknownOuter,
+ const IID& aIid, void** aPpv) {
+ // Cannot aggregate.
+
+ if (aUnknownOuter != nullptr) {
+ return CLASS_E_NOAGGREGATION;
+ }
+
+ // Create component.
+
+ CMapiImp* pImp = new CMapiImp();
+ if (pImp == nullptr) {
+ return E_OUTOFMEMORY;
+ }
+
+ // Get the requested interface.
+ HRESULT hr = pImp->QueryInterface(aIid, aPpv);
+
+ // Release the IUnknown pointer.
+ // (If QueryInterface failed, component will delete itself.)
+
+ pImp->Release();
+ return hr;
+}
+
+STDMETHODIMP CMapiFactory::LockServer(BOOL aLock) { return S_OK; }