blob: 61546e749fc5bae71d5b81122467b505f6eb51d3 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MEDIA_FORMATS_HLS_VARIABLE_DICTIONARY_H_
#define MEDIA_FORMATS_HLS_VARIABLE_DICTIONARY_H_
#include <list>
#include <string>
#include "base/strings/string_piece.h"
#include "base/types/pass_key.h"
#include "media/base/media_export.h"
#include "media/formats/hls/parse_status.h"
#include "media/formats/hls/source_string.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace media::hls {
namespace types {
class VariableName;
}
class MEDIA_EXPORT VariableDictionary {
public:
class MEDIA_EXPORT SubstitutionBuffer {
public:
friend VariableDictionary;
SubstitutionBuffer();
~SubstitutionBuffer();
SubstitutionBuffer(const SubstitutionBuffer&) = delete;
SubstitutionBuffer(const SubstitutionBuffer&&) = delete;
SubstitutionBuffer& operator=(const SubstitutionBuffer&) = delete;
SubstitutionBuffer& operator=(SubstitutionBuffer&&) = delete;
private:
std::list<std::string> strings_;
};
VariableDictionary();
~VariableDictionary();
VariableDictionary(VariableDictionary&&);
VariableDictionary& operator=(VariableDictionary&&);
// Attempts to find the value of the given variable in this dictionary.
// The returned `base::StringPiece` must not outlive this
// `VariableDictionary`.
absl::optional<base::StringPiece> Find(types::VariableName name) const&;
absl::optional<base::StringPiece> Find(types::VariableName name) const&& =
delete;
// Attempts to define the variable `name` with the given value. If the
// definition already exists, returns `false` without modifying the
// dictionary.
bool Insert(types::VariableName name, std::string value);
// Attempts to resolve all variable references within the given input string
// using this dictionary, returning a `ResolvedSourceString` with the fully
// resolved string, or an error if one occurred. `buffer` will be used to
// build the resulting string if any substitutions occur, and the caller must
// ensure that it outlives the `ResolvedSourceString` returned by this
// function. As an optimization, the buffer will not be used if no
// substitutions are necessary, or if the substitution consisted of the entire
// input string.
//
// This implementation is based on a somewhat pedantic interpretation of the
// spec:
//
// A Variable Reference is a string of the form "{$" (0x7B,0x24) followed
// by a Variable Name followed by "}" (0x7D).
//
// If a given sequence doesn't exactly match that format then it's ignored,
// rather than treated as an error. However, if it does match that format and
// the variable name is undefined, it's treated as an error.
ParseStatus::Or<ResolvedSourceString> Resolve(
SourceString input,
SubstitutionBuffer& buffer) const;
private:
base::flat_map<std::string, std::unique_ptr<std::string>> entries_;
};
} // namespace media::hls
#endif // MEDIA_FORMATS_HLS_VARIABLE_DICTIONARY_H_