1 #undef G_DISABLE_ASSERT
12 #define BUFFER_SIZE 1024
15 test_small_writes (void)
18 GIOStatus status
= G_IO_STATUS_ERROR
;
23 io
= g_io_channel_new_file ("iochannel-test-outfile", "w", &error
);
26 g_warning ("Unable to open file %s: %s",
27 "iochannel-test-outfile",
29 g_clear_error (&error
);
34 g_io_channel_set_encoding (io
, NULL
, NULL
);
35 g_io_channel_set_buffer_size (io
, 1022);
37 cnt
= 2 * g_io_channel_get_buffer_size (io
);
42 status
= g_io_channel_write_chars (io
, &tmp
, 1, NULL
, NULL
);
43 if (status
== G_IO_STATUS_ERROR
)
45 if (status
== G_IO_STATUS_NORMAL
)
49 g_assert (status
== G_IO_STATUS_NORMAL
);
51 g_io_channel_unref (io
);
55 gint
main (gint argc
, gchar
* argv
[])
57 GIOChannel
*gio_r
, *gio_w
;
64 const gchar encoding
[] = "EUC-JP";
67 g_test_init (&argc
, &argv
, NULL
);
69 filename
= g_test_build_filename (G_TEST_DIST
, "iochannel-test-infile", NULL
);
71 setbuf (stdout
, NULL
); /* For debugging */
73 gio_r
= g_io_channel_new_file (filename
, "r", &gerr
);
76 g_warning ("Unable to open file %s: %s", filename
, gerr
->message
);
77 g_clear_error (&gerr
);
80 gio_w
= g_io_channel_new_file ("iochannel-test-outfile", "w", &gerr
);
83 g_warning ("Unable to open file %s: %s", "iochannel-test-outfile", gerr
->message
);
84 g_clear_error (&gerr
);
88 g_io_channel_set_encoding (gio_r
, encoding
, &gerr
);
91 g_warning ("%s", gerr
->message
);
92 /* Keep going if this is just a case of iconv not supporting EUC-JP, see bug 428048 */
93 if (gerr
->code
!= G_CONVERT_ERROR_NO_CONVERSION
)
95 g_clear_error (&gerr
);
98 g_io_channel_set_buffer_size (gio_r
, BUFFER_SIZE
);
100 status
= g_io_channel_set_flags (gio_r
, G_IO_FLAG_NONBLOCK
, &gerr
);
101 if (status
== G_IO_STATUS_ERROR
)
103 g_warning ("%s", gerr
->message
);
104 g_clear_error (&gerr
);
106 buffer
= g_string_sized_new (BUFFER_SIZE
);
111 status
= g_io_channel_read_line_string (gio_r
, buffer
, NULL
, &gerr
);
112 while (status
== G_IO_STATUS_AGAIN
);
113 if (status
!= G_IO_STATUS_NORMAL
)
116 rlength
+= buffer
->len
;
119 status
= g_io_channel_write_chars (gio_w
, buffer
->str
, buffer
->len
,
121 while (status
== G_IO_STATUS_AGAIN
);
122 if (status
!= G_IO_STATUS_NORMAL
)
125 wlength
+= length_out
;
127 if (length_out
< buffer
->len
)
128 g_warning ("Only wrote part of the line.");
131 g_print ("%s", buffer
->str
);
133 g_string_truncate (buffer
, 0);
138 case G_IO_STATUS_EOF
:
140 case G_IO_STATUS_ERROR
:
141 g_warning ("%s", gerr
->message
);
142 g_clear_error (&gerr
);
145 g_warning ("Abnormal exit from write loop.");
150 status
= g_io_channel_flush (gio_w
, &gerr
);
151 while (status
== G_IO_STATUS_AGAIN
);
153 if (status
== G_IO_STATUS_ERROR
)
155 g_warning ("%s", gerr
->message
);
156 g_clear_error (&gerr
);
160 g_print ("read %d bytes, wrote %ld bytes\n", rlength
, wlength
);
163 g_io_channel_unref(gio_r
);
164 g_io_channel_unref(gio_w
);
166 test_small_writes ();
169 g_string_free (buffer
, TRUE
);