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