Tag Parser  9.1.0
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
abstractcontainer.h
Go to the documentation of this file.
1 #ifndef TAG_PARSER_ABSTRACTCONTAINER_H
2 #define TAG_PARSER_ABSTRACTCONTAINER_H
3 
4 #include "./exceptions.h"
5 #include "./settings.h"
6 #include "./tagtarget.h"
7 
8 #include <c++utilities/chrono/datetime.h>
9 #include <c++utilities/chrono/timespan.h>
10 #include <c++utilities/io/binaryreader.h>
11 #include <c++utilities/io/binarywriter.h>
12 
13 #include <iostream>
14 
15 namespace CppUtilities {
16 class BinaryReader;
17 class BinaryWriter;
18 } // namespace CppUtilities
19 
20 namespace TagParser {
21 
22 class Tag;
23 class AbstractTrack;
24 class AbstractChapter;
25 class AbstractAttachment;
26 class Diagnostics;
27 class AbortableProgressFeedback;
28 
30 public:
31  virtual ~AbstractContainer();
32 
33  std::iostream &stream();
34  void setStream(std::iostream &stream);
35  std::uint64_t startOffset() const;
36  CppUtilities::BinaryReader &reader();
37  CppUtilities::BinaryWriter &writer();
38 
39  void parseHeader(Diagnostics &diag);
40  void parseTags(Diagnostics &diag);
41  void parseTracks(Diagnostics &diag);
42  void parseChapters(Diagnostics &diag);
43  void parseAttachments(Diagnostics &diag);
44  void makeFile(Diagnostics &diag, AbortableProgressFeedback &progress);
45 
46  bool isHeaderParsed() const;
47  bool areTagsParsed() const;
48  bool areTracksParsed() const;
49  bool areChaptersParsed() const;
50  bool areAttachmentsParsed() const;
51 
52  virtual Tag *createTag(const TagTarget &target = TagTarget());
53  virtual Tag *tag(std::size_t index);
54  virtual std::size_t tagCount() const;
55  virtual bool removeTag(Tag *tag);
56  virtual void removeAllTags();
57  virtual ElementPosition determineTagPosition(Diagnostics &diag) const;
58 
59  virtual AbstractTrack *track(std::size_t index);
60  virtual std::size_t trackCount() const;
61  virtual bool removeTrack(AbstractTrack *track);
62  virtual void removeAllTracks();
63  virtual bool supportsTrackModifications() const;
64  virtual ElementPosition determineIndexPosition(Diagnostics &diag) const;
65 
66  virtual AbstractChapter *chapter(std::size_t index);
67  virtual std::size_t chapterCount() const;
68 
69  virtual AbstractAttachment *createAttachment();
70  virtual AbstractAttachment *attachment(std::size_t index);
71  virtual std::size_t attachmentCount() const;
72 
73  std::uint64_t version() const;
74  std::uint64_t readVersion() const;
75  const std::string &documentType() const;
76  std::uint64_t doctypeVersion() const;
77  std::uint64_t doctypeReadVersion() const;
78  const std::vector<std::string> &titles() const;
79  void setTitle(const std::string &title, std::size_t segmentIndex = 0);
80  virtual bool supportsTitle() const;
81  virtual std::size_t segmentCount() const;
83  CppUtilities::DateTime creationTime() const;
84  CppUtilities::DateTime modificationTime() const;
85  std::uint32_t timeScale() const;
86 
87  virtual void reset();
88 
89 protected:
90  AbstractContainer(std::iostream &stream, std::uint64_t startOffset);
91 
92  virtual void internalParseHeader(Diagnostics &diag);
93  virtual void internalParseTags(Diagnostics &diag);
94  virtual void internalParseTracks(Diagnostics &diag);
95  virtual void internalParseChapters(Diagnostics &diag);
96  virtual void internalParseAttachments(Diagnostics &diag);
97  virtual void internalMakeFile(Diagnostics &diag, AbortableProgressFeedback &progress);
98 
99  std::uint64_t m_version;
100  std::uint64_t m_readVersion;
101  std::string m_doctype;
102  std::uint64_t m_doctypeVersion;
103  std::uint64_t m_doctypeReadVersion;
104  std::vector<std::string> m_titles;
108  std::uint32_t m_timeScale;
109 
116 
117 private:
118  std::uint64_t m_startOffset;
119  std::iostream *m_stream;
120  CppUtilities::BinaryReader m_reader;
121  CppUtilities::BinaryWriter m_writer;
122 };
123 
127 inline std::iostream &AbstractContainer::stream()
128 {
129  return *m_stream;
130 }
131 
135 inline void AbstractContainer::setStream(std::iostream &stream)
136 {
137  m_stream = &stream;
138  m_reader.setStream(m_stream);
139  m_writer.setStream(m_stream);
140 }
141 
145 inline std::uint64_t AbstractContainer::startOffset() const
146 {
147  return m_startOffset;
148 }
149 
153 inline CppUtilities::BinaryReader &AbstractContainer::reader()
154 {
155  return m_reader;
156 }
157 
161 inline CppUtilities::BinaryWriter &AbstractContainer::writer()
162 {
163  return m_writer;
164 }
165 
170 {
171  return m_headerParsed;
172 }
173 
178 {
179  return m_tagsParsed;
180 }
181 
186 {
187  return m_chaptersParsed;
188 }
189 
194 {
195  return m_attachmentsParsed;
196 }
197 
202 {
203  return m_tracksParsed;
204 }
205 
209 inline std::uint64_t AbstractContainer::version() const
210 {
211  return m_version;
212 }
213 
219 inline std::uint64_t AbstractContainer::readVersion() const
220 {
221  return m_readVersion;
222 }
223 
227 inline const std::string &AbstractContainer::documentType() const
228 {
229  return m_doctype;
230 }
231 
235 inline std::uint64_t AbstractContainer::doctypeVersion() const
236 {
237  return m_doctypeVersion;
238 }
239 
245 inline std::uint64_t AbstractContainer::doctypeReadVersion() const
246 {
247  return m_doctypeReadVersion;
248 }
249 
257 inline const std::vector<std::string> &AbstractContainer::titles() const
258 {
259  return m_titles;
260 }
261 
268 inline void AbstractContainer::setTitle(const std::string &title, std::size_t segmentIndex)
269 {
270  m_titles.at(segmentIndex) = title;
271 }
272 
277 {
278  return m_duration;
279 }
280 
285 {
286  return m_creationTime;
287 }
288 
293 {
294  return m_modificationTime;
295 }
296 
300 inline std::uint32_t AbstractContainer::timeScale() const
301 {
302  return m_timeScale;
303 }
304 
305 } // namespace TagParser
306 
307 #endif // TAG_PARSER_ABSTRACTCONTAINER_H
TagParser::AbstractChapter
The AbstractChapter class parses chapter information.
Definition: abstractchapter.h:15
TagParser::TagDataType::TimeSpan
TagParser::AbstractAttachment
The AbstractAttachment class parses and stores attachment information.
Definition: abstractattachment.h:105
exceptions.h
TagParser::MatroskaTagIds::title
constexpr const TAG_PARSER_EXPORT char * title()
Definition: matroskatagid.h:39
TagParser::AbstractContainer::creationTime
CppUtilities::DateTime creationTime() const
Returns the creation time of the file if known; otherwise the returned date time is null.
Definition: abstractcontainer.h:284
settings.h
TagParser::AbortableProgressFeedback
The AbortableProgressFeedback class provides feedback about an ongoing operation via callbacks....
Definition: progressfeedback.h:186
TagParser::AbstractContainer::m_version
std::uint64_t m_version
Definition: abstractcontainer.h:99
TagParser::AbstractContainer::m_doctypeReadVersion
std::uint64_t m_doctypeReadVersion
Definition: abstractcontainer.h:103
TagParser::AbstractContainer::m_modificationTime
CppUtilities::DateTime m_modificationTime
Definition: abstractcontainer.h:107
TagParser::AbstractContainer::m_doctype
std::string m_doctype
Definition: abstractcontainer.h:101
TagParser::AbstractContainer::areTracksParsed
bool areTracksParsed() const
Returns an indication whether the tracks have been parsed yet.
Definition: abstractcontainer.h:201
TagParser::AbstractContainer::isHeaderParsed
bool isHeaderParsed() const
Returns an indication whether the header has been parsed yet.
Definition: abstractcontainer.h:169
TagParser::Tag
The Tag class is used to store, read and write tag information.
Definition: tag.h:98
TagParser::VorbisCommentIds::version
constexpr const TAG_PARSER_EXPORT char * version()
Definition: vorbiscommentids.h:33
TagParser::Diagnostics
The Diagnostics class is a container for DiagMessage.
Definition: diagnostics.h:156
TagParser::AbstractContainer::doctypeReadVersion
std::uint64_t doctypeReadVersion() const
Returns the document type "read version" if known; otherwise returns 0.
Definition: abstractcontainer.h:245
TagParser
Contains all classes and functions of the TagInfo library.
Definition: aaccodebook.h:10
TagParser::AbstractContainer::m_doctypeVersion
std::uint64_t m_doctypeVersion
Definition: abstractcontainer.h:102
TagParser::AbstractContainer::m_tagsParsed
bool m_tagsParsed
Definition: abstractcontainer.h:111
TagParser::MatroskaTagIds::duration
constexpr const TAG_PARSER_EXPORT char * duration()
Definition: matroskatagid.h:342
TagParser::AbstractContainer::documentType
const std::string & documentType() const
Returns a string that describes the document type if available; otherwise returns an empty string.
Definition: abstractcontainer.h:227
TagParser::AbstractContainer::m_creationTime
CppUtilities::DateTime m_creationTime
Definition: abstractcontainer.h:106
TagParser::AbstractContainer::modificationTime
CppUtilities::DateTime modificationTime() const
Returns the modification time of the file if known; otherwise the returned date time is null.
Definition: abstractcontainer.h:292
TagParser::AbstractContainer::readVersion
std::uint64_t readVersion() const
Returns the "read version" if known; otherwise returns 0.
Definition: abstractcontainer.h:219
TagParser::AbstractContainer::setStream
void setStream(std::iostream &stream)
Sets the related stream.
Definition: abstractcontainer.h:135
TagParser::AbstractContainer::m_tracksParsed
bool m_tracksParsed
Definition: abstractcontainer.h:112
TagParser::AbstractContainer
The AbstractContainer class provides an interface and common functionality to parse and make a certai...
Definition: abstractcontainer.h:29
TagParser::AbstractContainer::setTitle
void setTitle(const std::string &title, std::size_t segmentIndex=0)
Sets the title for the specified segment.
Definition: abstractcontainer.h:268
TagParser::AbstractContainer::m_tracksAltered
bool m_tracksAltered
Definition: abstractcontainer.h:113
CppUtilities
Definition: abstractcontainer.h:15
TagParser::AbstractContainer::m_attachmentsParsed
bool m_attachmentsParsed
Definition: abstractcontainer.h:115
TagParser::AbstractContainer::stream
std::iostream & stream()
Returns the related stream.
Definition: abstractcontainer.h:127
TagParser::AbstractTrack
The AbstractTrack class parses and stores technical information about video, audio and other kinds of...
Definition: abstracttrack.h:39
TagParser::AbstractContainer::areTagsParsed
bool areTagsParsed() const
Returns an indication whether the tags have been parsed yet.
Definition: abstractcontainer.h:177
TagParser::AbstractContainer::titles
const std::vector< std::string > & titles() const
Returns the title(s) of the file.
Definition: abstractcontainer.h:257
TagParser::AbstractContainer::areAttachmentsParsed
bool areAttachmentsParsed() const
Returns an indication whether the attachments have been parsed yet.
Definition: abstractcontainer.h:193
TagParser::AbstractContainer::areChaptersParsed
bool areChaptersParsed() const
Returns an indication whether the chapters have been parsed yet.
Definition: abstractcontainer.h:185
TagParser::AbstractContainer::version
std::uint64_t version() const
Returns the version if known; otherwise returns 0.
Definition: abstractcontainer.h:209
TagParser::TagTarget
The TagTarget class specifies the target of a tag.
Definition: tagtarget.h:20
TagParser::ElementPosition
ElementPosition
Definition: settings.h:13
TagParser::TagDataType::DateTime
TagParser::MatroskaIds::Tag
Definition: matroskaid.h:204
TagParser::AbstractContainer::doctypeVersion
std::uint64_t doctypeVersion() const
Returns the document type version if known; otherwise returns 0.
Definition: abstractcontainer.h:235
TAG_PARSER_EXPORT
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.
tagtarget.h
TagParser::AbstractContainer::reader
CppUtilities::BinaryReader & reader()
Returns the related BinaryReader.
Definition: abstractcontainer.h:153
TagParser::AbstractContainer::m_timeScale
std::uint32_t m_timeScale
Definition: abstractcontainer.h:108
TagParser::AbstractContainer::m_headerParsed
bool m_headerParsed
Definition: abstractcontainer.h:110
TagParser::AbstractContainer::m_duration
CppUtilities::TimeSpan m_duration
Definition: abstractcontainer.h:105
TagParser::AbstractContainer::writer
CppUtilities::BinaryWriter & writer()
Returns the related BinaryWriter.
Definition: abstractcontainer.h:161
TagParser::AbstractContainer::duration
CppUtilities::TimeSpan duration() const
Returns the duration of the file if known; otherwise returns a time span of zero ticks.
Definition: abstractcontainer.h:276
TagParser::AbstractContainer::m_titles
std::vector< std::string > m_titles
Definition: abstractcontainer.h:104
TagParser::AbstractContainer::m_chaptersParsed
bool m_chaptersParsed
Definition: abstractcontainer.h:114
TagParser::AbstractContainer::startOffset
std::uint64_t startOffset() const
Returns the start offset in the related stream.
Definition: abstractcontainer.h:145
TagParser::AbstractContainer::timeScale
std::uint32_t timeScale() const
Returns the time scale of the file if known; otherwise returns 0.
Definition: abstractcontainer.h:300
TagParser::AbstractContainer::m_readVersion
std::uint64_t m_readVersion
Definition: abstractcontainer.h:100