コード例 #1
0
ファイル: gedit-convert.c プロジェクト: kaushikmit/gedit
gchar *
gedit_convert_from_utf8 (const gchar          *content, 
		         gsize                 len,
		         const GeditEncoding  *encoding,
			 gsize                *new_len,
			 GError 	     **error)
{
	GError *conv_error         = NULL;
	gchar  *converted_contents = NULL;
	gsize   bytes_written = 0;

	gedit_debug (DEBUG_UTILS);
	
	g_return_val_if_fail (content != NULL, NULL);
	g_return_val_if_fail (g_utf8_validate (content, len, NULL), NULL);
	g_return_val_if_fail (encoding != NULL, NULL);

	if (len < 0)
		len = strlen (content);

	if (encoding == gedit_encoding_get_utf8 ())
		return g_strndup (content, len);

	converted_contents = g_convert (content, 
					len, 
					gedit_encoding_get_charset (encoding), 
					"UTF-8",
					NULL, 
					&bytes_written,
					&conv_error); 

	if (conv_error != NULL)
	{
		gedit_debug_message (DEBUG_UTILS, "Cannot convert from UTF-8 to %s",
				     gedit_encoding_get_charset (encoding));

		if (converted_contents != NULL)
		{
			g_free (converted_contents);
			converted_contents = NULL;
		}

		g_propagate_error (error, conv_error);
	}
	else
	{
		if (new_len != NULL)
			*new_len = bytes_written;
	}

	return converted_contents;
}
コード例 #2
0
const GeditEncoding *
gedit_document_output_stream_get_guessed (GeditDocumentOutputStream *stream)
{
	g_return_val_if_fail (GEDIT_IS_DOCUMENT_OUTPUT_STREAM (stream), NULL);

	if (stream->priv->current_encoding != NULL)
	{
		return (const GeditEncoding *)stream->priv->current_encoding->data;
	}
	else if (stream->priv->is_utf8 || !stream->priv->is_initialized)
	{
		/* If it is not initialized we assume that we are trying to convert
		   the empty string */
		return gedit_encoding_get_utf8 ();
	}

	return NULL;
}
コード例 #3
0
static GCharsetConverter *
guess_encoding (GeditDocumentOutputStream *stream,
		const void                *inbuf,
		gsize                      inbuf_size)
{
	GCharsetConverter *conv = NULL;

	if (inbuf == NULL || inbuf_size == 0)
	{
		stream->priv->is_utf8 = TRUE;
		return NULL;
	}

	if (stream->priv->encodings != NULL &&
	    stream->priv->encodings->next == NULL)
	{
		stream->priv->use_first = TRUE;
	}

	/* We just check the first block */
	while (TRUE)
	{
		const GeditEncoding *enc;

		if (conv != NULL)
		{
			g_object_unref (conv);
			conv = NULL;
		}

		/* We get an encoding from the list */
		enc = get_encoding (stream);

		/* if it is NULL we didn't guess anything */
		if (enc == NULL)
		{
			break;
		}

		gedit_debug_message (DEBUG_UTILS, "trying charset: %s",
				     gedit_encoding_get_charset (stream->priv->current_encoding->data));

		if (enc == gedit_encoding_get_utf8 ())
		{
			gsize remainder;
			const gchar *end;
			
			if (g_utf8_validate (inbuf, inbuf_size, &end) ||
			    stream->priv->use_first)
			{
				stream->priv->is_utf8 = TRUE;
				break;
			}

			/* Check if the end is less than one char */
			remainder = inbuf_size - (end - (gchar *)inbuf);
			if (remainder < 6)
			{
				stream->priv->is_utf8 = TRUE;
				break;
			}

			continue;
		}

		conv = g_charset_converter_new ("UTF-8",
						gedit_encoding_get_charset (enc),
						NULL);

		/* If we tried all encodings we use the first one */
		if (stream->priv->use_first)
		{
			break;
		}

		/* Try to convert */
		if (try_convert (conv, inbuf, inbuf_size))
		{
			break;
		}
	}

	if (conv != NULL)
	{
		g_converter_reset (G_CONVERTER (conv));
	}

	return conv;
}
コード例 #4
0
static void
update_menu (GeditEncodingsComboBox *menu)
{
    GtkListStore *store;
    GtkTreeIter iter;
    GSList *encodings, *l;
    gchar *str;
    const GeditEncoding *utf8_encoding;
    const GeditEncoding *current_encoding;

    store = menu->priv->store;

    /* Unset the previous model */
    g_signal_handler_block (menu, menu->priv->changed_id);
    gtk_list_store_clear (store);
    gtk_combo_box_set_model (GTK_COMBO_BOX (menu),
                             NULL);

    utf8_encoding = gedit_encoding_get_utf8 ();
    current_encoding = gedit_encoding_get_current ();

    if (!menu->priv->save_mode)
    {
        gtk_list_store_append (store, &iter);
        gtk_list_store_set (store, &iter,
                            NAME_COLUMN, _("Automatically Detected"),
                            ENCODING_COLUMN, NULL,
                            ADD_COLUMN, FALSE,
                            -1);

        gtk_list_store_append (store, &iter);
        gtk_list_store_set (store, &iter,
                            NAME_COLUMN, "",
                            ENCODING_COLUMN, NULL,
                            ADD_COLUMN, FALSE,
                            -1);
    }

    if (current_encoding != utf8_encoding)
        str = gedit_encoding_to_string (utf8_encoding);
    else
        str = g_strdup_printf (_("Current Locale (%s)"),
                               gedit_encoding_get_charset (utf8_encoding));

    gtk_list_store_append (store, &iter);
    gtk_list_store_set (store, &iter,
                        NAME_COLUMN, str,
                        ENCODING_COLUMN, utf8_encoding,
                        ADD_COLUMN, FALSE,
                        -1);

    g_free (str);

    if ((utf8_encoding != current_encoding) &&
            (current_encoding != NULL))
    {
        str = g_strdup_printf (_("Current Locale (%s)"),
                               gedit_encoding_get_charset (current_encoding));

        gtk_list_store_append (store, &iter);
        gtk_list_store_set (store, &iter,
                            NAME_COLUMN, str,
                            ENCODING_COLUMN, current_encoding,
                            ADD_COLUMN, FALSE,
                            -1);

        g_free (str);
    }

    encodings = gedit_prefs_manager_get_shown_in_menu_encodings ();

    for (l = encodings; l != NULL; l = g_slist_next (l))
    {
        const GeditEncoding *enc = (const GeditEncoding *)l->data;

        if ((enc != current_encoding) &&
                (enc != utf8_encoding) &&
                (enc != NULL))
        {
            str = gedit_encoding_to_string (enc);

            gtk_list_store_append (store, &iter);
            gtk_list_store_set (store, &iter,
                                NAME_COLUMN, str,
                                ENCODING_COLUMN, enc,
                                ADD_COLUMN, FALSE,
                                -1);

            g_free (str);
        }
    }

    g_slist_free (encodings);

    if (gedit_prefs_manager_shown_in_menu_encodings_can_set ())
    {
        gtk_list_store_append (store, &iter);
        /* separator */
        gtk_list_store_set (store, &iter,
                            NAME_COLUMN, "",
                            ENCODING_COLUMN, NULL,
                            ADD_COLUMN, FALSE,
                            -1);

        gtk_list_store_append (store, &iter);
        gtk_list_store_set (store, &iter,
                            NAME_COLUMN, _("Add or Remove..."),
                            ENCODING_COLUMN, NULL,
                            ADD_COLUMN, TRUE,
                            -1);
    }

    /* set the model back */
    gtk_combo_box_set_model (GTK_COMBO_BOX (menu),
                             GTK_TREE_MODEL (menu->priv->store));
    gtk_combo_box_set_active (GTK_COMBO_BOX (menu), 0);

    g_signal_handler_unblock (menu, menu->priv->changed_id);
}