Switched to new BNetwork* classes.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40239 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
137c5fe2ba
commit
28b7d1d410
@ -1,461 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2004-2009, Haiku, Inc. All rights reserved.
|
|
||||||
* Distributed under the terms of the MIT License.
|
|
||||||
*
|
|
||||||
* Authors:
|
|
||||||
* Andre Alves Garzia, andre@andregarzia.com
|
|
||||||
* Stephan Assmuß
|
|
||||||
* Axel Dörfler
|
|
||||||
* Fredrik Modéen
|
|
||||||
* Hugo Santos
|
|
||||||
* Philippe Saint-Pierre
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "EthernetSettingsView.h"
|
|
||||||
#include "Setting.h"
|
|
||||||
|
|
||||||
#include <InterfaceKit.h>
|
|
||||||
#include <GridView.h>
|
|
||||||
#include <GroupView.h>
|
|
||||||
#include <LayoutItem.h>
|
|
||||||
#include <SpaceLayoutItem.h>
|
|
||||||
|
|
||||||
#include <File.h>
|
|
||||||
#include <Path.h>
|
|
||||||
|
|
||||||
#include <Directory.h>
|
|
||||||
#include <FindDirectory.h>
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include <NetServer.h>
|
|
||||||
|
|
||||||
#include <support/Beep.h>
|
|
||||||
|
|
||||||
static const uint32 kMsgApply = 'aply';
|
|
||||||
static const uint32 kMsgRevert = 'rvrt';
|
|
||||||
static const uint32 kMsgClose = 'clse';
|
|
||||||
static const uint32 kMsgField = 'fild';
|
|
||||||
static const uint32 kMsgMode = 'mode';
|
|
||||||
static const uint32 kMsgChange = 'chng';
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
SetupTextControl(BTextControl *control)
|
|
||||||
{
|
|
||||||
// TODO: Disallow characters, etc.
|
|
||||||
// Would be nice to have a real
|
|
||||||
// formatted input control
|
|
||||||
control->SetModificationMessage(new BMessage(kMsgChange));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
|
||||||
EthernetSettingsView::EthernetSettingsView(Setting* setting)
|
|
||||||
: BView("EthernetSettingsView", 0, NULL),
|
|
||||||
fCurrentSettings(setting)
|
|
||||||
{
|
|
||||||
SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
|
||||||
|
|
||||||
// build the GUI
|
|
||||||
BGroupLayout* rootLayout = new BGroupLayout(B_VERTICAL);
|
|
||||||
SetLayout(rootLayout);
|
|
||||||
|
|
||||||
BGridView* controlsGroup = new BGridView();
|
|
||||||
BGridLayout* layout = controlsGroup->GridLayout();
|
|
||||||
|
|
||||||
// insets
|
|
||||||
float inset = ceilf(be_plain_font->Size() * 0.7);
|
|
||||||
rootLayout->SetInsets(inset, inset, inset, inset);
|
|
||||||
rootLayout->SetSpacing(inset);
|
|
||||||
layout->SetSpacing(inset, inset);
|
|
||||||
|
|
||||||
BPopUpMenu* modeMenu = new BPopUpMenu("modes");
|
|
||||||
modeMenu->AddItem(new BMenuItem("Static", new BMessage(kMsgMode)));
|
|
||||||
modeMenu->AddItem(new BMenuItem("DHCP", new BMessage(kMsgMode)));
|
|
||||||
|
|
||||||
fTypeMenuField = new BMenuField("Mode:", modeMenu);
|
|
||||||
layout->AddItem(fTypeMenuField->CreateLabelLayoutItem(), 0, 1);
|
|
||||||
layout->AddItem(fTypeMenuField->CreateMenuBarLayoutItem(), 1, 1);
|
|
||||||
|
|
||||||
fIPTextControl = new BTextControl("IP Address:", "", NULL);
|
|
||||||
SetupTextControl(fIPTextControl);
|
|
||||||
|
|
||||||
BLayoutItem* layoutItem = fIPTextControl->CreateTextViewLayoutItem();
|
|
||||||
layoutItem->SetExplicitMinSize(BSize(
|
|
||||||
fIPTextControl->StringWidth("XXX.XXX.XXX.XXX") + inset,
|
|
||||||
B_SIZE_UNSET));
|
|
||||||
|
|
||||||
layout->AddItem(fIPTextControl->CreateLabelLayoutItem(), 0, 2);
|
|
||||||
layout->AddItem(layoutItem, 1, 2);
|
|
||||||
|
|
||||||
fNetMaskTextControl = new BTextControl("Netmask:", "", NULL);
|
|
||||||
SetupTextControl(fNetMaskTextControl);
|
|
||||||
layout->AddItem(fNetMaskTextControl->CreateLabelLayoutItem(), 0, 3);
|
|
||||||
layout->AddItem(fNetMaskTextControl->CreateTextViewLayoutItem(), 1, 3);
|
|
||||||
|
|
||||||
fGatewayTextControl = new BTextControl("Gateway:", "", NULL);
|
|
||||||
SetupTextControl(fGatewayTextControl);
|
|
||||||
layout->AddItem(fGatewayTextControl->CreateLabelLayoutItem(), 0, 4);
|
|
||||||
layout->AddItem(fGatewayTextControl->CreateTextViewLayoutItem(), 1, 4);
|
|
||||||
|
|
||||||
// TODO: Replace the DNS text controls by a BListView with add/remove
|
|
||||||
// functionality and so on...
|
|
||||||
fPrimaryDNSTextControl = new BTextControl("DNS #1:", "", NULL);
|
|
||||||
SetupTextControl(fPrimaryDNSTextControl);
|
|
||||||
layout->AddItem(fPrimaryDNSTextControl->CreateLabelLayoutItem(), 0, 5);
|
|
||||||
layout->AddItem(fPrimaryDNSTextControl->CreateTextViewLayoutItem(), 1, 5);
|
|
||||||
|
|
||||||
fSecondaryDNSTextControl = new BTextControl("DNS #2:", "", NULL);
|
|
||||||
SetupTextControl(fSecondaryDNSTextControl);
|
|
||||||
layout->AddItem(fSecondaryDNSTextControl->CreateLabelLayoutItem(), 0, 6);
|
|
||||||
layout->AddItem(fSecondaryDNSTextControl->CreateTextViewLayoutItem(), 1, 6);
|
|
||||||
|
|
||||||
fErrorMessage = new BStringView("error", "");
|
|
||||||
fErrorMessage->SetAlignment(B_ALIGN_LEFT);
|
|
||||||
fErrorMessage->SetFont(be_bold_font);
|
|
||||||
fErrorMessage->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET));
|
|
||||||
|
|
||||||
layout->AddView(fErrorMessage, 1, 7);
|
|
||||||
|
|
||||||
// button group (TODO: move to window, but take care of
|
|
||||||
// enabling/disabling)
|
|
||||||
BGroupView* buttonGroup = new BGroupView(B_HORIZONTAL);
|
|
||||||
|
|
||||||
fRevertButton = new BButton("Revert", new BMessage(kMsgRevert));
|
|
||||||
fRevertButton->SetEnabled(false);
|
|
||||||
buttonGroup->GroupLayout()->AddView(fRevertButton);
|
|
||||||
|
|
||||||
buttonGroup->GroupLayout()->AddItem(BSpaceLayoutItem::CreateGlue());
|
|
||||||
|
|
||||||
fApplyButton = new BButton("Apply", new BMessage(kMsgApply));
|
|
||||||
buttonGroup->GroupLayout()->AddView(fApplyButton);
|
|
||||||
|
|
||||||
rootLayout->AddView(controlsGroup);
|
|
||||||
rootLayout->AddView(buttonGroup);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
EthernetSettingsView::~EthernetSettingsView()
|
|
||||||
{
|
|
||||||
close(fSocket);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool
|
|
||||||
EthernetSettingsView::_PrepareRequest(struct ifreq& request, const char* name)
|
|
||||||
{
|
|
||||||
// This function is used for talking direct to the stack.
|
|
||||||
// It's used by _ShowConfiguration.
|
|
||||||
if (strlen(name) > IF_NAMESIZE)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
strcpy(request.ifr_name, name);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
EthernetSettingsView::AttachedToWindow()
|
|
||||||
{
|
|
||||||
fApplyButton->SetTarget(this);
|
|
||||||
fRevertButton->SetTarget(this);
|
|
||||||
fIPTextControl->SetTarget(this);
|
|
||||||
fNetMaskTextControl->SetTarget(this);
|
|
||||||
fGatewayTextControl->SetTarget(this);
|
|
||||||
fPrimaryDNSTextControl->SetTarget(this);
|
|
||||||
fSecondaryDNSTextControl->SetTarget(this);
|
|
||||||
fTypeMenuField->Menu()->SetTargetForItems(this);
|
|
||||||
|
|
||||||
// display settigs of first adapter on startup
|
|
||||||
_ShowConfiguration(fCurrentSettings);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
EthernetSettingsView::DetachedFromWindow()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
EthernetSettingsView::_ShowConfiguration(Setting* setting)
|
|
||||||
{
|
|
||||||
// Clear the inputs.
|
|
||||||
fIPTextControl->SetText("");
|
|
||||||
fGatewayTextControl->SetText("");
|
|
||||||
fNetMaskTextControl->SetText("");
|
|
||||||
fPrimaryDNSTextControl->SetText("");
|
|
||||||
fSecondaryDNSTextControl->SetText("");
|
|
||||||
|
|
||||||
bool enableControls = false;
|
|
||||||
fTypeMenuField->SetEnabled(setting != NULL);
|
|
||||||
|
|
||||||
if (setting) {
|
|
||||||
fIPTextControl->SetText(setting->IP());
|
|
||||||
fGatewayTextControl->SetText(setting->Gateway());
|
|
||||||
fNetMaskTextControl->SetText(setting->Netmask());
|
|
||||||
|
|
||||||
BMenuItem* item;
|
|
||||||
if (setting->AutoConfigured() == true)
|
|
||||||
item = fTypeMenuField->Menu()->FindItem("DHCP");
|
|
||||||
else
|
|
||||||
item = fTypeMenuField->Menu()->FindItem("Static");
|
|
||||||
if (item)
|
|
||||||
item->SetMarked(true);
|
|
||||||
|
|
||||||
enableControls = setting->AutoConfigured() == false;
|
|
||||||
|
|
||||||
if (setting->fNameservers.CountItems() >= 2) {
|
|
||||||
fSecondaryDNSTextControl->SetText(
|
|
||||||
setting->fNameservers.ItemAt(1)->String());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (setting->fNameservers.CountItems() >= 1) {
|
|
||||||
fPrimaryDNSTextControl->SetText(
|
|
||||||
setting->fNameservers.ItemAt(0)->String());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//We don't want to enable loop
|
|
||||||
if (strcmp(fCurrentSettings->Name(), "loop") == 0) {
|
|
||||||
_EnableTextControls(false);
|
|
||||||
fTypeMenuField->SetEnabled(false);
|
|
||||||
} else
|
|
||||||
_EnableTextControls(enableControls);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
EthernetSettingsView::_EnableTextControls(bool enable)
|
|
||||||
{
|
|
||||||
fIPTextControl->SetEnabled(enable);
|
|
||||||
fGatewayTextControl->SetEnabled(enable);
|
|
||||||
fNetMaskTextControl->SetEnabled(enable);
|
|
||||||
fPrimaryDNSTextControl->SetEnabled(enable);
|
|
||||||
fSecondaryDNSTextControl->SetEnabled(enable);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
EthernetSettingsView::_ApplyControlsToConfiguration()
|
|
||||||
{
|
|
||||||
if (!fCurrentSettings)
|
|
||||||
return;
|
|
||||||
|
|
||||||
fCurrentSettings->SetIP(fIPTextControl->Text());
|
|
||||||
fCurrentSettings->SetNetmask(fNetMaskTextControl->Text());
|
|
||||||
fCurrentSettings->SetGateway(fGatewayTextControl->Text());
|
|
||||||
|
|
||||||
fCurrentSettings->SetAutoConfigure(
|
|
||||||
strcmp(fTypeMenuField->Menu()->FindMarked()->Label(), "DHCP") == 0);
|
|
||||||
|
|
||||||
fCurrentSettings->fNameservers.MakeEmpty();
|
|
||||||
fCurrentSettings->fNameservers.AddItem(new BString(
|
|
||||||
fPrimaryDNSTextControl->Text()));
|
|
||||||
fCurrentSettings->fNameservers.AddItem(new BString(
|
|
||||||
fSecondaryDNSTextControl->Text()));
|
|
||||||
|
|
||||||
fApplyButton->SetEnabled(false);
|
|
||||||
fRevertButton->SetEnabled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
EthernetSettingsView::_SaveConfiguration()
|
|
||||||
{
|
|
||||||
_ApplyControlsToConfiguration();
|
|
||||||
_SaveDNSConfiguration();
|
|
||||||
_SaveAdaptersConfiguration();
|
|
||||||
if (fCurrentSettings->AutoConfigured())
|
|
||||||
_TriggerAutoConfig(fCurrentSettings->Name());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
EthernetSettingsView::_SaveDNSConfiguration()
|
|
||||||
{
|
|
||||||
BPath path;
|
|
||||||
if (find_directory(B_COMMON_SETTINGS_DIRECTORY, &path) != B_OK)
|
|
||||||
return;
|
|
||||||
|
|
||||||
path.Append("network/resolv.conf");
|
|
||||||
|
|
||||||
BFile file(path.Path(), B_CREATE_FILE | B_ERASE_FILE | B_WRITE_ONLY);
|
|
||||||
if (file.InitCheck() != B_OK) {
|
|
||||||
fprintf(stderr, "failed to open %s for writing: %s\n", path.Path(),
|
|
||||||
strerror(file.InitCheck()));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
BString content("# Generated by Network Preflet\n");
|
|
||||||
for (int j = 0; j < fCurrentSettings->fNameservers.CountItems(); j++) {
|
|
||||||
if (fCurrentSettings->fNameservers.ItemAt(j)->Length() > 0) {
|
|
||||||
content << "nameserver\t"
|
|
||||||
<< fCurrentSettings->fNameservers.ItemAt(j)->String() << "\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
file.Write(content.String(), content.Length());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
EthernetSettingsView::_SaveAdaptersConfiguration()
|
|
||||||
{
|
|
||||||
BPath path;
|
|
||||||
status_t status = _GetPath("interfaces", path);
|
|
||||||
printf("Path = %s\n", path.Path());
|
|
||||||
if (status < B_OK)
|
|
||||||
return;
|
|
||||||
|
|
||||||
FILE* fp = NULL;
|
|
||||||
if (fCurrentSettings->AutoConfigured())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (fp == NULL) {
|
|
||||||
fp = fopen(path.Path(), "w");
|
|
||||||
if (fp == NULL) {
|
|
||||||
fprintf(stderr, "failed to open file %s to write "
|
|
||||||
"configuration: %s\n", path.Path(), strerror(errno));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(fp, "interface %s {\n\t\taddress {\n",fCurrentSettings->Name());
|
|
||||||
fprintf(fp, "\t\t\tfamily\tinet\n");
|
|
||||||
fprintf(fp, "\t\t\taddress\t%s\n",fCurrentSettings->IP());
|
|
||||||
fprintf(fp, "\t\t\tgateway\t%s\n",fCurrentSettings->Gateway());
|
|
||||||
fprintf(fp, "\t\t\tmask\t%s\n",fCurrentSettings->Netmask());
|
|
||||||
fprintf(fp, "\t\t}\n}\n\n");
|
|
||||||
|
|
||||||
if (fp) {
|
|
||||||
printf("%s saved.\n", path.Path());
|
|
||||||
fclose(fp);
|
|
||||||
} else {
|
|
||||||
// all configuration is DHCP, so delete interfaces file.
|
|
||||||
remove(path.Path());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
status_t
|
|
||||||
EthernetSettingsView::_TriggerAutoConfig(const char* device)
|
|
||||||
{
|
|
||||||
BMessenger networkServer(kNetServerSignature);
|
|
||||||
if (!networkServer.IsValid()) {
|
|
||||||
(new BAlert("error", "The net_server needs to run for the auto "
|
|
||||||
"configuration!", "OK"))->Go();
|
|
||||||
return B_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
BMessage message(kMsgConfigureInterface);
|
|
||||||
message.AddString("device", device);
|
|
||||||
BMessage address;
|
|
||||||
address.AddString("family", "inet");
|
|
||||||
address.AddBool("auto_config", true);
|
|
||||||
message.AddMessage("address", &address);
|
|
||||||
|
|
||||||
BMessage reply;
|
|
||||||
status_t status = networkServer.SendMessage(&message, &reply);
|
|
||||||
if (status != B_OK) {
|
|
||||||
BString errorMessage("Sending auto-config message failed: ");
|
|
||||||
errorMessage << strerror(status);
|
|
||||||
(new BAlert("error", errorMessage.String(), "OK"))->Go();
|
|
||||||
return status;
|
|
||||||
} else if (reply.FindInt32("status", &status) == B_OK
|
|
||||||
&& status != B_OK) {
|
|
||||||
BString errorMessage("Auto-configuring failed: ");
|
|
||||||
errorMessage << strerror(status);
|
|
||||||
(new BAlert("error", errorMessage.String(), "OK"))->Go();
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
return B_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
status_t
|
|
||||||
EthernetSettingsView::_GetPath(const char* name, BPath& path)
|
|
||||||
{
|
|
||||||
if (find_directory(B_COMMON_SETTINGS_DIRECTORY, &path, true) != B_OK)
|
|
||||||
return B_ERROR;
|
|
||||||
|
|
||||||
path.Append("network");
|
|
||||||
create_directory(path.Path(), 0755);
|
|
||||||
|
|
||||||
if (name != NULL)
|
|
||||||
path.Append(name);
|
|
||||||
return B_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool
|
|
||||||
MatchPattern(const char* string, const char* pattern)
|
|
||||||
{
|
|
||||||
regex_t compiled;
|
|
||||||
bool result = regcomp(&compiled, pattern, REG_NOSUB | REG_EXTENDED) == 0
|
|
||||||
&& regexec(&compiled, string, 0, NULL, 0) == 0;
|
|
||||||
regfree(&compiled);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool
|
|
||||||
EthernetSettingsView::_ValidateControl(BTextControl* control)
|
|
||||||
{
|
|
||||||
static const char* pattern = "^(25[0-5]|2[0-4][0-9]|[01][0-9]{2}|[0-9]"
|
|
||||||
"{1,2})(\\.(25[0-5]|2[0-4][0-9]|[01][0-9]{2}|[0-9]{1,2})){3}$";
|
|
||||||
|
|
||||||
if (control->IsEnabled() && !MatchPattern(control->Text(), pattern)) {
|
|
||||||
control->MakeFocus();
|
|
||||||
BString errorMessage;
|
|
||||||
errorMessage << control->Label();
|
|
||||||
errorMessage.RemoveLast(":");
|
|
||||||
errorMessage << " is invalid";
|
|
||||||
fErrorMessage->SetText(errorMessage.String());
|
|
||||||
beep();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
EthernetSettingsView::MessageReceived(BMessage* message)
|
|
||||||
{
|
|
||||||
switch (message->what) {
|
|
||||||
case kMsgMode:
|
|
||||||
if (BMenuItem* item = fTypeMenuField->Menu()->FindMarked())
|
|
||||||
_EnableTextControls(strcmp(item->Label(), "DHCP") != 0);
|
|
||||||
fApplyButton->SetEnabled(true);
|
|
||||||
fRevertButton->SetEnabled(true);
|
|
||||||
break;
|
|
||||||
case kMsgRevert:
|
|
||||||
_ShowConfiguration(fCurrentSettings);
|
|
||||||
fRevertButton->SetEnabled(false);
|
|
||||||
break;
|
|
||||||
case kMsgApply:
|
|
||||||
if (_ValidateControl(fIPTextControl)
|
|
||||||
&& _ValidateControl(fNetMaskTextControl)
|
|
||||||
&& (strlen(fGatewayTextControl->Text()) == 0
|
|
||||||
|| _ValidateControl(fGatewayTextControl))
|
|
||||||
&& (strlen(fPrimaryDNSTextControl->Text()) == 0
|
|
||||||
|| _ValidateControl(fPrimaryDNSTextControl))
|
|
||||||
&& (strlen(fSecondaryDNSTextControl->Text()) == 0
|
|
||||||
|| _ValidateControl(fSecondaryDNSTextControl)))
|
|
||||||
_SaveConfiguration();
|
|
||||||
break;
|
|
||||||
case kMsgChange:
|
|
||||||
fErrorMessage->SetText("");
|
|
||||||
//We don't want to enable loop
|
|
||||||
if (strcmp(fCurrentSettings->Name(), "loop") == 0)
|
|
||||||
fApplyButton->SetEnabled(false);
|
|
||||||
else
|
|
||||||
fApplyButton->SetEnabled(true);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
BView::MessageReceived(message);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,78 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2004-2007 Haiku Inc. All rights reserved.
|
|
||||||
* Distributed under the terms of the MIT License.
|
|
||||||
*
|
|
||||||
* Author:
|
|
||||||
* Andre Alves Garzia, andre@andregarzia.com
|
|
||||||
* Axel Dörfler
|
|
||||||
* Fredrik Modéen
|
|
||||||
* Hugo Santos
|
|
||||||
*/
|
|
||||||
#ifndef ETHERNET_SETTINGS_VIEW_H
|
|
||||||
#define ETHERNET_SETTINGS_VIEW_H
|
|
||||||
|
|
||||||
|
|
||||||
#include "Setting.h"
|
|
||||||
|
|
||||||
#include <ObjectList.h>
|
|
||||||
#include <View.h>
|
|
||||||
|
|
||||||
#include <posix/regex.h>
|
|
||||||
|
|
||||||
class BButton;
|
|
||||||
class BMenuField;
|
|
||||||
class BPath;
|
|
||||||
class BTextControl;
|
|
||||||
class BStringView;
|
|
||||||
|
|
||||||
|
|
||||||
class EthernetSettingsView : public BView {
|
|
||||||
public:
|
|
||||||
EthernetSettingsView(Setting* setting);
|
|
||||||
virtual ~EthernetSettingsView();
|
|
||||||
|
|
||||||
virtual void MessageReceived(BMessage* message);
|
|
||||||
virtual void AttachedToWindow();
|
|
||||||
virtual void DetachedFromWindow();
|
|
||||||
|
|
||||||
void SaveProfile(BString profileName);
|
|
||||||
void LoadProfile(BString profileName);
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool _PrepareRequest(struct ifreq& request,
|
|
||||||
const char* name);
|
|
||||||
void _ShowConfiguration(Setting* setting);
|
|
||||||
void _EnableTextControls(bool enable);
|
|
||||||
void _SaveConfiguration();
|
|
||||||
void _SaveDNSConfiguration();
|
|
||||||
void _SaveAdaptersConfiguration();
|
|
||||||
void _ApplyControlsToConfiguration();
|
|
||||||
status_t _GetPath(const char* name, BPath& path);
|
|
||||||
status_t _TriggerAutoConfig(const char* device);
|
|
||||||
|
|
||||||
bool _ValidateControl(BTextControl* control);
|
|
||||||
private:
|
|
||||||
|
|
||||||
BButton* fApplyButton;
|
|
||||||
BButton* fRevertButton;
|
|
||||||
|
|
||||||
BMenuField* fDeviceMenuField;
|
|
||||||
BMenuField* fTypeMenuField;
|
|
||||||
BTextControl* fIPTextControl;
|
|
||||||
BTextControl* fNetMaskTextControl;
|
|
||||||
BTextControl* fGatewayTextControl;
|
|
||||||
|
|
||||||
BTextControl* fPrimaryDNSTextControl;
|
|
||||||
BTextControl* fSecondaryDNSTextControl;
|
|
||||||
|
|
||||||
BStringView* fErrorMessage;
|
|
||||||
|
|
||||||
// TODO: DNS settings do not belong here, do they?
|
|
||||||
BObjectList<BString> fInterfaces;
|
|
||||||
|
|
||||||
Setting* fCurrentSettings;
|
|
||||||
int32 fStatus;
|
|
||||||
int fSocket;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* ETHERNET_SETTINGS_VIEW_H */
|
|
@ -61,14 +61,14 @@ InterfacesAddOn::CreateView(BRect *bounds)
|
|||||||
{
|
{
|
||||||
float w, h;
|
float w, h;
|
||||||
BRect r = *bounds;
|
BRect r = *bounds;
|
||||||
|
|
||||||
#define H_MARGIN 10
|
#define H_MARGIN 10
|
||||||
#define V_MARGIN 10
|
#define V_MARGIN 10
|
||||||
#define SMALL_MARGIN 3
|
#define SMALL_MARGIN 3
|
||||||
|
|
||||||
if (r.Width() < 100 || r.Height() < 100)
|
if (r.Width() < 100 || r.Height() < 100)
|
||||||
r.Set(0, 0, 100, 100);
|
r.Set(0, 0, 100, 100);
|
||||||
|
|
||||||
ResizeTo(r.Width(), r.Height());
|
ResizeTo(r.Width(), r.Height());
|
||||||
|
|
||||||
BRect rlv = r;
|
BRect rlv = r;
|
||||||
@ -77,14 +77,14 @@ InterfacesAddOn::CreateView(BRect *bounds)
|
|||||||
rlv.right -= B_V_SCROLL_BAR_WIDTH;
|
rlv.right -= B_V_SCROLL_BAR_WIDTH;
|
||||||
fListview = new InterfacesListView(rlv, "interfaces", B_FOLLOW_ALL_SIDES);
|
fListview = new InterfacesListView(rlv, "interfaces", B_FOLLOW_ALL_SIDES);
|
||||||
fListview->SetSelectionMessage(new BMessage(INTERFACE_SELECTED_MSG));
|
fListview->SetSelectionMessage(new BMessage(INTERFACE_SELECTED_MSG));
|
||||||
fListview->SetInvocationMessage(new BMessage(CONFIGURE_INTERFACE_MSG));
|
fListview->SetInvocationMessage(new BMessage(CONFIGURE_INTERFACE_MSG));
|
||||||
AddChild(new BScrollView(NULL, fListview, B_FOLLOW_ALL_SIDES, B_WILL_DRAW
|
AddChild(new BScrollView(NULL, fListview, B_FOLLOW_ALL_SIDES, B_WILL_DRAW
|
||||||
| B_FRAME_EVENTS, false, true));
|
| B_FRAME_EVENTS, false, true));
|
||||||
|
|
||||||
r.top = r.bottom - 60;
|
r.top = r.bottom - 60;
|
||||||
fConfigure = new BButton(r, "configure", "Configure" B_UTF8_ELLIPSIS,
|
fConfigure = new BButton(r, "configure", "Configure" B_UTF8_ELLIPSIS,
|
||||||
new BMessage(CONFIGURE_INTERFACE_MSG), B_FOLLOW_BOTTOM | B_FOLLOW_LEFT);
|
new BMessage(CONFIGURE_INTERFACE_MSG), B_FOLLOW_BOTTOM | B_FOLLOW_LEFT);
|
||||||
|
|
||||||
fConfigure->GetPreferredSize(&w, &h);
|
fConfigure->GetPreferredSize(&w, &h);
|
||||||
fConfigure->ResizeToPreferred();
|
fConfigure->ResizeToPreferred();
|
||||||
fConfigure->SetEnabled(false);
|
fConfigure->SetEnabled(false);
|
||||||
@ -99,7 +99,7 @@ InterfacesAddOn::CreateView(BRect *bounds)
|
|||||||
fOnOff->Hide();
|
fOnOff->Hide();
|
||||||
AddChild(fOnOff);
|
AddChild(fOnOff);
|
||||||
|
|
||||||
*bounds = Bounds();
|
*bounds = Bounds();
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,7 +119,7 @@ InterfacesAddOn::MessageReceived(BMessage* msg)
|
|||||||
{
|
{
|
||||||
int nr = fListview->CurrentSelection();
|
int nr = fListview->CurrentSelection();
|
||||||
InterfaceListItem *item = NULL;
|
InterfaceListItem *item = NULL;
|
||||||
if(nr != -1) {
|
if(nr != -1) {
|
||||||
item = dynamic_cast<InterfaceListItem*>(fListview->ItemAt(nr));
|
item = dynamic_cast<InterfaceListItem*>(fListview->ItemAt(nr));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,26 +131,26 @@ InterfacesAddOn::MessageReceived(BMessage* msg)
|
|||||||
fOnOff->Hide();
|
fOnOff->Hide();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
fOnOff->SetLabel(item->Enabled() ? "Disable" : "Enable");
|
fOnOff->SetLabel(item->IsDisabled() ? "Enable" : "Disable");
|
||||||
fOnOff->Show();
|
fOnOff->Show();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case CONFIGURE_INTERFACE_MSG: {
|
case CONFIGURE_INTERFACE_MSG: {
|
||||||
if (!item)
|
if (!item)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
NetworkWindow* nw = new NetworkWindow(item->GetSetting());
|
NetworkWindow* nw = new NetworkWindow(item->GetSettings());
|
||||||
nw->Show();
|
nw->Show();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case ONOFF_INTERFACE_MSG:
|
case ONOFF_INTERFACE_MSG:
|
||||||
if (!item)
|
if (!item)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
item->SetEnabled(!item->Enabled());
|
item->SetDisabled(!item->IsDisabled());
|
||||||
fOnOff->SetLabel(item->Enabled() ? "Disable" : "Enable");
|
fOnOff->SetLabel(item->IsDisabled() ? "Enable" : "Disable");
|
||||||
fListview->Invalidate();
|
fListview->Invalidate();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "InterfacesListView.h"
|
#include "InterfacesListView.h"
|
||||||
#include "Setting.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -22,42 +21,17 @@
|
|||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/sockio.h>
|
#include <sys/sockio.h>
|
||||||
|
|
||||||
#include <IconUtils.h>
|
|
||||||
#include <File.h>
|
#include <File.h>
|
||||||
|
#include <IconUtils.h>
|
||||||
|
#include <net_notifications.h>
|
||||||
|
#include <NetworkDevice.h>
|
||||||
|
#include <NetworkInterface.h>
|
||||||
|
#include <NetworkRoster.h>
|
||||||
#include <Resources.h>
|
#include <Resources.h>
|
||||||
|
|
||||||
#include <AutoDeleter.h>
|
#include <AutoDeleter.h>
|
||||||
#include <net_notifications.h>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SocketOpener {
|
|
||||||
public:
|
|
||||||
SocketOpener()
|
|
||||||
{
|
|
||||||
fSocket = socket(AF_INET, SOCK_DGRAM, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
~SocketOpener()
|
|
||||||
{
|
|
||||||
close(fSocket);
|
|
||||||
}
|
|
||||||
|
|
||||||
status_t InitCheck()
|
|
||||||
{
|
|
||||||
return fSocket >= 0 ? B_OK : B_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator int() const
|
|
||||||
{
|
|
||||||
return fSocket;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
int fSocket;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "Settings.h"
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
@ -77,25 +51,30 @@ our_image(image_info& image)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
InterfaceListItem::InterfaceListItem(const char* name)
|
InterfaceListItem::InterfaceListItem(const char* name)
|
||||||
:
|
:
|
||||||
BListItem(0, false),
|
BListItem(0, false),
|
||||||
fIcon(NULL),
|
fIcon(NULL)
|
||||||
fSettings(new Setting(name))
|
|
||||||
{
|
{
|
||||||
_InitIcon();
|
fInterface.SetTo(name);
|
||||||
|
_Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
InterfaceListItem::~InterfaceListItem()
|
InterfaceListItem::~InterfaceListItem()
|
||||||
{
|
{
|
||||||
delete fIcon;
|
delete fIcon;
|
||||||
|
delete fSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void InterfaceListItem::Update(BView* owner, const BFont* font)
|
void
|
||||||
{
|
InterfaceListItem::Update(BView* owner, const BFont* font)
|
||||||
BListItem::Update(owner,font);
|
{
|
||||||
|
BListItem::Update(owner,font);
|
||||||
font_height height;
|
font_height height;
|
||||||
font->GetHeight(&height);
|
font->GetHeight(&height);
|
||||||
|
|
||||||
@ -110,21 +89,21 @@ InterfaceListItem::DrawItem(BView* owner, BRect /*bounds*/, bool complete)
|
|||||||
BListView* list = dynamic_cast<BListView*>(owner);
|
BListView* list = dynamic_cast<BListView*>(owner);
|
||||||
if (!list)
|
if (!list)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
font_height height;
|
font_height height;
|
||||||
BFont font;
|
BFont font;
|
||||||
owner->GetFont(&font);
|
owner->GetFont(&font);
|
||||||
font.GetHeight(&height);
|
font.GetHeight(&height);
|
||||||
float fntheight = height.ascent+height.descent+height.leading;
|
float fntheight = height.ascent+height.descent+height.leading;
|
||||||
|
|
||||||
BRect bounds = list->ItemFrame(list->IndexOf(this));
|
BRect bounds = list->ItemFrame(list->IndexOf(this));
|
||||||
|
|
||||||
rgb_color oldviewcolor = owner->ViewColor();
|
rgb_color oldviewcolor = owner->ViewColor();
|
||||||
rgb_color oldlowcolor = owner->LowColor();
|
rgb_color oldlowcolor = owner->LowColor();
|
||||||
rgb_color oldcolor = owner->HighColor();
|
rgb_color oldcolor = owner->HighColor();
|
||||||
|
|
||||||
rgb_color color = oldviewcolor;
|
rgb_color color = oldviewcolor;
|
||||||
if ( IsSelected() )
|
if ( IsSelected() )
|
||||||
color = tint_color(color, B_HIGHLIGHT_BACKGROUND_TINT);
|
color = tint_color(color, B_HIGHLIGHT_BACKGROUND_TINT);
|
||||||
|
|
||||||
owner->SetViewColor( color );
|
owner->SetViewColor( color );
|
||||||
@ -140,35 +119,35 @@ InterfaceListItem::DrawItem(BView* owner, BRect /*bounds*/, bool complete)
|
|||||||
BPoint namePt = iconPt + BPoint(32+8, fntheight);
|
BPoint namePt = iconPt + BPoint(32+8, fntheight);
|
||||||
BPoint driverPt = iconPt + BPoint(32+8, fntheight*2);
|
BPoint driverPt = iconPt + BPoint(32+8, fntheight*2);
|
||||||
BPoint commentPt = iconPt + BPoint(32+8, fntheight*3);
|
BPoint commentPt = iconPt + BPoint(32+8, fntheight*3);
|
||||||
|
|
||||||
drawing_mode mode = owner->DrawingMode();
|
drawing_mode mode = owner->DrawingMode();
|
||||||
if (fSettings->Enabled())
|
if (fSettings->IsDisabled()) {
|
||||||
owner->SetDrawingMode(B_OP_OVER);
|
|
||||||
else {
|
|
||||||
owner->SetDrawingMode(B_OP_ALPHA);
|
owner->SetDrawingMode(B_OP_ALPHA);
|
||||||
owner->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_OVERLAY);
|
owner->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_OVERLAY);
|
||||||
owner->SetHighColor(0, 0, 0, 32);
|
owner->SetHighColor(0, 0, 0, 32);
|
||||||
}
|
} else
|
||||||
|
owner->SetDrawingMode(B_OP_OVER);
|
||||||
|
|
||||||
owner->DrawBitmapAsync(fIcon, iconPt);
|
owner->DrawBitmapAsync(fIcon, iconPt);
|
||||||
|
|
||||||
if (!fSettings->Enabled())
|
if (fSettings->IsDisabled())
|
||||||
owner->SetHighColor(tint_color(oldcolor, B_LIGHTEN_1_TINT));
|
owner->SetHighColor(tint_color(oldcolor, B_LIGHTEN_1_TINT));
|
||||||
|
|
||||||
owner->SetFont(be_bold_font);
|
owner->SetFont(be_bold_font);
|
||||||
owner->DrawString(Name(), namePt);
|
owner->DrawString(Name(), namePt);
|
||||||
owner->SetFont(be_plain_font);
|
owner->SetFont(be_plain_font);
|
||||||
|
|
||||||
if (fSettings->Enabled()) {
|
if (fSettings->IsDisabled())
|
||||||
|
owner->DrawString("Disabled.", driverPt);
|
||||||
|
else {
|
||||||
BString str("Enabled, IPv4 address: ");
|
BString str("Enabled, IPv4 address: ");
|
||||||
str << fSettings->IP();
|
str << fSettings->IP();
|
||||||
owner->DrawString(str.String(), driverPt);
|
owner->DrawString(str.String(), driverPt);
|
||||||
if (fSettings->AutoConfigured())
|
if (fSettings->AutoConfigure())
|
||||||
owner->DrawString("DHCP enabled", commentPt);
|
owner->DrawString("DHCP enabled", commentPt);
|
||||||
else
|
else
|
||||||
owner->DrawString("DHCP disabled, use static IP address", commentPt);
|
owner->DrawString("DHCP disabled, use static IP address", commentPt);
|
||||||
} else
|
}
|
||||||
owner->DrawString("Disabled.", driverPt);
|
|
||||||
|
|
||||||
owner->SetHighColor(oldcolor);
|
owner->SetHighColor(oldcolor);
|
||||||
owner->SetDrawingMode(mode);
|
owner->SetDrawingMode(mode);
|
||||||
@ -176,12 +155,16 @@ InterfaceListItem::DrawItem(BView* owner, BRect /*bounds*/, bool complete)
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
InterfaceListItem::_InitIcon()
|
InterfaceListItem::_Init()
|
||||||
{
|
{
|
||||||
|
fSettings = new Settings(Name());
|
||||||
|
|
||||||
|
// Init icon
|
||||||
BBitmap* icon = NULL;
|
BBitmap* icon = NULL;
|
||||||
|
|
||||||
const char* mediaTypeName = "";
|
const char* mediaTypeName = NULL;
|
||||||
int media = fSettings->Media();
|
|
||||||
|
int media = fInterface.Media();
|
||||||
printf("%s media = 0x%x\n", Name(), media);
|
printf("%s media = 0x%x\n", Name(), media);
|
||||||
switch (IFM_TYPE(media)) {
|
switch (IFM_TYPE(media)) {
|
||||||
case IFM_ETHER:
|
case IFM_ETHER:
|
||||||
@ -190,6 +173,14 @@ InterfaceListItem::_InitIcon()
|
|||||||
case IFM_IEEE80211:
|
case IFM_IEEE80211:
|
||||||
mediaTypeName = "wifi";
|
mediaTypeName = "wifi";
|
||||||
break;
|
break;
|
||||||
|
default: {
|
||||||
|
BNetworkDevice device(Name());
|
||||||
|
if (device.IsWireless())
|
||||||
|
mediaTypeName = "wifi";
|
||||||
|
else if (device.IsEthernet())
|
||||||
|
mediaTypeName = "ether";
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
image_info info;
|
image_info info;
|
||||||
@ -207,12 +198,12 @@ InterfaceListItem::_InitIcon()
|
|||||||
size_t size;
|
size_t size;
|
||||||
// Try specific interface icon?
|
// Try specific interface icon?
|
||||||
const uint8* rawIcon = (const uint8*)resources.LoadResource(B_VECTOR_ICON_TYPE, Name(), &size);
|
const uint8* rawIcon = (const uint8*)resources.LoadResource(B_VECTOR_ICON_TYPE, Name(), &size);
|
||||||
if (!rawIcon)
|
if (rawIcon == NULL && mediaTypeName != NULL)
|
||||||
// Not found, try interface media type?
|
// Not found, try interface media type?
|
||||||
rawIcon = (const uint8*)resources.LoadResource(B_VECTOR_ICON_TYPE, mediaTypeName, &size);
|
rawIcon = (const uint8*)resources.LoadResource(B_VECTOR_ICON_TYPE, mediaTypeName, &size);
|
||||||
if (!rawIcon)
|
if (rawIcon == NULL)
|
||||||
// Not found, try default interface icon?
|
// Not found, try default interface icon?
|
||||||
rawIcon = (const uint8*)resources.LoadResource(B_VECTOR_ICON_TYPE, "wifi", &size);
|
rawIcon = (const uint8*)resources.LoadResource(B_VECTOR_ICON_TYPE, "ether", &size);
|
||||||
|
|
||||||
if (rawIcon) {
|
if (rawIcon) {
|
||||||
// Now build the bitmap
|
// Now build the bitmap
|
||||||
@ -244,7 +235,7 @@ InterfacesListView::AttachedToWindow()
|
|||||||
BListView::AttachedToWindow();
|
BListView::AttachedToWindow();
|
||||||
|
|
||||||
_InitList();
|
_InitList();
|
||||||
|
|
||||||
start_watching_network(
|
start_watching_network(
|
||||||
B_WATCH_NETWORK_INTERFACE_CHANGES | B_WATCH_NETWORK_LINK_CHANGES, this);
|
B_WATCH_NETWORK_INTERFACE_CHANGES | B_WATCH_NETWORK_LINK_CHANGES, this);
|
||||||
}
|
}
|
||||||
@ -298,42 +289,16 @@ InterfacesListView::FindItem(const char* name)
|
|||||||
status_t
|
status_t
|
||||||
InterfacesListView::_InitList()
|
InterfacesListView::_InitList()
|
||||||
{
|
{
|
||||||
SocketOpener socket;
|
BNetworkRoster& roster = BNetworkRoster::Default();
|
||||||
if (socket.InitCheck() != B_OK)
|
BNetworkInterface interface;
|
||||||
return B_ERROR;
|
uint32 cookie = 0;
|
||||||
|
|
||||||
// iterate over all interfaces and retrieve minimal status
|
while (roster.GetNextInterface(&cookie, interface) == B_OK) {
|
||||||
ifconf config;
|
if (strncmp(interface.Name(), "loop", 4) && interface.Name()[0]) {
|
||||||
config.ifc_len = sizeof(config.ifc_value);
|
AddItem(new InterfaceListItem(interface.Name()));
|
||||||
if (ioctl(socket, SIOCGIFCOUNT, &config, sizeof(struct ifconf)) < 0)
|
|
||||||
return B_ERROR;
|
|
||||||
|
|
||||||
uint32 count = (uint32)config.ifc_value;
|
|
||||||
if (count == 0)
|
|
||||||
return B_ERROR;
|
|
||||||
|
|
||||||
void* buffer = malloc(count * sizeof(struct ifreq));
|
|
||||||
if (buffer == NULL)
|
|
||||||
return B_ERROR;
|
|
||||||
|
|
||||||
MemoryDeleter deleter(buffer);
|
|
||||||
|
|
||||||
config.ifc_len = count * sizeof(struct ifreq);
|
|
||||||
config.ifc_buf = buffer;
|
|
||||||
if (ioctl(socket, SIOCGIFCONF, &config, sizeof(struct ifconf)) < 0)
|
|
||||||
return B_ERROR;
|
|
||||||
|
|
||||||
ifreq* interface = (ifreq*)buffer;
|
|
||||||
MakeEmpty();
|
|
||||||
|
|
||||||
for (uint32 i = 0; i < count; i++) {
|
|
||||||
if (strcmp(interface->ifr_name, "loop") != 0) {
|
|
||||||
AddItem(new InterfaceListItem(interface->ifr_name));
|
|
||||||
// printf("Name = %s\n", interface->ifr_name);
|
|
||||||
}
|
}
|
||||||
interface = (ifreq*)((addr_t)interface + IF_NAMESIZE
|
}
|
||||||
+ interface->ifr_addr.sa_len);
|
|
||||||
}
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -345,17 +310,17 @@ InterfacesListView::_UpdateList()
|
|||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
InterfacesListView::_HandleNetworkMessage(BMessage* message)
|
InterfacesListView::_HandleNetworkMessage(BMessage* message)
|
||||||
{
|
{
|
||||||
const char* name;
|
const char* name;
|
||||||
int32 opcode;
|
int32 opcode;
|
||||||
|
|
||||||
message->PrintToStream();
|
message->PrintToStream();
|
||||||
|
|
||||||
if (message->FindInt32("opcode", &opcode) != B_OK)
|
if (message->FindInt32("opcode", &opcode) != B_OK)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (message->FindString("interface", &name) != B_OK
|
if (message->FindString("interface", &name) != B_OK
|
||||||
&& message->FindString("device", &name) != B_OK)
|
&& message->FindString("device", &name) != B_OK)
|
||||||
return;
|
return;
|
||||||
@ -370,14 +335,14 @@ InterfacesListView::_HandleNetworkMessage(BMessage* message)
|
|||||||
if (item)
|
if (item)
|
||||||
InvalidateItem(IndexOf(item));
|
InvalidateItem(IndexOf(item));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case B_NETWORK_INTERFACE_ADDED:
|
case B_NETWORK_INTERFACE_ADDED:
|
||||||
if (item)
|
if (item)
|
||||||
InvalidateItem(IndexOf(item));
|
InvalidateItem(IndexOf(item));
|
||||||
else
|
else
|
||||||
AddItem(new InterfaceListItem(name));
|
AddItem(new InterfaceListItem(name));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case B_NETWORK_INTERFACE_REMOVED:
|
case B_NETWORK_INTERFACE_REMOVED:
|
||||||
if (item) {
|
if (item) {
|
||||||
RemoveItem(item);
|
RemoveItem(item);
|
||||||
|
@ -11,17 +11,19 @@
|
|||||||
#ifndef INTERFACES_LIST_VIEW_H
|
#ifndef INTERFACES_LIST_VIEW_H
|
||||||
#define INTERFACES_LIST_VIEW_H
|
#define INTERFACES_LIST_VIEW_H
|
||||||
|
|
||||||
#include <String.h>
|
|
||||||
#include <ListView.h>
|
|
||||||
#include <ListItem.h>
|
|
||||||
#include <Bitmap.h>
|
|
||||||
|
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#include <net/if_dl.h>
|
#include <net/if_dl.h>
|
||||||
#include <net/if_media.h>
|
#include <net/if_media.h>
|
||||||
#include <net/if_types.h>
|
#include <net/if_types.h>
|
||||||
|
|
||||||
#include "Setting.h"
|
#include <Bitmap.h>
|
||||||
|
#include <ListView.h>
|
||||||
|
#include <ListItem.h>
|
||||||
|
#include <NetworkDevice.h>
|
||||||
|
#include <NetworkInterface.h>
|
||||||
|
#include <String.h>
|
||||||
|
|
||||||
|
#include "Settings.h"
|
||||||
|
|
||||||
class InterfaceListItem : public BListItem {
|
class InterfaceListItem : public BListItem {
|
||||||
public:
|
public:
|
||||||
@ -30,17 +32,18 @@ public:
|
|||||||
|
|
||||||
void DrawItem(BView* owner, BRect bounds, bool complete);
|
void DrawItem(BView* owner, BRect bounds, bool complete);
|
||||||
void Update(BView* owner, const BFont* font);
|
void Update(BView* owner, const BFont* font);
|
||||||
|
|
||||||
inline const char* Name() { return fSettings->Name(); }
|
inline const char* Name() { return fInterface.Name(); }
|
||||||
inline bool Enabled() { return fSettings->Enabled(); }
|
inline bool IsDisabled() { return fSettings->IsDisabled(); }
|
||||||
inline void SetEnabled(bool enable){ fSettings->Enable(enable); }
|
inline void SetDisabled(bool disable){ fSettings->SetDisabled(disable); }
|
||||||
inline Setting* GetSetting() { return fSettings; }
|
inline Settings* GetSettings() { return fSettings; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void _InitIcon();
|
void _Init();
|
||||||
|
|
||||||
BBitmap* fIcon;
|
BBitmap* fIcon;
|
||||||
Setting* fSettings;
|
BNetworkInterface fInterface;
|
||||||
|
Settings* fSettings;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,26 +1,37 @@
|
|||||||
SubDir HAIKU_TOP src tests kits net preflet InterfacesAddOn ;
|
SubDir HAIKU_TOP src tests kits net preflet InterfacesAddOn ;
|
||||||
|
|
||||||
|
SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src apps networkstatus ] ;
|
||||||
|
SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src preferences network ] ;
|
||||||
|
|
||||||
UseHeaders [ FDirName $(HAIKU_TOP) src tests kits net preflet ] ;
|
UseHeaders [ FDirName $(HAIKU_TOP) src tests kits net preflet ] ;
|
||||||
UseHeaders [ FDirName $(HAIKU_TOP) src servers net ] : true ;
|
UseHeaders [ FDirName $(HAIKU_TOP) src servers net ] : true ;
|
||||||
|
|
||||||
UsePrivateHeaders net shared ;
|
UsePrivateHeaders net shared ;
|
||||||
UseLibraryHeaders agg icon ;
|
UseLibraryHeaders agg icon ;
|
||||||
|
|
||||||
AddResources Interfaces :
|
|
||||||
InterfacesIcons.rdef
|
AddResources Interfaces :
|
||||||
|
InterfacesIcons.rdef
|
||||||
;
|
;
|
||||||
|
|
||||||
Addon Interfaces :
|
Addon Interfaces :
|
||||||
InterfacesAddOn.cpp
|
InterfacesAddOn.cpp
|
||||||
InterfacesListView.cpp
|
InterfacesListView.cpp
|
||||||
Setting.cpp
|
|
||||||
NetworkWindow.cpp
|
NetworkWindow.cpp
|
||||||
|
|
||||||
|
# from src/preferences/network
|
||||||
EthernetSettingsView.cpp
|
EthernetSettingsView.cpp
|
||||||
:
|
Settings.cpp
|
||||||
be
|
|
||||||
<nogrist>NetworkSetup
|
# from src/apps/networkstatus
|
||||||
$(TARGET_NETWORK_LIBS)
|
RadioView.cpp
|
||||||
$(TARGET_LIBSUPC++)
|
WirelessNetworkMenuItem.cpp
|
||||||
|
:
|
||||||
|
be
|
||||||
|
<nogrist>NetworkSetup
|
||||||
|
$(TARGET_NETWORK_LIBS)
|
||||||
|
libbnetapi.so
|
||||||
|
$(TARGET_LIBSUPC++)
|
||||||
|
$(HAIKU_LOCALE_LIBS)
|
||||||
libicon.a libagg.a
|
libicon.a libagg.a
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
*
|
*
|
||||||
* Author:
|
* Author:
|
||||||
* Andre Alves Garzia, andre@andregarzia.com
|
* Andre Alves Garzia, andre@andregarzia.com
|
||||||
* Fredrik Modéen
|
* Fredrik Modéen
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "NetworkWindow.h"
|
#include "NetworkWindow.h"
|
||||||
@ -13,18 +13,19 @@
|
|||||||
#include <GroupLayout.h>
|
#include <GroupLayout.h>
|
||||||
|
|
||||||
#include "EthernetSettingsView.h"
|
#include "EthernetSettingsView.h"
|
||||||
|
#include "Settings.h"
|
||||||
|
|
||||||
|
|
||||||
NetworkWindow::NetworkWindow(Setting* setting)
|
NetworkWindow::NetworkWindow(Settings* settings)
|
||||||
: BWindow(BRect(50, 50, 269, 302), "Network", B_TITLED_WINDOW,
|
: BWindow(BRect(50, 50, 269, 302), "Network", B_TITLED_WINDOW,
|
||||||
B_NOT_RESIZABLE | B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE
|
B_NOT_RESIZABLE | B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE
|
||||||
| B_AUTO_UPDATE_SIZE_LIMITS)
|
| B_AUTO_UPDATE_SIZE_LIMITS)
|
||||||
{
|
{
|
||||||
SetLayout(new BGroupLayout(B_HORIZONTAL));
|
SetLayout(new BGroupLayout(B_HORIZONTAL));
|
||||||
fEthernetView = new EthernetSettingsView(setting);
|
fEthernetView = new EthernetSettingsView(); // settings);
|
||||||
GetLayout()->AddView(fEthernetView);
|
GetLayout()->AddView(fEthernetView);
|
||||||
|
|
||||||
SetTitle(setting->Name());
|
SetTitle(settings->Name());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
*
|
*
|
||||||
* Author:
|
* Author:
|
||||||
* Andre Alves Garzia, andre@andregarzia.com
|
* Andre Alves Garzia, andre@andregarzia.com
|
||||||
* Fredrik Modéen
|
* Fredrik Modéen
|
||||||
*/
|
*/
|
||||||
#ifndef NETWORK_WINDOW_H
|
#ifndef NETWORK_WINDOW_H
|
||||||
#define NETWORK_WINDOW_H
|
#define NETWORK_WINDOW_H
|
||||||
@ -12,12 +12,13 @@
|
|||||||
|
|
||||||
#include <Window.h>
|
#include <Window.h>
|
||||||
|
|
||||||
#include "EthernetSettingsView.h"
|
class Settings;
|
||||||
|
class EthernetSettingsView;
|
||||||
|
|
||||||
|
|
||||||
class NetworkWindow : public BWindow {
|
class NetworkWindow : public BWindow {
|
||||||
public:
|
public:
|
||||||
NetworkWindow(Setting* setting);
|
NetworkWindow(Settings* setting);
|
||||||
virtual ~NetworkWindow();
|
virtual ~NetworkWindow();
|
||||||
virtual bool QuitRequested();
|
virtual bool QuitRequested();
|
||||||
virtual void MessageReceived(BMessage* mesage);
|
virtual void MessageReceived(BMessage* mesage);
|
||||||
|
@ -1,170 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2004-2007 Haiku Inc. All rights reserved.
|
|
||||||
* Distributed under the terms of the MIT License.
|
|
||||||
*
|
|
||||||
* Author:
|
|
||||||
* Andre Alves Garzia, andre@andregarzia.com
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include "Setting.h"
|
|
||||||
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <net/if.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <resolv.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/sockio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <net/if_dl.h>
|
|
||||||
#include <net/if_media.h>
|
|
||||||
#include <net/if_types.h>
|
|
||||||
|
|
||||||
#include <File.h>
|
|
||||||
#include <Path.h>
|
|
||||||
#include <String.h>
|
|
||||||
|
|
||||||
#include <AutoDeleter.h>
|
|
||||||
|
|
||||||
|
|
||||||
Setting::Setting(const char *name)
|
|
||||||
:
|
|
||||||
fAuto(true),
|
|
||||||
fEnabled(false)
|
|
||||||
{
|
|
||||||
fSocket = socket(AF_INET, SOCK_DGRAM, 0);
|
|
||||||
fName = name;
|
|
||||||
|
|
||||||
ReadConfiguration();
|
|
||||||
}
|
|
||||||
|
|
||||||
Setting::~Setting()
|
|
||||||
{
|
|
||||||
close(fSocket);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
Setting::_PrepareRequest(struct ifreq& request)
|
|
||||||
{
|
|
||||||
//This function is used for talking direct to the stack.
|
|
||||||
//It´s used by _ShowConfiguration.
|
|
||||||
|
|
||||||
const char* name = fName.String();
|
|
||||||
|
|
||||||
if (strlen(name) > IF_NAMESIZE)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
strcpy(request.ifr_name, name);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
Setting::ReadConfiguration()
|
|
||||||
{
|
|
||||||
ifreq request;
|
|
||||||
if (!_PrepareRequest(request))
|
|
||||||
return;
|
|
||||||
|
|
||||||
BString text = "dummy";
|
|
||||||
char address[32];
|
|
||||||
sockaddr_in* inetAddress = NULL;
|
|
||||||
|
|
||||||
// Obtain IP.
|
|
||||||
if (ioctl(fSocket, SIOCGIFADDR, &request, sizeof(request)) < 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
inetAddress = (sockaddr_in*)&request.ifr_addr;
|
|
||||||
if (inet_ntop(AF_INET, &inetAddress->sin_addr, address,
|
|
||||||
sizeof(address)) == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fIP = address;
|
|
||||||
|
|
||||||
// Obtain netmask.
|
|
||||||
if (ioctl(fSocket, SIOCGIFNETMASK, &request,
|
|
||||||
sizeof(request)) < 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
inetAddress = (sockaddr_in*)&request.ifr_mask;
|
|
||||||
if (inet_ntop(AF_INET, &inetAddress->sin_addr, address,
|
|
||||||
sizeof(address)) == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fNetmask = address;
|
|
||||||
|
|
||||||
// Obtain gateway
|
|
||||||
ifconf config;
|
|
||||||
config.ifc_len = sizeof(config.ifc_value);
|
|
||||||
if (ioctl(fSocket, SIOCGRTSIZE, &config, sizeof(struct ifconf)) < 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
uint32 size = (uint32)config.ifc_value;
|
|
||||||
if (size == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
void *buffer = malloc(size);
|
|
||||||
if (buffer == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
MemoryDeleter bufferDeleter(buffer);
|
|
||||||
config.ifc_len = size;
|
|
||||||
config.ifc_buf = buffer;
|
|
||||||
|
|
||||||
if (ioctl(fSocket, SIOCGRTTABLE, &config, sizeof(struct ifconf)) < 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ifreq *interface = (ifreq *)buffer;
|
|
||||||
ifreq *end = (ifreq *)((uint8 *)buffer + size);
|
|
||||||
|
|
||||||
while (interface < end) {
|
|
||||||
route_entry& route = interface->ifr_route;
|
|
||||||
|
|
||||||
if (route.flags & RTF_GATEWAY) {
|
|
||||||
inetAddress = (sockaddr_in*)route.gateway;
|
|
||||||
fGateway = inet_ntoa(inetAddress->sin_addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32 addressSize = 0;
|
|
||||||
if (route.destination != NULL)
|
|
||||||
addressSize += route.destination->sa_len;
|
|
||||||
if (route.mask != NULL)
|
|
||||||
addressSize += route.mask->sa_len;
|
|
||||||
if (route.gateway != NULL)
|
|
||||||
addressSize += route.gateway->sa_len;
|
|
||||||
|
|
||||||
interface = (ifreq *)((addr_t)interface + IF_NAMESIZE
|
|
||||||
+ sizeof(route_entry) + addressSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32 flags = 0;
|
|
||||||
if (ioctl(fSocket, SIOCGIFFLAGS, &request, sizeof(struct ifreq)) == 0)
|
|
||||||
flags = request.ifr_flags;
|
|
||||||
|
|
||||||
fAuto = (flags & IFF_AUTO_CONFIGURED) != 0;
|
|
||||||
fEnabled = (flags & IFF_UP) != 0;
|
|
||||||
|
|
||||||
if (ioctl(fSocket, SIOCGIFMEDIA, &request, sizeof(struct ifreq)) == 0)
|
|
||||||
fMedia = request.ifr_media;
|
|
||||||
|
|
||||||
// read resolv.conf for the dns.
|
|
||||||
fNameservers.MakeEmpty();
|
|
||||||
|
|
||||||
res_init();
|
|
||||||
res_state state = __res_state();
|
|
||||||
|
|
||||||
if (state != NULL) {
|
|
||||||
for (int i = 0; i < state->nscount; i++) {
|
|
||||||
fNameservers.AddItem(
|
|
||||||
new BString(inet_ntoa(state->nsaddr_list[i].sin_addr)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,50 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2004-2007 Haiku Inc. All rights reserved.
|
|
||||||
* Distributed under the terms of the MIT License.
|
|
||||||
*
|
|
||||||
* Author:
|
|
||||||
* Andre Alves Garzia, andre@andregarzia.com
|
|
||||||
*/
|
|
||||||
#ifndef SETTING_H
|
|
||||||
#define SETTING_H
|
|
||||||
|
|
||||||
#include <ObjectList.h>
|
|
||||||
#include <String.h>
|
|
||||||
|
|
||||||
class Setting {
|
|
||||||
public:
|
|
||||||
Setting(const char* name);
|
|
||||||
virtual ~Setting();
|
|
||||||
|
|
||||||
void SetName(BString name);
|
|
||||||
void SetIP(BString ip) {fIP = ip; }
|
|
||||||
void SetGateway(BString ip) {fGateway = ip; }
|
|
||||||
void SetNetmask(BString ip) {fNetmask = ip; }
|
|
||||||
void SetAutoConfigure(bool t) {fAuto = t; }
|
|
||||||
void Enable(bool enable) { fEnabled = enable; }
|
|
||||||
|
|
||||||
const char* IP() {return fIP.String(); }
|
|
||||||
const char* Gateway() {return fGateway.String(); }
|
|
||||||
const char* Netmask() {return fNetmask.String(); }
|
|
||||||
const char* Name() {return fName.String(); }
|
|
||||||
bool AutoConfigured() {return fAuto; }
|
|
||||||
bool Enabled() { return fEnabled; }
|
|
||||||
int Media() { return fMedia; }
|
|
||||||
BObjectList<BString> fNameservers;
|
|
||||||
void ReadConfiguration();
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool _PrepareRequest(struct ifreq& request);
|
|
||||||
|
|
||||||
int fSocket;
|
|
||||||
BString fIP;
|
|
||||||
BString fGateway;
|
|
||||||
BString fNetmask;
|
|
||||||
BString fName;
|
|
||||||
bool fAuto;
|
|
||||||
bool fEnabled;
|
|
||||||
int fMedia;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* SETTINGS_H */
|
|
Loading…
x
Reference in New Issue
Block a user