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

shfldr_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 doxygen 1.7.6.1

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