Create the AHCI branch for Aman's work
[reactos.git] / dll / win32 / shell32 / folders / CPrinterFolder.cpp
1 /*
2 * Virtual Printers Folder
3 *
4 * Copyright 1997 Marcus Meissner
5 * Copyright 1998, 1999, 2002 Juergen Schmied
6 * Copyright 2005 Huw Davies
7 * Copyright 2009 Andrew Hill
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24 #include <precomp.h>
25
26 #include <winspool.h>
27
28 WINE_DEFAULT_DEBUG_CHANNEL (shell);
29
30 /***********************************************************************
31 * Printers_IExtractIconW implementation
32 */
33 class CPrintersExtractIconW :
34 public CComObjectRootEx<CComMultiThreadModelNoCS>,
35 public IExtractIconW,
36 public IExtractIconA
37 {
38 private:
39 LPITEMIDLIST pidl;
40 public:
41 CPrintersExtractIconW();
42 ~CPrintersExtractIconW();
43 HRESULT WINAPI Initialize(LPCITEMIDLIST pidl);
44
45 // IExtractIconW
46 virtual HRESULT STDMETHODCALLTYPE GetIconLocation(UINT uFlags, LPWSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags);
47 virtual HRESULT STDMETHODCALLTYPE Extract(LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize);
48
49 // IExtractIconA
50 virtual HRESULT STDMETHODCALLTYPE GetIconLocation(UINT uFlags, LPSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags);
51 virtual HRESULT STDMETHODCALLTYPE Extract(LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize);
52
53 BEGIN_COM_MAP(CPrintersExtractIconW)
54 COM_INTERFACE_ENTRY_IID(IID_IExtractIconW, IExtractIconW)
55 COM_INTERFACE_ENTRY_IID(IID_IExtractIconA, IExtractIconA)
56 END_COM_MAP()
57 };
58
59 static shvheader PrinterSFHeader[] = {
60 {IDS_SHV_COLUMN8, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15},
61 {IDS_SHV_COLUMN_DOCUMENTS , SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15},
62 {IDS_SHV_COLUMN_STATUS, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15},
63 {IDS_SHV_COLUMN_COMMENTS, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15},
64 {IDS_SHV_COLUMN_LOCATION, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15},
65 {IDS_SHV_COLUMN_MODEL, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15}
66 };
67
68 #define COLUMN_NAME 0
69 #define COLUMN_DOCUMENTS 1
70 #define COLUMN_STATUS 2
71 #define COLUMN_COMMENTS 3
72 #define COLUMN_LOCATION 4
73 #define COLUMN_MODEL 5
74
75
76 #define PrinterSHELLVIEWCOLUMNS (6)
77
78 CPrintersExtractIconW::CPrintersExtractIconW()
79 {
80 pidl = NULL;
81 }
82
83 CPrintersExtractIconW::~CPrintersExtractIconW()
84 {
85 TRACE(" destroying IExtractIcon(%p)\n", this);
86 SHFree(pidl);
87 }
88
89 HRESULT WINAPI CPrintersExtractIconW::Initialize(LPCITEMIDLIST pidl)
90 {
91 pidl = ILClone(pidl);
92
93 pdump(pidl);
94 return S_OK;
95 }
96
97 /**************************************************************************
98 * CPrintersExtractIconW::GetIconLocation
99 *
100 * mapping filetype to icon
101 */
102 HRESULT WINAPI CPrintersExtractIconW::GetIconLocation(UINT uFlags, /* GIL_ flags */
103 LPWSTR szIconFile,
104 UINT cchMax,
105 int *piIndex,
106 UINT *pwFlags) /* returned GIL_ flags */
107 {
108 TRACE("(%p) (flags=%u %p %u %p %p)\n", this, uFlags, szIconFile, cchMax, piIndex, pwFlags);
109
110 if (pwFlags)
111 *pwFlags = 0;
112
113 lstrcpynW(szIconFile, swShell32Name, cchMax);
114 *piIndex = -IDI_SHELL_PRINTERS_FOLDER; /* FIXME: other icons for default, network, print to file */
115
116 TRACE("-- %s %x\n", debugstr_w(szIconFile), *piIndex);
117 return S_OK;
118 }
119
120 /**************************************************************************
121 * CPrintersExtractIconW::Extract
122 */
123 HRESULT WINAPI CPrintersExtractIconW::Extract(LPCWSTR pszFile,
124 UINT nIconIndex, HICON *phiconLarge,
125 HICON *phiconSmall, UINT nIconSize)
126 {
127 int index;
128 HIMAGELIST big_icons, small_icons;
129
130 FIXME("(%p) (file=%p index=%d %p %p size=%x) semi-stub\n", this, debugstr_w(pszFile),
131 (signed)nIconIndex, phiconLarge, phiconSmall, nIconSize);
132
133 index = SIC_GetIconIndex(pszFile, nIconIndex, 0);
134
135 Shell_GetImageLists(&big_icons, &small_icons);
136
137 if (phiconLarge)
138 *phiconLarge = ImageList_GetIcon(big_icons, index, ILD_TRANSPARENT);
139
140 if (phiconSmall)
141 *phiconSmall = ImageList_GetIcon(small_icons, index, ILD_TRANSPARENT);
142
143 return S_OK;
144 }
145
146 /**************************************************************************
147 * CPrintersExtractIconW::GetIconLocation
148 */
149 HRESULT WINAPI CPrintersExtractIconW::GetIconLocation(UINT uFlags,
150 LPSTR szIconFile,
151 UINT cchMax,
152 int * piIndex,
153 UINT * pwFlags)
154 {
155 HRESULT ret;
156 LPWSTR lpwstrFile = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, cchMax * sizeof(WCHAR));
157
158 TRACE("(%p) (flags=%u %p %u %p %p)\n", this, uFlags, szIconFile, cchMax, piIndex, pwFlags);
159
160 ret = GetIconLocation(uFlags, lpwstrFile, cchMax, piIndex, pwFlags);
161 WideCharToMultiByte(CP_ACP, 0, lpwstrFile, -1, szIconFile, cchMax, NULL, NULL);
162 HeapFree(GetProcessHeap(), 0, lpwstrFile);
163
164 TRACE("-- %s %x\n", szIconFile, *piIndex);
165 return ret;
166 }
167 /**************************************************************************
168 * CPrintersExtractIconW::Extract
169 */
170 HRESULT WINAPI CPrintersExtractIconW::Extract(LPCSTR pszFile,
171 UINT nIconIndex, HICON *phiconLarge,
172 HICON *phiconSmall, UINT nIconSize)
173 {
174 HRESULT ret;
175 INT len = MultiByteToWideChar(CP_ACP, 0, pszFile, -1, NULL, 0);
176 LPWSTR lpwstrFile = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
177
178 TRACE("(%p) (file=%p index=%u %p %p size=%u)\n", this, pszFile, nIconIndex, phiconLarge, phiconSmall, nIconSize);
179
180 MultiByteToWideChar(CP_ACP, 0, pszFile, -1, lpwstrFile, len);
181 ret = Extract(lpwstrFile, nIconIndex, phiconLarge, phiconSmall, nIconSize);
182 HeapFree(GetProcessHeap(), 0, lpwstrFile);
183 return ret;
184 }
185
186 /**************************************************************************
187 * IExtractIcon_Constructor
188 */
189 static HRESULT WINAPI IEI_Printers_Constructor(LPCITEMIDLIST pidl, REFIID riid, IUnknown **ppv)
190 {
191 return ShellObjectCreatorInit<CPrintersExtractIconW>(pidl, riid, ppv);
192 }
193
194 /***********************************************************************
195 * Printers folder implementation
196 */
197
198 class CPrintersEnum: public CEnumIDListBase
199 {
200 public:
201 CPrintersEnum();
202 ~CPrintersEnum();
203 HRESULT WINAPI Initialize(HWND hwndOwner, DWORD dwFlags);
204 BOOL CreatePrintersEnumList(DWORD dwFlags);
205
206 BEGIN_COM_MAP(CPrintersEnum)
207 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
208 END_COM_MAP()
209 };
210
211 CPrintersEnum::CPrintersEnum()
212 {
213 }
214
215 CPrintersEnum::~CPrintersEnum()
216 {
217 }
218
219 HRESULT WINAPI CPrintersEnum::Initialize(HWND hwndOwner, DWORD dwFlags)
220 {
221 if (CreatePrintersEnumList(dwFlags) == FALSE)
222 return E_FAIL;
223 return S_OK;
224 }
225
226 static LPITEMIDLIST _ILCreatePrinterItem(PRINTER_INFO_4W *pi)
227 {
228 PIDLDATA tmp;
229 LPITEMIDLIST pidl;
230 PIDLPrinterStruct * p;
231 int size0 = (char*)&tmp.u.cprinter.szName - (char*)&tmp.u.cprinter;
232 int size = size0;
233
234 tmp.type = 0x00;
235 tmp.u.cprinter.dummy = 0xFF;
236 if (pi->pPrinterName)
237 tmp.u.cprinter.offsServer = wcslen(pi->pPrinterName) + 1;
238 else
239 tmp.u.cprinter.offsServer = 1;
240
241 size += tmp.u.cprinter.offsServer * sizeof(WCHAR);
242 if (pi->pServerName)
243 size += (wcslen(pi->pServerName) + 1) * sizeof(WCHAR);
244 else
245 size += sizeof(WCHAR);
246
247 pidl = (LPITEMIDLIST)SHAlloc(size + 4);
248 if (!pidl)
249 return pidl;
250
251 pidl->mkid.cb = size + 2;
252 memcpy(pidl->mkid.abID, &tmp, 2 + size0);
253
254 p = &((PIDLDATA*)pidl->mkid.abID)->u.cprinter;
255
256 p->Attributes = pi->Attributes;
257 if (pi->pPrinterName)
258 wcscpy(p->szName, pi->pPrinterName);
259 else
260 p->szName[0] = L'\0';
261
262 if (pi->pServerName)
263 wcscpy(p->szName + p->offsServer, pi->pServerName);
264 else
265 p->szName[p->offsServer] = L'\0';
266
267 *(WORD*)((char*)pidl + (size + 2)) = 0;
268 return pidl;
269 }
270
271 /**************************************************************************
272 * CPrintersEnum::CreatePrintersEnumList()
273 */
274 BOOL CPrintersEnum::CreatePrintersEnumList(DWORD dwFlags)
275 {
276 BOOL ret = TRUE;
277
278 TRACE("(%p)->(flags=0x%08lx) \n", this, dwFlags);
279
280 /* enumerate the folders */
281 if (dwFlags & SHCONTF_NONFOLDERS)
282 {
283 DWORD needed = 0, num = 0, i;
284 PRINTER_INFO_4W *pi;
285
286 EnumPrintersW(PRINTER_ENUM_LOCAL, NULL, 4, NULL, 0, &needed, &num);
287 if (!needed)
288 return ret;
289
290 pi = (PRINTER_INFO_4W *)HeapAlloc(GetProcessHeap(), 0, needed);
291 if(!EnumPrintersW(PRINTER_ENUM_LOCAL, NULL, 4, (LPBYTE)pi, needed, &needed, &num)) {
292 HeapFree(GetProcessHeap(), 0, pi);
293 return FALSE;
294 }
295
296 for(i = 0; i < num; i++) {
297 LPITEMIDLIST pidl = _ILCreatePrinterItem(&pi[i]);
298 if (pidl)
299 {
300 if (!AddToEnumList(pidl))
301 SHFree(pidl);
302 }
303 }
304 HeapFree(GetProcessHeap(), 0, pi);
305 }
306 return ret;
307 }
308
309 CPrinterFolder::CPrinterFolder()
310 {
311 pidlRoot = NULL;
312 dwAttributes = 0;
313 pclsid = NULL;
314 }
315
316 CPrinterFolder::~CPrinterFolder()
317 {
318 TRACE("-- destroying IShellFolder(%p)\n", this);
319 if (pidlRoot)
320 SHFree(pidlRoot);
321 }
322
323 HRESULT WINAPI CPrinterFolder::FinalConstruct()
324 {
325 pidlRoot = _ILCreatePrinters(); /* my qualified pidl */
326 if (pidlRoot == NULL)
327 return E_OUTOFMEMORY;
328 return S_OK;
329 }
330
331 /**************************************************************************
332 * CPrinterFolder::ParseDisplayName
333 *
334 * This is E_NOTIMPL in Windows too.
335 */
336 HRESULT WINAPI CPrinterFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName,
337 DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
338 {
339 TRACE("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n",
340 this, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName),
341 pchEaten, ppidl, pdwAttributes);
342
343 *ppidl = 0;
344 if (pchEaten)
345 *pchEaten = 0;
346
347 return E_NOTIMPL;
348 }
349
350 static PIDLPrinterStruct * _ILGetPrinterStruct(LPCITEMIDLIST pidl)
351 {
352 LPPIDLDATA pdata = _ILGetDataPointer(pidl);
353
354 if (pdata && pdata->type == 0x00)
355 return (PIDLPrinterStruct*) & (pdata->u.cfont);
356
357 return NULL;
358 }
359
360 /**************************************************************************
361 * CPrinterFolder::EnumObjects
362 */
363 HRESULT WINAPI CPrinterFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList)
364 {
365 return ShellObjectCreatorInit<CPrintersEnum>(hwndOwner, dwFlags, IID_IEnumIDList, ppEnumIDList);
366 }
367
368 /**************************************************************************
369 * CPrinterFolder::BindToObject
370 */
371 HRESULT WINAPI CPrinterFolder::BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
372 {
373 return E_NOTIMPL;
374 }
375
376 /**************************************************************************
377 * ISF_Printers_fnBindToStorage
378 */
379 HRESULT WINAPI CPrinterFolder::BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
380 {
381 FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n",
382 this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut);
383
384 *ppvOut = NULL;
385 return E_NOTIMPL;
386 }
387
388 /**************************************************************************
389 * CPrinterFolder::CompareIDs
390 */
391 HRESULT WINAPI CPrinterFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2)
392 {
393 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
394 }
395
396 /**************************************************************************
397 * CPrinterFolder::CreateViewObject
398 */
399 HRESULT WINAPI CPrinterFolder::CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID * ppvOut)
400 {
401 CComPtr<IShellView> pShellView;
402 HRESULT hr = E_INVALIDARG;
403
404 TRACE("(%p)->(hwnd=%p,%s,%p)\n", this,
405 hwndOwner, shdebugstr_guid (&riid), ppvOut);
406
407 if (!ppvOut)
408 return hr;
409
410 *ppvOut = NULL;
411
412 if (IsEqualIID(riid, IID_IDropTarget))
413 {
414 WARN("IDropTarget not implemented\n");
415 hr = E_NOTIMPL;
416 }
417 else if(IsEqualIID(riid, IID_IContextMenu))
418 {
419 WARN("IContextMenu not implemented\n");
420 hr = E_NOTIMPL;
421 }
422 else if(IsEqualIID(riid, IID_IShellView))
423 {
424 hr = CDefView_Constructor(this, riid, ppvOut);
425 }
426 TRACE ("-- (%p)->(interface=%p)\n", this, ppvOut);
427 return hr;
428 }
429
430 /**************************************************************************
431 * CPrinterFolder::GetAttributesOf
432 */
433 HRESULT WINAPI CPrinterFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut)
434 {
435 static const DWORD dwPrintersAttributes =
436 SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_CANRENAME | SFGAO_CANDELETE;
437 HRESULT hr = S_OK;
438
439 FIXME ("(%p)->(cidl=%d apidl=%p mask=0x%08lx): stub\n",
440 this, cidl, apidl, *rgfInOut);
441
442 *rgfInOut &= dwPrintersAttributes;
443
444 *rgfInOut &= ~SFGAO_VALIDATE;
445
446 TRACE ("-- result=0x%08x\n", *rgfInOut);
447 return hr;
448 }
449
450 /**************************************************************************
451 * CPrinterFolder::GetUIObjectOf
452 *
453 * PARAMETERS
454 * HWND hwndOwner, //[in ] Parent window for any output
455 * UINT cidl, //[in ] array size
456 * LPCITEMIDLIST* apidl, //[in ] simple pidl array
457 * REFIID riid, //[in ] Requested Interface
458 * UINT* prgfInOut, //[ ] reserved
459 * LPVOID* ppvObject) //[out] Resulting Interface
460 *
461 */
462 HRESULT WINAPI CPrinterFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl,
463 REFIID riid, UINT * prgfInOut, LPVOID * ppvOut)
464 {
465 IUnknown *pObj = NULL;
466 HRESULT hr = E_INVALIDARG;
467
468 TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
469 this, hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
470
471 if (!ppvOut)
472 return hr;
473
474 *ppvOut = NULL;
475
476 if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID(riid, IID_IExtractIconW)) && cidl == 1)
477 hr = IEI_Printers_Constructor(apidl[0], riid, &pObj);
478 else
479 hr = E_NOINTERFACE;
480
481 if (SUCCEEDED(hr) && !pObj)
482 hr = E_OUTOFMEMORY;
483
484 *ppvOut = pObj;
485 TRACE ("(%p)->hr=0x%08lx\n", this, hr);
486 return hr;
487 }
488
489 /**************************************************************************
490 * CPrinterFolder::GetDisplayNameOf
491 *
492 */
493 HRESULT WINAPI CPrinterFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet)
494 {
495 LPWSTR pszName;
496 PIDLPrinterStruct * p;
497
498 TRACE ("(%p)->(pidl=%p,0x%08lx,%p)\n", this, pidl, dwFlags, strRet);
499 pdump (pidl);
500
501 if (!strRet)
502 {
503 WARN("no strRet\n");
504 return E_INVALIDARG;
505 }
506
507 if (!pidl->mkid.cb)
508 {
509 pszName = (LPWSTR)CoTaskMemAlloc(MAX_PATH * sizeof(WCHAR));
510 if (!pszName)
511 return E_OUTOFMEMORY;
512
513 if (LoadStringW(shell32_hInstance, IDS_PRINTERS, pszName, MAX_PATH))
514 {
515 pszName[MAX_PATH-1] = L'\0';
516 strRet->uType = STRRET_WSTR;
517 strRet->pOleStr = pszName;
518 return S_OK;
519 }
520 CoTaskMemFree(pszName);
521 return E_FAIL;
522 }
523
524 p = _ILGetPrinterStruct(pidl);
525 if (!p)
526 {
527 WARN("no printer struct\n");
528 return E_INVALIDARG;
529 }
530 strRet->pOleStr = (LPWSTR)SHAlloc(p->offsServer * sizeof(WCHAR));
531 if (!strRet->pOleStr)
532 return E_OUTOFMEMORY;
533
534 memcpy((LPVOID)strRet->pOleStr, (LPVOID)p->szName, p->offsServer * sizeof(WCHAR));
535 TRACE("ret %s\n", debugstr_w(strRet->pOleStr));
536
537 return S_OK;
538 }
539
540 /**************************************************************************
541 * CPrinterFolder::SetNameOf
542 * Changes the name of a file object or subfolder, possibly changing its item
543 * identifier in the process.
544 *
545 * PARAMETERS
546 * HWND hwndOwner, //[in ] Owner window for output
547 * LPCITEMIDLIST pidl, //[in ] simple pidl of item to change
548 * LPCOLESTR lpszName, //[in ] the items new display name
549 * DWORD dwFlags, //[in ] SHGNO formatting flags
550 * LPITEMIDLIST* ppidlOut) //[out] simple pidl returned
551 */
552 HRESULT WINAPI CPrinterFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, /* simple pidl */
553 LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut)
554 {
555 FIXME("(%p)->(%p,pidl=%p,%s,%lu,%p)\n", this, hwndOwner, pidl,
556 debugstr_w (lpName), dwFlags, pPidlOut);
557
558 return E_FAIL;
559 }
560
561 HRESULT WINAPI CPrinterFolder::GetDefaultSearchGUID(GUID *pguid)
562 {
563 FIXME("(%p)\n", this);
564 return E_NOTIMPL;
565 }
566
567 HRESULT WINAPI CPrinterFolder::EnumSearches(IEnumExtraSearch **ppenum)
568 {
569 FIXME("(%p)\n", this);
570 return E_NOTIMPL;
571 }
572
573 HRESULT WINAPI CPrinterFolder::GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay)
574 {
575 if (pSort)
576 *pSort = 0;
577 if (pDisplay)
578 *pDisplay = 0;
579
580 return S_OK;
581 }
582
583 HRESULT WINAPI CPrinterFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags)
584 {
585 if (!pcsFlags || iColumn >= PrinterSHELLVIEWCOLUMNS)
586 return E_INVALIDARG;
587 *pcsFlags = PrinterSFHeader[iColumn].pcsFlags;
588 return S_OK;
589
590 }
591
592 HRESULT WINAPI CPrinterFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv)
593 {
594 FIXME("(%p): stub\n", this);
595
596 return E_NOTIMPL;
597 }
598
599 HRESULT WINAPI CPrinterFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd)
600 {
601 WCHAR buffer[MAX_PATH] = {0};
602 HRESULT hr = E_FAIL;
603
604 TRACE("(%p)->(%p %i %p): stub\n", this, pidl, iColumn, psd);
605
606 if (iColumn >= PrinterSHELLVIEWCOLUMNS)
607 return E_FAIL;
608
609 psd->fmt = PrinterSFHeader[iColumn].fmt;
610 psd->cxChar = PrinterSFHeader[iColumn].cxChar;
611 if (pidl == NULL)
612 {
613 psd->str.uType = STRRET_WSTR;
614 if (LoadStringW(shell32_hInstance, PrinterSFHeader[iColumn].colnameid, buffer, MAX_PATH))
615 hr = SHStrDupW(buffer, &psd->str.pOleStr);
616
617 return hr;
618 }
619
620 if (iColumn == COLUMN_NAME)
621 {
622 psd->str.uType = STRRET_WSTR;
623 return GetDisplayNameOf(pidl, SHGDN_NORMAL, &psd->str);
624 }
625
626 psd->str.uType = STRRET_CSTR;
627 psd->str.cStr[0] = '\0';
628
629 return E_NOTIMPL;
630 }
631
632 HRESULT WINAPI CPrinterFolder::MapColumnToSCID(UINT column, SHCOLUMNID *pscid)
633 {
634 FIXME ("(%p): stub\n", this);
635 return E_NOTIMPL;
636 }
637
638 /************************************************************************
639 * CPrinterFolder::GetClassID
640 */
641 HRESULT WINAPI CPrinterFolder::GetClassID(CLSID *lpClassId)
642 {
643 TRACE ("(%p)\n", this);
644
645 *lpClassId = CLSID_Printers;
646
647 return S_OK;
648 }
649
650 /************************************************************************
651 * CPrinterFolder::Initialize
652 */
653 HRESULT WINAPI CPrinterFolder::Initialize(LPCITEMIDLIST pidl)
654 {
655 if (pidlRoot)
656 SHFree((LPVOID)pidlRoot);
657
658 pidlRoot = ILClone(pidl);
659 return S_OK;
660 }
661
662 /**************************************************************************
663 * CPrinterFolder::GetCurFolder
664 */
665 HRESULT WINAPI CPrinterFolder::GetCurFolder(LPITEMIDLIST * pidl)
666 {
667 TRACE ("(%p)->(%p)\n", this, pidl);
668
669 *pidl = ILClone (pidlRoot);
670 return S_OK;
671 }