26
26
internal class Rygel.HTTPTimeSeek : Rygel.HTTPSeek {
27
// FIXME: We are only accepting time range in this format:
29
// TimeSeekRange.dlna.org : npt=417.33-779.09
33
// TimeSeekRange.dlna.org : npt=10:19:25.7-13:23:33.6
34
27
public HTTPTimeSeek (HTTPGet request) throws HTTPSeekError {
36
29
string[] range_tokens;
38
31
int64 duration = (request.item as AudioItem).duration * SECOND;
39
32
int64 stop = duration - MSECOND;
33
int64 parsed_value = 0;
34
bool parsing_start = true;
41
36
range = request.msg.request_headers.get_one ("TimeSeekRange.dlna.org");
42
38
if (range != null) {
43
39
if (!range.has_prefix ("npt=")) {
44
40
throw new HTTPSeekError.INVALID_RANGE ("Invalid Range '%s'",
48
44
range_tokens = range.substring (4).split ("-", 2);
49
if (range_tokens[0] == null || range_tokens[1] == null) {
50
throw new HTTPSeekError.INVALID_RANGE (_("Invalid Range '%s'"),
55
time = range_tokens[0];
56
if (time[0].isdigit ()) {
57
start = (int64) (double.parse (time) * SECOND);
58
} else if (time != "") {
59
throw new HTTPSeekError.INVALID_RANGE (_("Invalid Range '%s'"),
64
time = range_tokens[1];
65
if (time[0].isdigit()) {
66
stop = (int64) (double.parse (time) * SECOND);
68
throw new HTTPSeekError.INVALID_RANGE
69
(_("Invalid Range '%s'"), range);
71
} else if (time != "") {
72
throw new HTTPSeekError.INVALID_RANGE (_("Invalid Range '%s'"),
45
if (range_tokens[0] == null ||
46
// Start token of the range must be provided
47
range_tokens[0] == "" ||
48
range_tokens[1] == null) {
49
throw new HTTPSeekError.INVALID_RANGE (_("Invalid Range '%s'"),
53
foreach (string range_token in range_tokens) {
54
if (range_token == "") {
58
if (range_token.index_of (":") == -1) {
59
if (!parse_seconds (range_token, ref parsed_value)) {
60
throw new HTTPSeekError.INVALID_RANGE
61
(_("Invalid Range '%s'"),
65
if (!parse_time (range_token,
67
throw new HTTPSeekError.INVALID_RANGE
68
(_("Invalid Range '%s'"),
74
parsing_start = false;
82
throw new HTTPSeekError.INVALID_RANGE
83
(_("Invalid Range '%s'"),
108
119
this.msg.response_headers.append ("TimeSeekRange.dlna.org", range);
122
// Parses npt times in the format of '417.33'
123
private static bool parse_seconds (string range_token,
125
if (range_token[0].isdigit ()) {
126
value = (int64) (double.parse (range_token) * SECOND);
133
// Parses npt times in the format of '10:19:25.7'
134
private static bool parse_time (string range_token,
136
int64 seconds_sum = 0;
138
string[] time_tokens;
143
time_tokens = range_token.split (":", 3);
144
if (time_tokens[0] == null ||
145
time_tokens[1] == null ||
146
time_tokens[2] == null) {
150
foreach (string time in time_tokens) {
151
if (time[0].isdigit ()) {
152
seconds_sum += (int64) ((double.parse (time) *
153
SECOND) * time_factor);