dmsynth: Remove DECLSPEC_HIDDEN usage.
[wine.git] / dlls / ole32 / pointermoniker.c
blob9b5ea8caf76af7cb8a1eab17e33a0f1129f74079
1 /*
2 * Pointer and Objref Monikers Implementation
4 * Copyright 1999 Noomen Hamza
5 * Copyright 2008 Robert Shearman (for CodeWeavers)
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include <stdarg.h>
23 #include <string.h>
25 #define COBJMACROS
26 #define NONAMELESSUNION
28 #include "windef.h"
29 #include "winbase.h"
30 #include "winerror.h"
31 #include "winuser.h"
32 #include "objbase.h"
33 #include "oleidl.h"
34 #include "wine/debug.h"
35 #include "moniker.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(ole);
39 /* PointerMoniker data structure */
40 typedef struct PointerMonikerImpl
42 IMoniker IMoniker_iface;
43 IMarshal IMarshal_iface;
45 LONG refcount;
47 IUnknown *pObject;
48 } PointerMonikerImpl;
50 static inline PointerMonikerImpl *impl_from_IMoniker(IMoniker *iface)
52 return CONTAINING_RECORD(iface, PointerMonikerImpl, IMoniker_iface);
55 static PointerMonikerImpl *impl_from_IMarshal(IMarshal *iface)
57 return CONTAINING_RECORD(iface, PointerMonikerImpl, IMarshal_iface);
60 static PointerMonikerImpl *unsafe_impl_from_IMoniker(IMoniker *iface);
62 static HRESULT WINAPI PointerMonikerImpl_QueryInterface(IMoniker *iface, REFIID riid, void **ppvObject)
64 PointerMonikerImpl *moniker = impl_from_IMoniker(iface);
66 TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), ppvObject);
68 if (!ppvObject)
69 return E_INVALIDARG;
71 *ppvObject = 0;
73 if (IsEqualIID(&IID_IUnknown, riid) ||
74 IsEqualIID(&IID_IPersist, riid) ||
75 IsEqualIID(&IID_IPersistStream, riid) ||
76 IsEqualIID(&IID_IMoniker, riid) ||
77 IsEqualGUID(&CLSID_PointerMoniker, riid))
79 *ppvObject = iface;
81 else if (IsEqualIID(&IID_IMarshal, riid))
82 *ppvObject = &moniker->IMarshal_iface;
84 if (!*ppvObject)
85 return E_NOINTERFACE;
87 IMoniker_AddRef(iface);
89 return S_OK;
92 static ULONG WINAPI PointerMonikerImpl_AddRef(IMoniker *iface)
94 PointerMonikerImpl *moniker = impl_from_IMoniker(iface);
95 ULONG refcount = InterlockedIncrement(&moniker->refcount);
97 TRACE("%p, refcount %lu.\n", iface, refcount);
99 return refcount;
102 static ULONG WINAPI PointerMonikerImpl_Release(IMoniker *iface)
104 PointerMonikerImpl *moniker = impl_from_IMoniker(iface);
105 ULONG refcount = InterlockedDecrement(&moniker->refcount);
107 TRACE("%p, refcount %lu.\n", iface, refcount);
109 if (!refcount)
111 if (moniker->pObject) IUnknown_Release(moniker->pObject);
112 free(moniker);
115 return refcount;
118 /******************************************************************************
119 * PointerMoniker_GetClassID
120 ******************************************************************************/
121 static HRESULT WINAPI
122 PointerMonikerImpl_GetClassID(IMoniker* iface,CLSID *pClassID)
124 TRACE("(%p,%p)\n",iface,pClassID);
126 if (pClassID==NULL)
127 return E_POINTER;
129 *pClassID = CLSID_PointerMoniker;
131 return S_OK;
134 /******************************************************************************
135 * PointerMoniker_IsDirty
136 ******************************************************************************/
137 static HRESULT WINAPI
138 PointerMonikerImpl_IsDirty(IMoniker* iface)
140 /* Note that the OLE-provided implementations of the IPersistStream::IsDirty
141 method in the OLE-provided moniker interfaces always return S_FALSE because
142 their internal state never changes. */
144 TRACE("(%p)\n",iface);
146 return S_FALSE;
149 /******************************************************************************
150 * PointerMoniker_Load
151 ******************************************************************************/
152 static HRESULT WINAPI
153 PointerMonikerImpl_Load(IMoniker* iface,IStream* pStm)
155 TRACE("(%p)\n", pStm);
157 return E_NOTIMPL;
160 /******************************************************************************
161 * PointerMoniker_Save
162 ******************************************************************************/
163 static HRESULT WINAPI
164 PointerMonikerImpl_Save(IMoniker* iface, IStream* pStm, BOOL fClearDirty)
166 TRACE("(%p, %d)\n", pStm, fClearDirty);
168 return E_NOTIMPL;
171 /******************************************************************************
172 * PointerMoniker_GetSizeMax
174 * PARAMS
175 * pcbSize [out] Pointer to size of stream needed to save object
176 ******************************************************************************/
177 static HRESULT WINAPI
178 PointerMonikerImpl_GetSizeMax(IMoniker* iface, ULARGE_INTEGER* pcbSize)
180 TRACE("(%p,%p)\n",iface,pcbSize);
182 if (!pcbSize)
183 return E_POINTER;
185 pcbSize->u.LowPart = 0;
186 pcbSize->u.HighPart = 0;
188 return E_NOTIMPL;
191 /******************************************************************************
192 * PointerMoniker_BindToObject
193 ******************************************************************************/
194 static HRESULT WINAPI
195 PointerMonikerImpl_BindToObject(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft,
196 REFIID riid, VOID** ppvResult)
198 PointerMonikerImpl *This = impl_from_IMoniker(iface);
200 TRACE("(%p,%p,%p,%s,%p)\n",iface,pbc,pmkToLeft,debugstr_guid(riid),ppvResult);
202 if (!This->pObject)
203 return E_UNEXPECTED;
205 return IUnknown_QueryInterface(This->pObject, riid, ppvResult);
208 /******************************************************************************
209 * PointerMoniker_BindToStorage
210 ******************************************************************************/
211 static HRESULT WINAPI
212 PointerMonikerImpl_BindToStorage(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft,
213 REFIID riid, VOID** ppvResult)
215 PointerMonikerImpl *This = impl_from_IMoniker(iface);
217 TRACE("(%p,%p,%p,%s,%p)\n",iface,pbc,pmkToLeft,debugstr_guid(riid),ppvResult);
219 if (!This->pObject)
220 return E_UNEXPECTED;
222 return IUnknown_QueryInterface(This->pObject, riid, ppvResult);
225 /******************************************************************************
226 * PointerMoniker_Reduce
227 ******************************************************************************/
228 static HRESULT WINAPI
229 PointerMonikerImpl_Reduce(IMoniker* iface, IBindCtx* pbc, DWORD dwReduceHowFar,
230 IMoniker** ppmkToLeft, IMoniker** ppmkReduced)
232 TRACE("%p, %p, %ld, %p, %p.\n", iface, pbc, dwReduceHowFar, ppmkToLeft, ppmkReduced);
234 if (ppmkReduced==NULL)
235 return E_POINTER;
237 PointerMonikerImpl_AddRef(iface);
239 *ppmkReduced=iface;
241 return MK_S_REDUCED_TO_SELF;
244 static HRESULT WINAPI PointerMonikerImpl_ComposeWith(IMoniker *iface, IMoniker *right,
245 BOOL only_if_not_generic, IMoniker **result)
247 DWORD order;
249 TRACE("%p, %p, %d, %p.\n", iface, right, only_if_not_generic, result);
251 if (!result || !right)
252 return E_POINTER;
254 *result = NULL;
256 if (is_anti_moniker(right, &order))
257 return order > 1 ? create_anti_moniker(order - 1, result) : S_OK;
259 return only_if_not_generic ? MK_E_NEEDGENERIC : CreateGenericComposite(iface, right, result);
262 /******************************************************************************
263 * PointerMoniker_Enum
264 ******************************************************************************/
265 static HRESULT WINAPI PointerMonikerImpl_Enum(IMoniker *iface, BOOL fForward, IEnumMoniker **ppenumMoniker)
267 TRACE("%p, %d, %p.\n", iface, fForward, ppenumMoniker);
269 if (!ppenumMoniker)
270 return E_POINTER;
272 *ppenumMoniker = NULL;
274 return E_NOTIMPL;
277 /******************************************************************************
278 * PointerMoniker_IsEqual
279 ******************************************************************************/
280 static HRESULT WINAPI PointerMonikerImpl_IsEqual(IMoniker *iface, IMoniker *other)
282 PointerMonikerImpl *moniker = impl_from_IMoniker(iface), *other_moniker;
284 TRACE("%p, %p.\n", iface, other);
286 if (!other)
287 return E_INVALIDARG;
289 other_moniker = unsafe_impl_from_IMoniker(other);
290 if (!other_moniker)
291 return S_FALSE;
293 return moniker->pObject == other_moniker->pObject ? S_OK : S_FALSE;
296 /******************************************************************************
297 * PointerMoniker_Hash
298 ******************************************************************************/
299 static HRESULT WINAPI PointerMonikerImpl_Hash(IMoniker* iface,DWORD* pdwHash)
301 PointerMonikerImpl *This = impl_from_IMoniker(iface);
303 if (pdwHash==NULL)
304 return E_POINTER;
306 *pdwHash = PtrToUlong(This->pObject);
308 return S_OK;
311 /******************************************************************************
312 * PointerMoniker_IsRunning
313 ******************************************************************************/
314 static HRESULT WINAPI
315 PointerMonikerImpl_IsRunning(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft,
316 IMoniker* pmkNewlyRunning)
318 TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pmkNewlyRunning);
320 return S_OK;
323 /******************************************************************************
324 * PointerMoniker_GetTimeOfLastChange
325 ******************************************************************************/
326 static HRESULT WINAPI PointerMonikerImpl_GetTimeOfLastChange(IMoniker* iface,
327 IBindCtx* pbc,
328 IMoniker* pmkToLeft,
329 FILETIME* pAntiTime)
331 TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pAntiTime);
332 return E_NOTIMPL;
335 /******************************************************************************
336 * PointerMoniker_Inverse
337 ******************************************************************************/
338 static HRESULT WINAPI
339 PointerMonikerImpl_Inverse(IMoniker* iface,IMoniker** ppmk)
341 TRACE("(%p,%p)\n",iface,ppmk);
343 return CreateAntiMoniker(ppmk);
346 /******************************************************************************
347 * PointerMoniker_CommonPrefixWith
348 ******************************************************************************/
349 static HRESULT WINAPI PointerMonikerImpl_CommonPrefixWith(IMoniker *iface, IMoniker *other, IMoniker **prefix)
351 TRACE("%p, %p, %p.\n", iface, other, prefix);
353 if (!prefix || !other)
354 return E_INVALIDARG;
356 *prefix = NULL;
358 if (PointerMonikerImpl_IsEqual(iface, other) == S_OK)
360 IMoniker_AddRef(iface);
362 *prefix = iface;
364 return MK_S_US;
366 else
367 return MK_E_NOPREFIX;
370 static HRESULT WINAPI PointerMonikerImpl_RelativePathTo(IMoniker *iface, IMoniker *other, IMoniker **result)
372 TRACE("%p, %p, %p.\n", iface, other, result);
374 if (!result)
375 return E_INVALIDARG;
377 *result = NULL;
379 return other ? E_NOTIMPL : E_INVALIDARG;
382 static HRESULT WINAPI PointerMonikerImpl_GetDisplayName(IMoniker *iface, IBindCtx *pbc,
383 IMoniker *toleft, LPOLESTR *name)
385 TRACE("%p, %p, %p, %p.\n", iface, pbc, toleft, name);
387 if (!name || !pbc)
389 if (name) *name = NULL;
390 return E_INVALIDARG;
393 return E_NOTIMPL;
396 /******************************************************************************
397 * PointerMoniker_ParseDisplayName
398 ******************************************************************************/
399 static HRESULT WINAPI
400 PointerMonikerImpl_ParseDisplayName(IMoniker* iface, IBindCtx* pbc,
401 IMoniker* pmkToLeft, LPOLESTR pszDisplayName,
402 ULONG* pchEaten, IMoniker** ppmkOut)
404 PointerMonikerImpl *This = impl_from_IMoniker(iface);
405 HRESULT hr;
406 IParseDisplayName *pPDN;
408 TRACE("(%p,%p,%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pszDisplayName,pchEaten,ppmkOut);
410 if (pmkToLeft)
411 return MK_E_SYNTAX;
413 if (!This->pObject)
414 return E_UNEXPECTED;
416 hr = IUnknown_QueryInterface(This->pObject, &IID_IParseDisplayName, (void **)&pPDN);
417 if (FAILED(hr))
418 return hr;
420 hr = IParseDisplayName_ParseDisplayName(pPDN, pbc, pszDisplayName, pchEaten, ppmkOut);
421 IParseDisplayName_Release(pPDN);
423 return hr;
426 /******************************************************************************
427 * PointerMoniker_IsSystemMoniker
428 ******************************************************************************/
429 static HRESULT WINAPI
430 PointerMonikerImpl_IsSystemMoniker(IMoniker* iface,DWORD* pwdMksys)
432 TRACE("(%p,%p)\n",iface,pwdMksys);
434 if (!pwdMksys)
435 return E_POINTER;
437 *pwdMksys = MKSYS_POINTERMONIKER;
439 return S_OK;
442 /********************************************************************************/
443 /* Virtual function table for the PointerMonikerImpl class which include IPersist,*/
444 /* IPersistStream and IMoniker functions. */
445 static const IMonikerVtbl VT_PointerMonikerImpl =
447 PointerMonikerImpl_QueryInterface,
448 PointerMonikerImpl_AddRef,
449 PointerMonikerImpl_Release,
450 PointerMonikerImpl_GetClassID,
451 PointerMonikerImpl_IsDirty,
452 PointerMonikerImpl_Load,
453 PointerMonikerImpl_Save,
454 PointerMonikerImpl_GetSizeMax,
455 PointerMonikerImpl_BindToObject,
456 PointerMonikerImpl_BindToStorage,
457 PointerMonikerImpl_Reduce,
458 PointerMonikerImpl_ComposeWith,
459 PointerMonikerImpl_Enum,
460 PointerMonikerImpl_IsEqual,
461 PointerMonikerImpl_Hash,
462 PointerMonikerImpl_IsRunning,
463 PointerMonikerImpl_GetTimeOfLastChange,
464 PointerMonikerImpl_Inverse,
465 PointerMonikerImpl_CommonPrefixWith,
466 PointerMonikerImpl_RelativePathTo,
467 PointerMonikerImpl_GetDisplayName,
468 PointerMonikerImpl_ParseDisplayName,
469 PointerMonikerImpl_IsSystemMoniker
472 static PointerMonikerImpl *unsafe_impl_from_IMoniker(IMoniker *iface)
474 if (iface->lpVtbl != &VT_PointerMonikerImpl)
475 return NULL;
476 return CONTAINING_RECORD(iface, PointerMonikerImpl, IMoniker_iface);
479 static HRESULT WINAPI pointer_moniker_marshal_QueryInterface(IMarshal *iface, REFIID riid, LPVOID *ppv)
481 PointerMonikerImpl *moniker = impl_from_IMarshal(iface);
483 TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), ppv);
485 return IMoniker_QueryInterface(&moniker->IMoniker_iface, riid, ppv);
488 static ULONG WINAPI pointer_moniker_marshal_AddRef(IMarshal *iface)
490 PointerMonikerImpl *moniker = impl_from_IMarshal(iface);
492 TRACE("%p.\n",iface);
494 return IMoniker_AddRef(&moniker->IMoniker_iface);
497 static ULONG WINAPI pointer_moniker_marshal_Release(IMarshal *iface)
499 PointerMonikerImpl *moniker = impl_from_IMarshal(iface);
501 TRACE("%p.\n",iface);
503 return IMoniker_Release(&moniker->IMoniker_iface);
506 static HRESULT WINAPI pointer_moniker_marshal_GetUnmarshalClass(IMarshal *iface, REFIID riid, void *pv,
507 DWORD dwDestContext, void *pvDestContext, DWORD mshlflags, CLSID *clsid)
509 PointerMonikerImpl *moniker = impl_from_IMarshal(iface);
511 TRACE("%p, %s, %p, %lx, %p, %lx, %p.\n", iface, debugstr_guid(riid), pv, dwDestContext, pvDestContext,
512 mshlflags, clsid);
514 return IMoniker_GetClassID(&moniker->IMoniker_iface, clsid);
517 static HRESULT WINAPI pointer_moniker_marshal_GetMarshalSizeMax(IMarshal *iface, REFIID riid, void *pv,
518 DWORD dwDestContext, void *pvDestContext, DWORD mshlflags, DWORD *size)
520 PointerMonikerImpl *moniker = impl_from_IMarshal(iface);
522 TRACE("%p, %s, %p, %ld, %p, %#lx, %p.\n", iface, debugstr_guid(riid), pv, dwDestContext, pvDestContext,
523 mshlflags, size);
525 return CoGetMarshalSizeMax(size, &IID_IUnknown, moniker->pObject, dwDestContext, pvDestContext, mshlflags);
528 static HRESULT WINAPI pointer_moniker_marshal_MarshalInterface(IMarshal *iface, IStream *stream, REFIID riid,
529 void *pv, DWORD dwDestContext, void *pvDestContext, DWORD mshlflags)
531 PointerMonikerImpl *moniker = impl_from_IMarshal(iface);
533 TRACE("%p, %s, %p, %lx, %p, %lx.\n", stream, debugstr_guid(riid), pv,
534 dwDestContext, pvDestContext, mshlflags);
536 return CoMarshalInterface(stream, &IID_IUnknown, moniker->pObject, dwDestContext,
537 pvDestContext, mshlflags);
540 static HRESULT WINAPI pointer_moniker_marshal_UnmarshalInterface(IMarshal *iface, IStream *stream,
541 REFIID riid, void **ppv)
543 PointerMonikerImpl *moniker = impl_from_IMarshal(iface);
544 IUnknown *object;
545 HRESULT hr;
547 TRACE("%p, %p, %s, %p.\n", iface, stream, debugstr_guid(riid), ppv);
549 hr = CoUnmarshalInterface(stream, &IID_IUnknown, (void **)&object);
550 if (FAILED(hr))
552 ERR("Couldn't unmarshal moniker, hr = %#lx.\n", hr);
553 return hr;
556 if (moniker->pObject)
557 IUnknown_Release(moniker->pObject);
558 moniker->pObject = object;
560 return IMoniker_QueryInterface(&moniker->IMoniker_iface, riid, ppv);
563 static HRESULT WINAPI pointer_moniker_marshal_ReleaseMarshalData(IMarshal *iface, IStream *stream)
565 TRACE("%p, %p.\n", iface, stream);
567 return S_OK;
570 static HRESULT WINAPI pointer_moniker_marshal_DisconnectObject(IMarshal *iface, DWORD reserved)
572 TRACE("%p, %#lx.\n", iface, reserved);
574 return S_OK;
577 static const IMarshalVtbl pointer_moniker_marshal_vtbl =
579 pointer_moniker_marshal_QueryInterface,
580 pointer_moniker_marshal_AddRef,
581 pointer_moniker_marshal_Release,
582 pointer_moniker_marshal_GetUnmarshalClass,
583 pointer_moniker_marshal_GetMarshalSizeMax,
584 pointer_moniker_marshal_MarshalInterface,
585 pointer_moniker_marshal_UnmarshalInterface,
586 pointer_moniker_marshal_ReleaseMarshalData,
587 pointer_moniker_marshal_DisconnectObject
590 /***********************************************************************
591 * CreatePointerMoniker (OLE32.@)
593 HRESULT WINAPI CreatePointerMoniker(IUnknown *object, IMoniker **ret)
595 PointerMonikerImpl *moniker;
597 TRACE("(%p, %p)\n", object, ret);
599 if (!ret)
600 return E_INVALIDARG;
602 if (!(moniker = calloc(1, sizeof(*moniker))))
604 *ret = NULL;
605 return E_OUTOFMEMORY;
608 moniker->IMoniker_iface.lpVtbl = &VT_PointerMonikerImpl;
609 moniker->IMarshal_iface.lpVtbl = &pointer_moniker_marshal_vtbl;
610 moniker->refcount = 1;
611 moniker->pObject = object;
612 if (moniker->pObject)
613 IUnknown_AddRef(moniker->pObject);
615 *ret = &moniker->IMoniker_iface;
617 return S_OK;
620 HRESULT WINAPI PointerMoniker_CreateInstance(IClassFactory *iface,
621 IUnknown *pUnk, REFIID riid, void **ppv)
623 IMoniker *pMoniker;
624 HRESULT hr;
626 TRACE("(%p, %s, %p)\n", pUnk, debugstr_guid(riid), ppv);
628 *ppv = NULL;
630 if (pUnk)
631 return CLASS_E_NOAGGREGATION;
633 hr = CreatePointerMoniker(NULL, &pMoniker);
634 if (FAILED(hr))
635 return hr;
637 hr = IMoniker_QueryInterface(pMoniker, riid, ppv);
638 IMoniker_Release(pMoniker);
640 return hr;
643 /* ObjrefMoniker implementation */
645 typedef struct
647 IMoniker IMoniker_iface;
648 IMarshal IMarshal_iface;
650 LONG refcount;
652 IUnknown *pObject;
653 } ObjrefMonikerImpl;
655 static inline ObjrefMonikerImpl *objref_impl_from_IMoniker(IMoniker *iface)
657 return CONTAINING_RECORD(iface, ObjrefMonikerImpl, IMoniker_iface);
660 static ObjrefMonikerImpl *objref_impl_from_IMarshal(IMarshal *iface)
662 return CONTAINING_RECORD(iface, ObjrefMonikerImpl, IMarshal_iface);
665 static HRESULT WINAPI ObjrefMonikerImpl_QueryInterface(IMoniker *iface, REFIID iid, void **obj)
667 ObjrefMonikerImpl *moniker = objref_impl_from_IMoniker(iface);
669 TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), obj);
671 if (!obj)
672 return E_INVALIDARG;
674 *obj = 0;
676 if (IsEqualIID(iid, &IID_IUnknown) ||
677 IsEqualIID(iid, &IID_IPersist) ||
678 IsEqualIID(iid, &IID_IPersistStream) ||
679 IsEqualIID(iid, &IID_IMoniker) ||
680 IsEqualGUID(iid, &CLSID_ObjrefMoniker) ||
681 IsEqualGUID(iid, &CLSID_PointerMoniker))
683 *obj = iface;
685 else if (IsEqualIID(iid, &IID_IMarshal))
686 *obj = &moniker->IMarshal_iface;
687 else
688 return E_NOINTERFACE;
690 IMoniker_AddRef(iface);
692 return S_OK;
695 static ULONG WINAPI ObjrefMonikerImpl_AddRef(IMoniker *iface)
697 ObjrefMonikerImpl *moniker = objref_impl_from_IMoniker(iface);
698 ULONG refcount = InterlockedIncrement(&moniker->refcount);
700 TRACE("%p, refcount %lu\n", iface, refcount);
702 return refcount;
705 static ULONG WINAPI ObjrefMonikerImpl_Release(IMoniker *iface)
707 ObjrefMonikerImpl *moniker = objref_impl_from_IMoniker(iface);
708 ULONG refcount = InterlockedDecrement(&moniker->refcount);
710 TRACE("%p, refcount %lu\n", iface, refcount);
712 if (!refcount)
714 if (moniker->pObject) IUnknown_Release(moniker->pObject);
715 free(moniker);
718 return refcount;
721 static HRESULT WINAPI ObjrefMonikerImpl_GetClassID(IMoniker *iface, CLSID *clsid)
723 TRACE("(%p,%p)\n", iface, clsid);
725 if (!clsid)
726 return E_POINTER;
728 *clsid = CLSID_ObjrefMoniker;
729 return S_OK;
732 static HRESULT WINAPI ObjrefMonikerImpl_IsDirty(IMoniker *iface)
734 FIXME("(%p): stub\n", iface);
735 return S_FALSE;
738 static HRESULT WINAPI ObjrefMonikerImpl_Load(IMoniker *iface, IStream *stream)
740 FIXME("(%p,%p): stub\n", iface, stream);
741 return E_NOTIMPL;
744 static HRESULT WINAPI ObjrefMonikerImpl_Save(IMoniker *iface, IStream *stream, BOOL dirty)
746 FIXME("(%p,%p,%d): stub\n", iface, stream, dirty);
747 return E_NOTIMPL;
750 static HRESULT WINAPI ObjrefMonikerImpl_GetSizeMax(IMoniker *iface, ULARGE_INTEGER *size)
752 FIXME("(%p,%p): stub\n", iface, size);
753 return E_NOTIMPL;
756 static HRESULT WINAPI ObjrefMonikerImpl_BindToObject(IMoniker *iface, IBindCtx *pbc, IMoniker *left,
757 REFIID riid, void **result)
759 FIXME("(%p,%p,%p,%s,%p): stub\n", iface, pbc, left, debugstr_guid(riid), result);
760 return E_NOTIMPL;
763 static HRESULT WINAPI ObjrefMonikerImpl_BindToStorage(IMoniker *iface, IBindCtx *pbc, IMoniker *left,
764 REFIID riid, void **result)
766 FIXME("(%p,%p,%p,%s,%p): stub\n", iface, pbc, left, debugstr_guid(riid), result);
767 return E_NOTIMPL;
770 static HRESULT WINAPI ObjrefMonikerImpl_Reduce(IMoniker *iface, IBindCtx *pbc, DWORD howfar,
771 IMoniker **left, IMoniker **reduced)
773 FIXME("%p, %p, %ld, %p, %p: stub\n", iface, pbc, howfar, left, reduced);
774 return E_NOTIMPL;
777 static HRESULT WINAPI ObjrefMonikerImpl_ComposeWith(IMoniker *iface, IMoniker *right,
778 BOOL only_if_not_generic, IMoniker **result)
780 FIXME("(%p,%p,%d,%p): stub\n", iface, right, only_if_not_generic, result);
781 return E_NOTIMPL;
784 static HRESULT WINAPI ObjrefMonikerImpl_Enum(IMoniker *iface, BOOL forward, IEnumMoniker **enummoniker)
786 TRACE("(%p,%d,%p)\n", iface, forward, enummoniker);
788 if (!enummoniker)
789 return E_POINTER;
791 *enummoniker = NULL;
792 return S_OK;
795 static HRESULT WINAPI ObjrefMonikerImpl_IsEqual(IMoniker *iface, IMoniker *other)
797 FIXME("(%p,%p): stub\n", iface, other);
798 return E_NOTIMPL;
801 static HRESULT WINAPI ObjrefMonikerImpl_Hash(IMoniker *iface, DWORD *hash)
803 ObjrefMonikerImpl *moniker = objref_impl_from_IMoniker(iface);
805 TRACE("(%p,%p)\n", iface, hash);
807 if (!hash)
808 return E_POINTER;
810 *hash = PtrToUlong(moniker->pObject);
812 return S_OK;
815 static HRESULT WINAPI ObjrefMonikerImpl_IsRunning(IMoniker *iface, IBindCtx *pbc, IMoniker *left,
816 IMoniker *running)
818 FIXME("(%p,%p,%p,%p): stub\n", iface, pbc, left, running);
819 return E_NOTIMPL;
822 static HRESULT WINAPI ObjrefMonikerImpl_GetTimeOfLastChange(IMoniker *iface,
823 IBindCtx *pbc, IMoniker *left, FILETIME *time)
825 FIXME("(%p,%p,%p,%p): stub\n", iface, pbc, left, time);
826 return MK_E_UNAVAILABLE;
829 static HRESULT WINAPI ObjrefMonikerImpl_Inverse(IMoniker *iface, IMoniker **moniker)
831 FIXME("(%p,%p): stub\n", iface, moniker);
832 return E_NOTIMPL;
835 static HRESULT WINAPI ObjrefMonikerImpl_CommonPrefixWith(IMoniker *iface, IMoniker *other, IMoniker **prefix)
837 FIXME("(%p,%p,%p): stub\n", iface, other, prefix);
838 return E_NOTIMPL;
841 static HRESULT WINAPI ObjrefMonikerImpl_RelativePathTo(IMoniker *iface, IMoniker *other, IMoniker **result)
843 FIXME("(%p,%p,%p): stub\n", iface, other, result);
844 return E_NOTIMPL;
847 static HRESULT WINAPI ObjrefMonikerImpl_GetDisplayName(IMoniker *iface, IBindCtx *pbc,
848 IMoniker *left, LPOLESTR *name)
850 FIXME("(%p,%p,%p,%p): stub\n", iface, pbc, left, name);
851 return E_NOTIMPL;
854 static HRESULT WINAPI ObjrefMonikerImpl_ParseDisplayName(IMoniker *iface, IBindCtx *pbc,
855 IMoniker *left, LPOLESTR name, ULONG *eaten, IMoniker **out)
857 FIXME("(%p,%p,%p,%p,%p,%p): stub\n", iface, pbc, left, name, eaten, out);
858 return E_NOTIMPL;
861 static HRESULT WINAPI ObjrefMonikerImpl_IsSystemMoniker(IMoniker *iface, DWORD *mksys)
863 TRACE("(%p,%p)\n", iface, mksys);
865 if (!mksys)
866 return E_POINTER;
868 *mksys = MKSYS_OBJREFMONIKER;
869 return S_OK;
872 static const IMonikerVtbl VT_ObjrefMonikerImpl =
874 ObjrefMonikerImpl_QueryInterface,
875 ObjrefMonikerImpl_AddRef,
876 ObjrefMonikerImpl_Release,
877 ObjrefMonikerImpl_GetClassID,
878 ObjrefMonikerImpl_IsDirty,
879 ObjrefMonikerImpl_Load,
880 ObjrefMonikerImpl_Save,
881 ObjrefMonikerImpl_GetSizeMax,
882 ObjrefMonikerImpl_BindToObject,
883 ObjrefMonikerImpl_BindToStorage,
884 ObjrefMonikerImpl_Reduce,
885 ObjrefMonikerImpl_ComposeWith,
886 ObjrefMonikerImpl_Enum,
887 ObjrefMonikerImpl_IsEqual,
888 ObjrefMonikerImpl_Hash,
889 ObjrefMonikerImpl_IsRunning,
890 ObjrefMonikerImpl_GetTimeOfLastChange,
891 ObjrefMonikerImpl_Inverse,
892 ObjrefMonikerImpl_CommonPrefixWith,
893 ObjrefMonikerImpl_RelativePathTo,
894 ObjrefMonikerImpl_GetDisplayName,
895 ObjrefMonikerImpl_ParseDisplayName,
896 ObjrefMonikerImpl_IsSystemMoniker
899 static HRESULT WINAPI objref_moniker_marshal_QueryInterface(IMarshal *iface, REFIID riid, LPVOID *ppv)
901 ObjrefMonikerImpl *moniker = objref_impl_from_IMarshal(iface);
903 TRACE("(%p,%s,%p)\n", iface, debugstr_guid(riid), ppv);
905 return IMoniker_QueryInterface(&moniker->IMoniker_iface, riid, ppv);
908 static ULONG WINAPI objref_moniker_marshal_AddRef(IMarshal *iface)
910 ObjrefMonikerImpl *moniker = objref_impl_from_IMarshal(iface);
912 TRACE("(%p)\n", iface);
914 return IMoniker_AddRef(&moniker->IMoniker_iface);
917 static ULONG WINAPI objref_moniker_marshal_Release(IMarshal *iface)
919 ObjrefMonikerImpl *moniker = objref_impl_from_IMarshal(iface);
921 TRACE("(%p)\n", iface);
923 return IMoniker_Release(&moniker->IMoniker_iface);
926 static HRESULT WINAPI objref_moniker_marshal_GetUnmarshalClass(IMarshal *iface, REFIID riid, void *pv,
927 DWORD dwDestContext, void *pvDestContext, DWORD mshlflags, CLSID *clsid)
929 ObjrefMonikerImpl *moniker = objref_impl_from_IMarshal(iface);
931 TRACE("%p, %s, %p, %#lx, %p, %#lx, %p.\n", iface, debugstr_guid(riid), pv, dwDestContext, pvDestContext,
932 mshlflags, clsid);
934 return IMoniker_GetClassID(&moniker->IMoniker_iface, clsid);
937 static HRESULT WINAPI objref_moniker_marshal_GetMarshalSizeMax(IMarshal *iface, REFIID riid, void *pv,
938 DWORD dwDestContext, void *pvDestContext, DWORD mshlflags, DWORD *size)
940 ObjrefMonikerImpl *moniker = objref_impl_from_IMarshal(iface);
942 TRACE("%p, %s, %p, %#lx, %p, %#lx, %p.\n", iface, debugstr_guid(riid), pv, dwDestContext, pvDestContext,
943 mshlflags, size);
945 return CoGetMarshalSizeMax(size, &IID_IUnknown, moniker->pObject, dwDestContext, pvDestContext, mshlflags);
948 static HRESULT WINAPI objref_moniker_marshal_MarshalInterface(IMarshal *iface, IStream *stream, REFIID riid,
949 void *pv, DWORD dwDestContext, void *pvDestContext, DWORD mshlflags)
951 ObjrefMonikerImpl *moniker = objref_impl_from_IMarshal(iface);
953 TRACE("%p, %s, %p, %#lx, %p, %#lx\n", stream, debugstr_guid(riid), pv, dwDestContext, pvDestContext, mshlflags);
955 return CoMarshalInterface(stream, &IID_IUnknown, moniker->pObject, dwDestContext, pvDestContext, mshlflags);
958 static HRESULT WINAPI objref_moniker_marshal_UnmarshalInterface(IMarshal *iface, IStream *stream,
959 REFIID riid, void **ppv)
961 ObjrefMonikerImpl *moniker = objref_impl_from_IMarshal(iface);
962 IUnknown *object;
963 HRESULT hr;
965 TRACE("(%p,%p,%s,%p)\n", iface, stream, debugstr_guid(riid), ppv);
967 hr = CoUnmarshalInterface(stream, &IID_IUnknown, (void **)&object);
968 if (FAILED(hr))
970 ERR("Couldn't unmarshal moniker, hr = %#lx.\n", hr);
971 return hr;
974 if (moniker->pObject)
975 IUnknown_Release(moniker->pObject);
976 moniker->pObject = object;
978 return IMoniker_QueryInterface(&moniker->IMoniker_iface, riid, ppv);
981 static HRESULT WINAPI objref_moniker_marshal_ReleaseMarshalData(IMarshal *iface, IStream *stream)
983 TRACE("(%p,%p)\n", iface, stream);
984 return S_OK;
987 static HRESULT WINAPI objref_moniker_marshal_DisconnectObject(IMarshal *iface, DWORD reserved)
989 TRACE("%p, %#lx.\n", iface, reserved);
990 return S_OK;
993 static const IMarshalVtbl objref_moniker_marshal_vtbl =
995 objref_moniker_marshal_QueryInterface,
996 objref_moniker_marshal_AddRef,
997 objref_moniker_marshal_Release,
998 objref_moniker_marshal_GetUnmarshalClass,
999 objref_moniker_marshal_GetMarshalSizeMax,
1000 objref_moniker_marshal_MarshalInterface,
1001 objref_moniker_marshal_UnmarshalInterface,
1002 objref_moniker_marshal_ReleaseMarshalData,
1003 objref_moniker_marshal_DisconnectObject
1006 /***********************************************************************
1007 * CreateObjrefMoniker (OLE32.@)
1009 HRESULT WINAPI CreateObjrefMoniker(IUnknown *obj, IMoniker **ret)
1011 ObjrefMonikerImpl *moniker;
1013 TRACE("(%p,%p)\n", obj, ret);
1015 if (!ret)
1016 return E_INVALIDARG;
1018 if (!(moniker = calloc(1, sizeof(*moniker))))
1020 *ret = NULL;
1021 return E_OUTOFMEMORY;
1024 moniker->IMoniker_iface.lpVtbl = &VT_ObjrefMonikerImpl;
1025 moniker->IMarshal_iface.lpVtbl = &objref_moniker_marshal_vtbl;
1026 moniker->refcount = 1;
1027 moniker->pObject = obj;
1028 if (moniker->pObject)
1029 IUnknown_AddRef(moniker->pObject);
1031 *ret = &moniker->IMoniker_iface;
1033 return S_OK;
1036 HRESULT WINAPI ObjrefMoniker_CreateInstance(IClassFactory *iface, IUnknown *unk, REFIID iid, void **obj)
1038 IMoniker *moniker;
1039 HRESULT hr;
1041 TRACE("(%p,%s,%p)\n", unk, debugstr_guid(iid), obj);
1043 *obj = NULL;
1045 if (unk)
1046 return CLASS_E_NOAGGREGATION;
1048 hr = CreateObjrefMoniker(NULL, &moniker);
1049 if (FAILED(hr))
1050 return hr;
1052 hr = IMoniker_QueryInterface(moniker, iid, obj);
1053 IMoniker_Release(moniker);
1055 return hr;