From 4e4b91eda16902e233025e0ca31f1746145b8305 Mon Sep 17 00:00:00 2001 From: Sven Neumann Date: Wed, 25 Jun 2003 21:18:45 +0000 Subject: [PATCH] attempt to convert text from locale encoding. 2003-06-25 Sven Neumann * app/text/gimptext-parasite.c (gimp_text_from_gdyntext_parasite): attempt to convert text from locale encoding. * app/vectors/gimpvectors-compat.c (gimp_vectors_compat_new): allow paths with zero points (bug # 115955). * plug-ins/script-fu/script-fu-server.c: if a connection to a client is lost, invalidate file descriptors in the command queue. Plugged a couple of memleaks. --- ChangeLog | 12 ++++ app/text/gimptext-parasite.c | 13 +++- app/vectors/gimpvectors-compat.c | 6 +- plug-ins/script-fu/script-fu-server.c | 99 +++++++++++++++++---------- 4 files changed, 89 insertions(+), 41 deletions(-) diff --git a/ChangeLog b/ChangeLog index a7f8cc8f56..9be39b572f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2003-06-25 Sven Neumann + + * app/text/gimptext-parasite.c (gimp_text_from_gdyntext_parasite): + attempt to convert text from locale encoding. + + * app/vectors/gimpvectors-compat.c (gimp_vectors_compat_new): + allow paths with zero points (bug # 115955). + + * plug-ins/script-fu/script-fu-server.c: if a connection to a + client is lost, invalidate file descriptors in the command queue. + Plugged a couple of memleaks. + 2003-06-25 Sven Neumann * app/text/gimptext-xlfd.[ch]: added convenience function diff --git a/app/text/gimptext-parasite.c b/app/text/gimptext-parasite.c index ef8928433b..11efb5e2ee 100644 --- a/app/text/gimptext-parasite.c +++ b/app/text/gimptext-parasite.c @@ -159,9 +159,16 @@ gimp_text_from_gdyntext_parasite (const GimpParasite *parasite) if (! g_utf8_validate (text, -1, NULL)) { - g_message (_("Can not convert GDynText layer because it " - "contains text that is not UTF-8 encoded.")); - goto cleanup; + gchar *utf8_str; + + utf8_str = g_locale_to_utf8 (text, -1, NULL, NULL, NULL); + + g_free (text); + + if (utf8_str) + text = utf8_str; + else + text = g_strdup (_("(invalid UTF-8 string)")); } antialias = atoi (params[ANTIALIAS]) ? TRUE : FALSE; diff --git a/app/vectors/gimpvectors-compat.c b/app/vectors/gimpvectors-compat.c index 143e95ad21..53c0505e1d 100644 --- a/app/vectors/gimpvectors-compat.c +++ b/app/vectors/gimpvectors-compat.c @@ -58,8 +58,8 @@ gimp_vectors_compat_new (GimpImage *gimage, g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); g_return_val_if_fail (name != NULL, NULL); - g_return_val_if_fail (points != NULL, NULL); - g_return_val_if_fail (n_points > 0, NULL); + g_return_val_if_fail (points != NULL || n_points == 0, NULL); + g_return_val_if_fail (n_points >= 0, NULL); vectors = gimp_vectors_new (gimage, name); @@ -114,7 +114,7 @@ gimp_vectors_compat_new (GimpImage *gimage, } stroke = gimp_bezier_stroke_new_from_coords (curr_stroke, - curr_coord - curr_stroke , + curr_coord - curr_stroke, closed); gimp_vectors_stroke_add (vectors, stroke); g_object_unref (stroke); diff --git a/plug-ins/script-fu/script-fu-server.c b/plug-ins/script-fu/script-fu-server.c index e3f9624c33..1e71bfe8c2 100644 --- a/plug-ins/script-fu/script-fu-server.c +++ b/plug-ins/script-fu/script-fu-server.c @@ -243,7 +243,8 @@ script_fu_server_listen (gint timeout) else tvp = NULL; - /* Block until input arrives on one or more active sockets or timeout occurs. */ + /* Block until input arrives on one or more active sockets + or timeout occurs. */ server_read = server_active; if (select (FD_SETSIZE, &server_read, NULL, NULL, tvp) < 0) { @@ -274,11 +275,9 @@ script_fu_server_listen (gint timeout) g_hash_table_insert (clientname_ht, GINT_TO_POINTER (new), g_strdup (inet_ntoa (clientname.sin_addr))); - /* server_log ("Server: connect from host %s, port %d.\n", inet_ntoa (clientname.sin_addr), (unsigned int) ntohs (clientname.sin_port)); - */ FD_SET (new, &server_active); } @@ -286,18 +285,28 @@ script_fu_server_listen (gint timeout) { if (read_from_client (i) < 0) { + GList *list; + /* Disassociate the client address with the socket */ g_hash_table_remove (clientname_ht, GINT_TO_POINTER (i)); - /* server_log ("Server: disconnect from host %s, port %d.\n", inet_ntoa (clientname.sin_addr), (unsigned int) ntohs (clientname.sin_port)); - */ close (i); FD_CLR (i, &server_active); - } + + /* Invalidate the file descriptor for pending commands + from the disconnected client. */ + for (list = command_queue; list; list = list->next) + { + SFCommand *cmd = (SFCommand *) command_queue->data; + + if (cmd->filedes == i) + cmd->filedes = -1; + } + } } } } @@ -306,20 +315,8 @@ static void server_start (gint port, gchar *logfile) { - SFCommand *cmd; - - /* Set up the clientname hash table */ - clientname_ht = g_hash_table_new (g_direct_hash, NULL); - - /* Setup up the server log file */ - if (logfile) - server_log_file = fopen (logfile, "a"); - else - server_log_file = NULL; - if (server_log_file == NULL) - server_log_file = stdout; - - /* Create the socket and set it up to accept connections. */ + /* First of all, create the socket and set it up to accept connections. */ + /* This may fail if there's a server running on this port already. */ server_sock = make_socket (port); if (listen (server_sock, 5) < 0) { @@ -327,6 +324,20 @@ server_start (gint port, return; } + /* Setup up the server log file */ + if (logfile && *logfile) + server_log_file = fopen (logfile, "a"); + else + server_log_file = NULL; + + if (! server_log_file) + server_log_file = stdout; + + /* Set up the clientname hash table */ + clientname_ht = g_hash_table_new_full (g_direct_hash, NULL, + NULL, + (GDestroyNotify) g_free); + server_log ("Script-fu initialized and listening...\n"); /* Initialize the set of active sockets. */ @@ -340,8 +351,7 @@ server_start (gint port, while (command_queue) { - /* Get the current command */ - cmd = (SFCommand *) command_queue->data; + SFCommand *cmd = (SFCommand *) command_queue->data; /* Process the command */ execute_command (cmd); @@ -357,10 +367,6 @@ server_start (gint port, } server_quit (); - - /* Close the server log file */ - if (server_log_file != stdout) - fclose (server_log_file); } static gboolean @@ -374,7 +380,6 @@ execute_command (SFCommand *cmd) gboolean error; gint i; - /* Get the client address from the address/socket table */ server_log ("Processing request #%d\n", cmd->request_no); time (&clock1); @@ -406,7 +411,7 @@ execute_command (SFCommand *cmd) /* Write the response to the client */ for (i = 0; i < RESPONSE_HEADER; i++) - if (write (cmd->filedes, buffer + i, 1) < 0) + if (cmd->filedes > 0 && write (cmd->filedes, buffer + i, 1) < 0) { /* Write error */ perror ("write"); @@ -414,7 +419,7 @@ execute_command (SFCommand *cmd) } for (i = 0; i < response_len; i++) - if (write (cmd->filedes, response + i, 1) < 0) + if (cmd->filedes > 0 && write (cmd->filedes, response + i, 1) < 0) { /* Write error */ perror ("write"); @@ -499,8 +504,9 @@ read_from_client (gint filedes) time (&clock); server_log ("Received request #%d from IP address %s: %s on %s," "[Request queue length: %d]", - cmd->request_no, clientaddr, cmd->command, ctime (&clock), - queue_length); + cmd->request_no, + clientaddr ? clientaddr : "", + cmd->command, ctime (&clock), queue_length); return 0; } @@ -519,7 +525,7 @@ make_socket (guint port) perror ("socket"); gimp_quit (); } - setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &v, sizeof(v)); + setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &v, sizeof(v)); /* Give the socket a name. */ name.sin_family = AF_INET; @@ -559,6 +565,27 @@ server_quit (void) for (i = 0; i < FD_SETSIZE; ++i) if (FD_ISSET (i, &server_active)) shutdown (i, 2); + + g_hash_table_destroy (clientname_ht); + clientname_ht = NULL; + + while (command_queue) + { + SFCommand *cmd = (SFCommand *) command_queue->data; + + g_free (cmd->command); + g_free (cmd); + } + + g_list_free (command_queue); + command_queue = NULL; + queue_length = 0; + + /* Close the server log file */ + if (server_log_file != stdout) + fclose (server_log_file); + + server_log_file = NULL; } static gboolean @@ -576,11 +603,12 @@ server_interface (void) GTK_WIN_POS_MOUSE, FALSE, TRUE, FALSE, - GTK_STOCK_OK, ok_callback, - NULL, NULL, NULL, TRUE, FALSE, GTK_STOCK_CANCEL, gtk_widget_destroy, NULL, 1, NULL, FALSE, TRUE, + GTK_STOCK_OK, ok_callback, + NULL, NULL, NULL, TRUE, FALSE, + NULL); g_signal_connect (dlg, "destroy", @@ -611,7 +639,6 @@ server_interface (void) gtk_widget_show (dlg); gtk_main (); - gdk_flush (); return sint.run; } @@ -620,6 +647,8 @@ static void ok_callback (GtkWidget *widget, gpointer data) { + g_free (sint.logfile); + sint.port = atoi (gtk_entry_get_text (GTK_ENTRY (sint.port_entry))); sint.logfile = g_strdup (gtk_entry_get_text (GTK_ENTRY (sint.log_entry))); sint.run = TRUE;