Source code

Revision control

Other Tools

1
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim:set ts=2 sw=2 sts=2 et cindent: */
3
/* This Source Code Form is subject to the terms of the Mozilla Public
4
* License, v. 2.0. If a copy of the MPL was not distributed with this
5
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
#if !defined(nsMediaFragmentURIParser_h__)
7
# define nsMediaFragmentURIParser_h__
8
9
# include "mozilla/Maybe.h"
10
# include "nsStringFwd.h"
11
# include "nsRect.h"
12
13
class nsIURI;
14
15
// Class to handle parsing of a W3C media fragment URI as per
17
// Only the temporaral URI portion of the spec is implemented.
18
// To use:
19
// a) Construct an instance with the URI containing the fragment
20
// b) Check for the validity of the values you are interested in
21
// using e.g. HasStartTime().
22
// c) If the values are valid, obtain them using e.g. GetStartTime().
23
24
namespace mozilla {
25
namespace net {
26
27
enum ClipUnit {
28
eClipUnit_Pixel,
29
eClipUnit_Percent,
30
};
31
32
class nsMediaFragmentURIParser {
33
public:
34
// Create a parser with the provided URI.
35
explicit nsMediaFragmentURIParser(nsIURI* aURI);
36
37
// Create a parser with the provided URI reference portion.
38
explicit nsMediaFragmentURIParser(nsCString& aRef);
39
40
// True if a valid temporal media fragment indicated a start time.
41
bool HasStartTime() const { return mStart.isSome(); }
42
43
// If a valid temporal media fragment indicated a start time, returns
44
// it in units of seconds. If not, defaults to 0.
45
double GetStartTime() const { return *mStart; }
46
47
// True if a valid temporal media fragment indicated an end time.
48
bool HasEndTime() const { return mEnd.isSome(); }
49
50
// If a valid temporal media fragment indicated an end time, returns
51
// it in units of seconds. If not, defaults to -1.
52
double GetEndTime() const { return *mEnd; }
53
54
// True if a valid spatial media fragment indicated a clipping region.
55
bool HasClip() const { return mClip.isSome(); }
56
57
// If a valid spatial media fragment indicated a clipping region,
58
// returns the region. If not, returns an empty region. The unit
59
// used depends on the value returned by GetClipUnit().
60
nsIntRect GetClip() const { return *mClip; }
61
62
// If a valid spatial media fragment indicated a clipping region,
63
// returns the unit used.
64
ClipUnit GetClipUnit() const { return mClipUnit; }
65
66
private:
67
// Parse the URI ref provided, looking for media fragments. This is
68
// the top-level parser the invokes the others below.
69
void Parse(nsACString& aRef);
70
71
// The following methods parse the fragment as per the media
72
// fragments specification. 'aString' contains the remaining
73
// fragment data to be parsed. The method returns true
74
// if the parse was successful and leaves the remaining unparsed
75
// data in 'aString'. If the parse fails then false is returned
76
// and 'aString' is left as it was when called.
77
bool ParseNPT(nsDependentSubstring aString);
78
bool ParseNPTTime(nsDependentSubstring& aString, double& aTime);
79
bool ParseNPTSec(nsDependentSubstring& aString, double& aSec);
80
bool ParseNPTFraction(nsDependentSubstring& aString, double& aFraction);
81
bool ParseNPTMMSS(nsDependentSubstring& aString, double& aTime);
82
bool ParseNPTHHMMSS(nsDependentSubstring& aString, double& aTime);
83
bool ParseNPTHH(nsDependentSubstring& aString, uint32_t& aHour);
84
bool ParseNPTMM(nsDependentSubstring& aString, uint32_t& aMinute);
85
bool ParseNPTSS(nsDependentSubstring& aString, uint32_t& aSecond);
86
bool ParseXYWH(nsDependentSubstring aString);
87
bool ParseMozResolution(nsDependentSubstring aString);
88
89
// Media fragment information.
90
Maybe<double> mStart;
91
Maybe<double> mEnd;
92
Maybe<nsIntRect> mClip;
93
ClipUnit mClipUnit;
94
};
95
96
} // namespace net
97
} // namespace mozilla
98
99
#endif