[RSHELL]
[reactos.git] / dll / win32 / shell32 / folders / printers.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
129 FIXME("(%p) (file=%p index=%d %p %p size=%x) semi-stub\n", this, debugstr_w(pszFile),
130 (signed)nIconIndex, phiconLarge, phiconSmall, nIconSize);
131
132 index = SIC_GetIconIndex(pszFile, nIconIndex, 0);
133
134 if (phiconLarge)
135 *phiconLarge = ImageList_GetIcon(ShellBigIconList, index, ILD_TRANSPARENT);
136
137 if (phiconSmall)
138 *phiconSmall = ImageList_GetIcon(ShellSmallIconList, index, ILD_TRANSPARENT);
139
140 return S_OK;
141 }
142
143 /**************************************************************************
144 * CPrintersExtractIconW::GetIconLocation
145 */
146 HRESULT WINAPI CPrintersExtractIconW::GetIconLocation(UINT uFlags,
147 LPSTR szIconFile,
148 UINT cchMax,
149 int * piIndex,
150 UINT * pwFlags)
151 {
152 HRESULT ret;
153 LPWSTR lpwstrFile = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, cchMax * sizeof(WCHAR));
154
155 TRACE("(%p) (flags=%u %p %u %p %p)\n", this, uFlags, szIconFile, cchMax, piIndex, pwFlags);
156
157 ret = GetIconLocation(uFlags, lpwstrFile, cchMax, piIndex, pwFlags);
158 WideCharToMultiByte(CP_ACP, 0, lpwstrFile, -1, szIconFile, cchMax, NULL, NULL);
159 HeapFree(GetProcessHeap(), 0, lpwstrFile);
160
161 TRACE("-- %s %x\n", szIconFile, *piIndex);
162 return ret;
163 }
164 /**************************************************************************
165 * CPrintersExtractIconW::Extract
166 */
167 HRESULT WINAPI CPrintersExtractIconW::Extract(LPCSTR pszFile,
168 UINT nIconIndex, HICON *phiconLarge,
169 HICON *phiconSmall, UINT nIconSize)
170 {
171 HRESULT ret;
172 INT len = MultiByteToWideChar(CP_ACP, 0, pszFile, -1, NULL, 0);
173 LPWSTR lpwstrFile = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
174
175 TRACE("(%p) (file=%p index=%u %p %p size=%u)\n", this, pszFile, nIconIndex, phiconLarge, phiconSmall, nIconSize);
176
177 MultiByteToWideChar(CP_ACP, 0, pszFile, -1, lpwstrFile, len);
178 ret = Extract(lpwstrFile, nIconIndex, phiconLarge, phiconSmall, nIconSize);
179 HeapFree(GetProcessHeap(), 0, lpwstrFile);
180 return ret;
181 }
182
183 /**************************************************************************
184 * IExtractIcon_Constructor
185 */
186 static HRESULT WINAPI IEI_Printers_Constructor(LPCITEMIDLIST pidl, REFIID riid, IUnknown **ppv)
187 {
188 return ShellObjectCreatorInit<CPrintersExtractIconW>(pidl, riid, ppv);
189 }
190
191 /***********************************************************************
192 * Printers folder implementation
193 */
194
195 class CPrintersEnum: public IEnumIDListImpl
196 {
197 public:
198 CPrintersEnum();
199 ~CPrintersEnum();
200 HRESULT WINAPI Initialize(HWND hwndOwner, DWORD dwFlags);
201 BOOL CreatePrintersEnumList(DWORD dwFlags);
202
203 BEGIN_COM_MAP(CPrintersEnum)
204 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
205 END_COM_MAP()
206 };
207
208 CPrintersEnum::CPrintersEnum()
209 {
210 }
211
212 CPrintersEnum::~CPrintersEnum()
213 {
214 }
215
216 HRESULT WINAPI CPrintersEnum::Initialize(HWND hwndOwner, DWORD dwFlags)
217 {
218 if (CreatePrintersEnumList(dwFlags) == FALSE)
219 return E_FAIL;
220 return S_OK;
221 }
222
223 static LPITEMIDLIST _ILCreatePrinterItem(PRINTER_INFO_4W *pi)
224 {
225 PIDLDATA tmp;
226 LPITEMIDLIST pidl;
227 PIDLPrinterStruct * p;
228 int size0 = (char*)&tmp.u.cprinter.szName - (char*)&tmp.u.cprinter;
229 int size = size0;
230
231 tmp.type = 0x00;
232 tmp.u.cprinter.dummy = 0xFF;
233 if (pi->pPrinterName)
234 tmp.u.cprinter.offsServer = wcslen(pi->pPrinterName) + 1;
235 else
236 tmp.u.cprinter.offsServer = 1;
237
238 size += tmp.u.cprinter.offsServer * sizeof(WCHAR);
239 if (pi->pServerName)
240 size += (wcslen(pi->pServerName) + 1) * sizeof(WCHAR);
241 else
242 size += sizeof(WCHAR);
243
244 pidl = (LPITEMIDLIST)SHAlloc(size + 4);
245 if (!pidl)
246 return pidl;
247
248 pidl->mkid.cb = size + 2;
249 memcpy(pidl->mkid.abID, &tmp, 2 + size0);
250
251 p = &((PIDLDATA*)pidl->mkid.abID)->u.cprinter;
252
253 p->Attributes = pi->Attributes;
254 if (pi->pPrinterName)
255 wcscpy(p->szName, pi->pPrinterName);
256 else
257 p->szName[0] = L'\0';
258
259 if (pi->pServerName)
260 wcscpy(p->szName + p->offsServer, pi->pServerName);
261 else
262 p->szName[p->offsServer] = L'\0';
263
264 *(WORD*)((char*)pidl + (size + 2)) = 0;
265 return pidl;
266 }
267
268 /**************************************************************************
269 * CPrintersEnum::CreatePrintersEnumList()
270 */
271 BOOL CPrintersEnum::CreatePrintersEnumList(DWORD dwFlags)
272 {
273 BOOL ret = TRUE;
274
275 TRACE("(%p)->(flags=0x%08lx) \n", this, dwFlags);
276
277 /* enumerate the folders */
278 if (dwFlags & SHCONTF_NONFOLDERS)
279 {
280 DWORD needed = 0, num = 0, i;
281 PRINTER_INFO_4W *pi;
282
283 EnumPrintersW(PRINTER_ENUM_LOCAL, NULL, 4, NULL, 0, &needed, &num);
284 if (!needed)
285 return ret;
286
287 pi = (PRINTER_INFO_4W *)HeapAlloc(GetProcessHeap(), 0, needed);
288 if(!EnumPrintersW(PRINTER_ENUM_LOCAL, NULL, 4, (LPBYTE)pi, needed, &needed, &num)) {
289 HeapFree(GetProcessHeap(), 0, pi);
290 return FALSE;
291 }
292
293 for(i = 0; i < num; i++) {
294 LPITEMIDLIST pidl = _ILCreatePrinterItem(&pi[i]);
295 if (pidl)
296 {
297 if (!AddToEnumList(pidl))
298 SHFree(pidl);
299 }
300 }
301 HeapFree(GetProcessHeap(), 0, pi);
302 }
303 return ret;
304 }
305
306 CPrinterFolder::CPrinterFolder()
307 {
308 pidlRoot = NULL;
309 dwAttributes = 0;
310 pclsid = NULL;
311 }
312
313 CPrinterFolder::~CPrinterFolder()
314 {
315 TRACE("-- destroying IShellFolder(%p)\n", this);
316 if (pidlRoot)
317 SHFree(pidlRoot);
318 }
319
320 HRESULT WINAPI CPrinterFolder::FinalConstruct()
321 {
322 pidlRoot = _ILCreatePrinters(); /* my qualified pidl */
323 if (pidlRoot == NULL)
324 return E_OUTOFMEMORY;
325 return S_OK;
326 }
327
328 /**************************************************************************
329 * CPrinterFolder::ParseDisplayName
330 *
331 * This is E_NOTIMPL in Windows too.
332 */
333 HRESULT WINAPI CPrinterFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName,
334 DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
335 {
336 TRACE("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n",
337 this, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName),
338 pchEaten, ppidl, pdwAttributes);
339
340 *ppidl = 0;
341 if (pchEaten)
342 *pchEaten = 0;
343
344 return E_NOTIMPL;
345 }
346
347 static PIDLPrinterStruct * _ILGetPrinterStruct(LPCITEMIDLIST pidl)
348 {
349 LPPIDLDATA pdata = _ILGetDataPointer(pidl);
350
351 if (pdata && pdata->type == 0x00)
352 return (PIDLPrinterStruct*) & (pdata->u.cfont);
353
354 return NULL;
355 }
356
357 /**************************************************************************
358 * CPrinterFolder::EnumObjects
359 */
360 HRESULT WINAPI CPrinterFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList)
361 {
362 return ShellObjectCreatorInit<CPrintersEnum>(hwndOwner, dwFlags, IID_IEnumIDList, ppEnumIDList);
363 }
364
365 /**************************************************************************
366 * CPrinterFolder::BindToObject
367 */
368 HRESULT WINAPI CPrinterFolder::BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
369 {
370 TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", this,
371 pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut);
372
373 return SHELL32_BindToChild(pidlRoot, NULL, pidl, riid, ppvOut);
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 int nReturn;
394
395 TRACE ("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", this, lParam, pidl1, pidl2);
396 nReturn = SHELL32_CompareIDs (this, lParam, pidl1, pidl2);
397 TRACE ("-- %i\n", nReturn);
398 return nReturn;
399 }
400
401 /**************************************************************************
402 * CPrinterFolder::CreateViewObject
403 */
404 HRESULT WINAPI CPrinterFolder::CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID * ppvOut)
405 {
406 CComPtr<IShellView> pShellView;
407 HRESULT hr = E_INVALIDARG;
408
409 TRACE("(%p)->(hwnd=%p,%s,%p)\n", this,
410 hwndOwner, shdebugstr_guid (&riid), ppvOut);
411
412 if (!ppvOut)
413 return hr;
414
415 *ppvOut = NULL;
416
417 if (IsEqualIID(riid, IID_IDropTarget))
418 {
419 WARN("IDropTarget not implemented\n");
420 hr = E_NOTIMPL;
421 }
422 else if(IsEqualIID(riid, IID_IContextMenu))
423 {
424 WARN("IContextMenu not implemented\n");
425 hr = E_NOTIMPL;
426 }
427 else if(IsEqualIID(riid, IID_IShellView))
428 {
429 hr = IShellView_Constructor((IShellFolder *)this, &pShellView);
430 if (pShellView)
431 {
432 hr = pShellView->QueryInterface(riid, ppvOut);
433 pShellView->Release();
434 }
435 }
436 TRACE ("-- (%p)->(interface=%p)\n", this, ppvOut);
437 return hr;
438 }
439
440 /**************************************************************************
441 * CPrinterFolder::GetAttributesOf
442 */
443 HRESULT WINAPI CPrinterFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut)
444 {
445 static const DWORD dwPrintersAttributes =
446 SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_CANRENAME | SFGAO_CANDELETE;
447 HRESULT hr = S_OK;
448
449 FIXME ("(%p)->(cidl=%d apidl=%p mask=0x%08lx): stub\n",
450 this, cidl, apidl, *rgfInOut);
451
452 *rgfInOut &= dwPrintersAttributes;
453
454 *rgfInOut &= ~SFGAO_VALIDATE;
455
456 TRACE ("-- result=0x%08x\n", *rgfInOut);
457 return hr;
458 }
459
460 /**************************************************************************
461 * CPrinterFolder::GetUIObjectOf
462 *
463 * PARAMETERS
464 * HWND hwndOwner, //[in ] Parent window for any output
465 * UINT cidl, //[in ] array size
466 * LPCITEMIDLIST* apidl, //[in ] simple pidl array
467 * REFIID riid, //[in ] Requested Interface
468 * UINT* prgfInOut, //[ ] reserved
469 * LPVOID* ppvObject) //[out] Resulting Interface
470 *
471 */
472 HRESULT WINAPI CPrinterFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl,
473 REFIID riid, UINT * prgfInOut, LPVOID * ppvOut)
474 {
475 IUnknown *pObj = NULL;
476 HRESULT hr = E_INVALIDARG;
477
478 TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
479 this, hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
480
481 if (!ppvOut)
482 return hr;
483
484 *ppvOut = NULL;
485
486 if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID(riid, IID_IExtractIconW)) && cidl == 1)
487 hr = IEI_Printers_Constructor(apidl[0], riid, &pObj);
488 else
489 hr = E_NOINTERFACE;
490
491 if (SUCCEEDED(hr) && !pObj)
492 hr = E_OUTOFMEMORY;
493
494 *ppvOut = pObj;
495 TRACE ("(%p)->hr=0x%08lx\n", this, hr);
496 return hr;
497 }
498
499 /**************************************************************************
500 * CPrinterFolder::GetDisplayNameOf
501 *
502 */
503 HRESULT WINAPI CPrinterFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet)
504 {
505 LPWSTR pszName;
506 PIDLPrinterStruct * p;
507
508 TRACE ("(%p)->(pidl=%p,0x%08lx,%p)\n", this, pidl, dwFlags, strRet);
509 pdump (pidl);
510
511 if (!strRet)
512 {
513 WARN("no strRet\n");
514 return E_INVALIDARG;
515 }
516
517 if (!pidl->mkid.cb)
518 {
519 pszName = (LPWSTR)CoTaskMemAlloc(MAX_PATH * sizeof(WCHAR));
520 if (!pszName)
521 return E_OUTOFMEMORY;
522
523 if (LoadStringW(shell32_hInstance, IDS_PRINTERS, pszName, MAX_PATH))
524 {
525 pszName[MAX_PATH-1] = L'\0';
526 strRet->uType = STRRET_WSTR;
527 strRet->pOleStr = pszName;
528 return S_OK;
529 }
530 CoTaskMemFree(pszName);
531 return E_FAIL;
532 }
533
534 p = _ILGetPrinterStruct(pidl);
535 if (!p)
536 {
537 WARN("no printer struct\n");
538 return E_INVALIDARG;
539 }
540 strRet->pOleStr = (LPWSTR)SHAlloc(p->offsServer * sizeof(WCHAR));
541 if (!strRet->pOleStr)
542 return E_OUTOFMEMORY;
543
544 memcpy((LPVOID)strRet->pOleStr, (LPVOID)p->szName, p->offsServer * sizeof(WCHAR));
545 TRACE("ret %s\n", debugstr_w(strRet->pOleStr));
546
547 return S_OK;
548 }
549
550 /**************************************************************************
551 * CPrinterFolder::SetNameOf
552 * Changes the name of a file object or subfolder, possibly changing its item
553 * identifier in the process.
554 *
555 * PARAMETERS
556 * HWND hwndOwner, //[in ] Owner window for output
557 * LPCITEMIDLIST pidl, //[in ] simple pidl of item to change
558 * LPCOLESTR lpszName, //[in ] the items new display name
559 * DWORD dwFlags, //[in ] SHGNO formatting flags
560 * LPITEMIDLIST* ppidlOut) //[out] simple pidl returned
561 */
562 HRESULT WINAPI CPrinterFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, /* simple pidl */
563 LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut)
564 {
565 FIXME("(%p)->(%p,pidl=%p,%s,%lu,%p)\n", this, hwndOwner, pidl,
566 debugstr_w (lpName), dwFlags, pPidlOut);
567
568 return E_FAIL;
569 }
570
571 HRESULT WINAPI CPrinterFolder::GetDefaultSearchGUID(GUID *pguid)
572 {
573 FIXME("(%p)\n", this);
574 return E_NOTIMPL;
575 }
576
577 HRESULT WINAPI CPrinterFolder::EnumSearches(IEnumExtraSearch **ppenum)
578 {
579 FIXME("(%p)\n", this);
580 return E_NOTIMPL;
581 }
582
583 HRESULT WINAPI CPrinterFolder::GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay)
584 {
585 if (pSort)
586 *pSort = 0;
587 if (pDisplay)
588 *pDisplay = 0;
589
590 return S_OK;
591 }
592
593 HRESULT WINAPI CPrinterFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags)
594 {
595 if (!pcsFlags || iColumn >= PrinterSHELLVIEWCOLUMNS)
596 return E_INVALIDARG;
597 *pcsFlags = PrinterSFHeader[iColumn].pcsFlags;
598 return S_OK;
599
600 }
601
602 HRESULT WINAPI CPrinterFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv)
603 {
604 FIXME("(%p): stub\n", this);
605
606 return E_NOTIMPL;
607 }
608
609 HRESULT WINAPI CPrinterFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd)
610 {
611 WCHAR buffer[MAX_PATH] = {0};
612 HRESULT hr = E_FAIL;
613
614 TRACE("(%p)->(%p %i %p): stub\n", this, pidl, iColumn, psd);
615
616 if (iColumn >= PrinterSHELLVIEWCOLUMNS)
617 return E_FAIL;
618
619 psd->fmt = PrinterSFHeader[iColumn].fmt;
620 psd->cxChar = PrinterSFHeader[iColumn].cxChar;
621 if (pidl == NULL)
622 {
623 psd->str.uType = STRRET_WSTR;
624 if (LoadStringW(shell32_hInstance, PrinterSFHeader[iColumn].colnameid, buffer, MAX_PATH))
625 hr = SHStrDupW(buffer, &psd->str.pOleStr);
626
627 return hr;
628 }
629
630 if (iColumn == COLUMN_NAME)
631 {
632 psd->str.uType = STRRET_WSTR;
633 return GetDisplayNameOf(pidl, SHGDN_NORMAL, &psd->str);
634 }
635
636 psd->str.uType = STRRET_CSTR;
637 psd->str.cStr[0] = '\0';
638
639 return E_NOTIMPL;
640 }
641
642 HRESULT WINAPI CPrinterFolder::MapColumnToSCID(UINT column, SHCOLUMNID *pscid)
643 {
644 FIXME ("(%p): stub\n", this);
645 return E_NOTIMPL;
646 }
647
648 /************************************************************************
649 * CPrinterFolder::GetClassID
650 */
651 HRESULT WINAPI CPrinterFolder::GetClassID(CLSID *lpClassId)
652 {
653 TRACE ("(%p)\n", this);
654
655 *lpClassId = CLSID_Printers;
656
657 return S_OK;
658 }
659
660 /************************************************************************
661 * CPrinterFolder::Initialize
662 */
663 HRESULT WINAPI CPrinterFolder::Initialize(LPCITEMIDLIST pidl)
664 {
665 if (pidlRoot)
666 SHFree((LPVOID)pidlRoot);
667
668 pidlRoot = ILClone(pidl);
669 return S_OK;
670 }
671
672 /**************************************************************************
673 * CPrinterFolder::GetCurFolder
674 */
675 HRESULT WINAPI CPrinterFolder::GetCurFolder(LPITEMIDLIST * pidl)
676 {
677 TRACE ("(%p)->(%p)\n", this, pidl);
678
679 *pidl = ILClone (pidlRoot);
680 return S_OK;
681 }