Network: added global settings.

* NetworkWindow now manages a single BNetworkSettings object
  that is shared with all add-ons.
This commit is contained in:
Axel Dörfler
2015-03-27 13:21:48 +01:00
parent e267a9eb47
commit 2864e4da5e
8 changed files with 173 additions and 93 deletions
@@ -24,6 +24,7 @@ enum BNetworkSettingsType {
}; };
class BNetworkProfile; class BNetworkProfile;
class BNetworkSettings;
class BNetworkSettingsItem { class BNetworkSettingsItem {
@@ -68,7 +69,8 @@ private:
class BNetworkSettingsAddOn { class BNetworkSettingsAddOn {
public: public:
BNetworkSettingsAddOn(image_id image); BNetworkSettingsAddOn(image_id image,
BNetworkSettings& settings);
virtual ~BNetworkSettingsAddOn(); virtual ~BNetworkSettingsAddOn();
virtual BNetworkSettingsInterfaceItem* virtual BNetworkSettingsInterfaceItem*
@@ -79,16 +81,18 @@ public:
image_id Image(); image_id Image();
BResources* Resources(); BResources* Resources();
BNetworkSettings& Settings();
private: private:
image_id fImage; image_id fImage;
BResources* fResources; BResources* fResources;
BNetworkSettings& fSettings;
}; };
// Your add-on needs to export this hook in order to be picked up // Your add-on needs to export this hook in order to be picked up
extern "C" BNetworkSettingsAddOn* instantiate_network_settings_add_on( extern "C" BNetworkSettingsAddOn* instantiate_network_settings_add_on(
image_id image); image_id image, BNetworkSettings& settings);
} // namespace BNetworkKit } // namespace BNetworkKit
@@ -23,7 +23,8 @@ using namespace BNetworkKit;
class IPv4InterfaceAddOn : public BNetworkSettingsAddOn { class IPv4InterfaceAddOn : public BNetworkSettingsAddOn {
public: public:
IPv4InterfaceAddOn(image_id image); IPv4InterfaceAddOn(image_id image,
BNetworkSettings& settings);
virtual ~IPv4InterfaceAddOn(); virtual ~IPv4InterfaceAddOn();
virtual BNetworkSettingsInterfaceItem* virtual BNetworkSettingsInterfaceItem*
@@ -34,7 +35,8 @@ public:
class IPv4InterfaceItem : public BNetworkSettingsInterfaceItem { class IPv4InterfaceItem : public BNetworkSettingsInterfaceItem {
public: public:
IPv4InterfaceItem(const char* interface); IPv4InterfaceItem(const char* interface,
BNetworkSettings& settings);
virtual ~IPv4InterfaceItem(); virtual ~IPv4InterfaceItem();
virtual BListItem* ListItem(); virtual BListItem* ListItem();
@@ -45,6 +47,7 @@ public:
virtual bool IsRevertable(); virtual bool IsRevertable();
private: private:
BNetworkSettings& fSettings;
BStringItem* fItem; BStringItem* fItem;
InterfaceAddressView* InterfaceAddressView*
fView; fView;
@@ -54,9 +57,11 @@ private:
// #pragma mark - // #pragma mark -
IPv4InterfaceItem::IPv4InterfaceItem(const char* interface) IPv4InterfaceItem::IPv4InterfaceItem(const char* interface,
BNetworkSettings& settings)
: :
BNetworkSettingsInterfaceItem(interface), BNetworkSettingsInterfaceItem(interface),
fSettings(settings),
fItem(new BStringItem(B_TRANSLATE("IPv4"))), fItem(new BStringItem(B_TRANSLATE("IPv4"))),
fView(NULL) fView(NULL)
{ {
@@ -82,10 +87,9 @@ IPv4InterfaceItem::ListItem()
BView* BView*
IPv4InterfaceItem::View() IPv4InterfaceItem::View()
{ {
if (fView == NULL) { if (fView == NULL)
// TODO! fView = new InterfaceAddressView(AF_INET, Interface(), fSettings);
fView = new InterfaceAddressView(AF_INET, Interface());
}
return fView; return fView;
} }
@@ -114,9 +118,10 @@ IPv4InterfaceItem::IsRevertable()
// #pragma mark - // #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) const char* interface)
{ {
if (cookie++ == 0) if (cookie++ == 0)
return new IPv4InterfaceItem(interface); return new IPv4InterfaceItem(interface, Settings());
return NULL; return NULL;
} }
@@ -142,7 +147,7 @@ IPv4InterfaceAddOn::CreateNextInterfaceItem(uint32& cookie,
extern "C" extern "C"
BNetworkSettingsAddOn* 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);
} }
@@ -10,6 +10,8 @@
#include "InterfaceAddressView.h" #include "InterfaceAddressView.h"
#include <stdio.h>
#include <Catalog.h> #include <Catalog.h>
#include <ControlLook.h> #include <ControlLook.h>
#include <LayoutBuilder.h> #include <LayoutBuilder.h>
@@ -26,22 +28,21 @@
#define B_TRANSLATION_CONTEXT "IntefaceAddressView" #define B_TRANSLATION_CONTEXT "IntefaceAddressView"
enum { const uint32 kModeAuto = 'iato';
M_MODE_AUTO = 'iato', const uint32 kModeStatic = 'istc';
M_MODE_STATIC = 'istc', const uint32 kModeDisabled = 'ioff';
M_MODE_OFF = 'ioff'
};
// #pragma mark - InterfaceAddressView // #pragma mark - InterfaceAddressView
InterfaceAddressView::InterfaceAddressView(int family, InterfaceAddressView::InterfaceAddressView(int family,
const char* interface) const char* interface, BNetworkSettings& settings)
: :
BGroupView(B_VERTICAL), BGroupView(B_VERTICAL),
fFamily(family), fFamily(family),
fInterface(interface) fInterface(interface),
fSettings(settings)
{ {
SetLayout(new BGroupLayout(B_VERTICAL)); SetLayout(new BGroupLayout(B_VERTICAL));
@@ -50,38 +51,40 @@ InterfaceAddressView::InterfaceAddressView(int family,
if (fFamily == AF_INET) { if (fFamily == AF_INET) {
fModePopUpMenu->AddItem(new BMenuItem(B_TRANSLATE("DHCP"), fModePopUpMenu->AddItem(new BMenuItem(B_TRANSLATE("DHCP"),
new BMessage(M_MODE_AUTO))); new BMessage(kModeAuto)));
} }
if (fFamily == AF_INET6) { if (fFamily == AF_INET6) {
// Automatic can be DHCPv6 or Router Advertisements // Automatic can be DHCPv6 or Router Advertisements
fModePopUpMenu->AddItem(new BMenuItem(B_TRANSLATE("Automatic"), fModePopUpMenu->AddItem(new BMenuItem(B_TRANSLATE("Automatic"),
new BMessage(M_MODE_AUTO))); new BMessage(kModeAuto)));
} }
fModePopUpMenu->AddItem(new BMenuItem(B_TRANSLATE("Static"), fModePopUpMenu->AddItem(new BMenuItem(B_TRANSLATE("Static"),
new BMessage(M_MODE_STATIC))); new BMessage(kModeStatic)));
fModePopUpMenu->AddSeparatorItem(); fModePopUpMenu->AddSeparatorItem();
fModePopUpMenu->AddItem(new BMenuItem(B_TRANSLATE("Off"), fModePopUpMenu->AddItem(new BMenuItem(B_TRANSLATE("Disabled"),
new BMessage(M_MODE_OFF))); new BMessage(kModeDisabled)));
fModeField = new BMenuField(B_TRANSLATE("Mode:"), fModePopUpMenu); 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; float minimumWidth = be_control_look->DefaultItemSpacing() * 16;
fAddressField = new BTextControl(B_TRANSLATE("IP Address:"), NULL, NULL); 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)); fAddressField->TextView()->SetExplicitMinSize(BSize(minimumWidth, B_SIZE_UNSET));
fNetmaskField = new BTextControl(B_TRANSLATE("Netmask:"), NULL, NULL); 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)); fNetmaskField->TextView()->SetExplicitMinSize(BSize(minimumWidth, B_SIZE_UNSET));
fGatewayField = new BTextControl(B_TRANSLATE("Gateway:"), NULL, NULL); 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)); fGatewayField->TextView()->SetExplicitMinSize(BSize(minimumWidth, B_SIZE_UNSET));
Revert(); fSettings.GetInterface(interface, fOriginalInterface);
// Populate the fields fInterfaceSettings = fOriginalInterface;
_UpdateFields();
BLayoutBuilder::Group<>(this) BLayoutBuilder::Group<>(this)
.AddGrid() .AddGrid()
@@ -90,15 +93,12 @@ InterfaceAddressView::InterfaceAddressView(int family,
.AddTextControl(fNetmaskField, 0, 2, B_ALIGN_RIGHT) .AddTextControl(fNetmaskField, 0, 2, B_ALIGN_RIGHT)
.AddTextControl(fGatewayField, 0, 3, B_ALIGN_RIGHT) .AddTextControl(fGatewayField, 0, 3, B_ALIGN_RIGHT)
.End() .End()
.AddGlue() .AddGlue();
.SetInsets(B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING,
B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING);
} }
InterfaceAddressView::~InterfaceAddressView() InterfaceAddressView::~InterfaceAddressView()
{ {
} }
@@ -116,22 +116,11 @@ void
InterfaceAddressView::MessageReceived(BMessage* message) InterfaceAddressView::MessageReceived(BMessage* message)
{ {
switch (message->what) { switch (message->what) {
case M_MODE_AUTO: case kModeAuto:
_EnableFields(false); case kModeStatic:
_ShowFields(true); case kModeDisabled:
break; _SetModeField(message->what);
_UpdateSettings();
case M_MODE_STATIC:
_EnableFields(true);
_ShowFields(true);
break;
case M_MODE_OFF:
fAddressField->SetText("");
fNetmaskField->SetText("");
fGatewayField->SetText("");
_EnableFields(false);
_ShowFields(false);
break; break;
default: 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 // #pragma mark - InterfaceAddressView public methods
@@ -185,17 +153,14 @@ InterfaceAddressView::Revert()
/* /*
int32 mode; int32 mode;
if (fSettings->AutoConfigure(fFamily)) { if (fSettings->AutoConfigure(fFamily)) {
mode = M_MODE_AUTO; mode = kModeAuto;
_EnableFields(false); _EnableFields(false);
_ShowFields(true);
} else if (fSettings->IPAddr(fFamily).IsEmpty()) { } else if (fSettings->IPAddr(fFamily).IsEmpty()) {
mode = M_MODE_OFF; mode = kModeDisabled;
_EnableFields(false); _EnableFields(false);
_ShowFields(false);
} else { } else {
mode = M_MODE_STATIC; mode = kModeStatic;
_EnableFields(true); _EnableFields(true);
_ShowFields(true);
} }
BMenuItem* item = fModePopUpMenu->FindItem(mode); BMenuItem* item = fModePopUpMenu->FindItem(mode);
@@ -222,7 +187,74 @@ InterfaceAddressView::Save()
fSettings->SetIP(fFamily, fAddressField->Text()); fSettings->SetIP(fFamily, fAddressField->Text());
fSettings->SetNetmask(fFamily, fNetmaskField->Text()); fSettings->SetNetmask(fFamily, fNetmaskField->Text());
fSettings->SetGateway(fFamily, fGatewayField->Text()); fSettings->SetGateway(fFamily, fGatewayField->Text());
fSettings->SetAutoConfigure(fFamily, item->Command() == M_MODE_AUTO); fSettings->SetAutoConfigure(fFamily, item->Command() == kModeAuto);
*/ */
return B_OK; 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()
{
}
@@ -12,6 +12,7 @@
#include <GroupView.h> #include <GroupView.h>
#include <NetworkInterface.h> #include <NetworkInterface.h>
#include <NetworkSettings.h>
class BMenuField; class BMenuField;
@@ -21,10 +22,14 @@ class BRect;
class BTextControl; class BTextControl;
using namespace BNetworkKit;
class InterfaceAddressView : public BGroupView { class InterfaceAddressView : public BGroupView {
public: public:
InterfaceAddressView(int family, InterfaceAddressView(int family,
const char* interface); const char* interface,
BNetworkSettings& settings);
virtual ~InterfaceAddressView(); virtual ~InterfaceAddressView();
virtual void AttachedToWindow(); virtual void AttachedToWindow();
@@ -35,10 +40,17 @@ public:
private: private:
void _EnableFields(bool enable); void _EnableFields(bool enable);
void _ShowFields(bool show); void _UpdateFields();
void _SetModeField(uint32 mode);
void _UpdateSettings();
private:
int fFamily; int fFamily;
BNetworkInterface fInterface; BNetworkInterface fInterface;
BNetworkSettings& fSettings;
BMessage fOriginalInterface;
BMessage fInterfaceSettings;
BPopUpMenu* fModePopUpMenu; BPopUpMenu* fModePopUpMenu;
BMenuField* fModeField; BMenuField* fModeField;
+1 -1
View File
@@ -1,7 +1,7 @@
SubDir HAIKU_TOP src preferences network ; SubDir HAIKU_TOP src preferences network ;
UsePublicHeaders [ FDirName add-ons network_settings ] ; UsePublicHeaders [ FDirName add-ons network_settings ] ;
UsePrivateHeaders net shared ; UsePrivateHeaders net shared storage ;
SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src apps networkstatus ] SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src apps networkstatus ]
[ FDirName $(HAIKU_TOP) src bin network ifconfig ] ; [ FDirName $(HAIKU_TOP) src bin network ifconfig ] ;
@@ -73,10 +73,12 @@ BNetworkSettingsInterfaceItem::Interface() const
// #pragma mark - // #pragma mark -
BNetworkSettingsAddOn::BNetworkSettingsAddOn(image_id image) BNetworkSettingsAddOn::BNetworkSettingsAddOn(image_id image,
BNetworkSettings& settings)
: :
fImage(image), fImage(image),
fResources(NULL) fResources(NULL),
fSettings(settings)
{ {
} }
@@ -126,3 +128,10 @@ BNetworkSettingsAddOn::Resources()
} }
return fResources; return fResources;
} }
BNetworkSettings&
BNetworkSettingsAddOn::Settings()
{
return fSettings;
}
+20 -4
View File
@@ -30,6 +30,7 @@
#include <OutlineListView.h> #include <OutlineListView.h>
#include <Path.h> #include <Path.h>
#include <PathFinder.h> #include <PathFinder.h>
#include <PathMonitor.h>
#include <Roster.h> #include <Roster.h>
#include <ScrollView.h> #include <ScrollView.h>
#include <SymLink.h> #include <SymLink.h>
@@ -129,13 +130,17 @@ NetworkWindow::NetworkWindow()
_ScanInterfaces(); _ScanInterfaces();
_ScanAddOns(); _ScanAddOns();
// Set preferred size of the list view from its contents // Set size of the list view from its contents
float width; float width;
float height; float height;
fListView->GetPreferredSize(&width, &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))); fListView->SetExplicitMinSize(BSize(width, std::min(height, 400.f)));
CenterOnScreen(); CenterOnScreen();
fSettings.StartMonitoring(this);
} }
@@ -206,6 +211,12 @@ NetworkWindow::MessageReceived(BMessage* message)
break; break;
} }
case B_PATH_MONITOR:
{
fSettings.Update(message);
break;
}
default: default:
inherited::MessageReceived(message); inherited::MessageReceived(message);
} }
@@ -283,6 +294,8 @@ NetworkWindow::_ScanInterfaces()
continue; continue;
InterfaceListItem* item = new InterfaceListItem(interface.Name()); InterfaceListItem* item = new InterfaceListItem(interface.Name());
item->SetExpanded(true);
fInterfaceItemMap.insert(std::pair<BString, BListItem*>( fInterfaceItemMap.insert(std::pair<BString, BListItem*>(
BString(interface.Name()), item)); BString(interface.Name()), item));
fListView->AddItem(item); fListView->AddItem(item);
@@ -314,7 +327,8 @@ NetworkWindow::_ScanAddOns()
continue; continue;
} }
BNetworkSettingsAddOn* (*instantiateAddOn)(image_id image); BNetworkSettingsAddOn* (*instantiateAddOn)(image_id image,
BNetworkSettings& settings);
status_t status = get_image_symbol(image, status_t status = get_image_symbol(image,
"instantiate_network_settings_add_on", "instantiate_network_settings_add_on",
@@ -328,7 +342,7 @@ NetworkWindow::_ScanAddOns()
continue; continue;
} }
BNetworkSettingsAddOn* addOn = instantiateAddOn(image); BNetworkSettingsAddOn* addOn = instantiateAddOn(image, fSettings);
if (addOn == NULL) { if (addOn == NULL) {
unload_add_on(image); unload_add_on(image);
continue; continue;
@@ -388,8 +402,10 @@ NetworkWindow::_ListItemFor(BNetworkSettingsType type)
{ {
switch (type) { switch (type) {
case B_NETWORK_SETTINGS_TYPE_SERVICE: case B_NETWORK_SETTINGS_TYPE_SERVICE:
if (fServicesItem == NULL) if (fServicesItem == NULL) {
fServicesItem = new BStringItem(B_TRANSLATE("Services")); fServicesItem = new BStringItem(B_TRANSLATE("Services"));
fServicesItem->SetExpanded(true);
}
return fServicesItem; return fServicesItem;
+6 -4
View File
@@ -15,7 +15,8 @@
#include <ObjectList.h> #include <ObjectList.h>
#include <Window.h> #include <Window.h>
#include "NetworkSettingsAddOn.h" #include <NetworkSettings.h>
#include <NetworkSettingsAddOn.h>
using namespace BNetworkKit; using namespace BNetworkKit;
@@ -53,9 +54,7 @@ private:
typedef std::map<BString, BListItem*> ItemMap; typedef std::map<BString, BListItem*> ItemMap;
typedef std::map<BListItem*, BNetworkSettingsItem*> SettingsMap; typedef std::map<BListItem*, BNetworkSettingsItem*> SettingsMap;
BButton* fRevertButton; BNetworkSettings fSettings;
BButton* fApplyButton;
AddOnList fAddOns; AddOnList fAddOns;
BOutlineListView* fListView; BOutlineListView* fListView;
@@ -68,6 +67,9 @@ private:
InterfaceView* fInterfaceView; InterfaceView* fInterfaceView;
BView* fAddOnShellView; BView* fAddOnShellView;
BButton* fRevertButton;
BButton* fApplyButton;
}; };