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
, LPITEMIDLIST
*ppidl
, DWORD
*pdwAttributes
);
44 virtual HRESULT WINAPI
EnumObjects(HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
*ppEnumIDList
);
45 virtual HRESULT WINAPI
BindToObject(LPCITEMIDLIST pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
);
46 virtual HRESULT WINAPI
BindToStorage(LPCITEMIDLIST pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
);
47 virtual HRESULT WINAPI
CompareIDs(LPARAM lParam
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
);
48 virtual HRESULT WINAPI
CreateViewObject(HWND hwndOwner
, REFIID riid
, LPVOID
*ppvOut
);
49 virtual HRESULT WINAPI
GetAttributesOf (UINT cidl
, LPCITEMIDLIST
*apidl
, DWORD
*rgfInOut
);
50 virtual HRESULT WINAPI
GetUIObjectOf(HWND hwndOwner
, UINT cidl
, LPCITEMIDLIST
*apidl
, REFIID riid
, UINT
* prgfInOut
, LPVOID
* ppvOut
);
51 virtual HRESULT WINAPI
GetDisplayNameOf(LPCITEMIDLIST pidl
, DWORD dwFlags
, LPSTRRET strRet
);
52 virtual HRESULT WINAPI
SetNameOf(HWND hwndOwner
, LPCITEMIDLIST pidl
, LPCOLESTR lpName
, DWORD dwFlags
, LPITEMIDLIST
*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(LPCITEMIDLIST pidl
, const SHCOLUMNID
*pscid
, VARIANT
*pv
);
60 virtual HRESULT WINAPI
GetDetailsOf(LPCITEMIDLIST 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(LPCITEMIDLIST pidl
);
66 virtual HRESULT WINAPI
GetCurFolder(LPITEMIDLIST
*pidl
);
69 virtual HRESULT WINAPI
Execute(LPSHELLEXECUTEINFOW pei
);
73 /* both paths are parsible from the desktop */
74 LPITEMIDLIST pidlRoot
; /* absolute pidl */
75 LPITEMIDLIST pidl
; /* enumerated pidl */
76 IOleCommandTarget
* lpOleCmd
;
79 class CNetConUiObject final
:
81 public IObjectWithSite
,
86 CNetConUiObject(LPCITEMIDLIST apidl
, IOleCommandTarget
*lpOleCmd
);
89 virtual HRESULT WINAPI
QueryInterface(REFIID riid
, LPVOID
*ppvOut
);
90 virtual ULONG WINAPI
AddRef();
91 virtual ULONG WINAPI
Release();
94 virtual HRESULT WINAPI
QueryContextMenu(HMENU hmenu
, UINT indexMenu
, UINT idCmdFirst
, UINT idCmdLast
, UINT uFlags
);
95 virtual HRESULT WINAPI
InvokeCommand(LPCMINVOKECOMMANDINFO lpici
);
96 virtual HRESULT WINAPI
GetCommandString(UINT_PTR idCmd
, UINT uType
, UINT
*pwReserved
, LPSTR pszName
, UINT cchMax
);
97 virtual HRESULT WINAPI
HandleMenuMsg( UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
98 virtual HRESULT WINAPI
HandleMenuMsg2(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*plResult
);
101 virtual HRESULT WINAPI
SetSite(IUnknown
*punk
);
102 virtual HRESULT WINAPI
GetSite(REFIID iid
, void **ppvSite
);
105 virtual HRESULT WINAPI
GetInfoFlags(DWORD
*pdwFlags
);
106 virtual HRESULT WINAPI
GetInfoTip(DWORD dwFlags
, WCHAR
**ppwszTip
);
109 virtual HRESULT STDMETHODCALLTYPE
GetIconLocation(UINT uFlags
, LPWSTR szIconFile
, UINT cchMax
, int *piIndex
, UINT
*pwFlags
);
110 virtual HRESULT STDMETHODCALLTYPE
Extract(LPCWSTR pszFile
, UINT nIconIndex
, HICON
*phiconLarge
, HICON
*phiconSmall
, UINT nIconSize
);
116 IOleCommandTarget
* lpOleCmd
;
119 static const shvheader NetConnectSFHeader
[] = {
120 {IDS_SHV_COLUMN_NAME
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 20},
121 {IDS_SHV_COLUMN_TYPE
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 8},
122 {IDS_SHV_COLUMN_STATE
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 10},
123 {IDS_SHV_COLUMN_DEVNAME
, SHCOLSTATE_TYPE_DATE
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 12},
124 {IDS_SHV_COLUMN_PHONE
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 10},
125 {IDS_SHV_COLUMN_OWNER
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 5}
128 #define NETCONNECTSHELLVIEWCOLUMNS 6
130 #define COLUMN_NAME 0
131 #define COLUMN_TYPE 1
132 #define COLUMN_STATUS 2
133 #define COLUMN_DEVNAME 3
134 #define COLUMN_PHONE 4
135 #define COLUMN_OWNER 5
137 HRESULT
ShowNetConnectionStatus(IOleCommandTarget
* lpOleCmd
, INetConnection
* pNetConnect
, HWND hwnd
);
139 CNetworkConnections::CNetworkConnections()
142 HRESULT hr
= CoCreateInstance(CLSID_LanConnectStatusUI
, NULL
, CLSCTX_INPROC_SERVER
, IID_IOleCommandTarget
, (LPVOID
*)&lpOleCmd
);
145 ERR("CoCreateInstance failed\n");
150 hr
= lpOleCmd
->Exec(&CGID_ShellServiceObject
, 2, OLECMDEXECOPT_DODEFAULT
, NULL
, NULL
);
152 ERR("Exec CGID_ShellServiceObject failed\n");
155 pidlRoot
= _ILCreateNetConnect(); /* my qualified pidl */
158 /**************************************************************************
159 * ISF_NetConnect_fnQueryInterface
162 * supports not IPersist/IPersistFolder
164 HRESULT WINAPI
CNetworkConnections::QueryInterface(REFIID riid
, LPVOID
*ppvObj
)
168 if (IsEqualIID(riid
, IID_IUnknown
) ||
169 IsEqualIID(riid
, IID_IShellFolder
) ||
170 IsEqualIID(riid
, IID_IShellFolder2
))
172 *ppvObj
= (IShellFolder2
*)this;
174 else if (IsEqualIID (riid
, IID_IPersistFolder
) ||
175 IsEqualIID (riid
, IID_IPersistFolder2
))
177 *ppvObj
= (IPersistFolder2
*)this;
179 else if (IsEqualIID(riid
, IID_IShellExecuteHookW
))
181 *ppvObj
= (IShellExecuteHookW
*)this;
184 else if (IsEqualIID(riid
, IID_IPersistIDList
))
186 //*ppvObj = (IPersistIDList*)this;
196 * IID_IPersistFreeThreadedObject
197 * IID_IBrowserFrameOptions
198 * IID_IShellIconOverlay
203 return E_NOINTERFACE
;
206 ULONG WINAPI
CNetworkConnections::AddRef()
208 ULONG refCount
= InterlockedIncrement(&ref
);
213 ULONG WINAPI
CNetworkConnections::Release()
215 ULONG refCount
= InterlockedDecrement(&ref
);
225 /**************************************************************************
226 * ISF_NetConnect_fnParseDisplayName
228 HRESULT WINAPI
CNetworkConnections::ParseDisplayName (
229 HWND hwndOwner
, LPBC pbcReserved
, LPOLESTR lpszDisplayName
,
230 DWORD
* pchEaten
, LPITEMIDLIST
* ppidl
, DWORD
* pdwAttributes
)
232 HRESULT hr
= E_UNEXPECTED
;
236 *pchEaten
= 0; /* strange but like the original */
241 /**************************************************************************
242 * CreateNetConnectEnumListss()
244 static BOOL
CreateNetConnectEnumList(CEnumIDList
*list
, DWORD dwFlags
)
247 INetConnectionManager
*pNetConMan
;
248 IEnumNetConnection
*pEnumCon
;
249 INetConnection
*INetCon
;
253 /* get an instance to of IConnectionManager */
254 hr
= INetConnectionManager_Constructor(NULL
, IID_INetConnectionManager
, (LPVOID
*)&pNetConMan
);
258 hr
= pNetConMan
->EnumConnections(NCME_DEFAULT
, &pEnumCon
);
261 pNetConMan
->Release();
267 hr
= pEnumCon
->Next(1, &INetCon
, &Count
);
270 pidl
= ILCreateNetConnectItem(INetCon
);
273 list
->AddToEnumList(pidl
);
283 pNetConMan
->Release();
288 /**************************************************************************
289 * ISF_NetConnect_fnEnumObjects
291 HRESULT WINAPI
CNetworkConnections::EnumObjects(
292 HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
*ppEnumIDList
)
294 CEnumIDList
*pList
= new CEnumIDList
;
295 *ppEnumIDList
= (LPENUMIDLIST
)pList
;
297 return E_OUTOFMEMORY
;
300 CreateNetConnectEnumList(pList
, dwFlags
);
304 /**************************************************************************
305 * ISF_NetConnect_fnBindToObject
307 HRESULT WINAPI
CNetworkConnections::BindToObject (
308 LPCITEMIDLIST pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
* ppvOut
)
313 /**************************************************************************
314 * ISF_NetConnect_fnBindToStorage
316 HRESULT WINAPI
CNetworkConnections::BindToStorage(
317 LPCITEMIDLIST pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
* ppvOut
)
323 /**************************************************************************
324 * ISF_NetConnect_fnCompareIDs
327 HRESULT WINAPI
CNetworkConnections::CompareIDs(
328 LPARAM lParam
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
330 //IGenericSFImpl *This = (IGenericSFImpl *)iface;
337 /**************************************************************************
338 * ISF_NetConnect_fnCreateViewObject
340 HRESULT WINAPI
CNetworkConnections::CreateViewObject(
341 HWND hwndOwner
, REFIID riid
, LPVOID
* ppvOut
)
344 HRESULT hr
= E_NOINTERFACE
;
351 if (IsEqualIID(riid
, IID_IShellView
))
353 ZeroMemory(&cvf
, sizeof(cvf
));
354 cvf
.cbSize
= sizeof(cvf
);
355 cvf
.pshf
= (IShellFolder
*)this;
357 IShellView
* pShellView
;
358 hr
= SHCreateShellFolderViewEx(&cvf
, &pShellView
);
361 hr
= pShellView
->QueryInterface(riid
, ppvOut
);
362 pShellView
->Release();
369 /**************************************************************************
370 * ISF_NetConnect_fnGetAttributesOf
372 HRESULT WINAPI
CNetworkConnections::GetAttributesOf(
373 UINT cidl
, LPCITEMIDLIST
* apidl
, DWORD
* rgfInOut
)
375 //IGenericSFImpl *This = (IGenericSFImpl *)iface;
377 static const DWORD dwNetConnectAttributes
= SFGAO_STORAGE
| SFGAO_HASPROPSHEET
| SFGAO_STORAGEANCESTOR
|
378 SFGAO_FILESYSANCESTOR
| SFGAO_FOLDER
| SFGAO_FILESYSTEM
| SFGAO_HASSUBFOLDER
| SFGAO_CANRENAME
| SFGAO_CANDELETE
;
380 static const DWORD dwNetConnectItemAttributes
= SFGAO_HASPROPSHEET
| SFGAO_STORAGEANCESTOR
|
381 SFGAO_FILESYSANCESTOR
| SFGAO_CANRENAME
;
393 *rgfInOut
= dwNetConnectAttributes
;
395 *rgfInOut
= dwNetConnectItemAttributes
;
397 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
398 *rgfInOut
&= ~SFGAO_VALIDATE
;
403 /**************************************************************************
404 * ISF_NetConnect_fnGetUIObjectOf
407 * hwndOwner [in] Parent window for any output
408 * cidl [in] array size
409 * apidl [in] simple pidl array
410 * riid [in] Requested Interface
411 * prgfInOut [ ] reserved
412 * ppvObject [out] Resulting Interface
416 HRESULT
IContextMenuImpl_Constructor(REFIID riid
, LPCITEMIDLIST apidl
, LPVOID
* ppvOut
, IOleCommandTarget
* lpOleCmd
)
418 CNetConUiObject
*pMenu
= new CNetConUiObject(apidl
, lpOleCmd
);
420 return E_OUTOFMEMORY
;
423 HRESULT hr
= pMenu
->QueryInterface(riid
, ppvOut
);
428 HRESULT WINAPI
CNetworkConnections::GetUIObjectOf(
429 HWND hwndOwner
, UINT cidl
, LPCITEMIDLIST
* apidl
, REFIID riid
,
430 UINT
* prgfInOut
, LPVOID
* ppvOut
)
432 IUnknown
*pObj
= NULL
;
433 HRESULT hr
= E_INVALIDARG
;
440 if ((IsEqualIID (riid
, IID_IContextMenu
) || IsEqualIID (riid
, IID_IContextMenu2
) || IsEqualIID(riid
, IID_IContextMenu3
) ||
441 IsEqualIID(riid
, IID_IQueryInfo
) || IsEqualIID(riid
, IID_IExtractIconW
)) && cidl
>= 1)
443 return IContextMenuImpl_Constructor(riid
, apidl
[0], ppvOut
, lpOleCmd
);
452 /**************************************************************************
453 * ISF_NetConnect_fnGetDisplayNameOf
456 HRESULT WINAPI
CNetworkConnections::GetDisplayNameOf(LPCITEMIDLIST pidl
, DWORD dwFlags
, LPSTRRET strRet
)
460 NETCON_PROPERTIES
* pProperties
;
466 pszName
= (WCHAR
*)CoTaskMemAlloc(MAX_PATH
* sizeof(WCHAR
));
468 return E_OUTOFMEMORY
;
470 if (_ILIsNetConnect(pidl
))
472 if (LoadStringW(netshell_hInstance
, IDS_NETWORKCONNECTION
, pszName
, MAX_PATH
))
474 pszName
[MAX_PATH
-1] = L
'\0';
480 val
= _ILGetValueStruct(pidl
);
483 if (val
->pItem
->GetProperties(&pProperties
) == S_OK
)
485 if (pProperties
->pszwName
)
487 wcscpy(pszName
, pProperties
->pszwName
);
490 NcFreeNetconProperties(pProperties
);
498 strRet
->uType
= STRRET_WSTR
;
499 strRet
->pOleStr
= pszName
;
503 CoTaskMemFree(pszName
);
509 /**************************************************************************
510 * ISF_NetConnect_fnSetNameOf
511 * Changes the name of a file object or subfolder, possibly changing its item
512 * identifier in the process.
515 * hwndOwner [in] Owner window for output
516 * pidl [in] simple pidl of item to change
517 * lpszName [in] the items new display name
518 * dwFlags [in] SHGNO formatting flags
519 * ppidlOut [out] simple pidl returned
521 HRESULT WINAPI
CNetworkConnections::SetNameOf (
522 HWND hwndOwner
, LPCITEMIDLIST pidl
, /*simple pidl */
523 LPCOLESTR lpName
, DWORD dwFlags
, LPITEMIDLIST
* pPidlOut
)
528 HRESULT WINAPI
CNetworkConnections::GetDefaultSearchGUID(GUID
* pguid
)
533 HRESULT WINAPI
CNetworkConnections::EnumSearches(IEnumExtraSearch
** ppenum
)
538 HRESULT WINAPI
CNetworkConnections::GetDefaultColumn(DWORD dwRes
, ULONG
* pSort
, ULONG
* pDisplay
)
548 HRESULT WINAPI
CNetworkConnections::GetDefaultColumnState(UINT iColumn
, DWORD
* pcsFlags
)
550 if (!pcsFlags
|| iColumn
>= NETCONNECTSHELLVIEWCOLUMNS
)
552 *pcsFlags
= NetConnectSFHeader
[iColumn
].pcsFlags
;
556 HRESULT WINAPI
CNetworkConnections::GetDetailsEx(
557 LPCITEMIDLIST pidl
, const SHCOLUMNID
* pscid
, VARIANT
* pv
)
562 HRESULT WINAPI
CNetworkConnections::GetDetailsOf(
563 LPCITEMIDLIST pidl
, UINT iColumn
, SHELLDETAILS
* psd
)
565 WCHAR buffer
[MAX_PATH
] = {0};
568 NETCON_PROPERTIES
* pProperties
;
570 if (iColumn
>= NETCONNECTSHELLVIEWCOLUMNS
)
573 psd
->fmt
= NetConnectSFHeader
[iColumn
].fmt
;
574 psd
->cxChar
= NetConnectSFHeader
[iColumn
].cxChar
;
577 psd
->str
.uType
= STRRET_WSTR
;
578 if (LoadStringW(netshell_hInstance
, NetConnectSFHeader
[iColumn
].colnameid
, buffer
, MAX_PATH
))
579 hr
= SHStrDupW(buffer
, &psd
->str
.pOleStr
);
584 if (iColumn
== COLUMN_NAME
)
586 psd
->str
.uType
= STRRET_WSTR
;
587 return GetDisplayNameOf(pidl
, SHGDN_NORMAL
, &psd
->str
);
590 val
= _ILGetValueStruct(pidl
);
597 if (val
->pItem
->GetProperties(&pProperties
) != S_OK
)
604 if (pProperties
->MediaType
== NCM_LAN
|| pProperties
->MediaType
== NCM_SHAREDACCESSHOST_RAS
)
606 if (LoadStringW(netshell_hInstance
, IDS_TYPE_ETHERNET
, buffer
, MAX_PATH
))
608 psd
->str
.uType
= STRRET_WSTR
;
609 hr
= SHStrDupW(buffer
, &psd
->str
.pOleStr
);
615 if (pProperties
->Status
== NCS_HARDWARE_DISABLED
)
616 LoadStringW(netshell_hInstance
, IDS_STATUS_NON_OPERATIONAL
, buffer
, MAX_PATH
);
617 else if (pProperties
->Status
== NCS_DISCONNECTED
)
618 LoadStringW(netshell_hInstance
, IDS_STATUS_UNREACHABLE
, buffer
, MAX_PATH
);
619 else if (pProperties
->Status
== NCS_MEDIA_DISCONNECTED
)
620 LoadStringW(netshell_hInstance
, IDS_STATUS_DISCONNECTED
, buffer
, MAX_PATH
);
621 else if (pProperties
->Status
== NCS_CONNECTING
)
622 LoadStringW(netshell_hInstance
, IDS_STATUS_CONNECTING
, buffer
, MAX_PATH
);
623 else if (pProperties
->Status
== NCS_CONNECTED
)
624 LoadStringW(netshell_hInstance
, IDS_STATUS_CONNECTED
, buffer
, MAX_PATH
);
628 buffer
[MAX_PATH
-1] = L
'\0';
629 psd
->str
.uType
= STRRET_WSTR
;
630 hr
= SHStrDupW(buffer
, &psd
->str
.pOleStr
);
634 if (pProperties
->pszwDeviceName
)
636 wcscpy(buffer
, pProperties
->pszwDeviceName
);
637 buffer
[MAX_PATH
-1] = L
'\0';
638 psd
->str
.uType
= STRRET_WSTR
;
639 hr
= SHStrDupW(buffer
, &psd
->str
.pOleStr
);
643 psd
->str
.cStr
[0] = '\0';
644 psd
->str
.uType
= STRRET_CSTR
;
649 psd
->str
.cStr
[0] = '\0';
650 psd
->str
.uType
= STRRET_CSTR
;
654 NcFreeNetconProperties(pProperties
);
658 HRESULT WINAPI
CNetworkConnections::MapColumnToSCID(UINT column
, SHCOLUMNID
*pscid
)
664 //IInternetSecurityManager
666 /**************************************************************************
667 * IContextMenu2 Implementation
670 CNetConUiObject::CNetConUiObject(LPCITEMIDLIST apidl
, IOleCommandTarget
*lpOleCmd
)
674 this->lpOleCmd
= lpOleCmd
;
678 /************************************************************************
679 * ISF_NetConnect_IContextMenu_QueryInterface
681 HRESULT WINAPI
CNetConUiObject::QueryInterface(REFIID iid
, LPVOID
*ppvObject
)
685 if (IsEqualIID(iid
, IID_IContextMenu
) || IsEqualIID(iid
, IID_IContextMenu2
) || IsEqualIID(iid
, IID_IContextMenu3
))
686 *ppvObject
= (IContextMenu3
*)this;
687 else if (IsEqualIID(iid
, IID_IObjectWithSite
))
688 *ppvObject
= (IObjectWithSite
*)this;
689 else if (IsEqualIID(iid
, IID_IQueryInfo
))
690 *ppvObject
= (IQueryInfo
*)this;
691 else if(IsEqualIID(iid
, IID_IExtractIconW
))
692 *ppvObject
= (IExtractIconW
*)this;
696 InterlockedIncrement(&ref
);
701 //StringFromCLSID(iid, &pStr);
702 //MessageBoxW(NULL, L"ISF_NetConnect_IContextMenu2_QueryInterface unhandled", pStr, MB_OK);
703 return E_NOINTERFACE
;
706 /************************************************************************
707 * ISF_NetConnect_IContextMenu_AddRef
709 ULONG WINAPI
CNetConUiObject::AddRef()
713 refCount
= InterlockedIncrement(&ref
);
718 /************************************************************************
719 * ISF_NetConnect_IContextMenu_Release
721 ULONG WINAPI
CNetConUiObject::Release()
725 refCount
= InterlockedDecrement(&ref
);
732 void WINAPI
_InsertMenuItemW (
744 ZeroMemory(&mii
, sizeof(mii
));
745 mii
.cbSize
= sizeof(mii
);
746 if (fType
== MFT_SEPARATOR
)
748 mii
.fMask
= MIIM_ID
| MIIM_TYPE
;
750 else if (fType
== MFT_STRING
)
752 mii
.fMask
= MIIM_ID
| MIIM_TYPE
| MIIM_STATE
;
753 if ((ULONG_PTR
)HIWORD((ULONG_PTR
)dwTypeData
) == 0)
755 if (LoadStringW(netshell_hInstance
, LOWORD((ULONG_PTR
)dwTypeData
), szText
, sizeof(szText
)/sizeof(WCHAR
)))
757 szText
[(sizeof(szText
)/sizeof(WCHAR
))-1] = 0;
758 mii
.dwTypeData
= szText
;
767 mii
.dwTypeData
= (LPWSTR
) dwTypeData
;
774 InsertMenuItemW( hmenu
, indexMenu
, fByPosition
, &mii
);
777 /**************************************************************************
778 * ISF_NetConnect_IContextMenu_QueryContextMenu()
780 HRESULT WINAPI
CNetConUiObject::QueryContextMenu(
788 NETCON_PROPERTIES
* pProperties
;
790 val
= _ILGetValueStruct(apidl
);
794 if (val
->pItem
->GetProperties(&pProperties
) != S_OK
)
797 if (pProperties
->Status
== NCS_HARDWARE_DISABLED
)
798 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_ACTIVATE
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_ACTIVATE
), MFS_DEFAULT
);
800 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_DEACTIVATE
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_DEACTIVATE
), MFS_ENABLED
);
802 if (pProperties
->Status
== NCS_HARDWARE_DISABLED
|| pProperties
->Status
== NCS_MEDIA_DISCONNECTED
|| pProperties
->Status
== NCS_DISCONNECTED
)
803 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_STATUS
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_STATUS
), MFS_GRAYED
);
804 else if (pProperties
->Status
== NCS_CONNECTED
)
805 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_STATUS
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_STATUS
), MFS_DEFAULT
);
807 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_STATUS
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_STATUS
), MFS_ENABLED
);
809 if (pProperties
->Status
== NCS_HARDWARE_DISABLED
|| pProperties
->Status
== NCS_MEDIA_DISCONNECTED
)
810 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_REPAIR
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_REPAIR
), MFS_GRAYED
);
812 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_REPAIR
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_REPAIR
), MFS_ENABLED
);
814 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, -1, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
815 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_CREATELINK
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_CREATELINK
), MFS_ENABLED
);
817 if (pProperties
->dwCharacter
& NCCF_ALLOW_REMOVAL
)
818 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_DELETE
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_DELETE
), MFS_ENABLED
);
820 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_DELETE
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_DELETE
), MFS_GRAYED
);
822 if (pProperties
->dwCharacter
& NCCF_ALLOW_RENAME
)
823 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_RENAME
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_RENAME
), MFS_ENABLED
);
825 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_RENAME
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_RENAME
), MFS_GRAYED
);
827 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, -1, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
828 _InsertMenuItemW(hMenu
, indexMenu
++, TRUE
, IDS_NET_PROPERTIES
, MFT_STRING
, MAKEINTRESOURCEW(IDS_NET_PROPERTIES
), MFS_ENABLED
);
829 NcFreeNetconProperties(pProperties
);
830 return MAKE_HRESULT(SEVERITY_SUCCESS
, 0, 9);
835 PropSheetExCallback(HPROPSHEETPAGE hPage
, LPARAM lParam
)
837 PROPSHEETHEADERW
*pinfo
= (PROPSHEETHEADERW
*)lParam
;
839 if (pinfo
->nPages
< MAX_PROPERTY_SHEET_PAGE
)
841 pinfo
->phpage
[pinfo
->nPages
++] = hPage
;
848 ShowNetConnectionStatus(
849 IOleCommandTarget
*lpOleCmd
,
850 INetConnection
*pNetConnect
,
853 NETCON_PROPERTIES
*pProperties
;
859 if (pNetConnect
->GetProperties(&pProperties
) != S_OK
)
862 hr
= lpOleCmd
->Exec(&pProperties
->guidId
, 2, OLECMDEXECOPT_DODEFAULT
, NULL
, NULL
);
864 NcFreeNetconProperties(pProperties
);
869 ShowNetConnectionProperties(
870 INetConnection
*pNetConnect
,
875 PROPSHEETHEADERW pinfo
;
876 HPROPSHEETPAGE hppages
[MAX_PROPERTY_SHEET_PAGE
];
877 INetConnectionPropertyUi
* pNCP
;
878 NETCON_PROPERTIES
* pProperties
;
880 if (pNetConnect
->GetProperties(&pProperties
) != S_OK
)
883 hr
= pNetConnect
->GetUiObjectClassId(&ClassID
);
886 NcFreeNetconProperties(pProperties
);
890 hr
= CoCreateInstance(ClassID
, NULL
, CLSCTX_INPROC_SERVER
, IID_INetConnectionPropertyUi
, (LPVOID
*)&pNCP
);
893 NcFreeNetconProperties(pProperties
);
897 hr
= pNCP
->SetConnection(pNetConnect
);
900 ZeroMemory(&pinfo
, sizeof(PROPSHEETHEADERW
));
901 ZeroMemory(hppages
, sizeof(hppages
));
902 pinfo
.dwSize
= sizeof(PROPSHEETHEADERW
);
903 pinfo
.dwFlags
= PSH_NOCONTEXTHELP
| PSH_PROPTITLE
| PSH_NOAPPLYNOW
;
904 pinfo
.phpage
= hppages
;
905 pinfo
.hwndParent
= hwnd
;
907 pinfo
.pszCaption
= pProperties
->pszwName
;
908 hr
= pNCP
->AddPages(hwnd
, PropSheetExCallback
, (LPARAM
)&pinfo
);
911 if(PropertySheetW(&pinfo
) < 0)
916 NcFreeNetconProperties(pProperties
);
921 /**************************************************************************
922 * ISF_NetConnect_IContextMenu_InvokeCommand()
924 HRESULT WINAPI
CNetConUiObject::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi
)
928 val
= _ILGetValueStruct(apidl
);
932 if (lpcmi
->lpVerb
== MAKEINTRESOURCEA(IDS_NET_STATUS
) ||
933 lpcmi
->lpVerb
== MAKEINTRESOURCEA(IDS_NET_STATUS
-1)) //HACK for Windows XP
935 return ShowNetConnectionStatus(lpOleCmd
, val
->pItem
, lpcmi
->hwnd
);
937 else if (lpcmi
->lpVerb
== MAKEINTRESOURCEA(IDS_NET_PROPERTIES
) ||
938 lpcmi
->lpVerb
== MAKEINTRESOURCEA(10099)) //HACK for Windows XP
940 /* FIXME perform version checks */
941 return ShowNetConnectionProperties(val
->pItem
, lpcmi
->hwnd
);
947 /**************************************************************************
948 * ISF_NetConnect_IContextMenu_GetCommandString()
951 HRESULT WINAPI
CNetConUiObject::GetCommandString(
961 /**************************************************************************
962 * ISF_NetConnect_IContextMenu_HandleMenuMsg()
964 HRESULT WINAPI
CNetConUiObject::HandleMenuMsg(
972 HRESULT WINAPI
CNetConUiObject::HandleMenuMsg2(
981 HRESULT WINAPI
CNetConUiObject::GetSite(REFIID riid
, PVOID
*ppvSite
)
992 hr
= this->pUnknown
->QueryInterface(riid
, (LPVOID
*)&pUnknown
);
1004 HRESULT WINAPI
CNetConUiObject::SetSite(IUnknown
*pUnkSite
)
1010 this->pUnknown
->Release();
1011 this->pUnknown
= NULL
;
1018 this->pUnknown
->Release();
1019 this->pUnknown
= pUnkSite
;
1025 /************************************************************************
1026 * ISF_NetConnect_IExtractIcon_GetIconLocation
1028 HRESULT WINAPI
CNetConUiObject::GetIconLocation(
1036 NETCON_PROPERTIES
*pProperties
;
1039 if (!GetModuleFileNameW(netshell_hInstance
, szIconFile
, cchMax
))
1041 ERR("GetModuleFileNameW failed\n");
1045 val
= _ILGetValueStruct(apidl
);
1048 ERR("_ILGetValueStruct failed\n");
1052 if (val
->pItem
->GetProperties(&pProperties
) != NOERROR
)
1054 ERR("INetConnection_GetProperties failed\n");
1058 if (pProperties
->Status
== NCS_CONNECTED
|| pProperties
->Status
== NCS_CONNECTING
)
1059 *piIndex
= -IDI_NET_IDLE
;
1061 *piIndex
= -IDI_NET_OFF
;
1063 NcFreeNetconProperties(pProperties
);
1068 /************************************************************************
1069 * ISF_NetConnect_IExtractIcon_Extract
1071 HRESULT WINAPI
CNetConUiObject::Extract(
1078 //IContextMenuImpl * This = impl_from_IExtractIcon(iface);
1079 if (nIconIndex
== IDI_NET_IDLE
)
1081 *phiconLarge
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_IDLE
), IMAGE_ICON
, 32, 32, LR_DEFAULTCOLOR
);
1082 *phiconSmall
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_IDLE
), IMAGE_ICON
, 16, 16, LR_DEFAULTCOLOR
);
1085 else if (nIconIndex
== IDI_NET_OFF
)
1087 *phiconLarge
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_OFF
), IMAGE_ICON
, 32, 32, LR_DEFAULTCOLOR
);
1088 *phiconSmall
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_OFF
), IMAGE_ICON
, 16, 16, LR_DEFAULTCOLOR
);
1095 /************************************************************************
1096 * ISF_NetConnect_PersistFolder2_GetClassID
1098 HRESULT WINAPI
CNetworkConnections::GetClassID(CLSID
*lpClassId
)
1103 *lpClassId
= CLSID_NetworkConnections
;
1108 /************************************************************************
1109 * ISF_NetConnect_PersistFolder2_Initialize
1111 * NOTES: it makes no sense to change the pidl
1113 HRESULT WINAPI
CNetworkConnections::Initialize(LPCITEMIDLIST pidl
)
1116 pidlRoot
= ILClone(pidl
);
1121 /**************************************************************************
1122 * ISF_NetConnect_PersistFolder2_GetCurFolder
1124 HRESULT WINAPI
CNetworkConnections::GetCurFolder(LPITEMIDLIST
*pidl
)
1129 *pidl
= ILClone(pidlRoot
);
1134 /************************************************************************
1135 * ISF_NetConnect_ShellExecuteHookW_Execute
1137 HRESULT WINAPI
CNetworkConnections::Execute(LPSHELLEXECUTEINFOW pei
)
1140 NETCON_PROPERTIES
* pProperties
;
1142 val
= _ILGetValueStruct(ILFindLastID((ITEMIDLIST
*)pei
->lpIDList
));
1146 if (val
->pItem
->GetProperties(&pProperties
) != NOERROR
)
1149 if (pProperties
->Status
== NCS_CONNECTED
)
1151 NcFreeNetconProperties(pProperties
);
1152 return ShowNetConnectionStatus(lpOleCmd
, val
->pItem
, pei
->hwnd
);
1155 NcFreeNetconProperties(pProperties
);
1160 HRESULT WINAPI
CNetConUiObject::GetInfoFlags(DWORD
*pdwFlags
)
1167 /************************************************************************
1168 * ISF_NetConnect_PersistFolder2_Initialize
1170 * NOTES: it makes no sense to change the pidl
1172 HRESULT WINAPI
CNetConUiObject::GetInfoTip(DWORD dwFlags
, WCHAR
**ppwszTip
)
1178 /**************************************************************************
1179 * ISF_NetConnect_Constructor
1181 HRESULT WINAPI
ISF_NetConnect_Constructor(IUnknown
*pUnkOuter
, REFIID riid
, LPVOID
*ppv
)
1183 TRACE("ISF_NetConnect_Constructor\n");
1188 return CLASS_E_NOAGGREGATION
;
1190 CNetworkConnections
*pnc
= new CNetworkConnections
;
1192 return E_OUTOFMEMORY
;
1195 HRESULT hr
= pnc
->QueryInterface(riid
, ppv
);