api-ms-win-service-management-l1-1-0: Add stub dll.
[wine/multimedia.git] / dlls / shell32 / shelldispatch.c
blob7b5de8bcaca2ca2d2080dc190d642e2cd14fc65f
1 /*
2 * IShellDispatch implementation
4 * Copyright 2010 Alexander Morozov for Etersoft
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.
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.
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
21 #include "config.h"
22 #include "wine/port.h"
24 #include <stdarg.h>
26 #define COBJMACROS
27 #define NONAMELESSUNION
28 #define NONAMELESSSTRUCT
30 #include "windef.h"
31 #include "winbase.h"
32 #include "winreg.h"
33 #include "winsvc.h"
34 #include "shlwapi.h"
35 #include "shlobj.h"
36 #include "shldisp.h"
37 #include "debughlp.h"
39 #include "wine/debug.h"
41 WINE_DEFAULT_DEBUG_CHANNEL(shell);
43 enum tid_t {
44 NULL_tid,
45 IShellDispatch5_tid,
46 Folder3_tid,
47 FolderItem_tid,
48 LAST_tid
51 static ITypeLib *typelib;
52 static const IID * const tid_ids[] =
54 &IID_NULL,
55 &IID_IShellDispatch5,
56 &IID_Folder3,
57 &IID_FolderItem
59 static ITypeInfo *typeinfos[LAST_tid];
61 typedef struct {
62 IShellDispatch5 IShellDispatch5_iface;
63 LONG ref;
64 } ShellDispatch;
66 typedef struct {
67 Folder3 Folder3_iface;
68 LONG ref;
69 VARIANT dir;
70 } FolderImpl;
72 typedef struct {
73 FolderItem FolderItem_iface;
74 LONG ref;
75 VARIANT dir;
76 } FolderItemImpl;
78 static inline ShellDispatch *impl_from_IShellDispatch5(IShellDispatch5 *iface)
80 return CONTAINING_RECORD(iface, ShellDispatch, IShellDispatch5_iface);
83 static inline FolderImpl *impl_from_Folder(Folder3 *iface)
85 return CONTAINING_RECORD(iface, FolderImpl, Folder3_iface);
88 static inline FolderItemImpl *impl_from_FolderItem(FolderItem *iface)
90 return CONTAINING_RECORD(iface, FolderItemImpl, FolderItem_iface);
93 static HRESULT load_typelib(void)
95 ITypeLib *tl;
96 HRESULT hr;
98 hr = LoadRegTypeLib(&LIBID_Shell32, 1, 0, LOCALE_SYSTEM_DEFAULT, &tl);
99 if (FAILED(hr)) {
100 ERR("LoadRegTypeLib failed: %08x\n", hr);
101 return hr;
104 if (InterlockedCompareExchangePointer((void**)&typelib, tl, NULL))
105 ITypeLib_Release(tl);
106 return hr;
109 void release_typelib(void)
111 unsigned i;
113 if (!typelib)
114 return;
116 for (i = 0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++)
117 if (typeinfos[i])
118 ITypeInfo_Release(typeinfos[i]);
120 ITypeLib_Release(typelib);
123 static HRESULT get_typeinfo(enum tid_t tid, ITypeInfo **typeinfo)
125 HRESULT hr;
127 if (!typelib)
128 hr = load_typelib();
129 if (!typelib)
130 return hr;
132 if (!typeinfos[tid])
134 ITypeInfo *ti;
136 hr = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &ti);
137 if (FAILED(hr))
139 ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(tid_ids[tid]), hr);
140 return hr;
143 if (InterlockedCompareExchangePointer((void**)(typeinfos+tid), ti, NULL))
144 ITypeInfo_Release(ti);
147 *typeinfo = typeinfos[tid];
148 return S_OK;
151 static HRESULT WINAPI FolderItemImpl_QueryInterface(FolderItem *iface,
152 REFIID riid, LPVOID *ppv)
154 FolderItemImpl *This = impl_from_FolderItem(iface);
156 TRACE("(%p,%p,%p)\n", iface, riid, ppv);
158 if (!ppv) return E_INVALIDARG;
160 if (IsEqualIID(&IID_IUnknown, riid) ||
161 IsEqualIID(&IID_IDispatch, riid) ||
162 IsEqualIID(&IID_FolderItem, riid))
163 *ppv = &This->FolderItem_iface;
164 else
166 FIXME("not implemented for %s\n", shdebugstr_guid(riid));
167 *ppv = NULL;
168 return E_NOINTERFACE;
170 IUnknown_AddRef((IUnknown*)*ppv);
171 return S_OK;
174 static ULONG WINAPI FolderItemImpl_AddRef(FolderItem *iface)
176 FolderItemImpl *This = impl_from_FolderItem(iface);
177 ULONG ref = InterlockedIncrement(&This->ref);
179 TRACE("(%p), new refcount=%i\n", iface, ref);
181 return ref;
184 static ULONG WINAPI FolderItemImpl_Release(FolderItem *iface)
186 FolderItemImpl *This = impl_from_FolderItem(iface);
187 ULONG ref = InterlockedDecrement(&This->ref);
189 TRACE("(%p), new refcount=%i\n", iface, ref);
191 if (!ref)
193 VariantClear(&This->dir);
194 HeapFree(GetProcessHeap(), 0, This);
196 return ref;
199 static HRESULT WINAPI FolderItemImpl_GetTypeInfoCount(FolderItem *iface,
200 UINT *pctinfo)
202 TRACE("(%p,%p)\n", iface, pctinfo);
204 *pctinfo = 1;
205 return S_OK;
208 static HRESULT WINAPI FolderItemImpl_GetTypeInfo(FolderItem *iface, UINT iTInfo,
209 LCID lcid, ITypeInfo **ppTInfo)
211 HRESULT hr;
213 TRACE("(%p,%u,%d,%p)\n", iface, iTInfo, lcid, ppTInfo);
215 hr = get_typeinfo(FolderItem_tid, ppTInfo);
216 if (SUCCEEDED(hr))
217 ITypeInfo_AddRef(*ppTInfo);
218 return hr;
221 static HRESULT WINAPI FolderItemImpl_GetIDsOfNames(FolderItem *iface,
222 REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid,
223 DISPID *rgDispId)
225 ITypeInfo *ti;
226 HRESULT hr;
228 TRACE("(%p,%p,%p,%u,%d,%p)\n", iface, riid, rgszNames, cNames, lcid,
229 rgDispId);
231 hr = get_typeinfo(FolderItem_tid, &ti);
232 if (SUCCEEDED(hr))
233 hr = ITypeInfo_GetIDsOfNames(ti, rgszNames, cNames, rgDispId);
234 return hr;
237 static HRESULT WINAPI FolderItemImpl_Invoke(FolderItem *iface,
238 DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
239 DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo,
240 UINT *puArgErr)
242 FolderItemImpl *This = impl_from_FolderItem(iface);
243 ITypeInfo *ti;
244 HRESULT hr;
246 TRACE("(%p,%d,%p,%d,%u,%p,%p,%p,%p)\n", iface, dispIdMember, riid, lcid,
247 wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
249 hr = get_typeinfo(FolderItem_tid, &ti);
250 if (SUCCEEDED(hr))
251 hr = ITypeInfo_Invoke(ti, This, dispIdMember, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
252 return hr;
255 static HRESULT WINAPI FolderItemImpl_get_Application(FolderItem *iface,
256 IDispatch **ppid)
258 FIXME("(%p,%p)\n", iface, ppid);
260 *ppid = NULL;
261 return E_NOTIMPL;
264 static HRESULT WINAPI FolderItemImpl_get_Parent(FolderItem *iface,
265 IDispatch **ppid)
267 FIXME("(%p,%p)\n", iface, ppid);
269 *ppid = NULL;
270 return E_NOTIMPL;
273 static HRESULT WINAPI FolderItemImpl_get_Name(FolderItem *iface, BSTR *pbs)
275 FIXME("(%p,%p)\n", iface, pbs);
277 *pbs = NULL;
278 return E_NOTIMPL;
281 static HRESULT WINAPI FolderItemImpl_put_Name(FolderItem *iface, BSTR bs)
283 FIXME("(%p,%s)\n", iface, debugstr_w(bs));
285 return E_NOTIMPL;
288 static HRESULT WINAPI FolderItemImpl_get_Path(FolderItem *iface, BSTR *pbs)
290 FolderItemImpl *This = impl_from_FolderItem(iface);
291 HRESULT ret = S_OK;
292 WCHAR *pathW;
293 int len;
295 TRACE("(%p,%p)\n", iface, pbs);
297 *pbs = NULL;
298 if (V_VT(&This->dir) == VT_I4)
300 pathW = HeapAlloc(GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR));
301 if (!pathW) return E_OUTOFMEMORY;
302 ret = SHGetFolderPathW(NULL, V_I4(&This->dir), NULL, SHGFP_TYPE_CURRENT,
303 pathW);
304 if (ret == S_OK)
305 *pbs = SysAllocString(pathW);
306 else if (ret == E_INVALIDARG)
308 FIXME("not implemented for %#x\n", V_I4(&This->dir));
309 ret = E_NOTIMPL;
311 HeapFree(GetProcessHeap(), 0, pathW);
313 else /* VT_BSTR */
315 pathW = V_BSTR(&This->dir);
316 len = lstrlenW(pathW);
317 *pbs = SysAllocStringLen(pathW, pathW[len - 1] == '\\' ? len - 1 : len);
319 if (ret == S_OK && !*pbs)
320 ret = E_OUTOFMEMORY;
321 return ret;
324 static HRESULT WINAPI FolderItemImpl_get_GetLink(FolderItem *iface,
325 IDispatch **ppid)
327 FIXME("(%p,%p)\n", iface, ppid);
329 *ppid = NULL;
330 return E_NOTIMPL;
333 static HRESULT WINAPI FolderItemImpl_get_GetFolder(FolderItem *iface,
334 IDispatch **ppid)
336 FIXME("(%p,%p)\n", iface, ppid);
338 *ppid = NULL;
339 return E_NOTIMPL;
342 static HRESULT WINAPI FolderItemImpl_get_IsLink(FolderItem *iface,
343 VARIANT_BOOL *pb)
345 FIXME("(%p,%p)\n", iface, pb);
347 return E_NOTIMPL;
350 static HRESULT WINAPI FolderItemImpl_get_IsFolder(FolderItem *iface,
351 VARIANT_BOOL *pb)
353 FIXME("(%p,%p)\n", iface, pb);
355 return E_NOTIMPL;
358 static HRESULT WINAPI FolderItemImpl_get_IsFileSystem(FolderItem *iface,
359 VARIANT_BOOL *pb)
361 FIXME("(%p,%p)\n", iface, pb);
363 return E_NOTIMPL;
366 static HRESULT WINAPI FolderItemImpl_get_IsBrowsable(FolderItem *iface,
367 VARIANT_BOOL *pb)
369 FIXME("(%p,%p)\n", iface, pb);
371 return E_NOTIMPL;
374 static HRESULT WINAPI FolderItemImpl_get_ModifyDate(FolderItem *iface,
375 DATE *pdt)
377 FIXME("(%p,%p)\n", iface, pdt);
379 return E_NOTIMPL;
382 static HRESULT WINAPI FolderItemImpl_put_ModifyDate(FolderItem *iface, DATE dt)
384 FIXME("(%p,%f)\n", iface, dt);
386 return E_NOTIMPL;
389 static HRESULT WINAPI FolderItemImpl_get_Size(FolderItem *iface, LONG *pul)
391 FIXME("(%p,%p)\n", iface, pul);
393 return E_NOTIMPL;
396 static HRESULT WINAPI FolderItemImpl_get_Type(FolderItem *iface, BSTR *pbs)
398 FIXME("(%p,%p)\n", iface, pbs);
400 *pbs = NULL;
401 return E_NOTIMPL;
404 static HRESULT WINAPI FolderItemImpl_Verbs(FolderItem *iface,
405 FolderItemVerbs **ppfic)
407 FIXME("(%p,%p)\n", iface, ppfic);
409 *ppfic = NULL;
410 return E_NOTIMPL;
413 static HRESULT WINAPI FolderItemImpl_InvokeVerb(FolderItem *iface,
414 VARIANT vVerb)
416 FIXME("(%p)\n", iface);
418 return E_NOTIMPL;
421 static const FolderItemVtbl FolderItemImpl_Vtbl = {
422 FolderItemImpl_QueryInterface,
423 FolderItemImpl_AddRef,
424 FolderItemImpl_Release,
425 FolderItemImpl_GetTypeInfoCount,
426 FolderItemImpl_GetTypeInfo,
427 FolderItemImpl_GetIDsOfNames,
428 FolderItemImpl_Invoke,
429 FolderItemImpl_get_Application,
430 FolderItemImpl_get_Parent,
431 FolderItemImpl_get_Name,
432 FolderItemImpl_put_Name,
433 FolderItemImpl_get_Path,
434 FolderItemImpl_get_GetLink,
435 FolderItemImpl_get_GetFolder,
436 FolderItemImpl_get_IsLink,
437 FolderItemImpl_get_IsFolder,
438 FolderItemImpl_get_IsFileSystem,
439 FolderItemImpl_get_IsBrowsable,
440 FolderItemImpl_get_ModifyDate,
441 FolderItemImpl_put_ModifyDate,
442 FolderItemImpl_get_Size,
443 FolderItemImpl_get_Type,
444 FolderItemImpl_Verbs,
445 FolderItemImpl_InvokeVerb
448 static HRESULT FolderItem_Constructor(VARIANT *dir, FolderItem **ppfi)
450 FolderItemImpl *This;
451 HRESULT ret;
453 *ppfi = NULL;
455 This = HeapAlloc(GetProcessHeap(), 0, sizeof(FolderItemImpl));
456 if (!This) return E_OUTOFMEMORY;
457 This->FolderItem_iface.lpVtbl = &FolderItemImpl_Vtbl;
458 This->ref = 1;
460 VariantInit(&This->dir);
461 ret = VariantCopy(&This->dir, dir);
462 if (FAILED(ret))
464 HeapFree(GetProcessHeap(), 0, This);
465 return E_OUTOFMEMORY;
468 *ppfi = &This->FolderItem_iface;
469 return ret;
472 static HRESULT WINAPI FolderImpl_QueryInterface(Folder3 *iface, REFIID riid,
473 LPVOID *ppv)
475 FolderImpl *This = impl_from_Folder(iface);
477 TRACE("(%p,%p,%p)\n", iface, riid, ppv);
479 if (!ppv) return E_INVALIDARG;
481 if (IsEqualIID(&IID_IUnknown, riid) ||
482 IsEqualIID(&IID_IDispatch, riid) ||
483 IsEqualIID(&IID_Folder, riid) ||
484 IsEqualIID(&IID_Folder2, riid) ||
485 IsEqualIID(&IID_Folder3, riid))
486 *ppv = &This->Folder3_iface;
487 else
489 FIXME("not implemented for %s\n", shdebugstr_guid(riid));
490 *ppv = NULL;
491 return E_NOINTERFACE;
493 IUnknown_AddRef((IUnknown*)*ppv);
494 return S_OK;
497 static ULONG WINAPI FolderImpl_AddRef(Folder3 *iface)
499 FolderImpl *This = impl_from_Folder(iface);
500 ULONG ref = InterlockedIncrement(&This->ref);
502 TRACE("(%p), new refcount=%i\n", iface, ref);
504 return ref;
507 static ULONG WINAPI FolderImpl_Release(Folder3 *iface)
509 FolderImpl *This = impl_from_Folder(iface);
510 ULONG ref = InterlockedDecrement(&This->ref);
512 TRACE("(%p), new refcount=%i\n", iface, ref);
514 if (!ref)
516 VariantClear(&This->dir);
517 HeapFree(GetProcessHeap(), 0, This);
519 return ref;
522 static HRESULT WINAPI FolderImpl_GetTypeInfoCount(Folder3 *iface, UINT *pctinfo)
524 TRACE("(%p,%p)\n", iface, pctinfo);
526 *pctinfo = 1;
527 return S_OK;
530 static HRESULT WINAPI FolderImpl_GetTypeInfo(Folder3 *iface, UINT iTInfo,
531 LCID lcid, ITypeInfo **ppTInfo)
533 HRESULT hr;
535 TRACE("(%p,%u,%d,%p)\n", iface, iTInfo, lcid, ppTInfo);
537 hr = get_typeinfo(Folder3_tid, ppTInfo);
538 if (SUCCEEDED(hr))
539 ITypeInfo_AddRef(*ppTInfo);
541 return hr;
544 static HRESULT WINAPI FolderImpl_GetIDsOfNames(Folder3 *iface, REFIID riid,
545 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
547 ITypeInfo *ti;
548 HRESULT hr;
550 TRACE("(%p,%p,%p,%u,%d,%p)\n", iface, riid, rgszNames, cNames, lcid,
551 rgDispId);
553 hr = get_typeinfo(Folder3_tid, &ti);
554 if (SUCCEEDED(hr))
555 hr = ITypeInfo_GetIDsOfNames(ti, rgszNames, cNames, rgDispId);
556 return hr;
559 static HRESULT WINAPI FolderImpl_Invoke(Folder3 *iface, DISPID dispIdMember,
560 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
561 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
563 FolderImpl *This = impl_from_Folder(iface);
564 ITypeInfo *ti;
565 HRESULT hr;
567 TRACE("(%p,%d,%p,%d,%u,%p,%p,%p,%p)\n", iface, dispIdMember, riid, lcid,
568 wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
570 hr = get_typeinfo(Folder3_tid, &ti);
571 if (SUCCEEDED(hr))
572 hr = ITypeInfo_Invoke(ti, This, dispIdMember, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
573 return hr;
576 static HRESULT WINAPI FolderImpl_get_Title(Folder3 *iface, BSTR *pbs)
578 FolderImpl *This = impl_from_Folder(iface);
579 WCHAR *p;
580 int len;
582 TRACE("(%p,%p)\n", iface, pbs);
584 *pbs = NULL;
586 if (V_VT(&This->dir) == VT_I4)
588 FIXME("special folder constants are not supported\n");
589 return E_NOTIMPL;
591 p = PathFindFileNameW(V_BSTR(&This->dir));
592 len = lstrlenW(p);
593 *pbs = SysAllocStringLen(p, p[len - 1] == '\\' ? len - 1 : len);
594 return *pbs ? S_OK : E_OUTOFMEMORY;
597 static HRESULT WINAPI FolderImpl_get_Application(Folder3 *iface,
598 IDispatch **ppid)
600 FIXME("(%p,%p)\n", iface, ppid);
602 *ppid = NULL;
603 return E_NOTIMPL;
606 static HRESULT WINAPI FolderImpl_get_Parent(Folder3 *iface, IDispatch **ppid)
608 FIXME("(%p,%p)\n", iface, ppid);
610 *ppid = NULL;
611 return E_NOTIMPL;
614 static HRESULT WINAPI FolderImpl_get_ParentFolder(Folder3 *iface, Folder **ppsf)
616 FIXME("(%p,%p)\n", iface, ppsf);
618 *ppsf = NULL;
619 return E_NOTIMPL;
622 static HRESULT WINAPI FolderImpl_Items(Folder3 *iface, FolderItems **ppid)
624 FIXME("(%p,%p)\n", iface, ppid);
626 *ppid = NULL;
627 return E_NOTIMPL;
630 static HRESULT WINAPI FolderImpl_ParseName(Folder3 *iface, BSTR bName,
631 FolderItem **ppid)
633 FIXME("(%p,%s,%p)\n", iface, debugstr_w(bName), ppid);
635 *ppid = NULL;
636 return E_NOTIMPL;
639 static HRESULT WINAPI FolderImpl_NewFolder(Folder3 *iface, BSTR bName,
640 VARIANT vOptions)
642 FIXME("(%p,%s)\n", iface, debugstr_w(bName));
644 return E_NOTIMPL;
647 static HRESULT WINAPI FolderImpl_MoveHere(Folder3 *iface, VARIANT vItem,
648 VARIANT vOptions)
650 FIXME("(%p)\n", iface);
652 return E_NOTIMPL;
655 static HRESULT WINAPI FolderImpl_CopyHere(Folder3 *iface, VARIANT vItem,
656 VARIANT vOptions)
658 FIXME("(%p)\n", iface);
660 return E_NOTIMPL;
663 static HRESULT WINAPI FolderImpl_GetDetailsOf(Folder3 *iface, VARIANT vItem,
664 int iColumn, BSTR *pbs)
666 FIXME("(%p,%d,%p)\n", iface, iColumn, pbs);
668 *pbs = NULL;
669 return E_NOTIMPL;
672 static HRESULT WINAPI FolderImpl_get_Self(Folder3 *iface, FolderItem **ppfi)
674 FolderImpl *This = impl_from_Folder(iface);
676 TRACE("(%p,%p)\n", iface, ppfi);
678 return FolderItem_Constructor(&This->dir, ppfi);
681 static HRESULT WINAPI FolderImpl_get_OfflineStatus(Folder3 *iface, LONG *pul)
683 FIXME("(%p,%p)\n", iface, pul);
685 return E_NOTIMPL;
688 static HRESULT WINAPI FolderImpl_Synchronize(Folder3 *iface)
690 FIXME("(%p)\n", iface);
692 return E_NOTIMPL;
695 static HRESULT WINAPI FolderImpl_get_HaveToShowWebViewBarricade(Folder3 *iface,
696 VARIANT_BOOL *pbHaveToShowWebViewBarricade)
698 FIXME("(%p,%p)\n", iface, pbHaveToShowWebViewBarricade);
700 return E_NOTIMPL;
703 static HRESULT WINAPI FolderImpl_DismissedWebViewBarricade(Folder3 *iface)
705 FIXME("(%p)\n", iface);
707 return E_NOTIMPL;
710 static HRESULT WINAPI FolderImpl_get_ShowWebViewBarricade(Folder3 *iface,
711 VARIANT_BOOL *pbShowWebViewBarricade)
713 FIXME("(%p,%p)\n", iface, pbShowWebViewBarricade);
715 return E_NOTIMPL;
718 static HRESULT WINAPI FolderImpl_put_ShowWebViewBarricade(Folder3 *iface,
719 VARIANT_BOOL bShowWebViewBarricade)
721 FIXME("(%p,%d)\n", iface, bShowWebViewBarricade);
723 return E_NOTIMPL;
726 static const Folder3Vtbl FolderImpl_Vtbl = {
727 FolderImpl_QueryInterface,
728 FolderImpl_AddRef,
729 FolderImpl_Release,
730 FolderImpl_GetTypeInfoCount,
731 FolderImpl_GetTypeInfo,
732 FolderImpl_GetIDsOfNames,
733 FolderImpl_Invoke,
734 FolderImpl_get_Title,
735 FolderImpl_get_Application,
736 FolderImpl_get_Parent,
737 FolderImpl_get_ParentFolder,
738 FolderImpl_Items,
739 FolderImpl_ParseName,
740 FolderImpl_NewFolder,
741 FolderImpl_MoveHere,
742 FolderImpl_CopyHere,
743 FolderImpl_GetDetailsOf,
744 FolderImpl_get_Self,
745 FolderImpl_get_OfflineStatus,
746 FolderImpl_Synchronize,
747 FolderImpl_get_HaveToShowWebViewBarricade,
748 FolderImpl_DismissedWebViewBarricade,
749 FolderImpl_get_ShowWebViewBarricade,
750 FolderImpl_put_ShowWebViewBarricade
753 static HRESULT Folder_Constructor(VARIANT *dir, Folder **ppsdf)
755 FolderImpl *This;
756 HRESULT ret;
758 *ppsdf = NULL;
760 switch (V_VT(dir))
762 case VT_I4:
763 /* FIXME: add some checks */
764 break;
765 case VT_BSTR:
766 if (PathIsDirectoryW(V_BSTR(dir)) &&
767 !PathIsRelativeW(V_BSTR(dir)) &&
768 PathFileExistsW(V_BSTR(dir)))
769 break;
770 default:
771 return S_FALSE;
774 This = HeapAlloc(GetProcessHeap(), 0, sizeof(FolderImpl));
775 if (!This) return E_OUTOFMEMORY;
776 This->Folder3_iface.lpVtbl = &FolderImpl_Vtbl;
777 This->ref = 1;
779 VariantInit(&This->dir);
780 ret = VariantCopy(&This->dir, dir);
781 if (FAILED(ret))
783 HeapFree(GetProcessHeap(), 0, This);
784 return E_OUTOFMEMORY;
787 *ppsdf = (Folder*)This;
788 return ret;
791 static HRESULT WINAPI ShellDispatch_QueryInterface(IShellDispatch5 *iface,
792 REFIID riid, LPVOID *ppv)
794 ShellDispatch *This = impl_from_IShellDispatch5(iface);
796 TRACE("(%p,%p,%p)\n", iface, riid, ppv);
798 if (!ppv) return E_INVALIDARG;
800 if (IsEqualIID(&IID_IUnknown, riid) ||
801 IsEqualIID(&IID_IDispatch, riid) ||
802 IsEqualIID(&IID_IShellDispatch, riid) ||
803 IsEqualIID(&IID_IShellDispatch2, riid) ||
804 IsEqualIID(&IID_IShellDispatch3, riid) ||
805 IsEqualIID(&IID_IShellDispatch4, riid) ||
806 IsEqualIID(&IID_IShellDispatch5, riid))
807 *ppv = &This->IShellDispatch5_iface;
808 else
810 FIXME("not implemented for %s\n", shdebugstr_guid(riid));
811 *ppv = NULL;
812 return E_NOINTERFACE;
815 IShellDispatch5_AddRef(iface);
816 return S_OK;
819 static ULONG WINAPI ShellDispatch_AddRef(IShellDispatch5 *iface)
821 ShellDispatch *This = impl_from_IShellDispatch5(iface);
822 ULONG ref = InterlockedIncrement(&This->ref);
824 TRACE("(%p), new refcount=%i\n", iface, ref);
826 return ref;
829 static ULONG WINAPI ShellDispatch_Release(IShellDispatch5 *iface)
831 ShellDispatch *This = impl_from_IShellDispatch5(iface);
832 ULONG ref = InterlockedDecrement(&This->ref);
834 TRACE("(%p), new refcount=%i\n", iface, ref);
836 if (!ref)
837 HeapFree(GetProcessHeap(), 0, This);
839 return ref;
842 static HRESULT WINAPI ShellDispatch_GetTypeInfoCount(IShellDispatch5 *iface,
843 UINT *pctinfo)
845 TRACE("(%p,%p)\n", iface, pctinfo);
847 *pctinfo = 1;
848 return S_OK;
851 static HRESULT WINAPI ShellDispatch_GetTypeInfo(IShellDispatch5 *iface,
852 UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
854 HRESULT hr;
856 TRACE("(%p,%u,%d,%p)\n", iface, iTInfo, lcid, ppTInfo);
858 hr = get_typeinfo(IShellDispatch5_tid, ppTInfo);
859 if (SUCCEEDED(hr))
860 ITypeInfo_AddRef(*ppTInfo);
861 return hr;
864 static HRESULT WINAPI ShellDispatch_GetIDsOfNames(IShellDispatch5 *iface,
865 REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
867 ITypeInfo *ti;
868 HRESULT hr;
870 TRACE("(%p,%p,%p,%u,%d,%p)\n", iface, riid, rgszNames, cNames, lcid,
871 rgDispId);
873 hr = get_typeinfo(IShellDispatch5_tid, &ti);
874 if (SUCCEEDED(hr))
875 hr = ITypeInfo_GetIDsOfNames(ti, rgszNames, cNames, rgDispId);
876 return hr;
879 static HRESULT WINAPI ShellDispatch_Invoke(IShellDispatch5 *iface,
880 DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
881 DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo,
882 UINT *puArgErr)
884 ShellDispatch *This = impl_from_IShellDispatch5(iface);
885 ITypeInfo *ti;
886 HRESULT hr;
888 TRACE("(%p,%d,%p,%d,%u,%p,%p,%p,%p)\n", iface, dispIdMember, riid, lcid,
889 wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
891 hr = get_typeinfo(IShellDispatch5_tid, &ti);
892 if (SUCCEEDED(hr))
893 hr = ITypeInfo_Invoke(ti, This, dispIdMember, wFlags, pDispParams,
894 pVarResult, pExcepInfo, puArgErr);
895 return hr;
898 static HRESULT WINAPI ShellDispatch_get_Application(IShellDispatch5 *iface,
899 IDispatch **ppid)
901 FIXME("(%p,%p)\n", iface, ppid);
903 *ppid = NULL;
904 return E_NOTIMPL;
907 static HRESULT WINAPI ShellDispatch_get_Parent(IShellDispatch5 *iface,
908 IDispatch **ppid)
910 FIXME("(%p,%p)\n", iface, ppid);
912 *ppid = NULL;
913 return E_NOTIMPL;
916 static HRESULT WINAPI ShellDispatch_NameSpace(IShellDispatch5 *iface,
917 VARIANT vDir, Folder **ppsdf)
919 TRACE("(%p,%p)\n", iface, ppsdf);
921 return Folder_Constructor(&vDir, ppsdf);
924 static HRESULT WINAPI ShellDispatch_BrowseForFolder(IShellDispatch5 *iface,
925 LONG Hwnd, BSTR Title, LONG Options, VARIANT RootFolder, Folder **ppsdf)
927 FIXME("(%p,%x,%s,%x,%p)\n", iface, Hwnd, debugstr_w(Title), Options, ppsdf);
929 *ppsdf = NULL;
930 return E_NOTIMPL;
933 static HRESULT WINAPI ShellDispatch_Windows(IShellDispatch5 *iface,
934 IDispatch **ppid)
936 FIXME("(%p,%p)\n", iface, ppid);
938 *ppid = NULL;
939 return E_NOTIMPL;
942 static HRESULT WINAPI ShellDispatch_Open(IShellDispatch5 *iface, VARIANT vDir)
944 FIXME("(%p)\n", iface);
946 return E_NOTIMPL;
949 static HRESULT WINAPI ShellDispatch_Explore(IShellDispatch5 *iface, VARIANT vDir)
951 FIXME("(%p)\n", iface);
953 return E_NOTIMPL;
956 static HRESULT WINAPI ShellDispatch_MinimizeAll(IShellDispatch5 *iface)
958 FIXME("(%p)\n", iface);
960 return E_NOTIMPL;
963 static HRESULT WINAPI ShellDispatch_UndoMinimizeALL(IShellDispatch5 *iface)
965 FIXME("(%p)\n", iface);
967 return E_NOTIMPL;
970 static HRESULT WINAPI ShellDispatch_FileRun(IShellDispatch5 *iface)
972 FIXME("(%p)\n", iface);
974 return E_NOTIMPL;
977 static HRESULT WINAPI ShellDispatch_CascadeWindows(IShellDispatch5 *iface)
979 FIXME("(%p)\n", iface);
981 return E_NOTIMPL;
984 static HRESULT WINAPI ShellDispatch_TileVertically(IShellDispatch5 *iface)
986 FIXME("(%p)\n", iface);
988 return E_NOTIMPL;
991 static HRESULT WINAPI ShellDispatch_TileHorizontally(IShellDispatch5 *iface)
993 FIXME("(%p)\n", iface);
995 return E_NOTIMPL;
998 static HRESULT WINAPI ShellDispatch_ShutdownWindows(IShellDispatch5 *iface)
1000 FIXME("(%p)\n", iface);
1002 return E_NOTIMPL;
1005 static HRESULT WINAPI ShellDispatch_Suspend(IShellDispatch5 *iface)
1007 FIXME("(%p)\n", iface);
1009 return E_NOTIMPL;
1012 static HRESULT WINAPI ShellDispatch_EjectPC(IShellDispatch5 *iface)
1014 FIXME("(%p)\n", iface);
1016 return E_NOTIMPL;
1019 static HRESULT WINAPI ShellDispatch_SetTime(IShellDispatch5 *iface)
1021 FIXME("(%p)\n", iface);
1023 return E_NOTIMPL;
1026 static HRESULT WINAPI ShellDispatch_TrayProperties(IShellDispatch5 *iface)
1028 FIXME("(%p)\n", iface);
1030 return E_NOTIMPL;
1033 static HRESULT WINAPI ShellDispatch_Help(IShellDispatch5 *iface)
1035 FIXME("(%p)\n", iface);
1037 return E_NOTIMPL;
1040 static HRESULT WINAPI ShellDispatch_FindFiles(IShellDispatch5 *iface)
1042 FIXME("(%p)\n", iface);
1044 return E_NOTIMPL;
1047 static HRESULT WINAPI ShellDispatch_FindComputer(IShellDispatch5 *iface)
1049 FIXME("(%p)\n", iface);
1051 return E_NOTIMPL;
1054 static HRESULT WINAPI ShellDispatch_RefreshMenu(IShellDispatch5 *iface)
1056 FIXME("(%p)\n", iface);
1058 return E_NOTIMPL;
1061 static HRESULT WINAPI ShellDispatch_ControlPanelItem(IShellDispatch5 *iface,
1062 BSTR szDir)
1064 FIXME("(%p,%s)\n", iface, debugstr_w(szDir));
1066 return E_NOTIMPL;
1069 static HRESULT WINAPI ShellDispatch_IsRestricted(IShellDispatch5 *iface, BSTR group, BSTR restriction, LONG *value)
1071 FIXME("(%s, %s, %p): stub\n", debugstr_w(group), debugstr_w(restriction), value);
1072 return E_NOTIMPL;
1075 static HRESULT WINAPI ShellDispatch_ShellExecute(IShellDispatch5 *iface, BSTR file, VARIANT args, VARIANT dir,
1076 VARIANT op, VARIANT show)
1078 FIXME("(%s): stub\n", debugstr_w(file));
1079 return E_NOTIMPL;
1082 static HRESULT WINAPI ShellDispatch_FindPrinter(IShellDispatch5 *iface, BSTR name, BSTR location, BSTR model)
1084 FIXME("(%s, %s, %s): stub\n", debugstr_w(name), debugstr_w(location), debugstr_w(model));
1085 return E_NOTIMPL;
1088 static HRESULT WINAPI ShellDispatch_GetSystemInformation(IShellDispatch5 *iface, BSTR name, VARIANT *ret)
1090 FIXME("(%s, %p): stub\n", debugstr_w(name), ret);
1091 return E_NOTIMPL;
1094 static HRESULT WINAPI ShellDispatch_ServiceStart(IShellDispatch5 *iface, BSTR service, VARIANT persistent, VARIANT *ret)
1096 FIXME("(%s, %p): stub\n", debugstr_w(service), ret);
1097 return E_NOTIMPL;
1100 static HRESULT WINAPI ShellDispatch_ServiceStop(IShellDispatch5 *iface, BSTR service, VARIANT persistent, VARIANT *ret)
1102 FIXME("(%s, %p): stub\n", debugstr_w(service), ret);
1103 return E_NOTIMPL;
1106 static HRESULT WINAPI ShellDispatch_IsServiceRunning(IShellDispatch5 *iface, BSTR name, VARIANT *running)
1108 SERVICE_STATUS_PROCESS status;
1109 SC_HANDLE scm, service;
1110 DWORD dummy;
1112 TRACE("(%s, %p)\n", debugstr_w(name), running);
1114 V_VT(running) = VT_BOOL;
1115 V_BOOL(running) = VARIANT_FALSE;
1117 scm = OpenSCManagerW(NULL, NULL, SC_MANAGER_CONNECT);
1118 if (!scm)
1120 ERR("failed to connect to service manager\n");
1121 return S_OK;
1124 service = OpenServiceW(scm, name, SERVICE_QUERY_STATUS);
1125 if (!service)
1127 ERR("Failed to open service %s (%u)\n", debugstr_w(name), GetLastError());
1128 CloseServiceHandle(scm);
1129 return S_OK;
1132 if (!QueryServiceStatusEx(service, SC_STATUS_PROCESS_INFO, (BYTE *)&status,
1133 sizeof(SERVICE_STATUS_PROCESS), &dummy))
1135 TRACE("failed to query service status (%u)\n", GetLastError());
1136 CloseServiceHandle(service);
1137 CloseServiceHandle(scm);
1138 return S_OK;
1141 if (status.dwCurrentState == SERVICE_RUNNING)
1142 V_BOOL(running) = VARIANT_TRUE;
1144 CloseServiceHandle(service);
1145 CloseServiceHandle(scm);
1147 return S_OK;
1150 static HRESULT WINAPI ShellDispatch_CanStartStopService(IShellDispatch5 *iface, BSTR service, VARIANT *ret)
1152 FIXME("(%s, %p): stub\n", debugstr_w(service), ret);
1153 return E_NOTIMPL;
1156 static HRESULT WINAPI ShellDispatch_ShowBrowserBar(IShellDispatch5 *iface, BSTR clsid, VARIANT show, VARIANT *ret)
1158 FIXME("(%s, %p): stub\n", debugstr_w(clsid), ret);
1159 return E_NOTIMPL;
1162 static HRESULT WINAPI ShellDispatch_AddToRecent(IShellDispatch5 *iface, VARIANT file, BSTR category)
1164 FIXME("(%s): stub\n", debugstr_w(category));
1165 return E_NOTIMPL;
1168 static HRESULT WINAPI ShellDispatch_WindowsSecurity(IShellDispatch5 *iface)
1170 FIXME("stub\n");
1171 return E_NOTIMPL;
1174 static HRESULT WINAPI ShellDispatch_ToggleDesktop(IShellDispatch5 *iface)
1176 FIXME("stub\n");
1177 return E_NOTIMPL;
1180 static HRESULT WINAPI ShellDispatch_ExplorerPolicy(IShellDispatch5 *iface, BSTR policy, VARIANT *value)
1182 FIXME("(%s, %p): stub\n", debugstr_w(policy), value);
1183 return E_NOTIMPL;
1186 static HRESULT WINAPI ShellDispatch_GetSetting(IShellDispatch5 *iface, LONG setting, VARIANT_BOOL *result)
1188 FIXME("(%d %p): stub\n", setting, result);
1189 return E_NOTIMPL;
1192 static HRESULT WINAPI ShellDispatch_WindowSwitcher(IShellDispatch5 *iface)
1194 FIXME("stub\n");
1195 return E_NOTIMPL;
1198 static const IShellDispatch5Vtbl ShellDispatch5Vtbl = {
1199 ShellDispatch_QueryInterface,
1200 ShellDispatch_AddRef,
1201 ShellDispatch_Release,
1202 ShellDispatch_GetTypeInfoCount,
1203 ShellDispatch_GetTypeInfo,
1204 ShellDispatch_GetIDsOfNames,
1205 ShellDispatch_Invoke,
1206 ShellDispatch_get_Application,
1207 ShellDispatch_get_Parent,
1208 ShellDispatch_NameSpace,
1209 ShellDispatch_BrowseForFolder,
1210 ShellDispatch_Windows,
1211 ShellDispatch_Open,
1212 ShellDispatch_Explore,
1213 ShellDispatch_MinimizeAll,
1214 ShellDispatch_UndoMinimizeALL,
1215 ShellDispatch_FileRun,
1216 ShellDispatch_CascadeWindows,
1217 ShellDispatch_TileVertically,
1218 ShellDispatch_TileHorizontally,
1219 ShellDispatch_ShutdownWindows,
1220 ShellDispatch_Suspend,
1221 ShellDispatch_EjectPC,
1222 ShellDispatch_SetTime,
1223 ShellDispatch_TrayProperties,
1224 ShellDispatch_Help,
1225 ShellDispatch_FindFiles,
1226 ShellDispatch_FindComputer,
1227 ShellDispatch_RefreshMenu,
1228 ShellDispatch_ControlPanelItem,
1229 ShellDispatch_IsRestricted,
1230 ShellDispatch_ShellExecute,
1231 ShellDispatch_FindPrinter,
1232 ShellDispatch_GetSystemInformation,
1233 ShellDispatch_ServiceStart,
1234 ShellDispatch_ServiceStop,
1235 ShellDispatch_IsServiceRunning,
1236 ShellDispatch_CanStartStopService,
1237 ShellDispatch_ShowBrowserBar,
1238 ShellDispatch_AddToRecent,
1239 ShellDispatch_WindowsSecurity,
1240 ShellDispatch_ToggleDesktop,
1241 ShellDispatch_ExplorerPolicy,
1242 ShellDispatch_GetSetting,
1243 ShellDispatch_WindowSwitcher
1246 HRESULT WINAPI IShellDispatch_Constructor(IUnknown *outer, REFIID riid, void **ppv)
1248 ShellDispatch *This;
1249 HRESULT ret;
1251 TRACE("(%p, %s)\n", outer, debugstr_guid(riid));
1253 *ppv = NULL;
1255 if (outer) return CLASS_E_NOAGGREGATION;
1257 This = HeapAlloc(GetProcessHeap(), 0, sizeof(ShellDispatch));
1258 if (!This) return E_OUTOFMEMORY;
1259 This->IShellDispatch5_iface.lpVtbl = &ShellDispatch5Vtbl;
1260 This->ref = 1;
1262 ret = IShellDispatch5_QueryInterface(&This->IShellDispatch5_iface, riid, ppv);
1263 IShellDispatch5_Release(&This->IShellDispatch5_iface);
1264 return ret;