Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenmydocuments.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
1.7.6.1
|