Add preliminary support for input stream statistics.
[cubemap] / input.h
1 #ifndef _INPUT_H
2 #define _INPUT_H 1
3
4 #include <string>
5
6 #include "thread.h"
7
8 class Input;
9 class InputProto;
10
11 // Extremely rudimentary URL parsing.
12 bool parse_url(const std::string &url, std::string *protocol, std::string *host, std::string *port, std::string *path);
13
14 // Figure out the right type of input based on the URL, and create a new Input of the right type.
15 // Will return NULL if unknown.
16 Input *create_input(const std::string &url);
17 Input *create_input(const InputProto &serialized);
18
19 // Digested statistics for writing to logs etc.
20 struct InputStats {
21         std::string url;
22
23         // The number of bytes we have received so far, including any Metacube headers.
24         //
25         // Not reset across connections.
26         size_t bytes_received;
27
28         // The number of data bytes we have received so far (or more precisely,
29         // number of data bytes we have sent on to the stream). This excludes Metacube
30         // headers and corrupted data we've skipped.
31         //
32         // Not reset across connections.
33         size_t data_bytes_received;
34
35         // TODO: Number of loss events and connection time might both be useful,
36         // similar to for clients. Also, per-connection byte counters.
37 };
38
39 class Input : public Thread {
40 public:
41         virtual ~Input();
42         virtual InputProto serialize() const = 0;
43         virtual std::string get_url() const = 0;
44         virtual void close_socket() = 0;
45         virtual void add_destination(int stream_index) = 0;
46
47         // Note: May be called from a different thread, so must be thread-safe.
48         virtual InputStats get_stats() const = 0;
49 };
50
51 #endif  // !defined(_INPUT_H)