Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenshfldr_netconnect.cpp
Go to the documentation of this file.
00001 /* 00002 * Network Connections Shell Folder 00003 * 00004 * Copyright 2008 Johannes Anderwald <janderwald@reactos.org> 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Lesser General Public 00008 * License as published by the Free Software Foundation; either 00009 * version 2.1 of the License, or (at your option) any later version. 00010 * 00011 * This library is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 * Lesser General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Lesser General Public 00017 * License along with this library; if not, write to the Free Software 00018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00019 */ 00020 00021 #include <precomp.h> 00022 00023 WINE_DEFAULT_DEBUG_CHANNEL (shell); 00024 00025 #define MAX_PROPERTY_SHEET_PAGE (10) 00026 00027 /*********************************************************************** 00028 * IShellFolder implementation 00029 */ 00030 00031 class CNetworkConnections: 00032 public IShellFolder2, 00033 public IPersistFolder2, 00034 public IShellExecuteHookW 00035 { 00036 public: 00037 CNetworkConnections(); 00038 00039 /* IUnknown */ 00040 virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut); 00041 virtual ULONG WINAPI AddRef(); 00042 virtual ULONG WINAPI Release(); 00043 00044 // IShellFolder 00045 virtual HRESULT WINAPI ParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, LPITEMIDLIST *ppidl, DWORD *pdwAttributes); 00046 virtual HRESULT WINAPI EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList); 00047 virtual HRESULT WINAPI BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); 00048 virtual HRESULT WINAPI BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); 00049 virtual HRESULT WINAPI CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); 00050 virtual HRESULT WINAPI CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut); 00051 virtual HRESULT WINAPI GetAttributesOf (UINT cidl, LPCITEMIDLIST *apidl, DWORD *rgfInOut); 00052 virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); 00053 virtual HRESULT WINAPI GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet); 00054 virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST *pPidlOut); 00055 00056 /* ShellFolder2 */ 00057 virtual HRESULT WINAPI GetDefaultSearchGUID(GUID *pguid); 00058 virtual HRESULT WINAPI EnumSearches(IEnumExtraSearch **ppenum); 00059 virtual HRESULT WINAPI GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay); 00060 virtual HRESULT WINAPI GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags); 00061 virtual HRESULT WINAPI GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv); 00062 virtual HRESULT WINAPI GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd); 00063 virtual HRESULT WINAPI MapColumnToSCID(UINT column, SHCOLUMNID *pscid); 00064 00065 // IPersistFolder2 00066 virtual HRESULT WINAPI GetClassID(CLSID *lpClassId); 00067 virtual HRESULT WINAPI Initialize(LPCITEMIDLIST pidl); 00068 virtual HRESULT WINAPI GetCurFolder(LPITEMIDLIST *pidl); 00069 00070 // IShellExecuteHookW 00071 virtual HRESULT WINAPI Execute(LPSHELLEXECUTEINFOW pei); 00072 00073 private: 00074 LONG ref; 00075 /* both paths are parsible from the desktop */ 00076 LPITEMIDLIST pidlRoot; /* absolute pidl */ 00077 LPITEMIDLIST pidl; /* enumerated pidl */ 00078 IOleCommandTarget * lpOleCmd; 00079 }; 00080 00081 class CNetConUiObject: 00082 public IContextMenu3, 00083 public IObjectWithSite, 00084 public IQueryInfo, 00085 public IExtractIconW 00086 { 00087 public: 00088 CNetConUiObject(LPCITEMIDLIST apidl, IOleCommandTarget *lpOleCmd); 00089 00090 // IUnknown 00091 virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut); 00092 virtual ULONG WINAPI AddRef(); 00093 virtual ULONG WINAPI Release(); 00094 00095 // IContextMenu3 00096 virtual HRESULT WINAPI QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags); 00097 virtual HRESULT WINAPI InvokeCommand(LPCMINVOKECOMMANDINFO lpici); 00098 virtual HRESULT WINAPI GetCommandString(UINT_PTR idCmd, UINT uType, UINT *pwReserved, LPSTR pszName, UINT cchMax); 00099 virtual HRESULT WINAPI HandleMenuMsg( UINT uMsg, WPARAM wParam, LPARAM lParam); 00100 virtual HRESULT WINAPI HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult); 00101 00102 // IObjectWithSite 00103 virtual HRESULT WINAPI SetSite(IUnknown *punk); 00104 virtual HRESULT WINAPI GetSite(REFIID iid, void **ppvSite); 00105 00106 // IQueryInfo 00107 virtual HRESULT WINAPI GetInfoFlags(DWORD *pdwFlags); 00108 virtual HRESULT WINAPI GetInfoTip(DWORD dwFlags, WCHAR **ppwszTip); 00109 00110 // IExtractIconW 00111 virtual HRESULT STDMETHODCALLTYPE GetIconLocation(UINT uFlags, LPWSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags); 00112 virtual HRESULT STDMETHODCALLTYPE Extract(LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); 00113 00114 private: 00115 LONG ref; 00116 LPCITEMIDLIST apidl; 00117 IUnknown *pUnknown; 00118 IOleCommandTarget * lpOleCmd; 00119 }; 00120 00121 static const shvheader NetConnectSFHeader[] = { 00122 {IDS_SHV_COLUMN_NAME, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 20}, 00123 {IDS_SHV_COLUMN_TYPE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 8}, 00124 {IDS_SHV_COLUMN_STATE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, 00125 {IDS_SHV_COLUMN_DEVNAME, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 12}, 00126 {IDS_SHV_COLUMN_PHONE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, 00127 {IDS_SHV_COLUMN_OWNER, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 5} 00128 }; 00129 00130 #define NETCONNECTSHELLVIEWCOLUMNS 6 00131 00132 #define COLUMN_NAME 0 00133 #define COLUMN_TYPE 1 00134 #define COLUMN_STATUS 2 00135 #define COLUMN_DEVNAME 3 00136 #define COLUMN_PHONE 4 00137 #define COLUMN_OWNER 5 00138 00139 HRESULT ShowNetConnectionStatus(IOleCommandTarget * lpOleCmd, INetConnection * pNetConnect, HWND hwnd); 00140 00141 CNetworkConnections::CNetworkConnections() 00142 { 00143 ref = 0; 00144 HRESULT hr = CoCreateInstance(CLSID_LanConnectStatusUI, NULL, CLSCTX_INPROC_SERVER, IID_IOleCommandTarget, (LPVOID*)&lpOleCmd); 00145 if (FAILED(hr)) 00146 { 00147 ERR("CoCreateInstance failed\n"); 00148 lpOleCmd = NULL; 00149 } 00150 else 00151 { 00152 hr = lpOleCmd->Exec(&CGID_ShellServiceObject, 2, OLECMDEXECOPT_DODEFAULT, NULL, NULL); 00153 if (FAILED(hr)) 00154 ERR("Exec CGID_ShellServiceObject failed\n"); 00155 } 00156 00157 pidlRoot = _ILCreateNetConnect(); /* my qualified pidl */ 00158 } 00159 00160 /************************************************************************** 00161 * ISF_NetConnect_fnQueryInterface 00162 * 00163 * NOTE 00164 * supports not IPersist/IPersistFolder 00165 */ 00166 HRESULT WINAPI CNetworkConnections::QueryInterface(REFIID riid, LPVOID *ppvObj) 00167 { 00168 *ppvObj = NULL; 00169 00170 if (IsEqualIID(riid, IID_IUnknown) || 00171 IsEqualIID(riid, IID_IShellFolder) || 00172 IsEqualIID(riid, IID_IShellFolder2)) 00173 { 00174 *ppvObj = (IShellFolder2*)this; 00175 } 00176 else if (IsEqualIID (riid, IID_IPersistFolder) || 00177 IsEqualIID (riid, IID_IPersistFolder2)) 00178 { 00179 *ppvObj = (IPersistFolder2*)this; 00180 } 00181 else if (IsEqualIID(riid, IID_IShellExecuteHookW)) 00182 { 00183 *ppvObj = (IShellExecuteHookW*)this; 00184 } 00185 #if 0 00186 else if (IsEqualIID(riid, IID_IPersistIDList)) 00187 { 00188 //*ppvObj = (IPersistIDList*)this; 00189 } 00190 #endif 00191 if (*ppvObj) 00192 { 00193 AddRef(); 00194 return S_OK; 00195 } 00196 00197 /* TODO: 00198 * IID_IPersistFreeThreadedObject 00199 * IID_IBrowserFrameOptions 00200 * IID_IShellIconOverlay 00201 * IID_IPersistIDList 00202 * IID_IPersist 00203 */ 00204 00205 return E_NOINTERFACE; 00206 } 00207 00208 ULONG WINAPI CNetworkConnections::AddRef() 00209 { 00210 ULONG refCount = InterlockedIncrement(&ref); 00211 00212 return refCount; 00213 } 00214 00215 ULONG WINAPI CNetworkConnections::Release() 00216 { 00217 ULONG refCount = InterlockedDecrement(&ref); 00218 00219 if (!refCount) 00220 { 00221 SHFree(pidlRoot); 00222 delete this; 00223 } 00224 return refCount; 00225 } 00226 00227 /************************************************************************** 00228 * ISF_NetConnect_fnParseDisplayName 00229 */ 00230 HRESULT WINAPI CNetworkConnections::ParseDisplayName ( 00231 HWND hwndOwner, LPBC pbcReserved, LPOLESTR lpszDisplayName, 00232 DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes) 00233 { 00234 HRESULT hr = E_UNEXPECTED; 00235 00236 *ppidl = 0; 00237 if (pchEaten) 00238 *pchEaten = 0; /* strange but like the original */ 00239 00240 return hr; 00241 } 00242 00243 /************************************************************************** 00244 * CreateNetConnectEnumListss() 00245 */ 00246 static BOOL CreateNetConnectEnumList(CEnumIDList *list, DWORD dwFlags) 00247 { 00248 HRESULT hr; 00249 INetConnectionManager *pNetConMan; 00250 IEnumNetConnection *pEnumCon; 00251 INetConnection *INetCon; 00252 ULONG Count; 00253 LPITEMIDLIST pidl; 00254 00255 /* get an instance to of IConnectionManager */ 00256 hr = INetConnectionManager_Constructor(NULL, IID_INetConnectionManager, (LPVOID*)&pNetConMan); 00257 if (FAILED(hr)) 00258 return FALSE; 00259 00260 hr = pNetConMan->EnumConnections(NCME_DEFAULT, &pEnumCon); 00261 if (FAILED(hr)) 00262 { 00263 pNetConMan->Release(); 00264 return FALSE; 00265 } 00266 00267 do 00268 { 00269 hr = pEnumCon->Next(1, &INetCon, &Count); 00270 if (hr == S_OK) 00271 { 00272 pidl = ILCreateNetConnectItem(INetCon); 00273 if (pidl) 00274 { 00275 list->AddToEnumList(pidl); 00276 } 00277 } 00278 else 00279 { 00280 break; 00281 } 00282 }while(TRUE); 00283 00284 pEnumCon->Release(); 00285 pNetConMan->Release(); 00286 00287 return TRUE; 00288 } 00289 00290 /************************************************************************** 00291 * ISF_NetConnect_fnEnumObjects 00292 */ 00293 HRESULT WINAPI CNetworkConnections::EnumObjects( 00294 HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) 00295 { 00296 CEnumIDList *pList = new CEnumIDList; 00297 *ppEnumIDList = (LPENUMIDLIST)pList; 00298 if (!pList) 00299 return E_OUTOFMEMORY; 00300 00301 pList->AddRef(); 00302 CreateNetConnectEnumList(pList, dwFlags); 00303 return S_OK; 00304 } 00305 00306 /************************************************************************** 00307 * ISF_NetConnect_fnBindToObject 00308 */ 00309 HRESULT WINAPI CNetworkConnections::BindToObject ( 00310 LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) 00311 { 00312 return E_NOTIMPL; 00313 } 00314 00315 /************************************************************************** 00316 * ISF_NetConnect_fnBindToStorage 00317 */ 00318 HRESULT WINAPI CNetworkConnections::BindToStorage( 00319 LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) 00320 { 00321 *ppvOut = NULL; 00322 return E_NOTIMPL; 00323 } 00324 00325 /************************************************************************** 00326 * ISF_NetConnect_fnCompareIDs 00327 */ 00328 00329 HRESULT WINAPI CNetworkConnections::CompareIDs( 00330 LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) 00331 { 00332 //IGenericSFImpl *This = (IGenericSFImpl *)iface; 00333 00334 00335 00336 return E_NOTIMPL; 00337 } 00338 00339 /************************************************************************** 00340 * ISF_NetConnect_fnCreateViewObject 00341 */ 00342 HRESULT WINAPI CNetworkConnections::CreateViewObject( 00343 HWND hwndOwner, REFIID riid, LPVOID * ppvOut) 00344 { 00345 CSFV cvf; 00346 HRESULT hr = E_NOINTERFACE; 00347 00348 if (!ppvOut) 00349 return hr; 00350 00351 *ppvOut = NULL; 00352 00353 if (IsEqualIID(riid, IID_IShellView)) 00354 { 00355 ZeroMemory(&cvf, sizeof(cvf)); 00356 cvf.cbSize = sizeof(cvf); 00357 cvf.pshf = (IShellFolder*)this; 00358 00359 IShellView* pShellView; 00360 hr = SHCreateShellFolderViewEx(&cvf, &pShellView); 00361 if (SUCCEEDED(hr)) 00362 { 00363 hr = pShellView->QueryInterface(riid, ppvOut); 00364 pShellView->Release(); 00365 } 00366 } 00367 00368 return hr; 00369 } 00370 00371 /************************************************************************** 00372 * ISF_NetConnect_fnGetAttributesOf 00373 */ 00374 HRESULT WINAPI CNetworkConnections::GetAttributesOf( 00375 UINT cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut) 00376 { 00377 //IGenericSFImpl *This = (IGenericSFImpl *)iface; 00378 HRESULT hr = S_OK; 00379 static const DWORD dwNetConnectAttributes = SFGAO_STORAGE | SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | 00380 SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_HASSUBFOLDER | SFGAO_CANRENAME | SFGAO_CANDELETE; 00381 00382 static const DWORD dwNetConnectItemAttributes = SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | 00383 SFGAO_FILESYSANCESTOR | SFGAO_CANRENAME; 00384 00385 if (!rgfInOut) 00386 return E_INVALIDARG; 00387 00388 if (cidl && !apidl) 00389 return E_INVALIDARG; 00390 00391 if (*rgfInOut == 0) 00392 *rgfInOut = ~0; 00393 00394 if(cidl == 0) 00395 *rgfInOut = dwNetConnectAttributes; 00396 else 00397 *rgfInOut = dwNetConnectItemAttributes; 00398 00399 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */ 00400 *rgfInOut &= ~SFGAO_VALIDATE; 00401 00402 return hr; 00403 } 00404 00405 /************************************************************************** 00406 * ISF_NetConnect_fnGetUIObjectOf 00407 * 00408 * PARAMETERS 00409 * hwndOwner [in] Parent window for any output 00410 * cidl [in] array size 00411 * apidl [in] simple pidl array 00412 * riid [in] Requested Interface 00413 * prgfInOut [ ] reserved 00414 * ppvObject [out] Resulting Interface 00415 * 00416 */ 00417 00418 HRESULT IContextMenuImpl_Constructor(REFIID riid, LPCITEMIDLIST apidl, LPVOID * ppvOut, IOleCommandTarget * lpOleCmd) 00419 { 00420 CNetConUiObject *pMenu = new CNetConUiObject(apidl, lpOleCmd); 00421 if (!pMenu) 00422 return E_OUTOFMEMORY; 00423 00424 pMenu->AddRef(); 00425 HRESULT hr = pMenu->QueryInterface(riid, ppvOut); 00426 pMenu->Release(); 00427 return hr; 00428 } 00429 00430 HRESULT WINAPI CNetworkConnections::GetUIObjectOf( 00431 HWND hwndOwner, UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, 00432 UINT * prgfInOut, LPVOID * ppvOut) 00433 { 00434 IUnknown *pObj = NULL; 00435 HRESULT hr = E_INVALIDARG; 00436 00437 if (!ppvOut) 00438 return hr; 00439 00440 *ppvOut = NULL; 00441 00442 if ((IsEqualIID (riid, IID_IContextMenu) || IsEqualIID (riid, IID_IContextMenu2) || IsEqualIID(riid, IID_IContextMenu3) || 00443 IsEqualIID(riid, IID_IQueryInfo) || IsEqualIID(riid, IID_IExtractIconW)) && cidl >= 1) 00444 { 00445 return IContextMenuImpl_Constructor(riid, apidl[0], ppvOut, lpOleCmd); 00446 } 00447 else 00448 hr = E_NOINTERFACE; 00449 00450 *ppvOut = pObj; 00451 return hr; 00452 } 00453 00454 /************************************************************************** 00455 * ISF_NetConnect_fnGetDisplayNameOf 00456 * 00457 */ 00458 HRESULT WINAPI CNetworkConnections::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) 00459 { 00460 LPWSTR pszName; 00461 HRESULT hr = E_FAIL; 00462 NETCON_PROPERTIES * pProperties; 00463 VALUEStruct * val; 00464 00465 if (!strRet) 00466 return E_INVALIDARG; 00467 00468 pszName = (WCHAR*)CoTaskMemAlloc(MAX_PATH * sizeof(WCHAR)); 00469 if (!pszName) 00470 return E_OUTOFMEMORY; 00471 00472 if (_ILIsNetConnect(pidl)) 00473 { 00474 if (LoadStringW(netshell_hInstance, IDS_NETWORKCONNECTION, pszName, MAX_PATH)) 00475 { 00476 pszName[MAX_PATH-1] = L'\0'; 00477 hr = S_OK; 00478 } 00479 } 00480 else 00481 { 00482 val = _ILGetValueStruct(pidl); 00483 if (val) 00484 { 00485 if (val->pItem->GetProperties(&pProperties) == S_OK) 00486 { 00487 if (pProperties->pszwName) 00488 { 00489 wcscpy(pszName, pProperties->pszwName); 00490 hr = S_OK; 00491 } 00492 NcFreeNetconProperties(pProperties); 00493 } 00494 } 00495 00496 } 00497 00498 if (SUCCEEDED(hr)) 00499 { 00500 strRet->uType = STRRET_WSTR; 00501 strRet->pOleStr = pszName; 00502 } 00503 else 00504 { 00505 CoTaskMemFree(pszName); 00506 } 00507 00508 return hr; 00509 } 00510 00511 /************************************************************************** 00512 * ISF_NetConnect_fnSetNameOf 00513 * Changes the name of a file object or subfolder, possibly changing its item 00514 * identifier in the process. 00515 * 00516 * PARAMETERS 00517 * hwndOwner [in] Owner window for output 00518 * pidl [in] simple pidl of item to change 00519 * lpszName [in] the items new display name 00520 * dwFlags [in] SHGNO formatting flags 00521 * ppidlOut [out] simple pidl returned 00522 */ 00523 HRESULT WINAPI CNetworkConnections::SetNameOf ( 00524 HWND hwndOwner, LPCITEMIDLIST pidl, /*simple pidl */ 00525 LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut) 00526 { 00527 return E_NOTIMPL; 00528 } 00529 00530 HRESULT WINAPI CNetworkConnections::GetDefaultSearchGUID(GUID * pguid) 00531 { 00532 return E_NOTIMPL; 00533 } 00534 00535 HRESULT WINAPI CNetworkConnections::EnumSearches(IEnumExtraSearch ** ppenum) 00536 { 00537 return E_NOTIMPL; 00538 } 00539 00540 HRESULT WINAPI CNetworkConnections::GetDefaultColumn(DWORD dwRes, ULONG * pSort, ULONG * pDisplay) 00541 { 00542 if (pSort) 00543 *pSort = 0; 00544 if (pDisplay) 00545 *pDisplay = 0; 00546 00547 return S_OK; 00548 } 00549 00550 HRESULT WINAPI CNetworkConnections::GetDefaultColumnState(UINT iColumn, DWORD * pcsFlags) 00551 { 00552 if (!pcsFlags || iColumn >= NETCONNECTSHELLVIEWCOLUMNS) 00553 return E_INVALIDARG; 00554 *pcsFlags = NetConnectSFHeader[iColumn].pcsFlags; 00555 return S_OK; 00556 } 00557 00558 HRESULT WINAPI CNetworkConnections::GetDetailsEx( 00559 LPCITEMIDLIST pidl, const SHCOLUMNID * pscid, VARIANT * pv) 00560 { 00561 return E_NOTIMPL; 00562 } 00563 00564 HRESULT WINAPI CNetworkConnections::GetDetailsOf( 00565 LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS * psd) 00566 { 00567 WCHAR buffer[MAX_PATH] = {0}; 00568 HRESULT hr = E_FAIL; 00569 VALUEStruct * val; 00570 NETCON_PROPERTIES * pProperties; 00571 00572 if (iColumn >= NETCONNECTSHELLVIEWCOLUMNS) 00573 return E_FAIL; 00574 00575 psd->fmt = NetConnectSFHeader[iColumn].fmt; 00576 psd->cxChar = NetConnectSFHeader[iColumn].cxChar; 00577 if (pidl == NULL) 00578 { 00579 psd->str.uType = STRRET_WSTR; 00580 if (LoadStringW(netshell_hInstance, NetConnectSFHeader[iColumn].colnameid, buffer, MAX_PATH)) 00581 hr = SHStrDupW(buffer, &psd->str.pOleStr); 00582 00583 return hr; 00584 } 00585 00586 if (iColumn == COLUMN_NAME) 00587 { 00588 psd->str.uType = STRRET_WSTR; 00589 return GetDisplayNameOf(pidl, SHGDN_NORMAL, &psd->str); 00590 } 00591 00592 val = _ILGetValueStruct(pidl); 00593 if (!val) 00594 return E_FAIL; 00595 00596 if (!val->pItem) 00597 return E_FAIL; 00598 00599 if (val->pItem->GetProperties(&pProperties) != S_OK) 00600 return E_FAIL; 00601 00602 00603 switch(iColumn) 00604 { 00605 case COLUMN_TYPE: 00606 if (pProperties->MediaType == NCM_LAN || pProperties->MediaType == NCM_SHAREDACCESSHOST_RAS) 00607 { 00608 if (LoadStringW(netshell_hInstance, IDS_TYPE_ETHERNET, buffer, MAX_PATH)) 00609 { 00610 psd->str.uType = STRRET_WSTR; 00611 hr = SHStrDupW(buffer, &psd->str.pOleStr); 00612 } 00613 } 00614 break; 00615 case COLUMN_STATUS: 00616 buffer[0] = L'\0'; 00617 if (pProperties->Status == NCS_HARDWARE_DISABLED) 00618 LoadStringW(netshell_hInstance, IDS_STATUS_NON_OPERATIONAL, buffer, MAX_PATH); 00619 else if (pProperties->Status == NCS_DISCONNECTED) 00620 LoadStringW(netshell_hInstance, IDS_STATUS_UNREACHABLE, buffer, MAX_PATH); 00621 else if (pProperties->Status == NCS_MEDIA_DISCONNECTED) 00622 LoadStringW(netshell_hInstance, IDS_STATUS_DISCONNECTED, buffer, MAX_PATH); 00623 else if (pProperties->Status == NCS_CONNECTING) 00624 LoadStringW(netshell_hInstance, IDS_STATUS_CONNECTING, buffer, MAX_PATH); 00625 else if (pProperties->Status == NCS_CONNECTED) 00626 LoadStringW(netshell_hInstance, IDS_STATUS_CONNECTED, buffer, MAX_PATH); 00627 00628 if (buffer[0]) 00629 { 00630 buffer[MAX_PATH-1] = L'\0'; 00631 psd->str.uType = STRRET_WSTR; 00632 hr = SHStrDupW(buffer, &psd->str.pOleStr); 00633 } 00634 break; 00635 case COLUMN_DEVNAME: 00636 if (pProperties->pszwDeviceName) 00637 { 00638 wcscpy(buffer, pProperties->pszwDeviceName); 00639 buffer[MAX_PATH-1] = L'\0'; 00640 psd->str.uType = STRRET_WSTR; 00641 hr = SHStrDupW(buffer, &psd->str.pOleStr); 00642 } 00643 else 00644 { 00645 psd->str.cStr[0] = '\0'; 00646 psd->str.uType = STRRET_CSTR; 00647 } 00648 break; 00649 case COLUMN_PHONE: 00650 case COLUMN_OWNER: 00651 psd->str.cStr[0] = '\0'; 00652 psd->str.uType = STRRET_CSTR; 00653 break; 00654 } 00655 00656 NcFreeNetconProperties(pProperties); 00657 return hr; 00658 } 00659 00660 HRESULT WINAPI CNetworkConnections::MapColumnToSCID(UINT column, SHCOLUMNID *pscid) 00661 { 00662 return E_NOTIMPL; 00663 } 00664 00665 //IObjectWithSite 00666 //IInternetSecurityManager 00667 00668 /************************************************************************** 00669 * IContextMenu2 Implementation 00670 */ 00671 00672 CNetConUiObject::CNetConUiObject(LPCITEMIDLIST apidl, IOleCommandTarget *lpOleCmd) 00673 { 00674 this->apidl = apidl; 00675 pUnknown = NULL; 00676 this->lpOleCmd = lpOleCmd; 00677 ref = 0; 00678 } 00679 00680 /************************************************************************ 00681 * ISF_NetConnect_IContextMenu_QueryInterface 00682 */ 00683 HRESULT WINAPI CNetConUiObject::QueryInterface(REFIID iid, LPVOID *ppvObject) 00684 { 00685 *ppvObject = NULL; 00686 00687 if (IsEqualIID(iid, IID_IContextMenu) || IsEqualIID(iid, IID_IContextMenu2) || IsEqualIID(iid, IID_IContextMenu3)) 00688 *ppvObject = (IContextMenu3*)this; 00689 else if (IsEqualIID(iid, IID_IObjectWithSite)) 00690 *ppvObject = (IObjectWithSite*)this; 00691 else if (IsEqualIID(iid, IID_IQueryInfo)) 00692 *ppvObject = (IQueryInfo*)this; 00693 else if(IsEqualIID(iid, IID_IExtractIconW)) 00694 *ppvObject = (IExtractIconW*)this; 00695 00696 if (*ppvObject) 00697 { 00698 InterlockedIncrement(&ref); 00699 return S_OK; 00700 } 00701 00702 //LPOLESTR pStr; 00703 //StringFromCLSID(iid, &pStr); 00704 //MessageBoxW(NULL, L"ISF_NetConnect_IContextMenu2_QueryInterface unhandled", pStr, MB_OK); 00705 return E_NOINTERFACE; 00706 } 00707 00708 /************************************************************************ 00709 * ISF_NetConnect_IContextMenu_AddRef 00710 */ 00711 ULONG WINAPI CNetConUiObject::AddRef() 00712 { 00713 ULONG refCount; 00714 00715 refCount = InterlockedIncrement(&ref); 00716 00717 return refCount; 00718 } 00719 00720 /************************************************************************ 00721 * ISF_NetConnect_IContextMenu_Release 00722 */ 00723 ULONG WINAPI CNetConUiObject::Release() 00724 { 00725 ULONG refCount; 00726 00727 refCount = InterlockedDecrement(&ref); 00728 if (!refCount) 00729 delete this; 00730 00731 return refCount; 00732 } 00733 00734 void WINAPI _InsertMenuItemW ( 00735 HMENU hmenu, 00736 UINT indexMenu, 00737 BOOL fByPosition, 00738 UINT wID, 00739 UINT fType, 00740 LPCWSTR dwTypeData, 00741 UINT fState) 00742 { 00743 MENUITEMINFOW mii; 00744 WCHAR szText[100]; 00745 00746 ZeroMemory(&mii, sizeof(mii)); 00747 mii.cbSize = sizeof(mii); 00748 if (fType == MFT_SEPARATOR) 00749 { 00750 mii.fMask = MIIM_ID | MIIM_TYPE; 00751 } 00752 else if (fType == MFT_STRING) 00753 { 00754 mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; 00755 if ((ULONG_PTR)HIWORD((ULONG_PTR)dwTypeData) == 0) 00756 { 00757 if (LoadStringW(netshell_hInstance, LOWORD((ULONG_PTR)dwTypeData), szText, sizeof(szText)/sizeof(WCHAR))) 00758 { 00759 szText[(sizeof(szText)/sizeof(WCHAR))-1] = 0; 00760 mii.dwTypeData = szText; 00761 } 00762 else 00763 { 00764 return; 00765 } 00766 } 00767 else 00768 { 00769 mii.dwTypeData = (LPWSTR) dwTypeData; 00770 } 00771 mii.fState = fState; 00772 } 00773 00774 mii.wID = wID; 00775 mii.fType = fType; 00776 InsertMenuItemW( hmenu, indexMenu, fByPosition, &mii); 00777 } 00778 00779 /************************************************************************** 00780 * ISF_NetConnect_IContextMenu_QueryContextMenu() 00781 */ 00782 HRESULT WINAPI CNetConUiObject::QueryContextMenu( 00783 HMENU hMenu, 00784 UINT indexMenu, 00785 UINT idCmdFirst, 00786 UINT idCmdLast, 00787 UINT uFlags) 00788 { 00789 VALUEStruct * val; 00790 NETCON_PROPERTIES * pProperties; 00791 00792 val = _ILGetValueStruct(apidl); 00793 if (!val) 00794 return E_FAIL; 00795 00796 if (val->pItem->GetProperties(&pProperties) != S_OK) 00797 return E_FAIL; 00798 00799 if (pProperties->Status == NCS_HARDWARE_DISABLED) 00800 _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_ACTIVATE, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_ACTIVATE), MFS_DEFAULT); 00801 else 00802 _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_DEACTIVATE, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_DEACTIVATE), MFS_ENABLED); 00803 00804 if (pProperties->Status == NCS_HARDWARE_DISABLED || pProperties->Status == NCS_MEDIA_DISCONNECTED || pProperties->Status == NCS_DISCONNECTED) 00805 _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_STATUS, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_STATUS), MFS_GRAYED); 00806 else if (pProperties->Status == NCS_CONNECTED) 00807 _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_STATUS, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_STATUS), MFS_DEFAULT); 00808 else 00809 _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_STATUS, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_STATUS), MFS_ENABLED); 00810 00811 if (pProperties->Status == NCS_HARDWARE_DISABLED || pProperties->Status == NCS_MEDIA_DISCONNECTED) 00812 _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_REPAIR, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_REPAIR), MFS_GRAYED); 00813 else 00814 _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_REPAIR, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_REPAIR), MFS_ENABLED); 00815 00816 _InsertMenuItemW(hMenu, indexMenu++, TRUE, -1, MFT_SEPARATOR, NULL, MFS_ENABLED); 00817 _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_CREATELINK, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_CREATELINK), MFS_ENABLED); 00818 00819 if (pProperties->dwCharacter & NCCF_ALLOW_REMOVAL) 00820 _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_DELETE, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_DELETE), MFS_ENABLED); 00821 else 00822 _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_DELETE, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_DELETE), MFS_GRAYED); 00823 00824 if (pProperties->dwCharacter & NCCF_ALLOW_RENAME) 00825 _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_RENAME, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_RENAME), MFS_ENABLED); 00826 else 00827 _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_RENAME, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_RENAME), MFS_GRAYED); 00828 00829 _InsertMenuItemW(hMenu, indexMenu++, TRUE, -1, MFT_SEPARATOR, NULL, MFS_ENABLED); 00830 _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_PROPERTIES, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_PROPERTIES), MFS_ENABLED); 00831 NcFreeNetconProperties(pProperties); 00832 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 9); 00833 } 00834 00835 BOOL 00836 CALLBACK 00837 PropSheetExCallback(HPROPSHEETPAGE hPage, LPARAM lParam) 00838 { 00839 PROPSHEETHEADERW *pinfo = (PROPSHEETHEADERW *)lParam; 00840 00841 if (pinfo->nPages < MAX_PROPERTY_SHEET_PAGE) 00842 { 00843 pinfo->phpage[pinfo->nPages++] = hPage; 00844 return TRUE; 00845 } 00846 return FALSE; 00847 } 00848 00849 HRESULT 00850 ShowNetConnectionStatus( 00851 IOleCommandTarget *lpOleCmd, 00852 INetConnection *pNetConnect, 00853 HWND hwnd) 00854 { 00855 NETCON_PROPERTIES *pProperties; 00856 HRESULT hr; 00857 00858 if (!lpOleCmd) 00859 return E_FAIL; 00860 00861 if (pNetConnect->GetProperties(&pProperties) != S_OK) 00862 return E_FAIL; 00863 00864 hr = lpOleCmd->Exec(&pProperties->guidId, 2, OLECMDEXECOPT_DODEFAULT, NULL, NULL); 00865 00866 NcFreeNetconProperties(pProperties); 00867 return hr; 00868 } 00869 00870 HRESULT 00871 ShowNetConnectionProperties( 00872 INetConnection *pNetConnect, 00873 HWND hwnd) 00874 { 00875 HRESULT hr; 00876 CLSID ClassID; 00877 PROPSHEETHEADERW pinfo; 00878 HPROPSHEETPAGE hppages[MAX_PROPERTY_SHEET_PAGE]; 00879 INetConnectionPropertyUi * pNCP; 00880 NETCON_PROPERTIES * pProperties; 00881 00882 if (pNetConnect->GetProperties(&pProperties) != S_OK) 00883 return E_FAIL; 00884 00885 hr = pNetConnect->GetUiObjectClassId(&ClassID); 00886 if (FAILED(hr)) 00887 { 00888 NcFreeNetconProperties(pProperties); 00889 return hr; 00890 } 00891 00892 hr = CoCreateInstance(ClassID, NULL, CLSCTX_INPROC_SERVER, IID_INetConnectionPropertyUi, (LPVOID*)&pNCP); 00893 if (FAILED(hr)) 00894 { 00895 NcFreeNetconProperties(pProperties); 00896 return hr; 00897 } 00898 00899 hr = pNCP->SetConnection(pNetConnect); 00900 if (SUCCEEDED(hr)) 00901 { 00902 ZeroMemory(&pinfo, sizeof(PROPSHEETHEADERW)); 00903 ZeroMemory(hppages, sizeof(hppages)); 00904 pinfo.dwSize = sizeof(PROPSHEETHEADERW); 00905 pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE | PSH_NOAPPLYNOW; 00906 pinfo.phpage = hppages; 00907 pinfo.hwndParent = hwnd; 00908 00909 pinfo.pszCaption = pProperties->pszwName; 00910 hr = pNCP->AddPages(hwnd, PropSheetExCallback, (LPARAM)&pinfo); 00911 if (SUCCEEDED(hr)) 00912 { 00913 if(PropertySheetW(&pinfo) < 0) 00914 hr = E_FAIL; 00915 } 00916 } 00917 pNCP->Release(); 00918 NcFreeNetconProperties(pProperties); 00919 return hr; 00920 } 00921 00922 00923 /************************************************************************** 00924 * ISF_NetConnect_IContextMenu_InvokeCommand() 00925 */ 00926 HRESULT WINAPI CNetConUiObject::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) 00927 { 00928 VALUEStruct * val; 00929 00930 val = _ILGetValueStruct(apidl); 00931 if (!val) 00932 return E_FAIL; 00933 00934 if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_NET_STATUS) || 00935 lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_NET_STATUS-1)) //HACK for Windows XP 00936 { 00937 return ShowNetConnectionStatus(lpOleCmd, val->pItem, lpcmi->hwnd); 00938 } 00939 else if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_NET_PROPERTIES) || 00940 lpcmi->lpVerb == MAKEINTRESOURCEA(10099)) //HACK for Windows XP 00941 { 00942 /* FIXME perform version checks */ 00943 return ShowNetConnectionProperties(val->pItem, lpcmi->hwnd); 00944 } 00945 00946 return S_OK; 00947 } 00948 00949 /************************************************************************** 00950 * ISF_NetConnect_IContextMenu_GetCommandString() 00951 * 00952 */ 00953 HRESULT WINAPI CNetConUiObject::GetCommandString( 00954 UINT_PTR idCommand, 00955 UINT uFlags, 00956 UINT* lpReserved, 00957 LPSTR lpszName, 00958 UINT uMaxNameLen) 00959 { 00960 return E_FAIL; 00961 } 00962 00963 /************************************************************************** 00964 * ISF_NetConnect_IContextMenu_HandleMenuMsg() 00965 */ 00966 HRESULT WINAPI CNetConUiObject::HandleMenuMsg( 00967 UINT uMsg, 00968 WPARAM wParam, 00969 LPARAM lParam) 00970 { 00971 return E_NOTIMPL; 00972 } 00973 00974 HRESULT WINAPI CNetConUiObject::HandleMenuMsg2( 00975 UINT uMsg, 00976 WPARAM wParam, 00977 LPARAM lParam, 00978 LRESULT *plResult) 00979 { 00980 return E_NOTIMPL; 00981 } 00982 00983 HRESULT WINAPI CNetConUiObject::GetSite(REFIID riid, PVOID *ppvSite) 00984 { 00985 HRESULT hr; 00986 IUnknown *pUnknown; 00987 00988 if (!this->pUnknown) 00989 { 00990 *ppvSite = NULL; 00991 return E_FAIL; 00992 } 00993 00994 hr = this->pUnknown->QueryInterface(riid, (LPVOID*)&pUnknown); 00995 if (SUCCEEDED(hr)) 00996 { 00997 pUnknown->AddRef(); 00998 *ppvSite = pUnknown; 00999 return S_OK; 01000 } 01001 01002 *ppvSite = NULL; 01003 return hr; 01004 } 01005 01006 HRESULT WINAPI CNetConUiObject::SetSite(IUnknown *pUnkSite) 01007 { 01008 if(!pUnkSite) 01009 { 01010 if (this->pUnknown) 01011 { 01012 this->pUnknown->Release(); 01013 this->pUnknown = NULL; 01014 } 01015 } 01016 else 01017 { 01018 pUnkSite->AddRef(); 01019 if (this->pUnknown) 01020 this->pUnknown->Release(); 01021 this->pUnknown = pUnkSite; 01022 } 01023 01024 return S_OK; 01025 } 01026 01027 /************************************************************************ 01028 * ISF_NetConnect_IExtractIcon_GetIconLocation 01029 */ 01030 HRESULT WINAPI CNetConUiObject::GetIconLocation( 01031 UINT uFlags, 01032 LPWSTR szIconFile, 01033 UINT cchMax, 01034 int *piIndex, 01035 UINT *pwFlags) 01036 { 01037 VALUEStruct *val; 01038 NETCON_PROPERTIES *pProperties; 01039 01040 *pwFlags = 0; 01041 if (!GetModuleFileNameW(netshell_hInstance, szIconFile, cchMax)) 01042 { 01043 ERR("GetModuleFileNameW failed\n"); 01044 return E_FAIL; 01045 } 01046 01047 val = _ILGetValueStruct(apidl); 01048 if (!val) 01049 { 01050 ERR("_ILGetValueStruct failed\n"); 01051 return E_FAIL; 01052 } 01053 01054 if (val->pItem->GetProperties(&pProperties) != NOERROR) 01055 { 01056 ERR("INetConnection_GetProperties failed\n"); 01057 return E_FAIL; 01058 } 01059 01060 if (pProperties->Status == NCS_CONNECTED || pProperties->Status == NCS_CONNECTING) 01061 *piIndex = -IDI_NET_IDLE; 01062 else 01063 *piIndex = -IDI_NET_OFF; 01064 01065 NcFreeNetconProperties(pProperties); 01066 01067 return NOERROR; 01068 } 01069 01070 /************************************************************************ 01071 * ISF_NetConnect_IExtractIcon_Extract 01072 */ 01073 HRESULT WINAPI CNetConUiObject::Extract( 01074 LPCWSTR pszFile, 01075 UINT nIconIndex, 01076 HICON *phiconLarge, 01077 HICON *phiconSmall, 01078 UINT nIconSize) 01079 { 01080 //IContextMenuImpl * This = impl_from_IExtractIcon(iface); 01081 if (nIconIndex == IDI_NET_IDLE) 01082 { 01083 *phiconLarge = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_IDLE), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); 01084 *phiconSmall = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_IDLE), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); 01085 return NOERROR; 01086 } 01087 else if (nIconIndex == IDI_NET_OFF) 01088 { 01089 *phiconLarge = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); 01090 *phiconSmall = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); 01091 return NOERROR; 01092 } 01093 01094 return S_FALSE; 01095 } 01096 01097 /************************************************************************ 01098 * ISF_NetConnect_PersistFolder2_GetClassID 01099 */ 01100 HRESULT WINAPI CNetworkConnections::GetClassID(CLSID *lpClassId) 01101 { 01102 if (!lpClassId) 01103 return E_POINTER; 01104 01105 *lpClassId = CLSID_NetworkConnections; 01106 01107 return S_OK; 01108 } 01109 01110 /************************************************************************ 01111 * ISF_NetConnect_PersistFolder2_Initialize 01112 * 01113 * NOTES: it makes no sense to change the pidl 01114 */ 01115 HRESULT WINAPI CNetworkConnections::Initialize(LPCITEMIDLIST pidl) 01116 { 01117 SHFree(pidlRoot); 01118 pidlRoot = ILClone(pidl); 01119 01120 return S_OK; 01121 } 01122 01123 /************************************************************************** 01124 * ISF_NetConnect_PersistFolder2_GetCurFolder 01125 */ 01126 HRESULT WINAPI CNetworkConnections::GetCurFolder(LPITEMIDLIST *pidl) 01127 { 01128 if (!pidl) 01129 return E_POINTER; 01130 01131 *pidl = ILClone(pidlRoot); 01132 01133 return S_OK; 01134 } 01135 01136 /************************************************************************ 01137 * ISF_NetConnect_ShellExecuteHookW_Execute 01138 */ 01139 HRESULT WINAPI CNetworkConnections::Execute(LPSHELLEXECUTEINFOW pei) 01140 { 01141 VALUEStruct *val; 01142 NETCON_PROPERTIES * pProperties; 01143 01144 val = _ILGetValueStruct(ILFindLastID((ITEMIDLIST*)pei->lpIDList)); 01145 if (!val) 01146 return E_FAIL; 01147 01148 if (val->pItem->GetProperties(&pProperties) != NOERROR) 01149 return E_FAIL; 01150 01151 if (pProperties->Status == NCS_CONNECTED) 01152 { 01153 NcFreeNetconProperties(pProperties); 01154 return ShowNetConnectionStatus(lpOleCmd, val->pItem, pei->hwnd); 01155 } 01156 01157 NcFreeNetconProperties(pProperties); 01158 01159 return S_OK; 01160 } 01161 01162 HRESULT WINAPI CNetConUiObject::GetInfoFlags(DWORD *pdwFlags) 01163 { 01164 *pdwFlags = 0; 01165 01166 return S_OK; 01167 } 01168 01169 /************************************************************************ 01170 * ISF_NetConnect_PersistFolder2_Initialize 01171 * 01172 * NOTES: it makes no sense to change the pidl 01173 */ 01174 HRESULT WINAPI CNetConUiObject::GetInfoTip(DWORD dwFlags, WCHAR **ppwszTip) 01175 { 01176 *ppwszTip = NULL; 01177 return S_OK; 01178 } 01179 01180 /************************************************************************** 01181 * ISF_NetConnect_Constructor 01182 */ 01183 HRESULT WINAPI ISF_NetConnect_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv) 01184 { 01185 TRACE("ISF_NetConnect_Constructor\n"); 01186 01187 if (!ppv) 01188 return E_POINTER; 01189 if (pUnkOuter) 01190 return CLASS_E_NOAGGREGATION; 01191 01192 CNetworkConnections *pnc = new CNetworkConnections; 01193 if (!pnc) 01194 return E_OUTOFMEMORY; 01195 01196 pnc->AddRef(); 01197 HRESULT hr = pnc->QueryInterface(riid, ppv); 01198 pnc->Release(); 01199 01200 return hr; 01201 } Generated on Sat May 26 2012 04:24:02 for ReactOS by
1.7.6.1
|