[haiku-commits] haiku: hrev48964 - src/preferences/network

  • From: axeld@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 31 Mar 2015 14:48:50 +0200 (CEST)

hrev48964 adds 1 changeset to branch 'master'
old head: 1aaa0c2142c6c843e93bd1ee8edd4c7ea6256559
new head: 6257ef92467bd4ca7d9d0d115a5510ea7c044d98
overview: 
http://cgit.haiku-os.org/haiku/log/?qt=range&q=6257ef92467b+%5E1aaa0c2142c6

----------------------------------------------------------------------------

6257ef92467b: Network: let add-ons replace themselves by name.
  
  * Ie. an add-on "Super duper service" in ~/config will override
    one with the same name in /system (and non-packaged in packaged,
    etc.).
  * Fixed size of the scroller to ignore the content size vertically.

                                   [ Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev48964
Commit:      6257ef92467bd4ca7d9d0d115a5510ea7c044d98
URL:         http://cgit.haiku-os.org/haiku/commit/?id=6257ef92467b
Author:      Axel Dörfler <axeld@xxxxxxxxxxxxxxxx>
Date:        Tue Mar 31 12:45:17 2015 UTC

----------------------------------------------------------------------------

1 file changed, 66 insertions(+), 53 deletions(-)
src/preferences/network/NetworkWindow.cpp | 119 ++++++++++++++------------

----------------------------------------------------------------------------

diff --git a/src/preferences/network/NetworkWindow.cpp 
b/src/preferences/network/NetworkWindow.cpp
index 5cc11ef..8aad195 100644
--- a/src/preferences/network/NetworkWindow.cpp
+++ b/src/preferences/network/NetworkWindow.cpp
@@ -126,6 +126,7 @@ NetworkWindow::NetworkWindow()
 
        BScrollView* scrollView = new BScrollView("ScrollView", fListView,
                0, false, true);
+       scrollView->SetExplicitMinSize(BSize(B_SIZE_UNSET, 42));
 
        fAddOnShellView = new BView("add-on shell", 0,
                new BGroupLayout(B_VERTICAL));
@@ -349,6 +350,11 @@ NetworkWindow::_ScanAddOns()
        BPathFinder::FindPaths(B_FIND_PATH_ADD_ONS_DIRECTORY, "Network 
Settings",
                paths);
 
+       // Collect add-on paths by name, so that each name will only be
+       // loaded once.
+       typedef std::map<BString, BPath> PathMap;
+       PathMap addOnMap;
+
        for (int32 i = 0; i < paths.CountStrings(); i++) {
                BDirectory directory(paths.StringAt(i));
                BEntry entry;
@@ -357,72 +363,79 @@ NetworkWindow::_ScanAddOns()
                        if (entry.GetPath(&path) != B_OK)
                                continue;
 
-                       image_id image = load_add_on(path.Path());
-                       if (image < 0) {
-                               printf("Failed to load %s addon: %s.\n", 
path.Path(),
-                                       strerror(image));
-                               continue;
-                       }
+                       if (addOnMap.find(path.Leaf()) == addOnMap.end())
+                               addOnMap.insert(std::pair<BString, 
BPath>(path.Leaf(), path));
+               }
+       }
 
