Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenlanstatusui.cpp
Go to the documentation of this file.
00001 #include <precomp.h> 00002 00003 WINE_DEFAULT_DEBUG_CHANNEL (shell); 00004 00007 // IID B722BCCB-4E68-101B-A2BC-00AA00404770 00008 00009 #define WM_SHOWSTATUSDLG (WM_USER+10) 00010 00011 typedef struct tagNotificationItem 00012 { 00013 struct tagNotificationItem *pNext; 00014 CLSID guidItem; 00015 UINT uID; 00016 HWND hwndDlg; 00017 INetConnection *pNet; 00018 } NOTIFICATION_ITEM; 00019 00020 typedef struct 00021 { 00022 INetConnection *pNet; 00023 HWND hwndStatusDlg; /* LanStatusDlg window */ 00024 HWND hwndDlg; /* status dialog window */ 00025 DWORD dwAdapterIndex; 00026 UINT_PTR nIDEvent; 00027 UINT DHCPEnabled; 00028 DWORD dwInOctets; 00029 DWORD dwOutOctets; 00030 DWORD IpAddress; 00031 DWORD SubnetMask; 00032 DWORD Gateway; 00033 UINT uID; 00034 UINT Status; 00035 } LANSTATUSUI_CONTEXT; 00036 00037 class CLanStatus: 00038 public IOleCommandTarget 00039 { 00040 public: 00041 CLanStatus(); 00042 00043 // IUnknown 00044 virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut); 00045 virtual ULONG WINAPI AddRef(); 00046 virtual ULONG WINAPI Release(); 00047 00048 // IOleCommandTarget 00049 virtual HRESULT WINAPI QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText); 00050 virtual HRESULT WINAPI Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); 00051 00052 private: 00053 HRESULT InitializeNetTaskbarNotifications(); 00054 HRESULT ShowStatusDialogByCLSID(const GUID *pguidCmdGroup); 00055 00056 INetConnectionManager *lpNetMan; 00057 LONG ref; 00058 NOTIFICATION_ITEM *pHead; 00059 }; 00060 00061 CLanStatus::CLanStatus() 00062 { 00063 ref = 0; 00064 lpNetMan = NULL; 00065 pHead = NULL; 00066 } 00067 00068 VOID 00069 UpdateLanStatusUiDlg( 00070 HWND hwndDlg, 00071 MIB_IFROW *IfEntry, 00072 LANSTATUSUI_CONTEXT *pContext) 00073 { 00074 WCHAR szFormat[MAX_PATH] = {0}; 00075 WCHAR szBuffer[MAX_PATH] = {0}; 00076 SYSTEMTIME TimeConnected; 00077 DWORD DurationSeconds; 00078 WCHAR Buffer[100]; 00079 WCHAR DayBuffer[30]; 00080 WCHAR LocBuffer[50]; 00081 00082 #if 0 00083 ULONGLONG Ticks; 00084 #else 00085 DWORD Ticks; 00086 #endif 00087 00088 if (IfEntry->dwSpeed < 1000) 00089 { 00090 if (LoadStringW(netshell_hInstance, IDS_FORMAT_BIT, szFormat, sizeof(szFormat)/sizeof(WCHAR))) 00091 { 00092 swprintf(szBuffer, szFormat, IfEntry->dwSpeed); 00093 SendDlgItemMessageW(hwndDlg, IDC_SPEED, WM_SETTEXT, 0, (LPARAM)szBuffer); 00094 } 00095 } 00096 else if (IfEntry->dwSpeed < 1000000) 00097 { 00098 if (LoadStringW(netshell_hInstance, IDS_FORMAT_KBIT, szFormat, sizeof(szFormat)/sizeof(WCHAR))) 00099 { 00100 swprintf(szBuffer, szFormat, IfEntry->dwSpeed/1000); 00101 SendDlgItemMessageW(hwndDlg, IDC_SPEED, WM_SETTEXT, 0, (LPARAM)szBuffer); 00102 } 00103 } 00104 else if (IfEntry->dwSpeed < 1000000000) 00105 { 00106 if (LoadStringW(netshell_hInstance, IDS_FORMAT_MBIT, szFormat, sizeof(szFormat)/sizeof(WCHAR))) 00107 { 00108 swprintf(szBuffer, szFormat, IfEntry->dwSpeed/1000000); 00109 SendDlgItemMessageW(hwndDlg, IDC_SPEED, WM_SETTEXT, 0, (LPARAM)szBuffer); 00110 } 00111 } 00112 else 00113 { 00114 if (LoadStringW(netshell_hInstance, IDS_FORMAT_GBIT, szFormat, sizeof(szFormat)/sizeof(WCHAR))) 00115 { 00116 swprintf(szBuffer, szFormat, IfEntry->dwSpeed/1000000000); 00117 SendDlgItemMessageW(hwndDlg, IDC_SPEED, WM_SETTEXT, 0, (LPARAM)szBuffer); 00118 } 00119 } 00120 00121 if (StrFormatByteSizeW(IfEntry->dwInOctets, szBuffer, sizeof(szFormat)/sizeof(WCHAR))) 00122 { 00123 SendDlgItemMessageW(hwndDlg, IDC_RECEIVED, WM_SETTEXT, 0, (LPARAM)szBuffer); 00124 } 00125 00126 if (StrFormatByteSizeW(IfEntry->dwOutOctets, szBuffer, sizeof(szFormat)/sizeof(WCHAR))) 00127 { 00128 SendDlgItemMessageW(hwndDlg, IDC_SEND, WM_SETTEXT, 0, (LPARAM)szBuffer); 00129 } 00130 00131 #if 0 00132 Ticks = GetTickCount64(); 00133 #else 00134 Ticks = GetTickCount(); 00135 #endif 00136 00137 DurationSeconds = Ticks / 1000; 00138 TimeConnected.wSecond = (DurationSeconds % 60); 00139 TimeConnected.wMinute = (DurationSeconds / 60) % 60; 00140 TimeConnected.wHour = (DurationSeconds / (60 * 60)) % 24; 00141 TimeConnected.wDay = DurationSeconds / (60 * 60 * 24); 00142 00143 if (!GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &TimeConnected, L"HH':'mm':'ss", LocBuffer, sizeof(LocBuffer) / sizeof(LocBuffer[0]))) 00144 return; 00145 00146 if (!TimeConnected.wDay) 00147 { 00148 SendDlgItemMessageW(hwndDlg, IDC_DURATION, WM_SETTEXT, 0, (LPARAM)LocBuffer); 00149 } 00150 else 00151 { 00152 if (TimeConnected.wDay == 1) 00153 { 00154 if (!LoadStringW(netshell_hInstance, IDS_DURATION_DAY, DayBuffer, sizeof(DayBuffer) / sizeof(DayBuffer[0]))) 00155 DayBuffer[0] = L'\0'; 00156 } 00157 else 00158 { 00159 if (!LoadStringW(netshell_hInstance, IDS_DURATION_DAYS, DayBuffer, sizeof(DayBuffer) / sizeof(DayBuffer[0]))) 00160 DayBuffer[0] = L'\0'; 00161 } 00162 swprintf(Buffer, DayBuffer, TimeConnected.wDay, LocBuffer); 00163 SendDlgItemMessageW(hwndDlg, IDC_DURATION, WM_SETTEXT, 0, (LPARAM)Buffer); 00164 } 00165 00166 } 00167 00168 VOID 00169 UpdateLanStatus(HWND hwndDlg, LANSTATUSUI_CONTEXT * pContext) 00170 { 00171 MIB_IFROW IfEntry; 00172 HICON hIcon, hOldIcon = NULL; 00173 NOTIFYICONDATAW nid; 00174 NETCON_PROPERTIES * pProperties = NULL; 00175 00176 ZeroMemory(&IfEntry, sizeof(IfEntry)); 00177 IfEntry.dwIndex = pContext->dwAdapterIndex; 00178 if(GetIfEntry(&IfEntry) != NO_ERROR) 00179 { 00180 return; 00181 } 00182 00183 hIcon = NULL; 00184 if (IfEntry.dwOperStatus == MIB_IF_OPER_STATUS_CONNECTED || IfEntry.dwOperStatus == MIB_IF_OPER_STATUS_OPERATIONAL) 00185 { 00186 if (pContext->dwInOctets == IfEntry.dwInOctets && pContext->dwOutOctets == IfEntry.dwOutOctets && pContext->Status != 0) 00187 { 00188 hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_IDLE), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); 00189 pContext->Status = 0; 00190 } 00191 else if (pContext->dwInOctets != IfEntry.dwInOctets && pContext->dwOutOctets != IfEntry.dwOutOctets && pContext->Status != 1) 00192 { 00193 hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_TRANSREC), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); 00194 pContext->Status = 1; 00195 } 00196 else if (pContext->dwInOctets != IfEntry.dwInOctets && pContext->Status != 2) 00197 { 00198 hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_REC), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); 00199 pContext->Status = 2; 00200 } 00201 else if (pContext->dwOutOctets != IfEntry.dwOutOctets && pContext->Status != 3) 00202 { 00203 hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_TRANS), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); 00204 pContext->Status = 3; 00205 } 00206 } 00207 else if (IfEntry.dwOperStatus == MIB_IF_OPER_STATUS_UNREACHABLE || IfEntry.dwOperStatus == MIB_IF_OPER_STATUS_DISCONNECTED) 00208 { 00209 if (pContext->Status != 4) 00210 { 00211 hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); 00212 pContext->Status = 4; 00213 } 00214 } 00215 else if (IfEntry.dwOperStatus == MIB_IF_OPER_STATUS_NON_OPERATIONAL) 00216 { 00217 if (pContext->Status != 5) 00218 { 00219 hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); 00220 pContext->Status = 5; 00221 } 00222 } 00223 00224 if (hwndDlg && hIcon) 00225 { 00226 hOldIcon = (HICON)SendDlgItemMessageW(hwndDlg, IDC_NETSTAT, STM_SETICON, (WPARAM)hIcon, 0); 00227 if (hOldIcon) 00228 DestroyIcon(hOldIcon); 00229 } 00230 00231 ZeroMemory(&nid, sizeof(nid)); 00232 nid.cbSize = sizeof(nid); 00233 nid.uID = pContext->uID; 00234 nid.hWnd = pContext->hwndStatusDlg; 00235 nid.uVersion = 3; 00236 00237 if (pContext->pNet->GetProperties(&pProperties) == S_OK) 00238 { 00239 if (pProperties->dwCharacter & NCCF_SHOW_ICON) 00240 { 00241 if (hwndDlg) 00242 nid.hIcon = (HICON)CopyImage(hIcon, IMAGE_ICON, 16, 16, 0); 00243 else 00244 nid.hIcon = hIcon; 00245 00246 if (nid.hIcon) 00247 nid.uFlags |= NIF_ICON; 00248 00249 nid.uFlags |= NIF_STATE; 00250 nid.dwState = 0; 00251 nid.dwStateMask = NIS_HIDDEN; 00252 00253 if (pProperties->pszwName) 00254 { 00255 if (wcslen(pProperties->pszwName) * sizeof(WCHAR) < sizeof(nid.szTip)) 00256 { 00257 nid.uFlags |= NIF_TIP; 00258 wcscpy(nid.szTip, pProperties->pszwName); 00259 } 00260 else 00261 { 00262 CopyMemory(nid.szTip, pProperties->pszwName, sizeof(nid.szTip) - sizeof(WCHAR)); 00263 nid.szTip[(sizeof(nid.szTip)/sizeof(WCHAR))-1] = L'\0'; 00264 nid.uFlags |= NIF_TIP; 00265 } 00266 } 00267 } 00268 else 00269 { 00270 nid.uFlags |= NIF_STATE; 00271 nid.dwState = NIS_HIDDEN; 00272 nid.dwStateMask = NIS_HIDDEN; 00273 00274 } 00275 NcFreeNetconProperties(pProperties); 00276 } 00277 00278 Shell_NotifyIconW(NIM_MODIFY, &nid); 00279 00280 if (nid.uFlags & NIF_ICON) 00281 DestroyIcon(nid.hIcon); 00282 00283 pContext->dwInOctets = IfEntry.dwInOctets; 00284 pContext->dwOutOctets = IfEntry.dwOutOctets; 00285 00286 if (hwndDlg) 00287 UpdateLanStatusUiDlg(hwndDlg, &IfEntry, pContext); 00288 } 00289 00290 00291 VOID 00292 InitializeLANStatusUiDlg(HWND hwndDlg, LANSTATUSUI_CONTEXT * pContext) 00293 { 00294 WCHAR szBuffer[MAX_PATH] = {0}; 00295 NETCON_PROPERTIES * pProperties; 00296 00297 if (pContext->pNet->GetProperties(&pProperties) != S_OK) 00298 return; 00299 00300 if (pProperties->Status == NCS_DISCONNECTED) 00301 LoadStringW(netshell_hInstance, IDS_STATUS_UNREACHABLE, szBuffer, MAX_PATH); 00302 else if (pProperties->Status == NCS_MEDIA_DISCONNECTED) 00303 LoadStringW(netshell_hInstance, IDS_STATUS_DISCONNECTED, szBuffer, MAX_PATH); 00304 else if (pProperties->Status == NCS_CONNECTING) 00305 LoadStringW(netshell_hInstance, IDS_STATUS_CONNECTING, szBuffer, MAX_PATH); 00306 else if (pProperties->Status == NCS_CONNECTED) 00307 LoadStringW(netshell_hInstance, IDS_STATUS_CONNECTED, szBuffer, MAX_PATH); 00308 00309 SendDlgItemMessageW(hwndDlg, IDC_STATUS, WM_SETTEXT, 0, (LPARAM)szBuffer); 00310 00311 pContext->dwInOctets = 0; 00312 pContext->dwOutOctets = 0; 00313 00314 /* update adapter info */ 00315 pContext->Status = -1; 00316 UpdateLanStatus(hwndDlg, pContext); 00317 NcFreeNetconProperties(pProperties); 00318 } 00319 00320 static 00321 VOID 00322 InsertColumnToListView( 00323 HWND hDlgCtrl, 00324 UINT ResId, 00325 UINT SubItem, 00326 UINT Size) 00327 { 00328 WCHAR szBuffer[200]; 00329 LVCOLUMNW lc; 00330 00331 if (!LoadStringW(netshell_hInstance, ResId, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 00332 return; 00333 00334 memset(&lc, 0, sizeof(LV_COLUMN) ); 00335 lc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM | LVCF_FMT; 00336 lc.iSubItem = SubItem; 00337 lc.fmt = LVCFMT_FIXED_WIDTH; 00338 lc.cx = Size; 00339 lc.cchTextMax = wcslen(szBuffer); 00340 lc.pszText = szBuffer; 00341 00342 (void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMNW, SubItem, (LPARAM)&lc); 00343 } 00344 00345 static 00346 VOID 00347 AddIPAddressToListView( 00348 HWND hDlgCtrl, 00349 PIP_ADDR_STRING pAddr, 00350 INT Index) 00351 { 00352 LVITEMW li; 00353 PIP_ADDR_STRING pCur; 00354 WCHAR szBuffer[100]; 00355 UINT SubIndex; 00356 00357 ZeroMemory(&li, sizeof(LVITEMW)); 00358 li.mask = LVIF_TEXT; 00359 li.iItem = Index; 00360 pCur = pAddr; 00361 SubIndex = 0; 00362 00363 do 00364 { 00365 if (SubIndex) 00366 { 00367 ZeroMemory(&li, sizeof(LVITEMW)); 00368 li.mask = LVIF_TEXT; 00369 li.iItem = Index; 00370 li.iSubItem = 0; 00371 li.pszText = (LPWSTR)L""; 00372 li.iItem = SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&li); 00373 } 00374 00375 if (MultiByteToWideChar(CP_ACP, 0, pCur->IpAddress.String, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 00376 { 00377 li.pszText = szBuffer; 00378 li.iSubItem = 1; 00379 li.iItem = Index++; 00380 SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); 00381 } 00382 SubIndex++; 00383 pCur = pCur->Next; 00384 }while(pCur && pCur->IpAddress.String[0]); 00385 } 00386 00387 static 00388 INT 00389 InsertItemToListView( 00390 HWND hDlgCtrl, 00391 UINT ResId) 00392 { 00393 LVITEMW li; 00394 WCHAR szBuffer[100]; 00395 00396 ZeroMemory(&li, sizeof(LVITEMW)); 00397 li.mask = LVIF_TEXT; 00398 li.iItem = ListView_GetItemCount(hDlgCtrl); 00399 if (LoadStringW(netshell_hInstance, ResId, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 00400 { 00401 li.pszText = szBuffer; 00402 return (INT)SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&li); 00403 } 00404 return -1; 00405 } 00406 00407 00408 INT_PTR 00409 CALLBACK 00410 LANStatusUiDetailsDlg( 00411 HWND hwndDlg, 00412 UINT uMsg, 00413 WPARAM wParam, 00414 LPARAM lParam 00415 ) 00416 { 00417 LANSTATUSUI_CONTEXT * pContext; 00418 LVITEMW li; 00419 WCHAR szBuffer[100]; 00420 PIP_ADAPTER_INFO pAdapterInfo, pCurAdapter; 00421 PIP_PER_ADAPTER_INFO pPerAdapter; 00422 DWORD dwSize; 00423 HWND hDlgCtrl; 00424 00425 switch(uMsg) 00426 { 00427 case WM_INITDIALOG: 00428 pContext = (LANSTATUSUI_CONTEXT*)lParam; 00429 00430 hDlgCtrl = GetDlgItem(hwndDlg, IDC_DETAILS); 00431 InsertColumnToListView(hDlgCtrl, IDS_PROPERTY, 0, 80); 00432 InsertColumnToListView(hDlgCtrl, IDS_VALUE, 1, 80); 00433 00434 dwSize = 0; 00435 pCurAdapter = NULL; 00436 pAdapterInfo = NULL; 00437 if (GetAdaptersInfo(NULL, &dwSize) == ERROR_BUFFER_OVERFLOW) 00438 { 00439 pAdapterInfo = (PIP_ADAPTER_INFO)CoTaskMemAlloc(dwSize); 00440 if (pAdapterInfo) 00441 { 00442 if (GetAdaptersInfo(pAdapterInfo, &dwSize) == NO_ERROR) 00443 { 00444 pCurAdapter = pAdapterInfo; 00445 while(pCurAdapter && pCurAdapter->Index != pContext->dwAdapterIndex) 00446 pCurAdapter = pCurAdapter->Next; 00447 00448 if(pCurAdapter->Index != pContext->dwAdapterIndex) 00449 pCurAdapter = NULL; 00450 } 00451 } 00452 } 00453 00454 ZeroMemory(&li, sizeof(LVITEMW)); 00455 li.mask = LVIF_TEXT; 00456 li.iSubItem = 1; 00457 li.pszText = szBuffer; 00458 00459 if (pCurAdapter) 00460 { 00461 li.iItem = InsertItemToListView(hDlgCtrl, IDS_PHYSICAL_ADDRESS); 00462 if (li.iItem >= 0) 00463 { 00464 swprintf(szBuffer, L"%02x-%02x-%02x-%02x-%02x-%02x",pCurAdapter->Address[0], pCurAdapter->Address[1], 00465 pCurAdapter->Address[2], pCurAdapter->Address[3], pCurAdapter->Address[4], pCurAdapter->Address[5]); 00466 SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); 00467 } 00468 li.iItem = InsertItemToListView(hDlgCtrl, IDS_IP_ADDRESS); 00469 if (li.iItem >= 0) 00470 if (MultiByteToWideChar(CP_ACP, 0, pCurAdapter->IpAddressList.IpAddress.String, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 00471 SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); 00472 00473 li.iItem = InsertItemToListView(hDlgCtrl, IDS_SUBNET_MASK); 00474 if (li.iItem >= 0) 00475 if (MultiByteToWideChar(CP_ACP, 0, pCurAdapter->IpAddressList.IpMask.String, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 00476 SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); 00477 00478 li.iItem = InsertItemToListView(hDlgCtrl, IDS_DEF_GATEWAY); 00479 if (li.iItem >= 0 && pCurAdapter->GatewayList.IpAddress.String[0] != '0') 00480 { 00481 if (MultiByteToWideChar(CP_ACP, 0, pCurAdapter->GatewayList.IpAddress.String, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 00482 SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); 00483 } 00484 #if 0 00485 li.iItem = InsertItemToListView(hDlgCtrl, IDS_LEASE_OBTAINED); 00486 li.iItem = InsertItemToListView(hDlgCtrl, IDS_LEASE_EXPIRES); 00487 #endif 00488 } 00489 00490 dwSize = 0; 00491 if (GetPerAdapterInfo(pContext->dwAdapterIndex, NULL, &dwSize) == ERROR_BUFFER_OVERFLOW) 00492 { 00493 pPerAdapter = (PIP_PER_ADAPTER_INFO)CoTaskMemAlloc(dwSize); 00494 if (pPerAdapter) 00495 { 00496 if (GetPerAdapterInfo(pContext->dwAdapterIndex, pPerAdapter, &dwSize) == ERROR_SUCCESS) 00497 { 00498 li.iItem = InsertItemToListView(hDlgCtrl, IDS_DNS_SERVERS); 00499 if (li.iItem >= 0) 00500 AddIPAddressToListView(hDlgCtrl, &pPerAdapter->DnsServerList, li.iItem); 00501 } 00502 CoTaskMemFree(pPerAdapter); 00503 } 00504 } 00505 #if 0 00506 if (pCurAdapter) 00507 { 00508 li.iItem = InsertItemToListView(hDlgCtrl, IDS_WINS_SERVERS); 00509 AddIPAddressToListView(hDlgCtrl, &pCurAdapter->PrimaryWinsServer, li.iItem); 00510 AddIPAddressToListView(hDlgCtrl, &pCurAdapter->SecondaryWinsServer, li.iItem+1); 00511 } 00512 #endif 00513 CoTaskMemFree(pAdapterInfo); 00514 break; 00515 case WM_COMMAND: 00516 if (LOWORD(wParam) == IDC_CLOSE) 00517 { 00518 EndDialog(hwndDlg, FALSE); 00519 break; 00520 } 00521 } 00522 return FALSE; 00523 } 00524 00525 INT_PTR 00526 CALLBACK 00527 LANStatusUiAdvancedDlg( 00528 HWND hwndDlg, 00529 UINT uMsg, 00530 WPARAM wParam, 00531 LPARAM lParam 00532 ) 00533 { 00534 WCHAR szBuffer[100] = {0}; 00535 PROPSHEETPAGE *page; 00536 LANSTATUSUI_CONTEXT * pContext; 00537 DWORD dwIpAddr; 00538 00539 00540 switch(uMsg) 00541 { 00542 case WM_INITDIALOG: 00543 page = (PROPSHEETPAGE*)lParam; 00544 pContext = (LANSTATUSUI_CONTEXT*)page->lParam; 00545 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pContext); 00546 if (pContext->DHCPEnabled) 00547 LoadStringW(netshell_hInstance, IDS_ASSIGNED_DHCP, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)); 00548 else 00549 LoadStringW(netshell_hInstance, IDS_ASSIGNED_MANUAL, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)); 00550 00551 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; 00552 SendDlgItemMessageW(hwndDlg, IDC_DETAILSTYPE, WM_SETTEXT, 0, (LPARAM)szBuffer); 00553 00554 00555 dwIpAddr = ntohl(pContext->IpAddress); 00556 swprintf(szBuffer, L"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), 00557 THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr)); 00558 SendDlgItemMessageW(hwndDlg, IDC_DETAILSIP, WM_SETTEXT, 0, (LPARAM)szBuffer); 00559 00560 dwIpAddr = ntohl(pContext->SubnetMask); 00561 swprintf(szBuffer, L"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), 00562 THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr)); 00563 SendDlgItemMessageW(hwndDlg, IDC_DETAILSSUBNET, WM_SETTEXT, 0, (LPARAM)szBuffer); 00564 00565 dwIpAddr = ntohl(pContext->Gateway); 00566 if (dwIpAddr) 00567 { 00568 swprintf(szBuffer, L"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), 00569 THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr)); 00570 SendDlgItemMessageW(hwndDlg, IDC_DETAILSGATEWAY, WM_SETTEXT, 0, (LPARAM)szBuffer); 00571 } 00572 return TRUE; 00573 case WM_COMMAND: 00574 if (LOWORD(wParam) == IDC_DETAILS) 00575 { 00576 pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER); 00577 if (pContext) 00578 { 00579 DialogBoxParamW(netshell_hInstance, MAKEINTRESOURCEW(IDD_LAN_NETSTATUSDETAILS), GetParent(hwndDlg), 00580 LANStatusUiDetailsDlg, (LPARAM)pContext); 00581 } 00582 } 00583 break; 00584 default: 00585 break; 00586 } 00587 return FALSE; 00588 } 00589 00590 BOOL 00591 FindNetworkAdapter(HDEVINFO hInfo, SP_DEVINFO_DATA *pDevInfo, LPWSTR pGuid) 00592 { 00593 DWORD dwIndex, dwSize; 00594 HKEY hSubKey; 00595 WCHAR szNetCfg[50]; 00596 WCHAR szDetail[200] = L"SYSTEM\\CurrentControlSet\\Control\\Class\\"; 00597 00598 dwIndex = 0; 00599 do 00600 { 00601 00602 ZeroMemory(pDevInfo, sizeof(SP_DEVINFO_DATA)); 00603 pDevInfo->cbSize = sizeof(SP_DEVINFO_DATA); 00604 00605 /* get device info */ 00606 if (!SetupDiEnumDeviceInfo(hInfo, dwIndex++, pDevInfo)) 00607 break; 00608 00609 /* get device software registry path */ 00610 if (!SetupDiGetDeviceRegistryPropertyW(hInfo, pDevInfo, SPDRP_DRIVER, NULL, (LPBYTE)&szDetail[39], sizeof(szDetail)/sizeof(WCHAR) - 40, &dwSize)) 00611 break; 00612 00613 /* open device registry key */ 00614 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szDetail, 0, KEY_READ, &hSubKey) != ERROR_SUCCESS) 00615 break; 00616 00617 /* query NetCfgInstanceId for current device */ 00618 dwSize = sizeof(szNetCfg); 00619 if (RegQueryValueExW(hSubKey, L"NetCfgInstanceId", NULL, NULL, (LPBYTE)szNetCfg, &dwSize) != ERROR_SUCCESS) 00620 { 00621 RegCloseKey(hSubKey); 00622 break; 00623 } 00624 RegCloseKey(hSubKey); 00625 if (!_wcsicmp(pGuid, szNetCfg)) 00626 { 00627 return TRUE; 00628 } 00629 } 00630 while(TRUE); 00631 00632 return FALSE; 00633 } 00634 00635 VOID 00636 DisableNetworkAdapter(INetConnection * pNet, LANSTATUSUI_CONTEXT * pContext, HWND hwndDlg) 00637 { 00638 HKEY hKey; 00639 NETCON_PROPERTIES * pProperties; 00640 LPOLESTR pDisplayName; 00641 WCHAR szPath[200]; 00642 DWORD dwSize, dwType; 00643 LPWSTR pPnp; 00644 HDEVINFO hInfo; 00645 SP_DEVINFO_DATA DevInfo; 00646 SP_PROPCHANGE_PARAMS PropChangeParams; 00647 BOOL bClose = FALSE; 00648 NOTIFYICONDATAW nid; 00649 00650 if (FAILED(pNet->GetProperties(&pProperties))) 00651 return; 00652 00653 00654 hInfo = SetupDiGetClassDevsW(&GUID_DEVCLASS_NET, NULL, NULL, DIGCF_PRESENT ); 00655 if (!hInfo) 00656 { 00657 NcFreeNetconProperties(pProperties); 00658 return; 00659 } 00660 00661 if (FAILED(StringFromCLSID((CLSID)pProperties->guidId, &pDisplayName))) 00662 { 00663 NcFreeNetconProperties(pProperties); 00664 SetupDiDestroyDeviceInfoList(hInfo); 00665 return; 00666 } 00667 NcFreeNetconProperties(pProperties); 00668 00669 if (FindNetworkAdapter(hInfo, &DevInfo, pDisplayName)) 00670 { 00671 PropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); 00672 PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; //; 00673 PropChangeParams.StateChange = DICS_DISABLE; 00674 PropChangeParams.Scope = DICS_FLAG_CONFIGSPECIFIC; 00675 PropChangeParams.HwProfile = 0; 00676 00677 if (SetupDiSetClassInstallParams(hInfo, &DevInfo, &PropChangeParams.ClassInstallHeader, sizeof(SP_PROPCHANGE_PARAMS))) 00678 { 00679 if (SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hInfo, &DevInfo)) 00680 bClose = TRUE; 00681 } 00682 } 00683 SetupDiDestroyDeviceInfoList(hInfo); 00684 00685 swprintf(szPath, L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pDisplayName); 00686 CoTaskMemFree(pDisplayName); 00687 00688 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szPath, 0, KEY_READ, &hKey) != ERROR_SUCCESS) 00689 return; 00690 00691 dwSize = 0; 00692 if (RegQueryValueExW(hKey, L"PnpInstanceID", NULL, &dwType, NULL, &dwSize) != ERROR_SUCCESS || dwType != REG_SZ) 00693 { 00694 RegCloseKey(hKey); 00695 return; 00696 } 00697 00698 pPnp = (LPWSTR)CoTaskMemAlloc(dwSize); 00699 if (!pPnp) 00700 { 00701 RegCloseKey(hKey); 00702 return; 00703 } 00704 00705 if (RegQueryValueExW(hKey, L"PnpInstanceID", NULL, &dwType, (LPBYTE)pPnp, &dwSize) != ERROR_SUCCESS) 00706 { 00707 CoTaskMemFree(pPnp); 00708 RegCloseKey(hKey); 00709 return; 00710 } 00711 RegCloseKey(hKey); 00712 00713 swprintf(szPath, L"System\\CurrentControlSet\\Hardware Profiles\\Current\\System\\CurrentControlSet\\Enum\\%s", pPnp); 00714 CoTaskMemFree(pPnp); 00715 00716 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, szPath, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS) 00717 return; 00718 00719 dwSize = 1; /* enable = 0, disable = 1 */ 00720 RegSetValueExW(hKey, L"CSConfigFlags", 0, REG_DWORD, (LPBYTE)&dwSize, sizeof(DWORD)); 00721 RegCloseKey(hKey); 00722 00723 if (!bClose) 00724 return; 00725 00726 PropSheet_PressButton(GetParent(hwndDlg), PSBTN_CANCEL); 00727 ZeroMemory(&nid, sizeof(nid)); 00728 nid.cbSize = sizeof(nid); 00729 nid.uID = pContext->uID; 00730 nid.hWnd = pContext->hwndDlg; 00731 nid.uFlags = NIF_STATE; 00732 nid.dwState = NIS_HIDDEN; 00733 nid.dwStateMask = NIS_HIDDEN; 00734 00735 Shell_NotifyIconW(NIM_MODIFY, &nid); 00736 } 00737 00738 00739 INT_PTR 00740 CALLBACK 00741 LANStatusUiDlg( 00742 HWND hwndDlg, 00743 UINT uMsg, 00744 WPARAM wParam, 00745 LPARAM lParam) 00746 { 00747 PROPSHEETPAGE *page; 00748 LANSTATUSUI_CONTEXT * pContext; 00749 LPPSHNOTIFY lppsn; 00750 00751 switch(uMsg) 00752 { 00753 case WM_INITDIALOG: 00754 page = (PROPSHEETPAGE*)lParam; 00755 pContext = (LANSTATUSUI_CONTEXT*)page->lParam; 00756 pContext->hwndDlg = hwndDlg; 00757 InitializeLANStatusUiDlg(hwndDlg, pContext); 00758 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pContext); 00759 return TRUE; 00760 case WM_COMMAND: 00761 pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER); 00762 if (LOWORD(wParam) == IDC_STATUS_PROPERTIES) 00763 { 00764 if (pContext) 00765 { 00766 ShowNetConnectionProperties(pContext->pNet, GetParent(pContext->hwndDlg)); 00767 BringWindowToTop(GetParent(pContext->hwndDlg)); 00768 } 00769 break; 00770 } 00771 else if (LOWORD(wParam) == IDC_ENDISABLE) 00772 { 00773 DisableNetworkAdapter(pContext->pNet, pContext, hwndDlg); 00774 break; 00775 } 00776 case WM_NOTIFY: 00777 lppsn = (LPPSHNOTIFY) lParam; 00778 if (lppsn->hdr.code == PSN_APPLY || lppsn->hdr.code == PSN_RESET) 00779 { 00780 pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER); 00781 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR); 00782 pContext->hwndDlg = NULL; 00783 return TRUE; 00784 } 00785 break; 00786 } 00787 return FALSE; 00788 } 00789 00790 VOID 00791 InitializePropertyDialog( 00792 LANSTATUSUI_CONTEXT * pContext, 00793 NETCON_PROPERTIES * pProperties) 00794 { 00795 DWORD dwSize, dwAdapterIndex, dwResult; 00796 LPOLESTR pStr; 00797 IP_ADAPTER_INFO *pAdapterInfo, *pCurAdapter; 00798 00799 if (FAILED(StringFromCLSID((CLSID)pProperties->guidId, &pStr))) 00800 { 00801 return; 00802 } 00803 00804 /* get the IfTable */ 00805 dwSize = 0; 00806 dwResult = GetAdaptersInfo(NULL, &dwSize); 00807 if (dwResult!= ERROR_BUFFER_OVERFLOW) 00808 { 00809 CoTaskMemFree(pStr); 00810 return; 00811 } 00812 00813 pAdapterInfo = (PIP_ADAPTER_INFO)CoTaskMemAlloc(dwSize); 00814 if (!pAdapterInfo) 00815 { 00816 CoTaskMemFree(pAdapterInfo); 00817 CoTaskMemFree(pStr); 00818 return; 00819 } 00820 00821 if (GetAdaptersInfo(pAdapterInfo, &dwSize) != NO_ERROR) 00822 { 00823 CoTaskMemFree(pAdapterInfo); 00824 CoTaskMemFree(pStr); 00825 return; 00826 } 00827 00828 if (!GetAdapterIndexFromNetCfgInstanceId(pAdapterInfo, pStr, &dwAdapterIndex)) 00829 { 00830 CoTaskMemFree(pAdapterInfo); 00831 CoTaskMemFree(pStr); 00832 return; 00833 } 00834 00835 pCurAdapter = pAdapterInfo; 00836 while(pCurAdapter->Index != dwAdapterIndex) 00837 pCurAdapter = pCurAdapter->Next; 00838 00839 00840 pContext->IpAddress = inet_addr(pCurAdapter->IpAddressList.IpAddress.String); 00841 pContext->SubnetMask = inet_addr(pCurAdapter->IpAddressList.IpMask.String); 00842 pContext->Gateway = inet_addr(pCurAdapter->GatewayList.IpAddress.String); 00843 pContext->DHCPEnabled = pCurAdapter->DhcpEnabled; 00844 CoTaskMemFree(pStr); 00845 CoTaskMemFree(pAdapterInfo); 00846 pContext->dwAdapterIndex = dwAdapterIndex; 00847 } 00848 00849 VOID 00850 ShowStatusPropertyDialog( 00851 LANSTATUSUI_CONTEXT *pContext, 00852 HWND hwndDlg) 00853 { 00854 HPROPSHEETPAGE hppages[2]; 00855 PROPSHEETHEADERW pinfo; 00856 NETCON_PROPERTIES * pProperties = NULL; 00857 00858 ZeroMemory(&pinfo, sizeof(PROPSHEETHEADERW)); 00859 ZeroMemory(hppages, sizeof(hppages)); 00860 pinfo.dwSize = sizeof(PROPSHEETHEADERW); 00861 pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE | PSH_NOAPPLYNOW; 00862 pinfo.phpage = hppages; 00863 pinfo.hwndParent = hwndDlg; 00864 00865 if (pContext->pNet->GetProperties(&pProperties) == S_OK) 00866 { 00867 if (pProperties->pszwName) 00868 { 00869 pinfo.pszCaption = pProperties->pszwName; 00870 pinfo.dwFlags |= PSH_PROPTITLE; 00871 } 00872 InitializePropertyDialog(pContext, pProperties); 00873 if (pProperties->MediaType == NCM_LAN && pProperties->Status == NCS_CONNECTED) 00874 { 00875 hppages[0] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_LAN_NETSTATUS), LANStatusUiDlg, (LPARAM)pContext, NULL); 00876 if (hppages[0]) 00877 pinfo.nPages++; 00878 00879 hppages[pinfo.nPages] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_LAN_NETSTATUSADVANCED), LANStatusUiAdvancedDlg, (LPARAM)pContext, NULL); 00880 if (hppages[pinfo.nPages]) 00881 pinfo.nPages++; 00882 00883 if (pinfo.nPages) 00884 { 00885 PropertySheetW(&pinfo); 00886 } 00887 } 00888 else if (pProperties->Status == NCS_MEDIA_DISCONNECTED || pProperties->Status == NCS_DISCONNECTED || 00889 pProperties->Status == NCS_HARDWARE_DISABLED) 00890 { 00891 ShowNetConnectionProperties(pContext->pNet, pContext->hwndDlg); 00892 } 00893 00894 NcFreeNetconProperties(pProperties); 00895 } 00896 } 00897 00898 INT_PTR 00899 CALLBACK 00900 LANStatusDlg( 00901 HWND hwndDlg, 00902 UINT uMsg, 00903 WPARAM wParam, 00904 LPARAM lParam) 00905 { 00906 LANSTATUSUI_CONTEXT * pContext; 00907 00908 switch(uMsg) 00909 { 00910 case WM_INITDIALOG: 00911 pContext = (LANSTATUSUI_CONTEXT *)lParam; 00912 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam); 00913 pContext->nIDEvent = SetTimer(hwndDlg, 0xFABC, 1000, NULL); 00914 return TRUE; 00915 case WM_TIMER: 00916 pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER); 00917 if (wParam == (WPARAM)pContext->nIDEvent) 00918 { 00919 UpdateLanStatus(pContext->hwndDlg, pContext); 00920 } 00921 break; 00922 case WM_SHOWSTATUSDLG: 00923 if (LOWORD(lParam) == WM_LBUTTONDOWN) 00924 { 00925 pContext = (LANSTATUSUI_CONTEXT*)GetWindowLongPtr(hwndDlg, DWLP_USER); 00926 if (!pContext) 00927 break; 00928 00929 if (pContext->hwndDlg) 00930 { 00931 ShowWindow(GetParent(pContext->hwndDlg), SW_SHOW); 00932 BringWindowToTop(GetParent(pContext->hwndDlg)); 00933 } 00934 else 00935 { 00936 ShowStatusPropertyDialog(pContext, hwndDlg); 00937 } 00938 break; 00939 } 00940 break; 00941 } 00942 return FALSE; 00943 } 00944 00945 HRESULT 00946 CLanStatus::InitializeNetTaskbarNotifications() 00947 { 00948 NOTIFYICONDATAW nid; 00949 HWND hwndDlg; 00950 INetConnectionManager *pNetConMan; 00951 IEnumNetConnection *pEnumCon; 00952 INetConnection *pNetCon; 00953 NETCON_PROPERTIES* pProps; 00954 HRESULT hr; 00955 ULONG Count; 00956 ULONG Index; 00957 NOTIFICATION_ITEM * pItem, *pLast = NULL; 00958 LANSTATUSUI_CONTEXT * pContext; 00959 00960 TRACE("InitializeNetTaskbarNotifications\n"); 00961 00962 if (pHead) 00963 { 00964 pItem = pHead; 00965 while(pItem) 00966 { 00967 hr = pItem->pNet->GetProperties(&pProps); 00968 if (SUCCEEDED(hr)) 00969 { 00970 ZeroMemory(&nid, sizeof(nid)); 00971 nid.cbSize = sizeof(nid); 00972 nid.uID = pItem->uID; 00973 nid.hWnd = pItem->hwndDlg; 00974 nid.uFlags = NIF_STATE; 00975 if (pProps->dwCharacter & NCCF_SHOW_ICON) 00976 nid.dwState = 0; 00977 else 00978 nid.dwState = NIS_HIDDEN; 00979 00980 nid.dwStateMask = NIS_HIDDEN; 00981 Shell_NotifyIconW(NIM_MODIFY, &nid); 00982 NcFreeNetconProperties(pProps); 00983 } 00984 pItem = pItem->pNext; 00985 } 00986 return S_OK; 00987 } 00988 /* get an instance to of IConnectionManager */ 00989 00990 //hr = CoCreateInstance(&CLSID_ConnectionManager, NULL, CLSCTX_INPROC_SERVER, &IID_INetConnectionManager, (LPVOID*)&pNetConMan); 00991 00992 hr = INetConnectionManager_Constructor(NULL, IID_INetConnectionManager, (LPVOID*)&pNetConMan); 00993 if (FAILED(hr)) 00994 { 00995 ERR("INetConnectionManager_Constructor failed\n"); 00996 return hr; 00997 } 00998 00999 hr = pNetConMan->EnumConnections(NCME_DEFAULT, &pEnumCon); 01000 if (FAILED(hr)) 01001 { 01002 ERR("EnumConnections failed\n"); 01003 pNetConMan->Release(); 01004 return hr; 01005 } 01006 01007 Index = 1; 01008 do 01009 { 01010 hr = pEnumCon->Next(1, &pNetCon, &Count); 01011 if (hr == S_OK) 01012 { 01013 TRACE("new connection\n"); 01014 pItem = (NOTIFICATION_ITEM*)CoTaskMemAlloc(sizeof(NOTIFICATION_ITEM)); 01015 if (!pItem) 01016 break; 01017 01018 pContext = (LANSTATUSUI_CONTEXT*)CoTaskMemAlloc(sizeof(LANSTATUSUI_CONTEXT)); 01019 if (!pContext) 01020 { 01021 CoTaskMemFree(pItem); 01022 break; 01023 } 01024 01025 ZeroMemory(pContext, sizeof(LANSTATUSUI_CONTEXT)); 01026 pContext->uID = Index; 01027 pContext->pNet = pNetCon; 01028 pItem->uID = Index; 01029 pItem->pNext = NULL; 01030 pItem->pNet = pNetCon; 01031 hwndDlg = CreateDialogParamW(netshell_hInstance, MAKEINTRESOURCEW(IDD_STATUS), NULL, LANStatusDlg, (LPARAM)pContext); 01032 if (hwndDlg) 01033 { 01034 ZeroMemory(&nid, sizeof(nid)); 01035 nid.cbSize = sizeof(nid); 01036 nid.uID = Index++; 01037 nid.uFlags = NIF_MESSAGE; 01038 nid.uVersion = 3; 01039 nid.uCallbackMessage = WM_SHOWSTATUSDLG; 01040 nid.hWnd = hwndDlg; 01041 01042 hr = pNetCon->GetProperties(&pProps); 01043 if (SUCCEEDED(hr)) 01044 { 01045 CopyMemory(&pItem->guidItem, &pProps->guidId, sizeof(GUID)); 01046 if (!(pProps->dwCharacter & NCCF_SHOW_ICON)) 01047 { 01048 nid.dwState = NIS_HIDDEN; 01049 nid.dwStateMask = NIS_HIDDEN; 01050 nid.uFlags |= NIF_STATE; 01051 } 01052 if (pProps->Status == NCS_MEDIA_DISCONNECTED || pProps->Status == NCS_DISCONNECTED || pProps->Status == NCS_HARDWARE_DISABLED) 01053 nid.hIcon = LoadIcon(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF)); 01054 else if (pProps->Status == NCS_CONNECTED) 01055 nid.hIcon = LoadIcon(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_IDLE)); 01056 01057 if (nid.hIcon) 01058 nid.uFlags |= NIF_ICON; 01059 01060 wcscpy(nid.szTip, pProps->pszwName); 01061 nid.uFlags |= NIF_TIP; 01062 } 01063 pContext->hwndStatusDlg = hwndDlg; 01064 pItem->hwndDlg = hwndDlg; 01065 01066 if (Shell_NotifyIconW(NIM_ADD, &nid)) 01067 { 01068 if (pLast) 01069 pLast->pNext = pItem; 01070 else 01071 pHead = pItem; 01072 01073 pLast = pItem; 01074 Index++; 01075 } 01076 else 01077 { 01078 ERR("Shell_NotifyIconW failed\n"); 01079 CoTaskMemFree(pItem); 01080 } 01081 01082 if (nid.uFlags & NIF_ICON) 01083 DestroyIcon(nid.hIcon); 01084 } else 01085 ERR("CreateDialogParamW failed\n"); 01086 } 01087 } while(hr == S_OK); 01088 01089 lpNetMan = pNetConMan; 01090 pEnumCon->Release(); 01091 return S_OK; 01092 } 01093 01094 HRESULT 01095 CLanStatus::ShowStatusDialogByCLSID(const GUID *pguidCmdGroup) 01096 { 01097 NOTIFICATION_ITEM *pItem; 01098 01099 pItem = pHead; 01100 while(pItem) 01101 { 01102 if (IsEqualGUID(pItem->guidItem, *pguidCmdGroup)) 01103 { 01104 SendMessageW(pItem->hwndDlg, WM_SHOWSTATUSDLG, 0, WM_LBUTTONDOWN); 01105 return S_OK; 01106 } 01107 pItem = pItem->pNext; 01108 } 01109 01110 ERR("not found\n"); 01111 return E_FAIL; 01112 } 01113 01114 HRESULT 01115 WINAPI 01116 CLanStatus::QueryInterface( 01117 REFIID iid, 01118 LPVOID *ppvObj) 01119 { 01120 *ppvObj = NULL; 01121 01122 if (IsEqualIID(iid, IID_IUnknown) || 01123 IsEqualIID(iid, IID_IOleCommandTarget)) 01124 { 01125 *ppvObj = this; 01126 AddRef(); 01127 return S_OK; 01128 } 01129 MessageBoxW(NULL, L"IOleCommandTarget_fnQueryInterface", NULL, MB_OK); 01130 return E_NOINTERFACE; 01131 } 01132 01133 ULONG 01134 WINAPI 01135 CLanStatus::AddRef() 01136 { 01137 ULONG refCount = InterlockedIncrement(&ref); 01138 01139 return refCount; 01140 } 01141 01142 ULONG 01143 WINAPI 01144 CLanStatus::Release() 01145 { 01146 #if 0 // WTF?! 01147 ULONG refCount = InterlockedDecrement(&ref); 01148 01149 if (!refCount) 01150 delete this; 01151 01152 return refCount; 01153 #else 01154 return 1; 01155 #endif 01156 } 01157 01158 HRESULT 01159 WINAPI 01160 CLanStatus::QueryStatus( 01161 const GUID *pguidCmdGroup, 01162 ULONG cCmds, 01163 OLECMD *prgCmds, 01164 OLECMDTEXT *pCmdText) 01165 { 01166 MessageBoxW(NULL, pCmdText->rgwz, L"IOleCommandTarget_fnQueryStatus", MB_OK); 01167 return E_NOTIMPL; 01168 } 01169 01170 HRESULT 01171 WINAPI 01172 CLanStatus::Exec( 01173 const GUID *pguidCmdGroup, 01174 DWORD nCmdID, 01175 DWORD nCmdexecopt, 01176 VARIANT *pvaIn, 01177 VARIANT *pvaOut) 01178 { 01179 if (pguidCmdGroup) 01180 { 01181 if (IsEqualGUID(*pguidCmdGroup, CGID_ShellServiceObject)) 01182 { 01183 return InitializeNetTaskbarNotifications(); 01184 } 01185 else 01186 { 01187 /* invoke status dialog */ 01188 return ShowStatusDialogByCLSID(pguidCmdGroup); 01189 } 01190 } 01191 return S_OK; 01192 } 01193 01194 HRESULT WINAPI LanConnectStatusUI_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv) 01195 { 01196 TRACE("LanConnectStatusUI_Constructor\n"); 01197 01198 if (!ppv) 01199 return E_POINTER; 01200 01201 if (pUnkOuter) 01202 return CLASS_E_NOAGGREGATION; 01203 01204 CLanStatus *pLanStatus = new CLanStatus; 01205 if (!pLanStatus) 01206 return E_OUTOFMEMORY; 01207 01208 pLanStatus->AddRef(); 01209 static volatile CLanStatus *pCachedLanStatus = NULL; 01210 if (InterlockedCompareExchangePointer((void **)&pCachedLanStatus, pLanStatus, NULL) != NULL) 01211 pLanStatus->Release(); 01212 01213 return ((CLanStatus*)pCachedLanStatus)->QueryInterface(riid, ppv); 01214 } 01215 Generated on Mon May 28 2012 04:25:04 for ReactOS by
1.7.6.1
|