Prevent warning "Cannot make an empty frame"

This commit is contained in:
Martchus 2019-02-13 20:19:46 +01:00
parent 3a35ce4b16
commit 3d3bc94e39
3 changed files with 57 additions and 18 deletions

View File

@ -35,7 +35,8 @@ const char *Failure::what() const USE_NOTHROW
/*!
* \class TagParser::NoDataFoundException
* \brief The exception that is thrown when the data to be parsed holds no
* parsable information.
* parsable information (e.g. relevant section in the file does not exist or
* has size of zero).
*/
/*!
@ -88,6 +89,34 @@ const char *InvalidDataException::what() const USE_NOTHROW
return "data to be parsed or to be made seems to be invalid";
}
/*!
* \class TagParser::NoDataException
* \brief The exception that is thrown when the value to be written is empty but that
* is not allowed in that context (e.g. an empty ID3v2 frame is not allowed).
*/
/*!
* \brief Constructs a new exception.
*/
NoDataProvidedException::NoDataProvidedException() USE_NOTHROW
{
}
/*!
* \brief Destroys the exception.
*/
NoDataProvidedException::~NoDataProvidedException() USE_NOTHROW
{
}
/*!
* \brief Returns a C-style character string describing the cause of the exception.
*/
const char *NoDataProvidedException::what() const USE_NOTHROW
{
return "can not write empty value";
}
/*!
* \class TagParser::TruncatedDataException
* \brief The exception that is thrown when the data to be parsed is truncated

View File

@ -29,6 +29,13 @@ public:
virtual const char *what() const USE_NOTHROW;
};
class TAG_PARSER_EXPORT NoDataProvidedException : public Failure {
public:
NoDataProvidedException() USE_NOTHROW;
virtual ~NoDataProvidedException() USE_NOTHROW;
virtual const char *what() const USE_NOTHROW;
};
class TAG_PARSER_EXPORT TruncatedDataException : public InvalidDataException {
public:
TruncatedDataException() USE_NOTHROW;

View File

@ -430,23 +430,7 @@ Id3v2FrameMaker::Id3v2FrameMaker(Id3v2Frame &frame, byte version, Diagnostics &d
{
const string context("making " % m_frame.idToString() + " frame");
// get non-empty, assigned values
vector<const TagValue *> values;
values.reserve(1 + frame.additionalValues().size());
if (!frame.value().isEmpty()) {
values.emplace_back(&frame.value());
}
for (const auto &value : frame.additionalValues()) {
if (!value.isEmpty()) {
values.emplace_back(&value);
}
}
// validate assigned data
if (values.empty()) {
diag.emplace_back(DiagLevel::Critical, "Cannot make an empty frame.", context);
throw InvalidDataException();
}
// validate frame's configuration
if (m_frame.isEncrypted()) {
diag.emplace_back(DiagLevel::Critical, "Cannot make an encrypted frame (isn't supported by this tagging library).", context);
throw InvalidDataException();
@ -462,6 +446,25 @@ Id3v2FrameMaker::Id3v2FrameMaker(Id3v2Frame &frame, byte version, Diagnostics &d
diag.emplace_back(DiagLevel::Warning,
"The existing flag and group information is not supported by the version of ID3v2 and will be ignored/discarted.", context);
}
// get non-empty, assigned values
vector<const TagValue *> values;
values.reserve(1 + frame.additionalValues().size());
if (!frame.value().isEmpty()) {
values.emplace_back(&frame.value());
}
for (const auto &value : frame.additionalValues()) {
if (!value.isEmpty()) {
values.emplace_back(&value);
}
}
// validate assigned values
if (values.empty()) {
throw NoDataProvidedException();
// note: This is not really an issue because in the case we're not provided with any value here just means that the field
// is supposed to be removed. So don't add any diagnostic messages here.
}
const bool isTextFrame = Id3v2FrameIds::isTextFrame(m_frameId);
if (values.size() != 1) {
if (!isTextFrame) {