propsys: Add stub InMemoryPropertyStore implementation.
[wine] / dlls / propsys / propstore.c
1 /*
2  * standard IPropertyStore implementation
3  *
4  * Copyright 2012 Vincent Povirk for CodeWeavers
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #define COBJMACROS
22 #include "config.h"
23
24 #include <stdarg.h>
25
26 #include "windef.h"
27 #include "winbase.h"
28 #include "objbase.h"
29 #include "rpcproxy.h"
30 #include "propsys.h"
31 #include "wine/debug.h"
32 #include "wine/unicode.h"
33
34 #include "propsys_private.h"
35
36 WINE_DEFAULT_DEBUG_CHANNEL(propsys);
37
38 typedef struct {
39     IPropertyStoreCache IPropertyStoreCache_iface;
40     LONG ref;
41 } PropertyStore;
42
43 static inline PropertyStore *impl_from_IPropertyStoreCache(IPropertyStoreCache *iface)
44 {
45     return CONTAINING_RECORD(iface, PropertyStore, IPropertyStoreCache_iface);
46 }
47
48 static HRESULT WINAPI PropertyStore_QueryInterface(IPropertyStoreCache *iface, REFIID iid,
49     void **ppv)
50 {
51     PropertyStore *This = impl_from_IPropertyStoreCache(iface);
52     TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
53
54     if (!ppv) return E_INVALIDARG;
55
56     if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IPropertyStore, iid) ||
57         IsEqualIID(&IID_IPropertyStoreCache, iid))
58     {
59         *ppv = &This->IPropertyStoreCache_iface;
60     }
61     else
62     {
63         FIXME("No interface for %s\n", debugstr_guid(iid));
64         *ppv = NULL;
65         return E_NOINTERFACE;
66     }
67
68     IUnknown_AddRef((IUnknown*)*ppv);
69     return S_OK;
70 }
71
72 static ULONG WINAPI PropertyStore_AddRef(IPropertyStoreCache *iface)
73 {
74     PropertyStore *This = impl_from_IPropertyStoreCache(iface);
75     ULONG ref = InterlockedIncrement(&This->ref);
76
77     TRACE("(%p) refcount=%u\n", iface, ref);
78
79     return ref;
80 }
81
82 static ULONG WINAPI PropertyStore_Release(IPropertyStoreCache *iface)
83 {
84     PropertyStore *This = impl_from_IPropertyStoreCache(iface);
85     ULONG ref = InterlockedDecrement(&This->ref);
86
87     TRACE("(%p) refcount=%u\n", iface, ref);
88
89     if (ref == 0)
90         HeapFree(GetProcessHeap(), 0, This);
91
92     return ref;
93 }
94
95 static HRESULT WINAPI PropertyStore_GetCount(IPropertyStoreCache *iface,
96     DWORD *cProps)
97 {
98     FIXME("%p,%p: stub\n", iface, cProps);
99     return E_NOTIMPL;
100 }
101
102 static HRESULT WINAPI PropertyStore_GetAt(IPropertyStoreCache *iface,
103     DWORD iProp, PROPERTYKEY *pkey)
104 {
105     FIXME("%p,%d,%p: stub\n", iface, iProp, pkey);
106     return E_NOTIMPL;
107 }
108
109 static HRESULT WINAPI PropertyStore_GetValue(IPropertyStoreCache *iface,
110     REFPROPERTYKEY key, PROPVARIANT *pv)
111 {
112     FIXME("%p,%p,%p: stub\n", iface, key, pv);
113     return E_NOTIMPL;
114 }
115
116 static HRESULT WINAPI PropertyStore_SetValue(IPropertyStoreCache *iface,
117     REFPROPERTYKEY key, REFPROPVARIANT propvar)
118 {
119     FIXME("%p,%p,%p: stub\n", iface, key, propvar);
120     return E_NOTIMPL;
121 }
122
123 static HRESULT WINAPI PropertyStore_Commit(IPropertyStoreCache *iface)
124 {
125     FIXME("%p: stub\n", iface);
126     return S_OK;
127 }
128
129 static HRESULT WINAPI PropertyStore_GetState(IPropertyStoreCache *iface,
130     REFPROPERTYKEY key, PSC_STATE *pstate)
131 {
132     FIXME("%p,%p,%p: stub\n", iface, key, pstate);
133     return E_NOTIMPL;
134 }
135
136 static HRESULT WINAPI PropertyStore_GetValueAndState(IPropertyStoreCache *iface,
137     REFPROPERTYKEY key, PROPVARIANT *ppropvar, PSC_STATE *pstate)
138 {
139     FIXME("%p,%p,%p,%p: stub\n", iface, key, ppropvar, pstate);
140     return E_NOTIMPL;
141 }
142
143 static HRESULT WINAPI PropertyStore_SetState(IPropertyStoreCache *iface,
144     REFPROPERTYKEY key, PSC_STATE pstate)
145 {
146     FIXME("%p,%p,%d: stub\n", iface, key, pstate);
147     return E_NOTIMPL;
148 }
149
150 static HRESULT WINAPI PropertyStore_SetValueAndState(IPropertyStoreCache *iface,
151     REFPROPERTYKEY key, const PROPVARIANT *ppropvar, PSC_STATE state)
152 {
153     FIXME("%p,%p,%p,%d: stub\n", iface, key, ppropvar, state);
154     return E_NOTIMPL;
155 }
156
157 static const IPropertyStoreCacheVtbl PropertyStore_Vtbl = {
158     PropertyStore_QueryInterface,
159     PropertyStore_AddRef,
160     PropertyStore_Release,
161     PropertyStore_GetCount,
162     PropertyStore_GetAt,
163     PropertyStore_GetValue,
164     PropertyStore_SetValue,
165     PropertyStore_Commit,
166     PropertyStore_GetState,
167     PropertyStore_GetValueAndState,
168     PropertyStore_SetState,
169     PropertyStore_SetValueAndState
170 };
171
172 HRESULT PropertyStore_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv)
173 {
174     PropertyStore *This;
175     HRESULT ret;
176
177     TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppv);
178
179     *ppv = NULL;
180
181     if (pUnkOuter) return CLASS_E_NOAGGREGATION;
182
183     This = HeapAlloc(GetProcessHeap(), 0, sizeof(PropertyStore));
184     if (!This) return E_OUTOFMEMORY;
185
186     This->IPropertyStoreCache_iface.lpVtbl = &PropertyStore_Vtbl;
187     This->ref = 1;
188
189     ret = IPropertyStoreCache_QueryInterface(&This->IPropertyStoreCache_iface, iid, ppv);
190     IPropertyStoreCache_Release(&This->IPropertyStoreCache_iface);
191
192     return ret;
193 }