1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "cloud_print/gcp20/prototype/dns_packet_parser.h" 6 7#include "base/big_endian.h" 8#include "base/logging.h" 9 10DnsPacketParser::DnsPacketParser(const char* packet, size_t length) 11 : packet_(packet), 12 length_(length), 13 record_parser_(packet, length, sizeof(header_)) { 14 base::BigEndianReader reader(packet, length); 15 is_header_read_ = reader.ReadU16(&header_.id) && 16 reader.ReadU16(&header_.flags) && 17 reader.ReadU16(&header_.qdcount) && 18 reader.ReadU16(&header_.ancount) && 19 reader.ReadU16(&header_.nscount) && 20 reader.ReadU16(&header_.arcount); 21} 22 23bool DnsPacketParser::ReadRecord(DnsQueryRecord* out) { 24 DCHECK(packet_); 25 DnsQueryRecord result; 26 size_t consumed = ReadName(&result.qname); 27 if (!consumed) 28 return false; 29 base::BigEndianReader reader(packet_ + GetOffset() + consumed, 30 length_ - (GetOffset() + consumed)); 31 if (reader.ReadU16(&result.qtype) && reader.ReadU16(&result.qclass) && 32 record_parser_.SkipQuestion()) { // instead of |cur_ = reader.ptr();| 33 *out = result; 34 return true; 35 } 36 37 return false; 38} 39 40