Handle the %f case in wsprintf.
[wine.git] / dlls / ole32 / antimoniker.c
blob0af9a64f746738b35839bf3c17f0e84ee7b99e23
1 /***************************************************************************************
2 * AntiMonikers implementation
4 * Copyright 1999 Noomen Hamza
5 ***************************************************************************************/
7 #include <assert.h>
8 #include <string.h>
9 #include "winbase.h"
10 #include "winerror.h"
11 #include "wine/unicode.h"
12 #include "wine/obj_base.h"
13 #include "wine/obj_misc.h"
14 #include "wine/obj_storage.h"
15 #include "wine/obj_moniker.h"
16 #include "debugtools.h"
18 DEFAULT_DEBUG_CHANNEL(ole);
20 /* AntiMoniker data structure */
21 typedef struct AntiMonikerImpl{
23 ICOM_VTABLE(IMoniker)* lpvtbl1; /* VTable relative to the IMoniker interface.*/
25 /* The ROT (RunningObjectTable implementation) uses the IROTData interface to test whether
26 * two monikers are equal. That's whay IROTData interface is implemented by monikers.
28 ICOM_VTABLE(IROTData)* lpvtbl2; /* VTable relative to the IROTData interface.*/
30 ULONG ref; /* reference counter for this object */
32 } AntiMonikerImpl;
34 /********************************************************************************/
35 /* AntiMoniker prototype functions : */
37 /* IUnknown prototype functions */
38 static HRESULT WINAPI AntiMonikerImpl_QueryInterface(IMoniker* iface,REFIID riid,void** ppvObject);
39 static ULONG WINAPI AntiMonikerImpl_AddRef(IMoniker* iface);
40 static ULONG WINAPI AntiMonikerImpl_Release(IMoniker* iface);
42 /* IPersist prototype functions */
43 static HRESULT WINAPI AntiMonikerImpl_GetClassID(IMoniker* iface, CLSID *pClassID);
45 /* IPersistStream prototype functions */
46 static HRESULT WINAPI AntiMonikerImpl_IsDirty(IMoniker* iface);
47 static HRESULT WINAPI AntiMonikerImpl_Load(IMoniker* iface, IStream* pStm);
48 static HRESULT WINAPI AntiMonikerImpl_Save(IMoniker* iface, IStream* pStm, BOOL fClearDirty);
49 static HRESULT WINAPI AntiMonikerImpl_GetSizeMax(IMoniker* iface, ULARGE_INTEGER* pcbSize);
51 /* IMoniker prototype functions */
52 static HRESULT WINAPI AntiMonikerImpl_BindToObject(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult);
53 static HRESULT WINAPI AntiMonikerImpl_BindToStorage(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult);
54 static HRESULT WINAPI AntiMonikerImpl_Reduce(IMoniker* iface,IBindCtx* pbc, DWORD dwReduceHowFar,IMoniker** ppmkToLeft, IMoniker** ppmkReduced);
55 static HRESULT WINAPI AntiMonikerImpl_ComposeWith(IMoniker* iface,IMoniker* pmkRight,BOOL fOnlyIfNotGeneric, IMoniker** ppmkComposite);
56 static HRESULT WINAPI AntiMonikerImpl_Enum(IMoniker* iface,BOOL fForward, IEnumMoniker** ppenumMoniker);
57 static HRESULT WINAPI AntiMonikerImpl_IsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker);
58 static HRESULT WINAPI AntiMonikerImpl_Hash(IMoniker* iface,DWORD* pdwHash);
59 static HRESULT WINAPI AntiMonikerImpl_IsRunning(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, IMoniker* pmkNewlyRunning);
60 static HRESULT WINAPI AntiMonikerImpl_GetTimeOfLastChange(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft, FILETIME* pAntiTime);
61 static HRESULT WINAPI AntiMonikerImpl_Inverse(IMoniker* iface,IMoniker** ppmk);
62 static HRESULT WINAPI AntiMonikerImpl_CommonPrefixWith(IMoniker* iface,IMoniker* pmkOther, IMoniker** ppmkPrefix);
63 static HRESULT WINAPI AntiMonikerImpl_RelativePathTo(IMoniker* iface,IMoniker* pmOther, IMoniker** ppmkRelPath);
64 static HRESULT WINAPI AntiMonikerImpl_GetDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR *ppszDisplayName);
65 static HRESULT WINAPI AntiMonikerImpl_ParseDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut);
66 static HRESULT WINAPI AntiMonikerImpl_IsSystemMoniker(IMoniker* iface,DWORD* pwdMksys);
68 /********************************************************************************/
69 /* IROTData prototype functions */
71 /* IUnknown prototype functions */
72 static HRESULT WINAPI AntiMonikerROTDataImpl_QueryInterface(IROTData* iface,REFIID riid,VOID** ppvObject);
73 static ULONG WINAPI AntiMonikerROTDataImpl_AddRef(IROTData* iface);
74 static ULONG WINAPI AntiMonikerROTDataImpl_Release(IROTData* iface);
76 /* IROTData prototype function */
77 static HRESULT WINAPI AntiMonikerROTDataImpl_GetComparaisonData(IROTData* iface,BYTE* pbData,ULONG cbMax,ULONG* pcbData);
79 /* Local function used by AntiMoniker implementation */
80 HRESULT WINAPI AntiMonikerImpl_Construct(AntiMonikerImpl* iface);
81 HRESULT WINAPI AntiMonikerImpl_Destroy(AntiMonikerImpl* iface);
83 /********************************************************************************/
84 /* Virtual function table for the AntiMonikerImpl class which include IPersist,*/
85 /* IPersistStream and IMoniker functions. */
86 static ICOM_VTABLE(IMoniker) VT_AntiMonikerImpl =
88 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
89 AntiMonikerImpl_QueryInterface,
90 AntiMonikerImpl_AddRef,
91 AntiMonikerImpl_Release,
92 AntiMonikerImpl_GetClassID,
93 AntiMonikerImpl_IsDirty,
94 AntiMonikerImpl_Load,
95 AntiMonikerImpl_Save,
96 AntiMonikerImpl_GetSizeMax,
97 AntiMonikerImpl_BindToObject,
98 AntiMonikerImpl_BindToStorage,
99 AntiMonikerImpl_Reduce,
100 AntiMonikerImpl_ComposeWith,
101 AntiMonikerImpl_Enum,
102 AntiMonikerImpl_IsEqual,
103 AntiMonikerImpl_Hash,
104 AntiMonikerImpl_IsRunning,
105 AntiMonikerImpl_GetTimeOfLastChange,
106 AntiMonikerImpl_Inverse,
107 AntiMonikerImpl_CommonPrefixWith,
108 AntiMonikerImpl_RelativePathTo,
109 AntiMonikerImpl_GetDisplayName,
110 AntiMonikerImpl_ParseDisplayName,
111 AntiMonikerImpl_IsSystemMoniker
114 /********************************************************************************/
115 /* Virtual function table for the IROTData class. */
116 static ICOM_VTABLE(IROTData) VT_ROTDataImpl =
118 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
119 AntiMonikerROTDataImpl_QueryInterface,
120 AntiMonikerROTDataImpl_AddRef,
121 AntiMonikerROTDataImpl_Release,
122 AntiMonikerROTDataImpl_GetComparaisonData
125 /*******************************************************************************
126 * AntiMoniker_QueryInterface
127 *******************************************************************************/
128 HRESULT WINAPI AntiMonikerImpl_QueryInterface(IMoniker* iface,REFIID riid,void** ppvObject)
130 ICOM_THIS(AntiMonikerImpl,iface);
132 TRACE("(%p,%p,%p)\n",This,riid,ppvObject);
134 /* Perform a sanity check on the parameters.*/
135 if ( (This==0) || (ppvObject==0) )
136 return E_INVALIDARG;
138 /* Initialize the return parameter */
139 *ppvObject = 0;
141 /* Compare the riid with the interface IDs implemented by this object.*/
142 if (IsEqualIID(&IID_IUnknown, riid) ||
143 IsEqualIID(&IID_IPersist, riid) ||
144 IsEqualIID(&IID_IPersistStream, riid) ||
145 IsEqualIID(&IID_IMoniker, riid)
147 *ppvObject = iface;
148 else if (IsEqualIID(&IID_IROTData, riid))
149 *ppvObject = (IROTData*)&(This->lpvtbl2);
151 /* Check that we obtained an interface.*/
152 if ((*ppvObject)==0)
153 return E_NOINTERFACE;
155 /* Query Interface always increases the reference count by one when it is successful */
156 AntiMonikerImpl_AddRef(iface);
158 return S_OK;
161 /******************************************************************************
162 * AntiMoniker_AddRef
163 ******************************************************************************/
164 ULONG WINAPI AntiMonikerImpl_AddRef(IMoniker* iface)
166 ICOM_THIS(AntiMonikerImpl,iface);
168 TRACE("(%p)\n",This);
170 return ++(This->ref);
173 /******************************************************************************
174 * AntiMoniker_Release
175 ******************************************************************************/
176 ULONG WINAPI AntiMonikerImpl_Release(IMoniker* iface)
178 ICOM_THIS(AntiMonikerImpl,iface);
180 TRACE("(%p)\n",This);
182 This->ref--;
184 /* destroy the object if there's no more reference on it */
185 if (This->ref==0){
187 AntiMonikerImpl_Destroy(This);
189 return 0;
191 return This->ref;;
194 /******************************************************************************
195 * AntiMoniker_GetClassID
196 ******************************************************************************/
197 HRESULT WINAPI AntiMonikerImpl_GetClassID(IMoniker* iface,CLSID *pClassID)
199 TRACE("(%p,%p),stub!\n",iface,pClassID);
201 if (pClassID==NULL)
202 return E_POINTER;
204 *pClassID = CLSID_AntiMoniker;
206 return S_OK;
209 /******************************************************************************
210 * AntiMoniker_IsDirty
211 ******************************************************************************/
212 HRESULT WINAPI AntiMonikerImpl_IsDirty(IMoniker* iface)
214 /* Note that the OLE-provided implementations of the IPersistStream::IsDirty
215 method in the OLE-provided moniker interfaces always return S_FALSE because
216 their internal state never changes. */
218 TRACE("(%p)\n",iface);
220 return S_FALSE;
223 /******************************************************************************
224 * AntiMoniker_Load
225 ******************************************************************************/
226 HRESULT WINAPI AntiMonikerImpl_Load(IMoniker* iface,IStream* pStm)
228 DWORD constant=1,dwbuffer;
229 HRESULT res;
231 /* data read by this function is only a DWORD constant (must be 1) ! */
232 res=IStream_Read(pStm,&dwbuffer,sizeof(DWORD),NULL);
234 if (SUCCEEDED(res)&& dwbuffer!=constant)
235 return E_FAIL;
237 return res;
240 /******************************************************************************
241 * AntiMoniker_Save
242 ******************************************************************************/
243 HRESULT WINAPI AntiMonikerImpl_Save(IMoniker* iface,IStream* pStm,BOOL fClearDirty)
245 DWORD constant=1;
246 HRESULT res;
248 /* data writen by this function is only a DWORD constant seted to 1 ! */
249 res=IStream_Write(pStm,&constant,sizeof(constant),NULL);
251 return res;
254 /******************************************************************************
255 * AntiMoniker_GetSizeMax
256 ******************************************************************************/
257 HRESULT WINAPI AntiMonikerImpl_GetSizeMax(IMoniker* iface,
258 ULARGE_INTEGER* pcbSize)/* Pointer to size of stream needed to save object */
260 TRACE("(%p,%p)\n",iface,pcbSize);
262 if (pcbSize!=NULL)
263 return E_POINTER;
265 /* for more details see AntiMonikerImpl_Save coments */
267 /* Normaly the sizemax must be the size of DWORD ! but I tested this function it ususlly return 16 bytes */
268 /* more than the number of bytes used by AntiMoniker::Save function */
269 pcbSize->s.LowPart = sizeof(DWORD)+16;
271 pcbSize->s.HighPart=0;
273 return S_OK;
276 /******************************************************************************
277 * AntiMoniker_Construct (local function)
278 *******************************************************************************/
279 HRESULT WINAPI AntiMonikerImpl_Construct(AntiMonikerImpl* This)
282 TRACE("(%p)\n",This);
284 /* Initialize the virtual fgunction table. */
285 This->lpvtbl1 = &VT_AntiMonikerImpl;
286 This->lpvtbl2 = &VT_ROTDataImpl;
287 This->ref = 0;
289 return S_OK;
292 /******************************************************************************
293 * AntiMoniker_Destroy (local function)
294 *******************************************************************************/
295 HRESULT WINAPI AntiMonikerImpl_Destroy(AntiMonikerImpl* This)
297 TRACE("(%p)\n",This);
299 return HeapFree(GetProcessHeap(),0,This);
302 /******************************************************************************
303 * AntiMoniker_BindToObject
304 ******************************************************************************/
305 HRESULT WINAPI AntiMonikerImpl_BindToObject(IMoniker* iface,
306 IBindCtx* pbc,
307 IMoniker* pmkToLeft,
308 REFIID riid,
309 VOID** ppvResult)
311 TRACE("(%p,%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,riid,ppvResult);
312 return E_NOTIMPL;
315 /******************************************************************************
316 * AntiMoniker_BindToStorage
317 ******************************************************************************/
318 HRESULT WINAPI AntiMonikerImpl_BindToStorage(IMoniker* iface,
319 IBindCtx* pbc,
320 IMoniker* pmkToLeft,
321 REFIID riid,
322 VOID** ppvResult)
324 TRACE("(%p,%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,riid,ppvResult);
325 return E_NOTIMPL;
328 /******************************************************************************
329 * AntiMoniker_Reduce
330 ******************************************************************************/
331 HRESULT WINAPI AntiMonikerImpl_Reduce(IMoniker* iface,
332 IBindCtx* pbc,
333 DWORD dwReduceHowFar,
334 IMoniker** ppmkToLeft,
335 IMoniker** ppmkReduced)
337 TRACE("(%p,%p,%ld,%p,%p)\n",iface,pbc,dwReduceHowFar,ppmkToLeft,ppmkReduced);
339 if (ppmkReduced==NULL)
340 return E_POINTER;
342 AntiMonikerImpl_AddRef(iface);
344 *ppmkReduced=iface;
346 return MK_S_REDUCED_TO_SELF;
348 /******************************************************************************
349 * AntiMoniker_ComposeWith
350 ******************************************************************************/
351 HRESULT WINAPI AntiMonikerImpl_ComposeWith(IMoniker* iface,
352 IMoniker* pmkRight,
353 BOOL fOnlyIfNotGeneric,
354 IMoniker** ppmkComposite)
357 TRACE("(%p,%p,%d,%p)\n",iface,pmkRight,fOnlyIfNotGeneric,ppmkComposite);
359 if ((ppmkComposite==NULL)||(pmkRight==NULL))
360 return E_POINTER;
362 *ppmkComposite=0;
364 if (fOnlyIfNotGeneric)
365 return MK_E_NEEDGENERIC;
366 else
367 return CreateGenericComposite(iface,pmkRight,ppmkComposite);
370 /******************************************************************************
371 * AntiMoniker_Enum
372 ******************************************************************************/
373 HRESULT WINAPI AntiMonikerImpl_Enum(IMoniker* iface,BOOL fForward, IEnumMoniker** ppenumMoniker)
375 TRACE("(%p,%d,%p)\n",iface,fForward,ppenumMoniker);
377 if (ppenumMoniker == NULL)
378 return E_POINTER;
380 *ppenumMoniker = NULL;
382 return S_OK;
385 /******************************************************************************
386 * AntiMoniker_IsEqual
387 ******************************************************************************/
388 HRESULT WINAPI AntiMonikerImpl_IsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker)
390 DWORD mkSys;
392 TRACE("(%p,%p)\n",iface,pmkOtherMoniker);
394 if (pmkOtherMoniker==NULL)
395 return S_FALSE;
397 IMoniker_IsSystemMoniker(pmkOtherMoniker,&mkSys);
399 if (mkSys==MKSYS_ANTIMONIKER)
400 return S_OK;
401 else
402 return S_FALSE;
405 /******************************************************************************
406 * AntiMoniker_Hash
407 ******************************************************************************/
408 HRESULT WINAPI AntiMonikerImpl_Hash(IMoniker* iface,DWORD* pdwHash)
410 if (pdwHash==NULL)
411 return E_POINTER;
413 *pdwHash=0;
415 return S_OK;
418 /******************************************************************************
419 * AntiMoniker_IsRunning
420 ******************************************************************************/
421 HRESULT WINAPI AntiMonikerImpl_IsRunning(IMoniker* iface,
422 IBindCtx* pbc,
423 IMoniker* pmkToLeft,
424 IMoniker* pmkNewlyRunning)
426 IRunningObjectTable* rot;
427 HRESULT res;
429 TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pmkNewlyRunning);
431 if (pbc==NULL)
432 return E_INVALIDARG;
434 res=IBindCtx_GetRunningObjectTable(pbc,&rot);
436 if (FAILED(res))
437 return res;
439 res = IRunningObjectTable_IsRunning(rot,iface);
441 IRunningObjectTable_Release(rot);
443 return res;
446 /******************************************************************************
447 * AntiMoniker_GetTimeOfLastChange
448 ******************************************************************************/
449 HRESULT WINAPI AntiMonikerImpl_GetTimeOfLastChange(IMoniker* iface,
450 IBindCtx* pbc,
451 IMoniker* pmkToLeft,
452 FILETIME* pAntiTime)
454 TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pAntiTime);
455 return E_NOTIMPL;
458 /******************************************************************************
459 * AntiMoniker_Inverse
460 ******************************************************************************/
461 HRESULT WINAPI AntiMonikerImpl_Inverse(IMoniker* iface,IMoniker** ppmk)
463 TRACE("(%p,%p)\n",iface,ppmk);
465 if (ppmk==NULL)
466 return E_POINTER;
468 *ppmk=0;
470 return MK_E_NOINVERSE;
473 /******************************************************************************
474 * AntiMoniker_CommonPrefixWith
475 ******************************************************************************/
476 HRESULT WINAPI AntiMonikerImpl_CommonPrefixWith(IMoniker* iface,IMoniker* pmkOther,IMoniker** ppmkPrefix)
478 DWORD mkSys;
480 IMoniker_IsSystemMoniker(pmkOther,&mkSys);
482 if(mkSys==MKSYS_ITEMMONIKER){
484 IMoniker_AddRef(iface);
486 *ppmkPrefix=iface;
488 IMoniker_AddRef(iface);
490 return MK_S_US;
492 else
493 return MonikerCommonPrefixWith(iface,pmkOther,ppmkPrefix);
496 /******************************************************************************
497 * AntiMoniker_RelativePathTo
498 ******************************************************************************/
499 HRESULT WINAPI AntiMonikerImpl_RelativePathTo(IMoniker* iface,IMoniker* pmOther, IMoniker** ppmkRelPath)
501 TRACE("(%p,%p,%p)\n",iface,pmOther,ppmkRelPath);
503 if (ppmkRelPath==NULL)
504 return E_POINTER;
506 IMoniker_AddRef(pmOther);
508 *ppmkRelPath=pmOther;
510 return MK_S_HIM;
513 /******************************************************************************
514 * AntiMoniker_GetDisplayName
515 ******************************************************************************/
516 HRESULT WINAPI AntiMonikerImpl_GetDisplayName(IMoniker* iface,
517 IBindCtx* pbc,
518 IMoniker* pmkToLeft,
519 LPOLESTR *ppszDisplayName)
521 WCHAR back[]={'\\','.','.',0};
523 TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,ppszDisplayName);
525 if (ppszDisplayName==NULL)
526 return E_POINTER;
528 if (pmkToLeft!=NULL){
529 FIXME("() pmkToLeft!=NULL not implemented \n");
530 return E_NOTIMPL;
533 *ppszDisplayName=CoTaskMemAlloc(sizeof(back));
535 if (*ppszDisplayName==NULL)
536 return E_OUTOFMEMORY;
538 strcpyW(*ppszDisplayName,back);
540 return S_OK;
543 /******************************************************************************
544 * AntiMoniker_ParseDisplayName
545 ******************************************************************************/
546 HRESULT WINAPI AntiMonikerImpl_ParseDisplayName(IMoniker* iface,
547 IBindCtx* pbc,
548 IMoniker* pmkToLeft,
549 LPOLESTR pszDisplayName,
550 ULONG* pchEaten,
551 IMoniker** ppmkOut)
553 TRACE("(%p,%p,%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pszDisplayName,pchEaten,ppmkOut);
554 return E_NOTIMPL;
557 /******************************************************************************
558 * AntiMoniker_IsSystemMonker
559 ******************************************************************************/
560 HRESULT WINAPI AntiMonikerImpl_IsSystemMoniker(IMoniker* iface,DWORD* pwdMksys)
562 TRACE("(%p,%p)\n",iface,pwdMksys);
564 if (!pwdMksys)
565 return E_POINTER;
567 (*pwdMksys)=MKSYS_ANTIMONIKER;
569 return S_OK;
572 /*******************************************************************************
573 * AntiMonikerIROTData_QueryInterface
574 *******************************************************************************/
575 HRESULT WINAPI AntiMonikerROTDataImpl_QueryInterface(IROTData *iface,REFIID riid,VOID** ppvObject)
578 ICOM_THIS_From_IROTData(IMoniker, iface);
580 TRACE("(%p,%p,%p)\n",iface,riid,ppvObject);
582 return AntiMonikerImpl_QueryInterface(This, riid, ppvObject);
585 /***********************************************************************
586 * AntiMonikerIROTData_AddRef
588 ULONG WINAPI AntiMonikerROTDataImpl_AddRef(IROTData *iface)
590 ICOM_THIS_From_IROTData(IMoniker, iface);
592 TRACE("(%p)\n",iface);
594 return AntiMonikerImpl_AddRef(This);
597 /***********************************************************************
598 * AntiMonikerIROTData_Release
600 ULONG WINAPI AntiMonikerROTDataImpl_Release(IROTData* iface)
602 ICOM_THIS_From_IROTData(IMoniker, iface);
604 TRACE("(%p)\n",iface);
606 return AntiMonikerImpl_Release(This);
609 /******************************************************************************
610 * AntiMonikerIROTData_GetComparaisonData
611 ******************************************************************************/
612 HRESULT WINAPI AntiMonikerROTDataImpl_GetComparaisonData(IROTData* iface,
613 BYTE* pbData,
614 ULONG cbMax,
615 ULONG* pcbData)
617 FIXME("(),stub!\n");
618 return E_NOTIMPL;
621 /******************************************************************************
622 * CreateAntiMoniker [OLE.55]
623 ******************************************************************************/
624 HRESULT WINAPI CreateAntiMoniker(LPMONIKER * ppmk)
626 AntiMonikerImpl* newAntiMoniker = 0;
627 HRESULT hr = S_OK;
628 IID riid=IID_IMoniker;
630 TRACE("(%p)\n",ppmk);
632 newAntiMoniker = HeapAlloc(GetProcessHeap(), 0, sizeof(AntiMonikerImpl));
634 if (newAntiMoniker == 0)
635 return STG_E_INSUFFICIENTMEMORY;
637 hr = AntiMonikerImpl_Construct(newAntiMoniker);
639 if (FAILED(hr)){
641 HeapFree(GetProcessHeap(),0,newAntiMoniker);
642 return hr;
645 hr = AntiMonikerImpl_QueryInterface((IMoniker*)newAntiMoniker,&riid,(void**)ppmk);
647 return hr;