1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file.
4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef CLOUD_PRINT_GCP20_PROTOTYPE_DNS_SD_SERVER_H_
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define CLOUD_PRINT_GCP20_PROTOTYPE_DNS_SD_SERVER_H_
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <string>
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <vector>
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/basictypes.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/scoped_ptr.h"
13a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/memory/weak_ptr.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cloud_print/gcp20/prototype/service_parameters.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/ip_endpoint.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/udp/udp_socket.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace net {
19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass IOBufferWithSize;
21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
22ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // namespace net
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstruct DnsQueryRecord;
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass DnsResponseBuilder;
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Class for sending multicast announcements, receiving queries and answering on
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// them.
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// TODO(maksymb): Implement probing.
30a3f7b4e666c476898878fa745f637129375cd889Ben Murdochclass DnsSdServer : public base::SupportsWeakPtr<DnsSdServer> {
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Constructor does not start server.
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DnsSdServer();
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Stops the server and destroys the object.
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ~DnsSdServer();
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Starts the server. Returns |true| if server works. Also sends
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // announcement.
40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  bool Start(const ServiceParameters& serv_params,
41558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch             uint32 full_ttl,
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch             const std::vector<std::string>& metadata) WARN_UNUSED_RESULT;
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Sends announcement if server works.
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void Update();
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Stops server with announcement.
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void Shutdown();
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Returns |true| if server works.
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool IsOnline() { return !!socket_; }
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Updates data for TXT respond.
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void UpdateMetadata(const std::vector<std::string>& metadata);
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Binds a socket to multicast address. Returns |true| on success.
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool CreateSocket();
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Processes single query.
61558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  void ProccessQuery(uint32 current_ttl,
62558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                     const DnsQueryRecord& query,
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                     DnsResponseBuilder* builder) const;
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Processes DNS message.
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void ProcessMessage(int len, net::IOBufferWithSize* buf);
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // CompletionCallback for receiving data from DNS.
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void DoLoop(int rv);
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Function to start listening to socket (delegate to DoLoop function).
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnDatagramReceived();
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Sends announcement.
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void SendAnnouncement(uint32 ttl);
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Calculates and returns current TTL (with accordance to last send
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // announcement time.
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  uint32 GetCurrentTLL() const;
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Stores socket to multicast address.
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<net::UDPSocket> socket_;
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Stores multicast address end point.
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  net::IPEndPoint multicast_address_;
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Stores time until last announcement is live.
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::Time time_until_live_;
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Stores service parameters (like service-name and service-type etc.)
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ServiceParameters serv_params_;
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Stores the buffer for receiving messages.
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_refptr<net::IOBufferWithSize> recv_buf_;
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Stores address from where last message was sent.
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  net::IPEndPoint recv_address_;
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Stores information for TXT respond.
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<std::string> metadata_;
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // TTL for announcements
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  uint32 full_ttl_;
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DnsSdServer);
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // CLOUD_PRINT_GCP20_PROTOTYPE_DNS_SD_SERVER_H_
109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
110