/*! Reads from the stream set by a preceding call to initialiseRead. Since the root element is the first one created it reads the file header and creates the elements to read the data following the header. \param[in] typeName The argument is ignored. */ void OSBRootElement::read(const std::string &/*typeName*/) { OSG_OSB_LOG(("OSBRootElement::read\n")); BinaryReadHandler *rh = getReadHandler(); std::string headerMarker; rh->getValue(headerMarker); if(headerMarker == OSGOSB_HEADER_ID_1) { OSG_OSB_LOG(("OSBRootElement::read: Header version: [%u]\n", OSGOSBHeaderVersion100)); setHeaderVersion(OSGOSBHeaderVersion100); } else if(headerMarker == OSGOSB_HEADER_ID_2) { OSG_OSB_LOG(("OSBRootElement::read: Header version: [%u]\n", OSGOSBHeaderVersion200)); setHeaderVersion(OSGOSBHeaderVersion200); } // else if(headerMarker == OSGOSB_HEADER_ID_201) // { // OSG_OSB_LOG(("OSBRootElement::read: Header version: [%u]\n", // OSGOSBHeaderVersion201)); // setHeaderVersion(OSGOSBHeaderVersion201); // } else { FWARNING(("OSBRootElement::read: Unrecognized file header, could not " "load file.\n")); return; } std::string headerName; rh->getValue(headerName); std::string headerOptions; rh->getValue(headerOptions); UInt64 fileSize; rh->getValue(fileSize); OSG_OSB_LOG(("OSBRootElement::read: headerName: [%s]\n", headerName.c_str())); OSG_OSB_LOG(("OSBRootElement::read: headerOptions: [%s]\n", headerOptions.c_str())); OSG_OSB_LOG(("OSBRootElement::read: fileSize: [%" PRISize "]\n", fileSize)); std::string fcTypeName; UInt32 fcIdFile; // id used in the file UInt32 fcIdSystem; // id used in the system OSBElementBase *elem; while(true) { if(!readFieldContainerHeader(fcTypeName, fcIdFile)) break; OSG_OSB_LOG(("OSBRootElement::read: fcTypeName [%s] fcIdFile: [%u]\n", fcTypeName.c_str(), fcIdFile)); elem = OSBElementFactory::the()->acquire(fcTypeName, this); elem->setFCIdFile(fcIdFile ); elem->read (fcTypeName); if(elem->getContainer() != NULL) { fcIdSystem = elem->getContainer()->getId(); OSG_OSB_LOG(("OSBRootElement::read: fcIdFile: [%u] fcIdSystem: [%u]\n", fcIdFile, fcIdSystem)); editIdMap().insert( FieldContainerIdMap::value_type(fcIdFile, fcIdSystem)); if(getContainer() == NULL) { setContainer(elem->getContainer()); } editElementList().push_back(elem ); editIdElemMap ().insert (std::make_pair(fcIdFile, elem)); } } }