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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 WINE_DEFAULT_DEBUG_CHANNEL (shell
);
27 /***********************************************************************
28 * Printers_IExtractIconW implementation
32 IExtractIconWVtbl
*lpVtbl
;
33 IExtractIconAVtbl
*lpvtblExtractIconA
;
38 #define _IExtractIconA_Offset ((int)(&(((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)(&(((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
))
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 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
614 FIXME ("(%p)->(cidl=%d apidl=%p mask=0x%08lx): stub\n",
615 This
, cidl
, apidl
, *rgfInOut
);
620 /**************************************************************************
621 * ISF_Printers_fnGetUIObjectOf
624 * HWND hwndOwner, //[in ] Parent window for any output
625 * UINT cidl, //[in ] array size
626 * LPCITEMIDLIST* apidl, //[in ] simple pidl array
627 * REFIID riid, //[in ] Requested Interface
628 * UINT* prgfInOut, //[ ] reserved
629 * LPVOID* ppvObject) //[out] Resulting Interface
632 static HRESULT WINAPI
ISF_Printers_fnGetUIObjectOf (IShellFolder2
* iface
,
633 HWND hwndOwner
, UINT cidl
, LPCITEMIDLIST
* apidl
,
634 REFIID riid
, UINT
* prgfInOut
, LPVOID
* ppvOut
)
636 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
637 IUnknown
*pObj
= NULL
;
638 HRESULT hr
= E_INVALIDARG
;
640 TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
641 This
, hwndOwner
, cidl
, apidl
, shdebugstr_guid (riid
), prgfInOut
, ppvOut
);
648 if ((IsEqualIID (riid
, &IID_IExtractIconA
) || IsEqualIID(riid
, &IID_IExtractIconW
)) && (cidl
== 1))
650 IUnknown
*pUnk
= IEI_Printers_Constructor(apidl
[0]);
651 hr
= IUnknown_QueryInterface(pUnk
, riid
, (void**)&pObj
);
652 IUnknown_Release(pUnk
);
657 if (SUCCEEDED(hr
) && !pObj
)
661 TRACE ("(%p)->hr=0x%08lx\n", This
, hr
);
665 /**************************************************************************
666 * ISF_Printers_fnGetDisplayNameOf
669 static HRESULT WINAPI
ISF_Printers_fnGetDisplayNameOf (IShellFolder2
* iface
,
670 LPCITEMIDLIST pidl
, DWORD dwFlags
, LPSTRRET strRet
)
672 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
673 PIDLPrinterStruct
* p
;
675 TRACE ("(%p)->(pidl=%p,0x%08lx,%p)\n", This
, pidl
, dwFlags
, strRet
);
681 p
= _ILGetPrinterStruct(pidl
);
685 strRet
->u
.pOleStr
= SHAlloc(p
->offsServer
* sizeof(WCHAR
));
686 if (!strRet
->u
.pOleStr
)
687 return E_OUTOFMEMORY
;
689 memcpy((LPVOID
)strRet
->u
.pOleStr
, (LPVOID
)p
->szName
, p
->offsServer
* sizeof(WCHAR
));
690 TRACE("ret %s\n", debugstr_w(strRet
->u
.pOleStr
));
695 /**************************************************************************
696 * ISF_Printers_fnSetNameOf
697 * Changes the name of a file object or subfolder, possibly changing its item
698 * identifier in the process.
701 * HWND hwndOwner, //[in ] Owner window for output
702 * LPCITEMIDLIST pidl, //[in ] simple pidl of item to change
703 * LPCOLESTR lpszName, //[in ] the items new display name
704 * DWORD dwFlags, //[in ] SHGNO formatting flags
705 * LPITEMIDLIST* ppidlOut) //[out] simple pidl returned
707 static HRESULT WINAPI
ISF_Printers_fnSetNameOf (IShellFolder2
* iface
,
708 HWND hwndOwner
, LPCITEMIDLIST pidl
, /* simple pidl */
709 LPCOLESTR lpName
, DWORD dwFlags
, LPITEMIDLIST
* pPidlOut
)
711 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
713 FIXME ("(%p)->(%p,pidl=%p,%s,%lu,%p)\n", This
, hwndOwner
, pidl
,
714 debugstr_w (lpName
), dwFlags
, pPidlOut
);
719 static HRESULT WINAPI
ISF_Printers_fnGetDefaultSearchGUID(IShellFolder2
*iface
,
722 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
724 FIXME ("(%p)\n", This
);
728 static HRESULT WINAPI
ISF_Printers_fnEnumSearches (IShellFolder2
*iface
,
729 IEnumExtraSearch
** ppenum
)
731 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
732 FIXME ("(%p)\n", This
);
736 static HRESULT WINAPI
ISF_Printers_fnGetDefaultColumn (IShellFolder2
* iface
,
737 DWORD dwRes
, ULONG
* pSort
, ULONG
* pDisplay
)
746 static HRESULT WINAPI
ISF_Printers_fnGetDefaultColumnState (
747 IShellFolder2
* iface
, UINT iColumn
, DWORD
* pcsFlags
)
749 if (!pcsFlags
|| iColumn
>= PrinterSHELLVIEWCOLUMNS
)
751 *pcsFlags
= PrinterSFHeader
[iColumn
].pcsFlags
;
756 static HRESULT WINAPI
ISF_Printers_fnGetDetailsEx (IShellFolder2
* iface
,
757 LPCITEMIDLIST pidl
, const SHCOLUMNID
* pscid
, VARIANT
* pv
)
759 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
760 FIXME ("(%p): stub\n", This
);
765 static HRESULT WINAPI
ISF_Printers_fnGetDetailsOf (IShellFolder2
* iface
,
766 LPCITEMIDLIST pidl
, UINT iColumn
, SHELLDETAILS
* psd
)
768 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
769 WCHAR buffer
[MAX_PATH
] = {0};
772 TRACE("(%p)->(%p %i %p): stub\n", This
, pidl
, iColumn
, psd
);
774 if (iColumn
>= PrinterSHELLVIEWCOLUMNS
)
777 psd
->fmt
= PrinterSFHeader
[iColumn
].fmt
;
778 psd
->cxChar
= PrinterSFHeader
[iColumn
].cxChar
;
781 psd
->str
.uType
= STRRET_WSTR
;
782 if (LoadStringW(shell32_hInstance
, PrinterSFHeader
[iColumn
].colnameid
, buffer
, MAX_PATH
))
783 hr
= SHStrDupW(buffer
, &psd
->str
.u
.pOleStr
);
788 if (iColumn
== COLUMN_NAME
)
790 psd
->str
.uType
= STRRET_WSTR
;
791 return IShellFolder2_GetDisplayNameOf(iface
, pidl
, SHGDN_NORMAL
, &psd
->str
);
794 psd
->str
.uType
= STRRET_CSTR
;
795 psd
->str
.u
.cStr
[0] = '\0';
800 static HRESULT WINAPI
ISF_Printers_fnMapColumnToSCID (
801 IShellFolder2
* iface
, UINT column
, SHCOLUMNID
* pscid
)
803 IGenericSFImpl
*This
= (IGenericSFImpl
*)iface
;
804 FIXME ("(%p): stub\n", This
);
808 static IShellFolder2Vtbl vt_ShellFolder2
=
810 ISF_Printers_fnQueryInterface
,
811 ISF_Printers_fnAddRef
,
812 ISF_Printers_fnRelease
,
813 ISF_Printers_fnParseDisplayName
,
814 ISF_Printers_fnEnumObjects
,
815 ISF_Printers_fnBindToObject
,
816 ISF_Printers_fnBindToStorage
,
817 ISF_Printers_fnCompareIDs
,
818 ISF_Printers_fnCreateViewObject
,
819 ISF_Printers_fnGetAttributesOf
,
820 ISF_Printers_fnGetUIObjectOf
,
821 ISF_Printers_fnGetDisplayNameOf
,
822 ISF_Printers_fnSetNameOf
,
824 ISF_Printers_fnGetDefaultSearchGUID
,
825 ISF_Printers_fnEnumSearches
,
826 ISF_Printers_fnGetDefaultColumn
,
827 ISF_Printers_fnGetDefaultColumnState
,
828 ISF_Printers_fnGetDetailsEx
,
829 ISF_Printers_fnGetDetailsOf
,
830 ISF_Printers_fnMapColumnToSCID
833 /************************************************************************
834 * IPF_Printers_QueryInterface
836 static HRESULT WINAPI
IPF_Printers_QueryInterface (
837 IPersistFolder2
* iface
, REFIID iid
, LPVOID
* ppvObj
)
839 _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl
, iface
);
841 TRACE ("(%p)\n", This
);
843 return IUnknown_QueryInterface (_IUnknown_ (This
), iid
, ppvObj
);
846 /************************************************************************
847 * IPF_Printers_AddRef
849 static ULONG WINAPI
IPF_Printers_AddRef (IPersistFolder2
* iface
)
851 _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl
, iface
);
853 TRACE ("(%p)->(count=%lu)\n", This
, This
->ref
);
855 return IUnknown_AddRef (_IUnknown_ (This
));
858 /************************************************************************
859 * IPF_Printers_Release
861 static ULONG WINAPI
IPF_Printers_Release (IPersistFolder2
* iface
)
863 _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl
, iface
);
865 TRACE ("(%p)->(count=%lu)\n", This
, This
->ref
);
867 return IUnknown_Release (_IUnknown_ (This
));
870 /************************************************************************
871 * IPF_Printers_GetClassID
873 static HRESULT WINAPI
IPF_Printers_GetClassID (
874 IPersistFolder2
* iface
, CLSID
* lpClassId
)
876 _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl
, iface
);
878 TRACE ("(%p)\n", This
);
880 *lpClassId
= CLSID_Printers
;
885 /************************************************************************
886 * IPF_Printers_Initialize
889 static HRESULT WINAPI
IPF_Printers_Initialize (
890 IPersistFolder2
* iface
, LPCITEMIDLIST pidl
)
892 _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl
, iface
);
894 SHFree((LPVOID
)This
->pidlRoot
);
896 This
->pidlRoot
= ILClone(pidl
);
900 /**************************************************************************
901 * IPF_Printers_fnGetCurFolder
903 static HRESULT WINAPI
IPF_Printers_GetCurFolder (
904 IPersistFolder2
* iface
, LPITEMIDLIST
* pidl
)
906 _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl
, iface
);
908 TRACE ("(%p)->(%p)\n", This
, pidl
);
910 *pidl
= ILClone (This
->pidlRoot
);
914 static IPersistFolder2Vtbl vt_PersistFolder2
=
916 IPF_Printers_QueryInterface
,
918 IPF_Printers_Release
,
919 IPF_Printers_GetClassID
,
920 IPF_Printers_Initialize
,
921 IPF_Printers_GetCurFolder
924 /**************************************************************************
925 * ISF_Printers_Constructor
927 HRESULT WINAPI
ISF_Printers_Constructor (
928 IUnknown
* pUnkOuter
, REFIID riid
, LPVOID
* ppv
)
933 TRACE ("unkOut=%p %s\n", pUnkOuter
, shdebugstr_guid (riid
));
936 return CLASS_E_NOAGGREGATION
;
938 sf
= HeapAlloc( GetProcessHeap(), 0, sizeof(*sf
) );
940 return E_OUTOFMEMORY
;
943 sf
->lpVtbl
= &vt_ShellFolder2
;
944 sf
->lpVtblPersistFolder2
= &vt_PersistFolder2
;
946 sf
->pidlRoot
= _ILCreatePrinters(); /* my qualified pidl */
948 hr
= IUnknown_QueryInterface( _IUnknown_(sf
), riid
, ppv
);
949 IUnknown_Release( _IUnknown_(sf
) );
951 TRACE ("--(%p)\n", *ppv
);