Improved "error" message readability.
[wine/dcerpc.git] / ole / filemoniker.c
blob8d77deff746a280c416d3e4071da730399e750c6
1 /***************************************************************************************
2 * FileMonikers implementation
4 * Copyright 1999 Noomen Hamza
5 ***************************************************************************************/
7 #include <ctype.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <assert.h>
11 #include "wine/obj_moniker.h"
12 #include "winerror.h"
13 #include "debug.h"
14 #include "heap.h"
16 typedef struct FileMonikerImpl{
18 ICOM_VTABLE(IMoniker)* lpvtbl;
20 ULONG ref;
22 } FileMonikerImpl;
24 static HRESULT WINAPI FileMonikerImpl_QueryInterface(IMoniker* iface,REFIID riid,void** ppvObject);
25 static ULONG WINAPI FileMonikerImpl_AddRef(IMoniker* iface);
26 static ULONG WINAPI FileMonikerImpl_Release(IMoniker* iface);
27 static HRESULT WINAPI FileMonikerImpl_GetClassID(const IMoniker* iface, CLSID *pClassID);
28 static HRESULT WINAPI FileMonikerImpl_IsDirty(IMoniker* iface);
29 static HRESULT WINAPI FileMonikerImpl_Load(IMoniker* iface, IStream* pStm);
30 static HRESULT WINAPI FileMonikerImpl_Save(IMoniker* iface, IStream* pStm, BOOL fClearDirty);
31 static HRESULT WINAPI FileMonikerImpl_GetSizeMax(IMoniker* iface, ULARGE_INTEGER* pcbSize);
32 static HRESULT WINAPI FileMonikerImpl_BindToObject(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult);
33 static HRESULT WINAPI FileMonikerImpl_BindToStorage(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult);
34 static HRESULT WINAPI FileMonikerImpl_Reduce(IMoniker* iface,IBindCtx* pbc, DWORD dwReduceHowFar,IMoniker** ppmkToLeft, IMoniker** ppmkReduced);
35 static HRESULT WINAPI FileMonikerImpl_ComposeWith(IMoniker* iface,IMoniker* pmkRight,BOOL fOnlyIfNotGeneric, IMoniker** ppmkComposite);
36 static HRESULT WINAPI FileMonikerImpl_Enum(IMoniker* iface,BOOL fForward, IEnumMoniker** ppenumMoniker);
37 static HRESULT WINAPI FileMonikerImpl_IsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker);
38 static HRESULT WINAPI FileMonikerImpl_Hash(IMoniker* iface,DWORD* pdwHash);
39 static HRESULT WINAPI FileMonikerImpl_IsRunning(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, IMoniker* pmkNewlyRunning);
40 static HRESULT WINAPI FileMonikerImpl_GetTimeOfLastChange(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft, FILETIME* pFileTime);
41 static HRESULT WINAPI FileMonikerImpl_Inverse(IMoniker* iface,IMoniker** ppmk);
42 static HRESULT WINAPI FileMonikerImpl_CommonPrefixWith(IMoniker* iface,IMoniker* pmkOther, IMoniker** ppmkPrefix);
43 static HRESULT WINAPI FileMonikerImpl_RelativePathTo(IMoniker* iface,IMoniker* pmOther, IMoniker** ppmkRelPath);
44 static HRESULT WINAPI FileMonikerImpl_GetDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR *ppszDisplayName);
45 static HRESULT WINAPI FileMonikerImpl_ParseDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut);
46 static HRESULT WINAPI FileMonikerImpl_IsSystemMoniker(IMoniker* iface,DWORD* pwdMksys);
48 static HRESULT WINAPI FileMonikerImpl_Construct(FileMonikerImpl* iface, LPCOLESTR lpszPathName);
49 static HRESULT WINAPI FileMonikerImpl_Destroy(FileMonikerImpl* iface);
51 // Virtual function table for the FileMonikerImpl class.
52 static ICOM_VTABLE(IMoniker) VT_FileMonikerImpl =
54 FileMonikerImpl_QueryInterface,
55 FileMonikerImpl_AddRef,
56 FileMonikerImpl_Release,
57 FileMonikerImpl_GetClassID,
58 FileMonikerImpl_IsDirty,
59 FileMonikerImpl_Load,
60 FileMonikerImpl_Save,
61 FileMonikerImpl_GetSizeMax,
62 FileMonikerImpl_BindToObject,
63 FileMonikerImpl_BindToStorage,
64 FileMonikerImpl_Reduce,
65 FileMonikerImpl_ComposeWith,
66 FileMonikerImpl_Enum,
67 FileMonikerImpl_IsEqual,
68 FileMonikerImpl_Hash,
69 FileMonikerImpl_IsRunning,
70 FileMonikerImpl_GetTimeOfLastChange,
71 FileMonikerImpl_Inverse,
72 FileMonikerImpl_CommonPrefixWith,
73 FileMonikerImpl_RelativePathTo,
74 FileMonikerImpl_GetDisplayName,
75 FileMonikerImpl_ParseDisplayName,
76 FileMonikerImpl_IsSystemMoniker
79 /*******************************************************************************
80 * FileMoniker_QueryInterface
81 *******************************************************************************/
82 HRESULT WINAPI FileMonikerImpl_QueryInterface(IMoniker* iface,REFIID riid,void** ppvObject)
84 FileMonikerImpl* This=(FileMonikerImpl*)iface;
85 TRACE(ole,"(%p,%p,%p)\n",This,riid,ppvObject);
87 // Perform a sanity check on the parameters.
88 if ( (This==0) || (ppvObject==0) ) return E_INVALIDARG;
90 // Initialize the return parameter.
91 *ppvObject = 0;
93 // Compare the riid with the interface IDs implemented by this object.
94 if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0)
95 *ppvObject = (IMoniker*)This;
96 else
97 if (memcmp(&IID_IPersist, riid, sizeof(IID_IPersist)) == 0)
98 *ppvObject = (IMoniker*)This;
99 else
100 if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0)
101 *ppvObject = (IMoniker*)This;
102 else
103 if (memcmp(&IID_IMoniker, riid, sizeof(IID_IMoniker)) == 0)
104 *ppvObject = (IMoniker*)This;
106 // Check that we obtained an interface.
107 if ((*ppvObject)==0) return E_NOINTERFACE;
109 // Query Interface always increases the reference count by one when it is successful
110 FileMonikerImpl_AddRef(iface);
112 return S_OK;;
115 /******************************************************************************
116 * FileMoniker_AddRef
117 ******************************************************************************/
118 ULONG WINAPI FileMonikerImpl_AddRef(IMoniker* iface)
120 FileMonikerImpl* This=(FileMonikerImpl*)iface;
122 TRACE(ole,"(%p)\n",This);
124 return ++(This->ref);
127 /******************************************************************************
128 * FileMoniker_Release
129 ******************************************************************************/
130 ULONG WINAPI FileMonikerImpl_Release(IMoniker* iface)
132 FileMonikerImpl* This=(FileMonikerImpl*)iface;
134 TRACE(ole,"(%p)\n",This);
136 This->ref--;
138 if (This->ref==0){
139 FileMonikerImpl_Destroy(This);
140 return 0;
142 return This->ref;;
145 /******************************************************************************
146 * FileMoniker_GetClassID
147 ******************************************************************************/
148 HRESULT WINAPI FileMonikerImpl_GetClassID(const IMoniker* iface, CLSID *pClassID)//Pointer to CLSID of object
150 FileMonikerImpl* This=(FileMonikerImpl*)iface;
152 FIXME(ole,"(%p,%p),stub!\n",This,pClassID);
154 return E_NOTIMPL;
157 /******************************************************************************
158 * FileMoniker_IsDirty
159 ******************************************************************************/
160 HRESULT WINAPI FileMonikerImpl_IsDirty(IMoniker* iface)
162 FileMonikerImpl* This=(FileMonikerImpl*)iface;
164 FIXME(ole,"(%p),stub!\n",This);
166 return E_NOTIMPL;
169 /******************************************************************************
170 * FileMoniker_Load
171 ******************************************************************************/
172 HRESULT WINAPI FileMonikerImpl_Load(
173 IMoniker* iface,
174 IStream* pStm)
176 FileMonikerImpl* This=(FileMonikerImpl*)iface;
178 FIXME(ole,"(%p,%p),stub!\n",This,pStm);
180 return E_NOTIMPL;
183 /******************************************************************************
184 * FileMoniker_Save
185 ******************************************************************************/
186 HRESULT WINAPI FileMonikerImpl_Save(
187 IMoniker* iface,
188 IStream* pStm,
189 BOOL fClearDirty)
191 FileMonikerImpl* This=(FileMonikerImpl*)iface;
193 FIXME(ole,"(%p,%p,%d),stub!\n",This,pStm,fClearDirty);
195 return E_NOTIMPL;
198 /******************************************************************************
199 * FileMoniker_GetSizeMax
200 ******************************************************************************/
201 HRESULT WINAPI FileMonikerImpl_GetSizeMax(
202 IMoniker* iface,
203 ULARGE_INTEGER* pcbSize)
205 FileMonikerImpl* This=(FileMonikerImpl*)iface;
207 FIXME(ole,"(%p,%p),stub!\n",This,pcbSize);
209 return E_NOTIMPL;
212 /******************************************************************************
213 * FileMoniker_Construct
214 *******************************************************************************/
215 HRESULT WINAPI FileMonikerImpl_Construct(FileMonikerImpl* This, LPCOLESTR lpszPathName){
217 FIXME(ole,"(%p,%p),stub!\n",This,lpszPathName);
219 memset(This, 0, sizeof(FileMonikerImpl));
221 //Initialize the virtual fgunction table.
222 This->lpvtbl = &VT_FileMonikerImpl;
223 return S_OK;
226 /******************************************************************************
227 * FileMoniker_Destroy
228 *******************************************************************************/
229 HRESULT WINAPI FileMonikerImpl_Destroy(FileMonikerImpl* This){
231 FIXME(ole,"(%p),stub!\n",This);
233 SEGPTR_FREE(This);
234 return S_OK;
237 /******************************************************************************
238 * FileMoniker_BindToObject
239 ******************************************************************************/
240 HRESULT WINAPI FileMonikerImpl_BindToObject(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft,
241 REFIID riid, VOID** ppvResult)
243 FileMonikerImpl* This=(FileMonikerImpl*)iface;
245 FIXME(ole,"(%p,%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,riid,ppvResult);
247 return E_NOTIMPL;
250 /******************************************************************************
251 * FileMoniker_BindToStorage
252 ******************************************************************************/
253 HRESULT WINAPI FileMonikerImpl_BindToStorage(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft,
254 REFIID riid, VOID** ppvResult)
256 FileMonikerImpl* This=(FileMonikerImpl*)iface;
258 FIXME(ole,"(%p,%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,riid,ppvResult);
260 return E_NOTIMPL;
263 /******************************************************************************
264 * FileMoniker_Reduce
265 ******************************************************************************/
266 HRESULT WINAPI FileMonikerImpl_Reduce(IMoniker* iface,IBindCtx* pbc, DWORD dwReduceHowFar,
267 IMoniker** ppmkToLeft, IMoniker** ppmkReduced)
269 FileMonikerImpl* This=(FileMonikerImpl*)iface;
271 FIXME(ole,"(%p,%p,%ld,%p,%p),stub!\n",This,pbc,dwReduceHowFar,ppmkToLeft,ppmkReduced);
273 return E_NOTIMPL;
276 /******************************************************************************
277 * FileMoniker_ComposeWith
278 ******************************************************************************/
279 HRESULT WINAPI FileMonikerImpl_ComposeWith(IMoniker* iface,IMoniker* pmkRight,BOOL fOnlyIfNotGeneric,
280 IMoniker** ppmkComposite)
282 FileMonikerImpl* This=(FileMonikerImpl*)iface;
284 FIXME(ole,"(%p,%p,%d,%p),stub!\n",This,pmkRight,fOnlyIfNotGeneric,ppmkComposite);
286 return E_NOTIMPL;
289 /******************************************************************************
290 * FileMoniker_Enum
291 ******************************************************************************/
292 HRESULT WINAPI FileMonikerImpl_Enum(IMoniker* iface,BOOL fForward, IEnumMoniker** ppenumMoniker)
294 FileMonikerImpl* This=(FileMonikerImpl*)iface;
296 FIXME(ole,"(%p,%d,%p),stub!\n",This,fForward,ppenumMoniker);
298 return E_NOTIMPL;
302 /******************************************************************************
303 * FileMoniker_IsEqual
304 ******************************************************************************/
305 HRESULT WINAPI FileMonikerImpl_IsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker)
307 FileMonikerImpl* This=(FileMonikerImpl*)iface;
309 FIXME(ole,"(%p,%p),stub!\n",This,pmkOtherMoniker);
311 return E_NOTIMPL;
314 /******************************************************************************
315 * FileMoniker_Hash
316 ******************************************************************************/
317 HRESULT WINAPI FileMonikerImpl_Hash(IMoniker* iface,DWORD* pdwHash)
319 FileMonikerImpl* This=(FileMonikerImpl*)iface;
321 FIXME(ole,"(%p,%p),stub!\n",This,pdwHash);
323 return E_NOTIMPL;
326 /******************************************************************************
327 * FileMoniker_IsRunning
328 ******************************************************************************/
329 HRESULT WINAPI FileMonikerImpl_IsRunning(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft,
330 IMoniker* pmkNewlyRunning)
332 FileMonikerImpl* This=(FileMonikerImpl*)iface;
334 FIXME(ole,"(%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,pmkNewlyRunning);
336 return E_NOTIMPL;
339 /******************************************************************************
340 * FileMoniker_GetTimeOfLastChange
341 ******************************************************************************/
342 HRESULT WINAPI FileMonikerImpl_GetTimeOfLastChange(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft,
343 FILETIME* pFileTime)
345 FileMonikerImpl* This=(FileMonikerImpl*)iface;
347 FIXME(ole,"(%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,pFileTime);
349 return E_NOTIMPL;
352 /******************************************************************************
353 * FileMoniker_Inverse
354 ******************************************************************************/
355 HRESULT WINAPI FileMonikerImpl_Inverse(IMoniker* iface,IMoniker** ppmk)
357 FileMonikerImpl* This=(FileMonikerImpl*)iface;
359 FIXME(ole,"(%p,%p),stub!\n",This,ppmk);
361 return E_NOTIMPL;
364 /******************************************************************************
365 * FileMoniker_CommonPrefixWith
366 ******************************************************************************/
367 HRESULT WINAPI FileMonikerImpl_CommonPrefixWith(IMoniker* iface,IMoniker* pmkOther,
368 IMoniker** ppmkPrefix)
370 FileMonikerImpl* This=(FileMonikerImpl*)iface;
372 FIXME(ole,"(%p,%p,%p),stub!\n",This,pmkOther,ppmkPrefix);
374 return E_NOTIMPL;
377 /******************************************************************************
378 * FileMoniker_RelativePathTo
379 ******************************************************************************/
380 HRESULT WINAPI FileMonikerImpl_RelativePathTo(IMoniker* iface,IMoniker* pmOther, IMoniker** ppmkRelPath)
382 FileMonikerImpl* This=(FileMonikerImpl*)iface;
384 FIXME(ole,"(%p,%p,%p),stub!\n",This,pmOther,ppmkRelPath);
386 return E_NOTIMPL;
389 /******************************************************************************
390 * FileMoniker_GetDisplayName
391 ******************************************************************************/
392 HRESULT WINAPI FileMonikerImpl_GetDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft,
393 LPOLESTR *ppszDisplayName)
395 FileMonikerImpl* This=(FileMonikerImpl*)iface;
397 FIXME(ole,"(%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,ppszDisplayName);
399 return E_NOTIMPL;
402 /******************************************************************************
403 * FileMoniker_ParseDisplayName
404 ******************************************************************************/
405 HRESULT WINAPI FileMonikerImpl_ParseDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft,
406 LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut)
408 FileMonikerImpl* This=(FileMonikerImpl*)iface;
410 FIXME(ole,"(%p,%p,%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,pszDisplayName,pchEaten,ppmkOut);
412 return E_NOTIMPL;
415 /******************************************************************************
416 * FileMoniker_IsSystemMonker
417 ******************************************************************************/
418 HRESULT WINAPI FileMonikerImpl_IsSystemMoniker(IMoniker* iface,DWORD* pwdMksys)
420 FileMonikerImpl* This=(FileMonikerImpl*)iface;
422 FIXME(ole,"(%p,%p),stub!\n",This,pwdMksys);
424 return E_NOTIMPL;
427 /******************************************************************************
428 * CreateFileMoniker16
429 ******************************************************************************/
430 HRESULT WINAPI CreateFileMoniker16(LPCOLESTR16 lpszPathName,LPMONIKER* ppmk){
432 FIXME(ole,"(%s,%p),stub!\n",lpszPathName,ppmk);
434 return E_NOTIMPL;
437 /******************************************************************************
438 * CreateFileMoniker32
439 ******************************************************************************/
440 HRESULT WINAPI CreateFileMoniker(LPCOLESTR lpszPathName, LPMONIKER * ppmk)
442 FileMonikerImpl* newFileMoniker = 0;
443 HRESULT hr = S_OK;
445 TRACE(ole,"(%p,%p)\n",lpszPathName,ppmk);
447 newFileMoniker = HeapAlloc(GetProcessHeap(), 0, sizeof(FileMonikerImpl));
449 if (newFileMoniker == 0)
450 return STG_E_INSUFFICIENTMEMORY;
452 hr = FileMonikerImpl_Construct(newFileMoniker,lpszPathName);
454 if (FAILED(hr))
455 return hr;
457 hr = FileMonikerImpl_QueryInterface((IMoniker*)newFileMoniker,&IID_IMoniker,(void**)ppmk);
459 return hr;