LIMA
Libre Multilingual Analyzer — C++ API
Loading...
Searching...
No Matches
fullXmlDumper.cpp
Go to the documentation of this file.
1// Copyright 2002-2019 CEA LIST
2// SPDX-FileCopyrightText: 2022 CEA LIST <gael.de-chalendar@cea.fr>
3//
4// SPDX-License-Identifier: MIT
5
23
24#include "fullXmlDumper.h"
25// #include "linguisticProcessing/core/LinguisticProcessors/HandlerStreamBuf.h"
27
35// #include "linguisticProcessing/common/BagOfWords/bowFileHeader.h"
37//#include "linguisticProcessing/common/annotationGraph/AnnotationGraphXmlDumper.h"
45#include <fstream>
47
48using namespace std;
49//using namespace boost;
50using namespace boost::tuples;
51
52using namespace Lima::Common::AnnotationGraphs;
54using namespace Lima::Common::MediaticData;
55using namespace Lima::Common::BagOfWords;
56
58//using namespace Lima::LinguisticProcessing::Automaton;
60
61typedef boost::color_traits<boost::default_color_type> Color;
62
63namespace Lima {
64namespace LinguisticProcessing {
65namespace AnalysisDumpers {
66
67
68//***********************************************************************
69// constructors
70//***********************************************************************
72
75 m_annotXmlDumperPtr(0),
76 m_dumpFullTokens(true),
77 m_handler()
78{
79}
80
84
87 Manager* manager)
88
89{
91 LDEBUG << "fullXmlDumper init!";
94 try
95 {
96 m_dumpFullTokens = (unitConfiguration.getParamsValueAtKey("dumpTokens") == "true");
97 }
98 catch (NoSuchParam& )
99 {
100 LWARN << "dumpTokens parameter not found, using default: "
101 << (m_dumpFullTokens?"true":"false");
102 }
103 try
104 {
105 m_graph=unitConfiguration.getParamsValueAtKey("graph");
106 }
107 catch (NoSuchParam& )
108 {
109 m_graph=string("PosGraph");
110 }
111 try
112 {
113 m_handler=unitConfiguration.getParamsValueAtKey("handler");
114 }
115 catch (NoSuchParam& )
116 {
118 LERROR << "FullXmlDumper::init: Missing parameter handler in FullXmlDumper configuration";
119 throw InvalidConfiguration();
120 }
122
123}
124
126{
129
130 auto metadata = std::dynamic_pointer_cast<LinguisticMetaData>(analysis.getData("LinguisticMetaData"));
131 if (metadata == 0) {
132 LERROR << "FullXmlDumper::process: no LinguisticMetaData ! abort";
133 return MISSING_DATA;
134 }
135 LDEBUG << "handler will be: " << m_handler;
136// MediaId langid = static_cast<const Common::MediaticData::LanguageData&>(Common::MediaticData::MediaticData::single().mediaData(metadata->getMetaData("Lang"))).getMedia();
137 auto h = std::dynamic_pointer_cast<AnalysisHandlerContainer>(analysis.getData("AnalysisHandlerContainer"));
138 AbstractTextualAnalysisHandler* handler = static_cast<AbstractTextualAnalysisHandler*>(h->getHandler(m_handler));
139 if (handler==0)
140 {
141 LERROR << "FullXmlDumper::process: handler " << m_handler << " has not been given to the core client";
142 return MISSING_DATA;
143 }
144
145 auto graph = std::dynamic_pointer_cast<AnalysisGraph>(analysis.getData(m_graph));
146 if (graph==0) {
147 graph = std::make_shared<AnalysisGraph>(m_graph,m_language,true,true);
148 analysis.setData(m_graph,graph);
149 }
150
151 auto syntacticData = std::dynamic_pointer_cast<SyntacticData>(analysis.getData("SyntacticData"));
152 if (syntacticData==0)
153 {
154 syntacticData = std::make_shared<SyntacticAnalysis::SyntacticData>(graph.get(), nullptr);
155 syntacticData->setupDependencyGraph();
156 analysis.setData("SyntacticData",syntacticData);
157 }
158
159/* auto anagraph = std::dynamic_pointer_cast<AnalysisGraph>(analysis.getData(m_graph));
160 if (anagraph==0)
161 {
162 LERROR << "FullXmlDumper::process: no AnalysisGraph ! abort";
163 return MISSING_DATA;
164 }*/
165
166
167 // Are sentences bounds right?
168 auto sb = std::dynamic_pointer_cast<SegmentationData>(analysis.getData("SentenceBoundaries"));
169 if (sb==0)
170 {
171 LDEBUG << "FullXmlDumper: SentenceBounds not found "<< analysis.getData("SentenceBoundaries").get();
172 sb = std::make_shared<SegmentationData>(m_graph);
173 analysis.setData("SentenceBoundaries",sb);
174 }
175 auto annotationData = std::dynamic_pointer_cast< AnnotationData >(analysis.getData("AnnotationData"));
176 if (annotationData==0)
177 {
178 annotationData = std::make_shared<AnnotationData>();
179 if (std::dynamic_pointer_cast<AnalysisGraph>(analysis.getData("AnalysisGraph")) != 0)
180 {
181 std::dynamic_pointer_cast<AnalysisGraph>(analysis.getData("AnalysisGraph"))->populateAnnotationGraph(annotationData.get(), "AnalysisGraph");
182 }
183 analysis.setData("AnnotationData",annotationData);
184 }
185
186 handler->startAnalysis();
187 HandlerStreamBuf hsb(handler);
188 std::ostream outputStream(&hsb);
189 std::set< std::pair<size_t, size_t> > alreadyDumped;
190
191 LDEBUG << "FullXmlDumper::process before printing heading";
192
193 outputStream << "<?xml version='1.0' encoding='UTF-8'?>" << std::endl;
194 outputStream << "<!DOCTYPE lima_analysis_dump SYSTEM \"lima-xml-output.dtd\">" << std::endl;
195 outputStream << "<lima_analysis_dump>" << std::endl;
196
197
198
199 // ??OME2 SegmentationData::iterator sbItr=sb->begin();
200 std::vector<Segment>::iterator sbItr=(sb->getSegments()).begin();
201
202 auto anagraph = std::dynamic_pointer_cast<AnalysisGraph>(analysis.getData("AnalysisGraph"));
203 if (anagraph != 0)
204 {
205 LDEBUG << "FullXmlDumper:: inside if anagraph: ";
206 std::vector< bool > alreadyDumpedTokens;
207 std::map< LinguisticAnalysisStructure::Token*, uint64_t > fullTokens;
208
210 uint64_t id = 0;
211 alreadyDumpedTokens.resize(num_vertices(*anagraph->getGraph()));
212 LDEBUG << "FullXmlDumper: begin of anagraph for"<< id;
213 for (boost::tie(i, i_end) = vertices(*anagraph->getGraph()); i != i_end; ++i)
214 {
215 alreadyDumpedTokens[id] = false;
216 fullTokens[get(vertex_token, *anagraph->getGraph(), *i)] = id;
217 id++;
218 LDEBUG << " a"<< id;
219 }
220 LDEBUG << "FullXmlDumper: end of anagraph for"<< id;
221 dumpLimaData(outputStream,
222 anagraph->firstVertex(),
223 anagraph->lastVertex(),
224 anagraph.get(),
225 syntacticData.get(),
226 "AnalysisGraph",
227 false, alreadyDumpedTokens, fullTokens);
228 }
229 auto posgraph = std::dynamic_pointer_cast<AnalysisGraph>(analysis.getData("PosGraph"));
230 if (posgraph != 0)
231 {
232 LDEBUG << "FullXmlDumper:: inside if posgraph: ";
233 std::vector< bool > alreadyDumpedTokens;
234 std::map< LinguisticAnalysisStructure::Token*, uint64_t > fullTokens;
236 uint64_t id = 0;
237 alreadyDumpedTokens.resize(num_vertices(*posgraph->getGraph()));
238 LDEBUG << "FullXmlDumper: begin of posgraph for"<< id;
239 for (boost::tie(i, i_end) = vertices(*posgraph->getGraph()); i != i_end; ++i)
240 {
241 alreadyDumpedTokens[id] = false;
242 fullTokens[get(vertex_token, *posgraph->getGraph(), *i)] = id;
243 id++;
244 LDEBUG << " p"<< id;
245 }
246 // ??OME2 LDEBUG << "FullXmlDumper: end of posgraph for: sbItr "<< sbItr->getLastVertex() << " sb-end() " << sb->end()->getLastVertex();
247 LDEBUG << "FullXmlDumper: end of posgraph for: sbItr "<< sbItr->getLastVertex() << " sb-end() " << (sb->getSegments()).end()->getLastVertex();
248 outputStream << "<PosGraph>" << std::endl;
249 // ??OME2 while (sbItr!=sb->end())
250 while (sbItr!=(sb->getSegments()).end())
251 {
252
253 LDEBUG << "FullXmlDumper: inside posgraph while ";
254 LinguisticGraphVertex sentenceBegin=sbItr->getFirstVertex();
255 LinguisticGraphVertex sentenceEnd=sbItr->getLastVertex();
256 dumpLimaData(outputStream,
257 sentenceBegin,
258 sentenceEnd,
259 posgraph.get(),
260 syntacticData.get(),
261 "PosGraph",
262 true, alreadyDumpedTokens, fullTokens);
263
264 sbItr++;
265
266 // compoundsItr++;
267 }
268
269 outputStream << " <DetachedVertices>" << std::endl;
270 // dump non non-connex nodes
271 LDEBUG << "FullXmlDumper:: dump non-connex nodes and related edges: ";
272 id = 0;
273 for (boost::tie(i, i_end) = vertices(*posgraph->getGraph()); i != i_end; ++i)
274 {
275 LDEBUG << " adding non-connex vertex "<< id;
276 outputVertex(*i,
277 *posgraph->getGraph(),
278 syntacticData.get(),
279 outputStream,
280 fullTokens,
281 alreadyDumpedTokens,
282 "PosGraph");
283 id++;
284 }
285 outputStream << " </DetachedVertices>" << std::endl;
286
287 outputStream << "</PosGraph>" << std::endl;
288
289 }
290
291
292
293 // dump annotation graph
294 m_annotXmlDumperPtr->dump( analysis );
295
296 // annotXmlDumper.dump(outputStream, &(annotationData->getGraph()), *annotationData);
297
298 outputStream << "</lima_analysis_dump>" << std::endl;
299 handler->endAnalysis();
300
301 TimeUtils::logElapsedTime("FullXmlDumper");
302 return SUCCESS_ID;
303}
304
305
306//***********************************************************************
307// main function for outputing the graph
308//***********************************************************************
309void FullXmlDumper::dumpLimaData(std::ostream& os,
310 const LinguisticGraphVertex begin,
311 const LinguisticGraphVertex end,
312 const AnalysisGraph* anagraph,
313 const SyntacticData* syntacticData,
314 const std::string& graphId,
315 bool bySentence,
316 std::vector< bool >& alreadyDumpedTokens,
317 std::map< LinguisticAnalysisStructure::Token*, uint64_t >& fullTokens) const
318{
319
321
322 LDEBUG << "FullXmlDumper::dumpLimaData parameters: ";
323 LDEBUG << "begin = "<< begin;
324 LDEBUG << "end = " << end ;
325 LDEBUG << "anagraph fist vertex= " << anagraph->firstVertex() ;
326 LDEBUG << "anagraph last vertex= " << anagraph->lastVertex() ;
327 LDEBUG << "graphId= " << graphId ;
328 LDEBUG << "bySentence= " << bySentence ;
329 // just in case we want to check alreadt dumped tokens' array
330 for (uint64_t i=0; i<alreadyDumpedTokens.size(); i++) {
331 if (alreadyDumpedTokens[i]) {LDEBUG << "already_dumped_tokens[" << i << "]=" << alreadyDumpedTokens[i];}
332 }
333
334 LinguisticGraph* graph = const_cast< LinguisticGraph* >(anagraph->getGraph());
335 // go through the graph, add BoWTokens that are not in complex terms
336 LDEBUG << "after LinguisticGraph" ;
337 DumpGraphVisitor vis(*this, os, end, syntacticData,
338 fullTokens, alreadyDumpedTokens,
339 m_language, graphId);
340 LDEBUG << "after DumpGraphVisitor" ;
341 if (bySentence)
342 {
343 os << " <sentence>" << std::endl;
344 }
345 else
346 {
347 os << "<"<<graphId<<">" << std::endl;
348 }
349 try
350 {
351 //breadth_first_search(*graph, begin, visitor(vis));
352 // I dont know why the direct call to breadth_first_search does
353 // not work (bug when trying to go between vertices 0 and 1; because
354 // of the 0->1 edge) :
355 // initializing the colors and calling breadth_first_visit
356 // works (?)
357 LDEBUG << "inside dumpLimaData's try" ;
359 for (boost::tie(i, i_end) = vertices(*graph); i != i_end; ++i)
360 {
361 put(boost::vertex_color, *graph, *i, Color::white());
362 }
363
364 boost::breadth_first_visit(*graph, begin, boost::visitor(vis));
365 LDEBUG << "breadth_first_visit arguments: ";
366// boost::depth_first_search(*graph, boost::visitor(vis));
367 }
369 { //do nothing: normal ending
370 }
371 if (bySentence)
372 {
373 LDEBUG << "BY SENTENCE ";
374 os << " </sentence>" << std::endl;
375 }
376 else
377 {
378 os << "</"<<graphId<<">" << std::endl;
379 }
380}
381
382//***********************************************************************
383// output functions
384//***********************************************************************
385
386
387LimaString FullXmlDumper::getPosition(const uint64_t position) const
388{
389 std::ostringstream pos;
390 pos << position;
392}
393
395 const LinguisticGraph& graph,
396 const SyntacticData* syntacticData,
397 std::ostream& xmlStream,
398 std::map< LinguisticAnalysisStructure::Token*, uint64_t >& fullTokens,
399 std::vector< bool >& alreadyDumpedTokens,
400 const std::string& graphId) const
401{
403 Token* token = get(vertex_token, graph, v);
404 uint64_t tokenId = (*(fullTokens.find(token))).second;
405 bool alreadyDumped = alreadyDumpedTokens[tokenId];
406
407// without this condition, there's duplicate vertex in the XML output!!!
408 if (!alreadyDumped)
409 {
410 if (v == syntacticData->iterator()->firstVertex() ||
411 v == syntacticData->iterator()->lastVertex())
412 {
413 xmlStream << " <vertex id=\"_" << v << "\" />" << std::endl;
414 return;
415 }
416 if (token == 0)
417 {
419 LWARN << "No token (vertex_token) for vertex " << v;
420 xmlStream << " <vertex id=\"_" << v << "\" />" << std::endl;
421 return;
422 }
423
424 xmlStream << " <vertex id=\"_" << v << "\"";
425// debugging to take out JGF
426// DUMPERLOGINIT;
427 const VertexChainIdProp& chains = get(vertex_chain_id, graph,v);
428 if (chains.size() > 0)
429 {
430 xmlStream << " chains=\"";
431 VertexChainIdProp::const_iterator itChains, itChains_end;
432 itChains = chains.begin(); itChains_end = chains.end();
433 xmlStream << (*itChains); itChains++;
434 for (; itChains != itChains_end; itChains++)
435 {
436 xmlStream << "," << (*itChains);
437 }
438 xmlStream << "\"";
439 }
440 xmlStream << " >" << std::endl;
441
442 if (graphId != "AnalysisGraph")
443 {
444 const DependencyGraph* depGraph = syntacticData->dependencyGraph();
445 DependencyGraphVertex depV = syntacticData->depVertexForTokenVertex(v);
446 if (out_degree(depV, *depGraph) > 0)
447 {
449 xmlStream << " <deps>" << std::endl;
450 DependencyGraphOutEdgeIt depIt, depIt_end;
451 boost::tie(depIt, depIt_end) = out_edges(depV, *depGraph);
452 for (; depIt != depIt_end; depIt++)
453 {
454 DependencyGraphVertex depTargV = target(*depIt, *depGraph);
455 LinguisticGraphVertex targV = syntacticData-> tokenVertexForDepVertex(depTargV);
456 CEdgeDepRelTypePropertyMap relTypeMap = get(edge_deprel_type, *depGraph);
457 // This line changed after MODEX
458 std::string relationName = static_cast<const Common::MediaticData::LanguageData&>(Common::MediaticData::MediaticData::single().mediaData(m_language)).getSyntacticRelationName(relTypeMap[*depIt]);
459 LDEBUG << "dep " << v << " -> " << targV << " ( " << relationName << " )";
460// CEdgeDepChainIdPropertyMap chainsMap = get(edge_depchain_id, *depGraph);
461 xmlStream << " <dep v=\"_" << targV;
462// xmlStream << "\" c=\"" << chainsMap[*depIt];
463 xmlStream << "\" t=\"" << relationName << "\" />" << std::endl;
464 }
465 xmlStream << " </deps>" << std::endl;
466 }
467 }
468
469
470 MorphoSyntacticData* data = get(vertex_data, graph, v);
471 if (data == 0)
472 {
474 LWARN << "No morphosyntactic (vertex_data) data for vertex " << v;
475 }
476 else
477 {
478 data->outputXml(xmlStream, *m_propertyCodeManager,sp);
479 }
480 if (m_dumpFullTokens && !alreadyDumped)
481 {
482 token->outputXml(xmlStream, *m_propertyCodeManager,sp);
483 }
484 else
485 {
486 xmlStream << " <ref>" << tokenId << "</ref>" << std::endl;
487 }
488 alreadyDumpedTokens[tokenId] = true;
489 xmlStream << " </vertex>" << std::endl;
490 }
491}
492
494 const LinguisticGraph& graph,
495 std::ostream& xmlStream) const
496{
497 xmlStream << " <edge src=\"" << source(e, graph)
498 << "\" targ=\"" << target(e, graph) << "\" />" << std::endl;
499}
500
501
502//***********************************************************************
503// visitor definition
504//***********************************************************************
505// examine_vertex to test if we are at end of search
507 const LinguisticGraph& g)
508{
509// DUMPERLOGINIT;
510// LDEBUG << "DumpGraphVisitor: examine_vertex " << v;
511
512 if (v == m_lastVertex)
513 {
514 bool finished = true;
515 LinguisticGraphInEdgeIt it, it_end;
516 boost::tie(it, it_end) = in_edges(v, g);
517 while (finished && (it != it_end))
518 {
519 if (get(boost::vertex_color, g,source(*it, g)) != Color::black())
520 {
521 finished = false;
522 }
523 it++;
524 }
525 if (finished)
526 {
527// LDEBUG << "DumpGraphVisitor: finished";
528 throw EndOfSearch();
529 }
530 }
531}
532
534 const LinguisticGraph& g)
535{
536// DUMPERLOGINIT;
537// LDEBUG << "DumpGraphVisitor: discover_edge " << e;
538
539 m_dumper.outputEdge(e, g, m_os);
540}
541
543 const LinguisticGraph& graph)
544{
545 m_dumper.outputVertex(v, graph, m_syntacticData,
546 m_os, m_fullTokens, m_alreadyDumpedFullTokens, m_graphId);
547}
548
549} // end namespace AnalysisDumpers
550} // end namespace LinguisticProcessings
551} // end namespace Lima
This file is the main header file for the data related to annotation graphs.
A graph that stores the relations of syntactic dependency between the elements of a DependencyGraph.
DependencyGraph::out_edge_iterator DependencyGraphOutEdgeIt
DependencyGraph::vertex_descriptor DependencyGraphVertex
boost::property_map< DependencyGraph, edge_deprel_type_t >::const_type CEdgeDepRelTypePropertyMap
boost::adjacency_list< boost::vecS, boost::vecS, boost::bidirectionalS, DepVertexProperties, DepEdgeProperties > DependencyGraph
The dependency graph class.
@ edge_deprel_type
#define LWARN
Definition LimaCommon.h:160
#define LDEBUG
Definition LimaCommon.h:157
#define LERROR
Definition LimaCommon.h:161
A graph structure for linguistic analysis.
LinguisticGraph::in_edge_iterator LinguisticGraphInEdgeIt
std::set< Lima::LinguisticProcessing::LinguisticAnalysisStructure::ChainIdStruct > VertexChainIdProp
Property to identify the chains in the graph.
boost::graph_traits< LinguisticGraph >::edge_descriptor LinguisticGraphEdge
typedefs to simplify the access to various graphs elements
LinguisticGraph::vertex_iterator LinguisticGraphVertexIt
@ vertex_token
LinguisticGraph::vertex_descriptor LinguisticGraphVertex
@ vertex_data
boost::adjacency_list< boost::vecS, boost::vecS, boost::bidirectionalS, LinguisticVertexProperties > LinguisticGraph
Property to identify the chains in the graph.
@ vertex_chain_id
#define DUMPERLOGINIT
Defines a Factory to create Object of type Base.
virtual void startAnalysis()=0
function called by the LIMA analyzer on start of a new document
virtual void endAnalysis()=0
function called by the LIMA analyzer on the end of a text part that is to be analyzed
Holds all data that pass through the ProcessUnits Analysis data are shared pointers,...
std::shared_ptr< AnalysisData > getData(const QString &id)
return AnalysisData by id
void setData(const QString &id, std::shared_ptr< AnalysisData > data)
set an analysisData with the given id.
Holds linguistic data for one language.
const FsaStringsPool & stringsPool(MediaId med) const
const MediaData & mediaData(MediaId media) const
return a message when a 'param' was not found
Manage initialization of InitializableObjects using configuration module and parameters.
const InitializationParameters & getInitializationParameters() const
get Initialization Parameters
Use this exception to signal an error in one of the configuration files.
Definition LimaCommon.h:345
LimaStatusCode dump(AnalysisContent &analysis, const std::string &prologue="") const
a visitor for going through the graph between two points and storing a BoWToken for every vertex that...
void discover_vertex(LinguisticGraphVertex v, const LinguisticGraph &g)
void examine_vertex(LinguisticGraphVertex v, const LinguisticGraph &g)
void examine_edge(LinguisticGraphEdge e, const LinguisticGraph &g)
LimaString getPosition(const uint64_t position) const
void dumpLimaData(std::ostream &os, const LinguisticGraphVertex begin, const LinguisticGraphVertex end, const LinguisticAnalysisStructure::AnalysisGraph *anagraph, const SyntacticAnalysis::SyntacticData *syntacticData, const std::string &graphId, bool bySentence, std::vector< bool > &alreadyDumpedTokens, std::map< LinguisticAnalysisStructure::Token *, uint64_t > &fullTokens) const
void outputEdge(const LinguisticGraphEdge e, const LinguisticGraph &graph, std::ostream &xmlStream) const
const Common::PropertyCode::PropertyCodeManager * m_propertyCodeManager
void init(Common::XMLConfigurationFiles::GroupConfigurationStructure &unitConfiguration, Manager *manager) override
initialize with parameters from configuration file.
LimaStatusCode process(AnalysisContent &analysis) const override
Process on data in analysisContent.
void outputVertex(const LinguisticGraphVertex v, const LinguisticGraph &graph, const SyntacticAnalysis::SyntacticData *syntacticData, std::ostream &xmlStream, std::map< LinguisticAnalysisStructure::Token *, uint64_t > &fullTokens, std::vector< bool > &alreadyDumpedFullTokens, const std::string &graphId) const
An AnalysisData containing a LinguisticGraph with a language and an id.
const LinguisticGraphVertex & lastVertex(void) const
Returns the last vertex of the graph.
const LinguisticGraph * getGraph(void) const
Returns the underlying graph structure.
const LinguisticGraphVertex & firstVertex(void) const
Returns the first vertex of the graph.
void outputXml(std::ostream &xmlStream, const Common::PropertyCode::PropertyCodeManager &pcm, const FsaStringsPool &sp) const
virtual void outputXml(std::ostream &xmlStream, const Common::PropertyCode::PropertyCodeManager &pcm, const FsaStringsPool &sp) const
Definition Token.cpp:60
This class points to a graph, its dependency graph and the structure that holds the maping between th...
DependencyGraphVertex depVertexForTokenVertex(const LinguisticGraphVertex &v) const
LinguisticAnalysisStructure::AnalysisGraph * iterator()
static const MediaticData & single()
const singleton accessor
Definition Singleton.h:51
static MediaticData & changeable()
singleton accessor
Definition Singleton.h:71
static void logElapsedTime(const std::string &mess, const std::string &taskCategory=std::string(""))
log the number of microseconds since last UpdateCurrentTime
static void updateCurrentTime(const std::string &taskCategory=std::string(""))
store current time for new elapsed time computation
boost::color_traits< boost::default_color_type > Color
dump the full content of the analysis graph in XML format
#define FULLXMLDUMPER_CLASSID
LimaString utf8stdstring2limastring(const std::string &src)
SimpleFactory< MediaProcessUnit, FullXmlDumper > fullXmlDumperFactory(FULLXMLDUMPER_CLASSID)
NAUTITIA.
LimaStatusCode
Definition LimaCommon.h:236
@ SUCCESS_ID
Definition LimaCommon.h:237
@ MISSING_DATA
Definition LimaCommon.h:243
QString LimaString
Definition LimaString.h:33
STL namespace.
launch exception related to the configuration file parsing