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#ifndef CLOUD_PRINT_GCP20_PROTOTYPE_DNS_RESPONSE_BUILDER_H_
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define CLOUD_PRINT_GCP20_PROTOTYPE_DNS_RESPONSE_BUILDER_H_
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <string>
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <vector>
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/basictypes.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/net_util.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/dns/dns_protocol.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace net {
16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass IOBufferWithSize;
18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // namespace net
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Record for storing response data.
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstruct DnsResponseRecord {
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DnsResponseRecord();
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ~DnsResponseRecord();
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string name;  // in dotted form
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  uint16 type;
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  uint16 klass;
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  uint32 ttl;
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string rdata;
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Class for building service-specified responses.
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass DnsResponseBuilder {
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Initializes builder.
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  explicit DnsResponseBuilder(uint16 id);
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Destroys the object.
40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ~DnsResponseBuilder();
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Methods for appending different types of responses to packet.
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void AppendPtr(const std::string& service_type, uint32 ttl,
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 const std::string& service_name);
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void AppendSrv(const std::string& service_name, uint32 ttl, uint16 priority,
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 uint16 weight, uint16 http_port,
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 const std::string& service_domain_name);
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void AppendA(const std::string& service_domain_name, uint32 ttl,
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch               net::IPAddressNumber http_ipv4);
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void AppendTxt(const std::string& service_name, uint32 ttl,
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 const std::vector<std::string>& metadata);
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Serializes packet to byte sequence.
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_refptr<net::IOBufferWithSize> Build();
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Appends response to packet.
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void AddResponse(const std::string& name, uint16 type, uint32 ttl,
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   const std::string& rdata);
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<DnsResponseRecord> responses_;
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Header of response package.
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  net::dns_protocol::Header header_;
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(DnsResponseBuilder);
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // CLOUD_PRINT_GCP20_PROTOTYPE_DNS_RESPONSE_BUILDER_H_
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
71