Sync with trunk r65656.
[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_RIGHT, 15},
61 {IDS_SHV_COLUMN_DOCUMENTS , SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15},
62 {IDS_SHV_COLUMN_STATUS, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15},
63 {IDS_SHV_COLUMN_COMMENTS, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15},
64 {IDS_SHV_COLUMN_LOCATION, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15},
65 {IDS_SHV_COLUMN_MODEL, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 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 TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", this,
374 pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut);
375
376 return SHELL32_BindToChild(pidlRoot, NULL, pidl, riid, ppvOut);
377 }
378
379 /**************************************************************************
380 * ISF_Printers_fnBindToStorage
381 */
382 HRESULT WINAPI CPrinterFolder::BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
383 {
384 FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n",
385 this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut);
386
387 *ppvOut = NULL;
388 return E_NOTIMPL;
389 }
390
391 /**************************************************************************
392 * CPrinterFolder::CompareIDs
393 */
394 HRESULT WINAPI CPrinterFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2)
395 {
396 int nReturn;
397
398 TRACE ("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", this, lParam, pidl1, pidl2);
399 nReturn = SHELL32_CompareIDs (this, lParam, pidl1, pidl2);
400 TRACE ("-- %i\n", nReturn);
401 return nReturn;
402 }
403
404 /**************************************************************************
405 * CPrinterFolder::CreateViewObject
406 */
407 HRESULT WINAPI CPrinterFolder::CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID * ppvOut)
408 {
409 CComPtr<IShellView> pShellView;
410 HRESULT hr = E_INVALIDARG;
411
412 TRACE("(%p)->(hwnd=%p,%s,%p)\n", this,
413 hwndOwner, shdebugstr_guid (&riid), ppvOut);
414
415 if (!ppvOut)
416 return hr;
417
418 *ppvOut = NULL;
419
420 if (IsEqualIID(riid, IID_IDropTarget))
421 {
422 WARN("IDropTarget not implemented\n");
423 hr = E_NOTIMPL;
424 }
425 else if(IsEqualIID(riid, IID_IContextMenu))
426 {
427 WARN("IContextMenu not implemented\n");
428 hr = E_NOTIMPL;
429 }
430 else if(IsEqualIID(riid, IID_IShellView))
431 {
432 hr = IShellView_Constructor((IShellFolder *)this, &pShellView);
433 if (pShellView)
434 {
435 hr = pShellView->QueryInterface(riid, ppvOut);
436 }
437 }
438 TRACE ("-- (%p)->(interface=%p)\n", this, ppvOut);
439 return hr;
440 }
441
442 /**************************************************************************
443 * CPrinterFolder::GetAttributesOf
444 */
445 HRESULT WINAPI CPrinterFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut)
446 {
447 static const DWORD dwPrintersAttributes =
448 SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_CANRENAME | SFGAO_CANDELETE;
449 HRESULT hr = S_OK;
450
451 FIXME ("(%p)->(cidl=%d apidl=%p mask=0x%08lx): stub\n",
452 this, cidl, apidl, *rgfInOut);
453
454 *rgfInOut &= dwPrintersAttributes;
455
456 *rgfInOut &= ~SFGAO_VALIDATE;
457
458 TRACE ("-- result=0x%08x\n", *rgfInOut);
459 return hr;
460 }
461
462 /**************************************************************************
463 * CPrinterFolder::GetUIObjectOf
464 *
465 * PARAMETERS
466 * HWND hwndOwner, //[in ] Parent window for any output
467 * UINT cidl, //[in ] array size
468 * LPCITEMIDLIST* apidl, //[in ] simple pidl array
469 * REFIID riid, //[in ] Requested Interface
470 * UINT* prgfInOut, //[ ] reserved
471 * LPVOID* ppvObject) //[out] Resulting Interface
472 *
473 */
474 HRESULT WINAPI CPrinterFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl,
475 REFIID riid, UINT * prgfInOut, LPVOID * ppvOut)
476 {
477 IUnknown *pObj = NULL;
478 HRESULT hr = E_INVALIDARG;
479
480 TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
481 this, hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
482
483 if (!ppvOut)
484 return hr;
485
486 *ppvOut = NULL;
487
488 if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID(riid, IID_IExtractIconW)) && cidl == 1)
489 hr = IEI_Printers_Constructor(apidl[0], riid, &pObj);
490 else
491 hr = E_NOINTERFACE;
492
493 if (SUCCEEDED(hr) && !pObj)
494 hr = E_OUTOFMEMORY;
495
496 *ppvOut = pObj;
497 TRACE ("(%p)->hr=0x%08lx\n", this, hr);
498 return hr;
499 }
500
501 /**************************************************************************
502 * CPrinterFolder::GetDisplayNameOf
503 *
504 */
505 HRESULT WINAPI CPrinterFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet)
506 {
507 LPWSTR pszName;
508 PIDLPrinterStruct * p;
509
510 TRACE ("(%p)->(pidl=%p,0x%08lx,%p)\n", this, pidl, dwFlags, strRet);
511 pdump (pidl);
512
513 if (!strRet)
514 {
515 WARN("no strRet\n");
516 return E_INVALIDARG;
517 }
518
519 if (!pidl->mkid.cb)
520 {
521 pszName = (LPWSTR)CoTaskMemAlloc(MAX_PATH * sizeof(WCHAR));
522 if (!pszName)
523 return E_OUTOFMEMORY;
524
525 if (LoadStringW(shell32_hInstance, IDS_PRINTERS, pszName, MAX_PATH))
526 {
527 pszName[MAX_PATH-1] = L'\0';
528 strRet->uType = STRRET_WSTR;
529 strRet->pOleStr = pszName;
530 return S_OK;
531 }
532 CoTaskMemFree(pszName);
533 return E_FAIL;
534 }
535
536 p = _ILGetPrinterStruct(pidl);
537 if (!p)
538 {
539 WARN("no printer struct\n");
540 return E_INVALIDARG;
541 }
542 strRet->pOleStr = (LPWSTR)SHAlloc(p->offsServer * sizeof(WCHAR));
543 if (!strRet->pOleStr)
544 return E_OUTOFMEMORY;
545
546 memcpy((LPVOID)strRet->pOleStr, (LPVOID)p->szName, p->offsServer * sizeof(WCHAR));
547 TRACE("ret %s\n", debugstr_w(strRet->pOleStr));
548
549 return S_OK;
550 }
551
552 /**************************************************************************
553 * CPrinterFolder::SetNameOf
554 * Changes the name of a file object or subfolder, possibly changing its item
555 * identifier in the process.
556 *
557 * PARAMETERS
558 * HWND hwndOwner, //[in ] Owner window for output
559 * LPCITEMIDLIST pidl, //[in ] simple pidl of item to change
560 * LPCOLESTR lpszName, //[in ] the items new display name
561 * DWORD dwFlags, //[in ] SHGNO formatting flags
562 * LPITEMIDLIST* ppidlOut) //[out] simple pidl returned
563 */
564 HRESULT WINAPI CPrinterFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, /* simple pidl */
565 LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut)
566 {
567 FIXME("(%p)->(%p,pidl=%p,%s,%lu,%p)\n", this, hwndOwner, pidl,
568 debugstr_w (lpName), dwFlags, pPidlOut);
569
570 return E_FAIL;
571 }
572
573 HRESULT WINAPI CPrinterFolder::GetDefaultSearchGUID(GUID *pguid)
574 {
575 FIXME("(%p)\n", this);
576 return E_NOTIMPL;
577 }
578
579 HRESULT WINAPI CPrinterFolder::EnumSearches(IEnumExtraSearch **ppenum)
580 {
581 FIXME("(%p)\n", this);
582 return E_NOTIMPL;
583 }
584
585 HRESULT WINAPI CPrinterFolder::GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay)
586 {
587 if (pSort)
588 *pSort = 0;
589 if (pDisplay)
590 *pDisplay = 0;
591
592 return S_OK;
593 }
594
595 HRESULT WINAPI CPrinterFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags)
596 {
597 if (!pcsFlags || iColumn >= PrinterSHELLVIEWCOLUMNS)
598 return E_INVALIDARG;
599 *pcsFlags = PrinterSFHeader[iColumn].pcsFlags;
600 return S_OK;
601
602 }
603
604 HRESULT WINAPI CPrinterFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv)
605 {
606 FIXME("(%p): stub\n", this);
607
608 return E_NOTIMPL;
609 }
610
611 HRESULT WINAPI CPrinterFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd)
612 {
613 WCHAR buffer[MAX_PATH] = {0};
614 HRESULT hr = E_FAIL;
615
616 TRACE("(%p)->(%p %i %p): stub\n", this, pidl, iColumn, psd);
617
618 if (iColumn >= PrinterSHELLVIEWCOLUMNS)
619 return E_FAIL;
620
621 psd->fmt = PrinterSFHeader[iColumn].fmt;
622 psd->cxChar = PrinterSFHeader[iColumn].cxChar;
623 if (pidl == NULL)
624 {
625 psd->str.uType = STRRET_WSTR;
626 if (LoadStringW(shell32_hInstance, PrinterSFHeader[iColumn].colnameid, buffer, MAX_PATH))
627 hr = SHStrDupW(buffer, &psd->str.pOleStr);
628
629 return hr;
630 }
631
632 if (iColumn == COLUMN_NAME)
633 {
634 psd->str.uType = STRRET_WSTR;
635 return GetDisplayNameOf(pidl, SHGDN_NORMAL, &psd->str);
636 }
637
638 psd->str.uType = STRRET_CSTR;
639 psd->str.cStr[0] = '\0';
640
641 return E_NOTIMPL;
642 }
643
644 HRESULT WINAPI CPrinterFolder::MapColumnToSCID(UINT column, SHCOLUMNID *pscid)
645 {
646 FIXME ("(%p): stub\n", this);
647 return E_NOTIMPL;
648 }
649
650 /************************************************************************
651 * CPrinterFolder::GetClassID
652 */
653 HRESULT WINAPI CPrinterFolder::GetClassID(CLSID *lpClassId)
654 {
655 TRACE ("(%p)\n", this);
656
657 *lpClassId = CLSID_Printers;
658
659 return S_OK;
660 }
661
662 /************************************************************************
663 * CPrinterFolder::Initialize
664 */
665 HRESULT WINAPI CPrinterFolder::Initialize(LPCITEMIDLIST pidl)
666 {
667 if (pidlRoot)
668 SHFree((LPVOID)pidlRoot);
669
670 pidlRoot = ILClone(pidl);
671 return S_OK;
672 }
673
674 /**************************************************************************
675 * CPrinterFolder::GetCurFolder
676 */
677 HRESULT WINAPI CPrinterFolder::GetCurFolder(LPITEMIDLIST * pidl)
678 {
679 TRACE ("(%p)->(%p)\n", this, pidl);
680
681 *pidl = ILClone (pidlRoot);
682 return S_OK;
683 }