Tag Parser  8.2.0
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
utils.cpp
Go to the documentation of this file.
1 #include "./helper.h"
2 
3 #include "../aspectratio.h"
4 #include "../backuphelper.h"
5 #include "../diagnostics.h"
6 #include "../exceptions.h"
7 #include "../margin.h"
8 #include "../mediafileinfo.h"
9 #include "../mediaformat.h"
10 #include "../positioninset.h"
11 #include "../progressfeedback.h"
12 #include "../signature.h"
13 #include "../size.h"
14 #include "../tagtarget.h"
15 
16 #include <c++utilities/conversion/stringbuilder.h>
17 #include <c++utilities/io/catchiofailure.h>
18 #include <c++utilities/tests/testutils.h>
19 using namespace TestUtilities;
20 
21 #include <cppunit/TestFixture.h>
22 #include <cppunit/extensions/HelperMacros.h>
23 
24 #include <cstdio>
25 
26 #include <unistd.h>
27 
28 using namespace std;
29 using namespace TagParser;
30 using namespace ConversionUtilities;
31 using namespace IoUtilities;
32 using namespace TestUtilities::Literals;
33 
34 using namespace CPPUNIT_NS;
35 
39 class UtilitiesTests : public TestFixture {
40  CPPUNIT_TEST_SUITE(UtilitiesTests);
41  CPPUNIT_TEST(testSize);
42  CPPUNIT_TEST(testTagTarget);
43  CPPUNIT_TEST(testSignature);
44  CPPUNIT_TEST(testMargin);
45  CPPUNIT_TEST(testAspectRatio);
46  CPPUNIT_TEST(testMediaFormat);
47  CPPUNIT_TEST(testPositionInSet);
48  CPPUNIT_TEST(testProgressFeedback);
49  CPPUNIT_TEST(testAbortableProgressFeedback);
50  CPPUNIT_TEST(testDiagnostics);
51  CPPUNIT_TEST(testBackupFile);
52  CPPUNIT_TEST_SUITE_END();
53 
54 public:
55  void setUp();
56  void tearDown();
57 
58  void testSize();
59  void testStatusProvider();
60  void testTagTarget();
61  void testSignature();
62  void testMargin();
63  void testAspectRatio();
64  void testMediaFormat();
65  void testPositionInSet();
66  void testProgressFeedback();
67  void testAbortableProgressFeedback();
68  void testDiagnostics();
69  void testBackupFile();
70 };
71 
73 
75 {
76 }
77 
79 {
80 }
81 
83 {
84  static_assert(Size().isNull(), "Size::isNull()");
85  static_assert(!Size(3, 4).isNull(), "Size::isNull()");
86  static_assert(Size(3, 4).resolution() == 12, "Size::resolution");
87 
88  Size size(1920, 1080);
89  CPPUNIT_ASSERT_EQUAL("width: 1920, height: 1080"s, size.toString());
90  CPPUNIT_ASSERT_EQUAL("1080p"s, string(size.abbreviation()));
91  size.setWidth(1280);
92  size.setHeight(720);
93  CPPUNIT_ASSERT_EQUAL("720p"s, string(size.abbreviation()));
94 }
95 
97 {
98  TagTarget target;
99  CPPUNIT_ASSERT(target.isEmpty());
100  CPPUNIT_ASSERT_EQUAL_MESSAGE("default level is 50", static_cast<uint64>(50), target.level());
101  CPPUNIT_ASSERT_EQUAL("level 50"s, target.toString(TagTargetLevel::Unspecified));
102  target = TagTarget(30, { 1, 2, 3 }, { 4 }, { 5, 6 }, { 7, 8, 9 });
103  CPPUNIT_ASSERT(!target.isEmpty());
104  const auto mapping = [](uint64 level) { return level == 30 ? TagTargetLevel::Track : TagTargetLevel::Unspecified; };
105  CPPUNIT_ASSERT_EQUAL(
106  "level 30 'track, song, chapter', track 1, track 2, track 3, chapter 4, edition 5, edition 6, attachment 7, attachment 8, attachment 9"s,
107  target.toString(mapping));
108  target.setLevel(40);
109  CPPUNIT_ASSERT_EQUAL("level 40, track 1, track 2, track 3, chapter 4, edition 5, edition 6, attachment 7, attachment 8, attachment 9"s,
110  target.toString(mapping));
111  target.setLevelName("test");
112  CPPUNIT_ASSERT_EQUAL("level 40 'test', track 1, track 2, track 3, chapter 4, edition 5, edition 6, attachment 7, attachment 8, attachment 9"s,
113  target.toString(mapping));
114  CPPUNIT_ASSERT(target == TagTarget(40, { 1, 2, 3 }, { 4 }, { 5, 6 }, { 7, 8, 9 }));
115  target.clear();
116  CPPUNIT_ASSERT(target.isEmpty());
117 }
118 
120 {
121  const unsigned char xzHead[12] = { 0xfd, 0x37, 0x7a, 0x58, 0x5a, 0x00, 0x00, 0x04, 0xe6, 0xd6, 0xb4, 0x46 };
122 
123  // truncated buffer
124  CPPUNIT_ASSERT_EQUAL(ContainerFormat::Unknown, parseSignature(reinterpret_cast<const char *>(xzHead), 3));
125  CPPUNIT_ASSERT_EQUAL(ContainerFormat::Unknown, parseSignature(reinterpret_cast<const char *>(xzHead), 2));
126  CPPUNIT_ASSERT_EQUAL(ContainerFormat::Unknown, parseSignature(reinterpret_cast<const char *>(xzHead), 0));
127 
128  const auto containerFormat = parseSignature(reinterpret_cast<const char *>(xzHead), sizeof(xzHead));
129  CPPUNIT_ASSERT_EQUAL(ContainerFormat::Xz, containerFormat);
130  CPPUNIT_ASSERT_EQUAL("xz compressed file"s, string(containerFormatName(containerFormat)));
131  CPPUNIT_ASSERT_EQUAL("xz"s, string(containerFormatAbbreviation(containerFormat)));
132  CPPUNIT_ASSERT_EQUAL(string(), string(containerFormatSubversion(containerFormat)));
133 }
134 
136 {
137  static_assert(Margin().isNull(), "empty margin");
138  static_assert(!Margin(0, 2).isNull(), "non-empty margin");
139 
140  CPPUNIT_ASSERT_EQUAL("top: 1; left: 2; bottom: 3; right: 4"s, Margin(1, 2, 3, 4).toString());
141 }
142 
144 {
145  static_assert(!AspectRatio().isValid(), "invalid aspect ratio");
146  static_assert(AspectRatio(16, 9).isValid(), "valid aspect ratio");
147  static_assert(AspectRatio(16, 9).isExtended(), "extended aspect ratio");
148 
149  const AspectRatio ratio(4);
150  CPPUNIT_ASSERT_EQUAL(static_cast<uint16>(16), ratio.numerator);
151  CPPUNIT_ASSERT_EQUAL(static_cast<uint16>(11), ratio.denominator);
152  const AspectRatio ratio2(77);
153  CPPUNIT_ASSERT_EQUAL(static_cast<uint16>(0), ratio2.numerator);
154  CPPUNIT_ASSERT_EQUAL(static_cast<uint16>(0), ratio2.denominator);
155 }
156 
158 {
159  // unspecific format
161  CPPUNIT_ASSERT_EQUAL("Advanced Audio Coding"s, string(aac.name()));
162  CPPUNIT_ASSERT_EQUAL("AAC"s, string(aac.abbreviation()));
163  CPPUNIT_ASSERT_EQUAL("AAC"s, string(aac.shortAbbreviation()));
164 
165  // specific format
167  CPPUNIT_ASSERT(aac == GeneralMediaFormat::Aac);
168  CPPUNIT_ASSERT(aac != GeneralMediaFormat::Mpeg1Audio);
169  CPPUNIT_ASSERT_EQUAL("Advanced Audio Coding Low Complexity Profile"s, string(aac.name()));
170  CPPUNIT_ASSERT_EQUAL("MPEG-4 AAC-LC"s, string(aac.abbreviation()));
171  CPPUNIT_ASSERT_EQUAL("HE-AAC"s, string(aac.shortAbbreviation()));
172  CPPUNIT_ASSERT_EQUAL("Spectral Band Replication / HE-AAC"s, string(aac.extensionName()));
173 }
174 
176 {
177  const PositionInSet empty;
178  CPPUNIT_ASSERT(empty.isNull());
179  CPPUNIT_ASSERT_EQUAL(0, empty.position());
180  CPPUNIT_ASSERT_EQUAL(0, empty.total());
181  CPPUNIT_ASSERT_EQUAL(""s, empty.toString());
182 
183  const PositionInSet oneOfThree(1, 3);
184  CPPUNIT_ASSERT(!oneOfThree.isNull());
185  CPPUNIT_ASSERT_EQUAL(1, oneOfThree.position());
186  CPPUNIT_ASSERT_EQUAL(3, oneOfThree.total());
187  CPPUNIT_ASSERT_EQUAL("1/3"s, oneOfThree.toString());
188 
189  const PositionInSet posOnly(5, 0);
190  CPPUNIT_ASSERT(!posOnly.isNull());
191  CPPUNIT_ASSERT_EQUAL(5, posOnly.position());
192  CPPUNIT_ASSERT_EQUAL(0, posOnly.total());
193  CPPUNIT_ASSERT_EQUAL("5"s, posOnly.toString());
194 
195  const PositionInSet totalOnly(0, 5);
196  CPPUNIT_ASSERT(!totalOnly.isNull());
197  CPPUNIT_ASSERT_EQUAL(0, totalOnly.position());
198  CPPUNIT_ASSERT_EQUAL(5, totalOnly.total());
199  CPPUNIT_ASSERT_EQUAL("/5"s, totalOnly.toString());
200 }
201 
203 {
204  unsigned int steps = 0;
205  string step;
206  unsigned int stepPercentage;
207  unsigned int overallPercentage = 0;
208 
209  ProgressFeedback progress(
210  [&](const ProgressFeedback &progress) {
211  ++steps;
212  step = progress.step();
213  stepPercentage = progress.stepPercentage();
214  overallPercentage = progress.overallPercentage();
215  },
216  [&](const ProgressFeedback &progress) {
217  stepPercentage = progress.stepPercentage();
218  overallPercentage = progress.overallPercentage();
219  });
220  CPPUNIT_ASSERT_EQUAL(0u, steps);
221  progress.updateOverallPercentage(25);
222  CPPUNIT_ASSERT_EQUAL(0u, steps);
223  CPPUNIT_ASSERT_EQUAL(25u, overallPercentage);
224  progress.updateStep("foo", 45);
225  CPPUNIT_ASSERT_EQUAL(1u, steps);
226  CPPUNIT_ASSERT_EQUAL("foo"s, step);
227  CPPUNIT_ASSERT_EQUAL(45u, stepPercentage);
228  CPPUNIT_ASSERT_EQUAL(25u, overallPercentage);
229  progress.updateStepPercentage(60);
230  CPPUNIT_ASSERT_EQUAL(1u, steps);
231  CPPUNIT_ASSERT_EQUAL("foo"s, step);
232  CPPUNIT_ASSERT_EQUAL(60u, stepPercentage);
233  CPPUNIT_ASSERT_EQUAL(25u, overallPercentage);
234  progress.updateStepPercentageFromFraction(0.75);
235  CPPUNIT_ASSERT_EQUAL(1u, steps);
236  CPPUNIT_ASSERT_EQUAL("foo"s, step);
237  CPPUNIT_ASSERT_EQUAL(75u, stepPercentage);
238  CPPUNIT_ASSERT_EQUAL(25u, overallPercentage);
239 }
240 
242 {
243  unsigned int steps = 0;
244  string step;
245  unsigned int stepPercentage;
246  unsigned int overallPercentage = 0;
247 
248  AbortableProgressFeedback progress(
249  [&](const AbortableProgressFeedback &progress) {
250  ++steps;
251  step = progress.step();
252  stepPercentage = progress.stepPercentage();
253  overallPercentage = progress.overallPercentage();
254  },
255  [&](const AbortableProgressFeedback &progress) {
256  stepPercentage = progress.stepPercentage();
257  overallPercentage = progress.overallPercentage();
258  });
259  CPPUNIT_ASSERT(!progress.isAborted());
260  CPPUNIT_ASSERT_NO_THROW_MESSAGE("stop does nothing if not aborted", progress.stopIfAborted());
261  CPPUNIT_ASSERT_EQUAL(0u, steps);
262  progress.updateOverallPercentage(25);
263  CPPUNIT_ASSERT_EQUAL(0u, steps);
264  CPPUNIT_ASSERT_EQUAL(25u, overallPercentage);
265  progress.updateStep("foo", 45);
266  CPPUNIT_ASSERT_EQUAL(1u, steps);
267  CPPUNIT_ASSERT_EQUAL("foo"s, step);
268  CPPUNIT_ASSERT_EQUAL(45u, stepPercentage);
269  CPPUNIT_ASSERT_EQUAL(25u, overallPercentage);
270  CPPUNIT_ASSERT_NO_THROW_MESSAGE("next step continues if not aborted", progress.nextStepOrStop("bar", 33));
271  CPPUNIT_ASSERT_EQUAL(2u, steps);
272  CPPUNIT_ASSERT_EQUAL("bar"s, step);
273  CPPUNIT_ASSERT_EQUAL(33u, stepPercentage);
274  CPPUNIT_ASSERT_EQUAL(25u, overallPercentage);
275  progress.tryToAbort();
276  CPPUNIT_ASSERT(progress.isAborted());
277  CPPUNIT_ASSERT_THROW(progress.nextStepOrStop("not going to happen", 33), OperationAbortedException);
278  CPPUNIT_ASSERT_EQUAL(2u, steps);
279  CPPUNIT_ASSERT_EQUAL("bar"s, step);
280  CPPUNIT_ASSERT_EQUAL(33u, stepPercentage);
281  CPPUNIT_ASSERT_EQUAL(25u, overallPercentage);
282 }
283 
285 {
286  Diagnostics diag;
287  CPPUNIT_ASSERT_EQUAL(DiagLevel::None, diag.level());
288  diag.emplace_back(DiagLevel::Warning, "warning msg", "context");
289  CPPUNIT_ASSERT_EQUAL(DiagLevel::Warning, diag.level());
290  CPPUNIT_ASSERT(!diag.has(DiagLevel::Critical));
291  diag.emplace_back(DiagLevel::Critical, "critical msg", "context");
292  CPPUNIT_ASSERT_EQUAL(DiagLevel::Critical, diag.level());
293  CPPUNIT_ASSERT(diag.has(DiagLevel::Critical));
294 }
295 
297 {
298  using namespace BackupHelper;
299 
300  // setup testfile
301  MediaFileInfo file(workingCopyPath("unsupported.bin"));
302  file.setBackupDirectory(string()); // ensure backup directory is empty, so backups will be created in the same directory as the original file
303  const auto workingDir(file.containingDirectory());
304  file.open();
305 
306  // create backup file
307  string backupPath1, backupPath2;
308  NativeFileStream backupStream1, backupStream2;
309  createBackupFile(string(), file.path(), backupPath1, file.stream(), backupStream1);
310  CPPUNIT_ASSERT_EQUAL(workingDir + "/unsupported.bin.bak", backupPath1);
311 
312  // recreate original file (like the 'make' methods would do to apply changes)
313  file.stream().open(file.path(), ios_base::out);
314  file.stream() << "test1" << endl;
315 
316  // create a 2nd backup which should not override the first one
317  createBackupFile(string(), file.path(), backupPath2, file.stream(), backupStream2);
318  CPPUNIT_ASSERT_EQUAL(workingDir + "/unsupported.bin.1.bak", backupPath2);
319 
320  // get rid of 2nd backup, recreate original file
321  backupStream2.close();
322  remove(backupPath2.data());
323  file.stream().open(file.path(), ios_base::out);
324  file.stream() << "test2" << endl;
325 
326  // create backup under another location
327  try {
328  createBackupFile("bak", file.path(), backupPath2, file.stream(), backupStream2);
329  CPPUNIT_FAIL("renaming failed because backup dir does not exist");
330  } catch (...) {
331  const char *what = catchIoFailure();
332  CPPUNIT_ASSERT(strstr(what, "Unable to rename original file before rewriting it."));
333  }
334  backupStream2.clear();
335  workingCopyPathMode("bak/unsupported.bin", WorkingCopyMode::NoCopy);
336  createBackupFile("bak", file.path(), backupPath2, file.stream(), backupStream2);
337  CPPUNIT_ASSERT_EQUAL(workingDir + "/bak/unsupported.bin", backupPath2);
338 
339  // get rid of 2nd backup (again)
340  backupStream2.close();
341  CPPUNIT_ASSERT_EQUAL_MESSAGE("remove " + backupPath2, 0, remove(backupPath2.data()));
342  const auto backupDir(workingDir + "/bak");
343  CPPUNIT_ASSERT_EQUAL_MESSAGE("remove " + backupDir, 0, rmdir(backupDir.data()));
344 
345  // should be able to use backup stream, eg. seek to the end
346  backupStream1.seekg(0, ios_base::end);
347  CPPUNIT_ASSERT_EQUAL(41_st, static_cast<size_t>(backupStream1.tellg()));
348 
349  // restore backup
350  restoreOriginalFileFromBackupFile(file.path(), backupPath1, file.stream(), backupStream1);
351 
352  // check restored backup
353  file.open(true);
354  file.stream().seekg(0x1D);
355  CPPUNIT_ASSERT_EQUAL(0x34_st, static_cast<size_t>(file.stream().get()));
356  file.close();
357 
358  // restore after user aborted
359  createBackupFile(string(), file.path(), backupPath1, file.stream(), backupStream1);
360  try {
362  } catch (...) {
363  Diagnostics diag;
364  CPPUNIT_ASSERT_THROW(
365  handleFailureAfterFileModified(file, backupPath1, file.stream(), backupStream1, diag, "test"), OperationAbortedException);
366  CPPUNIT_ASSERT(diag.level() < DiagLevel::Critical);
367  CPPUNIT_ASSERT(!diag.empty());
368  CPPUNIT_ASSERT_EQUAL("Rewriting the file to apply changed tag information has been aborted."s, diag.front().message());
369  CPPUNIT_ASSERT_EQUAL("The original file has been restored."s, diag.back().message());
370  }
371 
372  // restore after error
373  createBackupFile(string(), file.path(), backupPath1, file.stream(), backupStream1);
374  try {
375  throw Failure();
376  } catch (...) {
377  Diagnostics diag;
378  CPPUNIT_ASSERT_THROW(handleFailureAfterFileModified(file, backupPath1, file.stream(), backupStream1, diag, "test"), Failure);
379  CPPUNIT_ASSERT(diag.level() >= DiagLevel::Critical);
380  CPPUNIT_ASSERT_EQUAL("Rewriting the file to apply changed tag information failed."s, diag.front().message());
381  CPPUNIT_ASSERT_EQUAL("The original file has been restored."s, diag.back().message());
382  }
383 
384  // restore after io failure
385  createBackupFile(string(), file.path(), backupPath1, file.stream(), backupStream1);
386  try {
387  throwIoFailure("simulated IO failure");
388  } catch (...) {
389  Diagnostics diag;
390  try {
391  handleFailureAfterFileModified(file, backupPath1, file.stream(), backupStream1, diag, "test");
392  CPPUNIT_FAIL("IO failure not rethrown");
393  } catch (...) {
394  catchIoFailure();
395  }
396  CPPUNIT_ASSERT(diag.level() >= DiagLevel::Critical);
397  CPPUNIT_ASSERT_EQUAL("An IO error occurred when rewriting the file to apply changed tag information."s, diag.front().message());
398  CPPUNIT_ASSERT_EQUAL("The original file has been restored."s, diag.back().message());
399  }
400 
401  CPPUNIT_ASSERT_EQUAL(0, remove(file.path().data()));
402 }
static std::string containingDirectory(const std::string &path)
Returns the path of the directory containing the given file.
void open(bool readOnly=false)
Opens a std::fstream for the current file.
void testBackupFile()
Definition: utils.cpp:296
The Margin class defines the four margins of a rectangle.
Definition: margin.h:16
StringType toString() const
Returns the string representation of the current PositionInSet.
std::string toString(const std::function< TagTargetLevel(uint64)> &tagTargetMapping) const
Returns the string representation of the current instance.
Definition: tagtarget.h:201
const char * abbreviation() const
Returns an abbreviation for the current instance, eg.
Definition: size.cpp:9
void updateStepPercentage(byte stepPercentage)
Updates the current step percentage and invokes the second callback specified on construction (or the...
void setWidth(uint32 value)
Sets the width.
Definition: size.h:75
void tearDown()
Definition: utils.cpp:78
The ProgressFeedback class provides feedback about an ongoing operation via callbacks.
void stopIfAborted() const
Throws an OperationAbortedException if aborted.
const std::string & path() const
Returns the path of the current file.
Definition: basicfileinfo.h:97
void testPositionInSet()
Definition: utils.cpp:175
constexpr int32 position() const
Returns the element position of the current instance.
Definition: positioninset.h:76
uint64 level() const
Returns the level.
Definition: tagtarget.h:72
The MediaFormat class specifies the format of media data.
Definition: mediaformat.h:244
The PositionInSet class describes the position of an element in a set which consists of a certain num...
Definition: positioninset.h:21
void testMargin()
Definition: utils.cpp:135
The UtilitiesTests class tests various utility classes and functions of the tagparser library.
Definition: utils.cpp:39
void setBackupDirectory(const std::string &backupDirectory)
Sets the directory used to store backup files.
void updateStepPercentageFromFraction(double stepPercentage)
Updates the current step percentage and invokes the second callback specified on construction (or the...
The MediaFileInfo class allows to read and write tag information providing a container/tag format ind...
Definition: mediafileinfo.h:44
TAG_PARSER_EXPORT void createBackupFile(const std::string &backupDir, const std::string &originalPath, std::string &backupPath, IoUtilities::NativeFileStream &originalStream, IoUtilities::NativeFileStream &backupStream)
bool isAborted() const
Returns whether the operation has been aborted via tryToAbort().
void testAspectRatio()
Definition: utils.cpp:143
constexpr int32 total() const
Returns the total element count of the current instance.
Definition: positioninset.h:84
void setHeight(uint32 value)
Sets the height.
Definition: size.h:83
void testDiagnostics()
Definition: utils.cpp:284
The Size class defines the size of a two-dimensional object using integer point precision.
Definition: size.h:16
byte stepPercentage() const
Returns the percentage of the current step (initially 0, supposed to be a value from 0 to 100).
byte overallPercentage() const
Returns the overall percentage (initially 0, supposed to be a value from 0 to 100).
Contains utility classes helping to read and write streams.
DiagLevel level() const
Returns the worst diag level present in the container.
Definition: diagnostics.cpp:53
TAG_PARSER_EXPORT const char * containerFormatName(ContainerFormat containerFormat)
Returns the name of the specified container format as C-style string.
Definition: signature.cpp:371
const char * extensionName() const
Returns the abbreviation of the media format as C-style string.
void testAbortableProgressFeedback()
Definition: utils.cpp:241
bool isEmpty() const
Returns an indication whether the target is empty.
Definition: tagtarget.h:168
void tryToAbort()
Aborts the operation.
The TagTarget class specifies the target of a tag.
Definition: tagtarget.h:21
TAG_PARSER_EXPORT void restoreOriginalFileFromBackupFile(const std::string &originalPath, const std::string &backupPath, IoUtilities::NativeFileStream &originalStream, IoUtilities::NativeFileStream &backupStream)
TAG_PARSER_EXPORT const char * containerFormatAbbreviation(ContainerFormat containerFormat, MediaType mediaType=MediaType::Unknown, unsigned int version=0)
Returns the abbreviation of the container format as C-style string considering the specified media ty...
Definition: signature.cpp:249
void updateOverallPercentage(byte overallPercentage)
Updates the overall percentage and invokes the second callback specified on construction (or the firs...
void testProgressFeedback()
Definition: utils.cpp:202
void testMediaFormat()
Definition: utils.cpp:157
The AbortableProgressFeedback class provides feedback about an ongoing operation via callbacks.
void close()
A possibly opened std::fstream will be closed.
CPPUNIT_TEST_SUITE_REGISTRATION(UtilitiesTests)
constexpr bool isNull() const
Returns an indication whether both the element position and total element count is 0.
Definition: positioninset.h:92
const char * shortAbbreviation() const
Returns a short abbreviation of the media format as C-style string.
void updateStep(const std::string &step, byte stepPercentage=0)
Updates the current step and invokes the first callback specified on construction.
TAG_PARSER_EXPORT void handleFailureAfterFileModified(MediaFileInfo &mediaFileInfo, const std::string &backupPath, IoUtilities::NativeFileStream &outputStream, IoUtilities::NativeFileStream &backupStream, Diagnostics &diag, const std::string &context="making file")
const char * name() const
Returns the name of the media format as C-style string.
Definition: mediaformat.cpp:17
void testTagTarget()
Definition: utils.cpp:96
const char * abbreviation() const
Returns the abbreviation of the media format as C-style string.
void setUp()
Definition: utils.cpp:74
std::string toString() const
Returns the string representation of the current size.
Definition: size.h:124
bool has(DiagLevel level) const
Returns whether there's at least one DiagMessage which is at least as worse as level.
Definition: diagnostics.cpp:40
void testSize()
Definition: utils.cpp:82
TAG_PARSER_EXPORT ContainerFormat parseSignature(const char *buffer, int bufferSize)
Parses the signature read from the specified buffer.
Definition: signature.cpp:102
IoUtilities::NativeFileStream & stream()
Returns the std::fstream for the current instance.
Definition: basicfileinfo.h:79
void testSignature()
Definition: utils.cpp:119
const std::string & step() const
Returns the name of the current step (initially empty).
The class inherits from std::exception and serves as base class for exceptions thrown by the elements...
Definition: exceptions.h:11
The exception that is thrown when an operation has been stopped and thus not successfully completed b...
Definition: exceptions.h:46
TAG_PARSER_EXPORT const char * containerFormatSubversion(ContainerFormat containerFormat)
Returns the subversion of the container format as C-style string.
Definition: signature.cpp:476
Contains all classes and functions of the TagInfo library.
Definition: aaccodebook.h:9
void nextStepOrStop(const std::string &step, byte stepPercentage=0)
Throws an OperationAbortedException if aborted; otherwise the data for the next step is set.
The AspectRatio struct defines an aspect ratio.
Definition: aspectratio.h:13
The Diagnostics class is a container for DiagMessage.
Definition: diagnostics.h:156