| 
									
										
										
										
											2002-07-04 15:19:30 +00:00
										 |  |  | #undef G_DISABLE_ASSERT
 | 
					
						
							|  |  |  | #undef G_LOG_DOMAIN
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-06-30 15:22:13 +00:00
										 |  |  | #include <sys/types.h>
 | 
					
						
							|  |  |  | #include <sys/stat.h>
 | 
					
						
							|  |  |  | #include <fcntl.h>
 | 
					
						
							|  |  |  | #include <glib.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define BUFFER_SIZE 1024
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-06-01 15:57:38 +00:00
										 |  |  | static void | 
					
						
							|  |  |  | test_small_writes (void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GIOChannel *io; | 
					
						
							| 
									
										
										
										
											2012-11-02 15:45:14 +00:00
										 |  |  |   GIOStatus status = G_IO_STATUS_ERROR; | 
					
						
							| 
									
										
										
										
											2006-06-01 15:57:38 +00:00
										 |  |  |   guint cnt;  | 
					
						
							|  |  |  |   gchar tmp; | 
					
						
							|  |  |  |   GError *error = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   io = g_io_channel_new_file ("iochannel-test-outfile", "w", &error); | 
					
						
							|  |  |  |   if (error) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       g_warning ("Unable to open file %s: %s",  | 
					
						
							|  |  |  | 		 "iochannel-test-outfile",  | 
					
						
							|  |  |  | 		 error->message); | 
					
						
							| 
									
										
										
										
											2012-06-11 07:19:42 -04:00
										 |  |  |       g_clear_error (&error); | 
					
						
							| 
									
										
										
										
											2006-06-01 15:57:38 +00:00
										 |  |  |        | 
					
						
							|  |  |  |       exit (1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_io_channel_set_encoding (io, NULL, NULL); | 
					
						
							|  |  |  |   g_io_channel_set_buffer_size (io, 1022); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   cnt = 2 * g_io_channel_get_buffer_size (io); | 
					
						
							|  |  |  |   tmp = 0; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |   while (cnt) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       status = g_io_channel_write_chars (io, &tmp, 1, NULL, NULL); | 
					
						
							|  |  |  |       if (status == G_IO_STATUS_ERROR) | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       if (status == G_IO_STATUS_NORMAL) | 
					
						
							|  |  |  | 	cnt--; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_assert (status == G_IO_STATUS_NORMAL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_io_channel_unref (io); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-06-30 15:22:13 +00:00
										 |  |  | gint main (gint argc, gchar * argv[]) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     GIOChannel *gio_r, *gio_w ; | 
					
						
							|  |  |  |     GError *gerr = NULL; | 
					
						
							|  |  |  |     GString *buffer; | 
					
						
							| 
									
										
										
										
											2001-08-12 14:12:02 +00:00
										 |  |  |     char *filename; | 
					
						
							| 
									
										
										
										
											2002-10-15 22:39:16 +00:00
										 |  |  |     gint rlength = 0; | 
					
						
							|  |  |  |     glong wlength = 0; | 
					
						
							|  |  |  |     gsize length_out; | 
					
						
							|  |  |  |     const gchar encoding[] = "EUC-JP"; | 
					
						
							| 
									
										
										
										
											2001-06-30 15:22:13 +00:00
										 |  |  |     GIOStatus status; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-29 23:49:30 -04:00
										 |  |  |     g_test_init (&argc, &argv, NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     filename = g_test_build_filename (G_TEST_DIST, "iochannel-test-infile", NULL); | 
					
						
							| 
									
										
										
										
											2013-05-20 21:05:56 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-14 05:20:14 +00:00
										 |  |  |     setbuf (stdout, NULL); /* For debugging */ | 
					
						
							| 
									
										
										
										
											2001-06-30 15:22:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-12 14:12:02 +00:00
										 |  |  |     gio_r = g_io_channel_new_file (filename, "r", &gerr); | 
					
						
							| 
									
										
										
										
											2001-07-20 20:14:37 +00:00
										 |  |  |     if (gerr) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2005-07-14 05:20:14 +00:00
										 |  |  |         g_warning ("Unable to open file %s: %s", filename, gerr->message); | 
					
						
							| 
									
										
										
										
											2012-06-11 07:19:42 -04:00
										 |  |  |         g_clear_error (&gerr); | 
					
						
							| 
									
										
										
										
											2001-08-12 14:12:02 +00:00
										 |  |  |         return 1; | 
					
						
							| 
									
										
										
										
											2001-07-20 20:14:37 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2005-07-14 05:20:14 +00:00
										 |  |  |     gio_w = g_io_channel_new_file ("iochannel-test-outfile", "w", &gerr); | 
					
						
							| 
									
										
										
										
											2001-07-20 20:14:37 +00:00
										 |  |  |     if (gerr) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2005-07-14 05:20:14 +00:00
										 |  |  |         g_warning ("Unable to open file %s: %s", "iochannel-test-outfile", gerr->message); | 
					
						
							| 
									
										
										
										
											2012-06-11 07:19:42 -04:00
										 |  |  |         g_clear_error (&gerr); | 
					
						
							| 
									
										
										
										
											2001-08-12 14:12:02 +00:00
										 |  |  |         return 1; | 
					
						
							| 
									
										
										
										
											2001-07-20 20:14:37 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2001-06-30 15:22:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     g_io_channel_set_encoding (gio_r, encoding, &gerr); | 
					
						
							| 
									
										
										
										
											2001-07-20 20:14:37 +00:00
										 |  |  |     if (gerr) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2011-11-14 22:06:07 +01:00
										 |  |  |         g_warning ("%s", gerr->message); | 
					
						
							| 
									
										
										
										
											2008-07-14 19:31:33 +00:00
										 |  |  |         /* Keep going if this is just a case of iconv not supporting EUC-JP, see bug 428048 */ | 
					
						
							|  |  |  |         if (gerr->code != G_CONVERT_ERROR_NO_CONVERSION) | 
					
						
							|  |  |  |           return 1; | 
					
						
							| 
									
										
										
										
											2012-06-11 07:19:42 -04:00
										 |  |  |         g_clear_error (&gerr); | 
					
						
							| 
									
										
										
										
											2001-07-20 20:14:37 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2001-06-30 15:22:13 +00:00
										 |  |  |      | 
					
						
							|  |  |  |     g_io_channel_set_buffer_size (gio_r, BUFFER_SIZE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     status = g_io_channel_set_flags (gio_r, G_IO_FLAG_NONBLOCK, &gerr); | 
					
						
							| 
									
										
										
										
											2001-07-20 20:14:37 +00:00
										 |  |  |     if (status == G_IO_STATUS_ERROR) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2011-11-14 22:06:07 +01:00
										 |  |  |         g_warning ("%s", gerr->message); | 
					
						
							| 
									
										
										
										
											2012-06-11 07:19:42 -04:00
										 |  |  |         g_clear_error (&gerr); | 
					
						
							| 
									
										
										
										
											2001-07-20 20:14:37 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2001-06-30 15:22:13 +00:00
										 |  |  |     buffer = g_string_sized_new (BUFFER_SIZE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while (TRUE) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         do | 
					
						
							|  |  |  |           status = g_io_channel_read_line_string (gio_r, buffer, NULL, &gerr); | 
					
						
							|  |  |  |         while (status == G_IO_STATUS_AGAIN); | 
					
						
							|  |  |  |         if (status != G_IO_STATUS_NORMAL) | 
					
						
							|  |  |  |           break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         rlength += buffer->len; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         do | 
					
						
							|  |  |  |           status = g_io_channel_write_chars (gio_w, buffer->str, buffer->len, | 
					
						
							|  |  |  |             &length_out, &gerr); | 
					
						
							|  |  |  |         while (status == G_IO_STATUS_AGAIN); | 
					
						
							|  |  |  |         if (status != G_IO_STATUS_NORMAL) | 
					
						
							|  |  |  |           break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         wlength += length_out; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (length_out < buffer->len) | 
					
						
							|  |  |  |           g_warning ("Only wrote part of the line."); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-14 05:20:14 +00:00
										 |  |  | #ifdef VERBOSE
 | 
					
						
							| 
									
										
										
										
											2001-08-03 20:42:06 +00:00
										 |  |  |         g_print ("%s", buffer->str); | 
					
						
							| 
									
										
										
										
											2005-07-14 05:20:14 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-06-30 15:22:13 +00:00
										 |  |  |         g_string_truncate (buffer, 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch (status) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         case G_IO_STATUS_EOF: | 
					
						
							|  |  |  |           break; | 
					
						
							|  |  |  |         case G_IO_STATUS_ERROR: | 
					
						
							| 
									
										
										
										
											2011-11-14 22:06:07 +01:00
										 |  |  |           g_warning ("%s", gerr->message); | 
					
						
							| 
									
										
										
										
											2012-06-11 07:19:42 -04:00
										 |  |  |           g_clear_error (&gerr); | 
					
						
							| 
									
										
										
										
											2001-06-30 15:22:13 +00:00
										 |  |  |           break; | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |           g_warning ("Abnormal exit from write loop."); | 
					
						
							|  |  |  |           break; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     do | 
					
						
							|  |  |  |       status = g_io_channel_flush (gio_w, &gerr); | 
					
						
							|  |  |  |     while (status == G_IO_STATUS_AGAIN); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-20 20:14:37 +00:00
										 |  |  |     if (status == G_IO_STATUS_ERROR) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2011-11-14 22:06:07 +01:00
										 |  |  |         g_warning ("%s", gerr->message); | 
					
						
							| 
									
										
										
										
											2012-06-11 07:19:42 -04:00
										 |  |  |         g_clear_error (&gerr); | 
					
						
							| 
									
										
										
										
											2001-07-20 20:14:37 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2001-06-30 15:22:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-07-14 05:20:14 +00:00
										 |  |  | #ifdef VERBOSE
 | 
					
						
							| 
									
										
										
										
											2002-10-15 22:39:16 +00:00
										 |  |  |     g_print ("read %d bytes, wrote %ld bytes\n", rlength, wlength); | 
					
						
							| 
									
										
										
										
											2005-07-14 05:20:14 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-06-30 15:22:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     g_io_channel_unref(gio_r); | 
					
						
							|  |  |  |     g_io_channel_unref(gio_w); | 
					
						
							| 
									
										
										
										
											2006-06-01 15:57:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     test_small_writes (); | 
					
						
							| 
									
										
										
										
											2013-11-10 10:54:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     g_free (filename); | 
					
						
							|  |  |  |     g_string_free (buffer, TRUE); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-06-30 15:22:13 +00:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } |