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:
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user