34#include <QReadWriteLock>
35#include <QRegularExpression>
50using namespace XMLConfigurationFiles;
70 const std::deque< std::string >& meds);
97 MediaId
getMediaId(
const std::string& stringId);
108 QReadWriteLock m_lock;
109 bool m_alreadyInitialized =
false;
110 static const LimaString s_entityTypeNameSeparator;
112 std::deque< std::string > m_medias;
113 std::map< std::string, MediaId > m_mediasIds;
114 std::map< MediaId, std::string > m_mediasSymbol;
115 std::map< MediaId, QString > m_mediaDefinitionFiles;
116 std::map< MediaId, std::shared_ptr<MediaData> > m_mediasData;
119 std::map< std::string, std::string > m_options;
125 std::vector< std::shared_ptr<EntityTypeMap> > m_entityTypes;
128 std::map< std::string, uint8_t > m_relTypes;
129 std::map< uint8_t, std::string > m_relTypesNum;
131 static std::string s_undefinedRelation;
134 std::map<MediaId, std::shared_ptr<FsaStringsPool> > m_stringsPool;
135 bool m_releaseStringsPool;
137 std::string m_resourcesPath;
138 std::string m_configPath;
139 std::string m_configFile;
141 static const std::string s_nocateg;
143 std::map< std::string, ConceptType > m_conceptTypes;
144 std::map< ConceptType, std::string > m_conceptNames;
150std::string MediaticDataPrivate::s_undefinedRelation(
"Unknown");
151const std::string MediaticDataPrivate::s_nocateg=
SYMBOLIC_NONE;
153MediaticDataPrivate::MediaticDataPrivate() :
154 m_lock(QReadWriteLock::Recursive),
155 m_releaseStringsPool(false)
159 m_entityTypes.push_back( std::shared_ptr<EntityTypeMap>(
nullptr));
175 return m_d->m_mediasIds;
190 return m_d->m_medias;
199 return m_d->m_releaseStringsPool;
204 return m_d->m_resourcesPath;
209 return m_d->m_configPath;
213 const std::string& resourcesPath,
214 const std::string& configPath,
215 const std::string& configFile,
216 const std::deque< std::string >& meds,
217 const std::map< std::string, std::string >& opts)
219 QWriteLocker lock(&m_d->m_lock);
222 LINFO <<
"MediaticData::init " << resourcesPath <<
" "
223 << configPath <<
" " << configFile <<
"; already initialized?:" << m_d->m_alreadyInitialized;
224 if (m_d->m_alreadyInitialized)
227 LERROR <<
"MediaticData::init already initialized. Updating";
231 m_d->m_alreadyInitialized =
true;
232 if (m_d->m_resourcesPath.empty())
233 m_d->m_resourcesPath = resourcesPath;
236 if (m_d->m_configPath.empty())
237 m_d->m_configPath = configPath;
240 if (m_d->m_configFile.empty())
241 m_d->m_configFile = configFile;
245 for (
auto [k, v]: opts)
247 m_d->m_options[k] = v;
251 QStringList configPaths = QString::fromUtf8(configPath.c_str()).split(
LIMA_PATH_SEPARATOR);
252 QStringList configFiles = QString::fromUtf8(configFile.c_str()).split(
LIMA_PATH_SEPARATOR);
253 bool configurationFileFound =
false;
254 for(QString confPath: configPaths)
256 for(QString confFile: configFiles)
258 if (QFileInfo::exists(confPath + QDir::separator() + confFile))
260 LDEBUG <<
"MediaticData::init parse configuration file: "
261 << (confPath + QDir::separator() + confFile);
262 configurationFileFound =
true;
265 LDEBUG <<
"MediaticData::init initialize global parameters";
277 LINFO <<
"!!! MediaticData::init for ";
278 for (
auto it = meds.cbegin(); it != meds.cend(); it++)
279 LINFO <<
" " << (*it).c_str();
283 if (configurationFileFound)
break;
285 if (configurationFileFound)
break;
287 if (!configurationFileFound)
290 LERROR <<
"No configuration file has been found with" << configPath
291 <<
"and" << configFile;
299 QRegularExpression re(
"^(ud-)?...?$");
300 QRegularExpressionMatch match = re.match(media.c_str());
301 return match.hasMatch();
309 LERROR <<
"MediaId for string '" << media <<
"' is invalid. It will not be initialized ! ";
315 std::deque< std::string > meds({media});
316 LINFO <<
"MediaticData::initMedia" << media <<
"parse configuration file: " << m_configPath
317 <<
"/" << m_configFile;
326 QWriteLocker lock(&m_d->m_lock);
332 auto it = m_mediasSymbol.find(idNum);
333 if (it == m_mediasSymbol.end())
350 if (stringId.empty())
353 LERROR <<
"MediaticData::getMediaId invalid empty argument stringId at" << __FILE__ <<
", line" << __LINE__;
355 std::string(
"MediaticData::getMediaId invalid empty argument stringId") );
357 auto it = m_mediasIds.find(stringId);
358 if (it == m_mediasIds.end())
362 LINFO <<
"MediaticData::getMediaId On-demand initialization of media" << stringId.c_str();
364 it = m_mediasIds.find(stringId);
365 if (it == m_mediasIds.end())
372 LERROR <<
"MediaId for string " << stringId.c_str()
373 <<
" is still not initialized after on-demand initialization ! ";
382 QReadLocker lock(&m_d->m_lock);
388 auto it = m_mediasData.find(media);
389 if (it == m_mediasData.end())
392 LERROR <<
"Media data for id " << (int)media <<
" is not initialized ! ";
395 return *(it->second);
400 QReadLocker lock(&m_d->m_lock);
406 QReadLocker lock(&m_d->m_lock);
413 QReadLocker lock(&m_d->m_lock);
414 auto it = m_d->m_mediasData.find(
media);
415 if (it == m_d->m_mediasData.end())
418 LERROR <<
"Media data for id " << (int)
media <<
" is not initialized ! ";
421 return *(it->second);
425 const std::deque< std::string >& meds)
429 LDEBUG <<
"MediaticDataPrivate::initMedias" << meds.size();
432 std::set< std::string > qmeds;
433 for (
const auto& med: m_medias)
440 for (
auto med_str: meds)
452 LDEBUG <<
"There is no language '" << med_str.c_str() <<
"' in LIMA. Trying 'ud'.";
454 if (med_str.find(
"ud-") != 0)
455 med_str = std::string(
"ud-") + med_str;
456 if (m_options.find(
"udlang") == m_options.end())
457 m_options[
"udlang"] = med_str;
459 m_options[
"udlang"] = m_options[
"udlang"] +
"," + med_str;
464 LDEBUG <<
"media '" << med_str.c_str() <<
"' has id " << id;
465 if (m_mediasData.find(
id) != m_mediasData.end())
468 LINFO <<
"Media" << med_str <<
"already initialized. Skipping.";
473 LDEBUG << (
void*)
this <<
" initialize string pool";
479 LERROR <<
"Param common/mediasIds/" << med_str <<
"missing:" << e.
what();
483 if (qmeds.find(med_str) != qmeds.end())
486 LINFO <<
"media" << med_str.c_str() <<
"already initialized: reinit";
493 m_medias.push_back(med_str);
494 qmeds.insert(med_str);
502 m_stringsPool[id] = std::shared_ptr<FsaStringsPool>(
nullptr);
505 m_mediasIds[med_str] = id;
506 m_mediasSymbol[id] = med_str;
509 "mediaDefinitionFiles",
511 QStringList configPaths = QString::fromUtf8(m_configPath.c_str()).split(
LIMA_PATH_SEPARATOR);
512 bool mediaDefinitionFileFound =
false;
513 for(
auto confPath = configPaths.begin(); confPath != configPaths.end(); ++confPath)
515 if (QFileInfo::exists(*confPath +
"/" + deffile))
517 m_mediaDefinitionFiles[id] = (*confPath+
"/"+deffile);
519 LDEBUG <<
"media definition file for" << med_str <<
"; id" <<
id <<
"is" << m_mediaDefinitionFiles[id];
521 mediaDefinitionFileFound =
true;
525 if (!mediaDefinitionFileFound)
528 LERROR <<
"No media definition file'" << deffile <<
"' has been found for media id" <<
id
529 <<
"in config paths:" << configPaths;
531 for (
auto med = m_medias.begin(); med != m_medias.end(); med++)
536 m_mediasIds.erase(med_str);
537 m_mediasSymbol.erase(
id);
538 m_mediasData.erase(
id);
539 m_mediaDefinitionFiles.erase(
id);
547 LERROR <<
"Param common/mediaDefinitionFiles/" << med_str <<
"missing:" << e.
what();
549 for (
auto med = m_medias.begin(); med != m_medias.end(); med++)
554 m_mediasIds.erase(med_str);
555 m_mediasSymbol.erase(
id);
556 m_mediaDefinitionFiles.erase(
id);
557 m_mediasData.erase(
id);
560 std::string(
"Failed to init media ")+(med_str)+
": "+e.
what());
563 LDEBUG <<
"MediaticData::initMedias" << med_str <<
"call initMediaData" << m_mediasIds[med_str];
570 LDEBUG <<
"MediaticDataPrivate::initMedias done successfuly";
578 LDEBUG <<
"MediaticDataPrivate::initMediaData" << (int)med;
580 auto it = m_mediaDefinitionFiles.find(med);
581 if (it == m_mediaDefinitionFiles.end())
584 std::ostringstream oss;
585 oss <<
"No media definition file for med id " << (int)med;
587 const auto& media = m_mediasSymbol[med];
588 LDEBUG <<
"Cleanup: remove data added previously concerning this failed language" << (int)med << media
590 for (
auto medit = m_medias.begin(); medit != m_medias.end(); medit++)
593 m_medias.erase(medit);
595 m_mediasIds.erase(media);
596 m_mediasSymbol.erase(med);
597 m_mediasData.erase(med);
601 LDEBUG <<
"MediaticDataPrivate::initMediaData Parse MediaConfigurationFile "
607 LDEBUG <<
"MediaticDataPrivate::initMediaData Class: "
608 << parser.getModuleGroupParamValue(
"MediaData",
609 "Class",
"class").c_str();
611 std::string& param = parser.getModuleGroupParamValue(
"MediaData",
616 auto ldata = MediaData::Factory::getFactory(param)->create(
617 parser.getModuleGroupConfiguration(
"MediaData",
"Class"),0);
620 m_mediasData[med] = ldata;
621 ldata->initialize(med, m_resourcesPath, parser);
626 LERROR <<
"Empty class name for MediaData/Class/class for media" << med;
627 std::ostringstream oss;
628 oss <<
"Empty class name for MediaData/Class/class for media " << med;
630 for (
auto medit = m_medias.begin(); medit != m_medias.end(); medit++)
632 if (*medit == m_mediasSymbol[med])
633 m_medias.erase(medit);
635 m_mediasIds.erase(m_mediasSymbol[med]);
636 m_mediasSymbol.erase(med);
637 m_mediasData.erase(med);
645 QReadLocker lock(&m_d->m_lock);
646 auto it = m_d->m_relTypesNum.find(relation);
647 if (it == m_d->m_relTypesNum.end())
650 LWARN <<
"ask getRelation for undefined relation " << (int)relation;
651 return m_d->s_undefinedRelation;
653 return ( (*it).second );
659 QReadLocker lock(&m_d->m_lock);
660 auto it = m_d->m_relTypes.find(relation);
661 if (it == m_d->m_relTypes.end())
664 LWARN <<
"ask getRelation for undefined relation " << relation.c_str();
667 return ( (*it).second );
674 LDEBUG <<
"MediaticDataPrivate::initRelations";
676 m_relTypes[s_undefinedRelation] = 0;
677 m_relTypesNum[0] = s_undefinedRelation;
683 for (
auto it = rels.cbegin(); it != rels.cend(); it++)
685 uint8_t relId = atoi(it->second.c_str());
687 LDEBUG <<
"read relation " << it->first.c_str() <<
" -> " << (int)relId;
689 m_relTypes[it->first]=relId;
690 m_relTypesNum[relId]=it->first;
696 LNOTICE <<
"No group 'semanticRelations' in 'common' module of lima-common configuration file";
703 LERROR <<
"No map 'declaration' in 'semanticRelations' group of lima-common configuration file";
705 std::string(
"No map 'declaration' in 'semanticRelations' group of lima-common configuration file:")+e.
what());
713 LDEBUG <<
"MediaticDataPrivate::initConceptTypes";
720 for (
auto it = mapping.cbegin(); it != mapping.cend(); it++)
722 ConceptType type =
static_cast<ConceptType
>(atoi(it->second.c_str()));
724 LDEBUG <<
"read concept type " << it->first.c_str() <<
" -> " << type;
726 m_conceptTypes[it->first] = type;
727 m_conceptNames[type] = it->first;
733 LNOTICE <<
"No group 'SemanticData' in 'common' module of lima-common configuration file:" << e.
what();
738 LERROR <<
"No map 'conceptTypes' in 'SemanticData' group of lima-common configuration file:" << e.
what();
745 QReadLocker lock(&m_d->m_lock);
746 if (m_d->m_conceptTypes.find(typeName)==m_d->m_conceptTypes.end())
749 LERROR <<
"Concept type name " << typeName.c_str()
750 <<
" not found. Returning value for LatticeDown (should be '0').";
751 return (*(m_d->m_conceptTypes.find(
"LatticeDown"))).second;
755 return (*(m_d->m_conceptTypes.find(typeName))).second;
762 QReadLocker lock(&m_d->m_lock);
763 if (m_d->m_conceptNames.find(type) == m_d->m_conceptNames.end())
766 LERROR <<
"Concept type " << type
767 <<
" not found. Returning for 0 (should be 'LatticeDown').";
768 return (*(m_d->m_conceptNames.find(
static_cast<ConceptType
>(0)))).second;
772 return (*(m_d->m_conceptNames.find(type))).second;
781 LINFO <<
"initializes the release of strings pool on each text: ";
782 m_releaseStringsPool =
false;
788 std::istringstream releaseS(release);
789 releaseS >> std::boolalpha >> m_releaseStringsPool;
790 LINFO << int(m_releaseStringsPool);
794 LINFO <<
"ReleaseStringsPool parameter not found. Using " << m_releaseStringsPool;
807 EntityTypeId>* >& types)
810 for (
auto it = g.cbegin(); it != g.cend(); it++)
812 LDEBUG << *((*it).first) <<
"(" << (*it).first <<
")"
813 <<
"->" << (*it).second;
814 if ((*it).second < types.size())
816 const auto& t = types[(*it).second]->getAccessMap();
817 for (
auto it2 = t.cbegin() ; it2 != t.cend(); it2++)
819 LDEBUG <<
" " << *((*it2).first) <<
"(" << (*it2).first <<
")"
820 <<
"->" << (*it2).second;
826 for (uint32_t i(0); i<rg.size(); i++)
828 LDEBUG <<
"reverse " << i <<
"->" << rg[i];
831 const auto& rt = types[i]->getReverseAccessMap();
832 for (uint32_t j(0);j<rt.size(); j++)
834 LDEBUG <<
" reverse " << j <<
"->" << rt[j];
849 for (
auto it = moduleConf.begin(); it != moduleConf.end(); it++)
852 LDEBUG <<
"initEntityTypes: looking at group " << (*it).first;
855 auto groupName = QString::fromStdString((*it).first);
857 if (groupName ==
"include")
859 auto includeList = moduleConf.getListValuesAtKeyOfGroupNamed(
"includeList",
"include");
861 string moduleName(
"");
862 for (std::size_t k=0; k<includeList.size(); k++)
864 i=includeList[k].find(
"/");
867 LERROR <<
"Cannot include resources " << includeList[k] <<
": must specify file and module name";
871 for(
auto confPath : configPaths)
873 if (QFileInfo::exists(confPath +
"/" +
string(includeList[k],0,i).c_str()))
875 auto fileName= confPath +
"/" + std::string(includeList[k], 0,i).c_str();
886 LDEBUG <<
"initEntityTypes: read list as " << groupName;
889 auto& groupConf=(*it).second;
892 deque<string>& entityList = groupConf.getListsValueAtKey(
"entityList");
893 for (
const auto& ent: entityList)
895 auto entityName = QString::fromStdString(ent);
897 LDEBUG <<
"initEntityTypes: add entityType " << ent.c_str() <<
" in group " << groupName;
899 auto type =
addEntity(groupName, entityName);
901 LDEBUG <<
"initEntityTypes: type is " << type;
909 QTextStream qts(&errorString);
910 qts <<
"missing list 'entityList' in entity types configuration:" << e.
what();
920 LWARN <<
"no module 'entities' in entity types configuration:" << e.
what();
926 QTextStream qts(&errorString);
927 qts <<
"missing group in entity types configuration:" << e.
what();
935 QTextStream qts(&errorString);
936 qts <<
"missing list 'entityList' in entity types configuration:" << e.
what();
944 QWriteLocker lock(&m_d->m_lock);
950 EntityGroupId groupId= m_entityGroups.
insert(groupName);
952 if (
static_cast<std::size_t
>(groupId) >= m_entityTypes.size())
954 m_entityTypes.push_back( std::make_shared<MediaticDataPrivate::EntityTypeMap>());
961 QWriteLocker lock(&m_d->m_lock);
967 if (
static_cast<std::size_t
>(groupId)>=m_entityTypes.size())
970 LIMA_EXCEPTION(
"MediaticData::addEntity unknown entity group id " << groupId
971 <<
"adding" << entityName);
973 EntityTypeId typeId= m_entityTypes[groupId]->insert(entityName);
985 QWriteLocker lock(&m_d->m_lock);
986 return m_d->
addEntity(groupName, entityName);
996 QWriteLocker lock(&m_d->m_lock);
1003 QReadLocker lock(&m_d->m_lock);
1004 return m_d->m_entityHierarchy.
isAncestor(child,parent);
1009 QReadLocker lock(&m_d->m_lock);
1015 QReadLocker lock(&m_d->m_lock);
1016 return m_d->m_entityHierarchy.
getParent(child);
1020 std::map<EntityType,EntityType>& childList)
const
1022 QReadLocker lock(&m_d->m_lock);
1023 return m_d->m_entityHierarchy.
getChildren(parent, childList);
1028 QReadLocker lock(&m_d->m_lock);
1029 std::vector<EntityType> ancestors;
1030 const auto& accessMap = m_d->m_entityTypes[groupId]->getAccessMap();
1031 for(
auto iter = accessMap.begin(), iter_end=accessMap.end(); iter != iter_end; iter++){
1032 const LimaString entityName = *(iter->first);
1033 int i=entityName.indexOf(m_d->s_entityTypeNameSeparator);
1040 LIMA_EXCEPTION(
"MediaticData::getEntityType unknown entity" << groupId
1041 << entityName << e.
what());
1044 ancestors.push_back( entityType );
1054 QReadLocker lock(&m_d->m_lock);
1055 int i=entityName.indexOf(m_d->s_entityTypeNameSeparator);
1059 LIMA_EXCEPTION(
"MediaticData::getEntityType missing group name in entity name '" << entityName <<
"'" );
1062 LimaString name = entityName.mid(i+m_d->s_entityTypeNameSeparator.length());
1068 QString errorString;
1069 QTextStream qts(&errorString);
1070 qts << __FILE__ <<
":" << __LINE__ <<
": "
1071 <<
"MediaticData::getEntityType unknown entity " << groupName
1072 << m_d->s_entityTypeNameSeparator << name <<
" : " << e.
what() ;
1087 QReadLocker lock(&m_d->m_lock);
1093 if (
static_cast<size_t>(groupId) >= m_entityTypes.size())
1096 QString errorString;
1097 QTextStream qts(&errorString);
1098 qts <<
"MediaticData::getEntityType unknown entity group id " << groupId
1099 <<
" accessing '" << entityName <<
"'";
1104 if (! m_entityTypes[groupId]->hasValue(entityName))
1108 QString errorString;
1109 QTextStream qts(&errorString);
1110 qts <<
"MediaticData::getEntityType no entity type '" << entityName
1111 <<
"' in group id "<<groupId;
1116 EntityTypeId typeId;
1118 typeId = m_entityTypes[groupId]->get(entityName);
1121 LIMA_EXCEPTION(
"Exception while getting entity " << groupId <<
"."
1122 << entityName <<
": " << e.
what())
1129 QReadLocker lock(&m_d->m_lock);
1137 return m_entityGroups.
get(groupName);
1142 QString errorString;
1143 QTextStream qts(&errorString);
1144 qts <<
"MediaticData::getEntityGroupId Unknown entity group '" << groupName <<
"'; exception: "<< e.
what();
1145 LWARN << errorString;
1152 QReadLocker lock(&m_d->m_lock);
1158 QReadLocker lock(&m_d->m_lock);
1161 LDEBUG <<
"MediaticData::getEntityName(" << type <<
")";
1163 if (type.
getGroupId()==
static_cast<EntityGroupId
>(0))
1166 QString errorString;
1167 QTextStream qts(&errorString);
1168 qts <<
"MediaticData::getEntityName invalid entity group id "
1169 << type.
getGroupId() <<
" in entity " << type;
1173 if (
static_cast<size_t>(type.
getGroupId())>=m_d->m_entityTypes.size())
1177 << type.
getGroupId()<<
" > m_entityTypes.size()="
1178 << m_d->m_entityTypes.size() <<
" for entity type " << type );
1184 m_d->m_entityGroups.
get(
1186 + m_d->s_entityTypeNameSeparator
1192 QString errorString;
1193 QTextStream qts(&errorString);
1194 qts <<
"MediaticData::getEntityName Cannot find name of entity type " << type <<
"'; exception: "<< e.
what();
1195 LWARN << errorString;
1202 QReadLocker lock(&m_d->m_lock);
1205 return m_d->m_entityGroups.
get(
id);
1210 QString errorString;
1211 QTextStream qts(&errorString);
1212 qts <<
"MediaticData::getEntityGroupName Cannot find name of entity group "
1213 <<
id <<
"; exception: " << e.
what();
1214 LWARN << errorString;
1221 QReadLocker lock(&m_d->m_lock);
1226 const auto& groups = m_d->m_entityGroups.
getAccessMap();
1228 for (
auto it = groups.cbegin(); it != groups.cend(); it++)
1231 LDEBUG <<
"writeEntityTypes: write group id " << (*it).second;
1235 LDEBUG <<
"writeEntityTypes: write group name " << *((*it).first);
1239 LDEBUG <<
"writeEntityTypes: after group name file at " << file.tellp();
1242 const auto&
entities = m_d->m_entityTypes[(*it).second]->getAccessMap();
1244 LDEBUG <<
"writeEntityTypes: write nb entities: " <<
entities.size();
1248 LDEBUG <<
"writeEntityTypes: after write nb entities, file at " << file.tellp();
1253 LDEBUG <<
"writeEntityTypes: write entity id " << (*it2).second;
1257 LDEBUG <<
"writeEntityTypes: after write entity id file at " << file.tellp();
1258 LDEBUG <<
"writeEntityTypes: write entity name " << *((*it2).first);
1262 LDEBUG <<
"writeEntityTypes: after write entity name file at " << file.tellp();
1274 std::map<EntityGroupId,EntityGroupId>& entityGroupIdMapping,
1275 std::map<EntityType,EntityType>& entityTypeMapping)
1277 QWriteLocker lock(&m_d->m_lock);
1280 LDEBUG <<
"MediaticData::readEntityTypes from binary file with its mapping";
1284 for (uint64_t i(0); i<size; i++)
1288 LDEBUG <<
"readEntityTypes: read group id " << groupId;
1293 LDEBUG <<
"readEntityTypes: read group name " << groupName;
1296 entityGroupIdMapping[groupId]=newGroupId;
1298 LDEBUG <<
"readEntityTypes: added group id mapping " << groupId
1299 <<
"->" << newGroupId;
1304 for (uint64_t j(0);j<nbEntities; j++)
1308 LDEBUG <<
"readEntityTypes: read entity id " << typeId;
1313 LDEBUG <<
"readEntityTypes: read entity name " << entityName;
1321 LDEBUG <<
"readEntityTypes: added entity type mapping " << oldTypeId <<
"->" << newTypeId;
1322 LDEBUG <<
"before insert " << entityTypeMapping.size();
1324 entityTypeMapping.insert(make_pair(oldTypeId,newTypeId));
1326 LDEBUG <<
"after insert " << entityTypeMapping.size();
1328 LDEBUG <<
"readEntityTypes: type mapping is";
1329 std::ostringstream oss;
1330 for (
auto it = entityTypeMapping.begin();
1331 it != entityTypeMapping.end(); it++)
1333 oss << (*it).first <<
" -> " << (*it).second << std::endl;
1349 QReadLocker lock(&m_d->m_lock);
1350 std::map< std::string, std::string >::const_iterator it = m_d->m_options.find(name);
1351 if (it == m_d->m_options.end())
1360 QReadLocker lock(&m_d->m_lock);
1361 auto it = m_d->m_stringsPool.find(med);
1362 if (it == m_d->m_stringsPool.end())
1365 LERROR <<
"no available string pool for media " << (int)med;
1368 return *(it->second);
1373 QReadLocker lock(&m_d->m_lock);
1374 auto it = m_d->m_stringsPool.find(med);
1375 if (it == m_d->m_stringsPool.end())
1378 LERROR <<
"no available string pool for media " << (int)med;
1381 return *(it->second);
1386 QReadLocker lock(&m_d->m_lock);
1387 return m_d->s_entityTypeNameSeparator;
#define LIMA_PATH_SEPARATOR
#define LIMA_EXCEPTION(X)
This macro writes the message X to a previously configured error stream before throwing a LimaExcepti...
storage for double access: from object to id and from id to object : id must be integer.
Id insert(const Object &)
insert an object if not already inserted
const ReverseAccessMap & getReverseAccessMap() const
const AccessMap & getAccessMap() const
const Object & get(const Id &) const
std::string & getParamsValueAtKey(const std::string &key)
std::map< std::string, std::string > & getMapAtKey(const std::string &key)
GroupConfigurationStructure & getGroupNamed(const std::string &name)
return a message when a 'group' was not found
return a message when a 'list' was not found
return a message when a 'map' was not found
return a message when a 'module' is not found
return a message when a 'param' was not found
Parser class for the lima's xml configuration files.
std::string & getModuleGroupParamValue(const std::string &moduleName, const std::string &groupName, const std::string &key)
const QString & getConfigurationFileName() const
ModuleConfigurationStructure & getModuleConfiguration(const std::string &moduleName)
Use this exception to signal an error in one of the configuration files.
The main LIMA exception class.
virtual const char * what() const override
Defines access method for the singleton pattern.
static MediaticData & changeable()
singleton accessor
void writeUTF8StringField(std::ostream &file, const Lima::LimaString &s)
Binary write a a LimaString in a file as an utf8 string.
uint64_t readCodedInt(std::istream &file)
read a integer coded in variable-byte format in a file
void readUTF8StringField(std::istream &file, Lima::LimaString &s)
Binary read an utf8 string from a file and store it in a LimaString.
QString findFileInPaths(const QString &paths, const QString &fileName, const QChar &separator)
Find the given file in the given paths.
void writeCodedInt(std::ostream &file, const uint64_t number)
write a integer coded in variable-byte format in a file
LimaString utf8stdstring2limastring(const std::string &src)
static const struct TextHtmlEntity entities[]
launch exception related to the configuration file parsing