Add some more tests.
[platform/upstream/glib.git] / tests / iochannel-test.c
1 #undef G_DISABLE_ASSERT
2 #undef G_LOG_DOMAIN
3
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <fcntl.h>
7 #include <glib.h>
8 #include <string.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11
12 #define BUFFER_SIZE 1024
13
14 gint main (gint argc, gchar * argv[])
15 {
16     GIOChannel *gio_r, *gio_w ;
17     GError *gerr = NULL;
18     GString *buffer;
19     char *filename;
20     char *srcdir = getenv ("srcdir");
21     gint rlength = 0;
22     glong wlength = 0;
23     gsize length_out;
24     gboolean block;
25     const gchar encoding[] = "EUC-JP";
26     GIOStatus status;
27     GIOFlags flags;
28
29     if (!srcdir)
30       srcdir = ".";
31     filename = g_strconcat (srcdir, G_DIR_SEPARATOR_S, "iochannel-test-infile", NULL);
32   
33     setbuf(stdout, NULL); /* For debugging */
34
35     gio_r = g_io_channel_new_file (filename, "r", &gerr);
36     if (gerr)
37       {
38         g_warning("Unable to open file %s: %s", filename, gerr->message);
39         g_error_free(gerr);
40         return 1;
41       }
42     gio_w = g_io_channel_new_file( "iochannel-test-outfile", "w", &gerr);
43     if (gerr)
44       {
45         g_warning("Unable to open file %s: %s", "iochannel-test-outfile", gerr->message);
46         g_error_free(gerr);
47         return 1;
48       }
49
50     g_io_channel_set_encoding (gio_r, encoding, &gerr);
51     if (gerr)
52       {
53         g_warning(gerr->message);
54         g_error_free(gerr);
55         return 1;
56       }
57     
58     g_io_channel_set_buffer_size (gio_r, BUFFER_SIZE);
59
60     status = g_io_channel_set_flags (gio_r, G_IO_FLAG_NONBLOCK, &gerr);
61     if (status == G_IO_STATUS_ERROR)
62       {
63         g_warning(gerr->message);
64         g_error_free(gerr);
65         gerr = NULL;
66       }
67     flags = g_io_channel_get_flags (gio_r);
68     block = ! (flags & G_IO_FLAG_NONBLOCK);
69     if (block)
70         g_print (" BLOCKING TRUE \n\n");
71     else
72         g_print (" BLOCKING FALSE \n\n");
73
74     buffer = g_string_sized_new (BUFFER_SIZE);
75
76     while (TRUE)
77     {
78         do
79           status = g_io_channel_read_line_string (gio_r, buffer, NULL, &gerr);
80         while (status == G_IO_STATUS_AGAIN);
81         if (status != G_IO_STATUS_NORMAL)
82           break;
83
84         rlength += buffer->len;
85
86         do
87           status = g_io_channel_write_chars (gio_w, buffer->str, buffer->len,
88             &length_out, &gerr);
89         while (status == G_IO_STATUS_AGAIN);
90         if (status != G_IO_STATUS_NORMAL)
91           break;
92
93         wlength += length_out;
94
95         if (length_out < buffer->len)
96           g_warning ("Only wrote part of the line.");
97
98         g_print ("%s", buffer->str);
99         g_string_truncate (buffer, 0);
100     }
101
102     switch (status)
103       {
104         case G_IO_STATUS_EOF:
105           break;
106         case G_IO_STATUS_ERROR:
107           g_warning (gerr->message);
108           g_error_free (gerr);
109           gerr = NULL;
110           break;
111         default:
112           g_warning ("Abnormal exit from write loop.");
113           break;
114       }
115
116     do
117       status = g_io_channel_flush (gio_w, &gerr);
118     while (status == G_IO_STATUS_AGAIN);
119
120     if (status == G_IO_STATUS_ERROR)
121       {
122         g_warning(gerr->message);
123         g_error_free(gerr);
124         gerr = NULL;
125       }
126
127     g_print ("read %d bytes, wrote %ld bytes\n", rlength, wlength);
128
129     g_io_channel_unref(gio_r);
130     g_io_channel_unref(gio_w);
131     
132     return 0;
133 }