aboutsummaryrefslogtreecommitdiffstats
path: root/src/native/addrbook/msoutlook/com/ClassFactory.cxx
blob: e299708f1be11e22ad523c5b5741493669205fa0 (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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*
 * Jitsi, the OpenSource Java VoIP and Instant Messaging client.
 *
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 */
#include "ClassFactory.h"

#include <stdio.h>

/**
 * Represents a base implementation of the <tt>IClassFactory</tt> interface.
 *
 * @author Lyubomir Marinov
 * @author Vincent Lucas
 */

/**
 * Returns an instance of the interface requested, if available.
 *
 * @param iid The identifier of the interface requested.
 * @param obj A pointer use to return an object instance implementing the
 * interface requested.
 *
 * @return S_OK if the corresponding interface has been found. E_POINTER, or
 * E_NOINTERFACE otherwise.
 */
STDMETHODIMP ClassFactory::QueryInterface(REFIID iid, PVOID *obj)
{
    HRESULT hr;

    if(!obj)
    {
        hr = E_POINTER;
    }
    else if(IID_IUnknown == iid)
    {
        AddRef();
        *obj = static_cast<LPUNKNOWN>(this);
        hr = S_OK;
    }
    else if(IID_IClassFactory == iid)
    {
        AddRef();
        *obj = static_cast<IClassFactory *>(this);
        hr = S_OK;
    }
    else
    {
        *obj = NULL;
        hr = E_NOINTERFACE;
    }

    return hr;
}

/**
 * Increment the number of reference.
 *
 * @return The number of reference.
 */
STDMETHODIMP_(ULONG) ClassFactory::AddRef()
{
    return ++_refCount;
}

/**
 * Decrement the number of reference.
 *
 * @return The number of reference.
 */
STDMETHODIMP_(ULONG) ClassFactory::Release()
{
    ULONG refCount = --_refCount;

    if(!refCount)
    {
        delete this;
    }

    return refCount;
}

/**
 * Unused.
 */
HRESULT ClassFactory::LockServer(BOOL lock)
{
    return S_OK;
};

/**
 * Register the CLISD of the implementer of this ClassFactory.
 *
 * @return S_OK if the class object was registered successfully. Any other value
 * if fail.
 */
HRESULT ClassFactory::registerClassObject()
{
    return
        ::CoRegisterClassObject(
                _clsid,
                this,
                CLSCTX_LOCAL_SERVER,
                REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED,
                &_registration);
};

/**
 * Unregister the CLISD of the implementer of this ClassFactory.
 *
 * @return S_OK the class object was revoked successfully. Any other value if
 * fail.
 */
HRESULT ClassFactory::revokeClassObject()
{
    return ::CoRevokeClassObject(_registration);
};

/**
 * Instanciates this class factory for a given CLSID.
 *
 * @param clsid The CLSID to manage.
 */
ClassFactory::ClassFactory(REFCLSID clsid):
    _clsid(clsid),
    _registration(0),
    _refCount(1)
{
};

/**
 * Deletes this class factory.
 */
ClassFactory::~ClassFactory()
{
    Release();
};