/// <summary>
 /// Constructor of the object.
 /// </summary>
 /// <param name="aMetadata">the metadata that shoud be transformed into XML</param>
 public XmlNewOutPutStreamHandler(Metadata aMetadata)
     : base()
 {
     this.Metadata    = aMetadata;
     this.DtdFileName = "MetadataExtractorNew.dtd";
     XmlNewOutPutStreamHandler.FORBIDEN_CHAR = XmlNewOutPutStreamHandler.BuildForbidenChar();
 }
        public static void Main(string[] someArgs)
        {

            string aFileName = @"C:\Users\hog\Downloads\IMG_6528.JPG";

            Metadata lcMetadata = null;
            try
            {
                FileInfo lcImgFile = new FileInfo(aFileName);
                // Loading all meta data
                lcMetadata = JpegMetadataReader.ReadMetadata(lcImgFile);
            }
            catch (JpegProcessingException e)
            {
                Console.Error.WriteLine(e.Message);
                return;
            }

			foreach(AbstractDirectory lcDirectory in lcMetadata)
			{

                if (lcDirectory.ContainsTag(0x9003))
                {
                    Console.WriteLine("does "+ lcDirectory.GetTagName(0x9003) +" " + lcDirectory.GetDate(0x9003) );
                }
                
            }
            Console.ReadLine();

            if (someArgs.Length == 0)
            {
                Console.Error.WriteLine("Use: MetaDataExtractor [FilePaths|DirectoryPaths] [noUnknown|asXml|asXml2|doSub]");
                Console.Error.WriteLine("     - noUnknown: will hide unknown metadata tag");
                Console.Error.WriteLine("     - asXml    : will generate an XML stream");
                Console.Error.WriteLine("     - asXml2   : will generate an XML stream with more information than asXml");
                Console.Error.WriteLine("     - doSub    : will search subdirectories for *.jpg, *.raw, *.cr2, *.crw");
                Console.Error.WriteLine("Examples:");
                Console.Error.WriteLine("     - Will show you MyImage.jpg info as text:");
                Console.Error.WriteLine("       MetaDataExtractor c:\\MyImage.jpg");
                Console.Error.WriteLine(" or ");
                Console.Error.WriteLine("     - Will show you all *.jpg|*.raw|*.cr2|*.crw in c:\\ and img1.jpg and img2.jpg info as text:");
                Console.Error.WriteLine("       MetaDataExtractor c:\\ d:\\img1.jpg e:\\img2.jpg");
                Console.Error.WriteLine("     - Will show you all *.jpg|*.raw|*.cr2|*.crw in c:\\ as text but with no unkown tags:");
                Console.Error.WriteLine("       MetaDataExtractor c:\\ noUnknown");
                Console.Error.WriteLine("     - Will show you all *.jpg|*.raw|*.cr2|*.crw in c:\\ as XML:");
                Console.Error.WriteLine("       MetaDataExtractor c:\\ asXml");
                Console.Error.WriteLine("     - Will show you all *.jpg|*.raw|*.cr2|*.crw in c:\\ as XML2 but with no unkown tags:");
                Console.Error.WriteLine("       MetaDataExtractor c:\\ noUnknown asXml2");
                Console.Error.WriteLine("     - Will show you all *.jpg|*.raw|*.cr2|*.crw in c:\\Temp\\ and all its subdirectories as XML but with no unkown tags:");
                Console.Error.WriteLine("       MetaDataExtractor c:\\Temp noUnknown asXml doSub");
                Console.Error.WriteLine("     - Will put in a file called sample.xml all c:\\Temp\\ *.jpg|*.raw|*.cr2|*.crw and all its subdirectories as XML but with no unkown tags:");
                Console.Error.WriteLine("       MetaDataExtractor c:\\Temp noUnknown asXml doSub > sample.xml");
                Console.Error.WriteLine("Cautions:");
                Console.Error.WriteLine(" + Pointing on c:\\ with doSub option is a very bad idea ;-)");
                Console.ReadLine();
            }
            else
            {
                Run.FindAsXml(someArgs);
                Run.FindNoUnknown(someArgs);
                Run.FindDoSub(someArgs);

                StringBuilder lcGlobalBuff = new StringBuilder(1024);

                IOutPutTextStreamHandler lcXmlHandler = null;

                string dtdFile = null;
                if (Run.asXml == (byte)1)
                {
                    lcXmlHandler = new XmlOutPutStreamHandler();
                    dtdFile = "MetadataExtractor.dtd";
                }
                else if (Run.asXml == (byte)2)
                {
                    lcXmlHandler = new XmlNewOutPutStreamHandler();
                    dtdFile = "MetadataExtractorNew.dtd";
                }
                else
                {
                    lcXmlHandler = new TxtOutPutStreamHandler();
                }
                lcXmlHandler.DoUnknown = !Run.noUnknown;

                List<string> lcFileNameLst = Run.FindFileNames(someArgs);
                // Args for OutPutTextStream objects

                // Indicate your Xsl here
                string lcXslFileName = null; // For example: ="exif.xslt";
                // Indicate if you want to use CDDATA in your XML stream
                string useCDDATA = "false";
                string[] lcOutputParams = new string[] { "ISO-8859-1", lcXslFileName, lcFileNameLst.Count.ToString(), dtdFile, useCDDATA };

                lcXmlHandler.StartTextStream(lcGlobalBuff, lcOutputParams);
                foreach(string lcFileName in lcFileNameLst) 
                {
                    StringBuilder lcBuff = new StringBuilder(2048);
                    //Metadata lcMetadata = null;
                    try
                    {
                        FileInfo lcImgFileInfo = new FileInfo(lcFileName);
                        if (lcFileName.ToLower().EndsWith(".raw") || 
                            lcFileName.ToLower().EndsWith(".cr2") || 
                            lcFileName.ToLower().EndsWith(".crw"))
                        {
                            lcMetadata = TiffMetadataReader.ReadMetadata(lcImgFileInfo);
                        }
                        else
                        {
                            lcMetadata = JpegMetadataReader.ReadMetadata(lcImgFileInfo);
                        }
                        lcXmlHandler.Metadata = lcMetadata;
                    }
                    catch (JpegProcessingException e)
                    {
                        Console.Error.WriteLine("Could note analyse the file '" + lcFileName + "' error message is:" + e.Message);
                        break;
                    }

                    if (Run.asXml != (byte)0)
                    {
                        // First open file name tag
                        lcBuff.Append("<file name=\"");
                        lcXmlHandler.Normalize(lcBuff, lcFileName, false);
                        lcBuff.Append("\">").AppendLine();
                        // Then create all directory tag
                        lcBuff.Append(lcXmlHandler.AsText());
                        // Then close file tag
                        lcBuff.Append("</file>").AppendLine().AppendLine();
                    }
                    else
                    {
                        lcBuff.Append("-> ");
                        lcXmlHandler.Normalize(lcBuff, lcFileName, false);
                        lcBuff.Append(" <-").AppendLine();
                        // Then create all directory tag
                        lcBuff.Append(lcXmlHandler.AsText()).AppendLine();
                    }
                    lcMetadata = null;
                    // Adds result for this file to big buffer
                    lcGlobalBuff.Append(lcBuff);
                    lcGlobalBuff.AppendLine();
                }
                lcXmlHandler.EndTextStream(lcGlobalBuff, lcOutputParams);

                Console.Out.WriteLine(lcGlobalBuff.ToString());
            }
          
            // Uncomment if you are running under VisualStudio
             Console.In.ReadLine();
        }