Documentation diverse et en vrac

Hiérarchie des classes de l'API des ElementsCollectionItem

Pour information, cette hiérarchie de classe permet d'accéder et de manipuler de manière abstraite des collections, catégories et éléments, que ceux-ci soient stockés sur un système de fichiers (classes d'implémentation File*) ou dans un projet (classes d'implémentation Xml*)

  • ElementsCollectionItem [pure virtual]
    • ElementsCollection [pure virtual]
      • FileElementsCollection
      • XmlElementsCollection
    • ElementsCategory [pure virtual]
      • FileElementsCategory
      • XmlElementsCategory
    • ElementDefinition [pure virtual]
      • FileElementDefinition
      • XmlElementDefinition

Contrôles effectués lors des déplacements / copies dans l'API des ElementsCollectionItem

Contrôle ElementsCollection ElementsCategory ElementDefinition
copy move copy move copy move
Handler provided ? [ok] [ok] [ok] [ok] [ok] [ok]
Dst != src ? [ok] [no] [ok] [ok] [no] [no]
Src is writable ? [no] [no] [no] [ok] [no] [ok]
Dst is readable ? [ok] [no] [ok] [ok] [ok] [ok]
Dst is writeable ? [ok] [no] [ok] [ok] [ok] [ok]
Dst already exists ? [ok] [no] [ok] [ok] [ok] [ok]
Already existing dst is writable ? [ok] [no] [ok] [ok] [ok] [ok]
Creation/deletion error ? [ok] [no] [ok] [ok] [ok] [ok]

Légende

[ok] Vérification effectuée
[no] Vérification non effectuée car non pertinente

Exemple : on n'a pas besoin de pouvoir modifier l'item source lors d'une copie.

À noter que certains de ces contrôles sont redondés dans l'interface utilisateur, plus exactement dans le panel d'éléments. Celui-ci n'autorise que les drag'n drop à priori possibles au regard des permissions sur les items et de leur type. Ces contrôles peuvent être désactivés via les variables ENABLE_PANEL_WIDGET_DND_CHECKS (elementspanelwidget.cpp:37) et ENABLE_PANEL_DND_CHECKS (elementspanel.cpp:35).

Embarquement des éléments dans les projets

Lorsqu'un élément (ou une catégorie) est ajouté à la collection embarquée d'un projet, il ne peut être référencé que par rapport à un projet donné, en tant qu'élément embarqué ; on a alors le couple de données suivant :

  • un chemin en embed://category1/category2/category3/element.elmt
  • un pointeur QETProject * pour savoir à quel projet se rapporte embed://

Ces données sont ce que retient un objet ElementsLocation pour désigner un élément sans ambiguïté. Les projets ouverts dans l'application étant numérotés et accessibles par leur numéro (on parle de “project id”), un élément peut également être désigné par une simple chaîne de caractères de la forme project<id>+embed://category1/category2/category3/element.elmt

Passage de projectx+embed:// à embed:// :

  • effectué via la méthode ElementsLocation::fromString() : elementslocation.cpp, ligne 160

Passages de embed:// à projectx+embed:// :

  • lors de l'enregistrement d'un fichier (méthode Diagram::fromXml) : diagram.cpp, ligne 440
QString type_id = e.attribute("type");
ElementsLocation element_location = ElementsLocation(type_id);
if (type_id.startsWith("embed://")) element_location.setProject(project_);

Lorsque le schéma est lu, si un élément se déclare de type embed://, alors l'ElementsLocation construit pour localiser l'élément en question se voit lié au projet auquel appartient ce schéma.

  • lors de l'appel à la méthode toString() d'un ElementsLocation : elementslocation.cpp, ligne 143
/**
	@return Une chaine de caracteres representant l'emplacement
*/
QString ElementsLocation::toString() const {
	QString result;
	if (project_) {
		int project_id = QETApp::projectId(project_);
		if (project_id != -1) {
			result += "project" + QString().setNum(project_id) + "+";
		}
	}
	result += path_;
	return(result);
}

Codes d'erreur lors du chargement d'un élément

Le chargement de l'élément … a échoué avec le code d'erreur….

  • 1 : Le fichier n'existe pas
  • 2 : Le fichier n'a pu être ouvert
  • 3 : Le fichier n'est pas un document XML
  • 4 : Le document XML n'a pas une “définition” comme racine
  • 5 : Les attributs de la définition ne sont pas présents et / ou valides
  • 6 : La définition est vide
  • 7 : L'analyse d'un élément XML décrivant une partie du dessin de l'élément a échoue
  • 8 : Aucune partie du dessin n'a pu être chargée

Pourquoi -fno-ipa-sra ?

L'option -fno-ip-sra a été ajoutée dans le qelectrotech.pro suite à la découverte de l'erreur de compilation suivante avec g++ 4.6.2 sur plateforme x86_64:

  • En -O2 et -03 :
    release/elementspanel.o: In function `ElementsPanel::slot_doubleClick(QTreeWidgetItem*, int)':
    elementspanel.cpp:(.text+0x144b): undefined reference to `TitleBlockTemplateLocation GenericPanel::valueForItem<TitleBlockTemplateLocation>(QTreeWidgetItem*) const'
    collect2: ld returned 1 exit status
  • En -Os :
    release/elementspanel.o: In function `ElementsPanel::slot_doubleClick(QTreeWidgetItem*, int)':
    elementspanel.cpp:(.text+0xf43): undefined reference to `QETProject* GenericPanel::valueForItem<QETProject*>(QTreeWidgetItem*) const'
    elementspanel.cpp:(.text+0xf5d): undefined reference to `Diagram* GenericPanel::valueForItem<Diagram*>(QTreeWidgetItem*) const'
    elementspanel.cpp:(.text+0xfd5): undefined reference to `TitleBlockTemplateLocation GenericPanel::valueForItem<TitleBlockTemplateLocation>(QTreeWidgetItem*) const'
    collect2: ld returned 1 exit status
  • En -O0 et -O1 : pas d'erreur

Pour rappel, la compilation en mode “Release” utilise -O2 tandis que celle en mode “Debug” n'incorpore pas d'optimisations spécifiques.

L'erreur elle-même se traduit ainsi : au moment de générer le binaire final, l'éditeur de liens ld constate que elementspanel.o référence une fonction / un symbole qu'il n'a pas pu retrouvé ailleurs, à savoir T GenericPanel::valueForItem<T>(QTreeWidgetItem *). Une rapide analyse des objets générés confirme cette version des faits :

  • .o fonctionnels compilés avec -O1 :
     $ objdump  -x  release/elementspanel.o | nl -b a | egrep -i 'valueforitem.*titleblocktemplatelocation'
       330  0000000000000000         *UND*  0000000000000000 _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem
       674  0000000000000e82 R_X86_64_PC32     _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc
     $ objdump  -x  release/genericpanel.o | nl -b a | egrep -i 'valueforitem.*titleblocktemplatelocation'
       254  122 .text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem 000001ae  0000000000000000  0000000000000000  00006b60  2**4
       434  0000000000000000 l    d  .text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem      0000000000000000 .text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem
       727  0000000000000000  w    F .text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem      00000000000001ae _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem
      1004  0000000000000e7a R_X86_64_PC32     _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc
      1489  00000000000039df R_X86_64_PC32     _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc
      1932  RELOCATION RECORDS FOR [.text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem]:
      2360  00000000000000cf R_X86_64_PC32     _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc
      2504  00000000000006dc R_X86_64_PC32     .text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem
  • .o compilé avec -O2 : on constate que genericpanel.o ne contient plus qu'un laconique symbole suffixé “.isra.41
    $ objdump  -x  release/elementspanel.o | nl -b a | egrep -i 'valueforitem.*titleblocktemplatelocation'
       303  0000000000000000         *UND*  0000000000000000 _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem
       676  000000000000144b R_X86_64_PC32     _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc
    $ objdump  -x  release/genericpanel.o | nl -b a | egrep -i 'valueforitem.*titleblocktemplatelocation'
       317  00000000000000f0 l     F .text  00000000000001cc _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem.isra.41

Une rapide recherche sur les optimisations activées avec ''-O2'' mais pas ''-O1'' nous conduit à l'option -fipa-sra (d'où -fno-ipa-sra) :

