diff --git a/src/tests/kits/net/preflet/InterfacesAddOn/EthernetSettingsView.cpp b/src/tests/kits/net/preflet/InterfacesAddOn/EthernetSettingsView.cpp deleted file mode 100644 index a03cb32c1a..0000000000 --- a/src/tests/kits/net/preflet/InterfacesAddOn/EthernetSettingsView.cpp +++ /dev/null @@ -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); - } -} diff --git a/src/tests/kits/net/preflet/InterfacesAddOn/EthernetSettingsView.h b/src/tests/kits/net/preflet/InterfacesAddOn/EthernetSettingsView.h deleted file mode 100644 index 95664eed2c..0000000000 --- a/src/tests/kits/net/preflet/InterfacesAddOn/EthernetSettingsView.h +++ /dev/null @@ -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 */ diff --git a/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.cpp b/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.cpp index 3b3639c4b5..e68f3adda5 100644 --- a/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.cpp +++ b/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.cpp @@ -61,14 +61,14 @@ InterfacesAddOn::CreateView(BRect *bounds) { float w, h; BRect r = *bounds; - + #define H_MARGIN 10 #define V_MARGIN 10 #define SMALL_MARGIN 3 - + if (r.Width() < 100 || r.Height() < 100) r.Set(0, 0, 100, 100); - + ResizeTo(r.Width(), r.Height()); BRect rlv = r; @@ -77,14 +77,14 @@ InterfacesAddOn::CreateView(BRect *bounds) rlv.right -= B_V_SCROLL_BAR_WIDTH; fListview = new InterfacesListView(rlv, "interfaces", B_FOLLOW_ALL_SIDES); fListview->SetSelectionMessage(new BMessage(INTERFACE_SELECTED_MSG)); - fListview->SetInvocationMessage(new BMessage(CONFIGURE_INTERFACE_MSG)); - AddChild(new BScrollView(NULL, fListview, B_FOLLOW_ALL_SIDES, B_WILL_DRAW + fListview->SetInvocationMessage(new BMessage(CONFIGURE_INTERFACE_MSG)); + AddChild(new BScrollView(NULL, fListview, B_FOLLOW_ALL_SIDES, B_WILL_DRAW | B_FRAME_EVENTS, false, true)); - + 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); - + fConfigure->GetPreferredSize(&w, &h); fConfigure->ResizeToPreferred(); fConfigure->SetEnabled(false); @@ -99,7 +99,7 @@ InterfacesAddOn::CreateView(BRect *bounds) fOnOff->Hide(); AddChild(fOnOff); - *bounds = Bounds(); + *bounds = Bounds(); return this; } @@ -119,7 +119,7 @@ InterfacesAddOn::MessageReceived(BMessage* msg) { int nr = fListview->CurrentSelection(); InterfaceListItem *item = NULL; - if(nr != -1) { + if(nr != -1) { item = dynamic_cast<InterfaceListItem*>(fListview->ItemAt(nr)); } @@ -131,26 +131,26 @@ InterfacesAddOn::MessageReceived(BMessage* msg) fOnOff->Hide(); break; } - fOnOff->SetLabel(item->Enabled() ? "Disable" : "Enable"); - fOnOff->Show(); + fOnOff->SetLabel(item->IsDisabled() ? "Enable" : "Disable"); + fOnOff->Show(); break; } - + case CONFIGURE_INTERFACE_MSG: { if (!item) break; - NetworkWindow* nw = new NetworkWindow(item->GetSetting()); + NetworkWindow* nw = new NetworkWindow(item->GetSettings()); nw->Show(); break; } - + case ONOFF_INTERFACE_MSG: if (!item) break; - - item->SetEnabled(!item->Enabled()); - fOnOff->SetLabel(item->Enabled() ? "Disable" : "Enable"); + + item->SetDisabled(!item->IsDisabled()); + fOnOff->SetLabel(item->IsDisabled() ? "Enable" : "Disable"); fListview->Invalidate(); break; diff --git a/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.cpp b/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.cpp index 95bbec44c8..b9503b4bfe 100644 --- a/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.cpp +++ b/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.cpp @@ -9,7 +9,6 @@ #include "InterfacesListView.h" -#include "Setting.h" #include <stdio.h> #include <stdlib.h> @@ -22,42 +21,17 @@ #include <sys/socket.h> #include <sys/sockio.h> -#include <IconUtils.h> #include <File.h> +#include <IconUtils.h> +#include <net_notifications.h> +#include <NetworkDevice.h> +#include <NetworkInterface.h> +#include <NetworkRoster.h> #include <Resources.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 - @@ -77,25 +51,30 @@ our_image(image_info& image) } +// #pragma mark - + + InterfaceListItem::InterfaceListItem(const char* name) - : + : BListItem(0, false), - fIcon(NULL), - fSettings(new Setting(name)) + fIcon(NULL) { - _InitIcon(); + fInterface.SetTo(name); + _Init(); } InterfaceListItem::~InterfaceListItem() { delete fIcon; + delete fSettings; } -void InterfaceListItem::Update(BView* owner, const BFont* font) -{ - BListItem::Update(owner,font); +void +InterfaceListItem::Update(BView* owner, const BFont* font) +{ + BListItem::Update(owner,font); font_height height; font->GetHeight(&height); @@ -110,21 +89,21 @@ InterfaceListItem::DrawItem(BView* owner, BRect /*bounds*/, bool complete) BListView* list = dynamic_cast<BListView*>(owner); if (!list) return; - + font_height height; BFont font; owner->GetFont(&font); font.GetHeight(&height); 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 oldlowcolor = owner->LowColor(); rgb_color oldcolor = owner->HighColor(); rgb_color color = oldviewcolor; - if ( IsSelected() ) + if ( IsSelected() ) color = tint_color(color, B_HIGHLIGHT_BACKGROUND_TINT); owner->SetViewColor( color ); @@ -140,35 +119,35 @@ InterfaceListItem::DrawItem(BView* owner, BRect /*bounds*/, bool complete) BPoint namePt = iconPt + BPoint(32+8, fntheight); BPoint driverPt = iconPt + BPoint(32+8, fntheight*2); BPoint commentPt = iconPt + BPoint(32+8, fntheight*3); - + drawing_mode mode = owner->DrawingMode(); - if (fSettings->Enabled()) - owner->SetDrawingMode(B_OP_OVER); - else { + if (fSettings->IsDisabled()) { owner->SetDrawingMode(B_OP_ALPHA); owner->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_OVERLAY); owner->SetHighColor(0, 0, 0, 32); - } - + } else + owner->SetDrawingMode(B_OP_OVER); + owner->DrawBitmapAsync(fIcon, iconPt); - if (!fSettings->Enabled()) + if (fSettings->IsDisabled()) owner->SetHighColor(tint_color(oldcolor, B_LIGHTEN_1_TINT)); owner->SetFont(be_bold_font); owner->DrawString(Name(), namePt); owner->SetFont(be_plain_font); - if (fSettings->Enabled()) { + if (fSettings->IsDisabled()) + owner->DrawString("Disabled.", driverPt); + else { BString str("Enabled, IPv4 address: "); str << fSettings->IP(); owner->DrawString(str.String(), driverPt); - if (fSettings->AutoConfigured()) + if (fSettings->AutoConfigure()) owner->DrawString("DHCP enabled", commentPt); else owner->DrawString("DHCP disabled, use static IP address", commentPt); - } else - owner->DrawString("Disabled.", driverPt); + } owner->SetHighColor(oldcolor); owner->SetDrawingMode(mode); @@ -176,12 +155,16 @@ InterfaceListItem::DrawItem(BView* owner, BRect /*bounds*/, bool complete) void -InterfaceListItem::_InitIcon() +InterfaceListItem::_Init() { + fSettings = new Settings(Name()); + + // Init icon BBitmap* icon = NULL; - - const char* mediaTypeName = ""; - int media = fSettings->Media(); + + const char* mediaTypeName = NULL; + + int media = fInterface.Media(); printf("%s media = 0x%x\n", Name(), media); switch (IFM_TYPE(media)) { case IFM_ETHER: @@ -190,6 +173,14 @@ InterfaceListItem::_InitIcon() case IFM_IEEE80211: mediaTypeName = "wifi"; break; + default: { + BNetworkDevice device(Name()); + if (device.IsWireless()) + mediaTypeName = "wifi"; + else if (device.IsEthernet()) + mediaTypeName = "ether"; + break; + } } image_info info; @@ -207,12 +198,12 @@ InterfaceListItem::_InitIcon() size_t size; // Try specific interface icon? 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? rawIcon = (const uint8*)resources.LoadResource(B_VECTOR_ICON_TYPE, mediaTypeName, &size); - if (!rawIcon) + if (rawIcon == NULL) // 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) { // Now build the bitmap @@ -244,7 +235,7 @@ InterfacesListView::AttachedToWindow() BListView::AttachedToWindow(); _InitList(); - + start_watching_network( B_WATCH_NETWORK_INTERFACE_CHANGES | B_WATCH_NETWORK_LINK_CHANGES, this); } @@ -298,42 +289,16 @@ InterfacesListView::FindItem(const char* name) status_t InterfacesListView::_InitList() { - SocketOpener socket; - if (socket.InitCheck() != B_OK) - return B_ERROR; + BNetworkRoster& roster = BNetworkRoster::Default(); + BNetworkInterface interface; + uint32 cookie = 0; - // iterate over all interfaces and retrieve minimal status - ifconf config; - config.ifc_len = sizeof(config.ifc_value); - 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); + while (roster.GetNextInterface(&cookie, interface) == B_OK) { + if (strncmp(interface.Name(), "loop", 4) && interface.Name()[0]) { + AddItem(new InterfaceListItem(interface.Name())); } - interface = (ifreq*)((addr_t)interface + IF_NAMESIZE - + interface->ifr_addr.sa_len); - } + } + return B_OK; } @@ -345,17 +310,17 @@ InterfacesListView::_UpdateList() return B_OK; } -void +void InterfacesListView::_HandleNetworkMessage(BMessage* message) { const char* name; int32 opcode; - + message->PrintToStream(); - + if (message->FindInt32("opcode", &opcode) != B_OK) return; - + if (message->FindString("interface", &name) != B_OK && message->FindString("device", &name) != B_OK) return; @@ -370,14 +335,14 @@ InterfacesListView::_HandleNetworkMessage(BMessage* message) if (item) InvalidateItem(IndexOf(item)); break; - + case B_NETWORK_INTERFACE_ADDED: if (item) InvalidateItem(IndexOf(item)); else AddItem(new InterfaceListItem(name)); break; - + case B_NETWORK_INTERFACE_REMOVED: if (item) { RemoveItem(item); diff --git a/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.h b/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.h index 8fe0919a6a..da6db828b0 100644 --- a/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.h +++ b/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.h @@ -11,17 +11,19 @@ #ifndef 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_dl.h> #include <net/if_media.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 { public: @@ -30,17 +32,18 @@ public: void DrawItem(BView* owner, BRect bounds, bool complete); void Update(BView* owner, const BFont* font); - - inline const char* Name() { return fSettings->Name(); } - inline bool Enabled() { return fSettings->Enabled(); } - inline void SetEnabled(bool enable){ fSettings->Enable(enable); } - inline Setting* GetSetting() { return fSettings; } + + inline const char* Name() { return fInterface.Name(); } + inline bool IsDisabled() { return fSettings->IsDisabled(); } + inline void SetDisabled(bool disable){ fSettings->SetDisabled(disable); } + inline Settings* GetSettings() { return fSettings; } private: - void _InitIcon(); + void _Init(); BBitmap* fIcon; - Setting* fSettings; + BNetworkInterface fInterface; + Settings* fSettings; }; diff --git a/src/tests/kits/net/preflet/InterfacesAddOn/Jamfile b/src/tests/kits/net/preflet/InterfacesAddOn/Jamfile index 62e5779270..a1a9eaf844 100644 --- a/src/tests/kits/net/preflet/InterfacesAddOn/Jamfile +++ b/src/tests/kits/net/preflet/InterfacesAddOn/Jamfile @@ -1,26 +1,37 @@ 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 servers net ] : true ; UsePrivateHeaders net shared ; UseLibraryHeaders agg icon ; -AddResources Interfaces : - InterfacesIcons.rdef + +AddResources Interfaces : + InterfacesIcons.rdef ; -Addon Interfaces : +Addon Interfaces : InterfacesAddOn.cpp InterfacesListView.cpp - Setting.cpp NetworkWindow.cpp + + # from src/preferences/network EthernetSettingsView.cpp - : - be - <nogrist>NetworkSetup - $(TARGET_NETWORK_LIBS) - $(TARGET_LIBSUPC++) + Settings.cpp + + # from src/apps/networkstatus + RadioView.cpp + WirelessNetworkMenuItem.cpp + : + be + <nogrist>NetworkSetup + $(TARGET_NETWORK_LIBS) + libbnetapi.so + $(TARGET_LIBSUPC++) + $(HAIKU_LOCALE_LIBS) libicon.a libagg.a ; - diff --git a/src/tests/kits/net/preflet/InterfacesAddOn/NetworkWindow.cpp b/src/tests/kits/net/preflet/InterfacesAddOn/NetworkWindow.cpp index 9ee801e775..743808df79 100644 --- a/src/tests/kits/net/preflet/InterfacesAddOn/NetworkWindow.cpp +++ b/src/tests/kits/net/preflet/InterfacesAddOn/NetworkWindow.cpp @@ -4,7 +4,7 @@ * * Author: * Andre Alves Garzia, andre@andregarzia.com - * Fredrik Modéen + * Fredrik Modéen */ #include "NetworkWindow.h" @@ -13,18 +13,19 @@ #include <GroupLayout.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, B_NOT_RESIZABLE | B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE | B_AUTO_UPDATE_SIZE_LIMITS) { SetLayout(new BGroupLayout(B_HORIZONTAL)); - fEthernetView = new EthernetSettingsView(setting); + fEthernetView = new EthernetSettingsView(); // settings); GetLayout()->AddView(fEthernetView); - - SetTitle(setting->Name()); + + SetTitle(settings->Name()); } diff --git a/src/tests/kits/net/preflet/InterfacesAddOn/NetworkWindow.h b/src/tests/kits/net/preflet/InterfacesAddOn/NetworkWindow.h index a0adee7f39..d7f7fc6324 100644 --- a/src/tests/kits/net/preflet/InterfacesAddOn/NetworkWindow.h +++ b/src/tests/kits/net/preflet/InterfacesAddOn/NetworkWindow.h @@ -4,7 +4,7 @@ * * Author: * Andre Alves Garzia, andre@andregarzia.com - * Fredrik Modéen + * Fredrik Modéen */ #ifndef NETWORK_WINDOW_H #define NETWORK_WINDOW_H @@ -12,12 +12,13 @@ #include <Window.h> -#include "EthernetSettingsView.h" +class Settings; +class EthernetSettingsView; class NetworkWindow : public BWindow { public: - NetworkWindow(Setting* setting); + NetworkWindow(Settings* setting); virtual ~NetworkWindow(); virtual bool QuitRequested(); virtual void MessageReceived(BMessage* mesage); diff --git a/src/tests/kits/net/preflet/InterfacesAddOn/Setting.cpp b/src/tests/kits/net/preflet/InterfacesAddOn/Setting.cpp deleted file mode 100644 index 12f609804d..0000000000 --- a/src/tests/kits/net/preflet/InterfacesAddOn/Setting.cpp +++ /dev/null @@ -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))); - } - } -} diff --git a/src/tests/kits/net/preflet/InterfacesAddOn/Setting.h b/src/tests/kits/net/preflet/InterfacesAddOn/Setting.h deleted file mode 100644 index 97534966ba..0000000000 --- a/src/tests/kits/net/preflet/InterfacesAddOn/Setting.h +++ /dev/null @@ -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 */