static HRESULT WINAPI FolderItemImpl_get_Path(FolderItem *iface, BSTR *pbs) { FolderItemImpl *This = impl_from_FolderItem(iface); HRESULT ret = S_OK; WCHAR *pathW; int len; TRACE("(%p,%p)\n", iface, pbs); *pbs = NULL; if (V_VT(&This->dir) == VT_I4) { pathW = HeapAlloc(GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR)); if (!pathW) return E_OUTOFMEMORY; ret = SHGetFolderPathW(NULL, V_I4(&This->dir), NULL, SHGFP_TYPE_CURRENT, pathW); if (ret == S_OK) *pbs = SysAllocString(pathW); else if (ret == E_INVALIDARG) { FIXME("not implemented for %#x\n", V_I4(&This->dir)); ret = E_NOTIMPL; } HeapFree(GetProcessHeap(), 0, pathW); } else /* VT_BSTR */ { pathW = V_BSTR(&This->dir); len = lstrlenW(pathW); *pbs = SysAllocStringLen(pathW, pathW[len - 1] == '\\' ? len - 1 : len); } if (ret == S_OK && !*pbs) ret = E_OUTOFMEMORY; return ret; }
static ULONG WINAPI FolderItemImpl_AddRef(FolderItem *iface) { FolderItemImpl *This = impl_from_FolderItem(iface); ULONG ref = InterlockedIncrement(&This->ref); TRACE("(%p), new refcount=%i\n", iface, ref); return ref; }
static HRESULT WINAPI FolderItemImpl_GetIDsOfNames(FolderItem *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) { FolderItemImpl *This = impl_from_FolderItem(iface); TRACE("(%p,%p,%p,%u,%d,%p)\n", iface, riid, rgszNames, cNames, lcid, rgDispId); return ITypeInfo_GetIDsOfNames(This->iTypeInfo, rgszNames, cNames, rgDispId); }
static HRESULT WINAPI FolderItemImpl_GetTypeInfo(FolderItem *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) { FolderItemImpl *This = impl_from_FolderItem(iface); TRACE("(%p,%u,%d,%p)\n", iface, iTInfo, lcid, ppTInfo); ITypeInfo_AddRef(This->iTypeInfo); *ppTInfo = This->iTypeInfo; return S_OK; }
static HRESULT WINAPI FolderItemImpl_Invoke(FolderItem *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) { FolderItemImpl *This = impl_from_FolderItem(iface); TRACE("(%p,%d,%p,%d,%u,%p,%p,%p,%p)\n", iface, dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); return ITypeInfo_Invoke(This->iTypeInfo, This, dispIdMember, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); }
static ULONG WINAPI FolderItemImpl_Release(FolderItem *iface) { FolderItemImpl *This = impl_from_FolderItem(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p), new refcount=%i\n", iface, ref); if (!ref) { VariantClear(&This->dir); HeapFree(GetProcessHeap(), 0, This); } return ref; }
static HRESULT WINAPI FolderItemImpl_Invoke(FolderItem *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) { FolderItemImpl *This = impl_from_FolderItem(iface); ITypeInfo *ti; HRESULT hr; TRACE("(%p,%d,%p,%d,%u,%p,%p,%p,%p)\n", iface, dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); hr = get_typeinfo(FolderItem_tid, &ti); if (SUCCEEDED(hr)) hr = ITypeInfo_Invoke(ti, This, dispIdMember, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); return hr; }
static HRESULT WINAPI FolderItemImpl_QueryInterface(FolderItem *iface, REFIID riid, LPVOID *ppv) { FolderItemImpl *This = impl_from_FolderItem(iface); TRACE("(%p,%p,%p)\n", iface, riid, ppv); if (!ppv) return E_INVALIDARG; if (IsEqualIID(&IID_IUnknown, riid) || IsEqualIID(&IID_IDispatch, riid) || IsEqualIID(&IID_FolderItem, riid)) *ppv = This; else { FIXME("not implemented for %s\n", shdebugstr_guid(riid)); *ppv = NULL; return E_NOINTERFACE; } IUnknown_AddRef((IUnknown*)*ppv); return S_OK; }