Ticket #1506: filezilla3_beta2_sftp_utf8.patch

File filezilla3_beta2_sftp_utf8.patch, 6.2 KB (added by tommywu, 14 years ago)

UTF-8 patch for FileZilla3's sftp mode

  • engine/sftpcontrolsocket.cpp

    diff -Nur src.orig/engine/sftpcontrolsocket.cpp src/engine/sftpcontrolsocket.cpp
    old new  
    264264    LogMessage(Status, _("Connecting to %s:%d..."), server.GetHost().c_str(), server.GetPort());
    265265    SetWait(true);
    266266
     267    if (server.GetEncodingType() == ENCODING_UTF8)
     268        m_useUTF8 = true;
    267269    if (m_pCurrentServer)
    268270        delete m_pCurrentServer;
    269271    m_pCurrentServer = new CServer(server);
     
    277279    if (executable == _T(""))
    278280        executable = _T("fzsftp");
    279281
    280     m_pid = wxExecute(executable + _T(" -v"), wxEXEC_ASYNC, m_pProcess);
     282    m_pid = wxExecute(executable + _T(" -v") + (m_useUTF8 ? _T(" -utf8") : _T("")), wxEXEC_ASYNC, m_pProcess);
    281283    if (!m_pid)
    282284    {
    283285        delete m_pProcess;
     
    481483
    482484    cmd += _T("\n");
    483485
    484     const wxCharBuffer str = cmd.mb_str();
     486    const wxCharBuffer str = m_useUTF8 ? cmd.mb_str(wxConvUTF8) : cmd.mb_str();
    485487    if (!m_pProcess)
    486488        return false;
    487489
     
    862864        return FZ_REPLY_INTERNALERROR;
    863865    }
    864866
    865     wxCharBuffer str = entry.mb_str();
     867    wxCharBuffer str = m_useUTF8 ? entry.mb_str(wxConvUTF8) : entry.mb_str();
    866868    int len = strlen(str);
    867869    char* buffer = new char[len + 1];
    868870    strcpy(buffer, str);
  • putty/fzsftp.c

    diff -Nur src.orig/putty/fzsftp.c src/putty/fzsftp.c
    old new  
    11#include "putty.h"
    22#include "misc.h"
    33
     4int gnFzUseUTF8 = 0;    // use UTF8 enooding or not
     5
    46int fznotify(sftpEventTypes type)
    57{
    68    fprintf(stdout, "%c", (int)type + '0');
  • putty/fzsftp.h

    diff -Nur src.orig/putty/fzsftp.h src/putty/fzsftp.h
    old new  
    2525    sftpReqUnknown
    2626};
    2727
     28extern int gnFzUseUTF8;     // use UTF8 encoding or not
     29
    2830int fznotify(sftpEventTypes type);
    2931int fzprintf(sftpEventTypes type, const char* p, ...);
    3032int fzprintf_raw(sftpEventTypes type, const char* p, ...);
  • putty/psftp.c

    diff -Nur src.orig/putty/psftp.c src/putty/psftp.c
    old new  
    29072907    } else if (strcmp(argv[i], "--") == 0) {
    29082908        i++;
    29092909        break;
     2910    } else if (strcmp(argv[i], "-utf8") == 0) {
     2911        gnFzUseUTF8 = 1;
    29102912    } else {
    29112913        cmdline_error("unknown option \"%s\"", argv[i]);
    29122914    }
  • putty/windows/winsftp.c

    diff -Nur src.orig/putty/windows/winsftp.c src/putty/windows/winsftp.c
    old new  
    7777    HANDLE h;
    7878    RFile *ret;
    7979
    80     h = CreateFile(name, GENERIC_READ, FILE_SHARE_READ, NULL,
    81            OPEN_EXISTING, 0, 0);
     80    if (gnFzUseUTF8) {
     81        int len;
     82
     83        // convert from UTF-8 to UNICODE
     84        len = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)name, -1, NULL, 0);
     85        if (len != 0)
     86        {
     87            wchar_t *p1;
     88
     89            p1 = malloc(sizeof(wchar_t) * (len*2+1));
     90            MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)name, -1 , (LPWSTR)p1, len*2);
     91            h = CreateFileW(p1, GENERIC_READ, FILE_SHARE_READ, NULL,
     92                   OPEN_EXISTING, 0, 0);
     93            free(p1);
     94        }
     95        else {
     96            h = CreateFile(name, GENERIC_READ, FILE_SHARE_READ, NULL,
     97                   OPEN_EXISTING, 0, 0);
     98        }
     99    }
     100    else {
     101        h = CreateFile(name, GENERIC_READ, FILE_SHARE_READ, NULL,
     102               OPEN_EXISTING, 0, 0);
     103    }
    82104    if (h == INVALID_HANDLE_VALUE)
    83105    return NULL;
    84106
     
    125147    HANDLE h;
    126148    WFile *ret;
    127149
    128     h = CreateFile(name, GENERIC_WRITE, 0, NULL,
    129            CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
     150    if (gnFzUseUTF8) {
     151        int len;
     152
     153        // convert from UTF-8 to UNICODE
     154        len = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)name, -1, NULL, 0);
     155        if (len != 0)
     156        {
     157            wchar_t *p1;
     158
     159            p1 = malloc(sizeof(wchar_t) * (len*2+1));
     160            MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)name, -1 , (LPWSTR)p1, len*2);
     161            h = CreateFileW(p1, GENERIC_WRITE, 0, NULL,
     162                   CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
     163            free(p1);
     164        }
     165        else {
     166            h = CreateFile(name, GENERIC_WRITE, 0, NULL,
     167                    CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
     168        }
     169    }
     170    else {
     171        h = CreateFile(name, GENERIC_WRITE, 0, NULL,
     172                CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
     173    }
    130174    if (h == INVALID_HANDLE_VALUE)
    131175    return NULL;
    132176
     
    141185    HANDLE h;
    142186    WFile *ret;
    143187
    144     h = CreateFile(name, GENERIC_WRITE, FILE_SHARE_READ, NULL,
    145            OPEN_EXISTING, 0, 0);
     188    if (gnFzUseUTF8) {
     189        int len;
     190
     191        // convert from UTF-8 to UNICODE
     192        len = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)name, -1, NULL, 0);
     193        if (len != 0)
     194        {
     195            wchar_t *p1;
     196
     197            p1 = malloc(sizeof(wchar_t) * (len*2+1));
     198            MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)name, -1 , (LPWSTR)p1, len*2);
     199            h = CreateFileW(p1, GENERIC_WRITE, FILE_SHARE_READ, NULL,
     200                   OPEN_EXISTING, 0, 0);
     201            free(p1);
     202        }
     203        else {
     204            h = CreateFile(name, GENERIC_WRITE, FILE_SHARE_READ, NULL,
     205                   OPEN_EXISTING, 0, 0);
     206        }
     207    }
     208    else {
     209        h = CreateFile(name, GENERIC_WRITE, FILE_SHARE_READ, NULL,
     210               OPEN_EXISTING, 0, 0);
     211    }
    146212    if (h == INVALID_HANDLE_VALUE)
    147213    return NULL;
    148214
     
    223289int file_type(char *name)
    224290{
    225291    DWORD attr;
    226     attr = GetFileAttributes(name);
     292    if (gnFzUseUTF8) {
     293        int len;
     294
     295        // convert from UTF-8 to UNICODE
     296        len = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)name, -1, NULL, 0);
     297        if (len != 0)
     298        {
     299            wchar_t *p1;
     300
     301            p1 = malloc(sizeof(wchar_t) * (len*2+1));
     302            MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)name, -1 , (LPWSTR)p1, len*2);
     303            attr = GetFileAttributesW(name);
     304            free(p1);
     305        }
     306        else {
     307            attr = GetFileAttributes(name);
     308        }
     309    }
     310    else {
     311        attr = GetFileAttributes(name);
     312    }
    227313    /* We know of no `weird' files under Windows. */
    228314    if (attr == (DWORD)-1)
    229315    return FILE_TYPE_NONEXISTENT;