From f386de0f0d56991a2e8cbe26edaf5687e15af2e6 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sun, 16 Jan 2011 17:41:38 +0100 Subject: [PATCH] Fix problems with reading files because of filename charsets. --- CMakeLists.txt | 4 ++++ CMakeModules/CheckTagLibFileName.cmake | 15 +++++++++++++++ src/musicscanner.cpp | 9 ++++++++- 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 CMakeModules/CheckTagLibFileName.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 73079fa95..cbe7491dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,10 @@ ELSE() ENDIF() FIND_PACKAGE( Taglib 1.6.0 REQUIRED ) +include(CheckTagLibFileName) +check_taglib_filename(COMPLEX_TAGLIB_FILENAME) + + FIND_PACKAGE( LibLastFm REQUIRED ) FIND_PACKAGE( LibEchonest REQUIRED ) diff --git a/CMakeModules/CheckTagLibFileName.cmake b/CMakeModules/CheckTagLibFileName.cmake new file mode 100644 index 000000000..da5dc7df4 --- /dev/null +++ b/CMakeModules/CheckTagLibFileName.cmake @@ -0,0 +1,15 @@ +# taglib changed filenames to be a char/wchar struct on some platforms, need to check for it +macro (CHECK_TAGLIB_FILENAME TAGLIB_FILENAME_COMPLEX) + include (CheckCXXSourceCompiles) + set (CMAKE_REQUIRED_FLAGS ${TAGLIB_CFLAGS}) + set (CMAKE_REQUIRED_INCLUDES ${TAGLIB_INCLUDES}) + set (CMAKE_REQUIRED_LIBRARIES ${TAGLIB_LIBRARIES}) + check_cxx_source_compiles( + "#include + int main() + { + TagLib::FileName fileName1("char"); + TagLib::FileName fileName2(L"wchar"); + return 0; + }" ${TAGLIB_FILENAME_COMPLEX}) +endmacro (CHECK_TAGLIB_FILENAME) diff --git a/src/musicscanner.cpp b/src/musicscanner.cpp index 4e8b5ced8..2fa64f5d6 100644 --- a/src/musicscanner.cpp +++ b/src/musicscanner.cpp @@ -160,7 +160,14 @@ MusicScanner::readFile( const QFileInfo& fi ) if( m_scanned % 100 == 0 ) qDebug() << "SCAN" << m_scanned << fi.absoluteFilePath(); - TagLib::FileRef f( fi.absoluteFilePath().toUtf8().constData() ); + #ifdef COMPLEX_TAGLIB_FILENAME + const wchar_t *encodedName = reinterpret_cast< const wchar_t *>(fi.absoluteFilePath().utf16()); + #else + QByteArray fileName = QFile::encodeName( fi.absoluteFilePath() ); + const char *encodedName = fileName.constData(); + #endif + + TagLib::FileRef f( encodedName ); if ( f.isNull() || !f.tag() ) { // qDebug() << "Doesn't seem to be a valid audiofile:" << fi.absoluteFilePath();