| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CLOUD_PRINT_GCP20_PROTOTYPE_DNS_PACKET_PARSER_H_ |
| #define CLOUD_PRINT_GCP20_PROTOTYPE_DNS_PACKET_PARSER_H_ |
| |
| #include <string> |
| |
| #include "net/dns/dns_protocol.h" |
| #include "net/dns/dns_response.h" |
| |
| // Parsed response record. |
| struct DnsQueryRecord { |
| DnsQueryRecord() : qtype(0), qclass(0) {} |
| ~DnsQueryRecord() {} |
| |
| std::string qname; // in dotted form |
| uint16 qtype; |
| uint16 qclass; |
| }; |
| |
| // Iterator to walk over records of the DNS response packet. Encapsulates |
| // |DnsRecordParser| object for using its functionality. |
| class DnsPacketParser { |
| public: |
| // Constructs an iterator to process the |packet| of given |length|. |
| DnsPacketParser(const char* packet, size_t length); |
| |
| // Destroys the object. |
| ~DnsPacketParser() {} |
| |
| bool IsValid() const { return record_parser_.IsValid() && is_header_read_; } |
| |
| // Returns |true| if no more bytes remain in the packet. |
| bool AtEnd() const { return record_parser_.AtEnd(); } |
| |
| // Returns header of DNS packet. |
| const net::dns_protocol::Header& header() const { return header_; } |
| |
| // Parses the next query record into |record|. Returns true if succeeded. |
| bool ReadRecord(DnsQueryRecord* record); |
| |
| // Parses the next resource record into |record|. Returns true if succeeded. |
| bool ReadRecord(net::DnsResourceRecord* record) { |
| return record_parser_.ReadRecord(record); |
| } |
| |
| private: |
| // Returns current offset into the packet. |
| size_t GetOffset() const { return record_parser_.GetOffset(); } |
| |
| // Parses a (possibly compressed) DNS name from the packet starting at |
| // |pos|. Stores output (even partial) in |out| unless |out| is NULL. |out| |
| // is stored in the dotted form, e.g., "example.com". Returns number of bytes |
| // consumed or 0 on failure. |
| // This is exposed to allow parsing compressed names within RRDATA for TYPEs |
| // such as NS, CNAME, PTR, MX, SOA. |
| // See RFC 1035 section 4.1.4. |
| unsigned ReadName(std::string* out) const { |
| return record_parser_.ReadName(packet_ + GetOffset(), out); |
| } |
| |
| const char* packet_; |
| size_t length_; |
| |
| // Contents parsed header_; |
| net::dns_protocol::Header header_; |
| bool is_header_read_; |
| |
| // Encapsulated parser. |
| net::DnsRecordParser record_parser_; |
| |
| DISALLOW_COPY_AND_ASSIGN(DnsPacketParser); |
| }; |
| |
| #endif // CLOUD_PRINT_GCP20_PROTOTYPE_DNS_PACKET_PARSER_H_ |
| |