Пример #1
0
        private static void ProcessLine(
            string line,
            ref FileReadState state,
            ref List <AlbumPlayed> albums,
            ref AlbumPlayed currentAlbumPlayed)
        {
            if (string.IsNullOrWhiteSpace(line))
            {
                return;
            }

            switch (state)
            {
            case FileReadState.Reset:
                ParseLineWhenReset(line, ref state, ref currentAlbumPlayed);
                break;

            case FileReadState.OnDate:
                ParseLineWhenOnDate(line, ref state, ref currentAlbumPlayed);
                break;

            case FileReadState.OnLocation:
                ParseLineWhenOnLocation(line, ref state, ref currentAlbumPlayed);
                break;

            case FileReadState.OnArtist:
                ParseLineWhenOnArtist(line, ref state, ref currentAlbumPlayed, albums);
                break;
            }
        }
Пример #2
0
 private static void ParseLineWhenOnArtist(
     string line,
     ref FileReadState state,
     ref AlbumPlayed currentAlbumPlayed,
     List <AlbumPlayed> albums)
 {
     if (line[0] == '\t' && line[1] == '\t' && line[2] == '\t')
     {
         string album = line.TrimEnd(IgnoreChars).TrimStart(IgnoreChars);
         currentAlbumPlayed.Album = album;
         albums.Add(currentAlbumPlayed);
         currentAlbumPlayed      = new AlbumPlayed(currentAlbumPlayed);
         currentAlbumPlayed.Date = currentAlbumPlayed.Date.AddMinutes(1);
     }
     else if (line[0] == '\t' && line[1] == '\t')
     {
         ParseLineWhenOnLocation(line, ref state, ref currentAlbumPlayed);
     }
     else if (line[0] == '\t')
     {
         ParseLineWhenOnDate(line, ref state, ref currentAlbumPlayed);
     }
     else
     {
         ParseLineWhenReset(line, ref state, ref currentAlbumPlayed);
     }
 }
Пример #3
0
        public static List <AlbumPlayed> GetAlbumsPlayedFromFile(string filePath)
        {
            List <AlbumPlayed> albums = new List <AlbumPlayed>();

            // check file exists
            if (!File.Exists(filePath))
            {
                return(albums);
            }

            // default the parsing state data
            string        line;
            FileReadState parseState         = FileReadState.Reset;
            AlbumPlayed   currentAlbumPlayed = new AlbumPlayed();

            // Read the file and parse it line by line.
            StreamReader file = new StreamReader(filePath);

            while ((line = file.ReadLine()) != null)
            {
                ProcessLine(line, ref parseState, ref albums, ref currentAlbumPlayed);
            }

            file.Close();

            return(albums);
        }
Пример #4
0
 private static void ParseLineWhenOnDate(
     string line,
     ref FileReadState state,
     ref AlbumPlayed currentAlbumPlayed)
 {
     if (line[0] == '\t')
     {
         string location = line.TrimEnd(IgnoreChars).TrimStart(IgnoreChars);
         currentAlbumPlayed.Location = location;
         state = FileReadState.OnLocation;
     }
 }
Пример #5
0
 private static void ParseLineWhenOnLocation(
     string line,
     ref FileReadState state,
     ref AlbumPlayed currentAlbumPlayed)
 {
     if (line[0] == '\t' && line[1] == '\t')
     {
         string artist = line.TrimEnd(IgnoreChars).TrimStart(IgnoreChars);
         currentAlbumPlayed.Artist = artist;
         state = FileReadState.OnArtist;
     }
 }
Пример #6
0
 private static void ParseLineWhenReset(
     string line,
     ref FileReadState state,
     ref AlbumPlayed currentAlbumPlayed)
 {
     if (char.IsLetterOrDigit(line[0]))
     {
         var words = line.Split(' ');
         if (words.Length >= NumberWordsInDate)
         {
             DateTime date = DateTime.Now;
             if (ParseDateFromString(words, ref date))
             {
                 currentAlbumPlayed.Date = date;
                 state = FileReadState.OnDate;
             }
         }
     }
 }
