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