2 * Network Connections Shell Folder
4 * Copyright 2008 Johannes Anderwald <janderwald@reactos.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 WINE_DEFAULT_DEBUG_CHANNEL (shell
);
25 #define MAX_PROPERTY_SHEET_PAGE (10)
27 /***********************************************************************
28 * IShellFolder implementation
31 class CNetworkConnections
:
33 public IPersistFolder2
,
34 public IShellExecuteHookW
37 CNetworkConnections();
40 virtual HRESULT WINAPI
QueryInterface(REFIID riid
, LPVOID
*ppvOut
);
41 virtual ULONG WINAPI
AddRef();
42 virtual ULONG WINAPI
Release();
45 virtual HRESULT WINAPI
ParseDisplayName (HWND hwndOwner
, LPBC pbc
, LPOLESTR lpszDisplayName
, DWORD
*pchEaten
, LPITEMIDLIST
*ppidl
, DWORD
*pdwAttributes
);
46 virtual HRESULT WINAPI
EnumObjects(HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
*ppEnumIDList
);
47 virtual HRESULT WINAPI
BindToObject(LPCITEMIDLIST pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
);
48 virtual HRESULT WINAPI
BindToStorage(LPCITEMIDLIST pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
);
49 virtual HRESULT WINAPI
CompareIDs(LPARAM lParam
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
);
50 virtual HRESULT WINAPI
CreateViewObject(HWND hwndOwner
, REFIID riid
, LPVOID
*ppvOut
);
51 virtual HRESULT WINAPI
GetAttributesOf (UINT cidl
, LPCITEMIDLIST
*apidl
, DWORD
*rgfInOut
);
52 virtual HRESULT WINAPI
GetUIObjectOf(HWND hwndOwner
, UINT cidl
, LPCITEMIDLIST
*apidl
, REFIID riid
, UINT
* prgfInOut
, LPVOID
* ppvOut
);
53 virtual HRESULT WINAPI
GetDisplayNameOf(LPCITEMIDLIST pidl
, DWORD dwFlags
, LPSTRRET strRet
);
54 virtual HRESULT WINAPI
SetNameOf(HWND hwndOwner
, LPCITEMIDLIST pidl
, LPCOLESTR lpName
, DWORD dwFlags
, LPITEMIDLIST
*pPidlOut
);
57 virtual HRESULT WINAPI
GetDefaultSearchGUID(GUID
*pguid
);
58 virtual HRESULT WINAPI
EnumSearches(IEnumExtraSearch
**ppenum
);
59 virtual HRESULT WINAPI
GetDefaultColumn(DWORD dwRes
, ULONG
*pSort
, ULONG
*pDisplay
);
60 virtual HRESULT WINAPI
GetDefaultColumnState(UINT iColumn
, DWORD
*pcsFlags
);
61 virtual HRESULT WINAPI
GetDetailsEx(LPCITEMIDLIST pidl
, const SHCOLUMNID
*pscid
, VARIANT
*pv
);
62 virtual HRESULT WINAPI
GetDetailsOf(LPCITEMIDLIST pidl
, UINT iColumn
, SHELLDETAILS
*psd
);
63 virtual HRESULT WINAPI
MapColumnToSCID(UINT column
, SHCOLUMNID
*pscid
);
66 virtual HRESULT WINAPI
GetClassID(CLSID
*lpClassId
);
67 virtual HRESULT WINAPI
Initialize(LPCITEMIDLIST pidl
);
68 virtual HRESULT WINAPI
GetCurFolder(LPITEMIDLIST
*pidl
);
71 virtual HRESULT WINAPI
Execute(LPSHELLEXECUTEINFOW pei
);
75 /* both paths are parsible from the desktop */
76 LPITEMIDLIST pidlRoot
; /* absolute pidl */
77 LPITEMIDLIST pidl
; /* enumerated pidl */
78 IOleCommandTarget
* lpOleCmd
;
81 class CNetConUiObject
:
83 public IObjectWithSite
,
88 CNetConUiObject(LPCITEMIDLIST apidl
, IOleCommandTarget
*lpOleCmd
);
91 virtual HRESULT WINAPI
QueryInterface(REFIID riid
, LPVOID
*ppvOut
);
92 virtual ULONG WINAPI
AddRef();
93 virtual ULONG WINAPI
Release();
96 virtual HRESULT WINAPI
QueryContextMenu(HMENU hmenu
, UINT indexMenu
, UINT idCmdFirst
, UINT idCmdLast
, UINT uFlags
);
97 virtual HRESULT WINAPI
InvokeCommand(LPCMINVOKECOMMANDINFO lpici
);
98 virtual HRESULT WINAPI
GetCommandString(UINT_PTR idCmd
, UINT uType
, UINT
*pwReserved
, LPSTR pszName
, UINT cchMax
);
99 virtual HRESULT WINAPI
HandleMenuMsg( UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
100 virtual HRESULT WINAPI
HandleMenuMsg2(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*plResult
);
103 virtual HRESULT WINAPI
SetSite(IUnknown
*punk
);
104 virtual HRESULT WINAPI
GetSite(REFIID iid
, void **ppvSite
);
107 virtual HRESULT WINAPI
GetInfoFlags(DWORD
*pdwFlags
);
108 virtual HRESULT WINAPI
GetInfoTip(DWORD dwFlags
, WCHAR
**ppwszTip
);
111 virtual HRESULT STDMETHODCALLTYPE
GetIconLocation(UINT uFlags
, LPWSTR szIconFile
, UINT cchMax
, int *piIndex
, UINT
*pwFlags
);
112 virtual HRESULT STDMETHODCALLTYPE
Extract(LPCWSTR pszFile
, UINT nIconIndex
, HICON
*phiconLarge
, HICON
*phiconSmall
, UINT nIconSize
);
118 IOleCommandTarget
* lpOleCmd
;
121 static const shvheader NetConnectSFHeader
[] = {
122 {IDS_SHV_COLUMN_NAME
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 20},
123 {IDS_SHV_COLUMN_TYPE
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 8},
124 {IDS_SHV_COLUMN_STATE
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 10},
125 {IDS_SHV_COLUMN_DEVNAME
, SHCOLSTATE_TYPE_DATE
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 12},
126 {IDS_SHV_COLUMN_PHONE
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 10},
127 {IDS_SHV_COLUMN_OWNER
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 5}
130 #define NETCONNECTSHELLVIEWCOLUMNS 6
132 #define COLUMN_NAME 0
133 #define COLUMN_TYPE 1
134 #define COLUMN_STATUS 2
135 #define COLUMN_DEVNAME 3
136 #define COLUMN_PHONE 4
137 #define COLUMN_OWNER 5
139 HRESULT
ShowNetConnectionStatus(IOleCommandTarget
* lpOleCmd
, INetConnection
* pNetConnect
, HWND hwnd
);
141 CNetworkConnections::CNetworkConnections()
144 HRESULT hr
= CoCreateInstance(CLSID_LanConnectStatusUI
, NULL
, CLSCTX_INPROC_SERVER
, IID_IOleCommandTarget
, (LPVOID
*)&lpOleCmd
);
147 ERR("CoCreateInstance failed\n");
152 hr
= lpOleCmd
->Exec(&CGID_ShellServiceObject
, 2, OLECMDEXECOPT_DODEFAULT
, NULL
, NULL
);
154 ERR("Exec CGID_ShellServiceObject failed\n");
157 pidlRoot
= _ILCreateNetConnect(); /* my qualified pidl */
160 /**************************************************************************
161 * ISF_NetConnect_fnQueryInterface
164 * supports not IPersist/IPersistFolder
166 HRESULT WINAPI
CNetworkConnections::QueryInterface(REFIID riid
, LPVOID
*ppvObj
)
170 if (IsEqualIID(riid
, IID_IUnknown
) ||
171 IsEqualIID(riid
, IID_IShellFolder
) ||
172 IsEqualIID(riid
, IID_IShellFolder2
))
174 *ppvObj
= (IShellFolder2
*)this;
176 else if (IsEqualIID (riid
, IID_IPersistFolder
) ||
177 IsEqualIID (riid
, IID_IPersistFolder2
))
179 *ppvObj
= (IPersistFolder2
*)this;
181 else if (IsEqualIID(riid
, IID_IShellExecuteHookW
))
183 *ppvObj
= (IShellExecuteHookW
*)this;
186 else if (IsEqualIID(riid
, IID_IPersistIDList
))
188 //*ppvObj = (IPersistIDList*)this;
198 * IID_IPersistFreeThreadedObject
199 * IID_IBrowserFrameOptions
200 * IID_IShellIconOverlay
205 return E_NOINTERFACE
;
208 ULONG WINAPI
CNetworkConnections::AddRef()
210 ULONG refCount
= InterlockedIncrement(&ref
);
215 ULONG WINAPI
CNetworkConnections::Release()
217 ULONG refCount
= InterlockedDecrement(&ref
);
227 /**************************************************************************
228 * ISF_NetConnect_fnParseDisplayName
230 HRESULT WINAPI
CNetworkConnections::ParseDisplayName (
231 HWND hwndOwner
, LPBC pbcReserved
, LPOLESTR lpszDisplayName
,
232 DWORD
* pchEaten
, LPITEMIDLIST
* ppidl
, DWORD
* pdwAttributes
)
234 HRESULT hr
= E_UNEXPECTED
;
238 *pchEaten
= 0; /* strange but like the original */
243 /**************************************************************************
244 * CreateNetConnectEnumListss()
246 static BOOL
CreateNetConnectEnumList(CEnumIDList
*list
, DWORD dwFlags
)
249 INetConnectionManager
*pNetConMan
;
250 IEnumNetConnection
*pEnumCon
;
251 INetConnection
*INetCon
;
255 /* get an instance to of IConnectionManager */
256 hr
= INetConnectionManager_Constructor(NULL
, IID_INetConnectionManager
, (LPVOID
*)&pNetConMan
);
260 hr
= pNetConMan
->EnumConnections(NCME_DEFAULT
, &pEnumCon
);
263 pNetConMan
->Release();
269 hr
= pEnumCon
->Next(1, &INetCon
, &Count
);
272 pidl
= ILCreateNetConnectItem(INetCon
);
275 list
->AddToEnumList(pidl
);
285 pNetConMan
->Release();
290 /**************************************************************************
291 * ISF_NetConnect_fnEnumObjects
293 HRESULT WINAPI
CNetworkConnections::EnumObjects(
294 HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
*ppEnumIDList
)
296 CEnumIDList
*pList
= new CEnumIDList
;
297 *ppEnumIDList
= (LPENUMIDLIST
)pList
;
299 return E_OUTOFMEMORY
;
302 CreateNetConnectEnumList(pList
, dwFlags
);
306 /**************************************************************************
307 * ISF_NetConnect_fnBindToObject
309 HRESULT WINAPI
CNetworkConnections::BindToObject (
310 LPCITEMIDLIST pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
* ppvOut
)
315 /**************************************************************************
316 * ISF_NetConnect_fnBindToStorage
318 HRESULT WINAPI
CNetworkConnections::BindToStorage(
319 LPCITEMIDLIST pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
* ppvOut
)
325 /**************************************************************************
326 * ISF_NetConnect_fnCompareIDs
329 HRESULT WINAPI
CNetworkConnections::CompareIDs(
330 LPARAM lParam
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
332 //IGenericSFImpl *This = (IGenericSFImpl *)iface;
339 /**************************************************************************
340 * ISF_NetConnect_fnCreateViewObject
342 HRESULT WINAPI
CNetworkConnections::CreateViewObject(
343 HWND hwndOwner
, REFIID riid
, LPVOID
* ppvOut
)
346 HRESULT hr
= E_NOINTERFACE
;
353 if (IsEqualIID(riid
, IID_IShellView
))
355 ZeroMemory(&cvf
, sizeof(cvf
));
356 cvf
.cbSize
= sizeof(cvf
);
357 cvf
.pshf
= (IShellFolder
*)this;
359 IShellView
* pShellView
;
360 hr
= SHCreateShellFolderViewEx(&cvf
, &pShellView
);
363 hr
= pShellView
->QueryInterface(riid
, ppvOut
);
364 pShellView
->Release();
371 /**************************************************************************
372 * ISF_NetConnect_fnGetAttributesOf
374 HRESULT WINAPI
CNetworkConnections::GetAttributesOf(
375 UINT cidl
, LPCITEMIDLIST
* apidl
, DWORD
* rgfInOut
)
377 //IGenericSFImpl *This = (IGenericSFImpl *)iface;
379 static const DWORD dwNetConnectAttributes
= SFGAO_STORAGE
| SFGAO_HASPROPSHEET
| SFGAO_STORAGEANCESTOR
|
380 SFGAO_FILESYSANCESTOR
| SFGAO_FOLDER
| SFGAO_FILESYSTEM
| SFGAO_HASSUBFOLDER
| SFGAO_CANRENAME
| SFGAO_CANDELETE
;
382 static const DWORD dwNetConnectItemAttributes
= SFGAO_HASPROPSHEET
| SFGAO_STORAGEANCESTOR
|
383 SFGAO_FILESYSANCESTOR
| SFGAO_CANRENAME
;
395 *rgfInOut
= dwNetConnectAttributes
;
397 *rgfInOut
= dwNetConnectItemAttributes
;
399 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
400 *rgfInOut
&= ~SFGAO_VALIDATE
;
405 /**************************************************************************
406 * ISF_NetConnect_fnGetUIObjectOf
409 * hwndOwner [in] Parent window for any output
410 * cidl [in] array size
411 * apidl [in] simple pidl array
412 * riid [in] Requested Interface
413 * prgfInOut [ ] reserved
414 * ppvObject [out] Resulting Interface
418 HRESULT
IContextMenuImpl_Constructor(REFIID riid
, LPCITEMIDLIST apidl
, LPVOID
* ppvOut
, IOleCommandTarget
* lpOleCmd
)
420 CNetConUiObject
*pMenu
= new CNetConUiObject(apidl
, lpOleCmd
);
422 return E_OUTOFMEMORY
;
425 HRESULT hr
= pMenu
->QueryInterface(riid
, ppvOut
);
430 HRESULT WINAPI
CNetworkConnections::GetUIObjectOf(
431 HWND hwndOwner
, UINT cidl
, LPCITEMIDLIST
* apidl
, REFIID riid
,
432 UINT
* prgfInOut
, LPVOID
* ppvOut
)
434 IUnknown
*pObj
= NULL
;
435 HRESULT hr
= E_INVALIDARG
;
442 if ((IsEqualIID (riid
, IID_IContextMenu
) || IsEqualIID (riid
, IID_IContextMenu2
) || IsEqualIID(riid
, IID_IContextMenu3
) ||
443 IsEqualIID(riid
, IID_IQueryInfo
) || IsEqualIID(riid
, IID_IExtractIconW
)) && cidl
>= 1)
445 return IContextMenuImpl_Constructor(riid
, apidl
[0], ppvOut
, lpOleCmd
);
454 /**************************************************************************
455 * ISF_NetConnect_fnGetDisplayNameOf
458 HRESULT WINAPI
CNetworkConnections::GetDisplayNameOf(LPCITEMIDLIST pidl
, DWORD dwFlags
, LPSTRRET strRet
)
462 NETCON_PROPERTIES
* pProperties
;
468 pszName
= (WCHAR
*)CoTaskMemAlloc(MAX_PATH
* sizeof(WCHAR
));
470 return E_OUTOFMEMORY
;
472 if (_ILIsNetConnect(pidl
))
474 if (LoadStringW(netshell_hInstance
, IDS_NETWORKCONNECTION
, pszName
, MAX_PATH
))
476 pszName
[MAX_PATH
-1] = L
'\0';
482 val
= _ILGetValueStruct(pidl
);
485 if (val
->pItem
->GetProperties(&pProperties
) == S_OK
)
487 if (pProperties
->pszwName
)
489 wcscpy(pszName
, pProperties
->pszwName
);
492 NcFreeNetconProperties(pProperties
);
500 strRet
->uType
= STRRET_WSTR
;
501 strRet
->pOleStr
= pszName
;
505 CoTaskMemFree(pszName
);
511 /**************************************************************************
512 * ISF_NetConnect_fnSetNameOf
513 * Changes the name of a file object or subfolder, possibly changing its item
514 * identifier in the process.
517 * hwndOwner [in] Owner window for output
518 * pidl [in] simple pidl of item to change
519 * lpszName [in] the items new display name
520 * dwFlags [in] SHGNO formatting flags
521 * ppidlOut [out] simple pidl returned
523 HRESULT WINAPI
CNetworkConnections::SetNameOf (
524 HWND hwndOwner
, LPCITEMIDLIST pidl
, /*simple pidl */
525 LPCOLESTR lpName
, DWORD dwFlags
, LPITEMIDLIST
* pPidlOut
)
530 HRESULT WINAPI
CNetworkConnections::GetDefaultSearchGUID(GUID
* pguid
)
535 HRESULT WINAPI
CNetworkConnections::EnumSearches(IEnumExtraSearch
** ppenum
)
540 HRESULT WINAPI
CNetworkConnections::GetDefaultColumn(DWORD dwRes
, ULONG
* pSort
, ULONG
* pDisplay
)
550 HRESULT WINAPI
CNetworkConnections::GetDefaultColumnState(UINT iColumn
, DWORD
* pcsFlags
)
552 if (!pcsFlags
|| iColumn
>= NETCONNECTSHELLVIEWCOLUMNS
)
554 *pcsFlags
= NetConnectSFHeader
[iColumn
].pcsFlags
;
558 HRESULT WINAPI
CNetworkConnections::GetDetailsEx(
559 LPCITEMIDLIST pidl
, const SHCOLUMNID
* pscid
, VARIANT
* pv
)
564 HRESULT WINAPI
CNetworkConnections::GetDetailsOf(
565 LPCITEMIDLIST pidl
, UINT iColumn
, SHELLDETAILS
* psd
)
567 WCHAR buffer
[MAX_PATH
] = {0};
570 NETCON_PROPERTIES
* pProperties
;
572 if (iColumn
>= NETCONNECTSHELLVIEWCOLUMNS
)
575 psd
->fmt
= NetConnectSFHeader
[iColumn
].fmt
;
576 psd
->cxChar
= NetConnectSFHeader
[iColumn
].cxChar
;
579 psd
->str
.uType
= STRRET_WSTR
;
580 if (LoadStringW(netshell_hInstance
, NetConnectSFHeader
[iColumn
].colnameid
, buffer
, MAX_PATH
))
581 hr
= SHStrDupW(buffer
, &psd
->str
.pOleStr
);
586 if (iColumn
== COLUMN_NAME
)
588 psd
->str
.uType
= STRRET_WSTR
;
589 return GetDisplayNameOf(pidl
, SHGDN_NORMAL
, &psd
->str
);
592 val
= _ILGetValueStruct(pidl
);
599 if (val
->pItem
->GetProperties(&pProperties
) != S_OK
)
606 if (pProperties
->MediaType
== NCM_LAN
|| pProperties
->MediaType
== NCM_SHAREDACCESSHOST_RAS
)
608 if (LoadStringW(netshell_hInstance
, IDS_TYPE_ETHERNET
, buffer
, MAX_PATH
))
610 psd
->str
.uType
= STRRET_WSTR
;
611 hr
= SHStrDupW(buffer
, &psd
->str
.pOleStr
);
617 if (pProperties
->Status
== NCS_HARDWARE_DISABLED
)
618 LoadStringW(netshell_hInstance
, IDS_STATUS_NON_OPERATIONAL
, buffer
, MAX_PATH
);
619 else if (pProperties
->Status
== NCS_DISCONNECTED
)
620 LoadStringW(netshell_hInstance
, IDS_STATUS_UNREACHABLE
, buffer
, MAX_PATH
);
621 else if (pProperties
->Status
== NCS_MEDIA_DISCONNECTED
)
622 LoadStringW(netshell_hInstance
, IDS_STATUS_DISCONNECTED
, buffer
, MAX_PATH
);
623 else if (pProperties
->Status
== NCS_CONNECTING
)
624 LoadStringW(netshell_hInstance
, IDS_STATUS_CONNECTING
, buffer
, MAX_PATH
);
625 else if (pProperties
->Status
== NCS_CONNECTED
)
626 LoadStringW(netshell_hInstance
, IDS_STATUS_CONNECTED
, buffer
, MAX_PATH
);
630 buffer
[MAX_PATH
-1] = L
'\0';
631 psd
->str
.uType
= STRRET_WSTR
;
632 hr
= SHStrDupW(buffer
, &psd
->str
.pOleStr
);
636 if (pProperties
->pszwDeviceName
)
638 wcscpy(buffer
, pProperties
->pszwDeviceName
);
639 buffer
[MAX_PATH
-1] = L
'\0';
640 psd
->str
.uType
= STRRET_WSTR
;
641 hr
= SHStrDupW(buffer
, &psd
->str
.pOleStr
);
645 psd
->str
.cStr
[0] = '\0';
646 psd
->str
.uType
= STRRET_CSTR
;
651 psd
->str
.cStr
[0] = '\0';
652 psd
->str
.uType
= STRRET_CSTR
;
656 NcFreeNetconProperties(pProperties
);
660 HRESULT WINAPI
CNetworkConnections::MapColumnToSCID(UINT column
, SHCOLUMNID
*pscid
)
666 //IInternetSecurityManager
668 /**************************************************************************
669 * IContextMenu2 Implementation
672 CNetConUiObject::CNetConUiObject(LPCITEMIDLIST apidl
, IOleCommandTarget
*lpOleCmd
)
676 this->lpOleCmd
= lpOleCmd
;
680 /************************************************************************
681 * ISF_NetConnect_IContextMenu_QueryInterface
683 HRESULT WINAPI
CNetConUiObject::QueryInterface(REFIID iid
, LPVOID
*ppvObject
)
687 if (IsEqualIID(iid
, IID_IContextMenu
) || IsEqualIID(iid
, IID_IContextMenu2
) || IsEqualIID(iid
, IID_IContextMenu3
))
688 *ppvObject
= (IContextMenu3
*)this;
689 else if (IsEqualIID(iid
, IID_IObjectWithSite
))
690 *ppvObject
= (IObjectWithSite
*)this;
691 else if (IsEqualIID(iid
, IID_IQueryInfo
))
692 *ppvObject
= (IQueryInfo
*)this;
693 else if(IsEqualIID(iid
, IID_IExtractIconW
))
694 *ppvObject
= (IExtractIconW
*)this;
698 InterlockedIncrement(&ref
);
703 //StringFromCLSID(iid, &pStr);
704 //MessageBoxW(NULL, L"ISF_NetConnect_IContextMenu2_QueryInterface unhandled", pStr, MB_OK);
705 return E_NOINTERFACE
;
708 /************************************************************************
709 * ISF_NetConnect_IContextMenu_AddRef
711 ULONG WINAPI
CNetConUiObject::AddRef()
715 refCount
= InterlockedIncrement(&ref
);
720 /************************************************************************
721 * ISF_NetConnect_IContextMenu_Release
723 ULONG WINAPI
CNetConUiObject::Release()
727 refCount
= InterlockedDecrement(&ref
);
734 void WINAPI
_InsertMenuItemW (
746 ZeroMemory(&mii
, sizeof(mii
));
747 mii
.cbSize
= sizeof(mii
);
748 if (fType
== MFT_SEPARATOR
)
750 mii
.fMask
= MIIM_ID
| MIIM_TYPE
;
752 else if (fType
== MFT_STRING
)
754 mii
.fMask
= MIIM_ID
| MIIM_TYPE
| MIIM_STATE
;
755 if ((ULONG_PTR
)HIWORD((ULONG_PTR
)dwTypeData
) == 0)
757 if (LoadStringW(netshell_hInstance
, LOWORD((ULONG_PTR
)dwTypeData
), szText
, sizeof(szText
)/sizeof(WCHAR
)))
759 szText
[(sizeof(szText
)/sizeof(WCHAR
))-1] = 0;
760 mii
.dwTypeData
= szText
;
769 mii
.dwTypeData
= (LPWSTR
) dwTypeData
;
776 InsertMenuItemW( hmenu
, indexMenu
, fByPosition
, &mii
);
779 /**************************************************************************
780 * ISF_NetConnect_IContextMenu_QueryContextMenu()
782 HRESULT WINAPI
CNetConUiObject::QueryContextMenu(
790 NETCON_PROPERTIES
* pProperties
;
792 val
= _ILGetValueStruct(apidl
);
796 if (val
->pItem
->GetProperties(&pProperties
) != S_OK
)
799 if (pProperties
->Status
== NCS_HARDWARE_DISABLED
)
800 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_ACTIVATE
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_ACTIVATE
), MFS_DEFAULT
);
802 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_DEACTIVATE
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_DEACTIVATE
), MFS_ENABLED
);
804 if (pProperties
->Status
== NCS_HARDWARE_DISABLED
|| pProperties
->Status
== NCS_MEDIA_DISCONNECTED
|| pProperties
->Status
== NCS_DISCONNECTED
)
805 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_STATUS
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_STATUS
), MFS_GRAYED
);
806 else if (pProperties
->Status
== NCS_CONNECTED
)
807 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_STATUS
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_STATUS
), MFS_DEFAULT
);
809 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_STATUS
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_STATUS
), MFS_ENABLED
);
811 if (pProperties
->Status
== NCS_HARDWARE_DISABLED
|| pProperties
->Status
== NCS_MEDIA_DISCONNECTED
)
812 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_REPAIR
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_REPAIR
), MFS_GRAYED
);
814 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_REPAIR
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_REPAIR
), MFS_ENABLED
);
816 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, -1, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
817 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_CREATELINK
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_CREATELINK
), MFS_ENABLED
);
819 if (pProperties
->dwCharacter
& NCCF_ALLOW_REMOVAL
)
820 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_DELETE
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_DELETE
), MFS_ENABLED
);
822 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_DELETE
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_DELETE
), MFS_GRAYED
);
824 if (pProperties
->dwCharacter
& NCCF_ALLOW_RENAME
)
825 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_RENAME
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_RENAME
), MFS_ENABLED
);
827 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_RENAME
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_RENAME
), MFS_GRAYED
);
829 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, -1, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
830 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_PROPERTIES
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_PROPERTIES
), MFS_ENABLED
);
831 NcFreeNetconProperties(pProperties
);
832 return MAKE_HRESULT(SEVERITY_SUCCESS
, 0, 9);
837 PropSheetExCallback(HPROPSHEETPAGE hPage
, LPARAM lParam
)
839 PROPSHEETHEADERW
*pinfo
= (PROPSHEETHEADERW
*)lParam
;
841 if (pinfo
->nPages
< MAX_PROPERTY_SHEET_PAGE
)
843 pinfo
->phpage
[pinfo
->nPages
++] = hPage
;
850 ShowNetConnectionStatus(
851 IOleCommandTarget
*lpOleCmd
,
852 INetConnection
*pNetConnect
,
855 NETCON_PROPERTIES
*pProperties
;
861 if (pNetConnect
->GetProperties(&pProperties
) != S_OK
)
864 hr
= lpOleCmd
->Exec(&pProperties
->guidId
, 2, OLECMDEXECOPT_DODEFAULT
, NULL
, NULL
);
866 NcFreeNetconProperties(pProperties
);
871 ShowNetConnectionProperties(
872 INetConnection
*pNetConnect
,
877 PROPSHEETHEADERW pinfo
;
878 HPROPSHEETPAGE hppages
[MAX_PROPERTY_SHEET_PAGE
];
879 INetConnectionPropertyUi
* pNCP
;
880 NETCON_PROPERTIES
* pProperties
;
882 if (pNetConnect
->GetProperties(&pProperties
) != S_OK
)
885 hr
= pNetConnect
->GetUiObjectClassId(&ClassID
);
888 NcFreeNetconProperties(pProperties
);
892 hr
= CoCreateInstance(ClassID
, NULL
, CLSCTX_INPROC_SERVER
, IID_INetConnectionPropertyUi
, (LPVOID
*)&pNCP
);
895 NcFreeNetconProperties(pProperties
);
899 hr
= pNCP
->SetConnection(pNetConnect
);
902 ZeroMemory(&pinfo
, sizeof(PROPSHEETHEADERW
));
903 ZeroMemory(hppages
, sizeof(hppages
));
904 pinfo
.dwSize
= sizeof(PROPSHEETHEADERW
);
905 pinfo
.dwFlags
= PSH_NOCONTEXTHELP
| PSH_PROPTITLE
| PSH_NOAPPLYNOW
;
906 pinfo
.phpage
= hppages
;
907 pinfo
.hwndParent
= hwnd
;
909 pinfo
.pszCaption
= pProperties
->pszwName
;
910 hr
= pNCP
->AddPages(hwnd
, PropSheetExCallback
, (LPARAM
)&pinfo
);
913 if(PropertySheetW(&pinfo
) < 0)
918 NcFreeNetconProperties(pProperties
);
923 /**************************************************************************
924 * ISF_NetConnect_IContextMenu_InvokeCommand()
926 HRESULT WINAPI
CNetConUiObject::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi
)
930 val
= _ILGetValueStruct(apidl
);
934 if (lpcmi
->lpVerb
== MAKEINTRESOURCEA(IDS_NET_STATUS
) ||
935 lpcmi
->lpVerb
== MAKEINTRESOURCEA(IDS_NET_STATUS
-1)) //HACK for Windows XP
937 return ShowNetConnectionStatus(lpOleCmd
, val
->pItem
, lpcmi
->hwnd
);
939 else if (lpcmi
->lpVerb
== MAKEINTRESOURCEA(IDS_NET_PROPERTIES
) ||
940 lpcmi
->lpVerb
== MAKEINTRESOURCEA(10099)) //HACK for Windows XP
942 /* FIXME perform version checks */
943 return ShowNetConnectionProperties(val
->pItem
, lpcmi
->hwnd
);
949 /**************************************************************************
950 * ISF_NetConnect_IContextMenu_GetCommandString()
953 HRESULT WINAPI
CNetConUiObject::GetCommandString(
963 /**************************************************************************
964 * ISF_NetConnect_IContextMenu_HandleMenuMsg()
966 HRESULT WINAPI
CNetConUiObject::HandleMenuMsg(
974 HRESULT WINAPI
CNetConUiObject::HandleMenuMsg2(
983 HRESULT WINAPI
CNetConUiObject::GetSite(REFIID riid
, PVOID
*ppvSite
)
994 hr
= this->pUnknown
->QueryInterface(riid
, (LPVOID
*)&pUnknown
);
1006 HRESULT WINAPI
CNetConUiObject::SetSite(IUnknown
*pUnkSite
)
1012 this->pUnknown
->Release();
1013 this->pUnknown
= NULL
;
1020 this->pUnknown
->Release();
1021 this->pUnknown
= pUnkSite
;
1027 /************************************************************************
1028 * ISF_NetConnect_IExtractIcon_GetIconLocation
1030 HRESULT WINAPI
CNetConUiObject::GetIconLocation(
1038 NETCON_PROPERTIES
*pProperties
;
1041 if (!GetModuleFileNameW(netshell_hInstance
, szIconFile
, cchMax
))
1043 ERR("GetModuleFileNameW failed\n");
1047 val
= _ILGetValueStruct(apidl
);
1050 ERR("_ILGetValueStruct failed\n");
1054 if (val
->pItem
->GetProperties(&pProperties
) != NOERROR
)
1056 ERR("INetConnection_GetProperties failed\n");
1060 if (pProperties
->Status
== NCS_CONNECTED
|| pProperties
->Status
== NCS_CONNECTING
)
1061 *piIndex
= -IDI_NET_IDLE
;
1063 *piIndex
= -IDI_NET_OFF
;
1065 NcFreeNetconProperties(pProperties
);
1070 /************************************************************************
1071 * ISF_NetConnect_IExtractIcon_Extract
1073 HRESULT WINAPI
CNetConUiObject::Extract(
1080 //IContextMenuImpl * This = impl_from_IExtractIcon(iface);
1081 if (nIconIndex
== IDI_NET_IDLE
)
1083 *phiconLarge
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_IDLE
), IMAGE_ICON
, 32, 32, LR_DEFAULTCOLOR
);
1084 *phiconSmall
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_IDLE
), IMAGE_ICON
, 16, 16, LR_DEFAULTCOLOR
);
1087 else if (nIconIndex
== IDI_NET_OFF
)
1089 *phiconLarge
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_OFF
), IMAGE_ICON
, 32, 32, LR_DEFAULTCOLOR
);
1090 *phiconSmall
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_OFF
), IMAGE_ICON
, 16, 16, LR_DEFAULTCOLOR
);
1097 /************************************************************************
1098 * ISF_NetConnect_PersistFolder2_GetClassID
1100 HRESULT WINAPI
CNetworkConnections::GetClassID(CLSID
*lpClassId
)
1105 *lpClassId
= CLSID_NetworkConnections
;
1110 /************************************************************************
1111 * ISF_NetConnect_PersistFolder2_Initialize
1113 * NOTES: it makes no sense to change the pidl
1115 HRESULT WINAPI
CNetworkConnections::Initialize(LPCITEMIDLIST pidl
)
1118 pidlRoot
= ILClone(pidl
);
1123 /**************************************************************************
1124 * ISF_NetConnect_PersistFolder2_GetCurFolder
1126 HRESULT WINAPI
CNetworkConnections::GetCurFolder(LPITEMIDLIST
*pidl
)
1131 *pidl
= ILClone(pidlRoot
);
1136 /************************************************************************
1137 * ISF_NetConnect_ShellExecuteHookW_Execute
1139 HRESULT WINAPI
CNetworkConnections::Execute(LPSHELLEXECUTEINFOW pei
)
1142 NETCON_PROPERTIES
* pProperties
;
1144 val
= _ILGetValueStruct(ILFindLastID((ITEMIDLIST
*)pei
->lpIDList
));
1148 if (val
->pItem
->GetProperties(&pProperties
) != NOERROR
)
1151 if (pProperties
->Status
== NCS_CONNECTED
)
1153 NcFreeNetconProperties(pProperties
);
1154 return ShowNetConnectionStatus(lpOleCmd
, val
->pItem
, pei
->hwnd
);
1157 NcFreeNetconProperties(pProperties
);
1162 HRESULT WINAPI
CNetConUiObject::GetInfoFlags(DWORD
*pdwFlags
)
1169 /************************************************************************
1170 * ISF_NetConnect_PersistFolder2_Initialize
1172 * NOTES: it makes no sense to change the pidl
1174 HRESULT WINAPI
CNetConUiObject::GetInfoTip(DWORD dwFlags
, WCHAR
**ppwszTip
)
1180 /**************************************************************************
1181 * ISF_NetConnect_Constructor
1183 HRESULT WINAPI
ISF_NetConnect_Constructor(IUnknown
*pUnkOuter
, REFIID riid
, LPVOID
*ppv
)
1185 TRACE("ISF_NetConnect_Constructor\n");
1190 return CLASS_E_NOAGGREGATION
;
1192 CNetworkConnections
*pnc
= new CNetworkConnections
;
1194 return E_OUTOFMEMORY
;
1197 HRESULT hr
= pnc
->QueryInterface(riid
, ppv
);