Tag Parser  10.0.0
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
abstractattachment.h
Go to the documentation of this file.
1 #ifndef TAG_PARSER_ABSTRACTATTACHMENT_H
2 #define TAG_PARSER_ABSTRACTATTACHMENT_H
3 
4 #include "./diagnostics.h"
5 
6 #include <functional>
7 #include <iostream>
8 #include <memory>
9 #include <string>
10 
11 namespace TagParser {
12 
13 class AbortableProgressFeedback;
14 class MediaFileInfo;
15 
17 public:
18  StreamDataBlock(const std::function<std::istream &()> &stream, uint64_t startOffset = 0, std::ios_base::seekdir startDir = std::ios_base::beg,
19  uint64_t endOffset = 0, std::ios_base::seekdir endDir = std::ios_base::end);
20  virtual ~StreamDataBlock();
21 
22  std::istream &stream() const;
23  std::uint64_t startOffset() const;
24  std::uint64_t endOffset() const;
25  std::uint64_t size() const;
26  const std::unique_ptr<char[]> &buffer() const;
27  void makeBuffer() const;
28  void discardBuffer();
29  void copyTo(std::ostream &stream) const;
30 
31 protected:
33 
34  std::function<std::istream &()> m_stream;
35  std::uint64_t m_startOffset;
36  std::uint64_t m_endOffset;
37  mutable std::unique_ptr<char[]> m_buffer;
38 };
39 
45 inline std::istream &StreamDataBlock::stream() const
46 {
47  return m_stream();
48 }
49 
53 inline std::uint64_t StreamDataBlock::startOffset() const
54 {
55  return m_startOffset;
56 }
57 
61 inline std::uint64_t StreamDataBlock::endOffset() const
62 {
63  return m_endOffset;
64 }
65 
69 inline std::uint64_t StreamDataBlock::size() const
70 {
71  return m_endOffset - m_startOffset;
72 }
73 
77 inline const std::unique_ptr<char[]> &StreamDataBlock::buffer() const
78 {
79  return m_buffer;
80 }
81 
86 {
87  m_buffer.reset();
88 }
89 
91 public:
92  FileDataBlock(std::string_view path, Diagnostics &diag, AbortableProgressFeedback &progress);
93  ~FileDataBlock();
94  const MediaFileInfo *fileInfo() const;
95 
96 private:
97  std::unique_ptr<MediaFileInfo> m_fileInfo;
98 };
99 
101 {
102  return m_fileInfo.get();
103 }
104 
106 public:
107  const std::string &description() const;
108  void setDescription(std::string_view description);
109  const std::string &name() const;
110  void setName(std::string_view name);
111  const std::string &mimeType() const;
112  void setMimeType(std::string_view mimeType);
113  std::uint64_t id() const;
114  void setId(std::uint64_t id);
115  const StreamDataBlock *data() const;
116  void setData(std::unique_ptr<StreamDataBlock> &&data);
117  void setFile(std::string_view path, Diagnostics &diag, AbortableProgressFeedback &progress);
118  bool isDataFromFile() const;
119  std::string label() const;
120  void clear();
121  bool isIgnored() const;
122  void setIgnored(bool ignored);
123  bool isEmpty() const;
124 
125 protected:
127 
128 private:
129  std::string m_description;
130  std::string m_name;
131  std::string m_mimeType;
132  std::uint64_t m_id;
133  std::unique_ptr<StreamDataBlock> m_data;
134  bool m_isDataFromFile;
135  bool m_ignored;
136 };
137 
142  : m_id(0)
143  , m_isDataFromFile(false)
144  , m_ignored(false)
145 {
146 }
147 
151 inline const std::string &AbstractAttachment::description() const
152 {
153  return m_description;
154 }
155 
159 inline void AbstractAttachment::setDescription(std::string_view description)
160 {
161  m_description = description;
162 }
163 
167 inline const std::string &AbstractAttachment::name() const
168 {
169  return m_name;
170 }
171 
175 inline void AbstractAttachment::setName(std::string_view name)
176 {
177  m_name = name;
178 }
179 
183 inline const std::string &AbstractAttachment::mimeType() const
184 {
185  return m_mimeType;
186 }
187 
191 inline void AbstractAttachment::setMimeType(std::string_view mimeType)
192 {
193  m_mimeType = mimeType;
194 }
195 
199 inline std::uint64_t AbstractAttachment::id() const
200 {
201  return m_id;
202 }
203 
207 inline void AbstractAttachment::setId(uint64_t id)
208 {
209  m_id = id;
210 }
211 
220 {
221  return m_data.get();
222 }
223 
229 inline void AbstractAttachment::setData(std::unique_ptr<StreamDataBlock> &&data)
230 {
231  m_data = std::move(data);
232  m_isDataFromFile = false;
233 }
234 
239 {
240  return m_isDataFromFile;
241 }
242 
249 inline bool AbstractAttachment::isIgnored() const
250 {
251  return m_ignored;
252 }
253 
259 inline void AbstractAttachment::setIgnored(bool ignored)
260 {
261  m_ignored = ignored;
262 }
263 
268 inline bool AbstractAttachment::isEmpty() const
269 {
270  return m_description.empty() && m_name.empty() && !m_mimeType.empty() && !m_data;
271 }
272 
273 } // namespace TagParser
274 
275 #endif // TAG_PARSER_ABSTRACTATTACHMENT_H
The AbortableProgressFeedback class provides feedback about an ongoing operation via callbacks.
The AbstractAttachment class parses and stores attachment information.
bool isEmpty() const
Returns whether the attachment is empty (no data and no meta-data assigned).
void setDescription(std::string_view description)
Sets a description of the attachment.
const std::string & mimeType() const
Returns the MIME-type of the attachment.
const std::string & description() const
Returns a description of the attachment.
void setData(std::unique_ptr< StreamDataBlock > &&data)
Sets the data for the attachment.
const std::string & name() const
Returns the (file) name of the attachment.
std::uint64_t id() const
Returns the ID of the attachment.
bool isDataFromFile() const
Returns whether the assigned data has been assigned using the setFile() method.
void setName(std::string_view name)
Sets the (file) name of the attachment.
void setIgnored(bool ignored)
Sets whether the attachment is ignored/omitted when rewriting the container.
bool isIgnored() const
Returns whether the attachment is ignored/omitted when rewriting the container.
AbstractAttachment()
Constructs a new attachment.
void setId(std::uint64_t id)
Sets the ID of the attachment.
const StreamDataBlock * data() const
Returns a reference to the data of the attachment.
void setMimeType(std::string_view mimeType)
Sets the MIME-type of the attachment.
The Diagnostics class is a container for DiagMessage.
Definition: diagnostics.h:156
The FileDataBlock class is a reference to a certain data block of a file stream.
const MediaFileInfo * fileInfo() const
The MediaFileInfo class allows to read and write tag information providing a container/tag format ind...
Definition: mediafileinfo.h:74
The StreamDataBlock class is a reference to a certain data block of a stream.
std::unique_ptr< char[]> m_buffer
const std::unique_ptr< char[]> & buffer() const
Returns the data buffered via makeBuffer().
std::uint64_t startOffset() const
Returns the absolute start offset of the data block in the stream.
std::uint64_t size() const
Returns the size of the data block.
StreamDataBlock(const std::function< std::istream &()> &stream, uint64_t startOffset=0, std::ios_base::seekdir startDir=std::ios_base::beg, uint64_t endOffset=0, std::ios_base::seekdir endDir=std::ios_base::end)
std::istream & stream() const
Returns the associated stream.
void discardBuffer()
Discards buffered data.
std::uint64_t endOffset() const
Returns the absolute end offset of the data block in the stream.
std::function< std::istream &()> m_stream
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.
constexpr TAG_PARSER_EXPORT std::string_view description()
Contains all classes and functions of the TagInfo library.
Definition: aaccodebook.h:10