@@ -717,6 +717,21 @@ void TailoringWindow::syncCollapsedItem(QTreeWidgetItem* item, QSet<QString>& us
717
717
}
718
718
}
719
719
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
+
720
735
void TailoringWindow::createTreeItem (QTreeWidgetItem* treeItem, struct xccdf_item * xccdfItem)
721
736
{
722
737
++mSynchronizeItemLock ;
@@ -777,7 +792,9 @@ void TailoringWindow::createTreeItem(QTreeWidgetItem* treeItem, struct xccdf_ite
777
792
778
793
typedef std::vector<struct xccdf_item *> XCCDFItemVector;
779
794
780
- XCCDFItemVector itemsToAdd;
795
+ XCCDFItemVector valuesToAdd;
796
+ XCCDFItemVector groupsToAdd;
797
+ XCCDFItemVector rulesToAdd;
781
798
782
799
// valuesIt contains Values
783
800
struct xccdf_value_iterator * valuesIt = NULL ;
@@ -803,7 +820,7 @@ void TailoringWindow::createTreeItem(QTreeWidgetItem* treeItem, struct xccdf_ite
803
820
while (xccdf_value_iterator_has_more (valuesIt))
804
821
{
805
822
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));
807
824
}
808
825
xccdf_value_iterator_free (valuesIt);
809
826
}
@@ -813,14 +830,38 @@ void TailoringWindow::createTreeItem(QTreeWidgetItem* treeItem, struct xccdf_ite
813
830
while (xccdf_item_iterator_has_more (itemsIt))
814
831
{
815
832
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
+ }
817
848
}
818
849
xccdf_item_iterator_free (itemsIt);
819
850
}
820
851
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
+
821
862
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)
824
865
{
825
866
struct xccdf_item * childXccdfItem = *it;
826
867
QTreeWidgetItem* childTreeItem = 0 ;
0 commit comments