-fipa-sra
    Perform interprocedural scalar replacement of aggregates, removal of unused parameters and replacement of parameters passed by reference by parameters passed by value.

    Enabled at levels -O2, -O3 and -Os. 

Sans doute le compilateur a-t-il décidé que QTreeWidgetItem * (pointeur standard, 64 bits) pouvait être directement remplacé par un QTreeWidgetItem, mais ça ne semble pas avoir fait beaucoup de biens à la liste des symboles générés… Toute explication plus détaillée sera la bienvenue

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41750

note

problème de compilation seulement sur backport wheezy arch amd64 4:4.7.2, build ok en sid 4:4.8.1 avec dans le debian/rules

CFLAGS+=-O2
CXXFLAGS=-O3''
recentfiles.o release/moc_titleblockpropertieswidget.o release/moc_titleblocktemplate.o release/moc_titleblocktemplaterenderer.o release/moc_xmlelementdefinition.o release/moc_xmlelementscategory.o release/moc_xmlelementscollection.o release/moc_diagramselection.o release/moc_dialogautonum.o release/moc_dialogwaiting.o release/moc_numparteditorw.o release/moc_selectautonumw.o release/moc_arceditor.o release/moc_elementitemeditor.o release/moc_elementprimitivedecorator.o release/moc_elementscene.o release/moc_elementview.o release/moc_ellipseeditor.o release/moc_lineeditor.o release/moc_parttext.o release/moc_parttextfield.o release/moc_polygoneditor.o release/moc_qetelementeditor.o release/moc_rectangleeditor.o release/moc_styleeditor.o release/moc_terminaleditor.o release/moc_texteditor.o release/moc_textfieldeditor.o release/moc_dimensionwidget.o release/moc_helpercell.o release/moc_integrationmovetemplateshandler.o release/moc_movetemplateshandler.o release/moc_qettemplateeditor.o release/moc_
splittedhelpercell.o release/moc_templatecellwidget.o release/moc_templatedeleter.o release/moc_templatelocationchooser.o release/moc_templatelocationsaver.o release/moc_templatelogomanager.o release/moc_templatescollection.o release/moc_templateview.o release/moc_richtexteditor_p.o release/qrc_qelectrotech.o    -L/usr/lib/x86_64-linux-gnu -lQtSvg -lQtSql -lQtXml -lQtGui -lQtNetwork -lQtCore 
release/elementspanel.o: In function `ElementsPanel::slot_doubleClick(QTreeWidgetItem*, int)':
elementspanel.cpp:(.text+0x201c): undefined reference to `TitleBlockTemplateLocation GenericPanel::valueForItem<TitleBlockTemplateLocation>(QTreeWidgetItem*) const'
collect2: error: ld returned 1 exit status
make[2]: *** [qelectrotech] Error 1
Imprimer/exporter