bool ccHObject::fromFile(QFile& in, short dataVersion) { assert(in.isOpen() && (in.openMode() & QIODevice::ReadOnly)); //read 'ccObject' header if (!ccObject::fromFile(in,dataVersion)) return false; //read own data if (!fromFile_MeOnly(in,dataVersion)) return false; //(serializable) child count (dataVersion>=20) uint32_t serializableCount = 0; if (in.read((char*)&serializableCount,4)<0) return ReadError(); //read serializable children (if any) for (uint32_t i=0; i<serializableCount; ++i) { //read children class ID unsigned classID=0; if (!ReadClassIDFromFile(classID, in, dataVersion)) return false; //create corresponding child object ccHObject* child = New(classID); assert(child && child->isSerializable()); if (child) { if (child->fromFile(in,dataVersion)) { addChild(child,child->getFlagState(CC_FATHER_DEPENDANT)); } else { delete child; return false; } } else { return CorruptError(); } } //write current selection behavior (dataVersion>=23) if (dataVersion>=23) { if (in.read((char*)&m_selectionBehavior,sizeof(SelectionBehavior))<0) return ReadError(); } else { m_selectionBehavior = SELECTION_AA_BBOX; } return true; }
bool ccHObject::fromFileNoChildren(QFile& in, short dataVersion, int flags) { assert(in.isOpen() && (in.openMode() & QIODevice::ReadOnly)); //read 'ccObject' header if (!ccObject::fromFile(in, dataVersion, flags)) return false; //read own data return fromFile_MeOnly(in, dataVersion, flags); }
bool ccHObject::fromFile(QFile& in, short dataVersion, int flags, bool omitChildren) { assert(in.isOpen() && (in.openMode() & QIODevice::ReadOnly)); //read 'ccObject' header if (!ccObject::fromFile(in, dataVersion, flags)) return false; //read own data if (!fromFile_MeOnly(in, dataVersion, flags)) return false; if (omitChildren) return true; //(serializable) child count (dataVersion>=20) uint32_t serializableCount = 0; if (in.read((char*)&serializableCount,4) < 0) return ReadError(); //read serializable children (if any) for (uint32_t i=0; i<serializableCount; ++i) { //read children class ID CC_CLASS_ENUM classID = ReadClassIDFromFile(in, dataVersion); if (classID == CC_TYPES::OBJECT) return false; //create corresponding child object ccHObject* child = New(classID); //specifc case of custom objects (defined by plugins) if (classID == CC_TYPES::CUSTOM_H_OBJECT) { //store current position size_t originalFilePos = in.pos(); //we need to load the custom object as plain ccCustomHobject child->fromFile(in, dataVersion, flags, true); //go back to original position in.seek(originalFilePos); //get custom object name and plugin name QString childName = child->getName(); QString classId = child->getMetaData(ccCustomHObject::DefautMetaDataClassName()).toString(); QString pluginId = child->getMetaData(ccCustomHObject::DefautMetaDataPluginName()).toString(); //dont' need this instance anymore delete child; child = 0; // try to get a new object from external factories ccHObject* newChild = ccHObject::New(pluginId, classId); if (newChild) // found a plugin that can deserialize it { child = newChild; } else { ccLog::Warning(QString("[ccHObject::fromFile] Couldn't found any plugin able to deserialize custom object '%1' (class_ID = %2 / plugin_ID = %3").arg(childName).arg(classID).arg(pluginId)); return false; // FIXME: for now simply return false. We may want to skip it but I'm not sure if there is a simple way of doing that } } assert(child && child->isSerializable()); if (child) { if (child->fromFile(in, dataVersion, flags)) { //FIXME //addChild(child,child->getFlagState(CC_FATHER_DEPENDENT)); addChild(child); } else { delete child; return false; } } else { return CorruptError(); } } //write current selection behavior (dataVersion>=23) if (dataVersion >= 23) { if (in.read((char*)&m_selectionBehavior,sizeof(SelectionBehavior)) < 0) return ReadError(); } else { m_selectionBehavior = SELECTION_AA_BBOX; } return true; }