ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

printers.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.