[haiku-commits] haiku: hrev48163 - in src/tests/kits/net/preflet: ServicesAddOn InterfacesAddOn .

  • From: pulkomandy@xxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 30 Oct 2014 11:27:40 +0100 (CET)

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;
 };


Other related posts: