2 * Network Connections Shell Folder
4 * Copyright 2008 Johannes Anderwald <johannes.anderwald@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 #define MAX_PROPERTY_SHEET_PAGE (10)
25 /***********************************************************************
26 * IShellFolder implementation
29 class CNetworkConnections final
:
31 public IPersistFolder2
,
32 public IShellExecuteHookW
35 CNetworkConnections();
38 virtual HRESULT WINAPI
QueryInterface(REFIID riid
, LPVOID
*ppvOut
);
39 virtual ULONG WINAPI
AddRef();
40 virtual ULONG WINAPI
Release();
43 virtual HRESULT WINAPI
ParseDisplayName(HWND hwndOwner
, LPBC pbc
, LPOLESTR lpszDisplayName
, DWORD
*pchEaten
, PIDLIST_RELATIVE
*ppidl
, DWORD
*pdwAttributes
);
44 virtual HRESULT WINAPI
EnumObjects(HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
*ppEnumIDList
);
45 virtual HRESULT WINAPI
BindToObject(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
);
46 virtual HRESULT WINAPI
BindToStorage(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
);
47 virtual HRESULT WINAPI
CompareIDs(LPARAM lParam
, PCUIDLIST_RELATIVE pidl1
, PCUIDLIST_RELATIVE pidl2
);
48 virtual HRESULT WINAPI
CreateViewObject(HWND hwndOwner
, REFIID riid
, LPVOID
*ppvOut
);
49 virtual HRESULT WINAPI
GetAttributesOf(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, DWORD
*rgfInOut
);
50 virtual HRESULT WINAPI
GetUIObjectOf(HWND hwndOwner
, UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, REFIID riid
, UINT
* prgfInOut
, LPVOID
* ppvOut
);
51 virtual HRESULT WINAPI
GetDisplayNameOf(PCUITEMID_CHILD pidl
, DWORD dwFlags
, LPSTRRET strRet
);
52 virtual HRESULT WINAPI
SetNameOf(HWND hwndOwner
, PCUITEMID_CHILD pidl
, LPCOLESTR lpName
, DWORD dwFlags
, PITEMID_CHILD
*pPidlOut
);
55 virtual HRESULT WINAPI
GetDefaultSearchGUID(GUID
*pguid
);
56 virtual HRESULT WINAPI
EnumSearches(IEnumExtraSearch
**ppenum
);
57 virtual HRESULT WINAPI
GetDefaultColumn(DWORD dwRes
, ULONG
*pSort
, ULONG
*pDisplay
);
58 virtual HRESULT WINAPI
GetDefaultColumnState(UINT iColumn
, DWORD
*pcsFlags
);
59 virtual HRESULT WINAPI
GetDetailsEx(PCUITEMID_CHILD pidl
, const SHCOLUMNID
*pscid
, VARIANT
*pv
);
60 virtual HRESULT WINAPI
GetDetailsOf(PCUITEMID_CHILD pidl
, UINT iColumn
, SHELLDETAILS
*psd
);
61 virtual HRESULT WINAPI
MapColumnToSCID(UINT column
, SHCOLUMNID
*pscid
);
64 virtual HRESULT WINAPI
GetClassID(CLSID
*lpClassId
);
65 virtual HRESULT WINAPI
Initialize(PCIDLIST_ABSOLUTE pidl
);
66 virtual HRESULT WINAPI
GetCurFolder(PIDLIST_ABSOLUTE
*pidl
);
69 virtual HRESULT WINAPI
Execute(LPSHELLEXECUTEINFOW pei
);
72 ~CNetworkConnections();
75 /* both paths are parsible from the desktop */
76 PIDLIST_ABSOLUTE m_pidlRoot
;
77 IOleCommandTarget
*m_lpOleCmd
;
80 class CNetConUiObject final
:
82 public IObjectWithSite
,
87 CNetConUiObject(PCUITEMID_CHILD pidl
, IOleCommandTarget
*lpOleCmd
);
90 virtual HRESULT WINAPI
QueryInterface(REFIID riid
, LPVOID
*ppvOut
);
91 virtual ULONG WINAPI
AddRef();
92 virtual ULONG WINAPI
Release();
95 virtual HRESULT WINAPI
QueryContextMenu(HMENU hmenu
, UINT indexMenu
, UINT idCmdFirst
, UINT idCmdLast
, UINT uFlags
);
96 virtual HRESULT WINAPI
InvokeCommand(LPCMINVOKECOMMANDINFO lpici
);
97 virtual HRESULT WINAPI
GetCommandString(UINT_PTR idCmd
, UINT uType
, UINT
*pwReserved
, LPSTR pszName
, UINT cchMax
);
98 virtual HRESULT WINAPI
HandleMenuMsg( UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
99 virtual HRESULT WINAPI
HandleMenuMsg2(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*plResult
);
102 virtual HRESULT WINAPI
SetSite(IUnknown
*punk
);
103 virtual HRESULT WINAPI
GetSite(REFIID iid
, void **ppvSite
);
106 virtual HRESULT WINAPI
GetInfoFlags(DWORD
*pdwFlags
);
107 virtual HRESULT WINAPI
GetInfoTip(DWORD dwFlags
, WCHAR
**ppwszTip
);
110 virtual HRESULT STDMETHODCALLTYPE
GetIconLocation(UINT uFlags
, LPWSTR szIconFile
, UINT cchMax
, int *piIndex
, UINT
*pwFlags
);
111 virtual HRESULT STDMETHODCALLTYPE
Extract(LPCWSTR pszFile
, UINT nIconIndex
, HICON
*phiconLarge
, HICON
*phiconSmall
, UINT nIconSize
);
117 PCUITEMID_CHILD m_pidl
;
118 IUnknown
*m_pUnknown
;
119 IOleCommandTarget
*m_lpOleCmd
;
122 static const shvheader NetConnectSFHeader
[] = {
123 {IDS_SHV_COLUMN_NAME
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 20},
124 {IDS_SHV_COLUMN_TYPE
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 8},
125 {IDS_SHV_COLUMN_STATE
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 10},
126 {IDS_SHV_COLUMN_DEVNAME
, SHCOLSTATE_TYPE_DATE
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 12},
127 {IDS_SHV_COLUMN_PHONE
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 10},
128 {IDS_SHV_COLUMN_OWNER
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 5}
131 #define NETCONNECTSHELLVIEWCOLUMNS 6
133 #define COLUMN_NAME 0
134 #define COLUMN_TYPE 1
135 #define COLUMN_STATUS 2
136 #define COLUMN_DEVNAME 3
137 #define COLUMN_PHONE 4
138 #define COLUMN_OWNER 5
140 HRESULT
ShowNetConnectionStatus(IOleCommandTarget
* lpOleCmd
, INetConnection
* pNetConnect
, HWND hwnd
);
142 CNetworkConnections::CNetworkConnections() :
144 m_pidlRoot(_ILCreateNetConnect())
147 hr
= CoCreateInstance(CLSID_LanConnectStatusUI
, NULL
, CLSCTX_INPROC_SERVER
, IID_IOleCommandTarget
, reinterpret_cast<PVOID
*>(&m_lpOleCmd
));
150 ERR("CoCreateInstance failed with %lx\n", hr
);
155 CNetworkConnections::~CNetworkConnections()
158 m_lpOleCmd
->Release();
162 /**************************************************************************
163 * ISF_NetConnect_fnQueryInterface
166 * supports not IPersist/IPersistFolder
168 HRESULT WINAPI
CNetworkConnections::QueryInterface(REFIID riid
, LPVOID
*ppvObj
)
172 if (IsEqualIID(riid
, IID_IUnknown
) ||
173 IsEqualIID(riid
, IID_IShellFolder
) ||
174 IsEqualIID(riid
, IID_IShellFolder2
))
176 *ppvObj
= static_cast<IShellFolder2
*>(this);
178 else if (IsEqualIID (riid
, IID_IPersistFolder
) ||
179 IsEqualIID (riid
, IID_IPersistFolder2
))
181 *ppvObj
= static_cast<IPersistFolder2
*>(this);
183 else if (IsEqualIID(riid
, IID_IShellExecuteHookW
))
185 *ppvObj
= static_cast<IShellExecuteHookW
*>(this);
188 else if (IsEqualIID(riid
, IID_IPersistIDList
))
190 //*ppvObj = static_cast<IPersistIDList*>(this);
200 * IID_IPersistFreeThreadedObject
201 * IID_IBrowserFrameOptions
202 * IID_IShellIconOverlay
207 return E_NOINTERFACE
;
210 ULONG WINAPI
CNetworkConnections::AddRef()
212 ULONG refCount
= InterlockedIncrement(&m_ref
);
217 ULONG WINAPI
CNetworkConnections::Release()
219 ULONG refCount
= InterlockedDecrement(&m_ref
);
227 /**************************************************************************
228 * ISF_NetConnect_fnParseDisplayName
230 HRESULT WINAPI
CNetworkConnections::ParseDisplayName (
231 HWND hwndOwner
, LPBC pbcReserved
, LPOLESTR lpszDisplayName
,
232 DWORD
* pchEaten
, PIDLIST_RELATIVE
* 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
= static_cast<LPENUMIDLIST
>(pList
);
299 return E_OUTOFMEMORY
;
302 CreateNetConnectEnumList(pList
, dwFlags
);
306 /**************************************************************************
307 * ISF_NetConnect_fnBindToObject
309 HRESULT WINAPI
CNetworkConnections::BindToObject (
310 PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
* ppvOut
)
315 /**************************************************************************
316 * ISF_NetConnect_fnBindToStorage
318 HRESULT WINAPI
CNetworkConnections::BindToStorage(
319 PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
* ppvOut
)
325 /**************************************************************************
326 * ISF_NetConnect_fnCompareIDs
329 HRESULT WINAPI
CNetworkConnections::CompareIDs(
330 LPARAM lParam
, PCUIDLIST_RELATIVE pidl1
, PCUIDLIST_RELATIVE pidl2
)
335 /**************************************************************************
336 * ISF_NetConnect_fnCreateViewObject
338 HRESULT WINAPI
CNetworkConnections::CreateViewObject(
339 HWND hwndOwner
, REFIID riid
, LPVOID
* ppvOut
)
342 HRESULT hr
= E_NOINTERFACE
;
349 if (IsEqualIID(riid
, IID_IShellView
))
351 ZeroMemory(&cvf
, sizeof(cvf
));
352 cvf
.cbSize
= sizeof(cvf
);
353 cvf
.pshf
= static_cast<IShellFolder
*>(this);
355 IShellView
* pShellView
;
356 hr
= SHCreateShellFolderViewEx(&cvf
, &pShellView
);
359 hr
= pShellView
->QueryInterface(riid
, ppvOut
);
360 pShellView
->Release();
367 /**************************************************************************
368 * ISF_NetConnect_fnGetAttributesOf
370 HRESULT WINAPI
CNetworkConnections::GetAttributesOf(
371 UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, DWORD
* rgfInOut
)
373 //IGenericSFImpl *This = (IGenericSFImpl *)iface;
375 static const DWORD dwNetConnectAttributes
= SFGAO_STORAGE
| SFGAO_HASPROPSHEET
| SFGAO_STORAGEANCESTOR
|
376 SFGAO_FILESYSANCESTOR
| SFGAO_FOLDER
| SFGAO_FILESYSTEM
| SFGAO_HASSUBFOLDER
| SFGAO_CANRENAME
| SFGAO_CANDELETE
;
378 static const DWORD dwNetConnectItemAttributes
= SFGAO_HASPROPSHEET
| SFGAO_STORAGEANCESTOR
|
379 SFGAO_FILESYSANCESTOR
| SFGAO_CANRENAME
;
391 *rgfInOut
= dwNetConnectAttributes
;
393 *rgfInOut
= dwNetConnectItemAttributes
;
395 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
396 *rgfInOut
&= ~SFGAO_VALIDATE
;
401 /**************************************************************************
402 * ISF_NetConnect_fnGetUIObjectOf
405 * hwndOwner [in] Parent window for any output
406 * cidl [in] array size
407 * apidl [in] simple pidl array
408 * riid [in] Requested Interface
409 * prgfInOut [ ] reserved
410 * ppvObject [out] Resulting Interface
414 HRESULT
IContextMenuImpl_Constructor(REFIID riid
, PCUITEMID_CHILD pidl
, LPVOID
* ppvOut
, IOleCommandTarget
* lpOleCmd
)
416 CNetConUiObject
*pMenu
= new CNetConUiObject(pidl
, lpOleCmd
);
418 return E_OUTOFMEMORY
;
421 HRESULT hr
= pMenu
->QueryInterface(riid
, ppvOut
);
426 HRESULT WINAPI
CNetworkConnections::GetUIObjectOf(
427 HWND hwndOwner
, UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, REFIID riid
,
428 UINT
* prgfInOut
, LPVOID
* ppvOut
)
430 IUnknown
*pObj
= NULL
;
431 HRESULT hr
= E_INVALIDARG
;
438 if ((IsEqualIID(riid
, IID_IContextMenu
) || IsEqualIID (riid
, IID_IContextMenu2
) || IsEqualIID(riid
, IID_IContextMenu3
) ||
439 IsEqualIID(riid
, IID_IQueryInfo
) || IsEqualIID(riid
, IID_IExtractIconW
)) && cidl
>= 1)
441 return IContextMenuImpl_Constructor(riid
, apidl
[0], ppvOut
, m_lpOleCmd
);
450 /**************************************************************************
451 * ISF_NetConnect_fnGetDisplayNameOf
454 HRESULT WINAPI
CNetworkConnections::GetDisplayNameOf(PCUITEMID_CHILD pidl
, DWORD dwFlags
, LPSTRRET strRet
)
458 NETCON_PROPERTIES
* pProperties
;
459 const VALUEStruct
* val
;
464 pszName
= static_cast<LPWSTR
>(CoTaskMemAlloc(MAX_PATH
* sizeof(WCHAR
)));
466 return E_OUTOFMEMORY
;
468 if (_ILIsNetConnect(pidl
))
470 if (LoadStringW(netshell_hInstance
, IDS_NETWORKCONNECTION
, pszName
, MAX_PATH
))
472 pszName
[MAX_PATH
-1] = L
'\0';
478 val
= _ILGetValueStruct(pidl
);
481 if (val
->pItem
->GetProperties(&pProperties
) == S_OK
)
483 if (pProperties
->pszwName
)
485 wcscpy(pszName
, pProperties
->pszwName
);
488 NcFreeNetconProperties(pProperties
);
496 strRet
->uType
= STRRET_WSTR
;
497 strRet
->pOleStr
= pszName
;
501 CoTaskMemFree(pszName
);
507 /**************************************************************************
508 * ISF_NetConnect_fnSetNameOf
509 * Changes the name of a file object or subfolder, possibly changing its item
510 * identifier in the process.
513 * hwndOwner [in] Owner window for output
514 * pidl [in] simple pidl of item to change
515 * lpszName [in] the items new display name
516 * dwFlags [in] SHGNO formatting flags
517 * ppidlOut [out] simple pidl returned
519 HRESULT WINAPI
CNetworkConnections::SetNameOf (
520 HWND hwndOwner
, PCUITEMID_CHILD pidl
, /*simple pidl */
521 LPCOLESTR lpName
, DWORD dwFlags
, PITEMID_CHILD
* pPidlOut
)
523 const VALUEStruct
* val
;
525 val
= _ILGetValueStruct(pidl
);
532 return val
->pItem
->Rename(lpName
);
535 HRESULT WINAPI
CNetworkConnections::GetDefaultSearchGUID(GUID
* pguid
)
540 HRESULT WINAPI
CNetworkConnections::EnumSearches(IEnumExtraSearch
** ppenum
)
545 HRESULT WINAPI
CNetworkConnections::GetDefaultColumn(DWORD dwRes
, ULONG
* pSort
, ULONG
* pDisplay
)
555 HRESULT WINAPI
CNetworkConnections::GetDefaultColumnState(UINT iColumn
, DWORD
* pcsFlags
)
557 if (!pcsFlags
|| iColumn
>= NETCONNECTSHELLVIEWCOLUMNS
)
559 *pcsFlags
= NetConnectSFHeader
[iColumn
].pcsFlags
;
563 HRESULT WINAPI
CNetworkConnections::GetDetailsEx(
564 PCUITEMID_CHILD pidl
, const SHCOLUMNID
* pscid
, VARIANT
* pv
)
569 HRESULT WINAPI
CNetworkConnections::GetDetailsOf(
570 PCUITEMID_CHILD pidl
, UINT iColumn
, SHELLDETAILS
* psd
)
572 WCHAR buffer
[MAX_PATH
] = {0};
574 const VALUEStruct
* val
;
575 NETCON_PROPERTIES
* pProperties
;
577 if (iColumn
>= NETCONNECTSHELLVIEWCOLUMNS
)
580 psd
->fmt
= NetConnectSFHeader
[iColumn
].fmt
;
581 psd
->cxChar
= NetConnectSFHeader
[iColumn
].cxChar
;
584 psd
->str
.uType
= STRRET_WSTR
;
585 if (LoadStringW(netshell_hInstance
, NetConnectSFHeader
[iColumn
].colnameid
, buffer
, MAX_PATH
))
586 hr
= SHStrDupW(buffer
, &psd
->str
.pOleStr
);
591 if (iColumn
== COLUMN_NAME
)
593 psd
->str
.uType
= STRRET_WSTR
;
594 return GetDisplayNameOf(pidl
, SHGDN_NORMAL
, &psd
->str
);
597 val
= _ILGetValueStruct(pidl
);
604 if (val
->pItem
->GetProperties(&pProperties
) != S_OK
)
611 if (pProperties
->MediaType
== NCM_LAN
|| pProperties
->MediaType
== NCM_SHAREDACCESSHOST_RAS
)
613 if (LoadStringW(netshell_hInstance
, IDS_TYPE_ETHERNET
, buffer
, MAX_PATH
))
615 psd
->str
.uType
= STRRET_WSTR
;
616 hr
= SHStrDupW(buffer
, &psd
->str
.pOleStr
);
622 if (pProperties
->Status
== NCS_HARDWARE_DISABLED
)
623 LoadStringW(netshell_hInstance
, IDS_STATUS_NON_OPERATIONAL
, buffer
, MAX_PATH
);
624 else if (pProperties
->Status
== NCS_DISCONNECTED
)
625 LoadStringW(netshell_hInstance
, IDS_STATUS_UNREACHABLE
, buffer
, MAX_PATH
);
626 else if (pProperties
->Status
== NCS_MEDIA_DISCONNECTED
)
627 LoadStringW(netshell_hInstance
, IDS_STATUS_DISCONNECTED
, buffer
, MAX_PATH
);
628 else if (pProperties
->Status
== NCS_CONNECTING
)
629 LoadStringW(netshell_hInstance
, IDS_STATUS_CONNECTING
, buffer
, MAX_PATH
);
630 else if (pProperties
->Status
== NCS_CONNECTED
)
631 LoadStringW(netshell_hInstance
, IDS_STATUS_CONNECTED
, buffer
, MAX_PATH
);
635 buffer
[MAX_PATH
-1] = L
'\0';
636 psd
->str
.uType
= STRRET_WSTR
;
637 hr
= SHStrDupW(buffer
, &psd
->str
.pOleStr
);
641 if (pProperties
->pszwDeviceName
)
643 wcscpy(buffer
, pProperties
->pszwDeviceName
);
644 buffer
[MAX_PATH
-1] = L
'\0';
645 psd
->str
.uType
= STRRET_WSTR
;
646 hr
= SHStrDupW(buffer
, &psd
->str
.pOleStr
);
650 psd
->str
.cStr
[0] = '\0';
651 psd
->str
.uType
= STRRET_CSTR
;
656 psd
->str
.cStr
[0] = '\0';
657 psd
->str
.uType
= STRRET_CSTR
;
661 NcFreeNetconProperties(pProperties
);
665 HRESULT WINAPI
CNetworkConnections::MapColumnToSCID(UINT column
, SHCOLUMNID
*pscid
)
671 //IInternetSecurityManager
673 /**************************************************************************
674 * IContextMenu2 Implementation
677 CNetConUiObject::CNetConUiObject(PCUITEMID_CHILD pidl
, IOleCommandTarget
*lpOleCmd
)
684 m_lpOleCmd
->AddRef();
687 CNetConUiObject::~CNetConUiObject()
690 m_lpOleCmd
->Release();
693 /************************************************************************
694 * ISF_NetConnect_IContextMenu_QueryInterface
696 HRESULT WINAPI
CNetConUiObject::QueryInterface(REFIID iid
, LPVOID
*ppvObject
)
700 if (IsEqualIID(iid
, IID_IContextMenu
) || IsEqualIID(iid
, IID_IContextMenu2
) || IsEqualIID(iid
, IID_IContextMenu3
))
701 *ppvObject
= static_cast<IContextMenu3
*>(this);
702 else if (IsEqualIID(iid
, IID_IObjectWithSite
))
703 *ppvObject
= static_cast<IObjectWithSite
*>(this);
704 else if (IsEqualIID(iid
, IID_IQueryInfo
))
705 *ppvObject
= static_cast<IQueryInfo
*>(this);
706 else if (IsEqualIID(iid
, IID_IExtractIconW
))
707 *ppvObject
= static_cast<IExtractIconW
*>(this);
716 //StringFromCLSID(iid, &pStr);
717 //MessageBoxW(NULL, L"ISF_NetConnect_IContextMenu2_QueryInterface unhandled", pStr, MB_OK);
718 return E_NOINTERFACE
;
721 /************************************************************************
722 * ISF_NetConnect_IContextMenu_AddRef
724 ULONG WINAPI
CNetConUiObject::AddRef()
728 refCount
= InterlockedIncrement(&m_ref
);
733 /************************************************************************
734 * ISF_NetConnect_IContextMenu_Release
736 ULONG WINAPI
CNetConUiObject::Release()
740 refCount
= InterlockedDecrement(&m_ref
);
747 void WINAPI
_InsertMenuItemW (
759 ZeroMemory(&mii
, sizeof(mii
));
760 mii
.cbSize
= sizeof(mii
);
761 if (fType
== MFT_SEPARATOR
)
763 mii
.fMask
= MIIM_ID
| MIIM_TYPE
;
765 else if (fType
== MFT_STRING
)
767 mii
.fMask
= MIIM_ID
| MIIM_TYPE
| MIIM_STATE
;
768 if ((ULONG_PTR
)HIWORD((ULONG_PTR
)dwTypeData
) == 0)
770 if (LoadStringW(netshell_hInstance
, LOWORD((ULONG_PTR
)dwTypeData
), szText
, sizeof(szText
)/sizeof(WCHAR
)))
772 szText
[(sizeof(szText
)/sizeof(WCHAR
))-1] = 0;
773 mii
.dwTypeData
= szText
;
782 mii
.dwTypeData
= (LPWSTR
) dwTypeData
;
789 InsertMenuItemW( hmenu
, indexMenu
, fByPosition
, &mii
);
792 /**************************************************************************
793 * ISF_NetConnect_IContextMenu_QueryContextMenu()
795 HRESULT WINAPI
CNetConUiObject::QueryContextMenu(
802 const VALUEStruct
* val
;
803 NETCON_PROPERTIES
* pProperties
;
805 val
= _ILGetValueStruct(m_pidl
);
809 if (val
->pItem
->GetProperties(&pProperties
) != S_OK
)
812 if (pProperties
->Status
== NCS_HARDWARE_DISABLED
)
813 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_ACTIVATE
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_ACTIVATE
), MFS_DEFAULT
);
815 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_DEACTIVATE
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_DEACTIVATE
), MFS_ENABLED
);
817 if (pProperties
->Status
== NCS_HARDWARE_DISABLED
|| pProperties
->Status
== NCS_MEDIA_DISCONNECTED
|| pProperties
->Status
== NCS_DISCONNECTED
)
818 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_STATUS
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_STATUS
), MFS_GRAYED
);
819 else if (pProperties
->Status
== NCS_CONNECTED
)
820 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_STATUS
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_STATUS
), MFS_DEFAULT
);
822 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_STATUS
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_STATUS
), MFS_ENABLED
);
824 if (pProperties
->Status
== NCS_HARDWARE_DISABLED
|| pProperties
->Status
== NCS_MEDIA_DISCONNECTED
)
825 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_REPAIR
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_REPAIR
), MFS_GRAYED
);
827 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_REPAIR
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_REPAIR
), MFS_ENABLED
);
829 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, -1, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
830 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_CREATELINK
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_CREATELINK
), MFS_ENABLED
);
832 if (pProperties
->dwCharacter
& NCCF_ALLOW_REMOVAL
)
833 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_DELETE
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_DELETE
), MFS_ENABLED
);
835 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_DELETE
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_DELETE
), MFS_GRAYED
);
837 if (pProperties
->dwCharacter
& NCCF_ALLOW_RENAME
)
838 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_RENAME
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_RENAME
), MFS_ENABLED
);
840 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_RENAME
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_RENAME
), MFS_GRAYED
);
842 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, -1, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
843 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_PROPERTIES
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_PROPERTIES
), MFS_ENABLED
);
844 NcFreeNetconProperties(pProperties
);
845 return MAKE_HRESULT(SEVERITY_SUCCESS
, 0, 9);
850 PropSheetExCallback(HPROPSHEETPAGE hPage
, LPARAM lParam
)
852 PROPSHEETHEADERW
*pinfo
= (PROPSHEETHEADERW
*)lParam
;
854 if (pinfo
->nPages
< MAX_PROPERTY_SHEET_PAGE
)
856 pinfo
->phpage
[pinfo
->nPages
++] = hPage
;
863 ShowNetConnectionStatus(
864 IOleCommandTarget
*lpOleCmd
,
865 INetConnection
*pNetConnect
,
868 NETCON_PROPERTIES
*pProperties
;
874 if (pNetConnect
->GetProperties(&pProperties
) != S_OK
)
877 hr
= lpOleCmd
->Exec(&pProperties
->guidId
, OLECMDID_NEW
, OLECMDEXECOPT_DODEFAULT
, NULL
, NULL
);
879 NcFreeNetconProperties(pProperties
);
884 ShowNetConnectionProperties(
885 INetConnection
*pNetConnect
,
890 PROPSHEETHEADERW pinfo
;
891 HPROPSHEETPAGE hppages
[MAX_PROPERTY_SHEET_PAGE
];
892 INetConnectionPropertyUi
* pNCP
;
893 NETCON_PROPERTIES
* pProperties
;
895 if (pNetConnect
->GetProperties(&pProperties
) != S_OK
)
898 hr
= pNetConnect
->GetUiObjectClassId(&ClassID
);
901 NcFreeNetconProperties(pProperties
);
905 hr
= CoCreateInstance(ClassID
, NULL
, CLSCTX_INPROC_SERVER
, IID_INetConnectionPropertyUi
, (LPVOID
*)&pNCP
);
908 NcFreeNetconProperties(pProperties
);
912 hr
= pNCP
->SetConnection(pNetConnect
);
915 ZeroMemory(&pinfo
, sizeof(PROPSHEETHEADERW
));
916 ZeroMemory(hppages
, sizeof(hppages
));
917 pinfo
.dwSize
= sizeof(PROPSHEETHEADERW
);
918 pinfo
.dwFlags
= PSH_NOCONTEXTHELP
| PSH_PROPTITLE
| PSH_NOAPPLYNOW
;
919 pinfo
.phpage
= hppages
;
920 pinfo
.hwndParent
= hwnd
;
922 pinfo
.pszCaption
= pProperties
->pszwName
;
923 hr
= pNCP
->AddPages(hwnd
, PropSheetExCallback
, (LPARAM
)&pinfo
);
926 if (PropertySheetW(&pinfo
) < 0)
931 NcFreeNetconProperties(pProperties
);
936 /**************************************************************************
937 * ISF_NetConnect_IContextMenu_InvokeCommand()
939 HRESULT WINAPI
CNetConUiObject::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi
)
941 const VALUEStruct
* val
;
943 val
= _ILGetValueStruct(m_pidl
);
947 if (lpcmi
->lpVerb
== MAKEINTRESOURCEA(IDS_NET_STATUS
) ||
948 lpcmi
->lpVerb
== MAKEINTRESOURCEA(IDS_NET_STATUS
-1)) //HACK for Windows XP
950 return ShowNetConnectionStatus(m_lpOleCmd
, val
->pItem
, lpcmi
->hwnd
);
952 else if (lpcmi
->lpVerb
== MAKEINTRESOURCEA(IDS_NET_PROPERTIES
) ||
953 lpcmi
->lpVerb
== MAKEINTRESOURCEA(10099)) //HACK for Windows XP
955 /* FIXME perform version checks */
956 return ShowNetConnectionProperties(val
->pItem
, lpcmi
->hwnd
);
962 /**************************************************************************
963 * ISF_NetConnect_IContextMenu_GetCommandString()
966 HRESULT WINAPI
CNetConUiObject::GetCommandString(
976 /**************************************************************************
977 * ISF_NetConnect_IContextMenu_HandleMenuMsg()
979 HRESULT WINAPI
CNetConUiObject::HandleMenuMsg(
987 HRESULT WINAPI
CNetConUiObject::HandleMenuMsg2(
996 HRESULT WINAPI
CNetConUiObject::GetSite(REFIID riid
, PVOID
*ppvSite
)
1007 hr
= m_pUnknown
->QueryInterface(riid
, reinterpret_cast<PVOID
*>(&pUnknown
));
1011 *ppvSite
= pUnknown
;
1019 HRESULT WINAPI
CNetConUiObject::SetSite(IUnknown
*pUnkSite
)
1025 m_pUnknown
->Release();
1033 m_pUnknown
->Release();
1034 m_pUnknown
= pUnkSite
;
1040 /************************************************************************
1041 * ISF_NetConnect_IExtractIcon_GetIconLocation
1043 HRESULT WINAPI
CNetConUiObject::GetIconLocation(
1050 const VALUEStruct
*val
;
1051 NETCON_PROPERTIES
*pProperties
;
1054 if (!GetModuleFileNameW(netshell_hInstance
, szIconFile
, cchMax
))
1056 ERR("GetModuleFileNameW failed\n");
1060 val
= _ILGetValueStruct(m_pidl
);
1063 ERR("_ILGetValueStruct failed\n");
1067 if (val
->pItem
->GetProperties(&pProperties
) != NOERROR
)
1069 ERR("INetConnection_GetProperties failed\n");
1073 if (pProperties
->Status
== NCS_CONNECTED
|| pProperties
->Status
== NCS_CONNECTING
)
1074 *piIndex
= -IDI_NET_IDLE
;
1076 *piIndex
= -IDI_NET_OFF
;
1078 NcFreeNetconProperties(pProperties
);
1083 /************************************************************************
1084 * ISF_NetConnect_IExtractIcon_Extract
1086 HRESULT WINAPI
CNetConUiObject::Extract(
1093 //IContextMenuImpl * This = impl_from_IExtractIcon(iface);
1094 if (nIconIndex
== IDI_NET_IDLE
)
1096 *phiconLarge
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_IDLE
), IMAGE_ICON
, 32, 32, LR_DEFAULTCOLOR
);
1097 *phiconSmall
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_IDLE
), IMAGE_ICON
, 16, 16, LR_DEFAULTCOLOR
);
1100 else if (nIconIndex
== IDI_NET_OFF
)
1102 *phiconLarge
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_OFF
), IMAGE_ICON
, 32, 32, LR_DEFAULTCOLOR
);
1103 *phiconSmall
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_OFF
), IMAGE_ICON
, 16, 16, LR_DEFAULTCOLOR
);
1110 /************************************************************************
1111 * ISF_NetConnect_PersistFolder2_GetClassID
1113 HRESULT WINAPI
CNetworkConnections::GetClassID(CLSID
*lpClassId
)
1118 *lpClassId
= CLSID_NetworkConnections
;
1123 /************************************************************************
1124 * ISF_NetConnect_PersistFolder2_Initialize
1126 * NOTES: it makes no sense to change the pidl
1128 HRESULT WINAPI
CNetworkConnections::Initialize(PCIDLIST_ABSOLUTE pidl
)
1131 m_pidlRoot
= ILClone(pidl
);
1136 /**************************************************************************
1137 * ISF_NetConnect_PersistFolder2_GetCurFolder
1139 HRESULT WINAPI
CNetworkConnections::GetCurFolder(PIDLIST_ABSOLUTE
*pidl
)
1144 *pidl
= ILClone(m_pidlRoot
);
1149 /************************************************************************
1150 * ISF_NetConnect_ShellExecuteHookW_Execute
1152 HRESULT WINAPI
CNetworkConnections::Execute(LPSHELLEXECUTEINFOW pei
)
1154 const VALUEStruct
*val
;
1155 NETCON_PROPERTIES
* pProperties
;
1157 val
= _ILGetValueStruct(ILFindLastID((ITEMIDLIST
*)pei
->lpIDList
));
1161 if (val
->pItem
->GetProperties(&pProperties
) != NOERROR
)
1164 if (pProperties
->Status
== NCS_CONNECTED
)
1166 NcFreeNetconProperties(pProperties
);
1167 return ShowNetConnectionStatus(m_lpOleCmd
, val
->pItem
, pei
->hwnd
);
1170 NcFreeNetconProperties(pProperties
);
1175 HRESULT WINAPI
CNetConUiObject::GetInfoFlags(DWORD
*pdwFlags
)
1182 /************************************************************************
1183 * ISF_NetConnect_PersistFolder2_Initialize
1185 * NOTES: it makes no sense to change the pidl
1187 HRESULT WINAPI
CNetConUiObject::GetInfoTip(DWORD dwFlags
, WCHAR
**ppwszTip
)
1193 /**************************************************************************
1194 * ISF_NetConnect_Constructor
1196 HRESULT WINAPI
ISF_NetConnect_Constructor(IUnknown
*pUnkOuter
, REFIID riid
, LPVOID
*ppv
)
1198 TRACE("ISF_NetConnect_Constructor\n");
1203 return CLASS_E_NOAGGREGATION
;
1205 CNetworkConnections
*pnc
= new CNetworkConnections
;
1207 return E_OUTOFMEMORY
;
1210 HRESULT hr
= pnc
->QueryInterface(riid
, ppv
);