Home | History | Annotate | Download | only in prototype
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CLOUD_PRINT_GCP20_PROTOTYPE_DNS_SD_SERVER_H_
      6 #define CLOUD_PRINT_GCP20_PROTOTYPE_DNS_SD_SERVER_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "base/memory/weak_ptr.h"
     14 #include "cloud_print/gcp20/prototype/service_parameters.h"
     15 #include "net/base/ip_endpoint.h"
     16 #include "net/udp/udp_socket.h"
     17 
     18 namespace net {
     19 
     20 class IOBufferWithSize;
     21 
     22 }  // namespace net
     23 
     24 struct DnsQueryRecord;
     25 class DnsResponseBuilder;
     26 
     27 // Class for sending multicast announcements, receiving queries and answering on
     28 // them.
     29 // TODO(maksymb): Implement probing.
     30 class DnsSdServer : public base::SupportsWeakPtr<DnsSdServer> {
     31  public:
     32   // Constructor does not start server.
     33   DnsSdServer();
     34 
     35   // Stops the server and destroys the object.
     36   ~DnsSdServer();
     37 
     38   // Starts the server. Returns |true| if server works. Also sends
     39   // announcement.
     40   bool Start(const ServiceParameters& serv_params,
     41              uint32 full_ttl,
     42              const std::vector<std::string>& metadata) WARN_UNUSED_RESULT;
     43 
     44   // Sends announcement if server works.
     45   void Update();
     46 
     47   // Stops server with announcement.
     48   void Shutdown();
     49 
     50   // Returns |true| if server works.
     51   bool IsOnline() { return !!socket_; }
     52 
     53   // Updates data for TXT respond.
     54   void UpdateMetadata(const std::vector<std::string>& metadata);
     55 
     56  private:
     57   // Binds a socket to multicast address. Returns |true| on success.
     58   bool CreateSocket();
     59 
     60   // Processes single query.
     61   void ProccessQuery(uint32 current_ttl,
     62                      const DnsQueryRecord& query,
     63                      DnsResponseBuilder* builder) const;
     64 
     65   // Processes DNS message.
     66   void ProcessMessage(int len, net::IOBufferWithSize* buf);
     67 
     68   // CompletionCallback for receiving data from DNS.
     69   void DoLoop(int rv);
     70 
     71   // Function to start listening to socket (delegate to DoLoop function).
     72   void OnDatagramReceived();
     73 
     74   // Sends announcement.
     75   void SendAnnouncement(uint32 ttl);
     76 
     77   // Calculates and returns current TTL (with accordance to last send
     78   // announcement time.
     79   uint32 GetCurrentTLL() const;
     80 
     81   // Stores socket to multicast address.
     82   scoped_ptr<net::UDPSocket> socket_;
     83 
     84   // Stores multicast address end point.
     85   net::IPEndPoint multicast_address_;
     86 
     87   // Stores time until last announcement is live.
     88   base::Time time_until_live_;
     89 
     90   // Stores service parameters (like service-name and service-type etc.)
     91   ServiceParameters serv_params_;
     92 
     93   // Stores the buffer for receiving messages.
     94   scoped_refptr<net::IOBufferWithSize> recv_buf_;
     95 
     96   // Stores address from where last message was sent.
     97   net::IPEndPoint recv_address_;
     98 
     99   // Stores information for TXT respond.
    100   std::vector<std::string> metadata_;
    101 
    102   // TTL for announcements
    103   uint32 full_ttl_;
    104 
    105   DISALLOW_COPY_AND_ASSIGN(DnsSdServer);
    106 };
    107 
    108 #endif  // CLOUD_PRINT_GCP20_PROTOTYPE_DNS_SD_SERVER_H_
    109 
    110