| Index: cloud_print/gcp20/prototype/dns_sd_server.h
|
| diff --git a/cloud_print/gcp20/prototype/dns_sd_server.h b/cloud_print/gcp20/prototype/dns_sd_server.h
|
| index 9c8ed96b7d33d62790d7797dc061f5b963911f2f..0396a5ef5af5468ddf0ddd93b33b16522c023367 100644
|
| --- a/cloud_print/gcp20/prototype/dns_sd_server.h
|
| +++ b/cloud_print/gcp20/prototype/dns_sd_server.h
|
| @@ -2,27 +2,69 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#ifndef GCP20_PROTOTYPE_DNS_SD_H_
|
| -#define GCP20_PROTOTYPE_DNS_SD_H_
|
| +#ifndef CLOUD_PRINT_GCP20_PROTOTYPE_DNS_SD_SERVER_H_
|
| +#define CLOUD_PRINT_GCP20_PROTOTYPE_DNS_SD_SERVER_H_
|
|
|
| +#include <string>
|
| #include <vector>
|
|
|
| +#include "cloud_print/gcp20/prototype/dns_packet_parser.h"
|
| #include "net/dns/dns_protocol.h"
|
| #include "net/udp/udp_socket.h"
|
|
|
| +// Interface for building service-specified responses.
|
| +class DnsResponseBuilderInterface {
|
| + public:
|
| + // Destroys builder.
|
| + virtual ~DnsResponseBuilderInterface() {}
|
| +
|
| + // Returns |true| if packet is not empty.
|
| + virtual int HaveAnswers() const = 0;
|
| +
|
| + // Methods for checking accordance |qname| to different types of queries.
|
| + virtual bool IsSamePtr(const std::string& qname) = 0;
|
| + virtual bool IsSameSrv(const std::string& qname) = 0;
|
| + virtual bool IsSameA(const std::string& qname) = 0;
|
| + virtual bool IsSameTxt(const std::string& qname) = 0;
|
| +
|
| + // Methods for appending different types of responses to packet.
|
| + virtual void AppendPtr(uint32 ttl) = 0;
|
| + virtual void AppendSrv(uint32 ttl) = 0;
|
| + virtual void AppendA(uint32 ttl) = 0;
|
| + virtual void AppendTxt(uint32 ttl) = 0;
|
| +
|
| + // Serializes packet to byte sequence.
|
| + virtual scoped_refptr<net::IOBufferWithSize> Build() const = 0;
|
| +
|
| + // Builds DNS packet for announcement with certain TTL.
|
| + virtual scoped_refptr<net::IOBufferWithSize>
|
| + BuildAnnouncement(uint32 ttl) = 0;
|
| +};
|
| +
|
| +// Factory for builders.
|
| +class DnsResponseBuilderFactoryInterface {
|
| + public:
|
| + virtual ~DnsResponseBuilderFactoryInterface() {}
|
| +
|
| + // Creates new builder.
|
| + virtual DnsResponseBuilderInterface* Create(uint16 id) = 0;
|
| +};
|
| +
|
| // Class for sending multicast announcements, receiving queries and answering on
|
| // them. Client should call |ProccessMessages| periodically to make server work.
|
| +// TODO(maksymb): Implement probing.
|
| class DnsSdServer {
|
| public:
|
| - // Constructs unstarted server.
|
| + // Constructs not started server.
|
| DnsSdServer();
|
|
|
| // Stops server.
|
| - ~DnsSdServer();
|
| + virtual ~DnsSdServer();
|
|
|
| // Starts the server. Returns |true| if server works. Also sends
|
| // announcement.
|
| - bool Start();
|
| + bool Start(DnsResponseBuilderFactoryInterface* response_builder_factory,
|
| + uint32 full_ttl) WARN_UNUSED_RESULT;
|
|
|
| // Sends announcement if server works.
|
| void Update();
|
| @@ -30,9 +72,6 @@ class DnsSdServer {
|
| // Stops server with announcement.
|
| void Shutdown();
|
|
|
| - // Process pending queries for the server.
|
| - void ProcessMessages();
|
| -
|
| // Returns |true| if server works.
|
| bool is_online() { return is_online_; }
|
|
|
| @@ -40,11 +79,28 @@ class DnsSdServer {
|
| // Binds a socket to multicast address. Returns |true| on success.
|
| bool CreateSocket();
|
|
|
| + // Processes DNS message.
|
| + void ProcessMessage(int len, net::IOBufferWithSize* buf);
|
| +
|
| + // Template method for parsing packet. Returns NULL if there is no answer for
|
| + // these packet.
|
| + scoped_refptr<net::IOBufferWithSize> CreateResponsePacket(
|
| + const net::dns_protocol::Header& header,
|
| + DnsPacketParser* parser) const;
|
| +
|
| + // CompletionCallback for receiving data from DNS.
|
| + void DoLoop(int rv);
|
| +
|
| + // Function to start listening to socket (delegate to DoLoop function).
|
| + void OnDatagramReceived();
|
| +
|
| // Sends announcement.
|
| void SendAnnouncement(uint32 ttl);
|
|
|
| - // Returns |true| if server received some questions.
|
| - bool CheckPendingQueries();
|
| + scoped_refptr<net::IOBufferWithSize> BuildAnnouncement(uint32 ttl) const;
|
| +
|
| + // Work with incoming message and call |CheckPendingQueries| again.
|
| + void OnReceiveMessage(int val);
|
|
|
| // Stores |true| if server was started.
|
| bool is_online_;
|
| @@ -55,8 +111,23 @@ class DnsSdServer {
|
| // Stores multicast address end point.
|
| net::IPEndPoint multicast_address_;
|
|
|
| + // Stores time until last announcement is live.
|
| + base::Time time_until_live_;
|
| +
|
| + // Service-specified response builder factory.
|
| + DnsResponseBuilderFactoryInterface* response_builder_factory_;
|
| +
|
| + // Stores the buffer for receiving messages.
|
| + scoped_refptr<net::IOBufferWithSize> recv_buf_;
|
| +
|
| + // Stores address from where last message was sent.
|
| + net::IPEndPoint recv_address_;
|
| +
|
| + // TTL for announcements
|
| + uint32 full_ttl_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(DnsSdServer);
|
| };
|
|
|
| -#endif // GCP20_PROTOTYPE_DNS_SD_H_
|
| +#endif // CLOUD_PRINT_GCP20_PROTOTYPE_DNS_SD_SERVER_H_
|
|
|
|
|