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.
This commit is contained in:
Axel Dörfler
2015-03-31 14:45:17 +02:00
parent 1aaa0c2142
commit 6257ef9246
+63 -50
View File
@@ -126,6 +126,7 @@ NetworkWindow::NetworkWindow()
BScrollView* scrollView = new BScrollView("ScrollView", fListView, BScrollView* scrollView = new BScrollView("ScrollView", fListView,
0, false, true); 0, false, true);
scrollView->SetExplicitMinSize(BSize(B_SIZE_UNSET, 42));
fAddOnShellView = new BView("add-on shell", 0, fAddOnShellView = new BView("add-on shell", 0,
new BGroupLayout(B_VERTICAL)); new BGroupLayout(B_VERTICAL));
@@ -349,6 +350,11 @@ NetworkWindow::_ScanAddOns()
BPathFinder::FindPaths(B_FIND_PATH_ADD_ONS_DIRECTORY, "Network Settings", BPathFinder::FindPaths(B_FIND_PATH_ADD_ONS_DIRECTORY, "Network Settings",
paths); 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++) { for (int32 i = 0; i < paths.CountStrings(); i++) {
BDirectory directory(paths.StringAt(i)); BDirectory directory(paths.StringAt(i));
BEntry entry; BEntry entry;
@@ -357,72 +363,79 @@ NetworkWindow::_ScanAddOns()
if (entry.GetPath(&path) != B_OK) if (entry.GetPath(&path) != B_OK)
continue; continue;
image_id image = load_add_on(path.Path()); if (addOnMap.find(path.Leaf()) == addOnMap.end())
if (image < 0) { addOnMap.insert(std::pair<BString, BPath>(path.Leaf(), path));
printf("Failed to load %s addon: %s.\n", path.Path(), }
strerror(image)); }
continue;
}
BNetworkSettingsAddOn* (*instantiateAddOn)(image_id image, for (PathMap::const_iterator iterator = addOnMap.begin();
BNetworkSettings& settings); iterator != addOnMap.end(); iterator++) {
const BPath& path = iterator->second;
status_t status = get_image_symbol(image, image_id image = load_add_on(path.Path());
"instantiate_network_settings_add_on", if (image < 0) {
B_SYMBOL_TYPE_TEXT, (void**)&instantiateAddOn); printf("Failed to load %s addon: %s.\n", path.Path(),
if (status != B_OK) { strerror(image));
// No "addon instantiate function" symbol found in this addon continue;
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); BNetworkSettingsAddOn* (*instantiateAddOn)(image_id image,
if (addOn == NULL) { BNetworkSettings& settings);
unload_add_on(image);
continue;
}
fAddOns.AddItem(addOn); 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;
}
// Per interface items BNetworkSettingsAddOn* addOn = instantiateAddOn(image, fSettings);
ItemMap::const_iterator iterator = fInterfaceItemMap.begin(); if (addOn == NULL) {
for (; iterator != fInterfaceItemMap.end(); iterator++) { unload_add_on(image);
const BString& interface = iterator->first; continue;
BListItem* interfaceItem = iterator->second; }
uint32 cookie = 0; fAddOns.AddItem(addOn);
while (true) {
BNetworkSettingsItem* item = addOn->CreateNextInterfaceItem(
cookie, interface.String());
if (item == NULL)
break;
fSettingsMap[item->ListItem()] = item; // Per interface items
fListView->AddUnder(item->ListItem(), interfaceItem); ItemMap::const_iterator iterator = fInterfaceItemMap.begin();
} for (; iterator != fInterfaceItemMap.end(); iterator++) {
fListView->SortItemsUnder(interfaceItem, true, const BString& interface = iterator->first;
NetworkWindow::_CompareListItems); BListItem* interfaceItem = iterator->second;
}
// Generic items
uint32 cookie = 0; uint32 cookie = 0;
while (true) { while (true) {
BNetworkSettingsItem* item = addOn->CreateNextItem(cookie); BNetworkSettingsItem* item = addOn->CreateNextInterfaceItem(
cookie, interface.String());
if (item == NULL) if (item == NULL)
break; break;
fSettingsMap[item->ListItem()] = item; fSettingsMap[item->ListItem()] = item;
fListView->AddUnder(item->ListItem(), fListView->AddUnder(item->ListItem(), interfaceItem);
_ListItemFor(item->Type()));
} }
fListView->SortItemsUnder(interfaceItem, true,
_SortItemsUnder(fServicesItem); NetworkWindow::_CompareListItems);
_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, fListView->SortItemsUnder(NULL, true,