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 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
@@ -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);
}
@@ -10,6 +10,8 @@
#include "InterfaceAddressView.h"
#include <stdio.h>
#include <Catalog.h>
#include <ControlLook.h>
#include <LayoutBuilder.h>
@@ -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()
{
}
@@ -12,6 +12,7 @@
#include <GroupView.h>
#include <NetworkInterface.h>
#include <NetworkSettings.h>
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;
+1 -1
View File
@@ -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 ] ;
@@ -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;
}
+20 -4
View File
@@ -30,6 +30,7 @@
#include <OutlineListView.h>
#include <Path.h>
#include <PathFinder.h>
#include <PathMonitor.h>
#include <Roster.h>
#include <ScrollView.h>
#include <SymLink.h>
@@ -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, BListItem*>(
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;
+6 -4
View File
@@ -15,7 +15,8 @@
#include <ObjectList.h>
#include <Window.h>
#include "NetworkSettingsAddOn.h"
#include <NetworkSettings.h>
#include <NetworkSettingsAddOn.h>
using namespace BNetworkKit;
@@ -53,9 +54,7 @@ private:
typedef std::map<BString, BListItem*> ItemMap;
typedef std::map<BListItem*, BNetworkSettingsItem*> SettingsMap;
BButton* fRevertButton;
BButton* fApplyButton;
BNetworkSettings fSettings;
AddOnList fAddOns;
BOutlineListView* fListView;
@@ -68,6 +67,9 @@ private:
InterfaceView* fInterfaceView;
BView* fAddOnShellView;
BButton* fRevertButton;
BButton* fApplyButton;
};