Developer documentation | Axl-2.5.1

axlAbstractDataCompositeReader.cpp
Go to the documentation of this file.
1 /* axlAbstractDataCompositeReader.cpp ---
2  *
3  * Author: Meriadeg Perrinel
4  * Copyright (C) 2008-2011 - Meriadeg Perrinel, Inria.
5  * Created: Wed Sep 21 11:36:52 2011 (+0200)
6  * Version: $Id$
7  * Last-Updated: Wed Sep 21 12:11:29 2011 (+0200)
8  * By: Meriadeg Perrinel
9  * Update #: 88
10  */
11 
12 /* Commentary:
13  *
14  */
15 
16 /* Change log:
17  *
18  */
19 
21 
23 #include <axlCore/axlMesh.h>
24 #include <axlCore/axlMeshReader.h>
25 
26 #include <dtkCoreSupport/dtkAbstractData.h>
27 #include <dtkCoreSupport/dtkAbstractDataFactory.h>
28 
29 // /////////////////////////////////////////////////////////////////
30 // axlAbstractDataCompositeReader
31 // /////////////////////////////////////////////////////////////////
32 
34 {
35  this->setObjectName(this->description());
36 }
37 
39 {
40 
41 }
42 
44 {
45  return "axlAbstractDataCompositeReader";
46 }
47 
49 {
50  return "axlAbstractDataCompositeReader";
51 }
52 
54 {
55  return QStringList() << "axlAbstractDataComposite";
56 }
57 
59 {
60  return dtkAbstractDataFactory::instance()->registerDataReaderType("axlAbstractDataCompositeReader", QStringList(), createaxlAbstractDataCompositeReader);
61 }
62 
63 bool axlAbstractDataCompositeReader::accept(const QDomNode& node)
64 {
65  QDomElement element = node.toElement();
66 
67  if(element.tagName() != "composite")
68  return false;
69 
70 
71  return true;
72 }
73 
74 bool axlAbstractDataCompositeReader::reject(const QDomNode& node)
75 {
76  return !this->accept(node);
77 }
78 
80 {
81  QDomElement element = node.toElement();
82 
84 
85  // Get name
86  QString name = element.attribute("name");
87  if (!name.isEmpty()) {
88  composite->setObjectName(name);
89  }
90 
91  QDomNode n = element.firstChild();
92 
93  while (!n.isNull()) {
94 
95  if (n.isElement()) {
96 
97  QDomElement e = n.toElement();
98 
99  bool founded = false;
100 
101  // test for all reader registered in the factory
102  foreach(QString reader, dtkAbstractDataFactory::instance()->readers()) {
103 
104 
105  axlAbstractDataReader *axl_reader = qobject_cast<axlAbstractDataReader *>(dtkAbstractDataFactory::instance()->reader(reader));
106  dtkAbstractData *data = this->dataByReader(axl_reader, e);
107 
108  if(data) {
109  data->setParent(composite);
110  composite->add(data);
111  founded = true;
112  }
113 
114  }
115 
116  // test for particular case
117  if(!founded)
118  {
119  axlMeshReader *axl_reader = new axlMeshReader;
120  dtkAbstractData *data = this->dataByReader(axl_reader, e);
121 
122  if(data) {
123  data->setParent(composite);
124  composite->add(data);
125  founded = true;
126  }
127 
128  }
129 
130  if(!founded)
131  {
133  dtkAbstractData *data = this->dataByReader(axl_reader, node);
134 
135  if(data) {
136  data->setParent(composite);
137  composite->add(data);
138  founded = true;
139  }
140 
141  }
142 
143  }
144  n = n.nextSibling();
145  }
146 
147  return composite;
148 }
149 
150 axlAbstractData *axlAbstractDataCompositeReader::dataByReader(axlAbstractDataReader *axl_reader, const QDomNode& node)
151 {
152  if(!axl_reader)
153  return NULL;
154 
155  if(!axl_reader->accept(node))
156  return NULL;
157 
158  axl_reader->dtkAbstractDataReader::read(this->file());
159 
160  if(axlAbstractData *data = axl_reader->read(node))
161  return data;
162 
163 
164  return NULL;
165 }
166 
167 dtkAbstractDataReader *createaxlAbstractDataCompositeReader(void)
168 {
170 }
axlAbstractData * read(const QDomNode &node)
void add(dtkAbstractData *data)
virtual axlAbstractData * read(const QDomNode &node)=0
dtkAbstractDataReader * createaxlAbstractDataCompositeReader(void)
virtual bool accept(const QDomNode &node)=0
Class axlAbstractData defines an API for all type of axel data.