From: Tsuda Kageyu Date: Sat, 8 Jun 2013 00:59:36 +0000 (+0900) Subject: Enabled users to define custom debug message listeners X-Git-Tag: v1.9~19^2~7 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3b2d6206714dc0fecec45d8a51f66e38e7054b2f;p=taglib Enabled users to define custom debug message listeners --- diff --git a/taglib/toolkit/tdebug.cpp b/taglib/toolkit/tdebug.cpp index 129aee84..95d5c55f 100644 --- a/taglib/toolkit/tdebug.cpp +++ b/taglib/toolkit/tdebug.cpp @@ -31,5 +31,10 @@ using namespace TagLib; void TagLib::debug(const String &s) { - getDebugListener()->listen(s); + getDebugListener()->printMessage(s); +} + +void TagLib::debugData(const ByteVector &v) +{ + getDebugListener()->printData(v); } diff --git a/taglib/toolkit/tdebug.h b/taglib/toolkit/tdebug.h index e0c6615f..bd94d159 100644 --- a/taglib/toolkit/tdebug.h +++ b/taglib/toolkit/tdebug.h @@ -29,6 +29,7 @@ namespace TagLib { class String; + class ByteVector; #ifndef DO_NOT_DOCUMENT @@ -44,6 +45,17 @@ namespace TagLib { * \internal */ void debug(const String &s); + + /*! + * For debugging binary data. + * + * \warning Do not use this outside of TagLib, it could lead to undefined + * symbols in your build if TagLib is built with NDEBUG defined and your + * application is not. + * + * \internal + */ + void debugData(const ByteVector &v); } #endif diff --git a/taglib/toolkit/tdebuglistener.cpp b/taglib/toolkit/tdebuglistener.cpp index 499134aa..bce94312 100644 --- a/taglib/toolkit/tdebuglistener.cpp +++ b/taglib/toolkit/tdebuglistener.cpp @@ -27,6 +27,7 @@ #ifndef NDEBUG # include +# include # ifdef _WIN32 # include # endif @@ -39,7 +40,7 @@ namespace class DefaultListener : public DebugListener { public: - virtual void listen(const String &msg) + virtual void printMessage(const String &msg) { #ifndef NDEBUG # ifdef _WIN32 @@ -59,23 +60,51 @@ namespace std::cerr << "TagLib: " << msg << std::endl; # endif +#endif + } + + virtual void printData(const ByteVector &v) + { +#ifndef NDEBUG + + for(size_t i = 0; i < v.size(); i++) + { + std::cout << "*** [" << i << "] - '" << char(v[i]) << "' - int " << int(v[i]) + << std::endl; + + std::bitset<8> b(v[i]); + + for(int j = 0; j < 8; j++) + std::cout << i << ":" << j << " " << b.test(j) << std::endl; + + std::cout << std::endl; + } + #endif } }; DefaultListener defaultListener; - DebugListener *traceListener = &defaultListener; + DebugListener *debugListener = &defaultListener; +} + +TagLib::DebugListener::DebugListener() +{ +} + +TagLib::DebugListener::~DebugListener() +{ } void TagLib::setDebugListener(DebugListener *listener) { if(listener) - traceListener = listener; + debugListener = listener; else - traceListener = &defaultListener; + debugListener = &defaultListener; } DebugListener *TagLib::getDebugListener() { - return traceListener; + return debugListener; } diff --git a/taglib/toolkit/tdebuglistener.h b/taglib/toolkit/tdebuglistener.h index 5d66c91a..3dd3a734 100644 --- a/taglib/toolkit/tdebuglistener.h +++ b/taglib/toolkit/tdebuglistener.h @@ -43,7 +43,16 @@ namespace TagLib class TAGLIB_EXPORT DebugListener { public: - virtual void listen(const String &msg) = 0; + DebugListener(); + virtual ~DebugListener(); + + virtual void printMessage(const String &msg) = 0; + virtual void printData(const ByteVector &data) = 0; + + private: + // Noncopyable + DebugListener(const DebugListener &); + DebugListener &operator=(const DebugListener &); }; /*! @@ -56,14 +65,14 @@ namespace TagLib * * \see DebugListener */ - void setDebugListener(DebugListener *listener); + TAGLIB_EXPORT void setDebugListener(DebugListener *listener); #ifndef DO_NOT_DOCUMENT /*! * \internal */ - DebugListener *getDebugListener(); + TAGLIB_EXPORT DebugListener *getDebugListener(); #endif }