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
:
30 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_ConnectionTray
, 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_IPersist
) ||
174 IsEqualIID (riid
, IID_IPersistFolder
) ||
175 IsEqualIID (riid
, IID_IPersistFolder2
))
177 *ppvObj
= static_cast<IPersistFolder2
*>(this);
179 else if (IsEqualIID(riid
, IID_IShellFolder
) ||
180 IsEqualIID(riid
, IID_IShellFolder2
))
182 *ppvObj
= static_cast<IShellFolder2
*>(this);
184 else if (IsEqualIID(riid
, IID_IShellExecuteHookW
))
186 *ppvObj
= static_cast<IShellExecuteHookW
*>(this);
197 * IID_IOleCommandTarget
198 * IID_IShellFolderViewCB
201 return E_NOINTERFACE
;
204 ULONG WINAPI
CNetworkConnections::AddRef()
206 ULONG refCount
= InterlockedIncrement(&m_ref
);
211 ULONG WINAPI
CNetworkConnections::Release()
213 ULONG refCount
= InterlockedDecrement(&m_ref
);
221 /**************************************************************************
222 * ISF_NetConnect_fnParseDisplayName
224 HRESULT WINAPI
CNetworkConnections::ParseDisplayName (
225 HWND hwndOwner
, LPBC pbcReserved
, LPOLESTR lpszDisplayName
,
226 DWORD
* pchEaten
, PIDLIST_RELATIVE
* ppidl
, DWORD
* pdwAttributes
)
228 HRESULT hr
= E_UNEXPECTED
;
232 *pchEaten
= 0; /* strange but like the original */
237 /**************************************************************************
238 * CreateNetConnectEnumList()
240 static BOOL
CreateNetConnectEnumList(CEnumIDList
*list
, DWORD dwFlags
)
243 INetConnectionManager
*pNetConMan
;
244 IEnumNetConnection
*pEnumCon
;
245 INetConnection
*INetCon
;
249 /* get an instance to of IConnectionManager */
250 hr
= INetConnectionManager_Constructor(NULL
, IID_INetConnectionManager
, (LPVOID
*)&pNetConMan
);
254 hr
= pNetConMan
->EnumConnections(NCME_DEFAULT
, &pEnumCon
);
257 pNetConMan
->Release();
263 hr
= pEnumCon
->Next(1, &INetCon
, &Count
);
266 pidl
= ILCreateNetConnectItem(INetCon
);
269 list
->AddToEnumList(pidl
);
279 pNetConMan
->Release();
284 /**************************************************************************
285 * ISF_NetConnect_fnEnumObjects
287 HRESULT WINAPI
CNetworkConnections::EnumObjects(
288 HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
*ppEnumIDList
)
290 CEnumIDList
*pList
= new CEnumIDList
;
291 *ppEnumIDList
= static_cast<LPENUMIDLIST
>(pList
);
293 return E_OUTOFMEMORY
;
296 CreateNetConnectEnumList(pList
, dwFlags
);
300 /**************************************************************************
301 * ISF_NetConnect_fnBindToObject
303 HRESULT WINAPI
CNetworkConnections::BindToObject (
304 PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
* ppvOut
)
309 /**************************************************************************
310 * ISF_NetConnect_fnBindToStorage
312 HRESULT WINAPI
CNetworkConnections::BindToStorage(
313 PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
* ppvOut
)
319 /**************************************************************************
320 * ISF_NetConnect_fnCompareIDs
323 HRESULT WINAPI
CNetworkConnections::CompareIDs(
324 LPARAM lParam
, PCUIDLIST_RELATIVE pidl1
, PCUIDLIST_RELATIVE pidl2
)
329 /**************************************************************************
330 * ISF_NetConnect_fnCreateViewObject
332 HRESULT WINAPI
CNetworkConnections::CreateViewObject(
333 HWND hwndOwner
, REFIID riid
, LPVOID
* ppvOut
)
336 HRESULT hr
= E_NOINTERFACE
;
343 if (IsEqualIID(riid
, IID_IShellView
))
345 ZeroMemory(&cvf
, sizeof(cvf
));
346 cvf
.cbSize
= sizeof(cvf
);
347 cvf
.pshf
= static_cast<IShellFolder
*>(this);
349 IShellView
* pShellView
;
350 hr
= SHCreateShellFolderViewEx(&cvf
, &pShellView
);
353 hr
= pShellView
->QueryInterface(riid
, ppvOut
);
354 pShellView
->Release();
361 /**************************************************************************
362 * ISF_NetConnect_fnGetAttributesOf
364 HRESULT WINAPI
CNetworkConnections::GetAttributesOf(
365 UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, DWORD
* rgfInOut
)
367 //IGenericSFImpl *This = (IGenericSFImpl *)iface;
369 static const DWORD dwNetConnectAttributes
= SFGAO_STORAGE
| SFGAO_HASPROPSHEET
| SFGAO_STORAGEANCESTOR
|
370 SFGAO_FILESYSANCESTOR
| SFGAO_FOLDER
| SFGAO_FILESYSTEM
| SFGAO_HASSUBFOLDER
| SFGAO_CANRENAME
| SFGAO_CANDELETE
;
372 static const DWORD dwNetConnectItemAttributes
= SFGAO_HASPROPSHEET
| SFGAO_STORAGEANCESTOR
|
373 SFGAO_FILESYSANCESTOR
| SFGAO_CANRENAME
;
385 *rgfInOut
= dwNetConnectAttributes
;
387 *rgfInOut
= dwNetConnectItemAttributes
;
389 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
390 *rgfInOut
&= ~SFGAO_VALIDATE
;
395 /**************************************************************************
396 * ISF_NetConnect_fnGetUIObjectOf
399 * hwndOwner [in] Parent window for any output
400 * cidl [in] array size
401 * apidl [in] simple pidl array
402 * riid [in] Requested Interface
403 * prgfInOut [ ] reserved
404 * ppvObject [out] Resulting Interface
408 HRESULT
IContextMenuImpl_Constructor(REFIID riid
, PCUITEMID_CHILD pidl
, LPVOID
* ppvOut
, IOleCommandTarget
* lpOleCmd
)
410 CNetConUiObject
*pMenu
= new CNetConUiObject(pidl
, lpOleCmd
);
412 return E_OUTOFMEMORY
;
415 HRESULT hr
= pMenu
->QueryInterface(riid
, ppvOut
);
420 HRESULT WINAPI
CNetworkConnections::GetUIObjectOf(
421 HWND hwndOwner
, UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, REFIID riid
,
422 UINT
* prgfInOut
, LPVOID
* ppvOut
)
424 IUnknown
*pObj
= NULL
;
425 HRESULT hr
= E_INVALIDARG
;
432 if ((IsEqualIID(riid
, IID_IContextMenu
) || IsEqualIID (riid
, IID_IContextMenu2
) || IsEqualIID(riid
, IID_IContextMenu3
) ||
433 IsEqualIID(riid
, IID_IQueryInfo
) || IsEqualIID(riid
, IID_IExtractIconW
)) && cidl
>= 1)
435 return IContextMenuImpl_Constructor(riid
, apidl
[0], ppvOut
, m_lpOleCmd
);
444 /**************************************************************************
445 * ISF_NetConnect_fnGetDisplayNameOf
448 HRESULT WINAPI
CNetworkConnections::GetDisplayNameOf(PCUITEMID_CHILD pidl
, DWORD dwFlags
, LPSTRRET strRet
)
452 NETCON_PROPERTIES
* pProperties
;
453 const VALUEStruct
* val
;
458 pszName
= static_cast<LPWSTR
>(CoTaskMemAlloc(MAX_PATH
* sizeof(WCHAR
)));
460 return E_OUTOFMEMORY
;
462 if (_ILIsNetConnect(pidl
))
464 if (LoadStringW(netshell_hInstance
, IDS_NETWORKCONNECTION
, pszName
, MAX_PATH
))
466 pszName
[MAX_PATH
-1] = L
'\0';
472 val
= _ILGetValueStruct(pidl
);
475 if (val
->pItem
->GetProperties(&pProperties
) == S_OK
)
477 if (pProperties
->pszwName
)
479 wcscpy(pszName
, pProperties
->pszwName
);
482 NcFreeNetconProperties(pProperties
);
490 strRet
->uType
= STRRET_WSTR
;
491 strRet
->pOleStr
= pszName
;
495 CoTaskMemFree(pszName
);
501 /**************************************************************************
502 * ISF_NetConnect_fnSetNameOf
503 * Changes the name of a file object or subfolder, possibly changing its item
504 * identifier in the process.
507 * hwndOwner [in] Owner window for output
508 * pidl [in] simple pidl of item to change
509 * lpszName [in] the items new display name
510 * dwFlags [in] SHGNO formatting flags
511 * ppidlOut [out] simple pidl returned
513 HRESULT WINAPI
CNetworkConnections::SetNameOf (
514 HWND hwndOwner
, PCUITEMID_CHILD pidl
, /*simple pidl */
515 LPCOLESTR lpName
, DWORD dwFlags
, PITEMID_CHILD
* pPidlOut
)
517 const VALUEStruct
* val
;
519 val
= _ILGetValueStruct(pidl
);
526 return val
->pItem
->Rename(lpName
);
529 HRESULT WINAPI
CNetworkConnections::GetDefaultSearchGUID(GUID
* pguid
)
534 HRESULT WINAPI
CNetworkConnections::EnumSearches(IEnumExtraSearch
** ppenum
)
539 HRESULT WINAPI
CNetworkConnections::GetDefaultColumn(DWORD dwRes
, ULONG
* pSort
, ULONG
* pDisplay
)
549 HRESULT WINAPI
CNetworkConnections::GetDefaultColumnState(UINT iColumn
, DWORD
* pcsFlags
)
551 if (!pcsFlags
|| iColumn
>= NETCONNECTSHELLVIEWCOLUMNS
)
553 *pcsFlags
= NetConnectSFHeader
[iColumn
].pcsFlags
;
557 HRESULT WINAPI
CNetworkConnections::GetDetailsEx(
558 PCUITEMID_CHILD pidl
, const SHCOLUMNID
* pscid
, VARIANT
* pv
)
563 HRESULT WINAPI
CNetworkConnections::GetDetailsOf(
564 PCUITEMID_CHILD pidl
, UINT iColumn
, SHELLDETAILS
* psd
)
566 WCHAR buffer
[MAX_PATH
] = {0};
568 const VALUEStruct
* val
;
569 NETCON_PROPERTIES
* pProperties
;
571 if (iColumn
>= NETCONNECTSHELLVIEWCOLUMNS
)
574 psd
->fmt
= NetConnectSFHeader
[iColumn
].fmt
;
575 psd
->cxChar
= NetConnectSFHeader
[iColumn
].cxChar
;
578 psd
->str
.uType
= STRRET_WSTR
;
579 if (LoadStringW(netshell_hInstance
, NetConnectSFHeader
[iColumn
].colnameid
, buffer
, MAX_PATH
))
580 hr
= SHStrDupW(buffer
, &psd
->str
.pOleStr
);
585 if (iColumn
== COLUMN_NAME
)
587 psd
->str
.uType
= STRRET_WSTR
;
588 return GetDisplayNameOf(pidl
, SHGDN_NORMAL
, &psd
->str
);
591 val
= _ILGetValueStruct(pidl
);
598 if (val
->pItem
->GetProperties(&pProperties
) != S_OK
)
605 if (pProperties
->MediaType
== NCM_LAN
|| pProperties
->MediaType
== NCM_SHAREDACCESSHOST_RAS
)
607 if (LoadStringW(netshell_hInstance
, IDS_TYPE_ETHERNET
, buffer
, MAX_PATH
))
609 psd
->str
.uType
= STRRET_WSTR
;
610 hr
= SHStrDupW(buffer
, &psd
->str
.pOleStr
);
616 if (pProperties
->Status
== NCS_HARDWARE_DISABLED
)
617 LoadStringW(netshell_hInstance
, IDS_STATUS_NON_OPERATIONAL
, buffer
, MAX_PATH
);
618 else if (pProperties
->Status
== NCS_DISCONNECTED
)
619 LoadStringW(netshell_hInstance
, IDS_STATUS_UNREACHABLE
, buffer
, MAX_PATH
);
620 else if (pProperties
->Status
== NCS_MEDIA_DISCONNECTED
)
621 LoadStringW(netshell_hInstance
, IDS_STATUS_DISCONNECTED
, buffer
, MAX_PATH
);
622 else if (pProperties
->Status
== NCS_CONNECTING
)
623 LoadStringW(netshell_hInstance
, IDS_STATUS_CONNECTING
, buffer
, MAX_PATH
);
624 else if (pProperties
->Status
== NCS_CONNECTED
)
625 LoadStringW(netshell_hInstance
, IDS_STATUS_CONNECTED
, buffer
, MAX_PATH
);
629 buffer
[MAX_PATH
-1] = L
'\0';
630 psd
->str
.uType
= STRRET_WSTR
;
631 hr
= SHStrDupW(buffer
, &psd
->str
.pOleStr
);
635 if (pProperties
->pszwDeviceName
)
637 wcscpy(buffer
, pProperties
->pszwDeviceName
);
638 buffer
[MAX_PATH
-1] = L
'\0';
639 psd
->str
.uType
= STRRET_WSTR
;
640 hr
= SHStrDupW(buffer
, &psd
->str
.pOleStr
);
644 psd
->str
.cStr
[0] = '\0';
645 psd
->str
.uType
= STRRET_CSTR
;
650 psd
->str
.cStr
[0] = '\0';
651 psd
->str
.uType
= STRRET_CSTR
;
655 NcFreeNetconProperties(pProperties
);
659 HRESULT WINAPI
CNetworkConnections::MapColumnToSCID(UINT column
, SHCOLUMNID
*pscid
)
665 //IInternetSecurityManager
667 /**************************************************************************
668 * IContextMenu2 Implementation
671 CNetConUiObject::CNetConUiObject(PCUITEMID_CHILD pidl
, IOleCommandTarget
*lpOleCmd
)
678 m_lpOleCmd
->AddRef();
681 CNetConUiObject::~CNetConUiObject()
684 m_lpOleCmd
->Release();
687 /************************************************************************
688 * ISF_NetConnect_IContextMenu_QueryInterface
690 HRESULT WINAPI
CNetConUiObject::QueryInterface(REFIID iid
, LPVOID
*ppvObject
)
694 if (IsEqualIID(iid
, IID_IContextMenu
) || IsEqualIID(iid
, IID_IContextMenu2
) || IsEqualIID(iid
, IID_IContextMenu3
))
695 *ppvObject
= static_cast<IContextMenu3
*>(this);
696 else if (IsEqualIID(iid
, IID_IObjectWithSite
))
697 *ppvObject
= static_cast<IObjectWithSite
*>(this);
698 else if (IsEqualIID(iid
, IID_IQueryInfo
))
699 *ppvObject
= static_cast<IQueryInfo
*>(this);
700 else if (IsEqualIID(iid
, IID_IExtractIconW
))
701 *ppvObject
= static_cast<IExtractIconW
*>(this);
709 return E_NOINTERFACE
;
712 /************************************************************************
713 * ISF_NetConnect_IContextMenu_AddRef
715 ULONG WINAPI
CNetConUiObject::AddRef()
719 refCount
= InterlockedIncrement(&m_ref
);
724 /************************************************************************
725 * ISF_NetConnect_IContextMenu_Release
727 ULONG WINAPI
CNetConUiObject::Release()
731 refCount
= InterlockedDecrement(&m_ref
);
738 void WINAPI
_InsertMenuItemW (
750 ZeroMemory(&mii
, sizeof(mii
));
751 mii
.cbSize
= sizeof(mii
);
752 if (fType
== MFT_SEPARATOR
)
754 mii
.fMask
= MIIM_ID
| MIIM_TYPE
;
756 else if (fType
== MFT_STRING
)
758 mii
.fMask
= MIIM_ID
| MIIM_TYPE
| MIIM_STATE
;
759 if ((ULONG_PTR
)HIWORD((ULONG_PTR
)dwTypeData
) == 0)
761 if (LoadStringW(netshell_hInstance
, LOWORD((ULONG_PTR
)dwTypeData
), szText
, sizeof(szText
)/sizeof(WCHAR
)))
763 szText
[(sizeof(szText
)/sizeof(WCHAR
))-1] = 0;
764 mii
.dwTypeData
= szText
;
773 mii
.dwTypeData
= (LPWSTR
) dwTypeData
;
780 InsertMenuItemW( hmenu
, indexMenu
, fByPosition
, &mii
);
783 /**************************************************************************
784 * ISF_NetConnect_IContextMenu_QueryContextMenu()
786 HRESULT WINAPI
CNetConUiObject::QueryContextMenu(
793 const VALUEStruct
* val
;
794 NETCON_PROPERTIES
* pProperties
;
796 val
= _ILGetValueStruct(m_pidl
);
800 if (val
->pItem
->GetProperties(&pProperties
) != S_OK
)
803 if (pProperties
->Status
== NCS_HARDWARE_DISABLED
)
804 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_ACTIVATE
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_ACTIVATE
), MFS_DEFAULT
);
806 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_DEACTIVATE
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_DEACTIVATE
), MFS_ENABLED
);
808 if (pProperties
->Status
== NCS_HARDWARE_DISABLED
|| pProperties
->Status
== NCS_MEDIA_DISCONNECTED
|| pProperties
->Status
== NCS_DISCONNECTED
)
809 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_STATUS
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_STATUS
), MFS_GRAYED
);
810 else if (pProperties
->Status
== NCS_CONNECTED
)
811 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_STATUS
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_STATUS
), MFS_DEFAULT
);
813 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_STATUS
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_STATUS
), MFS_ENABLED
);
815 if (pProperties
->Status
== NCS_HARDWARE_DISABLED
|| pProperties
->Status
== NCS_MEDIA_DISCONNECTED
)
816 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_REPAIR
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_REPAIR
), MFS_GRAYED
);
818 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_REPAIR
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_REPAIR
), MFS_ENABLED
);
820 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, -1, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
821 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_CREATELINK
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_CREATELINK
), MFS_ENABLED
);
823 if (pProperties
->dwCharacter
& NCCF_ALLOW_REMOVAL
)
824 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_DELETE
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_DELETE
), MFS_ENABLED
);
826 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_DELETE
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_DELETE
), MFS_GRAYED
);
828 if (pProperties
->dwCharacter
& NCCF_ALLOW_RENAME
)
829 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_RENAME
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_RENAME
), MFS_ENABLED
);
831 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_RENAME
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_RENAME
), MFS_GRAYED
);
833 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, -1, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
834 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_PROPERTIES
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_PROPERTIES
), MFS_ENABLED
);
835 NcFreeNetconProperties(pProperties
);
836 return MAKE_HRESULT(SEVERITY_SUCCESS
, 0, 9);
841 PropSheetExCallback(HPROPSHEETPAGE hPage
, LPARAM lParam
)
843 PROPSHEETHEADERW
*pinfo
= (PROPSHEETHEADERW
*)lParam
;
845 if (pinfo
->nPages
< MAX_PROPERTY_SHEET_PAGE
)
847 pinfo
->phpage
[pinfo
->nPages
++] = hPage
;
854 ShowNetConnectionStatus(
855 IOleCommandTarget
*lpOleCmd
,
856 INetConnection
*pNetConnect
,
859 NETCON_PROPERTIES
*pProperties
;
865 if (pNetConnect
->GetProperties(&pProperties
) != S_OK
)
868 hr
= lpOleCmd
->Exec(&pProperties
->guidId
, OLECMDID_NEW
, OLECMDEXECOPT_DODEFAULT
, NULL
, NULL
);
870 NcFreeNetconProperties(pProperties
);
875 ShowNetConnectionProperties(
876 INetConnection
*pNetConnect
,
881 PROPSHEETHEADERW pinfo
;
882 HPROPSHEETPAGE hppages
[MAX_PROPERTY_SHEET_PAGE
];
883 INetConnectionPropertyUi
* pNCP
;
884 NETCON_PROPERTIES
* pProperties
;
886 if (pNetConnect
->GetProperties(&pProperties
) != S_OK
)
889 hr
= pNetConnect
->GetUiObjectClassId(&ClassID
);
892 NcFreeNetconProperties(pProperties
);
896 hr
= CoCreateInstance(ClassID
, NULL
, CLSCTX_INPROC_SERVER
, IID_INetConnectionPropertyUi
, (LPVOID
*)&pNCP
);
899 NcFreeNetconProperties(pProperties
);
903 hr
= pNCP
->SetConnection(pNetConnect
);
906 ZeroMemory(&pinfo
, sizeof(PROPSHEETHEADERW
));
907 ZeroMemory(hppages
, sizeof(hppages
));
908 pinfo
.dwSize
= sizeof(PROPSHEETHEADERW
);
909 pinfo
.dwFlags
= PSH_NOCONTEXTHELP
| PSH_PROPTITLE
| PSH_NOAPPLYNOW
;
910 pinfo
.phpage
= hppages
;
911 pinfo
.hwndParent
= hwnd
;
913 pinfo
.pszCaption
= pProperties
->pszwName
;
914 hr
= pNCP
->AddPages(hwnd
, PropSheetExCallback
, (LPARAM
)&pinfo
);
917 if (PropertySheetW(&pinfo
) < 0)
922 NcFreeNetconProperties(pProperties
);
927 /**************************************************************************
928 * ISF_NetConnect_IContextMenu_InvokeCommand()
930 HRESULT WINAPI
CNetConUiObject::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi
)
932 const VALUEStruct
* val
;
934 val
= _ILGetValueStruct(m_pidl
);
938 if (lpcmi
->lpVerb
== MAKEINTRESOURCEA(IDS_NET_STATUS
) ||
939 lpcmi
->lpVerb
== MAKEINTRESOURCEA(IDS_NET_STATUS
-1)) //HACK for Windows XP
941 return ShowNetConnectionStatus(m_lpOleCmd
, val
->pItem
, lpcmi
->hwnd
);
943 else if (lpcmi
->lpVerb
== MAKEINTRESOURCEA(IDS_NET_PROPERTIES
) ||
944 lpcmi
->lpVerb
== MAKEINTRESOURCEA(10099)) //HACK for Windows XP
946 /* FIXME perform version checks */
947 return ShowNetConnectionProperties(val
->pItem
, lpcmi
->hwnd
);
953 /**************************************************************************
954 * ISF_NetConnect_IContextMenu_GetCommandString()
957 HRESULT WINAPI
CNetConUiObject::GetCommandString(
967 /**************************************************************************
968 * ISF_NetConnect_IContextMenu_HandleMenuMsg()
970 HRESULT WINAPI
CNetConUiObject::HandleMenuMsg(
978 HRESULT WINAPI
CNetConUiObject::HandleMenuMsg2(
987 HRESULT WINAPI
CNetConUiObject::GetSite(REFIID riid
, PVOID
*ppvSite
)
998 hr
= m_pUnknown
->QueryInterface(riid
, reinterpret_cast<PVOID
*>(&pUnknown
));
1002 *ppvSite
= pUnknown
;
1010 HRESULT WINAPI
CNetConUiObject::SetSite(IUnknown
*pUnkSite
)
1016 m_pUnknown
->Release();
1024 m_pUnknown
->Release();
1025 m_pUnknown
= pUnkSite
;
1031 /************************************************************************
1032 * ISF_NetConnect_IExtractIcon_GetIconLocation
1034 HRESULT WINAPI
CNetConUiObject::GetIconLocation(
1041 const VALUEStruct
*val
;
1042 NETCON_PROPERTIES
*pProperties
;
1045 if (!GetModuleFileNameW(netshell_hInstance
, szIconFile
, cchMax
))
1047 ERR("GetModuleFileNameW failed\n");
1051 val
= _ILGetValueStruct(m_pidl
);
1054 ERR("_ILGetValueStruct failed\n");
1058 if (val
->pItem
->GetProperties(&pProperties
) != NOERROR
)
1060 ERR("INetConnection_GetProperties failed\n");
1064 if (pProperties
->Status
== NCS_CONNECTED
|| pProperties
->Status
== NCS_CONNECTING
)
1065 *piIndex
= -IDI_NET_IDLE
;
1067 *piIndex
= -IDI_NET_OFF
;
1069 NcFreeNetconProperties(pProperties
);
1074 /************************************************************************
1075 * ISF_NetConnect_IExtractIcon_Extract
1077 HRESULT WINAPI
CNetConUiObject::Extract(
1084 //IContextMenuImpl * This = impl_from_IExtractIcon(iface);
1085 if (nIconIndex
== IDI_NET_IDLE
)
1087 *phiconLarge
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_IDLE
), IMAGE_ICON
, 32, 32, LR_DEFAULTCOLOR
);
1088 *phiconSmall
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_IDLE
), IMAGE_ICON
, 16, 16, LR_DEFAULTCOLOR
);
1091 else if (nIconIndex
== IDI_NET_OFF
)
1093 *phiconLarge
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_OFF
), IMAGE_ICON
, 32, 32, LR_DEFAULTCOLOR
);
1094 *phiconSmall
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_OFF
), IMAGE_ICON
, 16, 16, LR_DEFAULTCOLOR
);
1101 /************************************************************************
1102 * ISF_NetConnect_PersistFolder2_GetClassID
1104 HRESULT WINAPI
CNetworkConnections::GetClassID(CLSID
*lpClassId
)
1109 *lpClassId
= CLSID_ConnectionFolder
;
1114 /************************************************************************
1115 * ISF_NetConnect_PersistFolder2_Initialize
1117 * NOTES: it makes no sense to change the pidl
1119 HRESULT WINAPI
CNetworkConnections::Initialize(PCIDLIST_ABSOLUTE pidl
)
1122 m_pidlRoot
= ILClone(pidl
);
1127 /**************************************************************************
1128 * ISF_NetConnect_PersistFolder2_GetCurFolder
1130 HRESULT WINAPI
CNetworkConnections::GetCurFolder(PIDLIST_ABSOLUTE
*pidl
)
1135 *pidl
= ILClone(m_pidlRoot
);
1140 /************************************************************************
1141 * ISF_NetConnect_ShellExecuteHookW_Execute
1143 HRESULT WINAPI
CNetworkConnections::Execute(LPSHELLEXECUTEINFOW pei
)
1145 const VALUEStruct
*val
;
1146 NETCON_PROPERTIES
* pProperties
;
1148 val
= _ILGetValueStruct(ILFindLastID((ITEMIDLIST
*)pei
->lpIDList
));
1152 if (val
->pItem
->GetProperties(&pProperties
) != NOERROR
)
1155 if (pProperties
->Status
== NCS_CONNECTED
)
1157 NcFreeNetconProperties(pProperties
);
1158 return ShowNetConnectionStatus(m_lpOleCmd
, val
->pItem
, pei
->hwnd
);
1161 NcFreeNetconProperties(pProperties
);
1166 HRESULT WINAPI
CNetConUiObject::GetInfoFlags(DWORD
*pdwFlags
)
1173 /************************************************************************
1174 * ISF_NetConnect_PersistFolder2_Initialize
1176 * NOTES: it makes no sense to change the pidl
1178 HRESULT WINAPI
CNetConUiObject::GetInfoTip(DWORD dwFlags
, WCHAR
**ppwszTip
)
1184 /**************************************************************************
1185 * ISF_NetConnect_Constructor
1187 HRESULT WINAPI
ISF_NetConnect_Constructor(IUnknown
*pUnkOuter
, REFIID riid
, LPVOID
*ppv
)
1189 TRACE("ISF_NetConnect_Constructor\n");
1194 return CLASS_E_NOAGGREGATION
;
1196 CNetworkConnections
*pnc
= new CNetworkConnections
;
1198 return E_OUTOFMEMORY
;
1201 HRESULT hr
= pnc
->QueryInterface(riid
, ppv
);