1 /***************************************************************************************
2 * FileMonikers implementation
4 * Copyright 1999 Noomen Hamza
5 ***************************************************************************************/
11 #include "wine/obj_moniker.h"
16 typedef struct FileMonikerImpl
{
18 ICOM_VTABLE(IMoniker
)* lpvtbl
;
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
,
61 FileMonikerImpl_GetSizeMax
,
62 FileMonikerImpl_BindToObject
,
63 FileMonikerImpl_BindToStorage
,
64 FileMonikerImpl_Reduce
,
65 FileMonikerImpl_ComposeWith
,
67 FileMonikerImpl_IsEqual
,
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.
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
;
97 if (memcmp(&IID_IPersist
, riid
, sizeof(IID_IPersist
)) == 0)
98 *ppvObject
= (IMoniker
*)This
;
100 if (memcmp(&IID_IPersistStream
, riid
, sizeof(IID_IPersistStream
)) == 0)
101 *ppvObject
= (IMoniker
*)This
;
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
);
115 /******************************************************************************
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
);
139 FileMonikerImpl_Destroy(This
);
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
);
157 /******************************************************************************
158 * FileMoniker_IsDirty
159 ******************************************************************************/
160 HRESULT WINAPI
FileMonikerImpl_IsDirty(IMoniker
* iface
)
162 FileMonikerImpl
* This
=(FileMonikerImpl
*)iface
;
164 FIXME(ole
,"(%p),stub!\n",This
);
169 /******************************************************************************
171 ******************************************************************************/
172 HRESULT WINAPI
FileMonikerImpl_Load(
176 FileMonikerImpl
* This
=(FileMonikerImpl
*)iface
;
178 FIXME(ole
,"(%p,%p),stub!\n",This
,pStm
);
183 /******************************************************************************
185 ******************************************************************************/
186 HRESULT WINAPI
FileMonikerImpl_Save(
191 FileMonikerImpl
* This
=(FileMonikerImpl
*)iface
;
193 FIXME(ole
,"(%p,%p,%d),stub!\n",This
,pStm
,fClearDirty
);
198 /******************************************************************************
199 * FileMoniker_GetSizeMax
200 ******************************************************************************/
201 HRESULT WINAPI
FileMonikerImpl_GetSizeMax(
203 ULARGE_INTEGER
* pcbSize
)
205 FileMonikerImpl
* This
=(FileMonikerImpl
*)iface
;
207 FIXME(ole
,"(%p,%p),stub!\n",This
,pcbSize
);
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
;
226 /******************************************************************************
227 * FileMoniker_Destroy
228 *******************************************************************************/
229 HRESULT WINAPI
FileMonikerImpl_Destroy(FileMonikerImpl
* This
){
231 FIXME(ole
,"(%p),stub!\n",This
);
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
);
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
);
263 /******************************************************************************
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
);
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
);
289 /******************************************************************************
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
);
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
);
314 /******************************************************************************
316 ******************************************************************************/
317 HRESULT WINAPI
FileMonikerImpl_Hash(IMoniker
* iface
,DWORD
* pdwHash
)
319 FileMonikerImpl
* This
=(FileMonikerImpl
*)iface
;
321 FIXME(ole
,"(%p,%p),stub!\n",This
,pdwHash
);
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
);
339 /******************************************************************************
340 * FileMoniker_GetTimeOfLastChange
341 ******************************************************************************/
342 HRESULT WINAPI
FileMonikerImpl_GetTimeOfLastChange(IMoniker
* iface
, IBindCtx
* pbc
, IMoniker
* pmkToLeft
,
345 FileMonikerImpl
* This
=(FileMonikerImpl
*)iface
;
347 FIXME(ole
,"(%p,%p,%p,%p),stub!\n",This
,pbc
,pmkToLeft
,pFileTime
);
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
);
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
);
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
);
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
);
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
);
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
);
427 /******************************************************************************
428 * CreateFileMoniker16
429 ******************************************************************************/
430 HRESULT WINAPI
CreateFileMoniker16(LPCOLESTR16 lpszPathName
,LPMONIKER
* ppmk
){
432 FIXME(ole
,"(%s,%p),stub!\n",lpszPathName
,ppmk
);
437 /******************************************************************************
438 * CreateFileMoniker32
439 ******************************************************************************/
440 HRESULT WINAPI
CreateFileMoniker(LPCOLESTR lpszPathName
, LPMONIKER
* ppmk
)
442 FileMonikerImpl
* newFileMoniker
= 0;
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
);
457 hr
= FileMonikerImpl_QueryInterface((IMoniker
*)newFileMoniker
,&IID_IMoniker
,(void**)ppmk
);