Skip to content
This repository was archived by the owner on Sep 27, 2024. It is now read-only.

Commit 1c73cc4

Browse files
authored
Merge pull request #245 from jan-cerny/rhbz1798739
Sort items in Tailoring window
2 parents 61eb34b + 703301c commit 1c73cc4

File tree

1 file changed

+46
-5
lines changed

1 file changed

+46
-5
lines changed

src/TailoringWindow.cpp

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,21 @@ void TailoringWindow::syncCollapsedItem(QTreeWidgetItem* item, QSet<QString>& us
717717
}
718718
}
719719

720+
static const char* _xccdf_item_description(struct xccdf_item* item)
721+
{
722+
struct oscap_text_iterator* title_it = xccdf_item_get_title(item);
723+
char* title = oscap_textlist_get_preferred_plaintext(title_it, NULL);
724+
oscap_text_iterator_free(title_it);
725+
return title ? title : "";
726+
}
727+
728+
static bool _xccdf_item_compare(struct xccdf_item* a, struct xccdf_item* b)
729+
{
730+
const char* a_title = _xccdf_item_description(a);
731+
const char* b_title = _xccdf_item_description(b);
732+
return (strcmp(a_title, b_title) < 0);
733+
}
734+
720735
void TailoringWindow::createTreeItem(QTreeWidgetItem* treeItem, struct xccdf_item* xccdfItem)
721736
{
722737
++mSynchronizeItemLock;
@@ -777,7 +792,9 @@ void TailoringWindow::createTreeItem(QTreeWidgetItem* treeItem, struct xccdf_ite
777792

778793
typedef std::vector<struct xccdf_item*> XCCDFItemVector;
779794

780-
XCCDFItemVector itemsToAdd;
795+
XCCDFItemVector valuesToAdd;
796+
XCCDFItemVector groupsToAdd;
797+
XCCDFItemVector rulesToAdd;
781798

782799
// valuesIt contains Values
783800
struct xccdf_value_iterator* valuesIt = NULL;
@@ -803,7 +820,7 @@ void TailoringWindow::createTreeItem(QTreeWidgetItem* treeItem, struct xccdf_ite
803820
while (xccdf_value_iterator_has_more(valuesIt))
804821
{
805822
struct xccdf_value* childItem = xccdf_value_iterator_next(valuesIt);
806-
itemsToAdd.push_back(xccdf_value_to_item(childItem));
823+
valuesToAdd.push_back(xccdf_value_to_item(childItem));
807824
}
808825
xccdf_value_iterator_free(valuesIt);
809826
}
@@ -813,14 +830,38 @@ void TailoringWindow::createTreeItem(QTreeWidgetItem* treeItem, struct xccdf_ite
813830
while (xccdf_item_iterator_has_more(itemsIt))
814831
{
815832
struct xccdf_item* childItem = xccdf_item_iterator_next(itemsIt);
816-
itemsToAdd.push_back(childItem);
833+
xccdf_type_t xccdfItemType = xccdf_item_get_type(childItem);
834+
switch (xccdfItemType)
835+
{
836+
case XCCDF_RULE:
837+
rulesToAdd.push_back(childItem);
838+
break;
839+
case XCCDF_GROUP:
840+
groupsToAdd.push_back(childItem);
841+
break;
842+
case XCCDF_VALUE:
843+
valuesToAdd.push_back(childItem);
844+
break;
845+
default:
846+
break;
847+
}
817848
}
818849
xccdf_item_iterator_free(itemsIt);
819850
}
820851

852+
std::sort(groupsToAdd.begin(), groupsToAdd.end(), _xccdf_item_compare);
853+
std::sort(valuesToAdd.begin(), valuesToAdd.end(), _xccdf_item_compare);
854+
std::sort(rulesToAdd.begin(), rulesToAdd.end(), _xccdf_item_compare);
855+
856+
/* Concatenate 3 vectors to 1 vector */
857+
XCCDFItemVector allObjectsToAdd;
858+
allObjectsToAdd.insert(allObjectsToAdd.end(), groupsToAdd.begin(), groupsToAdd.end());
859+
allObjectsToAdd.insert(allObjectsToAdd.end(), valuesToAdd.begin(), valuesToAdd.end());
860+
allObjectsToAdd.insert(allObjectsToAdd.end(), rulesToAdd.begin(), rulesToAdd.end());
861+
821862
unsigned int idx = 0;
822-
for (XCCDFItemVector::const_iterator it = itemsToAdd.begin();
823-
it != itemsToAdd.end(); ++it, ++idx)
863+
for (XCCDFItemVector::const_iterator it = allObjectsToAdd.begin();
864+
it != allObjectsToAdd.end(); ++it, ++idx)
824865
{
825866
struct xccdf_item* childXccdfItem = *it;
826867
QTreeWidgetItem* childTreeItem = 0;

0 commit comments

Comments
 (0)