a00113da80250100fa7917d0ec5c62d8c93fdf2f
[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         // When the current connection was initiated. -1 if we are not currently connected.
36         time_t connect_time;
37
38         // TODO: Number of loss events might both be useful,
39         // similar to for clients. Also, per-connection byte counters.
40 };
41
42 class Input : public Thread {
43 public:
44         virtual ~Input();
45         virtual InputProto serialize() const = 0;
46         virtual std::string get_url() const = 0;
47         virtual void close_socket() = 0;
48         virtual void add_destination(int stream_index) = 0;
49
50         // Note: May be called from a different thread, so must be thread-safe.
51         virtual InputStats get_stats() const = 0;
52 };
53
54 #endif  // !defined(_INPUT_H)