LumiSoft.Net.Dns.Client.Dns_Client.ParseAnswers C# (CSharp) Method

ParseAnswers() private method

Parses specified count of answers from query.
private ParseAnswers ( byte reply, int answerCount, int &offset ) : ArrayList
reply byte Server returned query.
answerCount int Number of answers to parse.
offset int Position from where to start parsing answers.
return System.Collections.ArrayList
        private ArrayList ParseAnswers(byte[] reply,int answerCount,ref int offset)
        {
            /* RFC 1035 4.1.3. Resource record format

                                           1  1  1  1  1  1
             0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
            +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
            |                                               |
            /                                               /
            /                      NAME                     /
            |                                               |
            +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
            |                      TYPE                     |
            +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
            |                     CLASS                     |
            +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
            |                      TTL                      |
            |                                               |
            +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
            |                   RDLENGTH                    |
            +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
            /                     RDATA                     /
            /                                               /
            +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
            */

            ArrayList answers = new ArrayList();
            //---- Start parsing aswers ------------------------------------------------------------------//
            for(int i=0;i<answerCount;i++){
                string name = "";
                if(!GetQName(reply,ref offset,ref name)){
                    throw new Exception("Error parisng anser");
                }

                int type     = reply[offset++] << 8  | reply[offset++];
                int rdClass  = reply[offset++] << 8  | reply[offset++];
                int ttl      = reply[offset++] << 24 | reply[offset++] << 16 | reply[offset++] << 8  | reply[offset++];
                int rdLength = reply[offset++] << 8  | reply[offset++];

                object answerObj = null;
                switch((QTYPE)type)
                {
                    case QTYPE.A:
                        answerObj = ParseARecord(reply,ref offset,rdLength,ttl);
                        offset += rdLength;
                        break;

                    case QTYPE.NS:
                        answerObj = ParseNSRecord(reply,ref offset,rdLength,ttl);
                    //	pos += rdLength;
                        break;

                    case QTYPE.CNAME:
                        answerObj = ParseCNAMERecord(reply,ref offset,rdLength,ttl);
                    //	offset += rdLength;
                        break;

                    case QTYPE.SOA:
                        answerObj = ParseSOARecord(reply,ref offset,rdLength,ttl);
                    //	offset += rdLength;
                        break;

                    case QTYPE.PTR:
                        answerObj = ParsePTRRecord(reply,ref offset,rdLength,ttl);
                    //	offset += rdLength;
                        break;

                    case QTYPE.HINFO:
                        answerObj = ParseHINFORecord(reply,ref offset,rdLength,ttl);
                    //	offset += rdLength;
                        break;

                    case QTYPE.MX:
                        answerObj = ParseMxRecord(reply,ref offset,ttl);
                        break;

                    case QTYPE.TXT:
                        answerObj = ParseTXTRecord(reply,ref offset,rdLength,ttl);
                        offset += rdLength;
                        break;

                    case QTYPE.AAAA:
                        answerObj = ParseAAAARecord(reply,ref offset,rdLength,ttl);
                        offset += rdLength;
                        break;

                    default:
                        answerObj = "dummy"; // Dummy place holder for now
                        offset += rdLength;
                        break;
                }

                // Add answer to answer list
                answers.Add(answerObj);
            }

            return answers;
        }