private IEnumerable <QtAtom> GetAtomsFromComponent()
        {
            QtAtom           dummyAtom = new QtAtom(Enumerable.Repeat(_detector, 1));
            HashSet <QtAtom> atoms     = new HashSet <QtAtom>();

            Assert.That(File.Exists(string.Format(Path.Combine(PathName, "QTDetector.dll"))), Is.True, "Could not find the file 'QTDetector.dll'");

            // Using 'LoadFile()' instead of 'LoadFrom()' causes the
            // 'GetDetector()' method to fail for unknown reason.
            Assembly assembly = Assembly.LoadFrom("QTDetector.dll");

            foreach (Type type in assembly.GetTypes())
            {
                if (typeof(QtAtom).IsAssignableFrom(type) && !type.IsAbstract /*&& type != typeof(QtAtom)*/)
                {
                    QtAtom atom = null;
                    // Try to get constructor with previousAtom as the only argument
                    ConstructorInfo constructorInfo = type.GetConstructor(BindingFlags.Public | BindingFlags.Instance, null, new[] { typeof(QtAtom) }, null);
                    if (constructorInfo != null)
                    {
                        atom = (QtAtom)constructorInfo.Invoke(BindingFlags.Default, null, new object[] { dummyAtom }, CultureInfo.CurrentCulture);
                    }
                    if (constructorInfo == null)
                    {
                        // If the above fails, try to get the constructor with
                        // previousAtom (QtAom) and atomName (AtomName) as the arguments.
                        constructorInfo = type.GetConstructor(BindingFlags.Public | BindingFlags.Instance, null, new[] { typeof(QtAtom), typeof(AtomName) }, null);

                        if (constructorInfo != null)
                        {
                            atom = (QtAtom)constructorInfo.Invoke(BindingFlags.Default, null, new object[] { dummyAtom, AtomName.Unknown }, CultureInfo.CurrentCulture);
                        }
                    }
                    if (constructorInfo == null)
                    {
                        // If the above fails, try to get the constructor with
                        // previousAtom (QtAom) and atomType (AtomType) as the arguments.
                        constructorInfo = type.GetConstructor(BindingFlags.Public | BindingFlags.Instance, null, new[] { typeof(QtAtom), typeof(ChunkOffset.AtomType) }, null);

                        if (constructorInfo != null)
                        {
                            atom = (QtAtom)constructorInfo.Invoke(BindingFlags.Default, null, new object[] { dummyAtom, ChunkOffset.AtomType.ChunkOffset32Bit }, CultureInfo.CurrentCulture);
                        }
                    }

                    Assert.IsNotNull(atom);

                    if (!atoms.Contains(atom, new EqualityComparer()))
                    {
                        atoms.Add(atom);
                    }
                    else
                    {
                        Assert.Fail("atom '{0}' already added.", Enum.GetName(typeof(AtomName), atom.HeaderName));
                    }
                }
            }
            return(atoms);
        }
        public override bool IsSuitableParent(QtAtom parent)
        {
            if (!base.IsSuitableParent(parent))
            {
                return(false);
            }

            // It must be the last child in its parent
            return(!parent.IsRoot && RelativeEndOffset == parent.RelativeEndOffset);
        }
        public void TestAtomIsCreatedByFactoryMethod()
        {
            // Create a collection containing all classes derived from QtAtom
            // from the QuickTime/MP4/3GPP plug-in.
            IEnumerable <QtAtom> atomsFromComponent = GetAtomsFromComponent();

            // Call the QtAtom factory method to find out which classes are created
            HashSet <QtAtom> atomsCreatedByFactory = new HashSet <QtAtom>();
            QtAtom           dummyAtom             = new QtAtom(Enumerable.Repeat(_detector, 1));

            foreach (AtomName atomName in Enum.GetValues(typeof(AtomName)))
            {
                QtAtom atom = QtParser.CreateAtom(dummyAtom, atomName, 0U);
                Assert.IsNotNull(atom);

                if (!atomsCreatedByFactory.Contains(atom, new EqualityComparer()))
                {
                    atomsCreatedByFactory.Add(atom);
                }
            }

            // Report any atom from component not created by the factory method
            foreach (QtAtom atom in atomsFromComponent)
            {
                if (!atomsCreatedByFactory.Contains(atom, new EqualityComparer()))
                {
                    Assert.Fail("Atom not created by factory: {0}", atom.GetType().Name);
                }
            }

            // Atoms created by factory not in Component
            foreach (QtAtom atom in atomsCreatedByFactory)
            {
                if (!atomsFromComponent.Contains(atom, new EqualityComparer()))
                {
                    Assert.Fail("Atom not in component: {0}", atom.GetType().Name);
                }
            }
        }
 public Transcript(QtAtom previousHeader)
     : base(previousHeader, AtomName.Transcript)
 {
 }
 public NonprimarySource(QtAtom previousHeader)
     : base(previousHeader, AtomName.NonprimarySource)
 {
 }
 public PixelAspectRatio(QtAtom previousHeader)
     : base(previousHeader, AtomName.PixelAspectRatio)
 {
 }
 public ComponentDetect(QtAtom previousHeader)
     : base(previousHeader, AtomName.ComponentDetect)
 {
 }
 public VersionCheck(QtAtom previousHeader)
     : base(previousHeader, AtomName.VersionCheck)
 {
 }
