// Copyright (c) 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 NET_DNS_RECORD_PARSED_H_
#define NET_DNS_RECORD_PARSED_H_

#include <stdint.h>

#include <memory>
#include <string>

#include "base/time/time.h"
#include "net/base/net_export.h"

namespace net {

class DnsRecordParser;
class RecordRdata;

// Parsed record. This is a form of DnsResourceRecord where the rdata section
// has been parsed into a data structure.
class NET_EXPORT_PRIVATE RecordParsed {
 public:
  virtual ~RecordParsed();

  // All records are inherently immutable. Return a const pointer.
  static std::unique_ptr<const RecordParsed> CreateFrom(
      DnsRecordParser* parser,
      base::Time time_created);

  const std::string& name() const { return name_; }
  uint16_t type() const { return type_; }
  uint16_t klass() const { return klass_; }
  uint32_t ttl() const { return ttl_; }

  base::Time time_created() const { return time_created_; }

  template <class T> const T* rdata() const {
    if (T::kType != type_)
      return NULL;
    return static_cast<const T*>(rdata_.get());
  }

  // Check if two records have the same data. Ignores time_created and ttl.
  // If |is_mdns| is true, ignore the top bit of the class
  // (the cache flush bit).
  bool IsEqual(const RecordParsed* other, bool is_mdns) const;

 private:
  RecordParsed(const std::string& name,
               uint16_t type,
               uint16_t klass,
               uint32_t ttl,
               std::unique_ptr<const RecordRdata> rdata,
               base::Time time_created);

  std::string name_;  // in dotted form
  const uint16_t type_;
  const uint16_t klass_;
  const uint32_t ttl_;

  const std::unique_ptr<const RecordRdata> rdata_;

  const base::Time time_created_;
};

}  // namespace net

#endif  // NET_DNS_RECORD_PARSED_H_
