NetworkSetup: add the Services tab

* UI still needs some tweaking
* The Services tab has a list of services. This currently include DNS
and will soon also include the services listed in xinetd.
* The DNS tab allows to manage DNS servers (settings can't be saved yet)
This commit is contained in:
Adrien Destugues
2014-10-30 11:27:38 +01:00
parent 0cf2423cbf
commit 824404e31f
10 changed files with 278 additions and 76 deletions
@@ -50,7 +50,7 @@ InterfacesAddOn::InterfacesAddOn(image_id image)
NetworkSetupAddOn(image),
BBox(NULL, B_NAVIGABLE_JUMP, B_NO_BORDER)
{
fSettingsView = NULL;
SetName("Interfaces");
}
@@ -59,13 +59,6 @@ InterfacesAddOn::~InterfacesAddOn()
}
const char*
InterfacesAddOn::Name()
{
return "Interfaces";
}
BView*
InterfacesAddOn::CreateView()
{
@@ -101,8 +94,10 @@ status_t
InterfacesAddOn::Save()
{
// TODO : Profile?
fSettingsView->Apply();
InterfaceView* settingsView = _SettingsView();
if (settingsView != NULL)
settingsView->Apply();
return fListView->SaveItems();
}
@@ -110,7 +105,9 @@ InterfacesAddOn::Save()
status_t
InterfacesAddOn::Revert()
{
fSettingsView->Revert();
InterfaceView* settingsView = _SettingsView();
if (settingsView != NULL)
settingsView->Revert();
return B_OK;
}
@@ -129,14 +126,17 @@ InterfacesAddOn::MessageReceived(BMessage* msg)
if (item == NULL)
break;
// TODO it would be better to reuse the view instead of recreating
// one.
if (fSettingsView != NULL) {
fSettingsView->RemoveSelf();
delete fSettingsView;
BView* panel = Window()->FindView("panel");
BView* settingsView = panel->ChildAt(0);
// Remove currently displayed settings view
if (settingsView != NULL) {
settingsView->RemoveSelf();
delete settingsView;
}
fSettingsView = new InterfaceView(item->GetSettings());
AddChild(fSettingsView);
settingsView = new InterfaceView(item->GetSettings());
Window()->FindView("panel")->AddChild(settingsView);
break;
}
@@ -148,3 +148,11 @@ InterfacesAddOn::MessageReceived(BMessage* msg)
BBox::MessageReceived(msg);
}
}
InterfaceView*
InterfacesAddOn::_SettingsView()
{
BView* view = Window()->FindView("panel")->ChildAt(0);
return dynamic_cast<InterfaceView*>(view);
}
@@ -32,7 +32,6 @@ public:
InterfacesAddOn(image_id addon_image);
~InterfacesAddOn();
const char* Name();
status_t Save();
status_t Revert();
@@ -41,9 +40,10 @@ public:
void AttachedToWindow();
void MessageReceived(BMessage* msg);
private:
InterfaceView* _SettingsView();
private:
InterfacesListView* fListView;
InterfaceView* fSettingsView;
};
+1 -1
View File
@@ -16,7 +16,7 @@ Preference NetworkSetup :
;
SubInclude HAIKU_TOP src tests kits net preflet InterfacesAddOn ;
#SubInclude HAIKU_TOP src tests kits net preflet ServicesAddOn ;
SubInclude HAIKU_TOP src tests kits net preflet ServicesAddOn ;
#SubInclude HAIKU_TOP src tests kits net preflet DummyAddOn ;
#SubInclude HAIKU_TOP src tests kits net preflet MultipleAddOns ;
#SubInclude HAIKU_TOP src tests kits net preflet DialUpAddOn ;
@@ -51,7 +51,7 @@ NetworkSetupWindow::NetworkSetupWindow(const char *title)
// ---- Settings section
fPanel = new BGroupView(B_VERTICAL);
fPanel = new BTabView("tabs", B_WIDTH_FROM_LABEL);
fApplyButton = new BButton("apply", B_TRANSLATE("Apply"),
new BMessage(kMsgApply));
@@ -71,7 +71,10 @@ NetworkSetupWindow::NetworkSetupWindow(const char *title)
.AddGlue()
.End()
#endif
.Add(fPanel)
.AddGroup(B_HORIZONTAL, B_USE_DEFAULT_SPACING)
.Add(fPanel)
.Add(new BGroupView("panel"))
.End()
.AddGroup(B_HORIZONTAL, B_USE_DEFAULT_SPACING)
.Add(fRevertButton)
.AddGlue()
@@ -81,7 +84,7 @@ NetworkSetupWindow::NetworkSetupWindow(const char *title)
B_USE_SMALL_SPACING, B_USE_SMALL_SPACING)
);
_BuildShowTabView(kMsgAddonShow);
_BuildShowTabView();
fAddonView = NULL;
@@ -146,18 +149,6 @@ NetworkSetupWindow::MessageReceived(BMessage* msg)
break;
}
case kMsgAddonShow: {
if (fAddonView)
fAddonView->RemoveSelf();
fAddonView = NULL;
if (msg->FindPointer("addon_view", (void **) &fAddonView) != B_OK)
break;
fPanel->AddChild(fAddonView);
break;
}
default:
inherited::MessageReceived(msg);
}
@@ -226,7 +217,7 @@ NetworkSetupWindow::_BuildProfilesMenu(BMenu* menu, int32 msg_what)
void
NetworkSetupWindow::_BuildShowTabView(int32 msg_what)
NetworkSetupWindow::_BuildShowTabView()
{
BPath path;
BPath addon_path;
@@ -290,20 +281,13 @@ NetworkSetupWindow::_BuildShowTabView(int32 msg_what)
while ((fNetworkAddOnMap[fAddonCount]
= get_nth_addon(addon_id, tabCount)) != NULL) {
printf("Adding Tab: %d\n", fAddonCount);
BMessage* msg = new BMessage(msg_what);
BView* addon_view
= fNetworkAddOnMap[fAddonCount]->CreateView();
msg->AddInt32("image_id", addon_id);
msg->AddString("addon_path", addon_path.Path());
msg->AddPointer("addon", fNetworkAddOnMap[fAddonCount]);
msg->AddPointer("addon_view", addon_view);
// FIXME rework this: we don't want to use a tab view here,
// instead add-ons should populate the "interfaces" list with
// interfaces, services, etc.
fPanel->AddChild(addon_view);
fPanel->AddTab(addon_view);
fAddonCount++;
// Number of tab addons total
tabCount++;
@@ -33,7 +33,6 @@ class NetworkSetupWindow : public BWindow
typedef BWindow inherited;
static const uint32 kMsgAddonShow = 'show';
static const uint32 kMsgProfileSelected = 'prof';
static const uint32 kMsgProfileManage = 'mngp';
static const uint32 kMsgProfileNew = 'newp';
@@ -45,7 +44,7 @@ class NetworkSetupWindow : public BWindow
private:
void _BuildProfilesMenu(BMenu* menu, int32 msg);
void _BuildShowTabView(int32 msg);
void _BuildShowTabView();
BButton* fHelpButton;
BButton* fRevertButton;
@@ -53,7 +52,7 @@ class NetworkSetupWindow : public BWindow
NetworkAddOnMap fNetworkAddOnMap;
BView* fPanel;
BTabView* fPanel;
BView* fAddonView;
int fAddonCount;
};
@@ -0,0 +1,112 @@
/*
* Copyright 2014 Haiku Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Adrien Destugues, [email protected]
*/
#include "DNSSettingsView.h"
#include <Button.h>
#include <LayoutBuilder.h>
#include <ListView.h>
#include <ScrollView.h>
#include <TextControl.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <resolv.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
static const int32 kAddServer = 'adds';
static const int32 kDeleteServer = 'dels';
static const int32 kEditServer = 'edit';
DNSSettingsView::DNSSettingsView()
{
fServerListView = new BListView("nameservers");
fTextControl = new BTextControl("", "", NULL);
fTextControl->SetModificationMessage(new BMessage(kEditServer));
fAddButton = new BButton("Add", new BMessage(kAddServer));
fUpButton = new BButton("Move up", NULL);
fDownButton = new BButton("Move down", NULL);
fRemoveButton = new BButton("Remove", new BMessage(kDeleteServer));
BLayoutBuilder::Group<>(this)
.AddGrid(B_HORIZONTAL)
.Add(fTextControl, 0, 0)
.Add(fAddButton, 1, 0)
.Add(new BScrollView("scroll", fServerListView, 0, false, true),
0, 1, 1, 4)
.Add(fUpButton, 1, 1)
.Add(fDownButton, 1, 2)
.Add(fRemoveButton, 1, 3)
.End()
.End();
_ParseResolvConf();
}
void
DNSSettingsView::AttachedToWindow()
{
fAddButton->SetTarget(this);
fRemoveButton->SetTarget(this);
fUpButton->SetTarget(this);
fDownButton->SetTarget(this);
fTextControl->SetTarget(this);
}
void
DNSSettingsView::MessageReceived(BMessage* message)
{
switch(message->what) {
case kAddServer:
{
const char* address = fTextControl->Text();
fServerListView->AddItem(new BStringItem(address));
break;
}
case kDeleteServer:
{
fServerListView->RemoveItem(fServerListView->CurrentSelection());
}
case kEditServer:
{
struct in_addr dummy;
bool success = inet_aton(fTextControl->Text(), &dummy);
fTextControl->MarkAsInvalid(!success);
fAddButton->SetEnabled(success);
}
default:
BGroupView::MessageReceived(message);
}
}
status_t
DNSSettingsView::_ParseResolvConf()
{
res_init();
res_state state = __res_state();
if (state != NULL) {
for (int i = 0; i < state->nscount; i++) {
fServerListView->AddItem(
new BStringItem(inet_ntoa(state->nsaddr_list[i].sin_addr)));
}
return B_OK;
}
return B_ERROR;
}
@@ -0,0 +1,36 @@
/*
* Copyright 2014 Haiku Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Adrien Destugues, [email protected]
*/
#include <GroupView.h>
class BButton;
class BListView;
class BTextControl;
class DNSSettingsView: public BGroupView
{
public:
DNSSettingsView();
void AttachedToWindow();
void MessageReceived(BMessage* message);
private:
status_t _ParseResolvConf();
private:
BListView* fServerListView;
BTextControl* fTextControl;
BButton* fAddButton;
BButton* fRemoveButton;
BButton* fUpButton;
BButton* fDownButton;
};
@@ -2,8 +2,10 @@ SubDir HAIKU_TOP src tests kits net preflet ServicesAddOn ;
UseHeaders [ FDirName $(HAIKU_TOP) src tests kits net preflet ] ;
Addon Services :
Addon Services :
ServicesAddOn.cpp
: be <nogrist>NetworkSetup [ TargetLibstdc++ ] # $(HAIKU_NETWORK_LIBS)
DNSSettingsView.cpp
: be <nogrist>NetworkSetup network [ TargetLibstdc++ ]
;
@@ -6,6 +6,9 @@
* Alexander von Gluck, [email protected]
*/
#include "ServicesAddOn.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -13,8 +16,12 @@
#include <ListView.h>
#include <ScrollView.h>
#include <String.h>
#include <Window.h>
#include "ServicesAddOn.h"
#include "DNSSettingsView.h"
static const int32 kSelectionChanged = 'ssrv';
NetworkSetupAddOn*
@@ -32,37 +39,80 @@ get_nth_addon(image_id image, int index)
ServicesAddOn::ServicesAddOn(image_id image)
:
NetworkSetupAddOn(image)
NetworkSetupAddOn(image),
BGroupView("Services")
{
}
BView*
ServicesAddOn::CreateView(BRect* bounds)
ServicesAddOn::CreateView()
{
BRect r = *bounds;
if (r.Width() < 100 || r.Height() < 100)
r.Set(0, 0, 100, 100);
fServicesListView = new BListView("system_services",
B_SINGLE_SELECTION_LIST);
fServicesListView->SetSelectionMessage(new BMessage(kSelectionChanged));
BRect rlv = r.InsetByCopy(2, 2);
rlv.right -= B_V_SCROLL_BAR_WIDTH;
fServicesListView = new BListView(rlv, "system_services",
B_SINGLE_SELECTION_LIST, B_FOLLOW_ALL_SIDES);
BScrollView* sv = new BScrollView( "ScrollView",
fServicesListView, B_WILL_DRAW | B_FRAME_EVENTS, false, true);
BScrollView* sv = new BScrollView( "system_services_scrollview",
fServicesListView, B_FOLLOW_ALL_SIDES,
B_WILL_DRAW | B_FRAME_EVENTS, false, true);
fServicesListView->AddItem(new BStringItem("DNS"));
if (ParseInetd() != B_OK)
ParseXinetd();
#if 0
// Enable this when the inetd view is ready
if (_ParseInetd() != B_OK)
_ParseXinetd();
#endif
*bounds = r;
return sv;
AddChild(sv);
return this;
}
void
ServicesAddOn::AttachedToWindow()
{
fServicesListView->SetTarget(this);
}
void
ServicesAddOn::MessageReceived(BMessage* message)
{
switch(message->what) {
case kSelectionChanged:
{
BStringItem* item = static_cast<BStringItem*>(
fServicesListView->ItemAt(message->FindInt32("index")));
if (item == NULL)
return;
BView* panel = Window()->FindView("panel");
BView* settingsView = panel->ChildAt(0);
// Remove currently displayed settings view
if (settingsView != NULL) {
settingsView->RemoveSelf();
delete settingsView;
}
if (strcmp(item->Text(), "DNS") == 0) {
settingsView = new DNSSettingsView();
panel->AddChild(settingsView);
} else {
// TODO show a standard "inetd service" view
}
break;
}
default:
BGroupView::MessageReceived(message);
}
}
status_t
ServicesAddOn::ParseInetd()
ServicesAddOn::_ParseInetd()
{
FILE *f = fopen("/etc/inetd.conf", "r");
if (f) {
@@ -102,7 +152,7 @@ ServicesAddOn::ParseInetd()
status_t
ServicesAddOn::ParseXinetd()
ServicesAddOn::_ParseXinetd()
{
FILE *f = fopen("/boot/system/settings/network/services", "r");
if (f) {
@@ -9,13 +9,24 @@
#include "NetworkSetupAddOn.h"
class ServicesAddOn : public NetworkSetupAddOn {
protected:
BListView* fServicesListView;
#include <GroupView.h>
class BListView;
class ServicesAddOn : public NetworkSetupAddOn, public BGroupView {
public:
ServicesAddOn(image_id addon_image);
BView* CreateView(BRect* bounds);
const char* Name() { return "Services"; };
status_t ParseInetd();
status_t ParseXinetd();
BView* CreateView();
void AttachedToWindow();
void MessageReceived(BMessage*);
private:
status_t _ParseInetd();
status_t _ParseXinetd();
private:
BListView* fServicesListView;
};