Fix typos
This commit is contained in:
parent
ecb64e0af6
commit
c3394acdb2
|
@ -160,7 +160,7 @@ set(META_APP_URL "https://github.com/${META_APP_AUTHOR}/${META_PROJECT_NAME}")
|
||||||
set(META_APP_DESCRIPTION "C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags")
|
set(META_APP_DESCRIPTION "C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags")
|
||||||
set(META_VERSION_MAJOR 6)
|
set(META_VERSION_MAJOR 6)
|
||||||
set(META_VERSION_MINOR 2)
|
set(META_VERSION_MINOR 2)
|
||||||
set(META_VERSION_PATCH 1)
|
set(META_VERSION_PATCH 2)
|
||||||
set(META_PUBLIC_SHARED_LIB_DEPENDS c++utilities)
|
set(META_PUBLIC_SHARED_LIB_DEPENDS c++utilities)
|
||||||
set(META_PUBLIC_STATIC_LIB_DEPENDS c++utilities_static)
|
set(META_PUBLIC_STATIC_LIB_DEPENDS c++utilities_static)
|
||||||
set(META_PRIVATE_COMPILE_DEFINITIONS LEGACY_API)
|
set(META_PRIVATE_COMPILE_DEFINITIONS LEGACY_API)
|
||||||
|
|
|
@ -51,7 +51,7 @@ StreamDataBlock::StreamDataBlock(const std::function<std::istream & ()> &stream,
|
||||||
m_endOffset = s.tellg();
|
m_endOffset = s.tellg();
|
||||||
s.seekg(currentPos);
|
s.seekg(currentPos);
|
||||||
if(m_endOffset < m_startOffset) {
|
if(m_endOffset < m_startOffset) {
|
||||||
IoUtilities::throwIoFailure("End offset is less then start offset.");
|
IoUtilities::throwIoFailure("End offset is less than start offset.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -280,7 +280,7 @@ Tag *AbstractContainer::createTag(const TagTarget &)
|
||||||
/*!
|
/*!
|
||||||
* \brief Returns the tag with the specified \a index.
|
* \brief Returns the tag with the specified \a index.
|
||||||
*
|
*
|
||||||
* \a index must be less then tagCount().
|
* \a index must be less than tagCount().
|
||||||
*/
|
*/
|
||||||
Tag *AbstractContainer::tag(size_t )
|
Tag *AbstractContainer::tag(size_t )
|
||||||
{
|
{
|
||||||
|
@ -344,7 +344,7 @@ ElementPosition AbstractContainer::determineTagPosition() const
|
||||||
/*!
|
/*!
|
||||||
* \brief Returns the track with the specified \a index.
|
* \brief Returns the track with the specified \a index.
|
||||||
*
|
*
|
||||||
* \a index must be less then trackCount().
|
* \a index must be less than trackCount().
|
||||||
*/
|
*/
|
||||||
AbstractTrack *AbstractContainer::track(size_t )
|
AbstractTrack *AbstractContainer::track(size_t )
|
||||||
{
|
{
|
||||||
|
@ -397,7 +397,7 @@ void AbstractContainer::removeAllTracks()
|
||||||
/*!
|
/*!
|
||||||
* \brief Returns the chapter with the specified \a index.
|
* \brief Returns the chapter with the specified \a index.
|
||||||
*
|
*
|
||||||
* \a index must be less then chapterCount().
|
* \a index must be less than chapterCount().
|
||||||
*/
|
*/
|
||||||
AbstractChapter *AbstractContainer::chapter(size_t )
|
AbstractChapter *AbstractContainer::chapter(size_t )
|
||||||
{
|
{
|
||||||
|
@ -425,7 +425,7 @@ AbstractAttachment *AbstractContainer::createAttachment()
|
||||||
/*!
|
/*!
|
||||||
* \brief Returns the attachment with the specified \a index.
|
* \brief Returns the attachment with the specified \a index.
|
||||||
*
|
*
|
||||||
* \a index must be less then attachmentCount().
|
* \a index must be less than attachmentCount().
|
||||||
*/
|
*/
|
||||||
AbstractAttachment *AbstractContainer::attachment(size_t )
|
AbstractAttachment *AbstractContainer::attachment(size_t )
|
||||||
{
|
{
|
||||||
|
|
|
@ -105,7 +105,7 @@ void restoreOriginalFileFromBackupFile(const std::string &originalPath, const st
|
||||||
*
|
*
|
||||||
* This helper function is used by MediaFileInfo and container implementations to create a backup file
|
* This helper function is used by MediaFileInfo and container implementations to create a backup file
|
||||||
* when applying changes. The path of the created backup file is set to \a backup path.
|
* when applying changes. The path of the created backup file is set to \a backup path.
|
||||||
* The specified \a backupStream will be closed if currently open. Then is is
|
* The specified \a backupStream will be closed if currently open. Then it is
|
||||||
* used to open the backup file using the flags ios_base::in and ios_base::binary.
|
* used to open the backup file using the flags ios_base::in and ios_base::binary.
|
||||||
*
|
*
|
||||||
* The specified \a originalStream is closed before performing the move operation.
|
* The specified \a originalStream is closed before performing the move operation.
|
||||||
|
|
|
@ -142,7 +142,7 @@ bool FieldMapBasedTag<FieldType, Compare>::setValue(const typename FieldType::id
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Assigns the given \a values to the field with the specified \a id.
|
* \brief Assigns the given \a values to the field with the specified \a id.
|
||||||
* \remarks There might me more then one value assigned to an \a id. Whereas setValue() only alters the first value, this
|
* \remarks There might me more than one value assigned to an \a id. Whereas setValue() only alters the first value, this
|
||||||
* method will replace all currently assigned values with the specified \a values.
|
* method will replace all currently assigned values with the specified \a values.
|
||||||
* \sa Tag::setValues()
|
* \sa Tag::setValues()
|
||||||
*/
|
*/
|
||||||
|
@ -168,7 +168,7 @@ bool FieldMapBasedTag<FieldType, Compare>::setValues(const typename FieldType::i
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Assigns the given \a values to the field with the specified \a id.
|
* \brief Assigns the given \a values to the field with the specified \a id.
|
||||||
* \remarks There might me more then one value assigned to a \a field. Whereas setValue() only alters the first value, this
|
* \remarks There might me more than one value assigned to a \a field. Whereas setValue() only alters the first value, this
|
||||||
* method will replace all currently assigned values with the specified \a values.
|
* method will replace all currently assigned values with the specified \a values.
|
||||||
* \sa Tag::setValues()
|
* \sa Tag::setValues()
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -107,7 +107,7 @@ void FlacStream::internalParseHeader()
|
||||||
|
|
||||||
case FlacMetaDataBlockType::VorbisComment:
|
case FlacMetaDataBlockType::VorbisComment:
|
||||||
// parse Vorbis comment
|
// parse Vorbis comment
|
||||||
// if more then one comment exist, simply thread those comments as one
|
// if more than one comment exist, simply thread those comments as one
|
||||||
if(!m_vorbisComment) {
|
if(!m_vorbisComment) {
|
||||||
m_vorbisComment = make_unique<VorbisComment>();
|
m_vorbisComment = make_unique<VorbisComment>();
|
||||||
}
|
}
|
||||||
|
|
|
@ -191,7 +191,7 @@ void Id3v2Frame::parse(BinaryReader &reader, const uint32 version, const uint32
|
||||||
if(isCompressed()) {
|
if(isCompressed()) {
|
||||||
uLongf decompressedSize = version >= 4 ? reader.readSynchsafeUInt32BE() : reader.readUInt32BE();
|
uLongf decompressedSize = version >= 4 ? reader.readSynchsafeUInt32BE() : reader.readUInt32BE();
|
||||||
if(decompressedSize < m_dataSize) {
|
if(decompressedSize < m_dataSize) {
|
||||||
addNotification(NotificationType::Critical, "The decompressed size is smaller then the compressed size.", context);
|
addNotification(NotificationType::Critical, "The decompressed size is smaller than the compressed size.", context);
|
||||||
throw InvalidDataException();
|
throw InvalidDataException();
|
||||||
}
|
}
|
||||||
auto bufferCompressed = make_unique<char[]>(m_dataSize);;
|
auto bufferCompressed = make_unique<char[]>(m_dataSize);;
|
||||||
|
|
|
@ -411,7 +411,7 @@ void MatroskaContainer::internalParseHeader()
|
||||||
case EbmlIds::MaxIdLength:
|
case EbmlIds::MaxIdLength:
|
||||||
m_maxIdLength = subElement->readUInteger();
|
m_maxIdLength = subElement->readUInteger();
|
||||||
if(m_maxIdLength > EbmlElement::maximumIdLengthSupported()) {
|
if(m_maxIdLength > EbmlElement::maximumIdLengthSupported()) {
|
||||||
addNotification(NotificationType::Critical, "Maximum EBML element ID length greather then "
|
addNotification(NotificationType::Critical, "Maximum EBML element ID length greather than "
|
||||||
% numberToString<uint32>(EbmlElement::maximumIdLengthSupported())
|
% numberToString<uint32>(EbmlElement::maximumIdLengthSupported())
|
||||||
+ " bytes is not supported.", context);
|
+ " bytes is not supported.", context);
|
||||||
throw InvalidDataException();
|
throw InvalidDataException();
|
||||||
|
@ -420,7 +420,7 @@ void MatroskaContainer::internalParseHeader()
|
||||||
case EbmlIds::MaxSizeLength:
|
case EbmlIds::MaxSizeLength:
|
||||||
m_maxSizeLength = subElement->readUInteger();
|
m_maxSizeLength = subElement->readUInteger();
|
||||||
if(m_maxSizeLength > EbmlElement::maximumSizeLengthSupported()) {
|
if(m_maxSizeLength > EbmlElement::maximumSizeLengthSupported()) {
|
||||||
addNotification(NotificationType::Critical, "Maximum EBML element size length greather then "
|
addNotification(NotificationType::Critical, "Maximum EBML element size length greather than "
|
||||||
% numberToString<uint32>(EbmlElement::maximumSizeLengthSupported())
|
% numberToString<uint32>(EbmlElement::maximumSizeLengthSupported())
|
||||||
+ " bytes is not supported.", context);
|
+ " bytes is not supported.", context);
|
||||||
throw InvalidDataException();
|
throw InvalidDataException();
|
||||||
|
|
|
@ -19,7 +19,7 @@ namespace Media {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Shifts all offsets greather or equal then \a start by \a amount bytes.
|
* \brief Shifts all offsets greather or equal than \a start by \a amount bytes.
|
||||||
*/
|
*/
|
||||||
void MatroskaSeekInfo::shift(uint64 start, int64 amount)
|
void MatroskaSeekInfo::shift(uint64 start, int64 amount)
|
||||||
{
|
{
|
||||||
|
|
|
@ -193,7 +193,7 @@ startParsingSignature:
|
||||||
// save position of ID3v2 tag
|
// save position of ID3v2 tag
|
||||||
m_actualId3v2TagOffsets.push_back(m_containerOffset);
|
m_actualId3v2TagOffsets.push_back(m_containerOffset);
|
||||||
if(m_actualId3v2TagOffsets.size() == 2) {
|
if(m_actualId3v2TagOffsets.size() == 2) {
|
||||||
addNotification(NotificationType::Warning, "There is more then just one ID3v2 header at the beginning of the file.", context);
|
addNotification(NotificationType::Warning, "There is more than just one ID3v2 header at the beginning of the file.", context);
|
||||||
}
|
}
|
||||||
|
|
||||||
// read ID3v2 header
|
// read ID3v2 header
|
||||||
|
|
|
@ -60,7 +60,7 @@ void Mp4Atom::internalParse()
|
||||||
invalidateStatus();
|
invalidateStatus();
|
||||||
static const string context("parsing MP4 atom");
|
static const string context("parsing MP4 atom");
|
||||||
if(maxTotalSize() < minimumElementSize()) {
|
if(maxTotalSize() < minimumElementSize()) {
|
||||||
addNotification(NotificationType::Critical, "Atom is smaller then 8 byte and hence invalid. The remaining size within the parent atom is " % numberToString(maxTotalSize()) + ".", context);
|
addNotification(NotificationType::Critical, "Atom is smaller than 8 byte and hence invalid. The remaining size within the parent atom is " % numberToString(maxTotalSize()) + ".", context);
|
||||||
throw TruncatedDataException();
|
throw TruncatedDataException();
|
||||||
}
|
}
|
||||||
stream().seekg(startOffset());
|
stream().seekg(startOffset());
|
||||||
|
@ -74,7 +74,7 @@ void Mp4Atom::internalParse()
|
||||||
throw NoDataFoundException();
|
throw NoDataFoundException();
|
||||||
}
|
}
|
||||||
if(m_dataSize < 8 && m_dataSize != 1) {
|
if(m_dataSize < 8 && m_dataSize != 1) {
|
||||||
addNotification(NotificationType::Critical, "Atom is smaller then 8 byte and hence invalid.", context);
|
addNotification(NotificationType::Critical, "Atom is smaller than 8 byte and hence invalid.", context);
|
||||||
throw TruncatedDataException();
|
throw TruncatedDataException();
|
||||||
}
|
}
|
||||||
m_id = reader().readUInt32BE();
|
m_id = reader().readUInt32BE();
|
||||||
|
@ -83,7 +83,7 @@ void Mp4Atom::internalParse()
|
||||||
m_dataSize = reader().readUInt64BE();
|
m_dataSize = reader().readUInt64BE();
|
||||||
m_sizeLength = 12; // 4 bytes indicate long size denotation + 8 bytes for actual size denotation
|
m_sizeLength = 12; // 4 bytes indicate long size denotation + 8 bytes for actual size denotation
|
||||||
if(dataSize() < 16 && m_dataSize != 1) {
|
if(dataSize() < 16 && m_dataSize != 1) {
|
||||||
addNotification(NotificationType::Critical, "Atom denoting 64-bit size is smaller then 16 byte and hence invalid.", parsingContext());
|
addNotification(NotificationType::Critical, "Atom denoting 64-bit size is smaller than 16 byte and hence invalid.", parsingContext());
|
||||||
throw TruncatedDataException();
|
throw TruncatedDataException();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -484,7 +484,7 @@ calculatePadding:
|
||||||
// -> check whether the padding matches specifications
|
// -> check whether the padding matches specifications
|
||||||
// min padding: says "at least ... byte should be reserved to prepend further tag info", so the padding at the end
|
// min padding: says "at least ... byte should be reserved to prepend further tag info", so the padding at the end
|
||||||
// shouldn't be tanken into account (it can't be used to prepend further tag info)
|
// shouldn't be tanken into account (it can't be used to prepend further tag info)
|
||||||
// max padding: says "do not waste more then ... byte", so here all padding should be taken into account
|
// max padding: says "do not waste more than ... byte", so here all padding should be taken into account
|
||||||
newPadding = firstMediaDataAtom->startOffset() - currentOffset;
|
newPadding = firstMediaDataAtom->startOffset() - currentOffset;
|
||||||
rewriteRequired = (newPadding > 0 && newPadding < 8) || newPadding < fileInfo().minPadding() || (newPadding + newPaddingEnd) > fileInfo().maxPadding();
|
rewriteRequired = (newPadding > 0 && newPadding < 8) || newPadding < fileInfo().minPadding() || (newPadding + newPaddingEnd) > fileInfo().maxPadding();
|
||||||
}
|
}
|
||||||
|
|
|
@ -319,7 +319,7 @@ enum KnownValue : uint32 {
|
||||||
Mpeg4Decoder1 = 0x464D5034,
|
Mpeg4Decoder1 = 0x464D5034,
|
||||||
Mpeg4Decoder2 = 0x53454447,
|
Mpeg4Decoder2 = 0x53454447,
|
||||||
Mpeg4Decoder3 = 0x57563146,
|
Mpeg4Decoder3 = 0x57563146,
|
||||||
Mpeg4Sample = 0x6d703473, /**< MPEG-4 stream (other then video/audio) */
|
Mpeg4Sample = 0x6d703473, /**< MPEG-4 stream (other than video/audio) */
|
||||||
Mpeg4TimedText = 0x74783367, /**< MPEG-4 Timed Text / Streaming text format / Part 17 */
|
Mpeg4TimedText = 0x74783367, /**< MPEG-4 Timed Text / Streaming text format / Part 17 */
|
||||||
Mpeg4Video = 0x6d703476, /**< MPEG-4 video */
|
Mpeg4Video = 0x6d703476, /**< MPEG-4 video */
|
||||||
MsMpeg4V1Decoder1 = 0x44495631,
|
MsMpeg4V1Decoder1 = 0x44495631,
|
||||||
|
|
|
@ -435,7 +435,7 @@ vector<uint64> Mp4Track::readChunkSizes()
|
||||||
addChunkSizeEntries(chunkSizes, firstChunkIndex - previousChunkIndex, sampleIndex, samplesPerChunk);
|
addChunkSizeEntries(chunkSizes, firstChunkIndex - previousChunkIndex, sampleIndex, samplesPerChunk);
|
||||||
} else {
|
} else {
|
||||||
addNotification(NotificationType::Critical,
|
addNotification(NotificationType::Critical,
|
||||||
"The first chunk index of a \"sample to chunk\" entry must be greather then the first chunk of the previous entry and not greather then the chunk count.", context);
|
"The first chunk index of a \"sample to chunk\" entry must be greather than the first chunk of the previous entry and not greather than the chunk count.", context);
|
||||||
throw InvalidDataException();
|
throw InvalidDataException();
|
||||||
}
|
}
|
||||||
previousChunkIndex = firstChunkIndex;
|
previousChunkIndex = firstChunkIndex;
|
||||||
|
|
|
@ -55,7 +55,7 @@ void Mpeg4Descriptor::internalParse()
|
||||||
{
|
{
|
||||||
invalidateStatus();
|
invalidateStatus();
|
||||||
if(maxTotalSize() < minimumElementSize()) {
|
if(maxTotalSize() < minimumElementSize()) {
|
||||||
addNotification(NotificationType::Critical, "Descriptor is smaller then 2 byte and hence invalid. The maximum size within the encloding element is " % numberToString(maxTotalSize()) + '.', "parsing MPEG-4 descriptor");
|
addNotification(NotificationType::Critical, "Descriptor is smaller than 2 byte and hence invalid. The maximum size within the encloding element is " % numberToString(maxTotalSize()) + '.', "parsing MPEG-4 descriptor");
|
||||||
throw TruncatedDataException();
|
throw TruncatedDataException();
|
||||||
}
|
}
|
||||||
stream().seekg(startOffset());
|
stream().seekg(startOffset());
|
||||||
|
|
|
@ -26,7 +26,7 @@ enum class NotificationType
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Sets \a lhs to \a rhs if \a rhs is worse then \a lhs and returns \a lhs.
|
* \brief Sets \a lhs to \a rhs if \a rhs is worse than \a lhs and returns \a lhs.
|
||||||
*/
|
*/
|
||||||
inline NotificationType& operator |=(NotificationType &lhs, const NotificationType &rhs)
|
inline NotificationType& operator |=(NotificationType &lhs, const NotificationType &rhs)
|
||||||
{
|
{
|
||||||
|
|
|
@ -117,7 +117,7 @@ void OggStream::internalParseHeader()
|
||||||
}
|
}
|
||||||
hasIdentificationHeader = true;
|
hasIdentificationHeader = true;
|
||||||
} else {
|
} else {
|
||||||
addNotification(NotificationType::Critical, "Vorbis identification header appears more then once. Oversupplied occurrence will be ignored.", context);
|
addNotification(NotificationType::Critical, "Vorbis identification header appears more than once. Oversupplied occurrence will be ignored.", context);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case VorbisPackageTypes::Comments:
|
case VorbisPackageTypes::Comments:
|
||||||
|
@ -126,7 +126,7 @@ void OggStream::internalParseHeader()
|
||||||
m_container.announceComment(iterator.currentPageIndex(), iterator.currentSegmentIndex(), false, GeneralMediaFormat::Vorbis);
|
m_container.announceComment(iterator.currentPageIndex(), iterator.currentSegmentIndex(), false, GeneralMediaFormat::Vorbis);
|
||||||
hasCommentHeader = true;
|
hasCommentHeader = true;
|
||||||
} else {
|
} else {
|
||||||
addNotification(NotificationType::Critical, "Vorbis comment header appears more then once. Oversupplied occurrence will be ignored.", context);
|
addNotification(NotificationType::Critical, "Vorbis comment header appears more than once. Oversupplied occurrence will be ignored.", context);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case VorbisPackageTypes::Setup:
|
case VorbisPackageTypes::Setup:
|
||||||
|
@ -174,7 +174,7 @@ void OggStream::internalParseHeader()
|
||||||
}
|
}
|
||||||
hasIdentificationHeader = true;
|
hasIdentificationHeader = true;
|
||||||
} else {
|
} else {
|
||||||
addNotification(NotificationType::Critical, "Opus identification header appears more then once. Oversupplied occurrence will be ignored.", context);
|
addNotification(NotificationType::Critical, "Opus identification header appears more than once. Oversupplied occurrence will be ignored.", context);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if(sig == 0x4F70757354616773u) {
|
} else if(sig == 0x4F70757354616773u) {
|
||||||
|
@ -197,7 +197,7 @@ void OggStream::internalParseHeader()
|
||||||
m_container.announceComment(iterator.currentPageIndex(), iterator.currentSegmentIndex(), false, GeneralMediaFormat::Opus);
|
m_container.announceComment(iterator.currentPageIndex(), iterator.currentSegmentIndex(), false, GeneralMediaFormat::Opus);
|
||||||
hasCommentHeader = true;
|
hasCommentHeader = true;
|
||||||
} else {
|
} else {
|
||||||
addNotification(NotificationType::Critical, "Opus tags/comment header appears more then once. Oversupplied occurrence will be ignored.", context);
|
addNotification(NotificationType::Critical, "Opus tags/comment header appears more than once. Oversupplied occurrence will be ignored.", context);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if((sig & 0xFFFFFFFFFF000000u) == 0x7F464C4143000000u) {
|
} else if((sig & 0xFFFFFFFFFF000000u) == 0x7F464C4143000000u) {
|
||||||
|
@ -235,7 +235,7 @@ void OggStream::internalParseHeader()
|
||||||
m_duration = TimeSpan::fromSeconds(static_cast<double>(m_sampleCount) / m_samplingFrequency);
|
m_duration = TimeSpan::fromSeconds(static_cast<double>(m_sampleCount) / m_samplingFrequency);
|
||||||
hasIdentificationHeader = true;
|
hasIdentificationHeader = true;
|
||||||
} else {
|
} else {
|
||||||
addNotification(NotificationType::Critical, "FLAC-to-Ogg mapping header appears more then once. Oversupplied occurrence will be ignored.", context);
|
addNotification(NotificationType::Critical, "FLAC-to-Ogg mapping header appears more than once. Oversupplied occurrence will be ignored.", context);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!hasCommentHeader) {
|
if(!hasCommentHeader) {
|
||||||
|
|
2
tag.cpp
2
tag.cpp
|
@ -63,7 +63,7 @@ std::vector<const TagValue *> Tag::values(KnownField field) const
|
||||||
/*!
|
/*!
|
||||||
* \brief Assigns the given \a values to the specified \a field.
|
* \brief Assigns the given \a values to the specified \a field.
|
||||||
* \remarks
|
* \remarks
|
||||||
* - There might me more then one value assigned to a \a field. Whereas setValue() only alters the first value, this
|
* - There might me more than one value assigned to a \a field. Whereas setValue() only alters the first value, this
|
||||||
* method will replace all currently assigned values with the specified \a values.
|
* method will replace all currently assigned values with the specified \a values.
|
||||||
* - However, the default implementation just sets the first value and discards additional values assuming
|
* - However, the default implementation just sets the first value and discards additional values assuming
|
||||||
* multiple values per field are not supported by the tag.
|
* multiple values per field are not supported by the tag.
|
||||||
|
|
Loading…
Reference in New Issue