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