Network: added global settings.
* NetworkWindow now manages a single BNetworkSettings object that is shared with all add-ons.
This commit is contained in:
@@ -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,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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user