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_ */
|