From 2864e4da5ef3d145809699fa82ec9066f30e0b34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 19 Feb 2015 17:37:04 +0000 Subject: [PATCH] Network: added global settings. * NetworkWindow now manages a single BNetworkSettings object that is shared with all add-ons. --- .../network_settings/NetworkSettingsAddOn.h | 8 +- .../ipv4/IPv4InterfaceAddOn.cpp | 29 ++-- .../ipv4/InterfaceAddressView.cpp | 164 +++++++++++------- .../ipv4/InterfaceAddressView.h | 16 +- src/preferences/network/Jamfile | 2 +- .../network/NetworkSettingsAddOn.cpp | 13 +- src/preferences/network/NetworkWindow.cpp | 24 ++- src/preferences/network/NetworkWindow.h | 10 +- 8 files changed, 173 insertions(+), 93 deletions(-) diff --git a/headers/os/add-ons/network_settings/NetworkSettingsAddOn.h b/headers/os/add-ons/network_settings/NetworkSettingsAddOn.h index 98d39b70d4..34cbc545fa 100644 --- a/headers/os/add-ons/network_settings/NetworkSettingsAddOn.h +++ b/headers/os/add-ons/network_settings/NetworkSettingsAddOn.h @@ -24,6 +24,7 @@ enum BNetworkSettingsType { }; class BNetworkProfile; +class BNetworkSettings; class BNetworkSettingsItem { @@ -68,7 +69,8 @@ private: class BNetworkSettingsAddOn { public: - BNetworkSettingsAddOn(image_id image); + BNetworkSettingsAddOn(image_id image, + BNetworkSettings& settings); virtual ~BNetworkSettingsAddOn(); virtual BNetworkSettingsInterfaceItem* @@ -79,16 +81,18 @@ public: image_id Image(); BResources* Resources(); + BNetworkSettings& Settings(); private: image_id fImage; BResources* fResources; + BNetworkSettings& fSettings; }; // Your add-on needs to export this hook in order to be picked up extern "C" BNetworkSettingsAddOn* instantiate_network_settings_add_on( - image_id image); + image_id image, BNetworkSettings& settings); } // namespace BNetworkKit diff --git a/src/add-ons/network_settings/ipv4/IPv4InterfaceAddOn.cpp b/src/add-ons/network_settings/ipv4/IPv4InterfaceAddOn.cpp index 165bdace75..038b0a3c2d 100644 --- a/src/add-ons/network_settings/ipv4/IPv4InterfaceAddOn.cpp +++ b/src/add-ons/network_settings/ipv4/IPv4InterfaceAddOn.cpp @@ -23,7 +23,8 @@ using namespace BNetworkKit; class IPv4InterfaceAddOn : public BNetworkSettingsAddOn { public: - IPv4InterfaceAddOn(image_id image); + IPv4InterfaceAddOn(image_id image, + BNetworkSettings& settings); virtual ~IPv4InterfaceAddOn(); virtual BNetworkSettingsInterfaceItem* @@ -34,7 +35,8 @@ public: class IPv4InterfaceItem : public BNetworkSettingsInterfaceItem { public: - IPv4InterfaceItem(const char* interface); + IPv4InterfaceItem(const char* interface, + BNetworkSettings& settings); virtual ~IPv4InterfaceItem(); virtual BListItem* ListItem(); @@ -45,6 +47,7 @@ public: virtual bool IsRevertable(); private: + BNetworkSettings& fSettings; BStringItem* fItem; InterfaceAddressView* fView; @@ -54,9 +57,11 @@ private: // #pragma mark - -IPv4InterfaceItem::IPv4InterfaceItem(const char* interface) +IPv4InterfaceItem::IPv4InterfaceItem(const char* interface, + BNetworkSettings& settings) : BNetworkSettingsInterfaceItem(interface), + fSettings(settings), fItem(new BStringItem(B_TRANSLATE("IPv4"))), fView(NULL) { @@ -82,10 +87,9 @@ IPv4InterfaceItem::ListItem() BView* IPv4InterfaceItem::View() { - if (fView == NULL) { - // TODO! - fView = new InterfaceAddressView(AF_INET, Interface()); - } + if (fView == NULL) + fView = new InterfaceAddressView(AF_INET, Interface(), fSettings); + return fView; } @@ -114,9 +118,10 @@ IPv4InterfaceItem::IsRevertable() // #pragma mark - -IPv4InterfaceAddOn::IPv4InterfaceAddOn(image_id image) +IPv4InterfaceAddOn::IPv4InterfaceAddOn(image_id image, + BNetworkSettings& settings) : - BNetworkSettingsAddOn(image) + BNetworkSettingsAddOn(image, settings) { } @@ -131,7 +136,7 @@ IPv4InterfaceAddOn::CreateNextInterfaceItem(uint32& cookie, const char* interface) { if (cookie++ == 0) - return new IPv4InterfaceItem(interface); + return new IPv4InterfaceItem(interface, Settings()); return NULL; } @@ -142,7 +147,7 @@ IPv4InterfaceAddOn::CreateNextInterfaceItem(uint32& cookie, extern "C" BNetworkSettingsAddOn* -instantiate_network_settings_add_on(image_id image) +instantiate_network_settings_add_on(image_id image, BNetworkSettings& settings) { - return new IPv4InterfaceAddOn(image); + return new IPv4InterfaceAddOn(image, settings); } diff --git a/src/add-ons/network_settings/ipv4/InterfaceAddressView.cpp b/src/add-ons/network_settings/ipv4/InterfaceAddressView.cpp index c2825bfed2..2b7961ceea 100644 --- a/src/add-ons/network_settings/ipv4/InterfaceAddressView.cpp +++ b/src/add-ons/network_settings/ipv4/InterfaceAddressView.cpp @@ -10,6 +10,8 @@ #include "InterfaceAddressView.h" +#include + #include #include #include @@ -26,22 +28,21 @@ #define B_TRANSLATION_CONTEXT "IntefaceAddressView" -enum { - M_MODE_AUTO = 'iato', - M_MODE_STATIC = 'istc', - M_MODE_OFF = 'ioff' -}; +const uint32 kModeAuto = 'iato'; +const uint32 kModeStatic = 'istc'; +const uint32 kModeDisabled = 'ioff'; // #pragma mark - InterfaceAddressView InterfaceAddressView::InterfaceAddressView(int family, - const char* interface) + const char* interface, BNetworkSettings& settings) : BGroupView(B_VERTICAL), fFamily(family), - fInterface(interface) + fInterface(interface), + fSettings(settings) { SetLayout(new BGroupLayout(B_VERTICAL)); @@ -50,38 +51,40 @@ InterfaceAddressView::InterfaceAddressView(int family, if (fFamily == AF_INET) { fModePopUpMenu->AddItem(new BMenuItem(B_TRANSLATE("DHCP"), - new BMessage(M_MODE_AUTO))); + new BMessage(kModeAuto))); } if (fFamily == AF_INET6) { // Automatic can be DHCPv6 or Router Advertisements fModePopUpMenu->AddItem(new BMenuItem(B_TRANSLATE("Automatic"), - new BMessage(M_MODE_AUTO))); + new BMessage(kModeAuto))); } fModePopUpMenu->AddItem(new BMenuItem(B_TRANSLATE("Static"), - new BMessage(M_MODE_STATIC))); + new BMessage(kModeStatic))); fModePopUpMenu->AddSeparatorItem(); - fModePopUpMenu->AddItem(new BMenuItem(B_TRANSLATE("Off"), - new BMessage(M_MODE_OFF))); + fModePopUpMenu->AddItem(new BMenuItem(B_TRANSLATE("Disabled"), + new BMessage(kModeDisabled))); fModeField = new BMenuField(B_TRANSLATE("Mode:"), fModePopUpMenu); - fModeField->SetToolTip(BString(B_TRANSLATE("The method for obtaining an IP address"))); + fModeField->SetToolTip( + B_TRANSLATE("The method for obtaining an IP address")); float minimumWidth = be_control_look->DefaultItemSpacing() * 16; fAddressField = new BTextControl(B_TRANSLATE("IP Address:"), NULL, NULL); - fAddressField->SetToolTip(BString(B_TRANSLATE("Your IP address"))); + fAddressField->SetToolTip(B_TRANSLATE("Your IP address")); fAddressField->TextView()->SetExplicitMinSize(BSize(minimumWidth, B_SIZE_UNSET)); fNetmaskField = new BTextControl(B_TRANSLATE("Netmask:"), NULL, NULL); - fNetmaskField->SetToolTip(BString(B_TRANSLATE("Your netmask"))); + fNetmaskField->SetToolTip(B_TRANSLATE("The netmask defines your local network")); fNetmaskField->TextView()->SetExplicitMinSize(BSize(minimumWidth, B_SIZE_UNSET)); fGatewayField = new BTextControl(B_TRANSLATE("Gateway:"), NULL, NULL); - fGatewayField->SetToolTip(BString(B_TRANSLATE("Your gateway"))); + fGatewayField->SetToolTip(B_TRANSLATE("Your gateway to the internet")); fGatewayField->TextView()->SetExplicitMinSize(BSize(minimumWidth, B_SIZE_UNSET)); - Revert(); - // Populate the fields + fSettings.GetInterface(interface, fOriginalInterface); + fInterfaceSettings = fOriginalInterface; + _UpdateFields(); BLayoutBuilder::Group<>(this) .AddGrid() @@ -90,15 +93,12 @@ InterfaceAddressView::InterfaceAddressView(int family, .AddTextControl(fNetmaskField, 0, 2, B_ALIGN_RIGHT) .AddTextControl(fGatewayField, 0, 3, B_ALIGN_RIGHT) .End() - .AddGlue() - .SetInsets(B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING, - B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING); + .AddGlue(); } InterfaceAddressView::~InterfaceAddressView() { - } @@ -116,22 +116,11 @@ void InterfaceAddressView::MessageReceived(BMessage* message) { switch (message->what) { - case M_MODE_AUTO: - _EnableFields(false); - _ShowFields(true); - break; - - case M_MODE_STATIC: - _EnableFields(true); - _ShowFields(true); - break; - - case M_MODE_OFF: - fAddressField->SetText(""); - fNetmaskField->SetText(""); - fGatewayField->SetText(""); - _EnableFields(false); - _ShowFields(false); + case kModeAuto: + case kModeStatic: + case kModeDisabled: + _SetModeField(message->what); + _UpdateSettings(); break; default: @@ -152,27 +141,6 @@ InterfaceAddressView::_EnableFields(bool enable) } -void -InterfaceAddressView::_ShowFields(bool show) -{ - if (show) { - if (fAddressField->IsHidden()) - fAddressField->Show(); - if (fNetmaskField->IsHidden()) - fNetmaskField->Show(); - if (fGatewayField->IsHidden()) - fGatewayField->Show(); - } else { - if (!fAddressField->IsHidden()) - fAddressField->Hide(); - if (!fNetmaskField->IsHidden()) - fNetmaskField->Hide(); - if (!fGatewayField->IsHidden()) - fGatewayField->Hide(); - } -} - - // #pragma mark - InterfaceAddressView public methods @@ -185,17 +153,14 @@ InterfaceAddressView::Revert() /* int32 mode; if (fSettings->AutoConfigure(fFamily)) { - mode = M_MODE_AUTO; + mode = kModeAuto; _EnableFields(false); - _ShowFields(true); } else if (fSettings->IPAddr(fFamily).IsEmpty()) { - mode = M_MODE_OFF; + mode = kModeDisabled; _EnableFields(false); - _ShowFields(false); } else { - mode = M_MODE_STATIC; + mode = kModeStatic; _EnableFields(true); - _ShowFields(true); } BMenuItem* item = fModePopUpMenu->FindItem(mode); @@ -222,7 +187,74 @@ InterfaceAddressView::Save() fSettings->SetIP(fFamily, fAddressField->Text()); fSettings->SetNetmask(fFamily, fNetmaskField->Text()); fSettings->SetGateway(fFamily, fGatewayField->Text()); - fSettings->SetAutoConfigure(fFamily, item->Command() == M_MODE_AUTO); + fSettings->SetAutoConfigure(fFamily, item->Command() == kModeAuto); */ return B_OK; } + + +void +InterfaceAddressView::_UpdateFields() +{ + bool autoConfigure = (fInterface.Flags() + & (IFF_AUTO_CONFIGURED | IFF_CONFIGURING)) != 0; + + BNetworkInterfaceAddress address; + status_t status = B_ERROR; + + int32 index = fInterface.FindFirstAddress(fFamily); + if (index >= 0) + status = fInterface.GetAddressAt(index, address); + if (index < 0 || status != B_OK + || address.Address().IsEmpty() && !autoConfigure) { + if (status == B_OK) { + // Check persistent settings for the mode -- the address + // can also be empty if the automatic configuration hasn't + // started yet. + autoConfigure = fInterfaceSettings.IsEmpty() + || fInterfaceSettings.GetBool("auto_config", false); + } + if (!autoConfigure) { + _SetModeField(kModeDisabled); + return; + } + } + + if (autoConfigure) + _SetModeField(kModeAuto); + else + _SetModeField(kModeStatic); + + fAddressField->SetText(address.Address().ToString()); + fNetmaskField->SetText(address.Mask().ToString()); + + BNetworkAddress gateway; + if (fInterface.GetDefaultRoute(fFamily, gateway) == B_OK) + fGatewayField->SetText(gateway.ToString()); + else + fGatewayField->SetText(NULL); +} + + +void +InterfaceAddressView::_SetModeField(uint32 mode) +{ + BMenuItem* item = fModePopUpMenu->FindItem(mode); + if (item != NULL) + item->SetMarked(true); + + _EnableFields(mode == kModeStatic); + + if (mode == kModeDisabled) { + fAddressField->SetText(NULL); + fNetmaskField->SetText(NULL); + fGatewayField->SetText(NULL); + } +} + + +/*! Updates the current settings from the controls. */ +void +InterfaceAddressView::_UpdateSettings() +{ +} diff --git a/src/add-ons/network_settings/ipv4/InterfaceAddressView.h b/src/add-ons/network_settings/ipv4/InterfaceAddressView.h index 530ba9f026..54db3827f8 100644 --- a/src/add-ons/network_settings/ipv4/InterfaceAddressView.h +++ b/src/add-ons/network_settings/ipv4/InterfaceAddressView.h @@ -12,6 +12,7 @@ #include #include +#include class BMenuField; @@ -21,10 +22,14 @@ class BRect; class BTextControl; +using namespace BNetworkKit; + + class InterfaceAddressView : public BGroupView { public: InterfaceAddressView(int family, - const char* interface); + const char* interface, + BNetworkSettings& settings); virtual ~InterfaceAddressView(); virtual void AttachedToWindow(); @@ -35,10 +40,17 @@ public: private: void _EnableFields(bool enable); - void _ShowFields(bool show); + void _UpdateFields(); + void _SetModeField(uint32 mode); + void _UpdateSettings(); +private: int fFamily; BNetworkInterface fInterface; + BNetworkSettings& fSettings; + + BMessage fOriginalInterface; + BMessage fInterfaceSettings; BPopUpMenu* fModePopUpMenu; BMenuField* fModeField; diff --git a/src/preferences/network/Jamfile b/src/preferences/network/Jamfile index 055d5b64a0..1ec2ddade0 100644 --- a/src/preferences/network/Jamfile +++ b/src/preferences/network/Jamfile @@ -1,7 +1,7 @@ SubDir HAIKU_TOP src preferences network ; UsePublicHeaders [ FDirName add-ons network_settings ] ; -UsePrivateHeaders net shared ; +UsePrivateHeaders net shared storage ; SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src apps networkstatus ] [ FDirName $(HAIKU_TOP) src bin network ifconfig ] ; diff --git a/src/preferences/network/NetworkSettingsAddOn.cpp b/src/preferences/network/NetworkSettingsAddOn.cpp index d581bf7c84..13992a782d 100644 --- a/src/preferences/network/NetworkSettingsAddOn.cpp +++ b/src/preferences/network/NetworkSettingsAddOn.cpp @@ -73,10 +73,12 @@ BNetworkSettingsInterfaceItem::Interface() const // #pragma mark - -BNetworkSettingsAddOn::BNetworkSettingsAddOn(image_id image) +BNetworkSettingsAddOn::BNetworkSettingsAddOn(image_id image, + BNetworkSettings& settings) : fImage(image), - fResources(NULL) + fResources(NULL), + fSettings(settings) { } @@ -126,3 +128,10 @@ BNetworkSettingsAddOn::Resources() } return fResources; } + + +BNetworkSettings& +BNetworkSettingsAddOn::Settings() +{ + return fSettings; +} diff --git a/src/preferences/network/NetworkWindow.cpp b/src/preferences/network/NetworkWindow.cpp index 3fe0d2a1e5..62b65d7edc 100644 --- a/src/preferences/network/NetworkWindow.cpp +++ b/src/preferences/network/NetworkWindow.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -129,13 +130,17 @@ NetworkWindow::NetworkWindow() _ScanInterfaces(); _ScanAddOns(); - // Set preferred size of the list view from its contents + // Set size of the list view from its contents float width; float height; fListView->GetPreferredSize(&width, &height); + width += 2 * be_control_look->DefaultItemSpacing(); + fListView->SetExplicitSize(BSize(width, B_SIZE_UNSET)); fListView->SetExplicitMinSize(BSize(width, std::min(height, 400.f))); CenterOnScreen(); + + fSettings.StartMonitoring(this); } @@ -206,6 +211,12 @@ NetworkWindow::MessageReceived(BMessage* message) break; } + case B_PATH_MONITOR: + { + fSettings.Update(message); + break; + } + default: inherited::MessageReceived(message); } @@ -283,6 +294,8 @@ NetworkWindow::_ScanInterfaces() continue; InterfaceListItem* item = new InterfaceListItem(interface.Name()); + item->SetExpanded(true); + fInterfaceItemMap.insert(std::pair( BString(interface.Name()), item)); fListView->AddItem(item); @@ -314,7 +327,8 @@ NetworkWindow::_ScanAddOns() continue; } - BNetworkSettingsAddOn* (*instantiateAddOn)(image_id image); + BNetworkSettingsAddOn* (*instantiateAddOn)(image_id image, + BNetworkSettings& settings); status_t status = get_image_symbol(image, "instantiate_network_settings_add_on", @@ -328,7 +342,7 @@ NetworkWindow::_ScanAddOns() continue; } - BNetworkSettingsAddOn* addOn = instantiateAddOn(image); + BNetworkSettingsAddOn* addOn = instantiateAddOn(image, fSettings); if (addOn == NULL) { unload_add_on(image); continue; @@ -388,8 +402,10 @@ NetworkWindow::_ListItemFor(BNetworkSettingsType type) { switch (type) { case B_NETWORK_SETTINGS_TYPE_SERVICE: - if (fServicesItem == NULL) + if (fServicesItem == NULL) { fServicesItem = new BStringItem(B_TRANSLATE("Services")); + fServicesItem->SetExpanded(true); + } return fServicesItem; diff --git a/src/preferences/network/NetworkWindow.h b/src/preferences/network/NetworkWindow.h index 0d84de3031..8731f074b9 100644 --- a/src/preferences/network/NetworkWindow.h +++ b/src/preferences/network/NetworkWindow.h @@ -15,7 +15,8 @@ #include #include -#include "NetworkSettingsAddOn.h" +#include +#include using namespace BNetworkKit; @@ -53,9 +54,7 @@ private: typedef std::map ItemMap; typedef std::map SettingsMap; - BButton* fRevertButton; - BButton* fApplyButton; - + BNetworkSettings fSettings; AddOnList fAddOns; BOutlineListView* fListView; @@ -68,6 +67,9 @@ private: InterfaceView* fInterfaceView; BView* fAddOnShellView; + + BButton* fRevertButton; + BButton* fApplyButton; };