2 * Virtual Printers Folder
4 * Copyright 1997 Marcus Meissner
5 * Copyright 1998, 1999, 2002 Juergen Schmied
6 * Copyright 2005 Huw Davies
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 WINE_DEFAULT_DEBUG_CHANNEL (shell
);
27 /***********************************************************************
28 * Printers_IExtractIconW implementation
32 IExtractIconWVtbl
*lpVtbl
;
33 IExtractIconAVtbl
*lpvtblExtractIconA
;
38 #define _IExtractIconA_Offset ((INT_PTR)(&(((IExtractIconWImpl*)0)->lpvtblExtractIconA)))
39 #define _ICOM_THIS_From_IExtractIconA(class, name) class* This = (class*)(((char*)name)-_IExtractIconA_Offset);
41 static shvheader PrinterSFHeader
[] = {
42 {IDS_SHV_COLUMN8
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 15},
43 {IDS_SHV_COLUMN_DOCUMENTS
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 15},
44 {IDS_SHV_COLUMN_STATUS
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 15},
45 {IDS_SHV_COLUMN_COMMENTS
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 15},
46 {IDS_SHV_COLUMN_LOCATION
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 15},
47 {IDS_SHV_COLUMN_MODEL
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 15}
51 #define COLUMN_DOCUMENTS 1
52 #define COLUMN_STATUS 2
53 #define COLUMN_COMMENTS 3
54 #define COLUMN_LOCATION 4
55 #define COLUMN_MODEL 5
58 #define PrinterSHELLVIEWCOLUMNS (6)
61 /**************************************************************************
62 * IExtractIconW_QueryInterface
64 static HRESULT WINAPI
IEI_Printers_fnQueryInterface(IExtractIconW
*iface
, REFIID riid
, LPVOID
*ppvObj
)
66 IExtractIconWImpl
*This
= (IExtractIconWImpl
*)iface
;
68 TRACE("(%p)->(\n\tIID:\t%s,%p)\n", This
, debugstr_guid(riid
), ppvObj
);
72 if (IsEqualIID(riid
, &IID_IUnknown
))
76 else if (IsEqualIID(riid
, &IID_IExtractIconW
))
78 *ppvObj
= (IExtractIconW
*)This
;
80 else if (IsEqualIID(riid
, &IID_IExtractIconA
))
82 *ppvObj
= (IExtractIconA
*)&(This
->lpvtblExtractIconA
);
87 ((IExtractIconW
*)*ppvObj
)->lpVtbl
->AddRef(*ppvObj
);
88 TRACE("-- Interface: (%p)->(%p)\n",ppvObj
,*ppvObj
);
91 TRACE("-- Interface: E_NOINTERFACE\n");
95 /**************************************************************************
96 * IExtractIconW_AddRef
98 static ULONG WINAPI
IEI_Printers_fnAddRef(IExtractIconW
* iface
)
100 IExtractIconWImpl
*This
= (IExtractIconWImpl
*)iface
;
101 ULONG refCount
= InterlockedIncrement(&This
->ref
);
103 TRACE("(%p)->(count=%lu)\n", This
, refCount
- 1);
108 /**************************************************************************
109 * IExtractIconW_Release
111 static ULONG WINAPI
IEI_Printers_fnRelease(IExtractIconW
* iface
)
113 IExtractIconWImpl
*This
= (IExtractIconWImpl
*)iface
;
114 ULONG refCount
= InterlockedDecrement(&This
->ref
);
116 TRACE("(%p)->(count=%lu)\n", This
, refCount
+ 1);
120 TRACE(" destroying IExtractIcon(%p)\n",This
);
122 HeapFree(GetProcessHeap(),0,This
);
128 /**************************************************************************
129 * IExtractIconW_GetIconLocation
131 * mapping filetype to icon
133 static HRESULT WINAPI
IEI_Printers_fnGetIconLocation(
134 IExtractIconW
* iface
,
135 UINT uFlags
, /* GIL_ flags */
139 UINT
*pwFlags
) /* returned GIL_ flags */
141 IExtractIconWImpl
*This
= (IExtractIconWImpl
*)iface
;
143 TRACE("(%p) (flags=%u %p %u %p %p)\n", This
, uFlags
, szIconFile
, cchMax
, piIndex
, pwFlags
);
148 lstrcpynW(szIconFile
, swShell32Name
, cchMax
);
149 *piIndex
= -IDI_SHELL_PRINTERS_FOLDER
; /* FIXME: other icons for default, network, print to file */
151 TRACE("-- %s %x\n", debugstr_w(szIconFile
), *piIndex
);
155 /**************************************************************************
156 * IExtractIconW_Extract
158 static HRESULT WINAPI
IEI_Printers_fnExtract(IExtractIconW
*iface
, LPCWSTR pszFile
,
159 UINT nIconIndex
, HICON
*phiconLarge
,
160 HICON
*phiconSmall
, UINT nIconSize
)
162 IExtractIconWImpl
*This
= (IExtractIconWImpl
*)iface
;
165 FIXME("(%p) (file=%p index=%d %p %p size=%x) semi-stub\n", This
, debugstr_w(pszFile
),
166 (signed)nIconIndex
, phiconLarge
, phiconSmall
, nIconSize
);
168 index
= SIC_GetIconIndex(pszFile
, nIconIndex
, 0);
171 *phiconLarge
= ImageList_GetIcon(ShellBigIconList
, index
, ILD_TRANSPARENT
);
174 *phiconSmall
= ImageList_GetIcon(ShellSmallIconList
, index
, ILD_TRANSPARENT
);
179 static struct IExtractIconWVtbl eivt
=
181 IEI_Printers_fnQueryInterface
,
182 IEI_Printers_fnAddRef
,
183 IEI_Printers_fnRelease
,
184 IEI_Printers_fnGetIconLocation
,
185 IEI_Printers_fnExtract
188 /**************************************************************************
189 * IExtractIconA_QueryInterface
191 static HRESULT WINAPI
IEIA_Printers_fnQueryInterface(IExtractIconA
* iface
, REFIID riid
, LPVOID
*ppvObj
)
193 _ICOM_THIS_From_IExtractIconA(IExtractIconW
, iface
);
195 return This
->lpVtbl
->QueryInterface(This
, riid
, ppvObj
);
198 /**************************************************************************
199 * IExtractIconA_AddRef
201 static ULONG WINAPI
IEIA_Printers_fnAddRef(IExtractIconA
* iface
)
203 _ICOM_THIS_From_IExtractIconA(IExtractIconW
, iface
);
205 return This
->lpVtbl
->AddRef(This
);
207 /**************************************************************************
208 * IExtractIconA_Release
210 static ULONG WINAPI
IEIA_Printers_fnRelease(IExtractIconA
* iface
)
212 _ICOM_THIS_From_IExtractIconA(IExtractIconW
, iface
);
214 return This
->lpVtbl
->AddRef(This
);
217 /**************************************************************************
218 * IExtractIconA_GetIconLocation
220 static HRESULT WINAPI
IEIA_Printers_fnGetIconLocation(
221 IExtractIconA
* iface
,
229 LPWSTR lpwstrFile
= HeapAlloc(GetProcessHeap(), 0, cchMax
* sizeof(WCHAR
));
230 _ICOM_THIS_From_IExtractIconA(IExtractIconW
, iface
);
232 TRACE("(%p) (flags=%u %p %u %p %p)\n", This
, uFlags
, szIconFile
, cchMax
, piIndex
, pwFlags
);
234 ret
= This
->lpVtbl
->GetIconLocation(This
, uFlags
, lpwstrFile
, cchMax
, piIndex
, pwFlags
);
235 WideCharToMultiByte(CP_ACP
, 0, lpwstrFile
, -1, szIconFile
, cchMax
, NULL
, NULL
);
236 HeapFree(GetProcessHeap(), 0, lpwstrFile
);
238 TRACE("-- %s %x\n", szIconFile
, *piIndex
);
241 /**************************************************************************
242 * IExtractIconA_Extract
244 static HRESULT WINAPI
IEIA_Printers_fnExtract(IExtractIconA
*iface
, LPCSTR pszFile
,
245 UINT nIconIndex
, HICON
*phiconLarge
,
246 HICON
*phiconSmall
, UINT nIconSize
)
249 INT len
= MultiByteToWideChar(CP_ACP
, 0, pszFile
, -1, NULL
, 0);
250 LPWSTR lpwstrFile
= HeapAlloc(GetProcessHeap(), 0, len
* sizeof(WCHAR
));
251 _ICOM_THIS_From_IExtractIconA(IExtractIconW
, iface
);
253 TRACE("(%p) (file=%p index=%u %p %p size=%u)\n", This
, pszFile
, nIconIndex
, phiconLarge
, phiconSmall
, nIconSize
);
255 MultiByteToWideChar(CP_ACP
, 0, pszFile
, -1, lpwstrFile
, len
);
256 ret
= This
->lpVtbl
->Extract(This
, lpwstrFile
, nIconIndex
, phiconLarge
, phiconSmall
, nIconSize
);
257 HeapFree(GetProcessHeap(), 0, lpwstrFile
);
261 static struct IExtractIconAVtbl eiavt
=
263 IEIA_Printers_fnQueryInterface
,
264 IEIA_Printers_fnAddRef
,
265 IEIA_Printers_fnRelease
,
266 IEIA_Printers_fnGetIconLocation
,
267 IEIA_Printers_fnExtract
270 /**************************************************************************
271 * IExtractIcon_Constructor
273 static IUnknown
*IEI_Printers_Constructor(LPCITEMIDLIST pidl
)
275 IExtractIconWImpl
* ei
;
279 ei
= HeapAlloc(GetProcessHeap(),0,sizeof(IExtractIconWImpl
));
282 ei
->lpvtblExtractIconA
= &eiavt
;
283 ei
->pidl
=ILClone(pidl
);
288 return (IUnknown
*)ei
;
291 /***********************************************************************
292 * Printers folder implementation
296 IShellFolder2Vtbl
*lpVtbl
;
297 IPersistFolder2Vtbl
*lpVtblPersistFolder2
;
303 LPITEMIDLIST pidlRoot
; /* absolute pidl */
305 int dwAttributes
; /* attributes returned by GetAttributesOf FIXME: use it */
308 #define _IPersistFolder2_Offset ((INT_PTR)(&(((IGenericSFImpl*)0)->lpVtblPersistFolder2)))
309 #define _ICOM_THIS_From_IPersistFolder2(class, name) class* This = (class*)(((char*)name)-_IPersistFolder2_Offset);
311 #define _IUnknown_(This) (IShellFolder*)&(This->lpVtbl)
312 #define _IShellFolder_(This) (IShellFolder*)&(This->lpVtbl)
314 #define _IPersist_(This) (IPersist*)&(This->lpVtblPersistFolder2)
315 #define _IPersistFolder_(This) (IPersistFolder*)&(This->lpVtblPersistFolder2)
316 #define _IPersistFolder2_(This) (IPersistFolder2*)&(This->lpVtblPersistFolder2)
318 /**************************************************************************
319 * ISF_Printers_fnQueryInterface
321 * NOTE does not support IPersist/IPersistFolder
323 static HRESULT WINAPI
ISF_Printers_fnQueryInterface(
324 IShellFolder2
* iface
, REFIID riid
, LPVOID
* ppvObj
)
326 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
328 TRACE ("(%p)->(%s,%p)\n", This
, shdebugstr_guid (riid
), ppvObj
);
332 if (IsEqualIID (riid
, &IID_IUnknown
) ||
333 IsEqualIID (riid
, &IID_IShellFolder
) ||
334 IsEqualIID (riid
, &IID_IShellFolder2
))
336 *ppvObj
= _IShellFolder_(This
);
339 else if (IsEqualIID (riid
, &IID_IPersist
) ||
340 IsEqualIID (riid
, &IID_IPersistFolder
) ||
341 IsEqualIID (riid
, &IID_IPersistFolder2
))
343 *ppvObj
= _IPersistFolder2_ (This
);
348 IUnknown_AddRef ((IUnknown
*) (*ppvObj
));
349 TRACE ("-- Interface: (%p)->(%p)\n", ppvObj
, *ppvObj
);
352 TRACE ("-- Interface: E_NOINTERFACE\n");
353 return E_NOINTERFACE
;
356 static ULONG WINAPI
ISF_Printers_fnAddRef (IShellFolder2
* iface
)
358 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
359 ULONG refCount
= InterlockedIncrement(&This
->ref
);
361 TRACE ("(%p)->(count=%lu)\n", This
, refCount
- 1);
366 static ULONG WINAPI
ISF_Printers_fnRelease (IShellFolder2
* iface
)
368 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
369 ULONG refCount
= InterlockedDecrement(&This
->ref
);
371 TRACE ("(%p)->(count=%lu)\n", This
, refCount
+ 1);
375 TRACE ("-- destroying IShellFolder(%p)\n", This
);
377 SHFree (This
->pidlRoot
);
378 LocalFree ((HLOCAL
) This
);
384 /**************************************************************************
385 * ISF_Printers_fnParseDisplayName
387 * This is E_NOTIMPL in Windows too.
389 static HRESULT WINAPI
ISF_Printers_fnParseDisplayName (IShellFolder2
* iface
,
390 HWND hwndOwner
, LPBC pbc
, LPOLESTR lpszDisplayName
,
391 DWORD
* pchEaten
, LPITEMIDLIST
* ppidl
, DWORD
* pdwAttributes
)
393 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
395 TRACE("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n",
396 This
, hwndOwner
, pbc
, lpszDisplayName
, debugstr_w(lpszDisplayName
),
397 pchEaten
, ppidl
, pdwAttributes
);
406 static LPITEMIDLIST
_ILCreatePrinterItem(PRINTER_INFO_4W
*pi
)
410 PIDLPrinterStruct
* p
;
411 int size0
= (char*)&tmp
.u
.cprinter
.szName
-(char*)&tmp
.u
.cprinter
;
415 tmp
.u
.cprinter
.dummy
= 0xFF;
416 if (pi
->pPrinterName
)
417 tmp
.u
.cprinter
.offsServer
= wcslen(pi
->pPrinterName
) + 1;
419 tmp
.u
.cprinter
.offsServer
= 1;
421 size
+= tmp
.u
.cprinter
.offsServer
* sizeof(WCHAR
);
423 size
+= ( + wcslen(pi
->pServerName
) + 1) * sizeof(WCHAR
);
425 size
+= sizeof(WCHAR
);
427 pidl
= (LPITEMIDLIST
)SHAlloc(size
+ 4);
431 pidl
->mkid
.cb
= size
+2;
432 memcpy(pidl
->mkid
.abID
, &tmp
, 2+size0
);
434 p
= &((PIDLDATA
*)pidl
->mkid
.abID
)->u
.cprinter
;
436 p
->Attributes
= pi
->Attributes
;
437 if (pi
->pPrinterName
)
438 wcscpy(p
->szName
, pi
->pPrinterName
);
440 p
->szName
[0] = L
'\0';
443 wcscpy(p
->szName
+ p
->offsServer
, pi
->pServerName
);
445 p
->szName
[p
->offsServer
] = L
'\0';
447 *(WORD
*)((char*)pidl
+(size
+2)) = 0;
451 static PIDLPrinterStruct
* _ILGetPrinterStruct(LPCITEMIDLIST pidl
)
453 LPPIDLDATA pdata
= _ILGetDataPointer(pidl
);
455 if (pdata
&& pdata
->type
==0x00)
456 return (PIDLPrinterStruct
*)&(pdata
->u
.cfont
);
461 /**************************************************************************
462 * CreatePrintersEnumList()
464 static BOOL
CreatePrintersEnumList(IEnumIDList
*list
, DWORD dwFlags
)
468 TRACE("(%p)->(flags=0x%08lx) \n",list
,dwFlags
);
470 /* enumerate the folders */
471 if (dwFlags
& SHCONTF_NONFOLDERS
)
473 DWORD needed
= 0, num
= 0, i
;
476 EnumPrintersW(PRINTER_ENUM_LOCAL
, NULL
, 4, NULL
, 0, &needed
, &num
);
480 pi
= HeapAlloc(GetProcessHeap(), 0, needed
);
481 if(!EnumPrintersW(PRINTER_ENUM_LOCAL
, NULL
, 4, (LPBYTE
)pi
, needed
, &needed
, &num
)) {
482 HeapFree(GetProcessHeap(), 0, pi
);
486 for(i
= 0; i
< num
; i
++) {
487 LPITEMIDLIST pidl
= _ILCreatePrinterItem(&pi
[i
]);
490 if (!AddToEnumList(list
, pidl
))
494 HeapFree(GetProcessHeap(), 0, pi
);
499 /**************************************************************************
500 * ISF_Printers_fnEnumObjects
502 static HRESULT WINAPI
ISF_Printers_fnEnumObjects (IShellFolder2
* iface
,
503 HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
* ppEnumIDList
)
505 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
507 TRACE ("(%p)->(HWND=%p flags=0x%08lx pplist=%p)\n",
508 This
, hwndOwner
, dwFlags
, ppEnumIDList
);
510 if(!ppEnumIDList
) return E_OUTOFMEMORY
;
511 *ppEnumIDList
= IEnumIDList_Constructor();
513 CreatePrintersEnumList(*ppEnumIDList
, dwFlags
);
515 TRACE ("-- (%p)->(new ID List: %p)\n", This
, *ppEnumIDList
);
517 return (*ppEnumIDList
) ? S_OK
: E_OUTOFMEMORY
;
520 /**************************************************************************
521 * ISF_Printers_fnBindToObject
523 static HRESULT WINAPI
ISF_Printers_fnBindToObject (IShellFolder2
* iface
,
524 LPCITEMIDLIST pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
* ppvOut
)
526 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
528 TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", This
,
529 pidl
, pbcReserved
, shdebugstr_guid (riid
), ppvOut
);
531 return SHELL32_BindToChild (This
->pidlRoot
, NULL
, pidl
, riid
, ppvOut
);
534 /**************************************************************************
535 * ISF_Printers_fnBindToStorage
537 static HRESULT WINAPI
ISF_Printers_fnBindToStorage (IShellFolder2
* iface
,
538 LPCITEMIDLIST pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
* ppvOut
)
540 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
542 FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n",
543 This
, pidl
, pbcReserved
, shdebugstr_guid (riid
), ppvOut
);
549 /**************************************************************************
550 * ISF_Printers_fnCompareIDs
552 static HRESULT WINAPI
ISF_Printers_fnCompareIDs (IShellFolder2
* iface
,
553 LPARAM lParam
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
555 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
558 TRACE ("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", This
, lParam
, pidl1
, pidl2
);
559 nReturn
= SHELL32_CompareIDs (_IShellFolder_ (This
), lParam
, pidl1
, pidl2
);
560 TRACE ("-- %i\n", nReturn
);
564 /**************************************************************************
565 * ISF_Printers_fnCreateViewObject
567 static HRESULT WINAPI
ISF_Printers_fnCreateViewObject (IShellFolder2
* iface
,
568 HWND hwndOwner
, REFIID riid
, LPVOID
* ppvOut
)
571 LPSHELLVIEW pShellView
;
572 HRESULT hr
= E_INVALIDARG
;
573 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
575 TRACE ("(%p)->(hwnd=%p,%s,%p)\n", This
,
576 hwndOwner
, shdebugstr_guid (riid
), ppvOut
);
583 if (IsEqualIID (riid
, &IID_IDropTarget
))
585 WARN ("IDropTarget not implemented\n");
588 else if (IsEqualIID (riid
, &IID_IContextMenu
))
590 WARN ("IContextMenu not implemented\n");
593 else if (IsEqualIID (riid
, &IID_IShellView
))
595 pShellView
= IShellView_Constructor ((IShellFolder
*) iface
);
598 hr
= IShellView_QueryInterface (pShellView
, riid
, ppvOut
);
599 IShellView_Release (pShellView
);
602 TRACE ("-- (%p)->(interface=%p)\n", This
, ppvOut
);
606 /**************************************************************************
607 * ISF_Printers_fnGetAttributesOf
609 static HRESULT WINAPI
ISF_Printers_fnGetAttributesOf (IShellFolder2
* iface
,
610 UINT cidl
, LPCITEMIDLIST
* apidl
, DWORD
* rgfInOut
)
612 static const DWORD dwPrintersAttributes
=
613 SFGAO_HASPROPSHEET
| SFGAO_STORAGEANCESTOR
| SFGAO_FILESYSANCESTOR
| SFGAO_FOLDER
| SFGAO_CANRENAME
| SFGAO_CANDELETE
;
615 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
617 FIXME ("(%p)->(cidl=%d apidl=%p mask=0x%08lx): stub\n",
618 This
, cidl
, apidl
, *rgfInOut
);
620 *rgfInOut
&= dwPrintersAttributes
;
622 *rgfInOut
&= ~SFGAO_VALIDATE
;
624 TRACE ("-- result=0x%08x\n", *rgfInOut
);
628 /**************************************************************************
629 * ISF_Printers_fnGetUIObjectOf
632 * HWND hwndOwner, //[in ] Parent window for any output
633 * UINT cidl, //[in ] array size
634 * LPCITEMIDLIST* apidl, //[in ] simple pidl array
635 * REFIID riid, //[in ] Requested Interface
636 * UINT* prgfInOut, //[ ] reserved
637 * LPVOID* ppvObject) //[out] Resulting Interface
640 static HRESULT WINAPI
ISF_Printers_fnGetUIObjectOf (IShellFolder2
* iface
,
641 HWND hwndOwner
, UINT cidl
, LPCITEMIDLIST
* apidl
,
642 REFIID riid
, UINT
* prgfInOut
, LPVOID
* ppvOut
)
644 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
645 IUnknown
*pObj
= NULL
;
646 HRESULT hr
= E_INVALIDARG
;
648 TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
649 This
, hwndOwner
, cidl
, apidl
, shdebugstr_guid (riid
), prgfInOut
, ppvOut
);
656 if ((IsEqualIID (riid
, &IID_IExtractIconA
) || IsEqualIID(riid
, &IID_IExtractIconW
)) && (cidl
== 1))
658 IUnknown
*pUnk
= IEI_Printers_Constructor(apidl
[0]);
659 hr
= IUnknown_QueryInterface(pUnk
, riid
, (void**)&pObj
);
660 IUnknown_Release(pUnk
);
665 if (SUCCEEDED(hr
) && !pObj
)
669 TRACE ("(%p)->hr=0x%08lx\n", This
, hr
);
673 /**************************************************************************
674 * ISF_Printers_fnGetDisplayNameOf
677 static HRESULT WINAPI
ISF_Printers_fnGetDisplayNameOf (IShellFolder2
* iface
,
678 LPCITEMIDLIST pidl
, DWORD dwFlags
, LPSTRRET strRet
)
681 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
682 PIDLPrinterStruct
* p
;
684 TRACE ("(%p)->(pidl=%p,0x%08lx,%p)\n", This
, pidl
, dwFlags
, strRet
);
693 if (_ILIsPrinter(pidl
))
695 pszName
= CoTaskMemAlloc(MAX_PATH
* sizeof(WCHAR
));
697 return E_OUTOFMEMORY
;
699 if (LoadStringW(shell32_hInstance
, IDS_PRINTERS
, pszName
, MAX_PATH
))
701 pszName
[MAX_PATH
-1] = L
'\0';
702 strRet
->uType
= STRRET_WSTR
;
703 strRet
->u
.pOleStr
= pszName
;
706 CoTaskMemFree(pszName
);
710 p
= _ILGetPrinterStruct(pidl
);
713 WARN("no printer struct\n");
716 strRet
->u
.pOleStr
= SHAlloc(p
->offsServer
* sizeof(WCHAR
));
717 if (!strRet
->u
.pOleStr
)
718 return E_OUTOFMEMORY
;
720 memcpy((LPVOID
)strRet
->u
.pOleStr
, (LPVOID
)p
->szName
, p
->offsServer
* sizeof(WCHAR
));
721 TRACE("ret %s\n", debugstr_w(strRet
->u
.pOleStr
));
726 /**************************************************************************
727 * ISF_Printers_fnSetNameOf
728 * Changes the name of a file object or subfolder, possibly changing its item
729 * identifier in the process.
732 * HWND hwndOwner, //[in ] Owner window for output
733 * LPCITEMIDLIST pidl, //[in ] simple pidl of item to change
734 * LPCOLESTR lpszName, //[in ] the items new display name
735 * DWORD dwFlags, //[in ] SHGNO formatting flags
736 * LPITEMIDLIST* ppidlOut) //[out] simple pidl returned
738 static HRESULT WINAPI
ISF_Printers_fnSetNameOf (IShellFolder2
* iface
,
739 HWND hwndOwner
, LPCITEMIDLIST pidl
, /* simple pidl */
740 LPCOLESTR lpName
, DWORD dwFlags
, LPITEMIDLIST
* pPidlOut
)
742 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
744 FIXME ("(%p)->(%p,pidl=%p,%s,%lu,%p)\n", This
, hwndOwner
, pidl
,
745 debugstr_w (lpName
), dwFlags
, pPidlOut
);
750 static HRESULT WINAPI
ISF_Printers_fnGetDefaultSearchGUID(IShellFolder2
*iface
,
753 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
755 FIXME ("(%p)\n", This
);
759 static HRESULT WINAPI
ISF_Printers_fnEnumSearches (IShellFolder2
*iface
,
760 IEnumExtraSearch
** ppenum
)
762 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
763 FIXME ("(%p)\n", This
);
767 static HRESULT WINAPI
ISF_Printers_fnGetDefaultColumn (IShellFolder2
* iface
,
768 DWORD dwRes
, ULONG
* pSort
, ULONG
* pDisplay
)
777 static HRESULT WINAPI
ISF_Printers_fnGetDefaultColumnState (
778 IShellFolder2
* iface
, UINT iColumn
, DWORD
* pcsFlags
)
780 if (!pcsFlags
|| iColumn
>= PrinterSHELLVIEWCOLUMNS
)
782 *pcsFlags
= PrinterSFHeader
[iColumn
].pcsFlags
;
787 static HRESULT WINAPI
ISF_Printers_fnGetDetailsEx (IShellFolder2
* iface
,
788 LPCITEMIDLIST pidl
, const SHCOLUMNID
* pscid
, VARIANT
* pv
)
790 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
791 FIXME ("(%p): stub\n", This
);
796 static HRESULT WINAPI
ISF_Printers_fnGetDetailsOf (IShellFolder2
* iface
,
797 LPCITEMIDLIST pidl
, UINT iColumn
, SHELLDETAILS
* psd
)
799 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
800 WCHAR buffer
[MAX_PATH
] = {0};
803 TRACE("(%p)->(%p %i %p): stub\n", This
, pidl
, iColumn
, psd
);
805 if (iColumn
>= PrinterSHELLVIEWCOLUMNS
)
808 psd
->fmt
= PrinterSFHeader
[iColumn
].fmt
;
809 psd
->cxChar
= PrinterSFHeader
[iColumn
].cxChar
;
812 psd
->str
.uType
= STRRET_WSTR
;
813 if (LoadStringW(shell32_hInstance
, PrinterSFHeader
[iColumn
].colnameid
, buffer
, MAX_PATH
))
814 hr
= SHStrDupW(buffer
, &psd
->str
.u
.pOleStr
);
819 if (iColumn
== COLUMN_NAME
)
821 psd
->str
.uType
= STRRET_WSTR
;
822 return IShellFolder2_GetDisplayNameOf(iface
, pidl
, SHGDN_NORMAL
, &psd
->str
);
825 psd
->str
.uType
= STRRET_CSTR
;
826 psd
->str
.u
.cStr
[0] = '\0';
831 static HRESULT WINAPI
ISF_Printers_fnMapColumnToSCID (
832 IShellFolder2
* iface
, UINT column
, SHCOLUMNID
* pscid
)
834 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
835 FIXME ("(%p): stub\n", This
);
839 static IShellFolder2Vtbl vt_ShellFolder2
=
841 ISF_Printers_fnQueryInterface
,
842 ISF_Printers_fnAddRef
,
843 ISF_Printers_fnRelease
,
844 ISF_Printers_fnParseDisplayName
,
845 ISF_Printers_fnEnumObjects
,
846 ISF_Printers_fnBindToObject
,
847 ISF_Printers_fnBindToStorage
,
848 ISF_Printers_fnCompareIDs
,
849 ISF_Printers_fnCreateViewObject
,
850 ISF_Printers_fnGetAttributesOf
,
851 ISF_Printers_fnGetUIObjectOf
,
852 ISF_Printers_fnGetDisplayNameOf
,
853 ISF_Printers_fnSetNameOf
,
855 ISF_Printers_fnGetDefaultSearchGUID
,
856 ISF_Printers_fnEnumSearches
,
857 ISF_Printers_fnGetDefaultColumn
,
858 ISF_Printers_fnGetDefaultColumnState
,
859 ISF_Printers_fnGetDetailsEx
,
860 ISF_Printers_fnGetDetailsOf
,
861 ISF_Printers_fnMapColumnToSCID
864 /************************************************************************
865 * IPF_Printers_QueryInterface
867 static HRESULT WINAPI
IPF_Printers_QueryInterface (
868 IPersistFolder2
* iface
, REFIID iid
, LPVOID
* ppvObj
)
870 _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl
, iface
);
872 TRACE ("(%p)\n", This
);
874 return IUnknown_QueryInterface (_IUnknown_ (This
), iid
, ppvObj
);
877 /************************************************************************
878 * IPF_Printers_AddRef
880 static ULONG WINAPI
IPF_Printers_AddRef (IPersistFolder2
* iface
)
882 _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl
, iface
);
884 TRACE ("(%p)->(count=%lu)\n", This
, This
->ref
);
886 return IUnknown_AddRef (_IUnknown_ (This
));
889 /************************************************************************
890 * IPF_Printers_Release
892 static ULONG WINAPI
IPF_Printers_Release (IPersistFolder2
* iface
)
894 _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl
, iface
);
896 TRACE ("(%p)->(count=%lu)\n", This
, This
->ref
);
898 return IUnknown_Release (_IUnknown_ (This
));
901 /************************************************************************
902 * IPF_Printers_GetClassID
904 static HRESULT WINAPI
IPF_Printers_GetClassID (
905 IPersistFolder2
* iface
, CLSID
* lpClassId
)
907 _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl
, iface
);
909 TRACE ("(%p)\n", This
);
911 *lpClassId
= CLSID_Printers
;
916 /************************************************************************
917 * IPF_Printers_Initialize
920 static HRESULT WINAPI
IPF_Printers_Initialize (
921 IPersistFolder2
* iface
, LPCITEMIDLIST pidl
)
923 _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl
, iface
);
925 SHFree((LPVOID
)This
->pidlRoot
);
927 This
->pidlRoot
= ILClone(pidl
);
931 /**************************************************************************
932 * IPF_Printers_fnGetCurFolder
934 static HRESULT WINAPI
IPF_Printers_GetCurFolder (
935 IPersistFolder2
* iface
, LPITEMIDLIST
* pidl
)
937 _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl
, iface
);
939 TRACE ("(%p)->(%p)\n", This
, pidl
);
941 *pidl
= ILClone (This
->pidlRoot
);
945 static IPersistFolder2Vtbl vt_PersistFolder2
=
947 IPF_Printers_QueryInterface
,
949 IPF_Printers_Release
,
950 IPF_Printers_GetClassID
,
951 IPF_Printers_Initialize
,
952 IPF_Printers_GetCurFolder
955 /**************************************************************************
956 * ISF_Printers_Constructor
958 HRESULT WINAPI
ISF_Printers_Constructor (
959 IUnknown
* pUnkOuter
, REFIID riid
, LPVOID
* ppv
)
964 TRACE ("unkOut=%p %s\n", pUnkOuter
, shdebugstr_guid (riid
));
967 return CLASS_E_NOAGGREGATION
;
969 sf
= HeapAlloc( GetProcessHeap(), 0, sizeof(*sf
) );
971 return E_OUTOFMEMORY
;
974 sf
->lpVtbl
= &vt_ShellFolder2
;
975 sf
->lpVtblPersistFolder2
= &vt_PersistFolder2
;
977 sf
->pidlRoot
= _ILCreatePrinters(); /* my qualified pidl */
979 hr
= IUnknown_QueryInterface( _IUnknown_(sf
), riid
, ppv
);
980 IUnknown_Release( _IUnknown_(sf
) );
982 TRACE ("--(%p)\n", *ppv
);