Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenprinters.cpp
Go to the documentation of this file.
00001 /* 00002 * Virtual Printers Folder 00003 * 00004 * Copyright 1997 Marcus Meissner 00005 * Copyright 1998, 1999, 2002 Juergen Schmied 00006 * Copyright 2005 Huw Davies 00007 * Copyright 2009 Andrew Hill 00008 * 00009 * This library is free software; you can redistribute it and/or 00010 * modify it under the terms of the GNU Lesser General Public 00011 * License as published by the Free Software Foundation; either 00012 * version 2.1 of the License, or (at your option) any later version. 00013 * 00014 * This library is distributed in the hope that it will be useful, 00015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00017 * Lesser General Public License for more details. 00018 * 00019 * You should have received a copy of the GNU Lesser General Public 00020 * License along with this library; if not, write to the Free Software 00021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00022 */ 00023 00024 #include <precomp.h> 00025 00026 WINE_DEFAULT_DEBUG_CHANNEL (shell); 00027 00028 /*********************************************************************** 00029 * Printers_IExtractIconW implementation 00030 */ 00031 class CPrintersExtractIconW : 00032 public CComObjectRootEx<CComMultiThreadModelNoCS>, 00033 public IExtractIconW, 00034 public IExtractIconA 00035 { 00036 private: 00037 LPITEMIDLIST pidl; 00038 public: 00039 CPrintersExtractIconW(); 00040 ~CPrintersExtractIconW(); 00041 HRESULT WINAPI Initialize(LPCITEMIDLIST pidl); 00042 00043 // IExtractIconW 00044 virtual HRESULT STDMETHODCALLTYPE GetIconLocation(UINT uFlags, LPWSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags); 00045 virtual HRESULT STDMETHODCALLTYPE Extract(LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); 00046 00047 // IExtractIconA 00048 virtual HRESULT STDMETHODCALLTYPE GetIconLocation(UINT uFlags, LPSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags); 00049 virtual HRESULT STDMETHODCALLTYPE Extract(LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); 00050 00051 BEGIN_COM_MAP(CPrintersExtractIconW) 00052 COM_INTERFACE_ENTRY_IID(IID_IExtractIconW, IExtractIconW) 00053 COM_INTERFACE_ENTRY_IID(IID_IExtractIconA, IExtractIconA) 00054 END_COM_MAP() 00055 }; 00056 00057 static shvheader PrinterSFHeader[] = { 00058 {IDS_SHV_COLUMN8, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, 00059 {IDS_SHV_COLUMN_DOCUMENTS , SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, 00060 {IDS_SHV_COLUMN_STATUS, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, 00061 {IDS_SHV_COLUMN_COMMENTS, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, 00062 {IDS_SHV_COLUMN_LOCATION, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, 00063 {IDS_SHV_COLUMN_MODEL, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15} 00064 }; 00065 00066 #define COLUMN_NAME 0 00067 #define COLUMN_DOCUMENTS 1 00068 #define COLUMN_STATUS 2 00069 #define COLUMN_COMMENTS 3 00070 #define COLUMN_LOCATION 4 00071 #define COLUMN_MODEL 5 00072 00073 00074 #define PrinterSHELLVIEWCOLUMNS (6) 00075 00076 CPrintersExtractIconW::CPrintersExtractIconW() 00077 { 00078 pidl = NULL; 00079 } 00080 00081 CPrintersExtractIconW::~CPrintersExtractIconW() 00082 { 00083 TRACE(" destroying IExtractIcon(%p)\n", this); 00084 SHFree(pidl); 00085 } 00086 00087 HRESULT WINAPI CPrintersExtractIconW::Initialize(LPCITEMIDLIST pidl) 00088 { 00089 pidl = ILClone(pidl); 00090 00091 pdump(pidl); 00092 return S_OK; 00093 } 00094 00095 /************************************************************************** 00096 * CPrintersExtractIconW::GetIconLocation 00097 * 00098 * mapping filetype to icon 00099 */ 00100 HRESULT WINAPI CPrintersExtractIconW::GetIconLocation(UINT uFlags, /* GIL_ flags */ 00101 LPWSTR szIconFile, 00102 UINT cchMax, 00103 int *piIndex, 00104 UINT *pwFlags) /* returned GIL_ flags */ 00105 { 00106 TRACE("(%p) (flags=%u %p %u %p %p)\n", this, uFlags, szIconFile, cchMax, piIndex, pwFlags); 00107 00108 if (pwFlags) 00109 *pwFlags = 0; 00110 00111 lstrcpynW(szIconFile, swShell32Name, cchMax); 00112 *piIndex = -IDI_SHELL_PRINTERS_FOLDER; /* FIXME: other icons for default, network, print to file */ 00113 00114 TRACE("-- %s %x\n", debugstr_w(szIconFile), *piIndex); 00115 return NOERROR; 00116 } 00117 00118 /************************************************************************** 00119 * CPrintersExtractIconW::Extract 00120 */ 00121 HRESULT WINAPI CPrintersExtractIconW::Extract(LPCWSTR pszFile, 00122 UINT nIconIndex, HICON *phiconLarge, 00123 HICON *phiconSmall, UINT nIconSize) 00124 { 00125 int index; 00126 00127 FIXME("(%p) (file=%p index=%d %p %p size=%x) semi-stub\n", this, debugstr_w(pszFile), 00128 (signed)nIconIndex, phiconLarge, phiconSmall, nIconSize); 00129 00130 index = SIC_GetIconIndex(pszFile, nIconIndex, 0); 00131 00132 if (phiconLarge) 00133 *phiconLarge = ImageList_GetIcon(ShellBigIconList, index, ILD_TRANSPARENT); 00134 00135 if (phiconSmall) 00136 *phiconSmall = ImageList_GetIcon(ShellSmallIconList, index, ILD_TRANSPARENT); 00137 00138 return S_OK; 00139 } 00140 00141 /************************************************************************** 00142 * CPrintersExtractIconW::GetIconLocation 00143 */ 00144 HRESULT WINAPI CPrintersExtractIconW::GetIconLocation(UINT uFlags, 00145 LPSTR szIconFile, 00146 UINT cchMax, 00147 int * piIndex, 00148 UINT * pwFlags) 00149 { 00150 HRESULT ret; 00151 LPWSTR lpwstrFile = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, cchMax * sizeof(WCHAR)); 00152 00153 TRACE("(%p) (flags=%u %p %u %p %p)\n", this, uFlags, szIconFile, cchMax, piIndex, pwFlags); 00154 00155 ret = GetIconLocation(uFlags, lpwstrFile, cchMax, piIndex, pwFlags); 00156 WideCharToMultiByte(CP_ACP, 0, lpwstrFile, -1, szIconFile, cchMax, NULL, NULL); 00157 HeapFree(GetProcessHeap(), 0, lpwstrFile); 00158 00159 TRACE("-- %s %x\n", szIconFile, *piIndex); 00160 return ret; 00161 } 00162 /************************************************************************** 00163 * CPrintersExtractIconW::Extract 00164 */ 00165 HRESULT WINAPI CPrintersExtractIconW::Extract(LPCSTR pszFile, 00166 UINT nIconIndex, HICON *phiconLarge, 00167 HICON *phiconSmall, UINT nIconSize) 00168 { 00169 HRESULT ret; 00170 INT len = MultiByteToWideChar(CP_ACP, 0, pszFile, -1, NULL, 0); 00171 LPWSTR lpwstrFile = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); 00172 00173 TRACE("(%p) (file=%p index=%u %p %p size=%u)\n", this, pszFile, nIconIndex, phiconLarge, phiconSmall, nIconSize); 00174 00175 MultiByteToWideChar(CP_ACP, 0, pszFile, -1, lpwstrFile, len); 00176 ret = Extract(lpwstrFile, nIconIndex, phiconLarge, phiconSmall, nIconSize); 00177 HeapFree(GetProcessHeap(), 0, lpwstrFile); 00178 return ret; 00179 } 00180 00181 /************************************************************************** 00182 * IExtractIcon_Constructor 00183 */ 00184 static HRESULT WINAPI IEI_Printers_Constructor(LPCITEMIDLIST pidl, REFIID riid, IUnknown **ppv) 00185 { 00186 CComObject<CPrintersExtractIconW> *theExtractor; 00187 CComPtr<IUnknown> result; 00188 HRESULT hResult; 00189 00190 if (ppv == NULL) 00191 return E_POINTER; 00192 *ppv = NULL; 00193 ATLTRY (theExtractor = new CComObject<CPrintersExtractIconW>); 00194 if (theExtractor == NULL) 00195 return E_OUTOFMEMORY; 00196 hResult = theExtractor->QueryInterface(riid, (void **)&result); 00197 if (FAILED (hResult)) 00198 { 00199 delete theExtractor; 00200 return hResult; 00201 } 00202 hResult = theExtractor->Initialize(pidl); 00203 if (FAILED (hResult)) 00204 return hResult; 00205 *ppv = result.Detach(); 00206 return S_OK; 00207 } 00208 00209 /*********************************************************************** 00210 * Printers folder implementation 00211 */ 00212 00213 class CPrintersEnum: public IEnumIDListImpl 00214 { 00215 public: 00216 CPrintersEnum(); 00217 ~CPrintersEnum(); 00218 HRESULT WINAPI Initialize(HWND hwndOwner, DWORD dwFlags); 00219 BOOL CreatePrintersEnumList(DWORD dwFlags); 00220 00221 BEGIN_COM_MAP(CPrintersEnum) 00222 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList) 00223 END_COM_MAP() 00224 }; 00225 00226 CPrintersEnum::CPrintersEnum() 00227 { 00228 } 00229 00230 CPrintersEnum::~CPrintersEnum() 00231 { 00232 } 00233 00234 HRESULT WINAPI CPrintersEnum::Initialize(HWND hwndOwner, DWORD dwFlags) 00235 { 00236 if (CreatePrintersEnumList(dwFlags) == FALSE) 00237 return E_FAIL; 00238 return S_OK; 00239 } 00240 00241 static LPITEMIDLIST _ILCreatePrinterItem(PRINTER_INFO_4W *pi) 00242 { 00243 PIDLDATA tmp; 00244 LPITEMIDLIST pidl; 00245 PIDLPrinterStruct * p; 00246 int size0 = (char*)&tmp.u.cprinter.szName - (char*)&tmp.u.cprinter; 00247 int size = size0; 00248 00249 tmp.type = 0x00; 00250 tmp.u.cprinter.dummy = 0xFF; 00251 if (pi->pPrinterName) 00252 tmp.u.cprinter.offsServer = wcslen(pi->pPrinterName) + 1; 00253 else 00254 tmp.u.cprinter.offsServer = 1; 00255 00256 size += tmp.u.cprinter.offsServer * sizeof(WCHAR); 00257 if (pi->pServerName) 00258 size += (wcslen(pi->pServerName) + 1) * sizeof(WCHAR); 00259 else 00260 size += sizeof(WCHAR); 00261 00262 pidl = (LPITEMIDLIST)SHAlloc(size + 4); 00263 if (!pidl) 00264 return pidl; 00265 00266 pidl->mkid.cb = size + 2; 00267 memcpy(pidl->mkid.abID, &tmp, 2 + size0); 00268 00269 p = &((PIDLDATA*)pidl->mkid.abID)->u.cprinter; 00270 00271 p->Attributes = pi->Attributes; 00272 if (pi->pPrinterName) 00273 wcscpy(p->szName, pi->pPrinterName); 00274 else 00275 p->szName[0] = L'\0'; 00276 00277 if (pi->pServerName) 00278 wcscpy(p->szName + p->offsServer, pi->pServerName); 00279 else 00280 p->szName[p->offsServer] = L'\0'; 00281 00282 *(WORD*)((char*)pidl + (size + 2)) = 0; 00283 return pidl; 00284 } 00285 00286 /************************************************************************** 00287 * CPrintersEnum::CreatePrintersEnumList() 00288 */ 00289 BOOL CPrintersEnum::CreatePrintersEnumList(DWORD dwFlags) 00290 { 00291 BOOL ret = TRUE; 00292 00293 TRACE("(%p)->(flags=0x%08lx) \n", this, dwFlags); 00294 00295 /* enumerate the folders */ 00296 if (dwFlags & SHCONTF_NONFOLDERS) 00297 { 00298 DWORD needed = 0, num = 0, i; 00299 PRINTER_INFO_4W *pi; 00300 00301 EnumPrintersW(PRINTER_ENUM_LOCAL, NULL, 4, NULL, 0, &needed, &num); 00302 if (!needed) 00303 return ret; 00304 00305 pi = (PRINTER_INFO_4W *)HeapAlloc(GetProcessHeap(), 0, needed); 00306 if(!EnumPrintersW(PRINTER_ENUM_LOCAL, NULL, 4, (LPBYTE)pi, needed, &needed, &num)) { 00307 HeapFree(GetProcessHeap(), 0, pi); 00308 return FALSE; 00309 } 00310 00311 for(i = 0; i < num; i++) { 00312 LPITEMIDLIST pidl = _ILCreatePrinterItem(&pi[i]); 00313 if (pidl) 00314 { 00315 if (!AddToEnumList(pidl)) 00316 SHFree(pidl); 00317 } 00318 } 00319 HeapFree(GetProcessHeap(), 0, pi); 00320 } 00321 return ret; 00322 } 00323 00324 CPrinterFolder::CPrinterFolder() 00325 { 00326 pidlRoot = NULL; 00327 dwAttributes = 0; 00328 pclsid = NULL; 00329 } 00330 00331 CPrinterFolder::~CPrinterFolder() 00332 { 00333 TRACE("-- destroying IShellFolder(%p)\n", this); 00334 if (pidlRoot) 00335 SHFree(pidlRoot); 00336 } 00337 00338 HRESULT WINAPI CPrinterFolder::FinalConstruct() 00339 { 00340 pidlRoot = _ILCreatePrinters(); /* my qualified pidl */ 00341 if (pidlRoot == NULL) 00342 return E_OUTOFMEMORY; 00343 return S_OK; 00344 } 00345 00346 /************************************************************************** 00347 * CPrinterFolder::ParseDisplayName 00348 * 00349 * This is E_NOTIMPL in Windows too. 00350 */ 00351 HRESULT WINAPI CPrinterFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, 00352 DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes) 00353 { 00354 TRACE("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", 00355 this, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName), 00356 pchEaten, ppidl, pdwAttributes); 00357 00358 *ppidl = 0; 00359 if (pchEaten) 00360 *pchEaten = 0; 00361 00362 return E_NOTIMPL; 00363 } 00364 00365 static PIDLPrinterStruct * _ILGetPrinterStruct(LPCITEMIDLIST pidl) 00366 { 00367 LPPIDLDATA pdata = _ILGetDataPointer(pidl); 00368 00369 if (pdata && pdata->type == 0x00) 00370 return (PIDLPrinterStruct*) & (pdata->u.cfont); 00371 00372 return NULL; 00373 } 00374 00375 /************************************************************************** 00376 * CPrinterFolder::EnumObjects 00377 */ 00378 HRESULT WINAPI CPrinterFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList) 00379 { 00380 CComObject<CPrintersEnum> *theEnumerator; 00381 CComPtr<IEnumIDList> result; 00382 HRESULT hResult; 00383 00384 TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, dwFlags, ppEnumIDList); 00385 00386 if (ppEnumIDList == NULL) 00387 return E_POINTER; 00388 *ppEnumIDList = NULL; 00389 ATLTRY (theEnumerator = new CComObject<CPrintersEnum>); 00390 if (theEnumerator == NULL) 00391 return E_OUTOFMEMORY; 00392 hResult = theEnumerator->QueryInterface(IID_IEnumIDList, (void **)&result); 00393 if (FAILED (hResult)) 00394 { 00395 delete theEnumerator; 00396 return hResult; 00397 } 00398 hResult = theEnumerator->Initialize(hwndOwner, dwFlags); 00399 if (FAILED (hResult)) 00400 return hResult; 00401 *ppEnumIDList = result.Detach(); 00402 00403 TRACE ("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList); 00404 00405 return S_OK; 00406 } 00407 00408 /************************************************************************** 00409 * CPrinterFolder::BindToObject 00410 */ 00411 HRESULT WINAPI CPrinterFolder::BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) 00412 { 00413 TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", this, 00414 pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut); 00415 00416 return SHELL32_BindToChild(pidlRoot, NULL, pidl, riid, ppvOut); 00417 } 00418 00419 /************************************************************************** 00420 * ISF_Printers_fnBindToStorage 00421 */ 00422 HRESULT WINAPI CPrinterFolder::BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) 00423 { 00424 FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n", 00425 this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut); 00426 00427 *ppvOut = NULL; 00428 return E_NOTIMPL; 00429 } 00430 00431 /************************************************************************** 00432 * CPrinterFolder::CompareIDs 00433 */ 00434 HRESULT WINAPI CPrinterFolder::CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) 00435 { 00436 int nReturn; 00437 00438 TRACE ("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", this, lParam, pidl1, pidl2); 00439 nReturn = SHELL32_CompareIDs (this, lParam, pidl1, pidl2); 00440 TRACE ("-- %i\n", nReturn); 00441 return nReturn; 00442 } 00443 00444 /************************************************************************** 00445 * CPrinterFolder::CreateViewObject 00446 */ 00447 HRESULT WINAPI CPrinterFolder::CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID * ppvOut) 00448 { 00449 LPSHELLVIEW pShellView; 00450 HRESULT hr = E_INVALIDARG; 00451 00452 TRACE("(%p)->(hwnd=%p,%s,%p)\n", this, 00453 hwndOwner, shdebugstr_guid (&riid), ppvOut); 00454 00455 if (!ppvOut) 00456 return hr; 00457 00458 *ppvOut = NULL; 00459 00460 if (IsEqualIID(riid, IID_IDropTarget)) 00461 { 00462 WARN("IDropTarget not implemented\n"); 00463 hr = E_NOTIMPL; 00464 } 00465 else if(IsEqualIID(riid, IID_IContextMenu)) 00466 { 00467 WARN("IContextMenu not implemented\n"); 00468 hr = E_NOTIMPL; 00469 } 00470 else if(IsEqualIID(riid, IID_IShellView)) 00471 { 00472 hr = IShellView_Constructor((IShellFolder *)this, &pShellView); 00473 if (pShellView) 00474 { 00475 hr = pShellView->QueryInterface(riid, ppvOut); 00476 pShellView->Release(); 00477 } 00478 } 00479 TRACE ("-- (%p)->(interface=%p)\n", this, ppvOut); 00480 return hr; 00481 } 00482 00483 /************************************************************************** 00484 * CPrinterFolder::GetAttributesOf 00485 */ 00486 HRESULT WINAPI CPrinterFolder::GetAttributesOf(UINT cidl, LPCITEMIDLIST *apidl, DWORD *rgfInOut) 00487 { 00488 static const DWORD dwPrintersAttributes = 00489 SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_CANRENAME | SFGAO_CANDELETE; 00490 HRESULT hr = S_OK; 00491 00492 FIXME ("(%p)->(cidl=%d apidl=%p mask=0x%08lx): stub\n", 00493 this, cidl, apidl, *rgfInOut); 00494 00495 *rgfInOut &= dwPrintersAttributes; 00496 00497 *rgfInOut &= ~SFGAO_VALIDATE; 00498 00499 TRACE ("-- result=0x%08x\n", *rgfInOut); 00500 return hr; 00501 } 00502 00503 /************************************************************************** 00504 * CPrinterFolder::GetUIObjectOf 00505 * 00506 * PARAMETERS 00507 * HWND hwndOwner, //[in ] Parent window for any output 00508 * UINT cidl, //[in ] array size 00509 * LPCITEMIDLIST* apidl, //[in ] simple pidl array 00510 * REFIID riid, //[in ] Requested Interface 00511 * UINT* prgfInOut, //[ ] reserved 00512 * LPVOID* ppvObject) //[out] Resulting Interface 00513 * 00514 */ 00515 HRESULT WINAPI CPrinterFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl, 00516 REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) 00517 { 00518 IUnknown *pObj = NULL; 00519 HRESULT hr = E_INVALIDARG; 00520 00521 TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", 00522 this, hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut); 00523 00524 if (!ppvOut) 00525 return hr; 00526 00527 *ppvOut = NULL; 00528 00529 if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID(riid, IID_IExtractIconW)) && cidl == 1) 00530 hr = IEI_Printers_Constructor(apidl[0], riid, &pObj); 00531 else 00532 hr = E_NOINTERFACE; 00533 00534 if (SUCCEEDED(hr) && !pObj) 00535 hr = E_OUTOFMEMORY; 00536 00537 *ppvOut = pObj; 00538 TRACE ("(%p)->hr=0x%08lx\n", this, hr); 00539 return hr; 00540 } 00541 00542 /************************************************************************** 00543 * CPrinterFolder::GetDisplayNameOf 00544 * 00545 */ 00546 HRESULT WINAPI CPrinterFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) 00547 { 00548 LPWSTR pszName; 00549 PIDLPrinterStruct * p; 00550 00551 TRACE ("(%p)->(pidl=%p,0x%08lx,%p)\n", this, pidl, dwFlags, strRet); 00552 pdump (pidl); 00553 00554 if (!strRet) 00555 { 00556 WARN("no strRet\n"); 00557 return E_INVALIDARG; 00558 } 00559 00560 if (!pidl->mkid.cb) 00561 { 00562 pszName = (LPWSTR)CoTaskMemAlloc(MAX_PATH * sizeof(WCHAR)); 00563 if (!pszName) 00564 return E_OUTOFMEMORY; 00565 00566 if (LoadStringW(shell32_hInstance, IDS_PRINTERS, pszName, MAX_PATH)) 00567 { 00568 pszName[MAX_PATH-1] = L'\0'; 00569 strRet->uType = STRRET_WSTR; 00570 strRet->pOleStr = pszName; 00571 return S_OK; 00572 } 00573 CoTaskMemFree(pszName); 00574 return E_FAIL; 00575 } 00576 00577 p = _ILGetPrinterStruct(pidl); 00578 if (!p) 00579 { 00580 WARN("no printer struct\n"); 00581 return E_INVALIDARG; 00582 } 00583 strRet->pOleStr = (LPWSTR)SHAlloc(p->offsServer * sizeof(WCHAR)); 00584 if (!strRet->pOleStr) 00585 return E_OUTOFMEMORY; 00586 00587 memcpy((LPVOID)strRet->pOleStr, (LPVOID)p->szName, p->offsServer * sizeof(WCHAR)); 00588 TRACE("ret %s\n", debugstr_w(strRet->pOleStr)); 00589 00590 return S_OK; 00591 } 00592 00593 /************************************************************************** 00594 * CPrinterFolder::SetNameOf 00595 * Changes the name of a file object or subfolder, possibly changing its item 00596 * identifier in the process. 00597 * 00598 * PARAMETERS 00599 * HWND hwndOwner, //[in ] Owner window for output 00600 * LPCITEMIDLIST pidl, //[in ] simple pidl of item to change 00601 * LPCOLESTR lpszName, //[in ] the items new display name 00602 * DWORD dwFlags, //[in ] SHGNO formatting flags 00603 * LPITEMIDLIST* ppidlOut) //[out] simple pidl returned 00604 */ 00605 HRESULT WINAPI CPrinterFolder::SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, /* simple pidl */ 00606 LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut) 00607 { 00608 FIXME("(%p)->(%p,pidl=%p,%s,%lu,%p)\n", this, hwndOwner, pidl, 00609 debugstr_w (lpName), dwFlags, pPidlOut); 00610 00611 return E_FAIL; 00612 } 00613 00614 HRESULT WINAPI CPrinterFolder::GetDefaultSearchGUID(GUID *pguid) 00615 { 00616 FIXME("(%p)\n", this); 00617 return E_NOTIMPL; 00618 } 00619 00620 HRESULT WINAPI CPrinterFolder::EnumSearches(IEnumExtraSearch **ppenum) 00621 { 00622 FIXME("(%p)\n", this); 00623 return E_NOTIMPL; 00624 } 00625 00626 HRESULT WINAPI CPrinterFolder::GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) 00627 { 00628 if (pSort) 00629 *pSort = 0; 00630 if (pDisplay) 00631 *pDisplay = 0; 00632 00633 return S_OK; 00634 } 00635 00636 HRESULT WINAPI CPrinterFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags) 00637 { 00638 if (!pcsFlags || iColumn >= PrinterSHELLVIEWCOLUMNS) 00639 return E_INVALIDARG; 00640 *pcsFlags = PrinterSFHeader[iColumn].pcsFlags; 00641 return S_OK; 00642 00643 } 00644 00645 HRESULT WINAPI CPrinterFolder::GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv) 00646 { 00647 FIXME("(%p): stub\n", this); 00648 00649 return E_NOTIMPL; 00650 } 00651 00652 HRESULT WINAPI CPrinterFolder::GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd) 00653 { 00654 WCHAR buffer[MAX_PATH] = {0}; 00655 HRESULT hr = E_FAIL; 00656 00657 TRACE("(%p)->(%p %i %p): stub\n", this, pidl, iColumn, psd); 00658 00659 if (iColumn >= PrinterSHELLVIEWCOLUMNS) 00660 return E_FAIL; 00661 00662 psd->fmt = PrinterSFHeader[iColumn].fmt; 00663 psd->cxChar = PrinterSFHeader[iColumn].cxChar; 00664 if (pidl == NULL) 00665 { 00666 psd->str.uType = STRRET_WSTR; 00667 if (LoadStringW(shell32_hInstance, PrinterSFHeader[iColumn].colnameid, buffer, MAX_PATH)) 00668 hr = SHStrDupW(buffer, &psd->str.pOleStr); 00669 00670 return hr; 00671 } 00672 00673 if (iColumn == COLUMN_NAME) 00674 { 00675 psd->str.uType = STRRET_WSTR; 00676 return GetDisplayNameOf(pidl, SHGDN_NORMAL, &psd->str); 00677 } 00678 00679 psd->str.uType = STRRET_CSTR; 00680 psd->str.cStr[0] = '\0'; 00681 00682 return E_NOTIMPL; 00683 } 00684 00685 HRESULT WINAPI CPrinterFolder::MapColumnToSCID(UINT column, SHCOLUMNID *pscid) 00686 { 00687 FIXME ("(%p): stub\n", this); 00688 return E_NOTIMPL; 00689 } 00690 00691 /************************************************************************ 00692 * CPrinterFolder::GetClassID 00693 */ 00694 HRESULT WINAPI CPrinterFolder::GetClassID(CLSID *lpClassId) 00695 { 00696 TRACE ("(%p)\n", this); 00697 00698 *lpClassId = CLSID_Printers; 00699 00700 return S_OK; 00701 } 00702 00703 /************************************************************************ 00704 * CPrinterFolder::Initialize 00705 */ 00706 HRESULT WINAPI CPrinterFolder::Initialize(LPCITEMIDLIST pidl) 00707 { 00708 if (pidlRoot) 00709 SHFree((LPVOID)pidlRoot); 00710 00711 pidlRoot = ILClone(pidl); 00712 return S_OK; 00713 } 00714 00715 /************************************************************************** 00716 * CPrinterFolder::GetCurFolder 00717 */ 00718 HRESULT WINAPI CPrinterFolder::GetCurFolder(LPITEMIDLIST * pidl) 00719 { 00720 TRACE ("(%p)->(%p)\n", this, pidl); 00721 00722 *pidl = ILClone (pidlRoot); 00723 return S_OK; 00724 } Generated on Sun May 27 2012 04:26:22 for ReactOS by
1.7.6.1
|