DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Implementation

Mercurial (d38398e5144e)

VCS Links

ClipUnit

nsMediaFragmentURIParser

Macros

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#if !defined(nsMediaFragmentURIParser_h__)
#define nsMediaFragmentURIParser_h__

#include "mozilla/Maybe.h"
#include "nsStringFwd.h"
#include "nsRect.h"

class nsIURI;

// Class to handle parsing of a W3C media fragment URI as per
// spec at: http://www.w3.org/TR/media-frags/
// Only the temporaral URI portion of the spec is implemented.
// To use:
// a) Construct an instance with the URI containing the fragment
// b) Check for the validity of the values you are interested in
//    using e.g. HasStartTime().
// c) If the values are valid, obtain them using e.g. GetStartTime().

namespace mozilla { namespace net {

enum ClipUnit
{
  eClipUnit_Pixel,
  eClipUnit_Percent,
};

class nsMediaFragmentURIParser
{
public:
  // Create a parser with the provided URI.
  explicit nsMediaFragmentURIParser(nsIURI* aURI);

  // Create a parser with the provided URI reference portion.
  explicit nsMediaFragmentURIParser(nsCString& aRef);

  // True if a valid temporal media fragment indicated a start time.
  bool HasStartTime() const { return mStart.isSome(); }

  // If a valid temporal media fragment indicated a start time, returns
  // it in units of seconds. If not, defaults to 0.
  double GetStartTime() const { return *mStart; }

  // True if a valid temporal media fragment indicated an end time.
  bool HasEndTime() const { return mEnd.isSome(); }

  // If a valid temporal media fragment indicated an end time, returns
  // it in units of seconds. If not, defaults to -1.
  double GetEndTime() const { return *mEnd; }

  // True if a valid spatial media fragment indicated a clipping region.
  bool HasClip() const { return mClip.isSome(); }

  // If a valid spatial media fragment indicated a clipping region,
  // returns the region. If not, returns an empty region. The unit
  // used depends on the value returned by GetClipUnit().
  nsIntRect GetClip() const { return *mClip; }

  // If a valid spatial media fragment indicated a clipping region,
  // returns the unit used.
  ClipUnit GetClipUnit() const { return mClipUnit; }

private:
  // Parse the URI ref provided, looking for media fragments. This is
  // the top-level parser the invokes the others below.
  void Parse(nsACString& aRef);

  // The following methods parse the fragment as per the media
  // fragments specification. 'aString' contains the remaining
  // fragment data to be parsed. The method returns true
  // if the parse was successful and leaves the remaining unparsed
  // data in 'aString'. If the parse fails then false is returned
  // and 'aString' is left as it was when called.
  bool ParseNPT(nsDependentSubstring aString);
  bool ParseNPTTime(nsDependentSubstring& aString, double& aTime);
  bool ParseNPTSec(nsDependentSubstring& aString, double& aSec);
  bool ParseNPTFraction(nsDependentSubstring& aString, double& aFraction);
  bool ParseNPTMMSS(nsDependentSubstring& aString, double& aTime);
  bool ParseNPTHHMMSS(nsDependentSubstring& aString, double& aTime);
  bool ParseNPTHH(nsDependentSubstring& aString, uint32_t& aHour);
  bool ParseNPTMM(nsDependentSubstring& aString, uint32_t& aMinute);
  bool ParseNPTSS(nsDependentSubstring& aString, uint32_t& aSecond);
  bool ParseXYWH(nsDependentSubstring aString);
  bool ParseMozResolution(nsDependentSubstring aString);

  // Media fragment information.
  Maybe<double>    mStart;
  Maybe<double>    mEnd;
  Maybe<nsIntRect> mClip;
  ClipUnit         mClipUnit;
};

} // namespace net
} // namespace mozilla

#endif