// TODO: remove method if not needed
 public void Test(int skip, IDCMapping mapping, IDCFileInfo fileInfo)
 {
     if (m_traceSwitch.TraceVerbose)
     {
         Debug.WriteLine("DataConverter Test");
         Debug.WriteLine("\tDCMapping");
         Debug.WriteLine("\t\tBeginMarker =" + mapping.BeginMarker + ".");
         Debug.WriteLine("\t\tDomain      =" + mapping.Domain      + ".");
         Debug.WriteLine("\t\tEndMarker   =" + mapping.EndMarker   + ".");
         Debug.WriteLine("\tIDCFileInfo");
         Debug.WriteLine("\t\tFileEncoding       =" + fileInfo.FileEncoding       + ".");
     //				Debug.WriteLine("\t\tFileEncodingSource =" + fileInfo.FileEncodingSource + ".");
         Debug.WriteLine("\t\tInputFileName      =" + fileInfo.InputFileName      + ".");
         Debug.WriteLine("\t\tOutputFileName     =" + fileInfo.OutputFileName     + ".");
     }
 }
        public void TestDataConverter()
        {
            MarkerClass markerClass = new MarkerClass();

            DataConverter dataConverter = new DataConverter();

            DCMapping mapping;
            DCMapping[] mappings = new DCMapping[markerClass.markers.Length];

            for (int i = 0; i < markerClass.markers.Length; i++)
            {
                MarkerClass.Marker marker = markerClass.markers[i];

                mapping = new DCMapping();
                mapping.BeginMarker = marker.m_marker;

                // the sample input file is ASCII text, so using ISO-8859-1 (Latin 1)
                // to convert to Unicode is a good choice. By specifiying an empty string
                // as the encoding name, the default Unicode conversion will be used,
                // which is ISO-8859-1 (Latin 1).
                mapping.MarkerEncoding = "";
                mapping.DataEncoding = "";

                mapping.IsInline = marker.m_isInline;
                mapping.EndMarker = marker.m_end;

                mappings[i] = mapping;
            }

            // location of sample sfm files
            string SFMFilePath = Info.TestFileDir;

            //			IECProjectFileInfo fileInfo;
            //			IECProjectFileInfo[] fileInfos = new IECProjectFileInfo[1];
            DCFileInfo fileInfo;
            IDCFileInfo[] fileInfos = new IDCFileInfo[1];

            //			fileInfo = new ECProjectFileInfo();
            fileInfo = new DCFileInfo();
            fileInfo.InputFileName = SFMFilePath + @"input.sfm";
            fileInfo.OutputFileName = SFMFilePath + @"output.sfm";

            // fileInfo.HasBOM is initialized to 0 ... which works for this test.
            fileInfo.FileEncoding = DCFileEncoding.DC_FE_BYTES;

            fileInfos[0] = fileInfo;

            // convert the input files
            dataConverter.ConvertNew(mappings, fileInfos);
        }
        public void ConvertNew(IDCMapping[] mappings, IDCFileInfo[] fileInfos)
        {
            //			Test(1, mappings[0], fileInfos[0]);

            m_tokenizer = new Tokenizer();

            foreach (IDCMapping mapping in mappings)
            {
                if (mapping.MarkerEncoding.Length <= 0)
                    mapping.MarkerEncoding = DefaultMarkerMap;
                if (mapping.DataEncoding.Length <= 0)
                    mapping.DataEncoding = DefaultDataMap;
                MarkerSpec ms = MarkerSpec.CreateMarkerSpec(mapping);
                m_tokenizer.Tri.Add(ms);
            }

            Token token;
            string output;

            FileStream stream;
            StreamReader streamReader;
            Stream outputStream;
            bool fBOM;
            StreamWriter outputWriter = null;

            // Do for each input file in fileInfo
            System.Text.Encoding encoding;
            foreach (IDCFileInfo fileInfo in fileInfos)
            {
                stream = new FileStream(fileInfo.InputFileName,
                    FileMode.Open, FileAccess.Read);
                bool fAlreadyUnicode = true;
                switch (fileInfo.FileEncoding)
                {
                    case DCFileEncoding.DC_FE_BYTES:
                    case DCFileEncoding.DC_FE_Unknown:
                        encoding = ReversibleEncoding;
                        fAlreadyUnicode = false;
                        break;
                    case DCFileEncoding.DC_FE_UTF16BE:
                        encoding = System.Text.Encoding.BigEndianUnicode;
                        break;
                    case DCFileEncoding.DC_FE_UTF16LE:
                        encoding = System.Text.Encoding.Unicode;
                        break;
                    case DCFileEncoding.DC_FE_UTF8:
                        encoding = System.Text.Encoding.UTF8;
                        break;
                    default:
                        Debug.Fail("Requested input file encoding not implemented.");
                        encoding = ReversibleEncoding;
                        fAlreadyUnicode = false;
                        break;
                }
                streamReader = new StreamReader(stream, encoding);
                m_tokenizer.Input = streamReader;

                outputStream = new FileStream(fileInfo.OutputFileName, FileMode.Create,
                    FileAccess.Write);

                fBOM = fileInfo.HasBOM;
                if (fBOM)
                {
                    // Use StreamWriter if BOM needed.
                    outputWriter = new StreamWriter(outputStream, System.Text.Encoding.UTF8);
                }

                do
                {
                    // Enhance (BobbyD): It seems that all the StreamWriters output a BOM,
                    // even if we don't want one. One solution is below, that is, write the data
                    // using Streams instead of StreamWriters. Except this is sort of messy,
                    // a cleaner solution may be to subclass Encoding.UTF8, override the method
                    // GetPreamble() to return a zero length byte array, instead of the UTF8 BOM,
                    // and then the nice and clean StreamWriter can be used. More information on
                    // this is under the help topic of Encoding.GetPreamble Method.
                    token = m_tokenizer.Next();
                    output = token.Output(fAlreadyUnicode);
                    byte[] bytes = System.Text.Encoding.UTF8.GetBytes(output);
                    if (token is NewlineToken)
                    {
                        if (fBOM)
                            outputWriter.WriteLine(output);
                        else
                        {
                            outputStream.Write(bytes, 0, bytes.Length);
                            outputStream.WriteByte((byte)'\r');
                            outputStream.WriteByte((byte)'\n');
                        }
                    }
                    else
                    {
                        if (fBOM)
                            outputWriter.Write(output);
                        else
                            outputStream.Write(bytes, 0, bytes.Length);
                    }
                } while (!(token is EndOfFileToken));

                m_tokenizer.Input.Close();			// close the input stream

                if (fBOM)
                    outputWriter.Close();
                else
                    outputStream.Close();
            }
        }
        public void TestInvalidFileName()
        {
            MarkerClass markerClass = new MarkerClass();

            DataConverter dataConverter = new DataConverter();

            DCMapping mapping;
            DCMapping[] mappings = new DCMapping[markerClass.markers.Length];

            for (int i = 0; i < markerClass.markers.Length; i++)
            {
                MarkerClass.Marker marker = markerClass.markers[i];

                mapping = new DCMapping();
                mapping.BeginMarker = marker.m_marker;

                // use an undefined Encoding Repository name
                mapping.MarkerEncoding = "";
                mapping.DataEncoding = "";

                mapping.IsInline = marker.m_isInline;
                mapping.EndMarker = marker.m_end;

                mappings[i] = mapping;
            }

            // location of sample sfm files
            string SFMFilePath = Info.TestFileDir;

            DCFileInfo fileInfo;
            IDCFileInfo[] fileInfos = new IDCFileInfo[1];

            fileInfo = new DCFileInfo();
            fileInfo.InputFileName = SFMFilePath + @"inputxxxxx.sfm";
            fileInfo.OutputFileName = SFMFilePath + @"output.sfm";

            // fileInfo.HasBOM is initialized to 0 ... which works for this test.
            fileInfo.FileEncoding = DCFileEncoding.DC_FE_BYTES;

            fileInfos[0] = fileInfo;

            // convert the input files
            try
            {
                dataConverter.ConvertNew(mappings, fileInfos);
                Assert.Fail("ConvertNew didn't fail with non-existant input file.");
            }
            catch(System.IO.FileNotFoundException)
            {
            }
            catch(Exception e)
            {
                Assert.Fail("Unexpected Exception: " + e.Message);
            }
        }