bool FDPLoader::parse() { m_bindings.clear(); m_morphTargetsMeshInfos.clear(); m_faceEntityMeshInfo.clear(); // get the header DOMNodeList* nodes = m_pDoc->getElementsByTagName(XercesString("head")); if(!nodes || nodes->getLength() != 1) // sth wrong return false; if(!parseHeader(nodes->item(0)) ) return false; // get the source info nodes = m_pDoc->getElementsByTagName(XercesString("source")); if(!nodes || nodes->getLength() != 1) // sth wrong return false; parseSource(nodes->item(0)); // process fdp's now nodes = m_pDoc->getElementsByTagName(XercesString("fdp")); XMLSize_t sz = nodes->getLength(); for(XMLSize_t i = 0; i < sz; ++i) loadFDPItem(nodes->item(i)); return true; }
xercesc::InputSource* resolveEntity(const XMLCh *const publicId, const XMLCh *const systemId) { return new xercesc::URLInputSource(systemId); log4cpp::Category& logger = log4cpp::Category::getInstance( std::string("log_sub1") ); logger.debug("SAX: Resolving the entity for " + to_string(systemId)); Poco::URI uri(to_string(systemId)); try { if (hasCache()) { // uri = cache.getCacheURI(uri); } } catch (const XBRLException& e) { logger.warn("Cache handling for " + to_string(systemId) + "failed."); // return new InputSource(systemId); } catch (Poco::SyntaxException e) { logger.warn(to_string(systemId) + " is a malformed URI."); // return new InputSource(systemId); } auto wc_uri = XercesString(uri); return new xercesc::URLInputSource(xercesc::XMLURL(wc_uri)); }
FDPLoader::FDPLoader(void) : m_version("0.2"), m_pParser(0), m_pDoc(0) { try { XMLPlatformUtils::Initialize(); } catch (const XMLException& toCatch) { // Do your failure processing here std::cerr << "FDPLoader: Cannot start Xerces parser!" << XercesString(toCatch.getMessage()) << std::endl; } }
void FDPLoader::parseSource(DOMNode* pSource) { DOMNodeIterator* iterator = m_pDoc->createNodeIterator(pSource, DOMNodeFilter::SHOW_ELEMENT | DOMNodeFilter::SHOW_ATTRIBUTE, NULL, true); // use the tree walker to print out the text nodes. for ( DOMNode* current = iterator->nextNode(); current != 0; current = iterator->nextNode() ) { if(XercesString(current->getNodeName()) == "entity") loadEntity(current); } }
bool ScriptProcessorLoader::parse() { // get the scripters DOMNodeList* nodes = m_pDoc->getElementsByTagName(XercesString("scripter")); if(!nodes) // sth wrong return false; XMLSize_t sz = nodes->getLength(); for(XMLSize_t i = 0; i < sz; ++i) loadScript(nodes->item(i)); return true; }
XERCES_CPP_NAMESPACE_USE #endif #ifdef _DEBUG #pragma message(" Adding Xerces lib (Debug)...") #pragma comment(lib, "xerces-c_2D") #else #pragma message(" Adding Xerces lib (Release)...") #pragma comment(lib, "xerces-c_2") #endif ScriptProcessorLoader::ScriptProcessorLoader(void) : m_pParser(0), m_pDoc(0) { try { XMLPlatformUtils::Initialize(); } catch (const XMLException& toCatch) { // Do your failure processing here std::cerr << "ScriptProcessorLoader: Cannot start Xerces parser!" << XercesString(toCatch.getMessage()) << std::endl; } }
xercesc::InputSource* resolveEntity(const xercesc::XMLResourceIdentifier& resource) { //try { // logger.debug("SCHEMA: Resolving the entity for " + resource.getExpandedSystemId()); //xercesc::XMLPlatformUtils::Initialize(); std::string id = to_string(resource.getSystemId()); Poco::URI uri(id); if (hasCache()) { // uri = cache.getCacheURI(uri); } // logger.debug("... so resolving the entity for URI " + uri); auto wc_uri = XercesString(uri); return new xercesc::URLInputSource(xercesc::XMLURL(wc_uri)); //} catch (XBRLException e) { // logger.warn("Cache handling for " + resource.getExpandedSystemId() + "failed."); // return new xercesc::XMLInputSource(resource.getPublicId(),resource.getExpandedSystemId(), resource.getBaseSystemId()); //} catch (URISyntaxException e) { // logger.warn(resource.getExpandedSystemId() + " is a malformed URI."); // return new xercesc::XMLInputSource(resource.getPublicId(),resource.getExpandedSystemId(), resource.getBaseSystemId()); //} }
std::shared_ptr<xercesc::InputSource> resolveSchemaURI(const Poco::URI& originalURI) { log4cpp::Category& logger = log4cpp::Category::getInstance( std::string("log_sub1") ); auto xmlUrl = xercesc::XMLURL(XercesString(originalURI.toString())); try { boost::filesystem::path fullPath = cache.getCachePath(originalURI); if (hasCache() && exists(fullPath) && boost::filesystem::file_size(fullPath) != 0) { return std::make_shared<xercesc::LocalFileInputSource>(fullPath.c_str()); } else { return std::make_shared<xercesc::URLInputSource>(xmlUrl); } } catch (const boost::filesystem::filesystem_error& e) { logger.warn("Cache handling for " + originalURI.toString() + "failed."); return std::make_shared<xercesc::URLInputSource>(xmlUrl); } }
bool FDPLoader::load(const std::string& filename, boost::shared_ptr<FDP> pFDP) { m_pFDP = pFDP; LocalFileInputSource source(XercesString(filename.c_str())); return loadInput(source); }
void FDPLoader::loadFDPItem(DOMNode* pFDPItem) { DOMNamedNodeMap* attrList = pFDPItem->getAttributes(); FDPItem* pItem = 0; // get the name (id) DOMNode* attr = attrList->getNamedItem(XercesString("name")); if(attr) { char* name = XMLString::transcode(attr->getNodeValue()); // create a new item (will be deleted in dtor of FDP class) pItem = new FDPItem(name); XMLString::release(&name); } else return; // get the control vertex index attr = attrList->getNamedItem(XercesString("index")); if(attr) { char* index = XMLString::transcode(attr->getNodeValue()); pItem->setControlPoint((unsigned short)atoi(index)); XMLString::release(&index); } // get the affecting mesh name attr = attrList->getNamedItem(XercesString("affects")); if(attr) { char* affects = XMLString::transcode(attr->getNodeValue()); pItem->setAffects(affects); XMLString::release(&affects); } DOMNodeIterator* iterator = m_pDoc->createNodeIterator(pFDPItem, DOMNodeFilter::SHOW_ELEMENT | DOMNodeFilter::SHOW_ATTRIBUTE, NULL, true); // use the tree walker to print out the text nodes. for ( DOMNode* current = iterator->nextNode(); current != 0; current = iterator->nextNode() ) { if(XercesString(current->getNodeName()) == "indices") { DOMNodeList* children = current->getChildNodes(); // we should have only one child, text node, just a safety net here if ( (children->getLength() == 1) && (children->item(0)->getNodeType() == DOMNode::TEXT_NODE) )//(XercesString(children->item(0)->getNodeName()) == "#text") ) { char* pStr = XMLString::transcode(children->item(0)->getNodeValue()); std::string str(pStr); processIndices(str, pItem); XMLString::release(&pStr); } } else if (XercesString(current->getNodeName()) == "influence") // can have multiple of those { // sample: <influence weight="0.25" fap="3" type="RaisedCosInfluenceWaveY" /> DOMNamedNodeMap* influenceAttr = current->getAttributes(); // get the weight float w = toFloat(influenceAttr->getNamedItem(XercesString("weight"))->getNodeValue()); unsigned short fap = (unsigned short)toFloat(influenceAttr->getNamedItem(XercesString("fap"))->getNodeValue()); char* type = XMLString::transcode(influenceAttr->getNamedItem(XercesString("type"))->getNodeValue()); IInfluenceCalculator* pInfluence = InfluenceCalculatorMaker::newInfluenceCalculator(type, w, fap); if(pInfluence) pItem->addInfluenceCalculator(pInfluence); } } m_pFDP->insertItem(pItem); }
void FDPLoader::loadEntity(DOMNode* pSource) { DOMNamedNodeMap* attrList = pSource->getAttributes(); std::string alias, category; DOMNode* attr = attrList->getNamedItem(XercesString("alias")); if(attr) { char* aliasPtr = XMLString::transcode(attr->getNodeValue()); alias.assign(aliasPtr); XMLString::release(&aliasPtr); } attr = attrList->getNamedItem(XercesString("category")); if(attr) { char* catPtr = XMLString::transcode(attr->getNodeValue()); category.assign(catPtr); XMLString::release(&catPtr); } DOMNodeIterator* iterator = m_pDoc->createNodeIterator(pSource, DOMNodeFilter::SHOW_ELEMENT | DOMNodeFilter::SHOW_ATTRIBUTE, NULL, true); // use the tree walker to print out the text nodes. for ( DOMNode* current = iterator->nextNode(); current != 0; current = iterator->nextNode() ) { if(XercesString(current->getNodeName()) == "mesh") { XEngine::MeshInfo info; attrList = current->getAttributes(); attr = attrList->getNamedItem(XercesString("file")); if(attr) info.file = XMLString::transcode(attr->getNodeValue()); attr = attrList->getNamedItem(XercesString("format")); if(attr) info.format = XMLString::transcode(attr->getNodeValue()); attr = attrList->getNamedItem(XercesString("path")); if(attr) info.path = XMLString::transcode(attr->getNodeValue()); else info.path.assign(""); info.keyframe_alias = alias; info.keyframe_category = category; if(alias == "Rest") m_faceEntityMeshInfo.push_back(info); // push the Rest state into the morph target dictionary as well m_morphTargetsMeshInfos[alias].push_back(info); } else if(XercesString(current->getNodeName()) == "bind") { XEngine::MeshInfo info; std::string submesh, item; attrList = current->getAttributes(); attr = attrList->getNamedItem(XercesString("submesh")); if(attr) submesh = XMLString::transcode(attr->getNodeValue()); attr = attrList->getNamedItem(XercesString("item")); if(attr) item = XMLString::transcode(attr->getNodeValue()); if(item == "LeftEye" || item == "RightEye") // eye pivots { Vector3 eye(0, 0, 0); //std::string x, y, z; attr = attrList->getNamedItem(XercesString("pivotX")); if(attr) eye.x = toFloat(attr->getNodeValue()); attr = attrList->getNamedItem(XercesString("pivotY")); if(attr) eye.y = toFloat(attr->getNodeValue()); attr = attrList->getNamedItem(XercesString("pivotZ")); if(attr) eye.z = toFloat(attr->getNodeValue()); if(item == "LeftEye") m_pFDP->setLeftEyePivot(eye); else m_pFDP->setRightEyePivot(eye); } m_bindings.insert(std::make_pair(submesh, item)); } } }
bool FDPLoader::parseHeader(DOMNode* pHeader) { DOMNodeIterator* iterator = m_pDoc->createNodeIterator(pHeader, DOMNodeFilter::SHOW_ELEMENT | DOMNodeFilter::SHOW_ATTRIBUTE, NULL, true); // use the tree walker to print out the text nodes. for ( DOMNode* current = iterator->nextNode(); current != 0; current = iterator->nextNode() ) { // there are "file", "model", "fapu", "translation" and "rotation" elements in this chunk if (XercesString(current->getNodeName()) == "file") { // sample: <file version="0.2" /> DOMNamedNodeMap* attr = current->getAttributes(); if(!attr) // sth wrong return false; DOMNode* versionAttr = attr->getNamedItem(XercesString("version")); if(XercesString(m_version.c_str()) != versionAttr->getNodeValue()) // versions not matching, flee!! return false; } else if(XercesString(current->getNodeName()) == "fapu") { // sample: <fapu ES0="69.9977" IRISD0="16.0424" ENS0="51.8036" MNS0="30.1538" MW0="50.6392" /> DOMNamedNodeMap* attrList = current->getAttributes(); if(!attrList) // sth wrong return false; /////////////// ES0 DOMNode* attr = attrList->getNamedItem(XercesString("ES0")); if(attr) m_pFDP->setES0(toFloat(attr->getNodeValue())); /////////////// IRISD0 attr = attrList->getNamedItem(XercesString("IRISD0")); if(attr) m_pFDP->setIRISD0(toFloat(attr->getNodeValue())); /////////////// ENS0 attr = attrList->getNamedItem(XercesString("ENS0")); if(attr) m_pFDP->setENS0(toFloat(attr->getNodeValue())); /////////////// MNS0 attr = attrList->getNamedItem(XercesString("MNS0")); if(attr) m_pFDP->setMNS0(toFloat(attr->getNodeValue())); /////////////// MW0 attr = attrList->getNamedItem(XercesString("MW0")); if(attr) m_pFDP->setMW0(toFloat(attr->getNodeValue())); // debug << "fapu item" << std::endl; } else if(XercesString(current->getNodeName()) == "translation") { // sample: <translation x="0" y="-1" z="-659" /> DOMNamedNodeMap* attrList = current->getAttributes(); if(!attrList) // sth wrong return false; float x = 0, y = 0, z = 0; /////////////// x translation DOMNode* attr = attrList->getNamedItem(XercesString("x")); if(attr) x = toFloat(attr->getNodeValue()); /////////////// y translation attr = attrList->getNamedItem(XercesString("y")); if(attr) y = toFloat(attr->getNodeValue()); /////////////// z translation attr = attrList->getNamedItem(XercesString("z")); if(attr) z = toFloat(attr->getNodeValue()); m_pFDP->setGlobalTranslation(x, y, z); // debug << "translation item " << x << " " << y << " " << z << std::endl; } else if(XercesString(current->getNodeName()) == "rotation") { // sample: <rotation axis_x="-0.998192" axis_y="0.0596591" axis_z="0.00728935" axis_angle="0.444541" /> DOMNamedNodeMap* attrList = current->getAttributes(); if(!attrList) // sth wrong return false; float x = 0, y = 0, z = 0, a = 0; /////////////// x rotation DOMNode* attr = attrList->getNamedItem(XercesString("axis_x")); if(attr) x = toFloat(attr->getNodeValue()); /////////////// y rotation attr = attrList->getNamedItem(XercesString("axis_y")); if(attr) y = toFloat(attr->getNodeValue()); /////////////// z rotation attr = attrList->getNamedItem(XercesString("axis_z")); if(attr) z = toFloat(attr->getNodeValue()); /////////////// z rotation attr = attrList->getNamedItem(XercesString("axis_angle")); if(attr) a = toFloat(attr->getNodeValue()); m_pFDP->setGlobalRotation(x, y, z, a); } } return true; }
bool XercesString::operator == (const char* str) const { return XMLString::equals(_wstr, XercesString(XMLString::transcode(str))); }
bool ScriptProcessorLoader::load(const std::string& filename) { LocalFileInputSource source(XercesString(filename.c_str())); return loadInput(source); }
void ScriptProcessorLoader::loadScript(DOMNode* pScript) { DOMNamedNodeMap* scrAttrList = pScript->getAttributes(); boost::shared_ptr<IScriptProcessor> pItem; // get the name char *scripter_name, *lang; DOMNode* attr = scrAttrList->getNamedItem(XercesString("name")); if(attr) scripter_name = XMLString::transcode(attr->getNodeValue()); else // sth totally wrong return; attr = scrAttrList->getNamedItem(XercesString("type")); if(attr) { // create a new item if (XercesString(attr->getNodeValue()) == "external") pItem.reset(new wxScriptProcessor(scripter_name)); else if (XercesString(attr->getNodeValue()) == "SMIL") pItem.reset(new SMILProcessor(scripter_name)); } // language attr = scrAttrList->getNamedItem(XercesString("lang")); if(attr) { lang = XMLString::transcode(attr->getNodeValue()); pItem->setLanguage(lang); XMLString::release(&lang); } XMLString::release(&scripter_name); DOMNodeIterator* iterator = m_pDoc->createNodeIterator(pScript, DOMNodeFilter::SHOW_ELEMENT | DOMNodeFilter::SHOW_ATTRIBUTE, NULL, true); // use the tree walker to print out the text nodes. for ( DOMNode* current = iterator->nextNode(); current != 0; current = iterator->nextNode() ) { if (XercesString(current->getNodeName()) == "output") // can have multiple of those { // sample: <output filename="TempFile.wav"/> DOMNamedNodeMap* outputAttr = current->getAttributes(); std::string outfile; attr = outputAttr->getNamedItem(XercesString("filename")); if(attr) { char* dummy = XMLString::transcode(attr->getNodeValue()); outfile = dummy; XMLString::release(&dummy); } pItem->push_output(outfile); } else if (XercesString(current->getNodeName()) == "TTSEngine") // can have multiple of those { // sample: <TTS lang="english" engine="SAPI51"/> DOMNamedNodeMap* outputAttr = current->getAttributes(); std::string ttsLang, ttsEngine, ttsPath, ttsIni; attr = outputAttr->getNamedItem(XercesString("lang")); // for which language should we use it if(attr) { char* dummy = XMLString::transcode(attr->getNodeValue()); ttsLang = dummy; XMLString::release(&dummy); } attr = outputAttr->getNamedItem(XercesString("engine")); // which TTS engine (already loaded) if(attr) { char* dummy = XMLString::transcode(attr->getNodeValue()); ttsEngine = dummy; XMLString::release(&dummy); } attr = outputAttr->getNamedItem(XercesString("path")); // does it have a specific (external) executable path? if(attr) { char* dummy = XMLString::transcode(attr->getNodeValue()); ttsPath = dummy; XMLString::release(&dummy); } attr = outputAttr->getNamedItem(XercesString("ini")); // does it have a ini file? if(attr) { char* dummy = XMLString::transcode(attr->getNodeValue()); ttsIni = dummy; XMLString::release(&dummy); } pItem->push_ttsEngine(ttsEngine, ttsLang, ttsPath, ttsIni); } // are we using an external executable? else if (XercesString(current->getNodeName()) == "executable") // can have multiple of those { DOMNamedNodeMap* attrList = current->getAttributes(); // get the executable attr = attrList->getNamedItem(XercesString("exename")); if(attr) { char* exe = XMLString::transcode(attr->getNodeValue()); pItem->setExecutable(exe); XMLString::release(&exe); } // get the path attr = attrList->getNamedItem(XercesString("path")); if(attr) { char* path = XMLString::transcode(attr->getNodeValue()); pItem->setPath(path); XMLString::release(&path); } // get the parameters attr = attrList->getNamedItem(XercesString("parameters1")); if(attr) { char* param = XMLString::transcode(attr->getNodeValue()); pItem->setParameters1(param); XMLString::release(¶m); } attr = attrList->getNamedItem(XercesString("parameters2")); if(attr) { char* param = XMLString::transcode(attr->getNodeValue()); pItem->setParameters2(param); XMLString::release(¶m); } // should we use temp xml file attr = attrList->getNamedItem(XercesString("tempfile")); if(attr) { char* tmpfile = XMLString::transcode(attr->getNodeValue()); pItem->setTempFileName(tmpfile); XMLString::release(&tmpfile); } } } m_processors.push_back(pItem); }