Пример #7
0
        //------------------------------------------//
        private bool readFileHeader()
        {
            /*
             *  $$HEADERSTART
             *  $$BINARY
             *  $$UNITS/00000000.010000
             *  $$VERSION/200
             *  $$LABEL/1,part1
             *  $$DATE/040513
             *  $$DIMENSION/00000000.000000,00000000.000000,00000000.000000,00000010.000000,00000012.000000,00000012.980000
             *  $$LAYERS/000650
             *  $$HEADEREND
             */
            FileReadState state = FileReadState.none;


            //- der Header sollte nicht länger als 1000 Byte sein (in der Regel 300 Byte)
            byte[] buffer = readByte(HEADER_BUFFER_LEN + 5, 0);
            int    bufLen = buffer.Length - 1;


            for (int i = 0; i < bufLen; i++)
            {
                if ((buffer[i] == '/') && (buffer[i + 1] == '/')) //- ein Kommentar beginnt
                {
                    for (i += 3; i < bufLen; i++)
                    {
                        if ((buffer[i - 1] == '/') && (buffer[i] == '/'))
                        {
                            break;                                             //- Kommentar Ende
                        }
                    }
                }
                else if ((buffer[i] == '$') && (buffer[i + 1] == '$')) //- ein Befehl
                {
                    i += 2;                                            //- 2 bytes ($$) überspringen
                    bool okToken = false;

                    switch (state)
                    {
                    case FileReadState.none:
                        if (compareAndMoveBuffer(buffer, ref i, bufLen, "HEADERSTART"))
                        {
                            state   = FileReadState.inhead;
                            okToken = true;
                        }
                        break;

                    case FileReadState.inhead:
                        if (compareAndMoveBuffer(buffer, ref i, bufLen, "BINARY"))
                        {
                            m_FileHead.isBinary = true;
                            okToken             = true;
                        }
                        else if (compareAndMoveBuffer(buffer, ref i, bufLen, "ASCII"))
                        {
                            m_FileHead.isBinary = false;
                            okToken             = true;
                            break;
                        }
                        else if (compareAndMoveBuffer(buffer, ref i, bufLen, "LAYERS/"))
                        {
                            m_FileHead.layers = readIntAndMove(buffer, ref i, bufLen);
                            okToken           = true;
                        }
                        else if (compareAndMoveBuffer(buffer, ref i, bufLen, "UNITS/"))
                        {
                            m_FileHead.unit = (float)readRealAndMove(buffer, ref i, bufLen);
                            okToken         = true;
                        }
                        else if (compareAndMoveBuffer(buffer, ref i, bufLen, "VERSION/"))
                        {
                            m_FileHead.version = readIntAndMove(buffer, ref i, bufLen);
                            okToken            = true;
                        }
                        else if (compareAndMoveBuffer(buffer, ref i, bufLen, "DIMENSION/"))
                        {
                            m_FileHead.d_x1 = readRealAndMove(buffer, ref i, bufLen);
                            if ((buffer[i] != ','))
                            {
                                break;
                            }
                            i++;                                   //- trennzeichen dazwischen
                            m_FileHead.d_y1 = readRealAndMove(buffer, ref i, bufLen);
                            if ((buffer[i] != ','))
                            {
                                break;
                            }
                            i++;                                   //- trennzeichen dazwischen
                            m_FileHead.d_z1 = readRealAndMove(buffer, ref i, bufLen);
                            if ((buffer[i] != ','))
                            {
                                break;
                            }
                            i++;                                   //- trennzeichen dazwischen
                            m_FileHead.d_x2 = readRealAndMove(buffer, ref i, bufLen);
                            if ((buffer[i] != ','))
                            {
                                break;
                            }
                            i++;                                   //- trennzeichen dazwischen
                            m_FileHead.d_y2 = readRealAndMove(buffer, ref i, bufLen);
                            if ((buffer[i] != ','))
                            {
                                break;
                            }
                            i++;                                   //- trennzeichen dazwischen
                            m_FileHead.d_z2 = readRealAndMove(buffer, ref i, bufLen);

                            okToken = true;
                        }
                        else if (compareAndMoveBuffer(buffer, ref i, bufLen, "DATE/"))
                        {
                            m_FileHead.fileDate = readIntAndMove(buffer, ref i, bufLen);

                            okToken = true;
                        }
                        else if (compareAndMoveBuffer(buffer, ref i, bufLen, "LABEL/"))
                        {
                            //- id: Identifier to allow more than one model information in one file. For every id used in the commands start polyline (short/long/ASCII) and start hatches (short/long/ASCII) there shall be one command $$LABEL. Each id causes the building-process to build a different part.
                            readIntAndMove(buffer, ref i, bufLen);

                            //- trennzeichen dazwischen
                            if ((buffer[i] != ','))
                            {
                                break;
                            }
                            i++;


                            //- text: An ASCII string that gives some comment on the part.
                            readStrAndMove(buffer, ref i, bufLen);

                            okToken = true;
                        }
                        else if (compareAndMoveBuffer(buffer, ref i, bufLen, "ALIGN"))
                        {
                            m_FileHead.align = true;
                            okToken          = true;
                        }
                        else if (compareAndMoveBuffer(buffer, ref i, bufLen, "HEADEREND"))
                        {
                            m_FileHead.dataOffset = i;
                            state = FileReadState.afterhead;
                            return(true);
                        }

                        break;
                    }

                    if (!okToken)
                    {
                        m_error.addError("Unknown token in file at pos: " + i);
                    }
                }
                else //- unbekannte Zeichenfolge
                {
                    if ((buffer[i] != ' ') && (buffer[i] != 9) && (buffer[i] != 10) && (buffer[i] != 13))
                    {
                        m_error.addError("Unknown char in file at pos: " + i);
                    }
                }
            }

            return(false);
        }