diff options
Diffstat (limited to 'src/native/windows/msofficecomm/MessengerClassFactory.cxx')
-rw-r--r-- | src/native/windows/msofficecomm/MessengerClassFactory.cxx | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/native/windows/msofficecomm/MessengerClassFactory.cxx b/src/native/windows/msofficecomm/MessengerClassFactory.cxx new file mode 100644 index 0000000..2152df5 --- /dev/null +++ b/src/native/windows/msofficecomm/MessengerClassFactory.cxx @@ -0,0 +1,66 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +#include "MessengerClassFactory.h" + +#include "Messenger.h" + +EXTERN_C const GUID DECLSPEC_SELECTANY CLSID_Messenger + = { 0x8885370D, 0xB33E, 0x44b7, { 0x87, 0x5D, 0x28, 0xE4, 0x03, 0xCF, 0x92, 0x70 } }; + +STDMETHODIMP +MessengerClassFactory::CreateInstance(LPUNKNOWN outer, REFIID iid, PVOID *obj) +{ + HRESULT hr; + + if (outer) + { + *obj = NULL; + hr = CLASS_E_NOAGGREGATION; + } + else + { + IMessenger *messenger; + + if (_messenger) + { + hr = _messenger->Resolve(IID_IMessenger, (PVOID *) &messenger); + if (FAILED(hr) && (E_NOINTERFACE != hr)) + { + _messenger->Release(); + _messenger = NULL; + } + } + else + messenger = NULL; + if (!messenger) + { + messenger = new Messenger(); + + IWeakReferenceSource *weakReferenceSource; + + hr + = messenger->QueryInterface( + IID_IWeakReferenceSource, + (PVOID *) &weakReferenceSource); + if (SUCCEEDED(hr)) + { + IWeakReference *weakReference; + + hr = weakReferenceSource->GetWeakReference(&weakReference); + if (SUCCEEDED(hr)) + { + if (_messenger) + _messenger->Release(); + _messenger = weakReference; + } + } + } + hr = messenger->QueryInterface(iid, obj); + messenger->Release(); + } + return hr; +} |