Exemplo n.º 9
0
 public CopyrightStatement(QtAtom previousHeader)
     : base(previousHeader, AtomName.CopyrightStatement)
 {
 }
 public DataRate(QtAtom previousHeader)
     : base(previousHeader, AtomName.DataRate)
 {
 }
 public TimeCode(QtAtom previousHeader)
     : base(previousHeader, AtomName.TimeCode)
 {
 }
Exemplo n.º 12
0
 public KeywordsForComposerX(QtAtom previousHeader)
     : base(previousHeader, AtomName.KeywordsForComposerX)
 {
 }
Exemplo n.º 13
0
 public NameOfComposer(QtAtom previousHeader)
     : base(previousHeader, AtomName.NameOfComposer)
 {
 }
Exemplo n.º 14
0
 public KeywordsForArrangerX(QtAtom previousHeader)
     : base(previousHeader, AtomName.KeywordsForArrangerX)
 {
 }
Exemplo n.º 15
0
 public NameOfArranger(QtAtom previousHeader)
     : base(previousHeader, AtomName.NameOfArranger)
 {
 }
Exemplo n.º 16
0
 public UserDataListEntry(QtAtom previousHeader, AtomName atomName)
     : base(previousHeader, atomName)
 {
 }
 public Hint(QtAtom previousHeader)
     : base(previousHeader, AtomName.Hint)
 {
 }
Exemplo n.º 18
0
 public MovieHeader(QtAtom previousHeader)
     : base(previousHeader, AtomName.MovieHeader)
 {
 }
 public TrackReferenceType(QtAtom previousHeader, AtomName atomName)
     : base(previousHeader, atomName)
 {
 }
 public AvcParameterSampleEntry(QtAtom previousHeader)
     : base(previousHeader, AtomName.AvcParameterSampleEntry)
 {
 }
Exemplo n.º 21
0
 public MediaHeader(QtAtom previousHeader)
     : base(previousHeader, AtomName.MediaHeader)
 {
 }
 public SampleDescription(QtAtom previousHeader)
     : base(previousHeader, AtomName.SampleDescription)
 {
 }
 public Bitrate(QtAtom previousHeader)
     : base(previousHeader, AtomName.Bitrate)
 {
 }
Exemplo n.º 24
0
 public SampleGroupDescriptionBox(QtAtom previousHeader)
     : base(previousHeader, AtomName.SampleGroupDescriptionBox)
 {
 }
Exemplo n.º 25
0
 public AmrwpSpecific(QtAtom previousHeader)
     : base(previousHeader, AtomName.AmrwpSpecific)
 {
 }
Exemplo n.º 26
0
 public Mpeg4BitRateBox(QtAtom previousHeader)
     : base(previousHeader, AtomName.Mpeg4BitRateBox)
 {
 }
 public VideoSampleDescription(QtAtom previousHeader, AtomName atomName)
     : base(previousHeader, atomName)
 {
 }
 public ChapterList(QtAtom previousHeader)
     : base(previousHeader, AtomName.ChapterList)
 {
 }
Exemplo n.º 29
0
 public HandlerReference(QtAtom previousHeader)
     : base(previousHeader, AtomName.HandlerReference)
 {
 }
 public Synchronization(QtAtom previousHeader)
     : base(previousHeader, AtomName.Synchronization)
 {
 }