1
1

Added vfs_change_encoding() and vfs_path_element_need_cleanup_converter() functions.

Changes for handling directory encoding.

Signed-off-by: Slava Zanko <slavazanko@gmail.com>
Этот коммит содержится в:
Slava Zanko 2011-06-01 13:56:52 +03:00
родитель c0004807d4
Коммит a5dc2de78b
6 изменённых файлов: 70 добавлений и 43 удалений

Просмотреть файл

@ -536,7 +536,10 @@ mc_closedir (DIR * dirp)
vfs_path_element_t *vfs_path_element;
vfs_path_element = vfs_class_data_find_by_handle (handle);
if (vfs_path_element->dir.converter != str_cnv_from_term)
{
str_close_conv (vfs_path_element->dir.converter);
vfs_path_element->dir.converter = INVALID_CONV;
}
result = vfs->closedir ? (*vfs->closedir) (vfs_path_element->dir.info) : -1;
vfs_free_handle (handle);

Просмотреть файл

@ -310,8 +310,11 @@ vfs_path_from_str (const char *path_str)
{
element = g_new0 (vfs_path_element_t, 1);
element->class = g_ptr_array_index (vfs__classes_list, 0);
element->path = g_strdup (path);
element->path = vfs_translate_path_n (path);
element->raw_url_str = NULL;
element->encoding = vfs_get_encoding (path);
element->dir.converter = INVALID_CONV;
vpath->path = g_list_prepend (vpath->path, element);
}
g_free (path);
@ -391,6 +394,12 @@ vfs_path_element_free (vfs_path_element_t * element)
vfs_url_free (element->url);
g_free (element->path);
g_free (element->encoding);
if (vfs_path_element_need_cleanup_converter (element))
{
str_close_conv (element->dir.converter);
}
g_free (element);
}
@ -440,3 +449,19 @@ vfs_prefix_to_class (const char *prefix)
}
/* --------------------------------------------------------------------------------------------- */
/**
* Check if need cleanup charset converter for vfs_path_element_t
*
* @param element part of path
*
* @return TRUE if need cleanup converter or FALSE otherwise
*/
gboolean
vfs_path_element_need_cleanup_converter (const vfs_path_element_t * element)
{
return (element->dir.converter != str_cnv_from_term && element->dir.converter != INVALID_CONV);
}
/* --------------------------------------------------------------------------------------------- */

Просмотреть файл

@ -51,6 +51,8 @@ void vfs_path_element_free (vfs_path_element_t * element);
struct vfs_class *vfs_prefix_to_class (const char *prefix);
gboolean vfs_path_element_need_cleanup_converter (const vfs_path_element_t * element);
/*** inline functions ****************************************************************************/
#endif

Просмотреть файл

@ -683,3 +683,33 @@ _vfs_get_cwd (void)
}
/* --------------------------------------------------------------------------------------------- */
/**
* Change encoding for last part (vfs_path_element_t) of vpath
*
* @param vpath pointer to path structure
* encoding name of charset
*
* @return pointer to path structure (for use function in anoter functions)
*/
vfs_path_t *
vfs_change_encoding (vfs_path_t * vpath, const char *encoding)
{
vfs_path_element_t *path_element = vfs_path_get_by_index (vpath, -1);
/* don't add current encoding */
if ((path_element->encoding != NULL) && (strcmp (encoding, path_element->encoding) == 0))
return vpath;
g_free (path_element->encoding);
path_element->encoding = g_strdup (encoding);
if (vfs_path_element_need_cleanup_converter (path_element))
str_close_conv (path_element->dir.converter);
path_element->dir.converter = str_crt_conv_from (path_element->encoding);
return vpath;
}
/* --------------------------------------------------------------------------------------------- */

Просмотреть файл

@ -272,6 +272,8 @@ void vfs_free_handle (int handle);
char *_vfs_get_cwd (void);
vfs_path_t *vfs_change_encoding (vfs_path_t * vpath, const char *encoding);
/**
* Interface functions described in interface.c
*/

Просмотреть файл

@ -1147,39 +1147,6 @@ adjust_top_file (WPanel * panel)
* retun new string
*/
static char *
add_encoding_to_path (const char *path, const char *encoding)
{
char *result;
char *semi;
char *slash;
semi = g_strrstr (path, VFS_ENCODING_PREFIX);
if (semi != NULL)
{
slash = strchr (semi, PATH_SEP);
if (slash != NULL)
{
result = g_strconcat (path, PATH_SEP_STR VFS_ENCODING_PREFIX, encoding, (char *) NULL);
}
else
{
*semi = '\0';
result = g_strconcat (path, PATH_SEP_STR VFS_ENCODING_PREFIX, encoding, (char *) NULL);
*semi = '#';
}
}
else
{
result = g_strconcat (path, PATH_SEP_STR VFS_ENCODING_PREFIX, encoding, (char *) NULL);
}
return result;
}
/* --------------------------------------------------------------------------------------------- */
static char *
panel_save_name (WPanel * panel)
{
@ -4051,16 +4018,14 @@ panel_change_encoding (WPanel * panel)
if (encoding != NULL)
{
vfs_path_t *vpath = vfs_path_from_str (panel->cwd);
vfs_path_element_t *path_element = vfs_path_get_by_index (vpath, -1);
/* don't add current encoding */
if ((path_element->encoding == NULL) || (strcmp (encoding, path_element->encoding) != 0))
{
cd_path = add_encoding_to_path (panel->cwd, encoding);
if (!do_panel_cd (panel, cd_path, cd_parse_command))
message (D_ERROR, MSG_ERROR, _("Cannot chdir to \"%s\""), cd_path);
g_free (cd_path);
}
vfs_change_encoding (vpath, encoding);
cd_path = vfs_path_to_str (vpath);
if (!do_panel_cd (panel, cd_path, cd_parse_command))
message (D_ERROR, MSG_ERROR, _("Cannot chdir to \"%s\""), cd_path);
g_free (cd_path);
vfs_path_free (vpath);
}
}