aboutsummaryrefslogtreecommitdiffstats
path: root/src/native/windows/msofficecomm/WeakReferenceSource.h
blob: 8be3da2556120070f3d14f2b99e14fca8042a74e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
 * Jitsi, the OpenSource Java VoIP and Instant Messaging client.
 *
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 */
#ifndef _JMSOFFICECOMM_WEAKREFERENCESOURCE_H_
#define _JMSOFFICECOMM_WEAKREFERENCESOURCE_H_

#include "IWeakReferenceSource.h"

class WeakReference;

class WeakReferenceSource
    : public IWeakReferenceSource
{
public:
    WeakReferenceSource(LPUNKNOWN iUnknown)
        : _iUnknown(iUnknown), _weakReference(NULL) {}
    virtual ~WeakReferenceSource();

    // IUnknown
    STDMETHODIMP QueryInterface(REFIID iid, PVOID *obj)
        { return _iUnknown->QueryInterface(iid, obj); }
    STDMETHODIMP_(ULONG) AddRef()
        { return _iUnknown->AddRef(); }
    STDMETHODIMP_(ULONG) Release()
        { return _iUnknown->Release(); }

    // IWeakReferenceSource
    STDMETHODIMP GetWeakReference(IWeakReference **weakReference);

private:
    const LPUNKNOWN _iUnknown;
    WeakReference *_weakReference;
};

#define STDMETHODIMP_RESOLVE_WEAKREFERENCE_OR_NEW(out,weakReference,clazz,...) \
    { \
        HRESULT hr; \
\
        if (out) \
        { \
            hr = E_FAIL; \
            if (weakReference) \
            { \
                hr = weakReference->Resolve(IID_IDispatch, (PVOID *) out); \
                if (FAILED(hr) && (E_NOINTERFACE != hr)) \
                { \
                    weakReference->Release(); \
                    weakReference = NULL; \
                } \
            } \
            if (FAILED(hr) && (E_NOINTERFACE != hr)) \
            { \
                clazz *obj = new clazz(__VA_ARGS__); \
                IWeakReferenceSource *weakReferenceSource; \
\
                hr \
                    = obj->QueryInterface( \
                            IID_IWeakReferenceSource, \
                            (PVOID *) &weakReferenceSource); \
                obj->Release(); \
                if (SUCCEEDED(hr)) \
                { \
                    hr \
                        = weakReferenceSource->GetWeakReference( \
                                &weakReference); \
                    if (SUCCEEDED(hr)) \
                    { \
                        hr \
                            = weakReference->Resolve( \
                                    IID_IDispatch, \
                                    (PVOID *) out); \
                    } \
                    else \
                        *out = NULL; \
                    weakReferenceSource->Release(); \
                } \
                else \
                    *out = NULL; \
            } \
        } \
        else \
            hr = RPC_X_NULL_REF_POINTER; \
        return hr; \
    }

#endif /* #ifndef _JMSOFFICECOMM_WEAKREFERENCESOURCE_H_ */