diff -dPNur id3lib-3.8.3-orig/configure.in id3lib-3.8.3-new/configure.in --- id3lib-3.8.3-orig/configure.in 2003-03-02 01:23:00.000000000 +0100 +++ id3lib-3.8.3-new/configure.in 2005-07-19 22:03:12.000000000 +0200 @@ -217,6 +217,20 @@ LIBS="$LIBS $ICONV_LIB" fi +AC_CHECK_LIB(rcc, rccInit,[ + AC_CHECK_HEADERS(librcc.h,[ + LIBRCC_LIBS="-lrcc" + LIBRCC_INCLUDES="-DHAVE_LIBRCC" + ],[ + LIBRCC_LIBS="" + LIBRCC_INCLUDES="" +])],[ + LIBRCC_LIBS="" + LIBRCC_INCLUDES="" +]) +AC_SUBST(LIBRCC_LIBS) +AC_SUBST(LIBRCC_INCLUDES) + dnl Check for c++ features AC_LANG_SAVE AC_LANG_CPLUSPLUS @@ -315,5 +329,5 @@ src/Makefile \ examples/Makefile \ prj/Makefile \ - libprj/Makefile + libprj/Makefile ) diff -dPNur id3lib-3.8.3-orig/src/field_string_ascii.cpp id3lib-3.8.3-new/src/field_string_ascii.cpp --- id3lib-3.8.3-orig/src/field_string_ascii.cpp 2003-03-02 01:23:00.000000000 +0100 +++ id3lib-3.8.3-new/src/field_string_ascii.cpp 2005-07-19 21:34:12.000000000 +0200 @@ -27,6 +27,7 @@ #include "field_impl.h" #include "id3/utils.h" // has "id3/id3lib_streams.h" "id3/globals.h" "id3/id3lib_strings.h" #include "io_helpers.h" +#include "rccpatch.h" using namespace dami; @@ -92,8 +93,15 @@ buffer != NULL && maxLength > 0) { String data = this->GetText(); + char *recoded = rccPatchRecode(data.data(), (size_t)data.size(), (size_t*)&size); + if (recoded) { + size = dami::min(maxLength, size); + ::memcpy(buffer, recoded, size); + free(recoded); + } else { size = dami::min(maxLength, data.size()); ::memcpy(buffer, data.data(), size); + } if (size < maxLength) { buffer[size] = '\0'; diff -dPNur id3lib-3.8.3-orig/src/Makefile.am id3lib-3.8.3-new/src/Makefile.am --- id3lib-3.8.3-orig/src/Makefile.am 2003-03-02 01:23:00.000000000 +0100 +++ id3lib-3.8.3-new/src/Makefile.am 2005-07-19 21:38:31.000000000 +0200 @@ -17,7 +17,7 @@ zlib_include = endif -INCLUDES = \ +INCLUDES = @LIBRCC_INCLUDES@ \ @ID3LIB_DEBUG_FLAGS@ -I$(top_srcdir)/include/id3 -I$(top_srcdir)/include $(zlib_include) noinst_HEADERS = \ @@ -31,7 +31,8 @@ header_tag.h \ mp3_header.h \ tag_impl.h \ - spec.h + spec.h \ + rccpatch.h id3lib_sources = \ c_wrapper.cpp \ @@ -66,7 +67,8 @@ tag_parse_v1.cpp \ tag_render.cpp \ utils.cpp \ - writers.cpp + writers.cpp \ + rccpatch.cpp lib_LTLIBRARIES = libid3.la @@ -77,6 +79,7 @@ endif libid3_la_LDFLAGS = \ + @LIBRCC_LIBS@ \ -version-info $(LT_VERSION) \ -release $(LT_RELEASE) \ -export-dynamic diff -dPNur id3lib-3.8.3-orig/src/rccpatch.cpp id3lib-3.8.3-new/src/rccpatch.cpp --- id3lib-3.8.3-orig/src/rccpatch.cpp 1970-01-01 01:00:00.000000000 +0100 +++ id3lib-3.8.3-new/src/rccpatch.cpp 2005-07-19 22:10:47.000000000 +0200 @@ -0,0 +1,60 @@ +#include + +#include "../config.h" + +#ifdef HAVE_LIBRCC +# include +#endif /* HAVE_LIBRCC */ + + +#ifdef HAVE_LIBRCC +# define ID3_CLASS 0 +# define OUT_CLASS 1 +static rcc_class classes[] = { + { "id3", RCC_CLASS_STANDARD, NULL, NULL, "ID3 Encoding", 0 }, + { "out", RCC_CLASS_STANDARD, NULL, NULL, "Output Encoding", 0 }, + { NULL, RCC_CLASS_STANDARD, NULL, NULL, NULL, 0 } +}; + +static int rcc_initialized = 0; +#endif /* HAVE_LIBRCC */ + + +void rccPatchFree() { +#ifdef HAVE_LIBRCC + if (rcc_initialized) { + rccFree(); + rcc_initialized = 0; + } +#endif /* HAVE_LIBRCC */ +} + +void rccPatchInit() { +#ifdef HAVE_LIBRCC + if (rcc_initialized) return; + rccInit(); + rccInitDefaultContext(NULL, 0, 0, classes, 0); + rccLoad(NULL, "xmms"); + rccInitDb4(NULL, NULL, 0); + rcc_initialized = 1; +#endif /* HAVE_LIBRCC */ +} + +static void rccPatchTryInit() { +#ifdef HAVE_LIBRCC + if (!rcc_initialized) { + rccPatchInit(); + if (rcc_initialized) atexit(rccPatchFree); + } +#endif /* HAVE_LIBRCC */ +} + +char *rccPatchRecode(const char *str, size_t len, size_t *rlen) { +#ifdef HAVE_LIBRCC + char *res; + rccPatchTryInit(); + return rccSizedRecode(NULL, ID3_CLASS, OUT_CLASS, str, len, rlen); +#else + return NULL; +#endif /* HAVE_LIBRCC */ +} diff -dPNur id3lib-3.8.3-orig/src/rccpatch.h id3lib-3.8.3-new/src/rccpatch.h --- id3lib-3.8.3-orig/src/rccpatch.h 1970-01-01 01:00:00.000000000 +0100 +++ id3lib-3.8.3-new/src/rccpatch.h 2005-07-19 21:34:51.000000000 +0200 @@ -0,0 +1,3 @@ +void rccPatchFree(); +void rccPatchInit(); +char *rccPatchRecode(const char *str, size_t len, size_t *rlen);