From 1b1ad0b951f817134ef167cb200df0c833463ab7 Mon Sep 17 00:00:00 2001 From: Philippe Houdoin Date: Mon, 14 Jun 2010 22:15:38 +0000 Subject: [PATCH] Implemented interfaces monitoring and disabled state introduced last week. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37136 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../InterfacesAddOn/InterfacesListView.cpp | 65 +++++++++++++++---- .../InterfacesAddOn/InterfacesListView.h | 12 ++-- .../net/preflet/InterfacesAddOn/Setting.cpp | 4 +- .../net/preflet/InterfacesAddOn/Setting.h | 3 + 4 files changed, 63 insertions(+), 21 deletions(-) diff --git a/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.cpp b/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.cpp index 9e70c4d13a..95bbec44c8 100644 --- a/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.cpp +++ b/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.cpp @@ -80,9 +80,8 @@ our_image(image_info& image) InterfaceListItem::InterfaceListItem(const char* name) : BListItem(0, false), - fEnabled(true), fIcon(NULL), - fSetting(new Setting(name)) + fSettings(new Setting(name)) { _InitIcon(); } @@ -143,7 +142,7 @@ InterfaceListItem::DrawItem(BView* owner, BRect /*bounds*/, bool complete) BPoint commentPt = iconPt + BPoint(32+8, fntheight*3); drawing_mode mode = owner->DrawingMode(); - if (fEnabled) + if (fSettings->Enabled()) owner->SetDrawingMode(B_OP_OVER); else { owner->SetDrawingMode(B_OP_ALPHA); @@ -153,23 +152,21 @@ InterfaceListItem::DrawItem(BView* owner, BRect /*bounds*/, bool complete) owner->DrawBitmapAsync(fIcon, iconPt); - if (!fEnabled) + if (!fSettings->Enabled()) owner->SetHighColor(tint_color(oldcolor, B_LIGHTEN_1_TINT)); owner->SetFont(be_bold_font); owner->DrawString(Name(), namePt); owner->SetFont(be_plain_font); - if (fEnabled) { + if (fSettings->Enabled()) { BString str("Enabled, IPv4 address: "); - str << fSetting->IP(); + str << fSettings->IP(); owner->DrawString(str.String(), driverPt); - if (fSetting->AutoConfigured()) + if (fSettings->AutoConfigured()) owner->DrawString("DHCP enabled", commentPt); else owner->DrawString("DHCP disabled, use static IP address", commentPt); - - } else owner->DrawString("Disabled.", driverPt); @@ -184,7 +181,7 @@ InterfaceListItem::_InitIcon() BBitmap* icon = NULL; const char* mediaTypeName = ""; - int media = fSetting->Media(); + int media = fSettings->Media(); printf("%s media = 0x%x\n", Name(), media); switch (IFM_TYPE(media)) { case IFM_ETHER: @@ -273,8 +270,7 @@ InterfacesListView::MessageReceived(BMessage* message) { switch (message->what) { case B_NETWORK_MONITOR: - message->PrintToStream(); - _UpdateList(); + _HandleNetworkMessage(message); break; default: @@ -331,10 +327,10 @@ InterfacesListView::_InitList() MakeEmpty(); for (uint32 i = 0; i < count; i++) { - // if (strcmp(interface->ifr_name, "loop") != 0) { + if (strcmp(interface->ifr_name, "loop") != 0) { AddItem(new InterfaceListItem(interface->ifr_name)); // printf("Name = %s\n", interface->ifr_name); - // } + } interface = (ifreq*)((addr_t)interface + IF_NAMESIZE + interface->ifr_addr.sa_len); } @@ -349,3 +345,44 @@ InterfacesListView::_UpdateList() return B_OK; } +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; + + InterfaceListItem* item = FindItem(name); + if (!item) + printf("InterfaceListItem %s not found!\n", name); + + switch (opcode) { + case B_NETWORK_INTERFACE_CHANGED: + case B_NETWORK_DEVICE_LINK_CHANGED: + 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); + delete item; + } + break; + } +} diff --git a/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.h b/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.h index a487f7edfc..8fe0919a6a 100644 --- a/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.h +++ b/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesListView.h @@ -31,17 +31,16 @@ public: void DrawItem(BView* owner, BRect bounds, bool complete); void Update(BView* owner, const BFont* font); - inline const char* Name() { return fSetting->Name(); } - inline bool Enabled() { return fEnabled; } - inline void SetEnabled(bool enable){ fEnabled = enable; } - inline Setting* GetSetting() { return fSetting; } + 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; } private: void _InitIcon(); - bool fEnabled; BBitmap* fIcon; - Setting* fSetting; + Setting* fSettings; }; @@ -62,6 +61,7 @@ protected: private: status_t _InitList(); status_t _UpdateList(); + void _HandleNetworkMessage(BMessage* message); }; #endif /*INTERFACES_LIST_VIEW_H*/ diff --git a/src/tests/kits/net/preflet/InterfacesAddOn/Setting.cpp b/src/tests/kits/net/preflet/InterfacesAddOn/Setting.cpp index 32802523d1..12f609804d 100644 --- a/src/tests/kits/net/preflet/InterfacesAddOn/Setting.cpp +++ b/src/tests/kits/net/preflet/InterfacesAddOn/Setting.cpp @@ -34,7 +34,8 @@ Setting::Setting(const char *name) : - fAuto(true) + fAuto(true), + fEnabled(false) { fSocket = socket(AF_INET, SOCK_DGRAM, 0); fName = name; @@ -149,6 +150,7 @@ Setting::ReadConfiguration() 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; diff --git a/src/tests/kits/net/preflet/InterfacesAddOn/Setting.h b/src/tests/kits/net/preflet/InterfacesAddOn/Setting.h index cffb365390..97534966ba 100644 --- a/src/tests/kits/net/preflet/InterfacesAddOn/Setting.h +++ b/src/tests/kits/net/preflet/InterfacesAddOn/Setting.h @@ -21,12 +21,14 @@ class Setting { 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 fNameservers; void ReadConfiguration(); @@ -41,6 +43,7 @@ class Setting { BString fNetmask; BString fName; bool fAuto; + bool fEnabled; int fMedia; };