From 60bd665e74cfeeaf70882173a0dd56c883e2014a Mon Sep 17 00:00:00 2001
From: "Suren A. Chilingaryan" <csa@suren.me>
Date: Fri, 12 Mar 2021 03:55:34 +0100
Subject: Added to git tree

---
 patches/gftp/gftp-ds-rcc.patch | 822 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 822 insertions(+)
 create mode 100644 patches/gftp/gftp-ds-rcc.patch

(limited to 'patches/gftp')

diff --git a/patches/gftp/gftp-ds-rcc.patch b/patches/gftp/gftp-ds-rcc.patch
new file mode 100644
index 0000000..a704deb
--- /dev/null
+++ b/patches/gftp/gftp-ds-rcc.patch
@@ -0,0 +1,822 @@
+diff -dPNur gftp-2.0.18-orig/configure.in gftp-2.0.18-new/configure.in
+--- gftp-2.0.18-orig/configure.in	2005-02-04 16:42:32.000000000 +0100
++++ gftp-2.0.18-new/configure.in	2005-07-23 18:54:53.000000000 +0200
+@@ -288,6 +288,20 @@
+ fi
+ AC_SUBST(SSL_LIBS)
+ 
++AC_CHECK_LIB(rccui, rccUiInit,[
++    AC_CHECK_HEADERS(librcc.h librccui.h,[
++       LIBRCC_LIBS="-lrccui"
++       LIBRCC_INCLUDES="-DHAVE_LIBRCC"
++    ],[
++       LIBRCC_LIBS=""
++       LIBRCC_INCLUDES=""
++])],[
++    LIBRCC_LIBS=""
++    LIBRCC_INCLUDES=""
++])
++AC_SUBST(LIBRCC_LIBS)
++AC_SUBST(LIBRCC_INCLUDES)
++
+ AM_GNU_GETTEXT
+ 
+ AC_CHECK_PROG(DB2HTML, db2html, true, false)
+diff -dPNur gftp-2.0.18-orig/lib/gftp.h gftp-2.0.18-new/lib/gftp.h
+--- gftp-2.0.18-orig/lib/gftp.h	2005-01-19 00:09:58.000000000 +0100
++++ gftp-2.0.18-new/lib/gftp.h	2005-07-23 20:57:03.000000000 +0200
+@@ -362,6 +362,7 @@
+ {
+   int protonum;			/* Current number of the protocol this is 
+                                    set to */
++  int language, charset;	/* Remote language and encoding */
+   char *hostname,		/* Hostname we will connect to */
+        *username,		/* Username for host*/
+        *password,		/* Password for host */
+@@ -928,6 +929,12 @@
+ 					  const char *filename,
+ 					  mode_t * mode );
+ 
++void gftp_set_language 			( gftp_request * request, 
++					  int language );
++
++void gftp_set_charset 			( gftp_request * request, 
++					  int charset );
++
+ void gftp_set_hostname 			( gftp_request * request, 
+ 					  const char *hostname );
+ 
+diff -dPNur gftp-2.0.18-orig/lib/Makefile.am gftp-2.0.18-new/lib/Makefile.am
+--- gftp-2.0.18-orig/lib/Makefile.am	2005-01-16 17:10:12.000000000 +0100
++++ gftp-2.0.18-new/lib/Makefile.am	2005-07-23 18:58:12.000000000 +0200
+@@ -4,6 +4,6 @@
+ noinst_LIBRARIES = libgftp.a
+ libgftp_a_SOURCES=bookmark.c cache.c config_file.c fsp.c ftps.c https.c \
+                   local.c misc.c mkstemps.c protocols.c pty.c rfc959.c \
+-                  rfc2068.c sshv2.c sslcommon.c
+-INCLUDES=@GLIB_CFLAGS@ @PTHREAD_CFLAGS@ -I../intl -DSHARE_DIR=\"$(datadir)/gftp\" -DLOCALE_DIR=\"$(datadir)/locale\"
+-noinst_HEADERS=gftp.h ftpcommon.h httpcommon.h options.h
++                  rfc2068.c sshv2.c sslcommon.c rcc.c
++INCLUDES=@LIBRCC_INCLUDES@ @GLIB_CFLAGS@ @PTHREAD_CFLAGS@ -I../intl -DSHARE_DIR=\"$(datadir)/gftp\" -DLOCALE_DIR=\"$(datadir)/locale\"
++noinst_HEADERS=gftp.h ftpcommon.h httpcommon.h options.h rcc.h
+diff -dPNur gftp-2.0.18-orig/lib/rcc.c gftp-2.0.18-new/lib/rcc.c
+--- gftp-2.0.18-orig/lib/rcc.c	1970-01-01 01:00:00.000000000 +0100
++++ gftp-2.0.18-new/lib/rcc.c	2005-07-24 01:53:25.000000000 +0200
+@@ -0,0 +1,289 @@
++#include <stdlib.h>
++
++#ifdef HAVE_LIBRCC
++# include <librcc.h>
++# include <librccui.h>
++#endif /* HAVE_LIBRCC */
++
++#include "rcc.h"
++
++#ifdef HAVE_LIBRCC
++static rcc_class classes[] = {
++    { "ftp", RCC_CLASS_STANDARD, NULL, NULL, "FTP Encoding", 0 },
++    { "http", RCC_CLASS_STANDARD, NULL, NULL, "HTTP Encoding", 0 },
++    { "ssh", RCC_CLASS_STANDARD, NULL, NULL, "SSH Encoding", 0 },
++    { "fs", RCC_CLASS_STANDARD, NULL, NULL, "FS Encoding", 0 },
++    { "out", RCC_CLASS_STANDARD, NULL, NULL, "Output Encoding", 0 },
++    { NULL, RCC_CLASS_STANDARD, NULL, NULL, NULL, 0 }
++};
++
++rcc_context ctx;
++rcc_ui_context uictx;
++static int rcc_initialized = 0;
++#endif /* HAVE_LIBRCC */
++
++
++void rccPatchFree() {
++#ifdef HAVE_LIBRCC
++    if (rcc_initialized) {
++	rccUiFreeContext(uictx);
++	rccFreeContext(ctx);
++	rccUiFree();
++	rccFree();
++	rcc_initialized = 0;
++    }
++#endif /* HAVE_LIBRCC */
++}
++
++void rccPatchInit() {
++#ifdef HAVE_LIBRCC
++    if (rcc_initialized) return;
++    rccInit();
++    ctx = rccCreateContext(NULL, 0, 0, classes, 0);
++    if (ctx) {
++	rccLoad(ctx, "ftp");
++	rccInitDb4(ctx, NULL, 0);
++	rccUiInit();
++	uictx = rccUiCreateContext(ctx);
++	if (uictx) rcc_initialized = 1;
++	else {
++	    rccUiFree();
++	    rccFreeContext(ctx);
++	    rccFree();
++	}
++    } else rccFree();
++#endif /* HAVE_LIBRCC */
++}
++
++
++#ifdef HAVE_LIBRCC
++static char *rcc_languages[RCC_MAX_LANGUAGES+1];
++static char *rcc_charsets[RCC_MAX_CHARSETS+1];
++#endif /* HAVE_LIBRCC */
++
++char **rccPatchGetLanguageList() {
++#ifdef HAVE_LIBRCC
++    unsigned int i, num;
++
++    if (rcc_initialized) {
++	num = rccGetLanguageNumber(ctx);
++	for (i=0;i<(num?num:1);i++)
++	    rcc_languages[i] = (char*)rccUiGetLanguageName(uictx, (rcc_language_id)i);
++
++	rcc_languages[i] = NULL;
++	return rcc_languages;
++    }
++#endif /* HAVE_LIBRCC */
++
++    return NULL;
++
++}
++
++char **rccPatchGetCharsetList(int lid) {
++#ifdef HAVE_LIBRCC
++    unsigned int i, num;
++    rcc_language_config config;
++
++    if (rcc_initialized) {
++	config = rccGetConfig(ctx, (rcc_language_id)lid);
++	num = rccConfigGetCharsetNumber(config);
++	for (i=0;i<(num?num:1);i++)
++	    rcc_charsets[i] = (char*)rccUiGetCharsetName(uictx, (rcc_language_id)lid, (rcc_class_id)0 /* first class, they are equal*/, (rcc_charset_id)i);
++
++	rcc_charsets[i] = NULL;
++	return rcc_charsets;
++    }
++#endif /* HAVE_LIBRCC */
++
++    return NULL;
++}
++
++char *rccPatchFrom(gftp_request * request, const char *str) {
++#ifdef HAVE_LIBRCC
++    rcc_class_id cl;
++    if (rcc_initialized) {
++	switch (request->protonum) {
++	    case GFTP_FTP_NUM:
++	    case GFTP_FTPS_NUM:
++		cl = (rcc_class_id)RCC_CLASS_FTP;
++	    break;
++	    case GFTP_HTTP_NUM:
++	    case GFTP_HTTPS_NUM:
++		cl = (rcc_class_id)RCC_CLASS_HTTP;
++	    break;
++	    case GFTP_SSHV2_NUM:
++		cl = (rcc_class_id)RCC_CLASS_SSH;
++	    break;
++	    case GFTP_LOCAL_NUM:
++		cl = (rcc_class_id)RCC_CLASS_FS;
++	    break;
++	    default:
++		return NULL;
++	}
++	
++	if ((cl == RCC_CLASS_FTP)||(cl == RCC_CLASS_HTTP)||(cl == RCC_CLASS_SSH)) {
++	    if (request->language) rccSetLanguage(ctx, (rcc_language_id)request->language);
++	    if (request->charset) rccSetCharset(ctx, cl, (rcc_charset_id)request->charset);
++	}
++
++	return rccRecodeFromCharset(ctx, cl, "UTF-8", str);
++    }
++#endif /* HAVE_LIBRCC */
++    return NULL;
++}
++
++char *rccPatchTo(gftp_request * request, const char *str) {
++#ifdef HAVE_LIBRCC
++    rcc_class_id cl;
++    if (rcc_initialized) {
++	switch (request->protonum) {
++	    case GFTP_FTP_NUM:
++	    case GFTP_FTPS_NUM:
++		cl = (rcc_class_id)RCC_CLASS_FTP;
++	    break;
++	    case GFTP_HTTP_NUM:
++	    case GFTP_HTTPS_NUM:
++		cl = (rcc_class_id)RCC_CLASS_HTTP;
++	    break;
++	    case GFTP_SSHV2_NUM:
++		cl = (rcc_class_id)RCC_CLASS_SSH;
++	    break;
++	    case GFTP_LOCAL_NUM:
++		cl = (rcc_class_id)RCC_CLASS_FS;
++	    break;
++	    default:
++		return NULL;
++	}
++	
++	if ((cl == RCC_CLASS_FTP)||(cl == RCC_CLASS_HTTP)||(cl == RCC_CLASS_SSH)) {
++	    if (request->language) rccSetLanguage(ctx, (rcc_language_id)request->language);
++	    if (request->charset) rccSetCharset(ctx, cl, (rcc_charset_id)request->charset);
++	}
++
++	return rccRecodeToCharset(ctx, cl, "UTF-8", str);
++    }
++#endif /* HAVE_LIBRCC */
++    return NULL;
++}
++
++char *rccPatch(gftp_request *from, gftp_request *to, const char *str) {
++    char *res, *ret;
++    const char *tmp;
++
++    if (from->protonum == to->protonum) return NULL;
++    printf("%u %u\n", from->protonum, to->protonum);
++
++    tmp = strstr(str, to->directory);
++    if (!tmp) tmp = str;
++        
++    res = rccPatchTo(from, tmp);
++    if (!res) res = (char*)tmp;
++
++    ret = rccPatchFrom(to, res);
++    if (ret) {
++	if (res!=tmp) free(res);
++    } else {
++	if (res!=tmp) ret = res;
++	else return NULL;
++    }
++    
++    if (tmp != str) {
++	res = (char*)malloc((strlen(ret) + (tmp-str) + 1)*sizeof(char));
++	if (res) {
++	    memcpy(res, str, (tmp-str));
++	    strcpy(res+(tmp-str), ret);
++	}
++	free(ret);
++	if (res) puts(res);
++	return res;
++    }
++
++    return ret;
++}
++
++char *rccPatchFromClass(gftp_request * request, int from, const char *str) {
++#ifdef HAVE_LIBRCC
++    rcc_class_id cl;
++    if (rcc_initialized) {
++	switch (request->protonum) {
++	    case GFTP_FTP_NUM:
++	    case GFTP_FTPS_NUM:
++		cl = (rcc_class_id)RCC_CLASS_FTP;
++	    break;
++	    case GFTP_HTTP_NUM:
++	    case GFTP_HTTPS_NUM:
++		cl = (rcc_class_id)RCC_CLASS_HTTP;
++	    break;
++	    case GFTP_SSHV2_NUM:
++		cl = (rcc_class_id)RCC_CLASS_SSH;
++	    break;
++	    case GFTP_LOCAL_NUM:
++		cl = (rcc_class_id)RCC_CLASS_FS;
++	    break;
++	    default:
++		return NULL;
++	}
++	
++	if ((cl == RCC_CLASS_FTP)||(cl == RCC_CLASS_HTTP)||(cl == RCC_CLASS_SSH)) {
++	    if (request->language) rccSetLanguage(ctx, (rcc_language_id)request->language);
++	    if (request->charset) rccSetCharset(ctx, cl, (rcc_charset_id)request->charset);
++	}
++
++	return rccRecode(ctx, (rcc_class_id)from, cl, str);
++    }
++#endif /* HAVE_LIBRCC */
++    return NULL;
++}
++
++char *rccPatchToClass(gftp_request * request, int to, const char *str) {
++#ifdef HAVE_LIBRCC
++    rcc_class_id cl;
++    if (rcc_initialized) {
++	switch (request->protonum) {
++	    case GFTP_FTP_NUM:
++	    case GFTP_FTPS_NUM:
++		cl = (rcc_class_id)RCC_CLASS_FTP;
++	    break;
++	    case GFTP_HTTP_NUM:
++	    case GFTP_HTTPS_NUM:
++		cl = (rcc_class_id)RCC_CLASS_HTTP;
++	    break;
++	    case GFTP_SSHV2_NUM:
++		cl = (rcc_class_id)RCC_CLASS_SSH;
++	    break;
++	    case GFTP_LOCAL_NUM:
++		cl = (rcc_class_id)RCC_CLASS_FS;
++	    break;
++	    default:
++		return NULL;
++	}
++	
++	if ((cl == RCC_CLASS_FTP)||(cl == RCC_CLASS_HTTP)||(cl == RCC_CLASS_SSH)) {
++	    if (request->language) rccSetLanguage(ctx, (rcc_language_id)request->language);
++	    if (request->charset) rccSetCharset(ctx, cl, (rcc_charset_id)request->charset);
++	}
++
++	return rccRecode(ctx, cl, (rcc_class_id)to, str);
++    }
++#endif /* HAVE_LIBRCC */
++    return NULL;
++}
++
++
++char *rccPatchUTF2OUT(const char *str) {
++#ifdef HAVE_LIBRCC
++    if (rcc_initialized) {
++    	return rccRecodeFromCharset(ctx, RCC_CLASS_OUT, "UTF-8", str);
++    }
++#endif /* HAVE_LIBRCC */
++    return NULL;
++}
++
++char *rccPatchOUT2UTF(const char *str) {
++#ifdef HAVE_LIBRCC
++    if (rcc_initialized) {
++    	return rccRecodeToCharset(ctx, RCC_CLASS_OUT, "UTF-8", str);
++    }
++#endif /* HAVE_LIBRCC */
++    return NULL;
++}
+diff -dPNur gftp-2.0.18-orig/lib/rcc.h gftp-2.0.18-new/lib/rcc.h
+--- gftp-2.0.18-orig/lib/rcc.h	1970-01-01 01:00:00.000000000 +0100
++++ gftp-2.0.18-new/lib/rcc.h	2005-07-24 01:49:20.000000000 +0200
+@@ -0,0 +1,28 @@
++#ifndef _RCC_H
++#define _RCC_H
++
++#include "gftp.h"
++
++#define RCC_CLASS_FTP 0
++#define RCC_CLASS_HTTP 1
++#define RCC_CLASS_SSH 2
++#define RCC_CLASS_FS 3
++#define RCC_CLASS_OUT 4
++
++void rccPatchFree(); 
++void rccPatchInit(); 
++
++char **rccPatchGetLanguageList();
++char **rccPatchGetCharsetList(int lid);
++
++char *rccPatchFrom(gftp_request * request, const char *str);
++char *rccPatchTo(gftp_request * request, const char *str);
++char *rccPatch(gftp_request *from, gftp_request *to, const char *str);
++
++char *rccPatchFromClass(gftp_request * request, int from, const char *str);
++char *rccPatchToClass(gftp_request * request, int to, const char *str);
++
++char *rccPatchUTF2OUT(const char *str);
++char *rccPatchOUT2UTF(const char *str);
++
++#endif /* _RCC_H */
+diff -dPNur gftp-2.0.18-orig/src/gtk/gtkui.c gftp-2.0.18-new/src/gtk/gtkui.c
+--- gftp-2.0.18-orig/src/gtk/gtkui.c	2005-01-26 04:22:05.000000000 +0100
++++ gftp-2.0.18-new/src/gtk/gtkui.c	2005-07-24 00:40:47.000000000 +0200
+@@ -351,6 +351,8 @@
+   filelist = wdata->files;
+   templist = get_next_selection (templist, &filelist, &num);
+   curfle = filelist->data;
++  cdata->source_string = gftp_string_to_utf8(wdata->request, curfle->file);
++  if (!cdata->source_string)
+   cdata->source_string = g_strdup (curfle->file);
+ 
+   tempstr = g_strdup_printf (_("What would you like to rename %s to?"),
+diff -dPNur gftp-2.0.18-orig/src/gtk/Makefile.am gftp-2.0.18-new/src/gtk/Makefile.am
+--- gftp-2.0.18-orig/src/gtk/Makefile.am	2005-01-16 17:12:08.000000000 +0100
++++ gftp-2.0.18-new/src/gtk/Makefile.am	2005-07-23 19:16:26.000000000 +0200
+@@ -5,6 +5,6 @@
+ gftp_gtk_SOURCES = bookmarks.c chmod_dialog.c delete_dialog.c dnd.c \
+                      gftp-gtk.c gtkui.c gtkui_transfer.c menu-items.c \
+                      misc-gtk.c options_dialog.c transfer.c view_dialog.c
+-INCLUDES = @GTK_CFLAGS@ @PTHREAD_CFLAGS@ -I../../intl
+-LDADD = ../../lib/libgftp.a ../../lib/fsplib/libfsp.a ../uicommon/libgftpui.a @GTK_LIBS@ @PTHREAD_LIBS@ @EXTRA_LIBS@ @GTHREAD_LIBS@ @SSL_LIBS@ @LIBINTL@
++INCLUDES = @LIBRCC_INCLUDES@ @GTK_CFLAGS@ @PTHREAD_CFLAGS@ -I../../intl
++LDADD = ../../lib/libgftp.a ../../lib/fsplib/libfsp.a ../uicommon/libgftpui.a @GTK_LIBS@ @PTHREAD_LIBS@ @EXTRA_LIBS@ @GTHREAD_LIBS@ @SSL_LIBS@ @LIBINTL@ @LIBRCC_LIBS@
+ noinst_HEADERS = gftp-gtk.h
+diff -dPNur gftp-2.0.18-orig/src/text/gftp-text.c gftp-2.0.18-new/src/text/gftp-text.c
+--- gftp-2.0.18-orig/src/text/gftp-text.c	2005-01-25 02:11:00.000000000 +0100
++++ gftp-2.0.18-new/src/text/gftp-text.c	2005-07-24 01:54:25.000000000 +0200
+@@ -18,6 +18,7 @@
+ /*****************************************************************************/
+ 
+ #include "gftp-text.h"
++#include "../../lib/rcc.h"
+ static const char cvsid[] = "$Id: gftp-text.c,v 1.45 2005/01/25 01:11:00 masneyb Exp $";
+ 
+ unsigned int
+@@ -93,6 +94,7 @@
+                const char *string, ...)
+ {
+   char tempstr[512], *utf8_str = NULL, *outstr;
++  char *locale_str;
+   va_list argp;
+ 
+   g_return_if_fail (string != NULL);
+@@ -140,7 +142,14 @@
+     }
+ 
+   if (level == gftp_logging_misc_nolog)
++{
++    locale_str = rccPatchUTF2OUT(outstr);
++    if (locale_str) {
++	printf ("%s", locale_str);
++	free(locale_str);
++    } else
+     printf ("%s", outstr);
++}
+   else
+     gftp_text_write_string (request, outstr);
+   
+@@ -158,6 +167,7 @@
+   gchar *locale_question;
+   sigset_t sig, sigsave;
+   char *pos, *termname;
++  char *tmp;
+   int singlechar;
+   FILE *infd;
+ 
+@@ -247,6 +257,9 @@
+ #else
+   char tempstr[512];
+ #endif
++  char *recoded = NULL;
++
++  rccPatchInit();
+ 
+   gftpui_common_init (&argc, &argv, gftp_text_log);
+ 
+@@ -298,9 +311,11 @@
+   g_snprintf (prompt, sizeof (prompt), "%sftp%s> ", GFTPUI_COMMON_COLOR_BLUE, GFTPUI_COMMON_COLOR_DEFAULT);
+   while ((tempstr = readline (prompt)))
+     {
++      if (recoded) free(recoded);
++      recoded = rccPatchFromClass(gftp_text_remreq, RCC_CLASS_OUT, tempstr);
+       if (gftpui_common_process_command (locuidata, gftp_text_locreq,
+                                          remuidata, gftp_text_remreq,
+-                                         tempstr) == 0)
++                                         recoded?recoded:tempstr) == 0)
+         break;
+    
+       add_history (tempstr);
+@@ -310,16 +325,20 @@
+   printf ("%sftp%s> ", GFTPUI_COMMON_COLOR_BLUE, GFTPUI_COMMON_COLOR_DEFAULT);
+   while (fgets (tempstr, sizeof (tempstr), stdin) != NULL)
+     {
++      if (recoded) free(recoded);
++      recoded = rccPatchFromClass(gftp_tetxt_remreq, RCC_CLASS_OUT, tempstr);
+       if (gftpui_common_process_command (locuidata, gftp_text_locreq,
+                                          remuidata, gftp_text_remreq,
+-                                         tempstr) == 0)
++                                         recoded?recoded:tempstr) == 0)
+         break;
+ 
+       printf ("%sftp%s> ", GFTPUI_COMMON_COLOR_BLUE, GFTPUI_COMMON_COLOR_DEFAULT);
+     }
+ #endif
+- 
++    if (recoded) free(recoded); 
++
+   gftp_shutdown ();
++  rccPatchFree();
+   return (0);
+ }
+ 
+diff -dPNur gftp-2.0.18-orig/src/text/Makefile.am gftp-2.0.18-new/src/text/Makefile.am
+--- gftp-2.0.18-orig/src/text/Makefile.am	2005-01-16 17:12:00.000000000 +0100
++++ gftp-2.0.18-new/src/text/Makefile.am	2005-07-23 19:16:39.000000000 +0200
+@@ -3,7 +3,7 @@
+ bin_PROGRAMS = @GFTP_TEXT@
+ EXTRA_PROGRAMS = gftp-text
+ gftp_text_SOURCES=gftp-text.c textui.c
+-INCLUDES=@GLIB_CFLAGS@ -I../../intl
+-LDADD = ../../lib/libgftp.a ../../lib/fsplib/libfsp.a ../uicommon/libgftpui.a @GLIB_LIBS@ @EXTRA_LIBS@ @READLINE_LIBS@ @SSL_LIBS@ @LIBINTL@
++INCLUDES=@LIBRCC_INCLUDES@ @GLIB_CFLAGS@ -I../../intl
++LDADD = ../../lib/libgftp.a ../../lib/fsplib/libfsp.a ../uicommon/libgftpui.a @GLIB_LIBS@ @EXTRA_LIBS@ @READLINE_LIBS@ @SSL_LIBS@ @LIBINTL@ @LIBRCC_LIBS@
+ noinst_HEADERS=gftp-text.h
+ localedir=$(datadir)/locale
+diff -dPNur gftp-2.0.18-orig/lib/protocols.c gftp-2.0.18-new/lib/protocols.c
+--- gftp-2.0.18-orig/lib/protocols.c	2005-07-23 15:30:59.000000000 +0200
++++ gftp-2.0.18-new/lib/protocols.c	2005-07-24 00:56:12.000000000 +0200
+@@ -18,6 +18,8 @@
+ /*****************************************************************************/
+ 
+ #include "gftp.h"
++#include "rcc.h"
++
+ static const char cvsid[] = "$Id: protocols.c,v 1.125 2005/01/25 02:34:18 masneyb Exp $";
+ 
+ gftp_request *
+@@ -26,6 +28,8 @@
+   gftp_request *request;
+ 
+   request = g_malloc0 (sizeof (*request));
++  request->language = 0;
++  request->charset = 0;
+   request->datafd = -1;
+   request->cachefd = -1;
+   request->server_type = GFTP_DIRTYPE_OTHER;
+@@ -460,6 +469,9 @@
+   gftp_lookup_request_option (request, "remote_charsets", &tempstr);
+   if (*tempstr == '\0')
+     {
++	ret = rccPatchTo(request, str);
++	if (ret) return ret;
++
+       error = NULL;
+       if ((ret = g_locale_to_utf8 (str, -1, &bread, &bwrite, &error)) != NULL)
+         return (ret);
+@@ -531,6 +544,9 @@
+   gftp_lookup_request_option (request, "remote_charsets", &tempstr);
+   if (*tempstr == '\0')
+     {
++      ret = rccPatchFrom(request, str);
++      if (ret) return ret;
++
+       error = NULL;
+       if ((ret = g_locale_from_utf8 (str, -1, &bread, &bwrite, &error)) != NULL)
+         return (ret);
+@@ -919,6 +935,18 @@
+ }
+ 
+ 
++void 
++gftp_set_language (gftp_request * request, int language) {
++  g_return_if_fail (request != NULL);
++  request->language = language;
++}
++
++void 
++gftp_set_charset (gftp_request * request, int charset) {
++  g_return_if_fail (request != NULL);
++  request->charset = charset;
++}
++
+ void
+ gftp_set_hostname (gftp_request * request, const char *hostname)
+ {
+@@ -1056,6 +1084,7 @@
+                   const char *newname)
+ {
+   char *utf8;
++  char *oldutf8;
+   int ret;
+ 
+   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+@@ -1064,13 +1093,13 @@
+     return (GFTP_EFATAL);
+ 
+   utf8 = gftp_string_from_utf8 (request, newname);
++  oldutf8 = gftp_string_from_utf8 (request, oldname);
++  ret = request->rename (request, oldutf8?oldutf8:oldname, utf8?utf8:newname);
++
+   if (utf8 != NULL)
+-    {
+-      ret = request->rename (request, oldname, utf8);
+       g_free (utf8);
+-    }
+-  else
+-    ret = request->rename (request, oldname, newname);
++  if (oldutf8 != NULL)
++      g_free (oldutf8);
+ 
+   return (ret);
+ }
+@@ -1948,11 +1977,14 @@
+           (newsize = g_hash_table_lookup (dirhash, fle->file)) != NULL)
+         fle->startsize = *newsize;
+ 
+-      if (transfer->toreq && fle->destfile == NULL)
++      if (transfer->toreq && fle->destfile == NULL) {
++	newname = rccPatch(transfer->fromreq, transfer->toreq, fle->file);
+         fle->destfile = gftp_build_path (transfer->toreq,
+                                          transfer->toreq->directory, 
+-                                         fle->file, NULL);
+-
++                                     newname?newname:fle->file, NULL);
++	if (newname) free(newname);
++      }
++	
+       if (transfer->fromreq->directory != NULL &&
+           *transfer->fromreq->directory != '\0' &&
+           *fle->file != '/')
+@@ -2026,11 +2058,15 @@
+             return (curfle->size);
+         }
+ 
+-      if (transfer->toreq && curfle->destfile == NULL)
++      if (transfer->toreq && curfle->destfile == NULL) {
++	newname = rccPatch(transfer->fromreq, transfer->toreq, curfle->file);
+         curfle->destfile = gftp_build_path (transfer->toreq,
+                                             transfer->toreq->directory, 
+-                                            curfle->file, NULL);
++                                            newname?newname:curfle->file, NULL);
++	if (newname) free(newname);
++      }
+ 
++	
+       if (transfer->fromreq->directory != NULL &&
+           *transfer->fromreq->directory != '\0' && *curfle->file != '/')
+         {
+diff -dPNur gftp-2.0.18-orig/src/gtk/gftp-gtk.c gftp-2.0.18-new/src/gtk/gftp-gtk.c
+--- gftp-2.0.18-orig/src/gtk/gftp-gtk.c	2005-01-25 03:34:19.000000000 +0100
++++ gftp-2.0.18-new/src/gtk/gftp-gtk.c	2005-07-23 22:22:42.000000000 +0200
+@@ -18,6 +18,7 @@
+ /*****************************************************************************/
+ 
+ #include "gftp-gtk.h"
++#include "../../lib/rcc.h"
+ static const char cvsid[] = "$Id: gftp-gtk.c,v 1.66 2005/01/25 02:34:19 masneyb Exp $";
+ 
+ static GtkItemFactory *log_factory, *dl_factory;
+@@ -28,6 +29,7 @@
+ GtkWidget * stop_btn, * hostedit, * useredit, * passedit, * portedit, * logwdw,
+           * dlwdw, * protocol_menu, * optionmenu, * gftpui_command_widget,
+           * download_left_arrow, * upload_right_arrow, * openurl_btn;
++GtkWidget * language_menu, * charset_menu;
+ GtkTooltips * openurl_tooltip;
+ GtkAdjustment * logwdw_vadj;
+ #if GTK_MAJOR_VERSION > 1
+@@ -420,6 +422,42 @@
+   return (factory->widget);
+ }
+ 
++#ifdef HAVE_LIBRCC
++static int rcc_current_language = 0;
++static int rcc_current_charset = 0;
++
++static void rccCharsetCB(GtkWidget * w, gpointer item) {
++  rcc_current_charset = g_list_index(GTK_MENU_SHELL(charset_menu)->children, gtk_menu_get_active(GTK_MENU(charset_menu)));
++}
++
++static void rccLanguageCB(GtkWidget * w, gpointer item) {
++  GtkWidget *tempwid, *optionmenu;
++  unsigned int i;
++  char **langs;
++  gint cur;
++
++  cur = g_list_index(GTK_MENU_SHELL(language_menu)->children, gtk_menu_get_active(GTK_MENU(language_menu)));
++  optionmenu = gtk_menu_get_attach_widget(GTK_MENU(charset_menu));
++  
++  rcc_current_language = cur;
++  rcc_current_charset = 0;
++
++  langs = rccPatchGetCharsetList(cur);
++  if (langs) {
++    charset_menu = gtk_menu_new ();
++    for (i=0;langs[i];i++) {
++	tempwid = gtk_menu_item_new_with_label (langs[i]);
++	gtk_object_set_user_data (GTK_OBJECT (tempwid), GINT_TO_POINTER(i));
++	gtk_menu_append (GTK_MENU (charset_menu), tempwid);
++	gtk_widget_show (tempwid);
++    }
++    
++    gtk_option_menu_remove_menu (GTK_OPTION_MENU (optionmenu));
++    gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), charset_menu);
++    gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 0);
++  }
++}
++#endif /* HAVE_LIBRCC */
+ 
+ static GtkWidget *
+ CreateConnectToolbar (GtkWidget * parent)
+@@ -430,14 +468,19 @@
+     {"application/x-rootwin-drop", 0, 1}
+   };
+   GtkWidget *toolbar, *box, *tempwid;
++  GtkWidget *vbox;
++  GtkWidget *tmpoptionmenu;
+   gftp_config_list_vars * tmplistvar;
+   char *default_protocol, *tempstr;
++  char **langs;
+   int i, num;
+ 
+   toolbar = gtk_handle_box_new ();
+ 
++  vbox = gtk_vbox_new (FALSE, 0);
+   box = gtk_hbox_new (FALSE, 4);
+-  gtk_container_add (GTK_CONTAINER (toolbar), box);
++  gtk_box_pack_start(GTK_BOX(vbox), box, FALSE, FALSE, 0);
++  gtk_container_add (GTK_CONTAINER (toolbar), vbox);
+   gtk_container_border_width (GTK_CONTAINER (box), 5);
+ 
+   openurl_tooltip = gtk_tooltips_new ();
+@@ -548,6 +591,7 @@
+   optionmenu = gtk_option_menu_new ();
+   gtk_box_pack_start (GTK_BOX (tempwid), optionmenu, TRUE, FALSE, 0);
+ 
++
+   num = 0;
+   gftp_lookup_global_option ("default_protocol", &default_protocol);
+   protocol_menu = gtk_menu_new ();
+@@ -584,6 +628,61 @@
+   gtk_container_border_width (GTK_CONTAINER (stop_btn), 1);
+   gtk_box_pack_start (GTK_BOX (box), stop_btn, FALSE, FALSE, 0);
+ 
++#ifdef HAVE_LIBRCC
++  box = gtk_hbox_new (FALSE, 4);
++  gtk_box_pack_start(GTK_BOX(vbox), box, FALSE, FALSE, 0);
++  gtk_container_border_width (GTK_CONTAINER (box), 5);
++
++  langs = rccPatchGetCharsetList(0);
++  if (langs) {
++    tempwid = gtk_vbox_new (FALSE, 0);
++    gtk_box_pack_end (GTK_BOX (box), tempwid, FALSE, FALSE, 0);
++    
++    tmpoptionmenu = gtk_option_menu_new ();
++    gtk_box_pack_start (GTK_BOX (tempwid), tmpoptionmenu, TRUE, FALSE, 0);
++     
++    charset_menu = gtk_menu_new ();
++    for (i=0;langs[i];i++) {
++	tempwid = gtk_menu_item_new_with_label (langs[i]);
++	gtk_signal_connect(GTK_OBJECT(tempwid), "activate", GTK_SIGNAL_FUNC(rccCharsetCB), NULL);
++	gtk_object_set_user_data (GTK_OBJECT (tempwid), GINT_TO_POINTER(i));
++	gtk_menu_append (GTK_MENU (charset_menu), tempwid);
++	gtk_widget_show (tempwid);
++    }
++    
++    gtk_option_menu_set_menu (GTK_OPTION_MENU (tmpoptionmenu), charset_menu);
++    gtk_option_menu_set_history (GTK_OPTION_MENU (tmpoptionmenu), rcc_current_charset);
++    
++    tempwid = gtk_label_new (_("Charset: "));
++    gtk_box_pack_end (GTK_BOX (box), tempwid, FALSE, FALSE, 0);
++  }
++
++  langs = rccPatchGetLanguageList();
++  if (langs) {
++    tempwid = gtk_vbox_new (FALSE, 0);
++    gtk_box_pack_end (GTK_BOX (box), tempwid, FALSE, FALSE, 0);
++    
++    tmpoptionmenu = gtk_option_menu_new ();
++    gtk_box_pack_start (GTK_BOX (tempwid), tmpoptionmenu, TRUE, FALSE, 0);
++     
++    language_menu = gtk_menu_new ();
++    for (i=0;langs[i];i++) {
++	tempwid = gtk_menu_item_new_with_label (langs[i]);
++	gtk_signal_connect(GTK_OBJECT(tempwid), "activate", GTK_SIGNAL_FUNC(rccLanguageCB), NULL);
++	gtk_object_set_user_data (GTK_OBJECT (tempwid), GINT_TO_POINTER(i));
++	gtk_menu_append (GTK_MENU (language_menu), tempwid);
++	gtk_widget_show (tempwid);
++    }
++    
++    gtk_option_menu_set_menu (GTK_OPTION_MENU (tmpoptionmenu), language_menu);
++    gtk_option_menu_set_history (GTK_OPTION_MENU (tmpoptionmenu), rcc_current_language);
++
++    tempwid = gtk_label_new (_("Language: "));
++    gtk_box_pack_end (GTK_BOX (box), tempwid, FALSE, FALSE, 0);
++  }
++#endif /* HAVE_LIBRCC */
++
++
+   gtk_widget_grab_focus (GTK_COMBO (hostedit)->entry);
+ 
+   return (toolbar);
+@@ -1132,6 +1231,16 @@
+   add_history (current_wdata->combo, current_wdata->history, 
+                current_wdata->histlen, current_wdata->request->directory);
+ 
++#ifdef HAVE_LIBRCC
++  tempwid = gtk_menu_get_active (GTK_MENU (language_menu));
++  num = GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (tempwid)));
++  gftp_set_language(current_wdata->request, num);
++
++  tempwid = gtk_menu_get_active (GTK_MENU (charset_menu));
++  num = GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (tempwid)));
++  gftp_set_charset(current_wdata->request, num);
++#endif /* HAVE_LIBRCC */
++
+   ftp_connect (current_wdata, current_wdata->request, 1);
+ }
+ 
+@@ -1270,6 +1379,8 @@
+ {
+   GtkWidget *window, *ui;
+ 
++  rccPatchInit();
++  
+   /* We override the read color functions because we are using a GdkColor 
+      structures to store the color. If I put this in lib/config_file.c, then 
+      the core library would be dependant on Gtk+ being present */
+@@ -1336,6 +1447,8 @@
+   GDK_THREADS_ENTER ();
+   gtk_main ();
+   GDK_THREADS_LEAVE ();
++  
++  rccPatchFree();
+ 
+   return (0);
+ }
-- 
cgit v1.2.3