From dbe3a03b6211c9d77ce4ccf6a7a9ac0fc4bb2bf3 Mon Sep 17 00:00:00 2001 From: Tsuda Kageyu Date: Thu, 19 Nov 2015 14:08:40 +0900 Subject: [PATCH] Hide string handler implementations from public headers. --- taglib/mpeg/id3v1/id3v1tag.cpp | 76 +++++++++++++++------------------- taglib/mpeg/id3v1/id3v1tag.h | 44 -------------------- taglib/mpeg/id3v2/id3v2tag.cpp | 63 ++++++++++++---------------- taglib/mpeg/id3v2/id3v2tag.h | 43 ++----------------- taglib/riff/wav/infotag.cpp | 57 ++++++++++--------------- taglib/riff/wav/infotag.h | 34 --------------- 6 files changed, 87 insertions(+), 230 deletions(-) diff --git a/taglib/mpeg/id3v1/id3v1tag.cpp b/taglib/mpeg/id3v1/id3v1tag.cpp index bcb773c3..5c3f85d1 100644 --- a/taglib/mpeg/id3v1/id3v1tag.cpp +++ b/taglib/mpeg/id3v1/id3v1tag.cpp @@ -32,6 +32,28 @@ using namespace TagLib; using namespace ID3v1; +namespace +{ + class DefaultStringHandler : public TagLib::StringHandler + { + virtual String parse(const ByteVector &data) const + { + return String(data, String::Latin1).stripWhiteSpace(); + } + + virtual ByteVector render(const String &s) const + { + if(s.isLatin1()) + return s.data(String::Latin1); + else + return ByteVector(); + } + }; + + const DefaultStringHandler defaultStringHandler; + const TagLib::StringHandler *stringHandler = &defaultStringHandler; +} + class ID3v1::Tag::TagPrivate { public: @@ -47,38 +69,8 @@ public: String comment; uchar track; uchar genre; - - static const TagLib::StringHandler *stringHandler; }; -namespace -{ - const ID3v1::StringHandler defaultStringHandler; -} - -const TagLib::StringHandler *ID3v1::Tag::TagPrivate::stringHandler = &defaultStringHandler; - -//////////////////////////////////////////////////////////////////////////////// -// StringHandler implementation -//////////////////////////////////////////////////////////////////////////////// - -ID3v1::StringHandler::StringHandler() -{ -} - -String ID3v1::StringHandler::parse(const ByteVector &data) const -{ - return String(data, String::Latin1).stripWhiteSpace(); -} - -ByteVector ID3v1::StringHandler::render(const String &s) const -{ - if(s.isLatin1()) - return s.data(String::Latin1); - else - return ByteVector(); -} - //////////////////////////////////////////////////////////////////////////////// // public methods //////////////////////////////////////////////////////////////////////////////// @@ -107,11 +99,11 @@ ByteVector ID3v1::Tag::render() const ByteVector data; data.append(fileIdentifier()); - data.append(TagPrivate::stringHandler->render(d->title).resize(30)); - data.append(TagPrivate::stringHandler->render(d->artist).resize(30)); - data.append(TagPrivate::stringHandler->render(d->album).resize(30)); - data.append(TagPrivate::stringHandler->render(d->year).resize(4)); - data.append(TagPrivate::stringHandler->render(d->comment).resize(28)); + data.append(stringHandler->render(d->title).resize(30)); + data.append(stringHandler->render(d->artist).resize(30)); + data.append(stringHandler->render(d->album).resize(30)); + data.append(stringHandler->render(d->year).resize(4)); + data.append(stringHandler->render(d->comment).resize(28)); data.append(char(0)); data.append(char(d->track)); data.append(char(d->genre)); @@ -207,9 +199,9 @@ void ID3v1::Tag::setGenreNumber(TagLib::uint i) void ID3v1::Tag::setStringHandler(const TagLib::StringHandler *handler) { if(handler) - TagPrivate::stringHandler = handler; + stringHandler = handler; else - TagPrivate::stringHandler = &defaultStringHandler; + stringHandler = &defaultStringHandler; } //////////////////////////////////////////////////////////////////////////////// @@ -235,16 +227,16 @@ void ID3v1::Tag::parse(const ByteVector &data) { int offset = 3; - d->title = TagPrivate::stringHandler->parse(data.mid(offset, 30)); + d->title = stringHandler->parse(data.mid(offset, 30)); offset += 30; - d->artist = TagPrivate::stringHandler->parse(data.mid(offset, 30)); + d->artist = stringHandler->parse(data.mid(offset, 30)); offset += 30; - d->album = TagPrivate::stringHandler->parse(data.mid(offset, 30)); + d->album = stringHandler->parse(data.mid(offset, 30)); offset += 30; - d->year = TagPrivate::stringHandler->parse(data.mid(offset, 4)); + d->year = stringHandler->parse(data.mid(offset, 4)); offset += 4; // Check for ID3v1.1 -- Note that ID3v1 *does not* support "track zero" -- this @@ -255,7 +247,7 @@ void ID3v1::Tag::parse(const ByteVector &data) if(data[offset + 28] == 0 && data[offset + 29] != 0) { // ID3v1.1 detected - d->comment = TagPrivate::stringHandler->parse(data.mid(offset, 28)); + d->comment = stringHandler->parse(data.mid(offset, 28)); d->track = uchar(data[offset + 29]); } else diff --git a/taglib/mpeg/id3v1/id3v1tag.h b/taglib/mpeg/id3v1/id3v1tag.h index 01dda34b..8ac83546 100644 --- a/taglib/mpeg/id3v1/id3v1tag.h +++ b/taglib/mpeg/id3v1/id3v1tag.h @@ -39,48 +39,6 @@ namespace TagLib { namespace ID3v1 { - //! A abstraction for the string to data encoding in ID3v1 tags. - - /*! - * ID3v1 should in theory always contain ISO-8859-1 (Latin1) data. In - * practice it does not. TagLib by default only supports ISO-8859-1 data - * in ID3v1 tags. - * - * However by subclassing TagLib::StringHandler class and reimplementing - * parse() and render() and setting your reimplementation as the default - * with ID3v1::Tag::setStringHandler() you can define how you would like - * these transformations to be done. - * - * \warning It is advisable not to write non-ISO-8859-1 data to ID3v1 - * tags. Please consider disabling the writing of ID3v1 tags in the case - * that the data is not ISO-8859-1. - * - * \see ID3v1::Tag::setStringHandler() - */ - - class TAGLIB_EXPORT StringHandler : public TagLib::StringHandler - { - public: - StringHandler(); - - /*! - * Decode a string from \a data. The default implementation assumes that - * \a data is an ISO-8859-1 (Latin1) character array. - */ - virtual String parse(const ByteVector &data) const; - - /*! - * Encode a ByteVector with the data from \a s. The default implementation - * assumes that \a s is an ISO-8859-1 (Latin1) string. If the string is - * does not conform to ISO-8859-1, no value is written. - * - * \warning It is recommended that you not override this method, but - * instead do not write an ID3v1 tag in the case that the data is not - * ISO-8859-1. - */ - virtual ByteVector render(const String &s) const; - }; - //! The main class in the ID3v1 implementation /*! @@ -173,8 +131,6 @@ namespace TagLib { * * \note The caller is responsible for deleting the previous handler * as needed after it is released. - * - * \see StringHandler */ static void setStringHandler(const TagLib::StringHandler *handler); diff --git a/taglib/mpeg/id3v2/id3v2tag.cpp b/taglib/mpeg/id3v2/id3v2tag.cpp index b4a4bcf9..b7b183a4 100644 --- a/taglib/mpeg/id3v2/id3v2tag.cpp +++ b/taglib/mpeg/id3v2/id3v2tag.cpp @@ -51,6 +51,29 @@ using namespace TagLib; using namespace ID3v2; +namespace +{ + class DefaultStringHandler : public TagLib::StringHandler + { + virtual String parse(const ByteVector &data) const + { + return String(data, String::Latin1); + } + + virtual ByteVector render(const String &s) const + { + // Not implemented on purpose. This function is never used. + return ByteVector(); + } + }; + + const DefaultStringHandler defaultStringHandler; + const TagLib::StringHandler *stringHandler = &defaultStringHandler; + + const offset_t MinPaddingSize = 1024; + const offset_t MaxPaddingSize = 1024 * 1024; +} + class ID3v2::Tag::TagPrivate { public: @@ -79,41 +102,8 @@ public: FrameListMap frameListMap; FrameList frameList; - - static const TagLib::StringHandler *stringHandler; }; -namespace -{ - const ID3v2::Latin1StringHandler defaultStringHandler; -} - -const TagLib::StringHandler *ID3v2::Tag::TagPrivate::stringHandler = &defaultStringHandler; - -namespace -{ - const offset_t MinPaddingSize = 1024; - const offset_t MaxPaddingSize = 1024 * 1024; -} - -//////////////////////////////////////////////////////////////////////////////// -// Latin1StringHandler implementation -//////////////////////////////////////////////////////////////////////////////// - -ID3v2::Latin1StringHandler::Latin1StringHandler() -{ -} - -String ID3v2::Latin1StringHandler::parse(const ByteVector &data) const -{ - return String(data, String::Latin1); -} - -ByteVector ID3v2::Latin1StringHandler::render(const String &) const -{ - return ByteVector(); -} - //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// @@ -141,7 +131,6 @@ ID3v2::Tag::~Tag() delete d; } - String ID3v2::Tag::title() const { if(!d->frameListMap["TIT2"].isEmpty()) @@ -654,15 +643,15 @@ ByteVector ID3v2::Tag::render(int version) const TagLib::StringHandler const *ID3v2::Tag::latin1StringHandler() { - return TagPrivate::stringHandler; + return stringHandler; } void ID3v2::Tag::setLatin1StringHandler(const TagLib::StringHandler *handler) { if(handler) - TagPrivate::stringHandler = handler; + stringHandler = handler; else - TagPrivate::stringHandler = &defaultStringHandler; + stringHandler = &defaultStringHandler; } //////////////////////////////////////////////////////////////////////////////// diff --git a/taglib/mpeg/id3v2/id3v2tag.h b/taglib/mpeg/id3v2/id3v2tag.h index cd742c5c..2a84bed2 100644 --- a/taglib/mpeg/id3v2/id3v2tag.h +++ b/taglib/mpeg/id3v2/id3v2tag.h @@ -58,42 +58,6 @@ namespace TagLib { typedef List FrameList; typedef Map FrameListMap; - //! An abstraction for the ISO-8859-1 string to data encoding in ID3v2 tags. - - /*! - * ID3v2 tag can store strings in ISO-8859-1 (Latin1), and TagLib only - * supports genuine ISO-8859-1 by default. However, in practice, non - * ISO-8859-1 encodings are often used instead of ISO-8859-1, such as - * Windows-1252 for western languages, Shift_JIS for Japanese and so on. - * - * Here is an option to read such tags by subclassing this class, - * reimplementing parse() and setting your reimplementation as the default - * with ID3v2::Tag::setStringHandler(). - * - * \note Writing non-ISO-8859-1 tags is not implemented intentionally. - * Use UTF-16 or UTF-8 instead. - * - * \see ID3v2::Tag::setStringHandler() - */ - class TAGLIB_EXPORT Latin1StringHandler : public TagLib::StringHandler - { - public: - Latin1StringHandler(); - - /*! - * Decode a string from \a data. The default implementation assumes that - * \a data is an ISO-8859-1 (Latin1) character array. - */ - virtual String parse(const ByteVector &data) const; - - /*! - * Encode a ByteVector with the data from \a s. - * - * \note Not implemented intentionally. Always returns empty \s ByteVector. - */ - virtual ByteVector render(const String &s) const; - }; - //! The main class in the ID3v2 implementation /*! @@ -364,8 +328,6 @@ namespace TagLib { /*! * Gets the current string handler that decides how the "Latin-1" data * will be converted to and from binary data. - * - * \see Latin1StringHandler */ static TagLib::StringHandler const *latin1StringHandler(); @@ -378,7 +340,10 @@ namespace TagLib { * \note The caller is responsible for deleting the previous handler * as needed after it is released. * - * \see Latin1StringHandler + * \note User defined string handers are not used for rendering tags. + * TagLib doesn't support writing non-standard tags. + * + * \see latin1StringHandler */ static void setLatin1StringHandler(const TagLib::StringHandler *handler); diff --git a/taglib/riff/wav/infotag.cpp b/taglib/riff/wav/infotag.cpp index 24e0304a..b9431ab9 100644 --- a/taglib/riff/wav/infotag.cpp +++ b/taglib/riff/wav/infotag.cpp @@ -32,42 +32,31 @@ using namespace TagLib; using namespace RIFF::Info; +namespace +{ + class DefaultStringHandler : public TagLib::StringHandler + { + virtual String parse(const ByteVector &data) const + { + return String(data, String::UTF8); + } + + virtual ByteVector render(const String &s) const + { + return s.data(String::UTF8); + } + }; + + const DefaultStringHandler defaultStringHandler; + const TagLib::StringHandler *stringHandler = &defaultStringHandler; +} + class RIFF::Info::Tag::TagPrivate { public: - TagPrivate() - {} - FieldMap fieldMap; - - static const TagLib::StringHandler *stringHandler; }; -namespace -{ - const RIFF::Info::StringHandler defaultStringHandler; -} - -const TagLib::StringHandler *RIFF::Info::Tag::TagPrivate::stringHandler = &defaultStringHandler; - -//////////////////////////////////////////////////////////////////////////////// -// StringHandler implementation -//////////////////////////////////////////////////////////////////////////////// - -RIFF::Info::StringHandler::StringHandler() -{ -} - -String RIFF::Info::StringHandler::parse(const ByteVector &data) const -{ - return String(data, String::UTF8); -} - -ByteVector RIFF::Info::StringHandler::render(const String &s) const -{ - return s.data(String::UTF8); -} - //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// @@ -208,7 +197,7 @@ ByteVector RIFF::Info::Tag::render() const FieldMap::ConstIterator it = d->fieldMap.begin(); for(; it != d->fieldMap.end(); ++it) { - ByteVector text = TagPrivate::stringHandler->render(it->second); + ByteVector text = stringHandler->render(it->second); if(text.isEmpty()) continue; @@ -230,9 +219,9 @@ ByteVector RIFF::Info::Tag::render() const void RIFF::Info::Tag::setStringHandler(const TagLib::StringHandler *handler) { if(handler) - TagPrivate::stringHandler = handler; + stringHandler = handler; else - TagPrivate::stringHandler = &defaultStringHandler; + stringHandler = &defaultStringHandler; } //////////////////////////////////////////////////////////////////////////////// @@ -249,7 +238,7 @@ void RIFF::Info::Tag::parse(const ByteVector &data) const ByteVector id = data.mid(p, 4); if(RIFF::File::isValidChunkName(id)) { - const String text = TagPrivate::stringHandler->parse(data.mid(p + 8, size)); + const String text = stringHandler->parse(data.mid(p + 8, size)); d->fieldMap[id] = text; } diff --git a/taglib/riff/wav/infotag.h b/taglib/riff/wav/infotag.h index 0812d264..8960ebc5 100644 --- a/taglib/riff/wav/infotag.h +++ b/taglib/riff/wav/infotag.h @@ -45,38 +45,6 @@ namespace TagLib { typedef Map FieldMap; - //! A abstraction for the string to data encoding in Info tags. - - /*! - * RIFF INFO tag has no clear definitions about character encodings. - * In practice, local encoding of each system is largely used and UTF-8 is - * popular too. - * - * Here is an option to read and write tags in your preferred encoding - * by subclassing this class, reimplementing parse() and render() and setting - * your reimplementation as the default with Info::Tag::setStringHandler(). - * - * \see ID3v1::Tag::setStringHandler() - */ - - class TAGLIB_EXPORT StringHandler : public TagLib::StringHandler - { - public: - StringHandler(); - - /*! - * Decode a string from \a data. The default implementation assumes that - * \a data is an UTF-8 character array. - */ - virtual String parse(const ByteVector &data) const; - - /*! - * Encode a ByteVector with the data from \a s. The default implementation - * assumes that \a s is an UTF-8 string. - */ - virtual ByteVector render(const String &s) const; - }; - //! The main class in the RIFF INFO tag implementation /*! @@ -169,8 +137,6 @@ namespace TagLib { * * \note The caller is responsible for deleting the previous handler * as needed after it is released. - * - * \see StringHandler */ static void setStringHandler(const TagLib::StringHandler *handler);