2 * PROJECT: ReactOS Shell
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: CLanStatus: Lan connection status dialog
5 * COPYRIGHT: Copyright 2008 Johannes Anderwald (johannes.anderwald@reactos.org)
12 CLanStatus::CLanStatus() :
22 LANSTATUSUI_CONTEXT
*pContext
)
24 WCHAR szFormat
[MAX_PATH
] = {0};
25 WCHAR szBuffer
[MAX_PATH
] = {0};
26 SYSTEMTIME TimeConnected
;
27 DWORD DurationSeconds
;
38 if (IfEntry
->dwSpeed
< 1000)
40 if (LoadStringW(netshell_hInstance
, IDS_FORMAT_BIT
, szFormat
, sizeof(szFormat
)/sizeof(WCHAR
)))
42 swprintf(szBuffer
, szFormat
, IfEntry
->dwSpeed
);
43 SendDlgItemMessageW(hwndDlg
, IDC_SPEED
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
46 else if (IfEntry
->dwSpeed
< 1000000)
48 if (LoadStringW(netshell_hInstance
, IDS_FORMAT_KBIT
, szFormat
, sizeof(szFormat
)/sizeof(WCHAR
)))
50 swprintf(szBuffer
, szFormat
, IfEntry
->dwSpeed
/1000);
51 SendDlgItemMessageW(hwndDlg
, IDC_SPEED
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
54 else if (IfEntry
->dwSpeed
< 1000000000)
56 if (LoadStringW(netshell_hInstance
, IDS_FORMAT_MBIT
, szFormat
, sizeof(szFormat
)/sizeof(WCHAR
)))
58 swprintf(szBuffer
, szFormat
, IfEntry
->dwSpeed
/1000000);
59 SendDlgItemMessageW(hwndDlg
, IDC_SPEED
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
64 if (LoadStringW(netshell_hInstance
, IDS_FORMAT_GBIT
, szFormat
, sizeof(szFormat
)/sizeof(WCHAR
)))
66 swprintf(szBuffer
, szFormat
, IfEntry
->dwSpeed
/1000000000);
67 SendDlgItemMessageW(hwndDlg
, IDC_SPEED
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
71 if (StrFormatByteSizeW(IfEntry
->dwInOctets
, szBuffer
, sizeof(szFormat
)/sizeof(WCHAR
)))
73 SendDlgItemMessageW(hwndDlg
, IDC_RECEIVED
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
76 if (StrFormatByteSizeW(IfEntry
->dwOutOctets
, szBuffer
, sizeof(szFormat
)/sizeof(WCHAR
)))
78 SendDlgItemMessageW(hwndDlg
, IDC_SEND
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
82 Ticks
= GetTickCount64();
84 Ticks
= GetTickCount();
87 DurationSeconds
= Ticks
/ 1000;
88 TimeConnected
.wSecond
= (DurationSeconds
% 60);
89 TimeConnected
.wMinute
= (DurationSeconds
/ 60) % 60;
90 TimeConnected
.wHour
= (DurationSeconds
/ (60 * 60)) % 24;
91 TimeConnected
.wDay
= DurationSeconds
/ (60 * 60 * 24);
93 if (!GetTimeFormatW(LOCALE_USER_DEFAULT
, 0, &TimeConnected
, L
"HH':'mm':'ss", LocBuffer
, sizeof(LocBuffer
) / sizeof(LocBuffer
[0])))
96 if (!TimeConnected
.wDay
)
98 SendDlgItemMessageW(hwndDlg
, IDC_DURATION
, WM_SETTEXT
, 0, (LPARAM
)LocBuffer
);
102 if (TimeConnected
.wDay
== 1)
104 if (!LoadStringW(netshell_hInstance
, IDS_DURATION_DAY
, DayBuffer
, sizeof(DayBuffer
) / sizeof(DayBuffer
[0])))
105 DayBuffer
[0] = L
'\0';
109 if (!LoadStringW(netshell_hInstance
, IDS_DURATION_DAYS
, DayBuffer
, sizeof(DayBuffer
) / sizeof(DayBuffer
[0])))
110 DayBuffer
[0] = L
'\0';
112 swprintf(Buffer
, DayBuffer
, TimeConnected
.wDay
, LocBuffer
);
113 SendDlgItemMessageW(hwndDlg
, IDC_DURATION
, WM_SETTEXT
, 0, (LPARAM
)Buffer
);
119 UpdateLanStatus(HWND hwndDlg
, LANSTATUSUI_CONTEXT
* pContext
)
122 HICON hIcon
, hOldIcon
= NULL
;
124 NETCON_PROPERTIES
* pProperties
= NULL
;
126 ZeroMemory(&IfEntry
, sizeof(IfEntry
));
127 IfEntry
.dwIndex
= pContext
->dwAdapterIndex
;
128 if (GetIfEntry(&IfEntry
) != NO_ERROR
)
134 if (IfEntry
.dwOperStatus
== MIB_IF_OPER_STATUS_CONNECTED
|| IfEntry
.dwOperStatus
== MIB_IF_OPER_STATUS_OPERATIONAL
)
136 if (pContext
->dwInOctets
== IfEntry
.dwInOctets
&& pContext
->dwOutOctets
== IfEntry
.dwOutOctets
&& pContext
->Status
!= 0)
138 hIcon
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_IDLE
), IMAGE_ICON
, 32, 32, LR_SHARED
);
139 pContext
->Status
= 0;
141 else if (pContext
->dwInOctets
!= IfEntry
.dwInOctets
&& pContext
->dwOutOctets
!= IfEntry
.dwOutOctets
&& pContext
->Status
!= 1)
143 hIcon
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_TRANSREC
), IMAGE_ICON
, 32, 32, LR_SHARED
);
144 pContext
->Status
= 1;
146 else if (pContext
->dwInOctets
!= IfEntry
.dwInOctets
&& pContext
->Status
!= 2)
148 hIcon
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_REC
), IMAGE_ICON
, 32, 32, LR_SHARED
);
149 pContext
->Status
= 2;
151 else if (pContext
->dwOutOctets
!= IfEntry
.dwOutOctets
&& pContext
->Status
!= 3)
153 hIcon
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_TRANS
), IMAGE_ICON
, 32, 32, LR_SHARED
);
154 pContext
->Status
= 3;
157 else if (IfEntry
.dwOperStatus
== MIB_IF_OPER_STATUS_UNREACHABLE
|| IfEntry
.dwOperStatus
== MIB_IF_OPER_STATUS_DISCONNECTED
)
159 if (pContext
->Status
!= 4)
161 hIcon
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_OFF
), IMAGE_ICON
, 32, 32, LR_SHARED
);
162 pContext
->Status
= 4;
165 else if (IfEntry
.dwOperStatus
== MIB_IF_OPER_STATUS_NON_OPERATIONAL
)
167 if (pContext
->Status
!= 5)
169 hIcon
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_OFF
), IMAGE_ICON
, 32, 32, LR_SHARED
);
170 pContext
->Status
= 5;
174 if (hwndDlg
&& hIcon
)
176 hOldIcon
= (HICON
)SendDlgItemMessageW(hwndDlg
, IDC_NETSTAT
, STM_SETICON
, (WPARAM
)hIcon
, 0);
178 DestroyIcon(hOldIcon
);
181 ZeroMemory(&nid
, sizeof(nid
));
182 nid
.cbSize
= sizeof(nid
);
183 nid
.uID
= pContext
->uID
;
184 nid
.hWnd
= pContext
->hwndStatusDlg
;
185 nid
.uVersion
= NOTIFYICON_VERSION
;
187 if (pContext
->pNet
->GetProperties(&pProperties
) == S_OK
)
189 if (pProperties
->dwCharacter
& NCCF_SHOW_ICON
)
192 nid
.hIcon
= (HICON
)CopyImage(hIcon
, IMAGE_ICON
, 16, 16, LR_COPYFROMRESOURCE
);
197 nid
.uFlags
|= NIF_ICON
;
199 nid
.uFlags
|= NIF_STATE
;
201 nid
.dwStateMask
= NIS_HIDDEN
;
203 if (pProperties
->pszwName
)
205 if (wcslen(pProperties
->pszwName
) * sizeof(WCHAR
) < sizeof(nid
.szTip
))
207 nid
.uFlags
|= NIF_TIP
;
208 wcscpy(nid
.szTip
, pProperties
->pszwName
);
212 CopyMemory(nid
.szTip
, pProperties
->pszwName
, sizeof(nid
.szTip
) - sizeof(WCHAR
));
213 nid
.szTip
[(sizeof(nid
.szTip
)/sizeof(WCHAR
))-1] = L
'\0';
214 nid
.uFlags
|= NIF_TIP
;
220 nid
.uFlags
|= NIF_STATE
;
221 nid
.dwState
= NIS_HIDDEN
;
222 nid
.dwStateMask
= NIS_HIDDEN
;
225 NcFreeNetconProperties(pProperties
);
228 Shell_NotifyIconW(NIM_MODIFY
, &nid
);
230 if (nid
.uFlags
& NIF_ICON
)
231 DestroyIcon(nid
.hIcon
);
233 pContext
->dwInOctets
= IfEntry
.dwInOctets
;
234 pContext
->dwOutOctets
= IfEntry
.dwOutOctets
;
237 UpdateLanStatusUiDlg(hwndDlg
, &IfEntry
, pContext
);
242 InitializeLANStatusUiDlg(HWND hwndDlg
, LANSTATUSUI_CONTEXT
* pContext
)
244 WCHAR szBuffer
[MAX_PATH
] = {0};
245 NETCON_PROPERTIES
* pProperties
;
247 if (pContext
->pNet
->GetProperties(&pProperties
) != S_OK
)
250 if (pProperties
->Status
== NCS_DISCONNECTED
)
251 LoadStringW(netshell_hInstance
, IDS_STATUS_UNREACHABLE
, szBuffer
, MAX_PATH
);
252 else if (pProperties
->Status
== NCS_MEDIA_DISCONNECTED
)
253 LoadStringW(netshell_hInstance
, IDS_STATUS_DISCONNECTED
, szBuffer
, MAX_PATH
);
254 else if (pProperties
->Status
== NCS_CONNECTING
)
255 LoadStringW(netshell_hInstance
, IDS_STATUS_CONNECTING
, szBuffer
, MAX_PATH
);
256 else if (pProperties
->Status
== NCS_CONNECTED
)
257 LoadStringW(netshell_hInstance
, IDS_STATUS_CONNECTED
, szBuffer
, MAX_PATH
);
259 SendDlgItemMessageW(hwndDlg
, IDC_STATUS
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
261 pContext
->dwInOctets
= 0;
262 pContext
->dwOutOctets
= 0;
264 /* update adapter info */
265 pContext
->Status
= -1;
266 UpdateLanStatus(hwndDlg
, pContext
);
267 NcFreeNetconProperties(pProperties
);
272 InsertColumnToListView(
281 if (!LoadStringW(netshell_hInstance
, ResId
, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
284 memset(&lc
, 0, sizeof(LV_COLUMN
) );
285 lc
.mask
= LVCF_WIDTH
| LVCF_TEXT
| LVCF_SUBITEM
| LVCF_FMT
;
286 lc
.iSubItem
= SubItem
;
287 lc
.fmt
= LVCFMT_FIXED_WIDTH
;
289 lc
.cchTextMax
= wcslen(szBuffer
);
290 lc
.pszText
= szBuffer
;
292 (void)SendMessageW(hDlgCtrl
, LVM_INSERTCOLUMNW
, SubItem
, (LPARAM
)&lc
);
297 AddIPAddressToListView(
299 PIP_ADDR_STRING pAddr
,
303 PIP_ADDR_STRING pCur
;
307 ZeroMemory(&li
, sizeof(LVITEMW
));
317 ZeroMemory(&li
, sizeof(LVITEMW
));
321 li
.pszText
= (LPWSTR
)L
"";
322 li
.iItem
= SendMessageW(hDlgCtrl
, LVM_INSERTITEMW
, 0, (LPARAM
)&li
);
325 if (MultiByteToWideChar(CP_ACP
, 0, pCur
->IpAddress
.String
, -1, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
327 li
.pszText
= szBuffer
;
330 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
334 } while (pCur
&& pCur
->IpAddress
.String
[0]);
339 InsertItemToListView(
346 ZeroMemory(&li
, sizeof(LVITEMW
));
348 li
.iItem
= ListView_GetItemCount(hDlgCtrl
);
349 if (LoadStringW(netshell_hInstance
, ResId
, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
351 li
.pszText
= szBuffer
;
352 return (INT
)SendMessageW(hDlgCtrl
, LVM_INSERTITEMW
, 0, (LPARAM
)&li
);
365 CString strBufferDate
;
366 CString strBufferTime
;
367 UINT nCharDate
, nCharTime
;
368 BOOL bResult
= FALSE
;
370 st
.wYear
= pTM
->tm_year
+ 1900;
371 st
.wMonth
= pTM
->tm_mon
+ 1;
372 st
.wDay
= pTM
->tm_mday
;
373 st
.wHour
= pTM
->tm_hour
;
374 st
.wMinute
= pTM
->tm_min
;
375 st
.wSecond
= pTM
->tm_sec
;
377 /* Check required size before cpy/cat */
378 nCharDate
= GetDateFormatW(LOCALE_USER_DEFAULT
, 0, &st
, NULL
, NULL
, 0) + 1;
379 nCharTime
= GetTimeFormatW(LOCALE_USER_DEFAULT
, 0, &st
, NULL
, NULL
, 0) + 1;
381 if (GetDateFormatW(LOCALE_USER_DEFAULT
, 0, &st
, NULL
, strBufferDate
.GetBuffer(nCharDate
), nCharDate
) &&
382 GetTimeFormatW(LOCALE_USER_DEFAULT
, 0, &st
, NULL
, strBufferTime
.GetBuffer(nCharTime
), nCharTime
))
384 StringCbCopy(szBuffer
, nBufferSize
, strBufferDate
);
385 StringCbCat(szBuffer
, nBufferSize
, L
" ");
386 StringCbCat(szBuffer
, nBufferSize
, strBufferTime
);
389 strBufferDate
.ReleaseBuffer();
390 strBufferTime
.ReleaseBuffer();
397 LANStatusUiDetailsDlg(
404 LANSTATUSUI_CONTEXT
* pContext
;
407 PIP_ADAPTER_INFO pAdapterInfo
, pCurAdapter
;
408 PIP_PER_ADAPTER_INFO pPerAdapter
;
416 pContext
= (LANSTATUSUI_CONTEXT
*)lParam
;
418 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_DETAILS
);
420 /* get client rect */
421 GetClientRect(hDlgCtrl
, &rect
);
423 /* calculate column width */
424 dwSize
= rect
.right
/ 2;
426 InsertColumnToListView(hDlgCtrl
, IDS_PROPERTY
, 0, dwSize
);
427 InsertColumnToListView(hDlgCtrl
, IDS_VALUE
, 1, dwSize
);
432 if (GetAdaptersInfo(NULL
, &dwSize
) == ERROR_BUFFER_OVERFLOW
)
434 pAdapterInfo
= static_cast<PIP_ADAPTER_INFO
>(CoTaskMemAlloc(dwSize
));
437 if (GetAdaptersInfo(pAdapterInfo
, &dwSize
) == NO_ERROR
)
439 pCurAdapter
= pAdapterInfo
;
440 while (pCurAdapter
&& pCurAdapter
->Index
!= pContext
->dwAdapterIndex
)
441 pCurAdapter
= pCurAdapter
->Next
;
443 if (pCurAdapter
->Index
!= pContext
->dwAdapterIndex
)
449 ZeroMemory(&li
, sizeof(LVITEMW
));
452 li
.pszText
= szBuffer
;
456 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_PHYSICAL_ADDRESS
);
459 swprintf(szBuffer
, L
"%02x-%02x-%02x-%02x-%02x-%02x",pCurAdapter
->Address
[0], pCurAdapter
->Address
[1],
460 pCurAdapter
->Address
[2], pCurAdapter
->Address
[3], pCurAdapter
->Address
[4], pCurAdapter
->Address
[5]);
461 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
463 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_IP_ADDRESS
);
465 if (MultiByteToWideChar(CP_ACP
, 0, pCurAdapter
->IpAddressList
.IpAddress
.String
, -1, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
466 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
468 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_SUBNET_MASK
);
470 if (MultiByteToWideChar(CP_ACP
, 0, pCurAdapter
->IpAddressList
.IpMask
.String
, -1, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
471 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
473 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_DEF_GATEWAY
);
474 if (li
.iItem
>= 0 && pCurAdapter
->GatewayList
.IpAddress
.String
[0] != '0')
476 if (MultiByteToWideChar(CP_ACP
, 0, pCurAdapter
->GatewayList
.IpAddress
.String
, -1, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
477 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
480 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_DHCP_SERVER
);
481 if (li
.iItem
>= 0 && pCurAdapter
->DhcpServer
.IpAddress
.String
[0] != '0')
483 if (MultiByteToWideChar(CP_ACP
, 0, pCurAdapter
->DhcpServer
.IpAddress
.String
, -1, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
484 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
487 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_LEASE_OBTAINED
);
488 if (li
.iItem
>= 0 && pCurAdapter
->LeaseObtained
!= NULL
)
490 struct tm
*leaseOptained
;
492 leaseOptained
= localtime(&pCurAdapter
->LeaseObtained
);
494 if (tmToStr(leaseOptained
, szBuffer
, _countof(szBuffer
)))
495 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
498 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_LEASE_EXPIRES
);
499 if (li
.iItem
>= 0 && pCurAdapter
->LeaseExpires
!= NULL
)
501 struct tm
*leaseExpire
;
503 leaseExpire
= localtime(&pCurAdapter
->LeaseExpires
);
505 if (tmToStr(leaseExpire
, szBuffer
, _countof(szBuffer
)))
506 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
511 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_DNS_SERVERS
);
512 if (GetPerAdapterInfo(pContext
->dwAdapterIndex
, NULL
, &dwSize
) == ERROR_BUFFER_OVERFLOW
)
514 pPerAdapter
= static_cast<PIP_PER_ADAPTER_INFO
>(CoTaskMemAlloc(dwSize
));
517 if (GetPerAdapterInfo(pContext
->dwAdapterIndex
, pPerAdapter
, &dwSize
) == ERROR_SUCCESS
)
520 AddIPAddressToListView(hDlgCtrl
, &pPerAdapter
->DnsServerList
, li
.iItem
);
522 CoTaskMemFree(pPerAdapter
);
528 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_WINS_SERVERS
);
529 if (pCurAdapter
->HaveWins
)
531 AddIPAddressToListView(hDlgCtrl
, &pCurAdapter
->PrimaryWinsServer
, li
.iItem
);
532 AddIPAddressToListView(hDlgCtrl
, &pCurAdapter
->SecondaryWinsServer
, li
.iItem
+1);
536 CoTaskMemFree(pAdapterInfo
);
540 if (LOWORD(wParam
) == IDC_CLOSE
)
542 EndDialog(hwndDlg
, FALSE
);
552 LANStatusUiAdvancedDlg(
558 WCHAR szBuffer
[100] = {0};
560 LANSTATUSUI_CONTEXT
* pContext
;
567 page
= (PROPSHEETPAGE
*)lParam
;
568 pContext
= (LANSTATUSUI_CONTEXT
*)page
->lParam
;
569 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pContext
);
570 if (pContext
->DHCPEnabled
)
571 LoadStringW(netshell_hInstance
, IDS_ASSIGNED_DHCP
, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
));
573 LoadStringW(netshell_hInstance
, IDS_ASSIGNED_MANUAL
, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
));
575 szBuffer
[(sizeof(szBuffer
)/sizeof(WCHAR
))-1] = L
'\0';
576 SendDlgItemMessageW(hwndDlg
, IDC_DETAILSTYPE
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
579 dwIpAddr
= ntohl(pContext
->IpAddress
);
580 swprintf(szBuffer
, L
"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr
), SECOND_IPADDRESS(dwIpAddr
),
581 THIRD_IPADDRESS(dwIpAddr
), FOURTH_IPADDRESS(dwIpAddr
));
582 SendDlgItemMessageW(hwndDlg
, IDC_DETAILSIP
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
584 dwIpAddr
= ntohl(pContext
->SubnetMask
);
585 swprintf(szBuffer
, L
"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr
), SECOND_IPADDRESS(dwIpAddr
),
586 THIRD_IPADDRESS(dwIpAddr
), FOURTH_IPADDRESS(dwIpAddr
));
587 SendDlgItemMessageW(hwndDlg
, IDC_DETAILSSUBNET
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
589 dwIpAddr
= ntohl(pContext
->Gateway
);
592 swprintf(szBuffer
, L
"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr
), SECOND_IPADDRESS(dwIpAddr
),
593 THIRD_IPADDRESS(dwIpAddr
), FOURTH_IPADDRESS(dwIpAddr
));
594 SendDlgItemMessageW(hwndDlg
, IDC_DETAILSGATEWAY
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
598 if (LOWORD(wParam
) == IDC_DETAILS
)
600 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
603 DialogBoxParamW(netshell_hInstance
, MAKEINTRESOURCEW(IDD_LAN_NETSTATUSDETAILS
), GetParent(hwndDlg
),
604 LANStatusUiDetailsDlg
, (LPARAM
)pContext
);
615 DisableNetworkAdapter(INetConnection
* pNet
, LANSTATUSUI_CONTEXT
* pContext
, HWND hwndDlg
)
617 HRESULT hr
= pNet
->Disconnect();
618 if (FAILED_UNEXPECTEDLY(hr
))
623 PropSheet_PressButton(GetParent(hwndDlg
), PSBTN_CANCEL
);
624 ZeroMemory(&nid
, sizeof(nid
));
625 nid
.cbSize
= sizeof(nid
);
626 nid
.uID
= pContext
->uID
;
627 nid
.hWnd
= pContext
->hwndDlg
;
628 nid
.uFlags
= NIF_STATE
;
629 nid
.dwState
= NIS_HIDDEN
;
630 nid
.dwStateMask
= NIS_HIDDEN
;
632 Shell_NotifyIconW(NIM_MODIFY
, &nid
);
645 LANSTATUSUI_CONTEXT
* pContext
;
651 page
= (PROPSHEETPAGE
*)lParam
;
652 pContext
= (LANSTATUSUI_CONTEXT
*)page
->lParam
;
653 pContext
->hwndDlg
= hwndDlg
;
654 InitializeLANStatusUiDlg(hwndDlg
, pContext
);
655 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pContext
);
658 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
659 if (LOWORD(wParam
) == IDC_STATUS_PROPERTIES
)
663 ShowNetConnectionProperties(pContext
->pNet
, GetParent(pContext
->hwndDlg
));
664 BringWindowToTop(GetParent(pContext
->hwndDlg
));
668 else if (LOWORD(wParam
) == IDC_ENDISABLE
)
670 DisableNetworkAdapter(pContext
->pNet
, pContext
, hwndDlg
);
674 lppsn
= (LPPSHNOTIFY
) lParam
;
675 if (lppsn
->hdr
.code
== PSN_APPLY
|| lppsn
->hdr
.code
== PSN_RESET
)
677 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
678 SetWindowLongPtr(hwndDlg
, DWLP_MSGRESULT
, PSNRET_NOERROR
);
679 pContext
->hwndDlg
= NULL
;
688 InitializePropertyDialog(
689 LANSTATUSUI_CONTEXT
* pContext
,
690 NETCON_PROPERTIES
* pProperties
)
692 DWORD dwSize
, dwAdapterIndex
, dwResult
;
694 IP_ADAPTER_INFO
*pAdapterInfo
, *pCurAdapter
;
696 if (FAILED(StringFromCLSID((CLSID
)pProperties
->guidId
, &pStr
)))
701 /* get the IfTable */
703 dwResult
= GetAdaptersInfo(NULL
, &dwSize
);
704 if (dwResult
!= ERROR_BUFFER_OVERFLOW
)
710 pAdapterInfo
= static_cast<PIP_ADAPTER_INFO
>(CoTaskMemAlloc(dwSize
));
713 CoTaskMemFree(pAdapterInfo
);
718 if (GetAdaptersInfo(pAdapterInfo
, &dwSize
) != NO_ERROR
)
720 CoTaskMemFree(pAdapterInfo
);
725 if (!GetAdapterIndexFromNetCfgInstanceId(pAdapterInfo
, pStr
, &dwAdapterIndex
))
727 CoTaskMemFree(pAdapterInfo
);
732 pCurAdapter
= pAdapterInfo
;
733 while (pCurAdapter
->Index
!= dwAdapterIndex
)
734 pCurAdapter
= pCurAdapter
->Next
;
737 pContext
->IpAddress
= inet_addr(pCurAdapter
->IpAddressList
.IpAddress
.String
);
738 pContext
->SubnetMask
= inet_addr(pCurAdapter
->IpAddressList
.IpMask
.String
);
739 pContext
->Gateway
= inet_addr(pCurAdapter
->GatewayList
.IpAddress
.String
);
740 pContext
->DHCPEnabled
= pCurAdapter
->DhcpEnabled
;
742 CoTaskMemFree(pAdapterInfo
);
743 pContext
->dwAdapterIndex
= dwAdapterIndex
;
747 PropSheetProc(HWND hwndDlg
, UINT uMsg
, LPARAM lParam
)
749 // NOTE: This callback is needed to set large icon correctly.
753 case PSCB_INITIALIZED
:
755 hIcon
= LoadIconW(netshell_hInstance
, MAKEINTRESOURCEW(IDI_NET_IDLE
));
756 SendMessageW(hwndDlg
, WM_SETICON
, ICON_BIG
, (LPARAM
)hIcon
);
764 ShowStatusPropertyDialog(
765 LANSTATUSUI_CONTEXT
*pContext
,
768 HPROPSHEETPAGE hppages
[2];
769 PROPSHEETHEADERW pinfo
;
770 NETCON_PROPERTIES
* pProperties
= NULL
;
772 ZeroMemory(&pinfo
, sizeof(PROPSHEETHEADERW
));
773 ZeroMemory(hppages
, sizeof(hppages
));
774 pinfo
.dwSize
= sizeof(PROPSHEETHEADERW
);
775 pinfo
.dwFlags
= PSH_NOCONTEXTHELP
| PSH_PROPTITLE
| PSH_NOAPPLYNOW
|
776 PSH_USEICONID
| PSH_USECALLBACK
;
777 pinfo
.phpage
= hppages
;
778 pinfo
.hwndParent
= hwndDlg
;
779 pinfo
.hInstance
= netshell_hInstance
;
780 pinfo
.pszIcon
= MAKEINTRESOURCEW(IDI_NET_IDLE
);
781 pinfo
.pfnCallback
= PropSheetProc
;
783 if (pContext
->pNet
->GetProperties(&pProperties
) == S_OK
)
785 if (pProperties
->pszwName
)
787 pinfo
.pszCaption
= pProperties
->pszwName
;
788 pinfo
.dwFlags
|= PSH_PROPTITLE
;
790 InitializePropertyDialog(pContext
, pProperties
);
791 if (pProperties
->MediaType
== NCM_LAN
&& pProperties
->Status
== NCS_CONNECTED
)
793 hppages
[0] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_LAN_NETSTATUS
), LANStatusUiDlg
, (LPARAM
)pContext
, NULL
);
797 hppages
[pinfo
.nPages
] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_LAN_NETSTATUSADVANCED
), LANStatusUiAdvancedDlg
, (LPARAM
)pContext
, NULL
);
798 if (hppages
[pinfo
.nPages
])
803 PropertySheetW(&pinfo
);
806 else if (pProperties
->Status
== NCS_MEDIA_DISCONNECTED
|| pProperties
->Status
== NCS_DISCONNECTED
||
807 pProperties
->Status
== NCS_HARDWARE_DISABLED
)
809 ShowNetConnectionProperties(pContext
->pNet
, pContext
->hwndDlg
);
812 NcFreeNetconProperties(pProperties
);
824 LANSTATUSUI_CONTEXT
* pContext
;
829 pContext
= (LANSTATUSUI_CONTEXT
*)lParam
;
830 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)lParam
);
831 pContext
->nIDEvent
= SetTimer(hwndDlg
, 0xFABC, 1000, NULL
);
834 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
835 if (wParam
== (WPARAM
)pContext
->nIDEvent
)
837 UpdateLanStatus(pContext
->hwndDlg
, pContext
);
840 case WM_SHOWSTATUSDLG
:
841 if (LOWORD(lParam
) == WM_LBUTTONDOWN
)
843 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
847 if (pContext
->hwndDlg
)
849 ShowWindow(GetParent(pContext
->hwndDlg
), SW_SHOW
);
850 BringWindowToTop(GetParent(pContext
->hwndDlg
));
854 ShowStatusPropertyDialog(pContext
, hwndDlg
);
864 CLanStatus::InitializeNetTaskbarNotifications()
868 CComPtr
<INetConnectionManager
> pNetConMan
;
869 CComPtr
<IEnumNetConnection
> pEnumCon
;
870 CComPtr
<INetConnection
> pNetCon
;
871 NETCON_PROPERTIES
* pProps
;
875 NOTIFICATION_ITEM
* pItem
, *pLast
= NULL
;
876 LANSTATUSUI_CONTEXT
* pContext
;
878 TRACE("InitializeNetTaskbarNotifications\n");
885 hr
= pItem
->pNet
->GetProperties(&pProps
);
888 ZeroMemory(&nid
, sizeof(nid
));
889 nid
.cbSize
= sizeof(nid
);
890 nid
.uID
= pItem
->uID
;
891 nid
.hWnd
= pItem
->hwndDlg
;
892 nid
.uFlags
= NIF_STATE
;
893 if (pProps
->dwCharacter
& NCCF_SHOW_ICON
)
896 nid
.dwState
= NIS_HIDDEN
;
898 nid
.dwStateMask
= NIS_HIDDEN
;
899 Shell_NotifyIconW(NIM_MODIFY
, &nid
);
900 NcFreeNetconProperties(pProps
);
902 pItem
= pItem
->pNext
;
906 /* get an instance to of IConnectionManager */
907 hr
= CNetConnectionManager_CreateInstance(IID_PPV_ARG(INetConnectionManager
, &pNetConMan
));
908 if (FAILED_UNEXPECTEDLY(hr
))
911 hr
= pNetConMan
->EnumConnections(NCME_DEFAULT
, &pEnumCon
);
912 if (FAILED_UNEXPECTEDLY(hr
))
919 hr
= pEnumCon
->Next(1, &pNetCon
, &Count
);
923 TRACE("new connection\n");
924 pItem
= static_cast<NOTIFICATION_ITEM
*>(CoTaskMemAlloc(sizeof(NOTIFICATION_ITEM
)));
928 pContext
= static_cast<LANSTATUSUI_CONTEXT
*>(CoTaskMemAlloc(sizeof(LANSTATUSUI_CONTEXT
)));
931 CoTaskMemFree(pItem
);
935 ZeroMemory(pContext
, sizeof(LANSTATUSUI_CONTEXT
));
936 pContext
->uID
= Index
;
937 pContext
->pNet
= pNetCon
;
940 pItem
->pNet
= pNetCon
;
942 hwndDlg
= CreateDialogParamW(netshell_hInstance
, MAKEINTRESOURCEW(IDD_STATUS
), NULL
, LANStatusDlg
, (LPARAM
)pContext
);
945 ERR("CreateDialogParamW failed\n");
949 ZeroMemory(&nid
, sizeof(nid
));
950 nid
.cbSize
= sizeof(nid
);
952 nid
.uFlags
= NIF_MESSAGE
;
953 nid
.uVersion
= NOTIFYICON_VERSION
;
954 nid
.uCallbackMessage
= WM_SHOWSTATUSDLG
;
957 hr
= pNetCon
->GetProperties(&pProps
);
960 CopyMemory(&pItem
->guidItem
, &pProps
->guidId
, sizeof(GUID
));
961 if (!(pProps
->dwCharacter
& NCCF_SHOW_ICON
))
963 nid
.dwState
= NIS_HIDDEN
;
964 nid
.dwStateMask
= NIS_HIDDEN
;
965 nid
.uFlags
|= NIF_STATE
;
967 if (pProps
->Status
== NCS_MEDIA_DISCONNECTED
|| pProps
->Status
== NCS_DISCONNECTED
|| pProps
->Status
== NCS_HARDWARE_DISABLED
)
968 nid
.hIcon
= LoadIcon(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_OFF
));
969 else if (pProps
->Status
== NCS_CONNECTED
)
970 nid
.hIcon
= LoadIcon(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_IDLE
));
973 nid
.uFlags
|= NIF_ICON
;
975 wcscpy(nid
.szTip
, pProps
->pszwName
);
976 nid
.uFlags
|= NIF_TIP
;
978 pContext
->hwndStatusDlg
= hwndDlg
;
979 pItem
->hwndDlg
= hwndDlg
;
981 if (Shell_NotifyIconW(NIM_ADD
, &nid
))
984 pLast
->pNext
= pItem
;
993 ERR("Shell_NotifyIconW failed\n");
994 CoTaskMemFree(pItem
);
997 if (nid
.uFlags
& NIF_ICON
)
998 DestroyIcon(nid
.hIcon
);
1001 m_lpNetMan
= pNetConMan
;
1006 CLanStatus::ShowStatusDialogByCLSID(const GUID
*pguidCmdGroup
)
1008 NOTIFICATION_ITEM
*pItem
;
1013 if (IsEqualGUID(pItem
->guidItem
, *pguidCmdGroup
))
1015 SendMessageW(pItem
->hwndDlg
, WM_SHOWSTATUSDLG
, 0, WM_LBUTTONDOWN
);
1018 pItem
= pItem
->pNext
;
1027 CLanStatus::QueryStatus(
1028 const GUID
*pguidCmdGroup
,
1031 OLECMDTEXT
*pCmdText
)
1033 MessageBoxW(NULL
, pCmdText
->rgwz
, L
"IOleCommandTarget_fnQueryStatus", MB_OK
);
1040 const GUID
*pguidCmdGroup
,
1048 if (IsEqualGUID(*pguidCmdGroup
, CGID_ShellServiceObject
))
1050 return InitializeNetTaskbarNotifications();
1054 /* invoke status dialog */
1055 return ShowStatusDialogByCLSID(pguidCmdGroup
);