public override bool IsSuitableParent(AsfObject parent) { if (!parent.IsRoot) { // Should fit in parent object if (Offset < parent.Offset || RelativeEndOffset > parent.RelativeEndOffset) { return(false); } } // First object should not be unknown if (IsUnknown && parent.IsRoot && !parent.HasChildren()) { return(false); } // ASF object should have no duplicates in its parent if DuplicatesAllowed is false if (!HeaderName.IsFlagSet(ObjectFlags.DuplicatesAllowed) && parent.HasChild(HeaderName)) { // ASF object of partial files may end up in the root // Therefore, duplicates are allowed, except for top-level atoms if (!parent.IsRoot || HeaderName.IsTopLevel()) { return(false); } } // Header object is always the first object if (HeaderName == AsfObjectName.HeaderObject && parent.HasChildren()) { return(false); } // Object is allowed in its suitable parent (correct files) if (HeaderName.GetSuitableParents().Contains(parent.HeaderName)) { return(true); } // Object ends up in the root if no suitable parent was found (partial files) if (!parent.IsRoot) { return(false); } return(true); }
public override bool IsSuitableParent(QtAtom parent) { if (!parent.IsRoot) { // Should fit in parent atom (box) if ((Offset < parent.Offset) || (RelativeEndOffset > parent.RelativeEndOffset)) { return(false); } } // First atom should not be unknown if (IsUnknown && parent.IsRoot && !parent.HasChildren()) { return(false); } // Atom should have no duplicates in its parent if DuplicatesAllowed is false if (!HeaderName.IsFlagSet(AtomFlags.DuplicatesAllowed) && parent.HasChild(HeaderName)) { // Atoms of partial files may end up in the root // Therefore, duplicates are allowed, except for top-level atoms if (!parent.IsRoot || HeaderName.IsTopLevel()) { return(false); } } // Atom is allowed in its suitable parent (correct files) if (HeaderName.GetSuitableParents().Contains(parent.HeaderName)) { return(true); } // Atom ends up in the root if no suitable parent was found (partial files) if (!parent.IsRoot) { return(false); } // Atoms of partial files are allowed in the root if empty if (!parent.HasChildren()) { return(true); } // Root should not already contain top-level atoms (FileType, MediaData or Movie) // Otherwise, the top-level parent of this atom should have been in the root as well foreach (QtAtom atom in parent.Children) { if (atom.HeaderName.IsTopLevel()) { return(false); } } // Depth of this atom should be equal or lower than last child of the root //if (!IsAtomTypeAllowedInRootAtThisPoint(parent, HeaderName)) //{ // return false; //} // Root should not contain only suitable ancestor of the atom //if (false) //{ // return false; //} // No 'higher atoms' than its suitable parent (siblings of an ancestor) //if (false) //{ // return false; //} return(true); }