From: Olivier Goffart Date: Tue, 4 Jul 2017 10:20:59 +0000 (+0200) Subject: csync: Use Qt for encodeing/decoding filesystem strings X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~704^2^2~38 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=acf65b4c23ebb944b9fe1df09d08be802642596a;p=nextcloud-desktop.git csync: Use Qt for encodeing/decoding filesystem strings Issues: - #5661 On mac, iconv did not support all of unicode and some files with emoji in the filename could not be uploaded - #5719 , #5676 On linux, we will now support non utf-8 locale --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 116dca4cc..9b6e9810d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -191,6 +191,19 @@ add_definitions( -D__USE_MINGW_ANSI_STDIO=1 ) add_definitions( -DNOMINMAX ) endif( WIN32 ) +include(QtVersionAbstraction) +setup_qt() +if (${Qt5Core_VERSION_MAJOR} EQUAL "5") + if (${Qt5Core_VERSION_MINOR} EQUAL "6" OR ${Qt5Core_VERSION_MINOR} GREATER 6) + else() + message(STATUS "If possible compile me with Qt 5.6 or higher.") + endif() +endif() + +if (APPLE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") +endif() + # Handle Translations, pick all client_* files from trans directory. file( GLOB TRANS_FILES ${CMAKE_SOURCE_DIR}/translations/client_*.ts) set(TRANSLATIONS ${TRANS_FILES}) diff --git a/csync/src/std/CMakeLists.txt b/csync/src/std/CMakeLists.txt index 77d7e0ff0..519cada86 100644 --- a/csync/src/std/CMakeLists.txt +++ b/csync/src/std/CMakeLists.txt @@ -36,6 +36,7 @@ include_directories( add_library(${CSTDLIB_LIBRARY} STATIC ${cstdlib_SRCS}) if(NOT WIN32) add_definitions( -fPIC ) + qt5_use_modules(${CSTDLIB_LIBRARY} Core) endif() if(NOT HAVE_FNMATCH AND WIN32) # needed for PathMatchSpec for our fnmatch replacement diff --git a/csync/src/std/c_utf8.cc b/csync/src/std/c_utf8.cc index 88e28c990..4bd5d75ac 100644 --- a/csync/src/std/c_utf8.cc +++ b/csync/src/std/c_utf8.cc @@ -21,18 +21,17 @@ #include "config_csync.h" -#include -#include +#ifdef _WIN32 #include #include #include - #include #include #include - -#ifdef _WIN32 #include +#else +#include +#include #endif extern "C" { @@ -42,18 +41,15 @@ extern "C" { /* Convert a locale String to UTF8 */ char* c_utf8_from_locale(const mbchar_t *wstr) { - char *dst = NULL; -#ifdef _WIN32 - char *mdst = NULL; - int size_needed; - size_t len; -#endif - if (wstr == NULL) { return NULL; } #ifdef _WIN32 + char *dst = NULL; + char *mdst = NULL; + int size_needed; + size_t len; len = wcslen(wstr); /* Call once to get the required size. */ size_needed = WideCharToMultiByte(CP_UTF8, 0, wstr, len, NULL, 0, NULL, NULL); @@ -64,26 +60,33 @@ char* c_utf8_from_locale(const mbchar_t *wstr) WideCharToMultiByte(CP_UTF8, 0, wstr, len, mdst, size_needed, NULL, NULL); dst = mdst; } + return dst; #else - dst = c_strdup(wstr); + QTextDecoder dec(QTextCodec::codecForLocale()); + QString s = dec.toUnicode(wstr, qstrlen(wstr)); + if (s.isEmpty() || dec.hasFailure()) { + /* Conversion error: since we can't report error from this function, just return the original + string. We take care of invalid utf-8 in SyncEngine::treewalkFile */ + return c_strdup(wstr); + } +#ifdef __APPLE__ + s = s.normalized(QString::NormalizationForm_C); +#endif + return c_strdup(std::move(s).toUtf8().constData()); #endif - return dst; } /* Convert a an UTF8 string to locale */ mbchar_t* c_utf8_string_to_locale(const char *str) { - mbchar_t *dst = NULL; -#ifdef _WIN32 - size_t len; - int size_needed; -#endif - if (str == NULL ) { return NULL; } - #ifdef _WIN32 + mbchar_t *dst = NULL; + size_t len; + int size_needed; + len = strlen(str); size_needed = MultiByteToWideChar(CP_UTF8, 0, str, len, NULL, 0); if (size_needed > 0) { @@ -92,10 +95,10 @@ mbchar_t* c_utf8_string_to_locale(const char *str) memset((void*)dst, 0, size_char); MultiByteToWideChar(CP_UTF8, 0, str, -1, dst, size_needed); } + return dst; #else - dst = c_strdup(str); + return c_strdup(QFile::encodeName(QString::fromUtf8(str))); #endif - return dst; } } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1b53279d2..3cbacd537 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,19 +4,6 @@ endif() set(synclib_NAME ${APPLICATION_EXECUTABLE}sync) -include(QtVersionAbstraction) -setup_qt() -if (${Qt5Core_VERSION_MAJOR} EQUAL "5") - if (${Qt5Core_VERSION_MINOR} EQUAL "6" OR ${Qt5Core_VERSION_MINOR} GREATER 6) - else() - message(STATUS "If possible compile me with Qt 5.6 or higher.") - endif() -endif() - -if (APPLE) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") -endif() - if(NOT TOKEN_AUTH_ONLY) find_package(Qt5Keychain REQUIRED) endif()