mirror of
https://github.com/reactos/reactos.git
synced 2024-09-27 04:58:46 +00:00
69a8fd0a73
0.4.15-dev-7606-g874b5a4e00
[NETSHELL] Trivial tweaks (#6484) 0.4.15-dev-7126-ga6341b49d8
[NETSHELL] 640x480-ify complete that module (#6109) 0.4.15-dev-7018-gcbc60aa07a
[NETSHELL] Double click on component should open properties (#6008) CORE-19330 PARTIALLY 0.4.15-dev-6857-g55563fa891
[NETSHELL] IDD_NETPROPERTIES must fit 640x480 CORE-19284 (#5899) (I left out the 3 accelerators) Also port back some other rc tweaks and strip EOL-whitespaces and the IDS_NET_REPAIR from the context menu which is still unimplemented in the older branches and for which I do never intend to port back the implementation. binary size of netshell.dll shrinks slightly on all branches: master RosBEWin2.2.2 GCC8.4.0 dbg x86 659.968 (0.4.15-dev-7598-geb55d98) releases/0.4.14 RosBEWin2.2.2 GCC8.4.0 dbg x86 644.608 -> 640.512 (netshell.dll is one of the rare modules where GCC8.4.0 produces more efficient output than GCC4.7.2) releases/0.4.14 RosBEWin2.1.6 GCC4.7.2 dbg x86 687.104 -> 682.496 releases/0.4.13 RosBEWin2.1.6 GCC4.7.2 dbg x86 685.568 -> 681.472 releases/0.4.12 RosBEWin2.1.6 GCC4.7.2 dbg x86 666.624 -> 662.016 releases/0.4.11 RosBEWin2.1.6 GCC4.7.2 dbg x86 657.408 -> 653.312 releases/0.4.10 RosBEWin2.1.6 GCC4.7.2 dbg x86 576.512 -> 572.928 releases/0.4. 9 RosBEWin2.1.6 GCC4.7.2 dbg x86 576.512 -> 572.416 releases/0.4. 8 RosBEWin2.1.6 GCC4.7.2 dbg x86 576.512 -> 572.416 releases/0.4. 7 RosBEWin2.1.6 GCC4.7.2 dbg x86 576.000 -> 571.904
71 lines
5.2 KiB
Plaintext
71 lines
5.2 KiB
Plaintext
=== Introduction ===
|
|
|
|
The netshell library is responsible for managing network connections. The user interface is accessed
|
|
by opening the control panel and selecting the "Network Connections" folder.
|
|
The netshell library provides COM interfaces to enumerate available network adapters, network protocols, network clients and network transports
|
|
and receive detailed information about them. However, it cannot configure these components. For configuration, look in the netcfgx documentation
|
|
(Hint: INetCfg)
|
|
|
|
=== Interface ===
|
|
|
|
The user interface is exposed by implementing the IShellFolder interface as required by explorer
|
|
namespace extension. The code is currently placed in shfldr_netconnect.c
|
|
|
|
The enumeration of the available network connections is performed by the IShellFolder::EnumObjects
|
|
(ISF_NetConnect_fnEnumObjects). It uses the INetConnectionManager interface implemented by netshell
|
|
in connectmanager.c to enumerate all available network connections.
|
|
|
|
The context menu of network connection items is populated by the IContextMenu::QueryContextMenu
|
|
(ISF_NetConnect_IContextMenu3_QueryContextMenu) which is obtained by IShellFolder::GetUIObjectOf. The actions are performed by the
|
|
IContextMenu::InvokeCommand function (ISF_NetConnect_IContextMenu3_InvokeCommand). At the moment
|
|
the actions "Status" / "Properties" are implemented.
|
|
|
|
=== Status Dialog & Notification Area ===
|
|
|
|
The status dialog is implemented by IOleCommandTarget interface(CLSID_ConnectionTray). This interface manages all status dialogs
|
|
for all available dialogs. The interface is implemented as a singleton to avoid multiple notification icons
|
|
appearing in the Notification area of the explorer. Every time the IShellFolder object is created (ISF_NetConnect_Constructor),
|
|
it creates a reference to IOleCommandTarget interface and calls its IOleCommandTarget::Exec function with CGID_ShellServiceObject.
|
|
This causes IOleCommandTarget interface to enumerate all available network connections, check if they should be shown (NCCF_SHOW_ICON flag set
|
|
in the NETCON_PROPERTIES dwCharacter), and add them to notification area with Shell_NotifyIcon. For that purpose a hidden window is created (dialog
|
|
procedure is LANStatusDlg) which receives WM_SHOWSTATUSDLG msg when it shall show display the status dialog.
|
|
|
|
When a user wants to display the status dialog by clicking on the context menu of network connection item, the IShellFolder sends the NetCfgInstanceId of
|
|
the selected network connection to IOleCommandTarget::Exec function. The function then looks up the specified notification item and then sends
|
|
the WM_SHOWSTATUSDLG msg to specific window.
|
|
|
|
=== Network Connections Property Dialog ===
|
|
|
|
The network connections property dialog is implemented by the INetConnectionPropertyUi2 interface. The class id is obtained by calling
|
|
INetConnection::GetUiObjectClassId of the current selected network connection. After obtaining the interface by calling CoCreateInstance, the
|
|
selected network connection is stored as reference by calling INetConnectionPropertyUi::SetConnection. The next step is to call
|
|
INetConnectionPropertyUi::AddPages to add custom property pages to the property sheet set. If the function succeeds, the caller can then invoke
|
|
PropertySheetW function to display the properties.
|
|
Note: If the context doesn't match, i.e. the INetConnectionPropertyUi2 cannot work together
|
|
with current INetConnection, then it should fail INetConnectionPropertyUi::AddPages
|
|
Note: The function ShowNetConnectionProperties in shlfdr_netconnect.c shows how to invoke the Network Connections Property Dialog
|
|
|
|
The enumeration of network components (protocols, client, transport) is done by using the INetCfg api). Initialization is performed in InitializeLANPropertiesUIDlg
|
|
function. When a user accepts changes, it calls INetCfg::Apply or when it aborts the changes INetCfg::Cancel.
|
|
|
|
=== Known Issues ===
|
|
* Status changes of an adapter are not automatically updated because the information is cached
|
|
* There seems to be an icon problem which makes icon blink in the status dialog
|
|
|
|
=== Testing in windows ===
|
|
|
|
Unfortunately in windows the CLSID_ConnectionManager class is implemented in the netman
|
|
service and netshell contains the rpc proxy stubs for it. This means that until we are able to
|
|
reimplement these stubs alongside all its unimplemented interfaces and objects, we can't replace
|
|
the system netshell with ours (INetConnectionManager and IEnumNetConnection are only the tip
|
|
of the iceberg).
|
|
However it is perfectly fine if one copies our netshell in a different folder and change the
|
|
registry settings to make it handle CLSID_ConnectionFolder, CLSID_LanConnectionUi and CLSID_ConnectionTray.
|
|
When doing so there are actually two options about how to test. One is leaving #define USE_CUSTOM_CONMGR 1
|
|
as is and the other is setting is to 0. What this does is that when 0, the connections will be enumerated
|
|
in the shell folder and the tray using the system's INetConnectionManager (which resides in the system's
|
|
netman service and is accessible through the system's netshell.dll). This allows us to implement and
|
|
test our three components against the correct implementation of INetConnectionManager.
|
|
The other option is setting USE_CUSTOM_CONMGR to 1 which will make the shell folder and the tray
|
|
enumerate connections with our connection manager effectively testing it in windows as well.
|