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 : /* ***** BEGIN LICENSE BLOCK *****
4 : * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5 : *
6 : * The contents of this file are subject to the Mozilla Public License Version
7 : * 1.1 (the "License"); you may not use this file except in compliance with
8 : * the License. You may obtain a copy of the License at
9 : * http://www.mozilla.org/MPL/
10 : *
11 : * Software distributed under the License is distributed on an "AS IS" basis,
12 : * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13 : * for the specific language governing rights and limitations under the
14 : * License.
15 : *
16 : * The Original Code is the media fragment URI parser.
17 : *
18 : * The Initial Developer of the Original Code is the Mozilla Foundation.
19 : * Portions created by the Initial Developer are Copyright (C) 2011
20 : * the Initial Developer. All Rights Reserved.
21 : *
22 : * Contributor(s):
23 : * Chris Double <chris.double@double.co.nz>
24 : *
25 : * Alternatively, the contents of this file may be used under the terms of
26 : * either the GNU General Public License Version 2 or later (the "GPL"), or
27 : * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
28 : * in which case the provisions of the GPL or the LGPL are applicable instead
29 : * of those above. If you wish to allow use of your version of this file only
30 : * under the terms of either the GPL or the LGPL, and not to allow others to
31 : * use your version of this file under the terms of the MPL, indicate your
32 : * decision by deleting the provisions above and replace them with the notice
33 : * and other provisions required by the GPL or the LGPL. If you do not delete
34 : * the provisions above, a recipient may use your version of this file under
35 : * the terms of any one of the MPL, the GPL or the LGPL.
36 : *
37 : * ***** END LICENSE BLOCK ***** */
38 : #if !defined(nsMediaFragmentURIParser_h__)
39 : #define nsMediaFragmentURIParser_h__
40 :
41 : #include "nsString.h"
42 : #include "nsTArray.h"
43 :
44 : // Class to handle parsing of a W3C media fragment URI as per
45 : // spec at: http://www.w3.org/TR/media-frags/
46 : // Only the temporaral URI portion of the spec is implemented.
47 : // To use:
48 : // a) Construct an instance with the URI containing the fragment
49 : // b) Call Parse() method to parse the fragment
50 : // c) Use GetStartTime() and GetEndTime() to get the start/end
51 : // times from any temporal fragment included in the URI.
52 : class nsMediaFragmentURIParser
53 0 : {
54 : struct Pair
55 0 : {
56 0 : Pair(const nsAString& aName, const nsAString& aValue) :
57 0 : mName(aName), mValue(aValue) { }
58 :
59 : nsString mName;
60 : nsString mValue;
61 : };
62 :
63 : public:
64 : // Create a parser, with the URL including fragment identifier
65 : // in 'aSpec'.
66 : nsMediaFragmentURIParser(const nsCString& aSpec);
67 :
68 : // Parse the URI fragment included in the URI that was passed
69 : // on construction.
70 : void Parse();
71 :
72 : // Return the start time in seconds obtained from the URI
73 : // fragment. If no start time or no valid temporal fragment
74 : // exists then 0 is returned.
75 : double GetStartTime();
76 :
77 : // Return the end time in seconds obtained from the URI
78 : // fragment. If no end time or no valid temporal fragment
79 : // exists then -1 is returned.
80 : double GetEndTime();
81 :
82 : private:
83 : // The following methods parse the fragment as per the media
84 : // fragments specification. 'aString' contains the remaining
85 : // fragment data to be parsed. The method returns true
86 : // if the parse was successful and leaves the remaining unparsed
87 : // data in 'aString'. If the parse fails then false is returned
88 : // and 'aString' is left as it was when called.
89 : bool ParseNPT(nsDependentSubstring& aString, double& aStart, double& aEnd);
90 : bool ParseNPTTime(nsDependentSubstring& aString, double& aTime);
91 : bool ParseNPTSec(nsDependentSubstring& aString, double& aSec);
92 : bool ParseNPTFraction(nsDependentSubstring& aString, double& aFraction);
93 : bool ParseNPTMMSS(nsDependentSubstring& aString, double& aTime);
94 : bool ParseNPTHHMMSS(nsDependentSubstring& aString, double& aTime);
95 : bool ParseNPTHH(nsDependentSubstring& aString, PRUint32& aHour);
96 : bool ParseNPTMM(nsDependentSubstring& aString, PRUint32& aMinute);
97 : bool ParseNPTSS(nsDependentSubstring& aString, PRUint32& aSecond);
98 :
99 : // Fragment portion of the URI given on construction
100 : nsCAutoString mHash;
101 :
102 : // An array of name/value pairs containing the media fragments
103 : // parsed from the URI.
104 : nsTArray<Pair> mFragments;
105 : };
106 :
107 : #endif
|