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

mydocuments.cpp
Go to the documentation of this file.
00001 /*
00002  *    Virtual MyDocuments Folder
00003  *
00004  *    Copyright 2007    Johannes Anderwald
00005  *    Copyright 2009    Andrew Hill
00006  *
00007  * This library is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2.1 of the License, or (at your option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with this library; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00020  */
00021 
00022 #include <precomp.h>
00023 
00024 WINE_DEFAULT_DEBUG_CHANNEL (mydocs);
00025 
00026 /*
00027 CFileSysEnumX should not exist. CMyDocsFolder should aggregate a CFSFolder which always
00028 maps the contents of CSIDL_PERSONAL. Therefore, CMyDocsFolder::EnumObjects simply calls
00029 CFSFolder::EnumObjects.
00030 */
00031 
00032 /***********************************************************************
00033 *     MyDocumentsfolder implementation
00034 */
00035 
00036 class CFileSysEnumX :
00037     public IEnumIDListImpl
00038 {
00039     private:
00040     public:
00041         CFileSysEnumX();
00042         ~CFileSysEnumX();
00043         HRESULT WINAPI Initialize(DWORD dwFlags);
00044 
00045         BEGIN_COM_MAP(CFileSysEnumX)
00046         COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
00047         END_COM_MAP()
00048 };
00049 
00050 static const shvheader MyDocumentsSFHeader[] = {
00051     {IDS_SHV_COLUMN1, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15},
00052     {IDS_SHV_COLUMN2, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10},
00053     {IDS_SHV_COLUMN3, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10},
00054     {IDS_SHV_COLUMN4, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 12},
00055     {IDS_SHV_COLUMN5, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 5}
00056 };
00057 
00058 #define MYDOCUMENTSSHELLVIEWCOLUMNS 5
00059 
00060 CFileSysEnumX::CFileSysEnumX()
00061 {
00062 }
00063 
00064 CFileSysEnumX::~CFileSysEnumX()
00065 {
00066 }
00067 
00068 HRESULT WINAPI CFileSysEnumX::Initialize(DWORD dwFlags)
00069 {
00070     WCHAR                                szPath[MAX_PATH];
00071 
00072     if (SHGetSpecialFolderPathW(0, szPath, CSIDL_PERSONAL, FALSE) == FALSE)
00073         return E_FAIL;
00074     return CreateFolderEnumList(szPath, dwFlags);
00075 }
00076 
00077 CMyDocsFolder::CMyDocsFolder()
00078 {
00079     pidlRoot = NULL;
00080     sPathTarget = NULL;
00081 }
00082 
00083 CMyDocsFolder::~CMyDocsFolder()
00084 {
00085     TRACE ("-- destroying IShellFolder(%p)\n", this);
00086     SHFree(pidlRoot);
00087     HeapFree(GetProcessHeap(), 0, sPathTarget);
00088 }
00089 
00090 HRESULT WINAPI CMyDocsFolder::FinalConstruct()
00091 {
00092     WCHAR                                szMyPath[MAX_PATH];
00093 
00094     if (!SHGetSpecialFolderPathW(0, szMyPath, CSIDL_PERSONAL, TRUE))
00095         return E_UNEXPECTED;
00096 
00097     pidlRoot = _ILCreateMyDocuments();    /* my qualified pidl */
00098     sPathTarget = (LPWSTR)SHAlloc((wcslen(szMyPath) + 1) * sizeof(WCHAR));
00099     wcscpy(sPathTarget, szMyPath);
00100 
00101     return S_OK;
00102 }
00103 
00104 HRESULT WINAPI CMyDocsFolder::ParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName,
00105         DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes)
00106 {
00107     WCHAR szElement[MAX_PATH];
00108     LPCWSTR szNext = NULL;
00109     LPITEMIDLIST pidlTemp = NULL;
00110     HRESULT hr = S_OK;
00111     CLSID clsid;
00112 
00113     TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n",
00114            this, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName),
00115            pchEaten, ppidl, pdwAttributes);
00116 
00117     if (!lpszDisplayName || !ppidl)
00118         return E_INVALIDARG;
00119 
00120     *ppidl = 0;
00121 
00122     if (pchEaten)
00123         *pchEaten = 0;        /* strange but like the original */
00124 
00125     if (lpszDisplayName[0] == ':' && lpszDisplayName[1] == ':')
00126     {
00127         szNext = GetNextElementW (lpszDisplayName, szElement, MAX_PATH);
00128         TRACE("-- element: %s\n", debugstr_w (szElement));
00129         CLSIDFromString(szElement + 2, &clsid);
00130         pidlTemp = _ILCreateGuid (PT_GUID, clsid);
00131     }
00132     else if( (pidlTemp = SHELL32_CreatePidlFromBindCtx(pbc, lpszDisplayName)) )
00133     {
00134         *ppidl = pidlTemp;
00135         return S_OK;
00136     }
00137     else
00138     {
00139         /* it's a filesystem path on the desktop. Let a FSFolder parse it */
00140 
00141         if (*lpszDisplayName)
00142         {
00143             WCHAR szPath[MAX_PATH];
00144             LPWSTR pathPtr;
00145 
00146             /* build a complete path to create a simple pidl */
00147             lstrcpynW(szPath, sPathTarget, MAX_PATH);
00148             pathPtr = PathAddBackslashW(szPath);
00149             if (pathPtr)
00150             {
00151                 lstrcpynW(pathPtr, lpszDisplayName, MAX_PATH - (pathPtr - szPath));
00152                 hr = _ILCreateFromPathW(szPath, &pidlTemp);
00153             }
00154             else
00155             {
00156                 /* should never reach here, but for completeness */
00157                 hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
00158             }
00159         }
00160         else
00161             pidlTemp = _ILCreateMyDocuments();
00162 
00163         szNext = NULL;
00164     }
00165 
00166     if (SUCCEEDED(hr) && pidlTemp)
00167     {
00168         if (szNext && *szNext)
00169         {
00170             hr = SHELL32_ParseNextElement(this, hwndOwner, pbc,
00171                                           &pidlTemp, (LPOLESTR) szNext, pchEaten, pdwAttributes);
00172         }
00173         else
00174         {
00175             if (pdwAttributes && *pdwAttributes)
00176                 hr = SHELL32_GetItemAttributes(this, pidlTemp, pdwAttributes);
00177         }
00178     }
00179 
00180     *ppidl = pidlTemp;
00181 
00182     TRACE ("(%p)->(-- ret=0x%08x)\n", this, hr);
00183 
00184     return hr;
00185 }
00186 
00187 /**************************************************************************
00188  *        ISF_MyDocuments_fnEnumObjects
00189  */
00190 HRESULT WINAPI CMyDocsFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
00191 {
00192     CComObject<CFileSysEnumX>                *theEnumerator;
00193     CComPtr<IEnumIDList>                    result;
00194     HRESULT                                    hResult;
00195 
00196     TRACE("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, dwFlags, ppEnumIDList);
00197 
00198     if (ppEnumIDList == NULL)
00199         return E_POINTER;
00200     *ppEnumIDList = NULL;
00201     ATLTRY (theEnumerator = new CComObject<CFileSysEnumX>);
00202     if (theEnumerator == NULL)
00203         return E_OUTOFMEMORY;
00204     hResult = theEnumerator->QueryInterface(IID_IEnumIDList, (void **)&result);
00205     if (FAILED (hResult))
00206     {
00207         delete theEnumerator;
00208         return hResult;
00209     }
00210     hResult = theEnumerator->Initialize(dwFlags);
00211     if (FAILED (hResult))
00212         return hResult;
00213     *ppEnumIDList = result.Detach();
00214 
00215     TRACE("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList);
00216 
00217     return S_OK;
00218 }
00219 
00220 /**************************************************************************
00221  *        CMyDocsFolder::BindToObject
00222  */
00223 HRESULT WINAPI CMyDocsFolder::BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut)
00224 {
00225     TRACE("(%p)->(pidl=%p,%p,%s,%p)\n",
00226            this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut);
00227 
00228     return SHELL32_BindToChild( pidlRoot, sPathTarget, pidl, riid, ppvOut );
00229 }
00230 
00231 /**************************************************************************
00232  *    CMyDocsFolder::BindToStorage
00233  */
00234 HRESULT WINAPI CMyDocsFolder::BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut)
00235 {
00236     FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n",
00237            this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut);
00238 
00239     *ppvOut = NULL;
00240     return E_NOTIMPL;
00241 }
00242 
00243 /**************************************************************************
00244  *     CMyDocsFolder::CompareIDs
00245  */
00246 HRESULT WINAPI CMyDocsFolder::CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
00247 {
00248     int nReturn;
00249 
00250     TRACE ("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", this, lParam, pidl1, pidl2);
00251     nReturn = SHELL32_CompareIDs (this, lParam, pidl1, pidl2);
00252     TRACE ("-- %i\n", nReturn);
00253     return nReturn;
00254 }
00255 
00256 /**************************************************************************
00257  *    CMyDocsFolder::CreateViewObject
00258  */
00259 HRESULT WINAPI CMyDocsFolder::CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
00260 {
00261     LPSHELLVIEW pShellView;
00262     HRESULT hr = E_INVALIDARG;
00263 
00264     TRACE ("(%p)->(hwnd=%p,%s,%p)\n",
00265            this, hwndOwner, shdebugstr_guid (&riid), ppvOut);
00266 
00267     if (!ppvOut)
00268         return hr;
00269 
00270     *ppvOut = NULL;
00271 
00272     if (IsEqualIID (riid, IID_IDropTarget))
00273     {
00274         WARN ("IDropTarget not implemented\n");
00275         hr = E_NOTIMPL;
00276     }
00277     else if (IsEqualIID (riid, IID_IContextMenu))
00278     {
00279         WARN ("IContextMenu not implemented\n");
00280         hr = E_NOTIMPL;
00281     }
00282     else if (IsEqualIID (riid, IID_IShellView))
00283     {
00284         hr = IShellView_Constructor ((IShellFolder *)this, &pShellView);
00285         if (pShellView)
00286         {
00287             hr = pShellView->QueryInterface(riid, ppvOut);
00288             pShellView->Release();
00289         }
00290     }
00291     TRACE ("-- (%p)->(interface=%p)\n", this, ppvOut);
00292     return hr;
00293 }
00294 
00295 /**************************************************************************
00296  *  CMyDocsFolder::GetAttributesOf
00297  */
00298 HRESULT WINAPI CMyDocsFolder::GetAttributesOf(UINT cidl, LPCITEMIDLIST *apidl, DWORD *rgfInOut)
00299 {
00300     HRESULT hr = S_OK;
00301     static const DWORD dwMyDocumentsAttributes =
00302         SFGAO_STORAGE | SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | SFGAO_CANCOPY |
00303         SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_HASSUBFOLDER | SFGAO_CANRENAME | SFGAO_CANDELETE;
00304 
00305     TRACE ("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n",
00306            this, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0);
00307 
00308     if (!rgfInOut)
00309         return E_INVALIDARG;
00310     if (cidl && !apidl)
00311         return E_INVALIDARG;
00312 
00313     if (*rgfInOut == 0)
00314         *rgfInOut = ~0;
00315 
00316     if(cidl == 0) {
00317         *rgfInOut &= dwMyDocumentsAttributes;
00318     } else {
00319         while (cidl > 0 && *apidl) {
00320             pdump (*apidl);
00321             if (_ILIsMyDocuments(*apidl)) {
00322                 *rgfInOut &= dwMyDocumentsAttributes;
00323             } else {
00324                 SHELL32_GetItemAttributes (this, *apidl, rgfInOut);
00325             }
00326             apidl++;
00327             cidl--;
00328         }
00329     }
00330     /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
00331     *rgfInOut &= ~SFGAO_VALIDATE;
00332 
00333     TRACE ("-- result=0x%08x\n", *rgfInOut);
00334 
00335     return hr;
00336 }
00337 
00338 /**************************************************************************
00339  *    CMyDocsFolder::GetUIObjectOf
00340  *
00341  * PARAMETERS
00342  *  HWND           hwndOwner, //[in ] Parent window for any output
00343  *  UINT           cidl,      //[in ] array size
00344  *  LPCITEMIDLIST* apidl,     //[in ] simple pidl array
00345  *  REFIID         riid,      //[in ] Requested Interface
00346  *  UINT*          prgfInOut, //[   ] reserved
00347  *  LPVOID*        ppvObject) //[out] Resulting Interface
00348  *
00349  */
00350 HRESULT WINAPI CMyDocsFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl,
00351         REFIID riid, UINT * prgfInOut, LPVOID * ppvOut)
00352 {
00353     LPITEMIDLIST pidl;
00354     IUnknown *pObj = NULL;
00355     HRESULT hr = E_INVALIDARG;
00356 
00357     TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
00358            this, hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
00359 
00360     if (!ppvOut)
00361         return hr;
00362 
00363     *ppvOut = NULL;
00364 
00365     if (IsEqualIID (riid, IID_IContextMenu))
00366     {
00367         hr = CDefFolderMenu_Create2(pidlRoot, hwndOwner, cidl, apidl, (IShellFolder *)this, NULL, 0, NULL, (IContextMenu**)&pObj);
00368     }
00369     else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
00370     {
00371         hr = IDataObject_Constructor( hwndOwner,
00372                                       pidlRoot, apidl, cidl, (IDataObject **)&pObj);
00373     }
00374     else if (IsEqualIID (riid, IID_IExtractIconA) && (cidl == 1))
00375     {
00376         pidl = ILCombine (pidlRoot, apidl[0]);
00377         pObj = (LPUNKNOWN) IExtractIconA_Constructor (pidl);
00378         SHFree (pidl);
00379         hr = S_OK;
00380     }
00381     else if (IsEqualIID (riid, IID_IExtractIconW) && (cidl == 1))
00382     {
00383         pidl = ILCombine (pidlRoot, apidl[0]);
00384         pObj = (LPUNKNOWN) IExtractIconW_Constructor (pidl);
00385         SHFree (pidl);
00386         hr = S_OK;
00387     }
00388     else if (IsEqualIID (riid, IID_IDropTarget) && (cidl >= 1))
00389     {
00390         hr = this->QueryInterface (IID_IDropTarget, (LPVOID *)&pObj);
00391     }
00392     else if ((IsEqualIID(riid, IID_IShellLinkW) ||
00393               IsEqualIID(riid, IID_IShellLinkA)) && (cidl == 1))
00394     {
00395         pidl = ILCombine (pidlRoot, apidl[0]);
00396         hr = IShellLink_ConstructFromFile(NULL, riid, pidl, (LPVOID*)&pObj);
00397         SHFree (pidl);
00398     }
00399     else
00400         hr = E_NOINTERFACE;
00401 
00402     if (SUCCEEDED(hr) && !pObj)
00403         hr = E_OUTOFMEMORY;
00404 
00405     *ppvOut = pObj;
00406     TRACE ("(%p)->hr=0x%08x\n", this, hr);
00407     return hr;
00408 }
00409 
00410 HRESULT WINAPI CMyDocsFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
00411 {
00412     HRESULT hr = S_OK;
00413     LPWSTR pszPath;
00414 
00415     TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
00416     pdump (pidl);
00417 
00418     if (!strRet)
00419         return E_INVALIDARG;
00420 
00421     pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
00422     if (!pszPath)
00423         return E_OUTOFMEMORY;
00424 
00425     ZeroMemory(pszPath, (MAX_PATH + 1) * sizeof(WCHAR));
00426 
00427     if (_ILIsMyDocuments (pidl))
00428     {
00429         if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
00430                 (GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING))
00431             wcscpy(pszPath, sPathTarget);
00432         else
00433             HCR_GetClassNameW(CLSID_MyDocuments, pszPath, MAX_PATH);
00434         TRACE("CP\n");
00435     }
00436     else if (_ILIsPidlSimple (pidl))
00437     {
00438         GUID const *clsid;
00439 
00440         if ((clsid = _ILGetGUIDPointer (pidl)))
00441         {
00442             if (GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING)
00443             {
00444                 int bWantsForParsing;
00445 
00446                 /*
00447                  * We can only get a filesystem path from a shellfolder if the
00448                  *  value WantsFORPARSING in CLSID\\{...}\\shellfolder exists.
00449                  *
00450                  * Exception: The MyComputer folder doesn't have this key,
00451                  *   but any other filesystem backed folder it needs it.
00452                  */
00453                 if (IsEqualIID (*clsid, CLSID_MyDocuments))
00454                 {
00455                     bWantsForParsing = TRUE;
00456                 }
00457                 else
00458                 {
00459                     /* get the "WantsFORPARSING" flag from the registry */
00460                     static const WCHAR clsidW[] = L"CLSID\\";
00461                     static const WCHAR shellfolderW[] = L"shellfolder";
00462                     static const WCHAR wantsForParsingW[] = L"WantsForParsing";
00463                     WCHAR szRegPath[100];
00464                     LONG r;
00465 
00466                     wcscpy (szRegPath, clsidW);
00467                     SHELL32_GUIDToStringW (*clsid, &szRegPath[6]);
00468                     wcscat (szRegPath, shellfolderW);
00469                     r = SHGetValueW(HKEY_CLASSES_ROOT, szRegPath,
00470                                     wantsForParsingW, NULL, NULL, NULL);
00471                     if (r == ERROR_SUCCESS)
00472                         bWantsForParsing = TRUE;
00473                     else
00474                         bWantsForParsing = FALSE;
00475                 }
00476 
00477                 if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
00478                         bWantsForParsing)
00479                 {
00480                     /*
00481                      * we need the filesystem path to the destination folder.
00482                      * Only the folder itself can know it
00483                      */
00484                     hr = SHELL32_GetDisplayNameOfChild (this, pidl, dwFlags,
00485                                                         pszPath,
00486                                                         MAX_PATH);
00487                     TRACE("CP\n");
00488                 }
00489                 else
00490                 {
00491                     /* parsing name like ::{...} */
00492                     pszPath[0] = ':';
00493                     pszPath[1] = ':';
00494                     SHELL32_GUIDToStringW (*clsid, &pszPath[2]);
00495                     TRACE("CP\n");
00496                 }
00497             }
00498             else
00499             {
00500                 /* user friendly name */
00501                 HCR_GetClassNameW (*clsid, pszPath, MAX_PATH);
00502                 TRACE("CP\n");
00503             }
00504         }
00505         else
00506         {
00507             int cLen = 0;
00508 
00509             /* file system folder or file rooted at the desktop */
00510             if ((GET_SHGDN_FOR(dwFlags) == SHGDN_FORPARSING) &&
00511                     (GET_SHGDN_RELATION(dwFlags) != SHGDN_INFOLDER))
00512             {
00513                 lstrcpynW(pszPath, sPathTarget, MAX_PATH - 1);
00514                 TRACE("CP %s\n", debugstr_w(pszPath));
00515             }
00516 
00517             if (!_ILIsDesktop(pidl))
00518             {
00519                 PathAddBackslashW(pszPath);
00520                 cLen = wcslen(pszPath);
00521                 _ILSimpleGetTextW(pidl, pszPath + cLen, MAX_PATH - cLen);
00522                 if (!_ILIsFolder(pidl))
00523                 {
00524                     SHELL_FS_ProcessDisplayFilename(pszPath, dwFlags);
00525                     TRACE("CP\n");
00526                 }
00527             }
00528         }
00529     }
00530     else
00531     {
00532         /* a complex pidl, let the subfolder do the work */
00533         hr = SHELL32_GetDisplayNameOfChild (this, pidl, dwFlags,
00534                                             pszPath, MAX_PATH);
00535         TRACE("CP\n");
00536     }
00537 
00538     if (SUCCEEDED(hr))
00539     {
00540         strRet->uType = STRRET_WSTR;
00541         strRet->pOleStr = pszPath;
00542     }
00543     else
00544         CoTaskMemFree(pszPath);
00545 
00546     TRACE ("-- (%p)->(%s,0x%08x)\n", this, debugstr_w(strRet->pOleStr), hr);
00547     return hr;
00548 }
00549 
00550 HRESULT WINAPI CMyDocsFolder::SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl,    /* simple pidl */
00551                                         LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut)
00552 {
00553     FIXME ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", this, hwndOwner, pidl,
00554            debugstr_w (lpName), dwFlags, pPidlOut);
00555 
00556     return E_FAIL;
00557 }
00558 
00559 HRESULT WINAPI CMyDocsFolder::GetDefaultSearchGUID(GUID *pguid)
00560 {
00561     FIXME ("(%p)\n", this);
00562     return E_NOTIMPL;
00563 }
00564 
00565 HRESULT WINAPI CMyDocsFolder::EnumSearches(IEnumExtraSearch **ppenum)
00566 {
00567     FIXME ("(%p)\n", this);
00568     return E_NOTIMPL;
00569 }
00570 
00571 HRESULT WINAPI CMyDocsFolder::GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay)
00572 {
00573     TRACE ("(%p)\n", this);
00574 
00575     if (pSort)
00576         *pSort = 0;
00577     if (pDisplay)
00578         *pDisplay = 0;
00579 
00580     return S_OK;
00581 }
00582 
00583 HRESULT WINAPI CMyDocsFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags)
00584 {
00585     TRACE ("(%p)\n", this);
00586 
00587     if (!pcsFlags || iColumn >= MYDOCUMENTSSHELLVIEWCOLUMNS)
00588         return E_INVALIDARG;
00589 
00590     *pcsFlags = MyDocumentsSFHeader[iColumn].pcsFlags;
00591 
00592     return S_OK;
00593 }
00594 
00595 HRESULT WINAPI CMyDocsFolder::GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv)
00596 {
00597     FIXME ("(%p)\n", this);
00598 
00599     return E_NOTIMPL;
00600 }
00601 
00602 HRESULT WINAPI CMyDocsFolder::GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd)
00603 {
00604     HRESULT hr = S_OK;
00605 
00606     TRACE ("(%p)->(%p %i %p)\n", this, pidl, iColumn, psd);
00607 
00608     if (!psd || iColumn >= MYDOCUMENTSSHELLVIEWCOLUMNS)
00609         return E_INVALIDARG;
00610 
00611     if (!pidl)
00612     {
00613         psd->fmt = MyDocumentsSFHeader[iColumn].fmt;
00614         psd->cxChar = MyDocumentsSFHeader[iColumn].cxChar;
00615         psd->str.uType = STRRET_CSTR;
00616         LoadStringA (shell32_hInstance, MyDocumentsSFHeader[iColumn].colnameid,
00617                      psd->str.cStr, MAX_PATH);
00618         return S_OK;
00619     }
00620 
00621     /* the data from the pidl */
00622     psd->str.uType = STRRET_CSTR;
00623     switch (iColumn)
00624     {
00625         case 0:        /* name */
00626             hr = GetDisplayNameOf(pidl,
00627                                   SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
00628             break;
00629         case 1:        /* size */
00630             _ILGetFileSize (pidl, psd->str.cStr, MAX_PATH);
00631             break;
00632         case 2:        /* type */
00633             _ILGetFileType (pidl, psd->str.cStr, MAX_PATH);
00634             break;
00635         case 3:        /* date */
00636             _ILGetFileDate (pidl, psd->str.cStr, MAX_PATH);
00637             break;
00638         case 4:        /* attributes */
00639             _ILGetFileAttributes (pidl, psd->str.cStr, MAX_PATH);
00640             break;
00641     }
00642 
00643     return hr;
00644 }
00645 
00646 HRESULT WINAPI CMyDocsFolder::MapColumnToSCID (UINT column, SHCOLUMNID *pscid)
00647 {
00648     FIXME ("(%p)\n", this);
00649     return E_NOTIMPL;
00650 }
00651 
00652 HRESULT WINAPI CMyDocsFolder::GetClassID(CLSID *lpClassId)
00653 {
00654     static GUID const CLSID_MyDocuments =
00655     { 0x450d8fba, 0xad25, 0x11d0, {0x98, 0xa8, 0x08, 0x00, 0x36, 0x1b, 0x11, 0x03} };
00656 
00657     TRACE ("(%p)\n", this);
00658 
00659     if (!lpClassId)
00660         return E_POINTER;
00661 
00662     memcpy(lpClassId, &CLSID_MyDocuments, sizeof(GUID));
00663 
00664     return S_OK;
00665 }
00666 
00667 HRESULT WINAPI CMyDocsFolder::Initialize(LPCITEMIDLIST pidl)
00668 {
00669     TRACE ("(%p)->(%p)\n", this, pidl);
00670 
00671     return E_NOTIMPL;
00672 }
00673 
00674 HRESULT WINAPI CMyDocsFolder::GetCurFolder(LPITEMIDLIST *pidl)
00675 {
00676     TRACE ("(%p)->(%p)\n", this, pidl);
00677 
00678     if (!pidl) return E_POINTER;
00679     *pidl = ILClone (pidlRoot);
00680     return S_OK;
00681 }

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.