int32 NetworkStatusView::_DetermineInterfaceStatus( const BNetworkInterface& interface) { uint32 flags = interface.Flags(); int32 status = kStatusNoLink; // TODO: no kStatusLinkNoConfig yet if (flags & IFF_CONFIGURING) status = kStatusConnecting; else if ((flags & (IFF_UP | IFF_LINK)) == (IFF_UP | IFF_LINK)) status = kStatusReady; return status; }
void NetworkWindow::_ScanInterfaces() { // Try existing devices first BNetworkRoster& roster = BNetworkRoster::Default(); BNetworkInterface interface; uint32 cookie = 0; while (roster.GetNextInterface(&cookie, interface) == B_OK) { if ((interface.Flags() & IFF_LOOPBACK) != 0) continue; InterfaceListItem* item = new InterfaceListItem(interface.Name()); item->SetExpanded(true); fInterfaceItemMap.insert(std::pair<BString, InterfaceListItem*>( BString(interface.Name()), item)); fListView->AddItem(item); } // TODO: Then consider those from the settings (for example, for USB) }
void NetworkStatusView::_Update(bool force) { BNetworkRoster& roster = BNetworkRoster::Default(); BNetworkInterface interface; uint32 cookie = 0; while (roster.GetNextInterface(&cookie, interface) == B_OK) { if ((interface.Flags() & IFF_LOOPBACK) == 0) { int32 oldStatus = kStatusUnknown; if (fInterfaceStatuses.find(interface.Name()) != fInterfaceStatuses.end()) { oldStatus = fInterfaceStatuses[interface.Name()]; } int32 status = _DetermineInterfaceStatus(interface); if (oldStatus != status) { BNotification notification(B_INFORMATION_NOTIFICATION); notification.SetGroup(B_TRANSLATE("Network Status")); notification.SetTitle(interface.Name()); notification.SetMessageID(interface.Name()); notification.SetIcon(fNotifyIcons[status]); if (status == kStatusConnecting || (status == kStatusReady && oldStatus == kStatusConnecting) || (status == kStatusNoLink && oldStatus == kStatusReady) || (status == kStatusNoLink && oldStatus == kStatusConnecting)) { // A significant state change, raise notification. notification.SetContent(kStatusDescriptions[status]); notification.Send(); } Invalidate(); } fInterfaceStatuses[interface.Name()] = status; } } }