hrev48163 adds 1 changeset to branch 'master' old head: 0cf2423cbf10f8c0be099049ed16322fd34952c6 new head: 824404e31faf781825b818267068bf44e1a0b7a0 overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=824404e+%5E0cf2423 ---------------------------------------------------------------------------- 824404e: 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) [ Adrien Destugues <pulkomandy@xxxxxxxxx> ] ---------------------------------------------------------------------------- Revision: hrev48163 Commit: 824404e31faf781825b818267068bf44e1a0b7a0 URL: http://cgit.haiku-os.org/haiku/commit/?id=824404e Author: Adrien Destugues <pulkomandy@xxxxxxxxx> Date: Thu Oct 30 10:24:04 2014 UTC ---------------------------------------------------------------------------- 10 files changed, 278 insertions(+), 76 deletions(-) .../preflet/InterfacesAddOn/InterfacesAddOn.cpp | 44 +++++--- .../preflet/InterfacesAddOn/InterfacesAddOn.h | 4 +- src/tests/kits/net/preflet/Jamfile | 2 +- .../kits/net/preflet/NetworkSetupWindow.cpp | 32 ++---- src/tests/kits/net/preflet/NetworkSetupWindow.h | 5 +- .../preflet/ServicesAddOn/DNSSettingsView.cpp | 112 +++++++++++++++++++ .../net/preflet/ServicesAddOn/DNSSettingsView.h | 36 ++++++ src/tests/kits/net/preflet/ServicesAddOn/Jamfile | 6 +- .../net/preflet/ServicesAddOn/ServicesAddOn.cpp | 88 +++++++++++---- .../net/preflet/ServicesAddOn/ServicesAddOn.h | 25 +++-- ---------------------------------------------------------------------------- diff --git a/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.cpp b/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.cpp index 09d9984..d726873 100644 --- a/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.cpp +++ b/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.cpp @@ -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); +} diff --git a/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.h b/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.h index c3bdc0b..21704a1 100644 --- a/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.h +++ b/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.h @@ -32,7 +32,6 @@ public: InterfacesAddOn(image_id addon_image); ~InterfacesAddOn(); - const char* Name(); status_t Save(); status_t Revert(); @@ -42,8 +41,9 @@ public: void MessageReceived(BMessage* msg); private: + InterfaceView* _SettingsView(); +private: InterfacesListView* fListView; - InterfaceView* fSettingsView; }; diff --git a/src/tests/kits/net/preflet/Jamfile b/src/tests/kits/net/preflet/Jamfile index c9675da..9a30b10 100644 --- a/src/tests/kits/net/preflet/Jamfile +++ b/src/tests/kits/net/preflet/Jamfile @@ -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 ; diff --git a/src/tests/kits/net/preflet/NetworkSetupWindow.cpp b/src/tests/kits/net/preflet/NetworkSetupWindow.cpp index 156cacb..91227d5 100644 --- a/src/tests/kits/net/preflet/NetworkSetupWindow.cpp +++ b/src/tests/kits/net/preflet/NetworkSetupWindow.cpp @@ -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++; diff --git a/src/tests/kits/net/preflet/NetworkSetupWindow.h b/src/tests/kits/net/preflet/NetworkSetupWindow.h index 4931b0e..f4b63c2 100644 --- a/src/tests/kits/net/preflet/NetworkSetupWindow.h +++ b/src/tests/kits/net/preflet/NetworkSetupWindow.h @@ -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; }; diff --git a/src/tests/kits/net/preflet/ServicesAddOn/DNSSettingsView.cpp b/src/tests/kits/net/preflet/ServicesAddOn/DNSSettingsView.cpp new file mode 100644 index 0000000..58117da --- /dev/null +++ b/src/tests/kits/net/preflet/ServicesAddOn/DNSSettingsView.cpp @@ -0,0 +1,112 @@ +/* + * Copyright 2014 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Adrien Destugues, pulkomandy@xxxxxxxxxxxxx + */ + + +#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; +} diff --git a/src/tests/kits/net/preflet/ServicesAddOn/DNSSettingsView.h b/src/tests/kits/net/preflet/ServicesAddOn/DNSSettingsView.h new file mode 100644 index 0000000..f91ccb4 --- /dev/null +++ b/src/tests/kits/net/preflet/ServicesAddOn/DNSSettingsView.h @@ -0,0 +1,36 @@ +/* + * Copyright 2014 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Adrien Destugues, pulkomandy@xxxxxxxxxxxxx + */ + + +#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; +}; diff --git a/src/tests/kits/net/preflet/ServicesAddOn/Jamfile b/src/tests/kits/net/preflet/ServicesAddOn/Jamfile index a291427..a0dd33a 100644 --- a/src/tests/kits/net/preflet/ServicesAddOn/Jamfile +++ b/src/tests/kits/net/preflet/ServicesAddOn/Jamfile @@ -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++ ] ; diff --git a/src/tests/kits/net/preflet/ServicesAddOn/ServicesAddOn.cpp b/src/tests/kits/net/preflet/ServicesAddOn/ServicesAddOn.cpp index 2830b02..06c439a 100644 --- a/src/tests/kits/net/preflet/ServicesAddOn/ServicesAddOn.cpp +++ b/src/tests/kits/net/preflet/ServicesAddOn/ServicesAddOn.cpp @@ -6,6 +6,9 @@ * Alexander von Gluck, kallisti5@xxxxxxxxxxx */ + +#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 "DNSSettingsView.h" -#include "ServicesAddOn.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)); + + BScrollView* sv = new BScrollView( "ScrollView", + fServicesListView, B_WILL_DRAW | B_FRAME_EVENTS, false, true); + + fServicesListView->AddItem(new BStringItem("DNS")); + +#if 0 + // Enable this when the inetd view is ready + if (_ParseInetd() != B_OK) + _ParseXinetd(); +#endif + + AddChild(sv); - 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); + return this; +} + + +void +ServicesAddOn::AttachedToWindow() +{ + fServicesListView->SetTarget(this); +} - BScrollView* sv = new BScrollView( "system_services_scrollview", - fServicesListView, B_FOLLOW_ALL_SIDES, - B_WILL_DRAW | B_FRAME_EVENTS, false, true); - if (ParseInetd() != B_OK) - ParseXinetd(); +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; + } - *bounds = r; - return sv; + 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) { diff --git a/src/tests/kits/net/preflet/ServicesAddOn/ServicesAddOn.h b/src/tests/kits/net/preflet/ServicesAddOn/ServicesAddOn.h index ffe43ef..ca6f370 100644 --- a/src/tests/kits/net/preflet/ServicesAddOn/ServicesAddOn.h +++ b/src/tests/kits/net/preflet/ServicesAddOn/ServicesAddOn.h @@ -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; };