Base::XMLReader::XMLReader(const char* FileName, std::istream& str) : DocumentSchema(0), ProgramVersion(""), FileVersion(0), Level(0), CharacterCount(0), ReadType(None), _File(FileName), _valid(false), _verbose(true) { #ifdef _MSC_VER str.imbue(std::locale::empty()); #else //FIXME: Check whether this is correct str.imbue(std::locale::classic()); #endif // create the parser parser = XMLReaderFactory::createXMLReader(); //parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, false); //parser->setFeature(XMLUni::fgXercesSchema, false); //parser->setFeature(XMLUni::fgXercesSchemaFullChecking, false); //parser->setFeature(XMLUni::fgXercesIdentityConstraintChecking, false); //parser->setFeature(XMLUni::fgSAX2CoreNameSpacePrefixes, false); //parser->setFeature(XMLUni::fgSAX2CoreValidation, true); //parser->setFeature(XMLUni::fgXercesDynamic, true); parser->setContentHandler(this); parser->setLexicalHandler(this); parser->setErrorHandler(this); try { StdInputSource file(str, _File.filePath().c_str()); _valid = parser->parseFirst(file, token); } catch (const XMLException& toCatch) { char* message = XMLString::transcode(toCatch.getMessage()); cerr << "Exception message is: \n" << message << "\n"; XMLString::release(&message); } catch (const SAXParseException& toCatch) { char* message = XMLString::transcode(toCatch.getMessage()); cerr << "Exception message is: \n" << message << "\n"; XMLString::release(&message); } #ifndef FC_DEBUG catch (...) { cerr << "Unexpected Exception \n"; } #endif }
bool CConfigurationFile::CXML::load(std::istream & is, const std::string & relativeTo) { mPWD = relativeTo; is.imbue(std::locale::classic()); is.precision(16); mpIstream = &is; bool success = true; bool done = false; CVersion Version; CCopasiXMLParser Parser(Version); #define BUFFER_SIZE 0xfffe char * pBuffer = new char[BUFFER_SIZE + 1]; while (!done) { mpIstream->get(pBuffer, BUFFER_SIZE, 0); if (mpIstream->eof()) done = true; if (mpIstream->fail() && !done) { std::string ConfigFile; COptions::getValue("ConfigFile", ConfigFile); CCopasiMessage Message(CCopasiMessage::WARNING, MCConfiguration + 2, ConfigFile.c_str()); done = true; success = false; } if (!Parser.parse(pBuffer, -1, done)) { CCopasiMessage Message(CCopasiMessage::RAW, MCXML + 2, Parser.getCurrentLineNumber(), Parser.getCurrentColumnNumber(), Parser.getErrorString()); done = true; success = false; } } delete [] pBuffer; #undef BUFFER_SIZE if (success && Parser.getCurrentGroup() != NULL) { mConfiguration = * Parser.getCurrentGroup(); mConfiguration.setObjectName("Configuration"); delete Parser.getCurrentGroup(); } else mConfiguration.clear(); return success; }
virtual ReadResult readObject(std::istream& fin, const Options* options) const { loadWrappers(); fin.imbue(std::locale::classic()); Input fr; fr.attach(&fin); fr.setOptions(options); typedef std::vector<osg::Object*> ObjectList; ObjectList objectList; // load all nodes in file, placing them in a group. while(!fr.eof()) { Object *object = fr.readObject(); if (object) objectList.push_back(object); else fr.advanceOverCurrentFieldOrBlock(); } if (objectList.empty()) { return ReadResult("No data loaded"); } else if (objectList.size()==1) { return objectList.front(); } else { return objectList.front(); } }
/** * Read data from a file. Only DT_MAP is tested. With an array it is hard to set the * size beforehand properly (except if you know what to retrieve). */ void DataContainer::read(std::istream& in) { //, DataDecoratorType resolution) { DataDecoratorType x; switch(dataType) { case DT_MAP: assert (map_data != NULL); map_data->clear(); int y; in.imbue(std::locale(std::locale(), new colonsep)); while(in >> x >> y) { // if (resolution > 0) { // int x_ins = (int)(x * resolution); // x = x_ins / (DataDecoratorType)resolution; // } map_data->insert(make_pair<DataDecoratorType,int>(x, y)); assert(y != 0); // cout << "x and y: " << x << " and " << y << endl; } // cout << "Read " << map_data->size() << " items" << endl; break; case DT_F2DARRAY: assert (float_data != NULL); int ix; float fy; in.imbue(std::locale(std::locale(), new colonsep)); while(in >> ix >> fy) { if (ix >= float_data_len) { cerr << "Array is not large enough (" << float_data_len << ")" << endl; break; } float_data[ix] = fy; cout << "x and y: " << ix << " and " << fy << endl; } break; default: cerr << "Read: Unknown data type" << endl; } }
osgDB::ReaderWriter::ReadResult ReaderWriterVDPM::readNode(std::istream& fin, const Options* options) const { if (fin) { fin.imbue(std::locale::classic()); vdpm::StdInStream ins(&fin); vdpm::SRMesh* srmesh = vdpm::Serializer::getInstance().loadSRMesh(ins); osg::Node* node = convertSRMeshToSceneGraph(*srmesh, options); return node; } return ReadResult::FILE_NOT_HANDLED; }
virtual ReadResult readNode(std::istream& fin, const Options* options) const { loadWrappers(); fin.imbue(std::locale::classic()); Input fr; fr.attach(&fin); fr.setOptions(options); typedef std::vector<osg::Node*> NodeList; NodeList nodeList; // load all nodes in file, placing them in a group. while(!fr.eof()) { Node *node = fr.readNode(); if (node) nodeList.push_back(node); else fr.advanceOverCurrentFieldOrBlock(); } if (nodeList.empty()) { return ReadResult("No data loaded"); } else if (nodeList.size()==1) { return nodeList.front(); } else { Group* group = new Group; group->setName("import group"); for(NodeList::iterator itr=nodeList.begin(); itr!=nodeList.end(); ++itr) { group->addChild(*itr); } return group; } }
virtual osgDB::ReaderWriter::ReadResult readNode(std::istream& fin, const Options* options) const { fin.imbue(std::locale::classic()); osgDB::Input fr; fr.attach(&fin); fr.setOptions(options); osg::ref_ptr<osg::Group> group = new osg::Group; while(!fr.eof()) { bool itrAdvanced = false; if (fr.matchSequence("file %s") || fr.matchSequence("file %w") ) { osg::ref_ptr<osg::Node> node = osgDB::readRefNodeFile(fr[1].getStr()); if (node) group->addChild(node); fr += 2; itrAdvanced = true; } osg::ref_ptr<osg::Node> node = fr.readNode(); if (node.valid()) { group->addChild(node); itrAdvanced = true; } if (!itrAdvanced) { if (fr[0].getStr()) { OSG_NOTICE<<"Terrain file - unreconised token : "<<fr[0].getStr() <<""<< std::endl; } ++fr; } } if (group->getNumChildren()>0) return group; else return 0; }