static HRESULT WINAPI IShellItemArray_fnEnumItems(IShellItemArray *iface, IEnumShellItems **ppenumShellItems) { IShellItemArrayImpl *This = impl_from_IShellItemArray(iface); TRACE("%p (%p)\n", This, ppenumShellItems); return IEnumShellItems_Constructor(iface, ppenumShellItems); }
static ULONG WINAPI IShellItemArray_fnAddRef(IShellItemArray *iface) { IShellItemArrayImpl *This = impl_from_IShellItemArray(iface); LONG ref = InterlockedIncrement(&This->ref); TRACE("%p - ref %d\n", This, ref); return ref; }
static HRESULT WINAPI IShellItemArray_fnGetCount(IShellItemArray *iface, DWORD *pdwNumItems) { IShellItemArrayImpl *This = impl_from_IShellItemArray(iface); TRACE("%p (%p)\n", This, pdwNumItems); *pdwNumItems = This->item_count; return S_OK; }
static HRESULT WINAPI IShellItemArray_fnGetPropertyStore(IShellItemArray *iface, GETPROPERTYSTOREFLAGS flags, REFIID riid, void **ppv) { IShellItemArrayImpl *This = impl_from_IShellItemArray(iface); FIXME("Stub: %p (%x, %s, %p)\n", This, flags, shdebugstr_guid(riid), ppv); return E_NOTIMPL; }
static HRESULT WINAPI IShellItemArray_fnGetPropertyDescriptionList(IShellItemArray *iface, REFPROPERTYKEY keyType, REFIID riid, void **ppv) { IShellItemArrayImpl *This = impl_from_IShellItemArray(iface); FIXME("Stub: %p (%p, %s, %p)\n", This, keyType, shdebugstr_guid(riid), ppv); return E_NOTIMPL; }
static HRESULT WINAPI IShellItemArray_fnBindToHandler(IShellItemArray *iface, IBindCtx *pbc, REFGUID bhid, REFIID riid, void **ppvOut) { IShellItemArrayImpl *This = impl_from_IShellItemArray(iface); FIXME("Stub: %p (%p, %s, %s, %p)\n", This, pbc, shdebugstr_guid(bhid), shdebugstr_guid(riid), ppvOut); return E_NOTIMPL; }
static HRESULT WINAPI IShellItemArray_fnGetItemAt(IShellItemArray *iface, DWORD dwIndex, IShellItem **ppsi) { IShellItemArrayImpl *This = impl_from_IShellItemArray(iface); TRACE("%p (%x, %p)\n", This, dwIndex, ppsi); /* zero indexed */ if(dwIndex + 1 > This->item_count) return E_FAIL; *ppsi = This->array[dwIndex]; IShellItem_AddRef(*ppsi); return S_OK; }
static HRESULT WINAPI IShellItemArray_fnGetAttributes(IShellItemArray *iface, SIATTRIBFLAGS AttribFlags, SFGAOF sfgaoMask, SFGAOF *psfgaoAttribs) { IShellItemArrayImpl *This = impl_from_IShellItemArray(iface); HRESULT hr = S_OK; SFGAOF attr; UINT i; TRACE("%p (%x, %x, %p)\n", This, AttribFlags, sfgaoMask, psfgaoAttribs); if(AttribFlags & ~(SIATTRIBFLAGS_AND|SIATTRIBFLAGS_OR)) FIXME("%08x contains unsupported attribution flags\n", AttribFlags); for(i = 0; i < This->item_count; i++) { hr = IShellItem_GetAttributes(This->array[i], sfgaoMask, &attr); if(FAILED(hr)) break; if(i == 0) { *psfgaoAttribs = attr; continue; } switch(AttribFlags & SIATTRIBFLAGS_MASK) { case SIATTRIBFLAGS_AND: *psfgaoAttribs &= attr; break; case SIATTRIBFLAGS_OR: *psfgaoAttribs |= attr; break; } } if(SUCCEEDED(hr)) { if(*psfgaoAttribs == sfgaoMask) return S_OK; return S_FALSE; } return hr; }
HRESULT WINAPI SHCreateShellItemArrayFromIDLists(UINT cidl, PCIDLIST_ABSOLUTE_ARRAY pidl_array, IShellItemArray **psia) { IShellItemArrayImpl *This; IShellItem **array; HRESULT ret; UINT i; TRACE("%d, %p, %p\n", cidl, pidl_array, psia); *psia = NULL; if(cidl == 0) return E_INVALIDARG; array = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IShellItem*)); if(!array) return E_OUTOFMEMORY; for(i = 0; i < cidl; i++) { ret = SHCreateShellItem(NULL, NULL, pidl_array[i], &array[i]); if(FAILED(ret)) break; } if(SUCCEEDED(ret)) { ret = IShellItemArray_Constructor(NULL, &IID_IShellItemArray, (void**)psia); if(SUCCEEDED(ret)) { This = impl_from_IShellItemArray(*psia); This->array = array; This->item_count = cidl; return S_OK; } } for(i = 0; i < cidl; i++) if(array[i]) IShellItem_Release(array[i]); HeapFree(GetProcessHeap(), 0, array); *psia = NULL; return ret; }
static ULONG WINAPI IShellItemArray_fnRelease(IShellItemArray *iface) { IShellItemArrayImpl *This = impl_from_IShellItemArray(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("%p - ref %d\n", This, ref); if(!ref) { UINT i; TRACE("Freeing.\n"); for(i = 0; i < This->item_count; i++) IShellItem_Release(This->array[i]); HeapFree(GetProcessHeap(), 0, This->array); HeapFree(GetProcessHeap(), 0, This); return 0; } return ref; }
static HRESULT WINAPI IShellItemArray_fnQueryInterface(IShellItemArray *iface, REFIID riid, void **ppvObject) { IShellItemArrayImpl *This = impl_from_IShellItemArray(iface); TRACE("%p (%s, %p)\n", This, shdebugstr_guid(riid), ppvObject); *ppvObject = NULL; if(IsEqualIID(riid, &IID_IShellItemArray) || IsEqualIID(riid, &IID_IUnknown)) { *ppvObject = &This->IShellItemArray_iface; } if(*ppvObject) { IUnknown_AddRef((IUnknown*)*ppvObject); return S_OK; } return E_NOINTERFACE; }