-                       BNetworkSettingsAddOn* (*instantiateAddOn)(image_id 
image,
-                               BNetworkSettings& settings);
-
-                       status_t status = get_image_symbol(image,
-                               "instantiate_network_settings_add_on",
-                               B_SYMBOL_TYPE_TEXT, (void**)&instantiateAddOn);
-                       if (status != B_OK) {
-                               // No "addon instantiate function" symbol found 
in this addon
-                               printf("No symbol 
\"instantiate_network_settings_add_on\" "
-                                       "found in %s addon: not a network setup 
addon!\n",
-                                       path.Path());
-                               unload_add_on(image);
-                               continue;
-                       }
+       for (PathMap::const_iterator iterator = addOnMap.begin();
+                       iterator != addOnMap.end(); iterator++) {
+               const BPath& path = iterator->second;
 
-                       BNetworkSettingsAddOn* addOn = instantiateAddOn(image, 
fSettings);
-                       if (addOn == NULL) {
-                               unload_add_on(image);
-                               continue;
-                       }
+               image_id image = load_add_on(path.Path());
+               if (image < 0) {
+                       printf("Failed to load %s addon: %s.\n", path.Path(),
+                               strerror(image));
+                       continue;
+               }
 
-                       fAddOns.AddItem(addOn);
-
-                       // Per interface items
-                       ItemMap::const_iterator iterator = 
fInterfaceItemMap.begin();
-                       for (; iterator != fInterfaceItemMap.end(); iterator++) 
{
-                               const BString& interface = iterator->first;
-                               BListItem* interfaceItem = iterator->second;
-
-                               uint32 cookie = 0;
-                               while (true) {
-                                       BNetworkSettingsItem* item = 
addOn->CreateNextInterfaceItem(
-                                               cookie, interface.String());
-                                       if (item == NULL)
-                                               break;
-
-                                       fSettingsMap[item->ListItem()] = item;
-                                       fListView->AddUnder(item->ListItem(), 
interfaceItem);
-                               }
-                               fListView->SortItemsUnder(interfaceItem, true,
-                                       NetworkWindow::_CompareListItems);
-                       }
+               BNetworkSettingsAddOn* (*instantiateAddOn)(image_id image,
+                       BNetworkSettings& settings);
+
+               status_t status = get_image_symbol(image,
+                       "instantiate_network_settings_add_on",
+                       B_SYMBOL_TYPE_TEXT, (void**)&instantiateAddOn);
+               if (status != B_OK) {
+                       // No "addon instantiate function" symbol found in this 
addon
+                       printf("No symbol 
\"instantiate_network_settings_add_on\" found "
+                               "in %s addon: not a network setup addon!\n", 
path.Path());
+                       unload_add_on(image);
+                       continue;
+               }
+
+               BNetworkSettingsAddOn* addOn = instantiateAddOn(image, 
fSettings);
+               if (addOn == NULL) {
+                       unload_add_on(image);
+                       continue;
+               }
+
+               fAddOns.AddItem(addOn);
+
+               // Per interface items
+               ItemMap::const_iterator iterator = fInterfaceItemMap.begin();
+               for (; iterator != fInterfaceItemMap.end(); iterator++) {
+                       const BString& interface = iterator->first;
+                       BListItem* interfaceItem = iterator->second;
 
-                       // Generic items
                        uint32 cookie = 0;
                        while (true) {
-                               BNetworkSettingsItem* item = 
addOn->CreateNextItem(cookie);
+                               BNetworkSettingsItem* item = 
addOn->CreateNextInterfaceItem(
+                                       cookie, interface.String());
                                if (item == NULL)
                                        break;
 
                                fSettingsMap[item->ListItem()] = item;
-                               fListView->AddUnder(item->ListItem(),
-                                       _ListItemFor(item->Type()));
+                               fListView->AddUnder(item->ListItem(), 
interfaceItem);
                        }
+                       fListView->SortItemsUnder(interfaceItem, true,
+                               NetworkWindow::_CompareListItems);
+               }
 
-                       _SortItemsUnder(fServicesItem);
-                       _SortItemsUnder(fDialUpItem);
-                       _SortItemsUnder(fOtherItem);
+               // Generic items
+               uint32 cookie = 0;
+               while (true) {
+                       BNetworkSettingsItem* item = 
addOn->CreateNextItem(cookie);
+                       if (item == NULL)
+                               break;
+
+                       fSettingsMap[item->ListItem()] = item;
+                       fListView->AddUnder(item->ListItem(),
+                               _ListItemFor(item->Type()));
                }
+
+               _SortItemsUnder(fServicesItem);
+               _SortItemsUnder(fDialUpItem);
+               _SortItemsUnder(fOtherItem);
        }
 
        fListView->SortItemsUnder(NULL, true,


Other related posts:

  • » [haiku-commits] haiku: hrev48964 - src/preferences/network - axeld