Modified Files: glib/ChangeLog glib/glib/giochannel.c
[platform/upstream/glib.git] / glib / giochannel.c
1 /* GLIB - Library of useful routines for C programming
2  * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
4  * giochannel.c: IO Channel abstraction
5  * Copyright 1998 Owen Taylor
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the
19  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */
22
23 /*
24  * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
25  * file for a list of people on the GLib Team.  See the ChangeLog
26  * files for a list of changes.  These files are distributed with
27  * GLib at ftp://ftp.gtk.org/pub/gtk/. 
28  */
29
30 /* 
31  * MT safe
32  */
33
34 #include "config.h"
35 #include "giochannel.h"
36
37 #include <string.h>
38 #include <errno.h>
39
40 #ifdef HAVE_UNISTD_H
41 #include <unistd.h>
42 #endif
43
44 #undef G_DISABLE_DEPRECATED
45
46 #include "glib.h"
47
48 #include "glibintl.h"
49
50 #define G_IO_NICE_BUF_SIZE      1024
51
52 /* This needs to be as wide as the largest character in any possible encoding */
53 #define MAX_CHAR_SIZE           10
54
55 /* Some simplifying macros, which reduce the need to worry whether the
56  * buffers have been allocated. These also make USE_BUF () an lvalue,
57  * which is used in g_io_channel_read_to_end ().
58  */
59 #define USE_BUF(channel)        ((channel)->encoding ? (channel)->encoded_read_buf \
60                                  : (channel)->read_buf)
61 #define BUF_LEN(string)         ((string) ? (string)->len : 0)
62
63 static GIOError         g_io_error_get_from_g_error     (GIOStatus    status,
64                                                          GError      *err);
65 static void             g_io_channel_purge              (GIOChannel  *channel);
66 static GIOStatus        g_io_channel_fill_buffer        (GIOChannel  *channel,
67                                                          GError     **err);
68 static GIOStatus        g_io_channel_read_line_backend  (GIOChannel  *channel,
69                                                          gsize       *length,
70                                                          gsize       *terminator_pos,
71                                                          GError     **error);
72
73 void
74 g_io_channel_init (GIOChannel *channel)
75 {
76   channel->ref_count = 1;
77   channel->encoding = g_strdup ("UTF-8");
78   channel->line_term = NULL;
79   channel->buf_size = G_IO_NICE_BUF_SIZE;
80   channel->read_cd = (GIConv) -1;
81   channel->write_cd = (GIConv) -1;
82   channel->read_buf = NULL; /* Lazy allocate buffers */
83   channel->encoded_read_buf = NULL;
84   channel->write_buf = NULL;
85   channel->partial_write_buf[0] = '\0';
86   channel->use_buffer = TRUE;
87   channel->do_encode = FALSE;
88   channel->close_on_unref = FALSE;
89 }
90
91 void 
92 g_io_channel_ref (GIOChannel *channel)
93 {
94   g_return_if_fail (channel != NULL);
95
96   channel->ref_count++;
97 }
98
99 void 
100 g_io_channel_unref (GIOChannel *channel)
101 {
102   g_return_if_fail (channel != NULL);
103
104   channel->ref_count--;
105   if (channel->ref_count == 0)
106     {
107       if (channel->close_on_unref)
108         g_io_channel_shutdown (channel, TRUE, NULL);
109       else
110         g_io_channel_purge (channel);
111       g_free (channel->encoding);
112       if (channel->read_cd != (GIConv) -1)
113         g_iconv_close (channel->read_cd);
114       if (channel->write_cd != (GIConv) -1)
115         g_iconv_close (channel->write_cd);
116       g_free (channel->line_term);
117       if (channel->read_buf)
118         g_string_free (channel->read_buf, TRUE);
119       if (channel->write_buf)
120         g_string_free (channel->write_buf, TRUE);
121       if (channel->encoded_read_buf)
122         g_string_free (channel->encoded_read_buf, TRUE);
123       channel->funcs->io_free (channel);
124     }
125 }
126
127 static GIOError
128 g_io_error_get_from_g_error (GIOStatus status,
129                              GError *err)
130 {
131   switch (status)
132     {
133       case G_IO_STATUS_NORMAL:
134       case G_IO_STATUS_EOF:
135         return G_IO_ERROR_NONE;
136       case G_IO_STATUS_AGAIN:
137         return G_IO_ERROR_AGAIN;
138       case G_IO_STATUS_ERROR:
139         if (err->domain != G_IO_CHANNEL_ERROR)
140           return G_IO_ERROR_UNKNOWN;
141         switch (err->code)
142           {
143             case G_IO_CHANNEL_ERROR_INVAL:
144               return G_IO_ERROR_INVAL;
145             default:
146               return G_IO_ERROR_UNKNOWN;
147           }
148       default:
149         g_assert_not_reached ();
150         return G_IO_ERROR_UNKNOWN; /* Keep the compiler happy */
151     }
152 }
153
154 /**
155  * g_io_channel_read:
156  * @channel: a #GIOChannel. 
157  * @buf: a buffer to read the data into (which should be at least count bytes long).
158  * @count: the number of bytes to read from the #GIOChannel.
159  * @bytes_read: returns the number of bytes actually read. 
160  * 
161  * Reads data from a #GIOChannel. This function is depricated. New code should
162  * use g_io_channel_read_chars() instead.
163  * 
164  * Return value: %G_IO_ERROR_NONE if the operation was successful. 
165  **/
166 GIOError 
167 g_io_channel_read (GIOChannel *channel, 
168                    gchar      *buf, 
169                    gsize       count,
170                    gsize      *bytes_read)
171 {
172   GError *err = NULL;
173   GIOError error;
174   GIOStatus status;
175
176   g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN);
177   g_return_val_if_fail (bytes_read != NULL, G_IO_ERROR_UNKNOWN);
178
179   status = channel->funcs->io_read (channel, buf, count, bytes_read, &err);
180
181   error = g_io_error_get_from_g_error (status, err);
182
183   if (err)
184     g_error_free (err);
185
186   return error;
187 }
188
189 /**
190  * g_io_channel_write:
191  * @channel:  a #GIOChannel.
192  * @buf: the buffer containing the data to write. 
193  * @count: the number of bytes to write.
194  * @bytes_written:  the number of bytes actually written.
195  * 
196  * Writes data to a #GIOChannel. This function is depricated. New code should
197  * use g_io_channel_write_chars() instead.
198  * 
199  * Return value:  %G_IO_ERROR_NONE if the operation was successful.
200  **/
201 GIOError 
202 g_io_channel_write (GIOChannel  *channel, 
203                     const gchar *buf, 
204                     gsize        count,
205                     gsize       *bytes_written)
206 {
207   GError *err = NULL;
208   GIOError error;
209   GIOStatus status;
210
211   g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN);
212   g_return_val_if_fail (bytes_written != NULL, G_IO_ERROR_UNKNOWN);
213
214   status = channel->funcs->io_write (channel, buf, count, bytes_written, &err);
215
216   error = g_io_error_get_from_g_error (status, err);
217
218   if (err)
219     g_error_free (err);
220
221   return error;
222 }
223
224 /**
225  * g_io_channel_seek:
226  * @channel: a #GIOChannel. 
227  * @offset: an offset, in bytes, which is added to the position specified by @type
228  * @type: the position in the file, which can be %G_SEEK_CUR (the current
229  *        position), %G_SEEK_SET (the start of the file), or %G_SEEK_END (the end of the
230  *        file).
231  * 
232  * Sets the current position in the #GIOChannel, similar to the standard library
233  * function fseek(). This function is depricated. New code should
234  * use g_io_channel_seek_position() instead.
235  * 
236  * Return value: %G_IO_ERROR_NONE if the operation was successful.
237  **/
238 GIOError 
239 g_io_channel_seek  (GIOChannel   *channel,
240                     glong         offset, 
241                     GSeekType     type)
242 {
243   GError *err = NULL;
244   GIOError error;
245   GIOStatus status;
246
247   g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN);
248   g_return_val_if_fail (channel->is_seekable, G_IO_ERROR_UNKNOWN);
249
250   switch (type)
251     {
252       case G_SEEK_CUR:
253       case G_SEEK_SET:
254       case G_SEEK_END:
255         break;
256       default:
257         g_warning ("g_io_channel_seek: unknown seek type");
258         return G_IO_ERROR_UNKNOWN;
259     }
260
261   status = channel->funcs->io_seek (channel, offset, type, &err);
262
263   error = g_io_error_get_from_g_error (status, err);
264
265   if (err)
266     g_error_free (err);
267
268   return error;
269 }
270
271 /* The function g_io_channel_new_file() is prototyped in both
272  * giounix.c and giowin32.c, so we stick its documentation here.
273  */
274
275 /**
276  * g_io_channel_new_file:
277  * @filename: A string containing the name of a file.
278  * @mode: One of "r", "w", "a", "r+", "w+", "a+". These have
279  *        the same meaning as in fopen().
280  * @error: A location to return an error of type %G_IO_FILE_ERROR.
281  *
282  * Open a file @filename as a #GIOChannel using mode @mode. This
283  * channel will be closed when the last reference to it is dropped,
284  * so there is no need to call g_io_channel_close() (though doing
285  * so will not cause problems, as long as no attempt is made to
286  * access the channel after it is closed).
287  *
288  * Return value: A #GIOChannel on success, %NULL on failure.
289  **/
290
291 /**
292  * g_io_channel_close:
293  * @channel: A #GIOChannel
294  * 
295  * Close an IO channel. Any pending data to be written will be
296  * flushed, ignoring errors. The channel will not be freed until the
297  * last reference is dropped using g_io_channel_unref(). This
298  * function is deprecated: you should use g_io_channel_shutdown()
299  * instead.
300  **/
301 void
302 g_io_channel_close (GIOChannel *channel)
303 {
304   GError *err = NULL;
305   
306   g_return_if_fail (channel != NULL);
307
308   g_io_channel_purge (channel);
309
310   channel->funcs->io_close (channel, &err);
311
312   if (err)
313     { /* No way to return the error */
314       g_warning ("Error closing channel: %s", err->message);
315       g_error_free (err);
316     }
317   
318   channel->close_on_unref = FALSE; /* Because we already did */
319   channel->is_readable = FALSE;
320   channel->is_writeable = FALSE;
321   channel->is_seekable = FALSE;
322 }
323
324 /**
325  * g_io_channel_shutdown:
326  * @channel: a #GIOChannel
327  * @flush: if %TRUE, flush pending
328  * @err: location to store a #GIOChannelError
329  * 
330  * Close an IO channel. Any pending data to be written will be
331  * flushed. The channel will not be freed until the
332  * last reference is dropped using g_io_channel_unref().
333  *
334  * Return value:
335  **/
336 GIOStatus
337 g_io_channel_shutdown (GIOChannel *channel,
338                        gboolean    flush,
339                        GError    **err)
340 {
341   GIOStatus status, result;
342   GError *tmperr = NULL;
343   
344   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
345   g_return_val_if_fail (err == NULL || *err == NULL, G_IO_STATUS_ERROR);
346
347   if (flush && channel->write_buf && channel->write_buf->len > 0)
348     {
349       GIOFlags flags;
350       
351       /* Set the channel to blocking, to avoid a busy loop
352        */
353       flags = g_io_channel_get_flags (channel);
354       /* Ignore any errors here, they're irrelevant */
355       g_io_channel_set_flags (channel, flags & ~G_IO_FLAG_NONBLOCK, NULL);
356
357       result = g_io_channel_flush (channel, &tmperr);
358
359       if (channel->partial_write_buf[0] != '\0')
360         {
361           g_warning ("Partial character at end of write buffer not flushed.\n");
362           channel->partial_write_buf[0] = '\0';
363         }
364     }
365   else
366     result = G_IO_STATUS_NORMAL;
367
368   status = channel->funcs->io_close (channel, err);
369
370   channel->close_on_unref = FALSE; /* Because we already did */
371   channel->is_readable = FALSE;
372   channel->is_writeable = FALSE;
373   channel->is_seekable = FALSE;
374
375   if (status != G_IO_STATUS_NORMAL)
376     {
377       g_clear_error (&tmperr);
378       return status;
379     }
380   else if (result != G_IO_STATUS_NORMAL)
381     {
382       g_propagate_error (err, tmperr);
383       return result;
384     }
385   else
386     return G_IO_STATUS_NORMAL;
387 }
388
389 /* This function is used for the final flush on close or unref */
390 static void
391 g_io_channel_purge (GIOChannel *channel)
392 {
393   GError *err = NULL;
394   GIOStatus status;
395
396   g_return_if_fail (channel != NULL);
397
398   if (channel->write_buf && channel->write_buf->len > 0)
399     {
400       GIOFlags flags;
401       
402       /* Set the channel to blocking, to avoid a busy loop
403        */
404       flags = g_io_channel_get_flags (channel);
405       g_io_channel_set_flags (channel, flags & ~G_IO_FLAG_NONBLOCK, NULL);
406
407       status = g_io_channel_flush (channel, &err);
408
409       if (err)
410         { /* No way to return the error */
411           g_warning ("Error flushing string: %s", err->message);
412           g_error_free (err);
413         }
414     }
415
416   /* Flush these in case anyone tries to close without unrefing */
417
418   if (channel->read_buf)
419     g_string_truncate (channel->read_buf, 0);
420   if (channel->write_buf)
421     g_string_truncate (channel->write_buf, 0);
422   if (channel->encoding)
423     {
424       if (channel->encoded_read_buf)
425         g_string_truncate (channel->encoded_read_buf, 0);
426
427       if (channel->partial_write_buf[0] != '\0')
428         {
429           g_warning ("Partial character at end of write buffer not flushed.\n");
430           channel->partial_write_buf[0] = '\0';
431         }
432     }
433 }
434
435 GSource *
436 g_io_create_watch (GIOChannel  *channel,
437                    GIOCondition condition)
438 {
439   g_return_val_if_fail (channel != NULL, NULL);
440
441   return channel->funcs->io_create_watch (channel, condition);
442 }
443
444 guint 
445 g_io_add_watch_full (GIOChannel    *channel,
446                      gint           priority,
447                      GIOCondition   condition,
448                      GIOFunc        func,
449                      gpointer       user_data,
450                      GDestroyNotify notify)
451 {
452   GSource *source;
453   guint id;
454   
455   g_return_val_if_fail (channel != NULL, 0);
456
457   source = g_io_create_watch (channel, condition);
458
459   if (priority != G_PRIORITY_DEFAULT)
460     g_source_set_priority (source, priority);
461   g_source_set_callback (source, (GSourceFunc)func, user_data, notify);
462
463   id = g_source_attach (source, NULL);
464   g_source_unref (source);
465
466   return id;
467 }
468
469 guint 
470 g_io_add_watch (GIOChannel    *channel,
471                 GIOCondition   condition,
472                 GIOFunc        func,
473                 gpointer       user_data)
474 {
475   return g_io_add_watch_full (channel, G_PRIORITY_DEFAULT, condition, func, user_data, NULL);
476 }
477
478 /**
479  * g_io_channel_get_buffer_condition:
480  * @channel: A #GIOChannel
481  *
482  * This function returns a #GIOCondition depending on the status of the
483  * internal buffers in the #GIOChannel. Only the flags %G_IO_IN and
484  * %G_IO_OUT will be set.
485  *
486  * Return value: A #GIOCondition
487  **/
488 GIOCondition
489 g_io_channel_get_buffer_condition (GIOChannel *channel)
490 {
491   GIOCondition condition = 0;
492
493   if (channel->encoding)
494     {
495       if (channel->encoded_read_buf && (channel->encoded_read_buf->len > 0))
496         condition |= G_IO_IN; /* Only return if we have full characters */
497     }
498   else
499     {
500       if (channel->read_buf && (channel->read_buf->len > 0))
501         condition |= G_IO_IN;
502     }
503
504   if (channel->write_buf && (channel->write_buf->len < channel->buf_size))
505     condition |= G_IO_OUT;
506
507   return condition;
508 }
509
510 /**
511  * g_io_channel_error_from_errno:
512  * @en: An errno error number, e.g. EINVAL
513  *
514  * Return value: A #GIOChannelError error number, e.g. %G_IO_CHANNEL_ERROR_INVAL
515  **/
516 GIOChannelError
517 g_io_channel_error_from_errno (gint en)
518 {
519 #ifdef EAGAIN
520   g_return_val_if_fail (en != EAGAIN, G_IO_CHANNEL_ERROR_FAILED);
521 #endif
522 #ifdef EINTR
523   g_return_val_if_fail (en != EINTR, G_IO_CHANNEL_ERROR_FAILED);
524 #endif
525
526   switch (en)
527     {
528 #ifdef EBADF
529     case EBADF:
530       g_warning("Invalid file descriptor.\n");
531       return G_IO_CHANNEL_ERROR_FAILED;
532 #endif
533
534 #ifdef EFAULT
535     case EFAULT:
536       g_warning("File descriptor outside valid address space.\n");
537       return G_IO_CHANNEL_ERROR_FAILED;
538 #endif
539
540 #ifdef EFBIG
541     case EFBIG:
542       return G_IO_CHANNEL_ERROR_FBIG;
543 #endif
544
545 #ifdef EINVAL
546     case EINVAL:
547       return G_IO_CHANNEL_ERROR_INVAL;
548 #endif
549
550 #ifdef EIO
551     case EIO:
552       return G_IO_CHANNEL_ERROR_IO;
553 #endif
554
555 #ifdef EISDIR
556     case EISDIR:
557       return G_IO_CHANNEL_ERROR_ISDIR;
558 #endif
559
560 #ifdef ENOSPC
561     case ENOSPC:
562       return G_IO_CHANNEL_ERROR_NOSPC;
563 #endif
564
565 #ifdef ENXIO
566     case ENXIO:
567       return G_IO_CHANNEL_ERROR_NXIO;
568 #endif
569
570 #ifdef EOVERFLOW
571     case EOVERFLOW:
572       return G_IO_CHANNEL_ERROR_OVERFLOW;
573 #endif
574
575 #ifdef EPIPE
576     case EPIPE:
577       return G_IO_CHANNEL_ERROR_PIPE;
578 #endif
579
580     default:
581       return G_IO_CHANNEL_ERROR_FAILED;
582     }
583 }
584
585 /**
586  * g_io_channel_set_buffer_size:
587  * @channel: a #GIOChannel
588  * @size: the size of the buffer. 0 == pick a good size
589  *
590  * Set the buffer size.
591  **/  
592 void
593 g_io_channel_set_buffer_size (GIOChannel        *channel,
594                               gsize              size)
595 {
596   g_return_if_fail (channel != NULL);
597
598   if (size == 0)
599     size = G_IO_NICE_BUF_SIZE;
600
601   if (size < MAX_CHAR_SIZE)
602     size = MAX_CHAR_SIZE;
603
604   channel->buf_size = size;
605 }
606
607 /**
608  * g_io_channel_get_buffer_size:
609  * @channel: a #GIOChannel
610  *
611  * Get the buffer size.
612  *
613  * Return value: the size of the buffer.
614  **/  
615 gsize
616 g_io_channel_get_buffer_size (GIOChannel        *channel)
617 {
618   g_return_val_if_fail (channel != NULL, 0);
619
620   return channel->buf_size;
621 }
622
623 /**
624  * g_io_channel_set_line_term:
625  * @channel: a #GIOChannel
626  * @line_term: The line termination string. Use %NULL for auto detect.
627  *
628  * This sets the string that #GIOChannel uses to determine
629  * where in the file a line break occurs.
630  **/
631 void
632 g_io_channel_set_line_term (GIOChannel  *channel,
633                             const gchar *line_term)
634 {
635   g_return_if_fail (channel != NULL);
636   g_return_if_fail (!line_term || line_term[0]); /* Disallow "" */
637   g_return_if_fail (!line_term || g_utf8_validate (line_term, -1, NULL));
638                    /* Require valid UTF-8 */
639
640   g_free (channel->line_term);
641   channel->line_term = g_strdup (line_term);
642 }
643
644 /**
645  * g_io_channel_get_line_term:
646  * @channel: a #GIOChannel
647  *
648  * This returns the string that #GIOChannel uses to determine
649  * where in the file a line break occurs. A value of %NULL
650  * indicates auto detection.
651  *
652  * Return value: The line termination string. This value
653  *   is owned by GLib and must not be freed.
654  **/
655 G_CONST_RETURN gchar*
656 g_io_channel_get_line_term (GIOChannel  *channel)
657 {
658   g_return_val_if_fail (channel != NULL, 0);
659
660   return channel->line_term;
661 }
662
663 /**
664  * g_io_channel_set_flags:
665  * @channel: a #GIOChannel
666  * @flags: the flags to set on the channel
667  * @error: A location to return an error of type #GIOChannelError
668  *
669  * Return value:
670  **/
671 GIOStatus
672 g_io_channel_set_flags (GIOChannel *channel,
673                         GIOFlags    flags,
674                         GError    **error)
675 {
676   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
677   g_return_val_if_fail ((error == NULL) || (*error == NULL),
678                         G_IO_STATUS_ERROR);
679
680   return (* channel->funcs->io_set_flags)(channel,
681                                           flags & G_IO_FLAG_SET_MASK,
682                                           error);
683 }
684
685 /**
686  * g_io_channel_get_flags:
687  * @channel: a #GIOChannel
688  *
689  * Gets the current flags for a #GIOChannel, including read-only
690  * flags such as %G_IO_FLAG_IS_READABLE.
691  *
692  * Return value: the flags which are set on the channel
693  **/
694 GIOFlags
695 g_io_channel_get_flags (GIOChannel *channel)
696 {
697   GIOFlags flags;
698
699   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
700
701   flags = (* channel->funcs->io_get_flags) (channel);
702
703   /* Cross implementation code */
704
705   if (channel->is_seekable)
706     flags |= G_IO_FLAG_IS_SEEKABLE;
707   if (channel->is_readable)
708     flags |= G_IO_FLAG_IS_READABLE;
709   if (channel->is_writeable)
710     flags |= G_IO_FLAG_IS_WRITEABLE;
711
712   return flags;
713 }
714
715 /**
716  * g_io_channel_seek_position:
717  * @channel: a #GIOChannel
718  * @offset: The offset in bytes from the position specified by @type
719  * @type: a #GSeekType. The type %G_SEEK_CUR is only allowed if
720  *        the channel has the default encoding or the
721  *        encoding %G_IO_CHANNEL_ENCODE_RAW for raw file access.
722  * @error: A location to return an error of type #GIOChannelError
723  *
724  * Replacement for g_io_channel_seek() with the new API.
725  *
726  * Return value:
727  **/
728 GIOStatus
729 g_io_channel_seek_position      (GIOChannel* channel,
730                                  glong       offset,
731                                  GSeekType   type,
732                                  GError    **error)
733 {
734   GIOStatus status;
735
736   /* For files, only one of the read and write buffers can contain data.
737    * For sockets, both can contain data.
738    */
739
740   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
741   g_return_val_if_fail ((error == NULL) || (*error == NULL),
742                         G_IO_STATUS_ERROR);
743   g_return_val_if_fail (channel->is_seekable, G_IO_STATUS_ERROR);
744
745   switch (type)
746     {
747       case G_SEEK_CUR: /* The user is seeking relative to the head of the buffer */
748         if (channel->use_buffer)
749           {
750             if (channel->do_encode && channel->encoded_read_buf
751                 && channel->encoded_read_buf->len > 0)
752               {
753                 g_warning ("Seek type G_SEEK_CUR not allowed for this"
754                   " channel's encoding.\n");
755                 return G_IO_STATUS_ERROR;
756               }
757           if (channel->read_buf)
758             offset -= channel->read_buf->len;
759           if (channel->encoded_read_buf)
760             {
761               g_assert (channel->encoded_read_buf->len == 0 && !channel->do_encode);
762
763               /* If there's anything here, it's because the encoding is UTF-8,
764                * so we can just subtract the buffer length, the same as for
765                * the unencoded data.
766                */
767
768               offset -= channel->encoded_read_buf->len;
769             }
770           }
771         break;
772       case G_SEEK_SET:
773       case G_SEEK_END:
774         break;
775       default:
776         g_warning ("g_io_channel_seek_position: unknown seek type");
777         return G_IO_STATUS_ERROR;
778     }
779
780   if (channel->use_buffer)
781     {
782       status = g_io_channel_flush (channel, error);
783       if (status != G_IO_STATUS_NORMAL)
784         return status;
785     }
786
787   status = channel->funcs->io_seek (channel, offset, type, error);
788
789   if ((status == G_IO_STATUS_NORMAL) && (channel->use_buffer))
790     {
791       if (channel->read_buf)
792         g_string_truncate (channel->read_buf, 0);
793
794       /* Conversion state no longer matches position in file */
795       if (channel->read_cd != (GIConv) -1)
796         g_iconv (channel->read_cd, NULL, NULL, NULL, NULL);
797       if (channel->write_cd != (GIConv) -1)
798         g_iconv (channel->write_cd, NULL, NULL, NULL, NULL);
799
800       if (channel->encoded_read_buf)
801         {
802           g_assert (channel->encoded_read_buf->len == 0 || !channel->do_encode);
803           g_string_truncate (channel->encoded_read_buf, 0);
804         }
805
806       if (channel->partial_write_buf[0] != '\0')
807         {
808           g_warning ("Partial character at end of write buffer not flushed.\n");
809           channel->partial_write_buf[0] = '\0';
810         }
811     }
812
813   return status;
814 }
815
816 /**
817  * g_io_channel_flush:
818  * @channel: a #GIOChannel
819  * @error: location to store an error of type #GIOChannelError
820  *
821  * Flush the write buffer for the GIOChannel.
822  *
823  * Return value: the status of the operation: One of
824  *   G_IO_CHANNEL_NORMAL, G_IO_CHANNEL_AGAIN, or
825  *   G_IO_CHANNEL_ERROR.
826  **/
827 GIOStatus
828 g_io_channel_flush (GIOChannel  *channel,
829                     GError     **error)
830 {
831   GIOStatus status;
832   gsize this_time = 1, bytes_written = 0;
833
834   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
835   g_return_val_if_fail ((error == NULL) || (*error == NULL), G_IO_STATUS_ERROR);
836
837   if (channel->write_buf == NULL || channel->write_buf->len == 0)
838     return G_IO_STATUS_NORMAL;
839
840   do
841     {
842       g_assert (this_time > 0);
843
844       status = channel->funcs->io_write (channel,
845                                       channel->write_buf->str + bytes_written,
846                                       channel->write_buf->len - bytes_written,
847                                       &this_time, error);
848       bytes_written += this_time;
849     }
850   while ((bytes_written < channel->write_buf->len)
851          && (status == G_IO_STATUS_NORMAL));
852
853   g_string_erase (channel->write_buf, 0, bytes_written);
854
855   return status;
856 }
857
858 /**
859  * g_io_channel_set_buffered:
860  * @channel: a #GIOChannel
861  * @buffered: whether to set the channel buffered or unbuffered
862  *
863  * The buffering state can only be set if the channel's encoding
864  * is %NULL. For any other encoding, the channel must be buffered.
865  *
866  * The default state of the channel is buffered.
867  **/
868 void
869 g_io_channel_set_buffered       (GIOChannel *channel,
870                                  gboolean    buffered)
871 {
872   g_return_if_fail (channel != NULL);
873
874   if (channel->encoding != NULL)
875     {
876       g_warning ("Need to have NULL encoding to set the buffering state of the "
877                  "channel.\n");
878       return;
879     }
880
881   g_return_if_fail (!channel->read_buf || channel->read_buf->len == 0);
882   g_return_if_fail (!channel->write_buf || channel->write_buf->len == 0);
883
884   channel->use_buffer = buffered;
885 }
886
887 /**
888  * g_io_channel_get_buffered:
889  * @channel: a #GIOChannel
890  *
891  * Return Value: the buffering state of the channel
892  **/
893 gboolean
894 g_io_channel_get_buffered       (GIOChannel *channel)
895 {
896   g_return_val_if_fail (channel != NULL, FALSE);
897
898   return channel->use_buffer;
899 }
900
901 /**
902  * g_io_channel_set_encoding:
903  * @channel: a #GIOChannel
904  * @encoding: the encoding type
905  * @error: location to store an error of type #GConvertError.
906  *
907  * Set the encoding for the input/output of the channel. The internal
908  * encoding is always UTF-8. The default encoding for the
909  * external file is UTF-8.
910  *
911  * The encoding %NULL is safe to use with binary data.
912  * Encodings other than %NULL must use a buffered channel.
913  * Encodings other than %NULL and UTF-8 cannot
914  * use g_io_channel_seek_position() with seek type %G_SEEK_CUR,
915  * and cannot mix reading and writing if the channel is
916  * a file without first doing a seek of type %G_SEEK_SET or
917  * %G_SEEK_END.
918  *
919  * The encoding can only be set under three conditions:
920  *
921  * 1. The channel was just created, and has not been written to
922  *    or read from yet.
923  *
924  * 2. The channel is a file, and the file pointer was just
925  *    repositioned by a call to g_io_channel_seek_position().
926  *    (This flushes all the internal buffers.)
927  *
928  * 3. The current encoding is %NULL or UTF-8.
929  *
930  * Return Value: %G_IO_STATUS_NORMAL if the encoding was succesfully set.
931  **/
932 GIOStatus
933 g_io_channel_set_encoding (GIOChannel   *channel,
934                            const gchar  *encoding,
935                            GError      **error)
936 {
937   GIConv read_cd, write_cd;
938   gboolean did_encode;
939
940   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
941   g_return_val_if_fail ((error == NULL) || (*error == NULL), G_IO_STATUS_ERROR);
942
943   /* Make sure the encoded buffers are empty */
944
945   g_return_val_if_fail (!channel->do_encode || !channel->encoded_read_buf ||
946                         channel->encoded_read_buf->len == 0, G_IO_STATUS_ERROR);
947
948   if (!channel->use_buffer)
949     {
950       g_warning ("Need to set the channel buffered before setting the encoding.\n");
951       g_warning ("Assuming this is what you meant and acting accordingly.\n");
952
953       channel->use_buffer = TRUE;
954     }
955
956   if (channel->partial_write_buf[0] != '\0')
957     {
958       g_warning ("Partial character at end of write buffer not flushed.\n");
959       channel->partial_write_buf[0] = '\0';
960     }
961
962   did_encode = channel->do_encode;
963
964   if (!encoding || strcmp (encoding, "UTF8") == 0 || strcmp (encoding, "UTF-8") == 0)
965     {
966       channel->do_encode = FALSE;
967       read_cd = write_cd = (GIConv) -1;
968     }
969   else
970     {
971       gint err = 0;
972       const gchar *from_enc = NULL, *to_enc = NULL;
973
974       if (channel->is_readable)
975         {
976           read_cd = g_iconv_open ("UTF-8", encoding);
977
978           if (read_cd == (GIConv) -1)
979             {
980               err = errno;
981               from_enc = "UTF-8";
982               to_enc = encoding;
983             }
984         }
985       else
986         read_cd = (GIConv) -1;
987
988       if (channel->is_writeable && err == 0)
989         {
990           write_cd = g_iconv_open (encoding, "UTF-8");
991
992           if (write_cd == (GIConv) -1)
993             {
994               err = errno;
995               from_enc = encoding;
996               to_enc = "UTF-8";
997             }
998         }
999       else
1000         write_cd = (GIConv) -1;
1001
1002       if (err != 0)
1003         {
1004           g_assert (from_enc);
1005           g_assert (to_enc);
1006
1007           if (err == EINVAL)
1008             g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_NO_CONVERSION,
1009                          _("Conversion from character set `%s' to `%s' is not supported"),
1010                          from_enc, to_enc);
1011           else
1012             g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
1013                          _("Could not open converter from `%s' to `%s': %s"),
1014                          from_enc, to_enc, strerror (errno));
1015
1016           if (read_cd != (GIConv) -1)
1017             g_iconv_close (read_cd);
1018           if (write_cd != (GIConv) -1)
1019             g_iconv_close (write_cd);
1020
1021           return G_IO_STATUS_ERROR;
1022         }
1023
1024       channel->do_encode = TRUE;
1025     }
1026
1027   /* The encoding is ok, so set the fields in channel */
1028
1029   if (channel->read_cd != (GIConv) -1)
1030     g_iconv_close (channel->read_cd);
1031   if (channel->write_cd != (GIConv) -1)
1032     g_iconv_close (channel->write_cd);
1033
1034   if (channel->encoded_read_buf && channel->encoded_read_buf->len > 0)
1035     {
1036       g_assert (!did_encode); /* Encoding UTF-8, NULL doesn't use encoded_read_buf */
1037
1038       /* This is just validated UTF-8, so we can copy it back into read_buf
1039        * so it can be encoded in whatever the new encoding is.
1040        */
1041
1042       g_string_prepend_len (channel->read_buf, channel->encoded_read_buf->str,
1043                             channel->encoded_read_buf->len);
1044       g_string_truncate (channel->encoded_read_buf, 0);
1045     }
1046
1047   channel->read_cd = read_cd;
1048   channel->write_cd = write_cd;
1049
1050   g_free (channel->encoding);
1051   channel->encoding = g_strdup (encoding);
1052
1053   return G_IO_STATUS_NORMAL;
1054 }
1055
1056 /**
1057  * g_io_channel_get_encoding:
1058  * @channel: a #GIOChannel
1059  *
1060  * Get the encoding for the input/output of the channel. The internal
1061  * encoding is always UTF-8. The encoding %G_IO_CHANNEL_ENCODE_RAW
1062  * disables encoding and turns off internal buffering. Both
1063  * %G_IO_CHANNEL_ENCODE_RAW and the default (no encoding, but buffered)
1064  * are safe to use with binary data.
1065  *
1066  * Return value: A string containing the encoding, this string is
1067  *   owned by GLib and must not be freed.
1068  **/
1069 G_CONST_RETURN gchar*
1070 g_io_channel_get_encoding (GIOChannel      *channel)
1071 {
1072   g_return_val_if_fail (channel != NULL, NULL);
1073
1074   return channel->encoding;
1075 }
1076
1077 static GIOStatus
1078 g_io_channel_fill_buffer (GIOChannel *channel,
1079                           GError    **err)
1080 {
1081   gsize read_size, cur_len, oldlen;
1082   GIOStatus status;
1083
1084   if (channel->is_seekable && channel->write_buf && channel->write_buf->len > 0)
1085     {
1086       status = g_io_channel_flush (channel, err);
1087       if (status != G_IO_STATUS_NORMAL)
1088         return status;
1089     }
1090   if (channel->is_seekable && channel->partial_write_buf[0] != '\0')
1091     {
1092       g_warning ("Partial character at end of write buffer not flushed.\n");
1093       channel->partial_write_buf[0] = '\0';
1094     }
1095
1096   if (!channel->read_buf)
1097     channel->read_buf = g_string_sized_new (channel->buf_size);
1098
1099   cur_len = channel->read_buf->len;
1100
1101   g_string_set_size (channel->read_buf, channel->read_buf->len + channel->buf_size);
1102
1103   status = channel->funcs->io_read (channel, channel->read_buf->str + cur_len,
1104                                     channel->buf_size, &read_size, err);
1105
1106   g_assert ((status == G_IO_STATUS_NORMAL) || (read_size == 0));
1107
1108   g_string_truncate (channel->read_buf, read_size + cur_len);
1109
1110   if ((status != G_IO_STATUS_NORMAL)
1111     && ((status != G_IO_STATUS_EOF) || (channel->read_buf->len == 0)))
1112     return status;
1113
1114   g_assert (channel->read_buf->len > 0);
1115
1116   if (channel->encoded_read_buf)
1117     oldlen = channel->encoded_read_buf->len;
1118   else
1119     {
1120       oldlen = 0;
1121       if (channel->encoding)
1122         channel->encoded_read_buf = g_string_sized_new (channel->buf_size);
1123     }
1124
1125   if (channel->do_encode)
1126     {
1127       size_t errnum, inbytes_left, outbytes_left;
1128       gchar *inbuf, *outbuf;
1129
1130       g_assert (channel->encoded_read_buf);
1131
1132 reencode:
1133
1134       inbytes_left = channel->read_buf->len;
1135       outbytes_left = MAX (6, MAX (channel->read_buf->len,
1136                            channel->encoded_read_buf->allocated_len
1137                            - channel->encoded_read_buf->len));
1138
1139       inbuf = channel->read_buf->str;
1140       outbuf = channel->encoded_read_buf->str + channel->encoded_read_buf->len;
1141
1142       g_string_set_size (channel->encoded_read_buf,
1143                          channel->encoded_read_buf->len + outbytes_left);
1144
1145       errnum = g_iconv (channel->read_cd, &inbuf, &inbytes_left,
1146                         &outbuf, &outbytes_left);
1147
1148       g_string_erase (channel->read_buf, 0,
1149                       channel->read_buf->len - inbytes_left);
1150       g_string_truncate (channel->encoded_read_buf,
1151                          channel->encoded_read_buf->len - outbytes_left);
1152
1153       if (errnum == (size_t) -1)
1154         {
1155           switch (errno)
1156             {
1157               case EINVAL:
1158                 if ((oldlen == channel->encoded_read_buf->len)
1159                   && (status == G_IO_STATUS_EOF))
1160                   status = G_IO_STATUS_EOF;
1161                 else
1162                   status = G_IO_STATUS_NORMAL;
1163                 break;
1164               case E2BIG:
1165                 /* Buffer size at least 6, wrote at least on character */
1166                 g_assert (inbuf != channel->read_buf->str);
1167                 goto reencode;
1168               case EILSEQ:
1169                 if (oldlen < channel->encoded_read_buf->len)
1170                   status = G_IO_STATUS_NORMAL;
1171                 else
1172                   {
1173                     g_set_error (err, G_CONVERT_ERROR,
1174                       G_CONVERT_ERROR_ILLEGAL_SEQUENCE,
1175                       _("Invalid byte sequence in conversion input"));
1176                     return G_IO_STATUS_ERROR;
1177                   }
1178                 break;
1179               default:
1180                 g_set_error (err, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
1181                   _("Error during conversion: %s"), strerror (errno));
1182                 return G_IO_STATUS_ERROR;
1183             }
1184         }
1185       g_assert ((status != G_IO_STATUS_NORMAL)
1186                || (channel->encoded_read_buf->len > 0));
1187     }
1188   else if (channel->encoding) /* UTF-8 */
1189     {
1190       gchar *nextchar, *lastchar;
1191
1192       g_assert (channel->encoded_read_buf);
1193
1194       nextchar = channel->read_buf->str;
1195       lastchar = channel->read_buf->str + channel->read_buf->len;
1196
1197       while (nextchar < lastchar)
1198         {
1199           gunichar val_char;
1200
1201           val_char = g_utf8_get_char_validated (nextchar, lastchar - nextchar);
1202
1203           switch (val_char)
1204             {
1205               case -2:
1206                 /* stop, leave partial character in buffer */
1207                 lastchar = nextchar;
1208                 break;
1209               case -1:
1210                 if (oldlen < channel->encoded_read_buf->len)
1211                   status = G_IO_STATUS_NORMAL;
1212                 else
1213                   {
1214                     g_set_error (err, G_CONVERT_ERROR,
1215                       G_CONVERT_ERROR_ILLEGAL_SEQUENCE,
1216                       _("Invalid byte sequence in conversion input"));
1217                     status = G_IO_STATUS_ERROR;
1218                   }
1219                 lastchar = nextchar;
1220                 break;
1221               default:
1222                 nextchar = g_utf8_next_char (nextchar);
1223                 break;
1224             }
1225         }
1226
1227       if (lastchar > channel->read_buf->str)
1228         {
1229           gint copy_len = lastchar - channel->read_buf->str;
1230
1231           g_string_append_len (channel->encoded_read_buf, channel->read_buf->str,
1232                                copy_len);
1233           g_string_erase (channel->read_buf, 0, copy_len);
1234         }
1235     }
1236
1237   return status;
1238 }
1239
1240 /**
1241  * g_io_channel_read_line:
1242  * @channel: a #GIOChannel
1243  * @str_return: The line read from the #GIOChannel, not including the
1244  *              line terminator. This data should be freed with g_free()
1245  *              when no longer needed. This
1246  *              is a null terminated string. If a @length of zero is
1247  *              returned, this will be %NULL instead.
1248  * @length: location to store length of the read data, or %NULL
1249  * @terminator_pos: location to store position of line terminator, or %NULL
1250  * @error: A location to return an error of type #GConvertError
1251  *         or #GIOChannelError
1252  *
1253  * Read a line, not including the terminating character(s),
1254  * from a #GIOChannel into a newly allocated string.
1255  * @length will contain allocated memory if the return
1256  * is %G_IO_STATUS_NORMAL.
1257  *
1258  * Return value: a newly allocated string. Free this string
1259  *   with g_free() when you are done with it.
1260  **/
1261 GIOStatus
1262 g_io_channel_read_line (GIOChannel *channel,
1263                         gchar     **str_return,
1264                         gsize      *length,
1265                         gsize      *terminator_pos,
1266                         GError    **error)
1267 {
1268   GIOStatus status;
1269   gsize got_length;
1270   
1271   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
1272   g_return_val_if_fail (str_return != NULL, G_IO_STATUS_ERROR);
1273   g_return_val_if_fail ((error == NULL) || (*error == NULL),
1274                         G_IO_STATUS_ERROR);
1275   g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR);
1276
1277   status = g_io_channel_read_line_backend (channel, &got_length, terminator_pos, error);
1278
1279   if (length)
1280     *length = got_length;
1281
1282   if (status == G_IO_STATUS_NORMAL)
1283     {
1284       g_assert (USE_BUF (channel));
1285       *str_return = g_strndup (USE_BUF (channel)->str, got_length);
1286       g_string_erase (USE_BUF (channel), 0, got_length);
1287     }
1288   else
1289     *str_return = NULL;
1290   
1291   return status;
1292 }
1293
1294 /**
1295  * g_io_channel_read_line_string:
1296  * @channel: a #GIOChannel
1297  * @buffer: a #GString into which the line will be written.
1298  *          If @buffer already contains data, the new data will
1299  *          be appended to it.
1300  * @terminator_pos: location to store position of line terminator, or %NULL
1301  * @error: a location to store an error of type #GConvertError
1302  *         or #GIOChannelError
1303  *
1304  * Read a line from a #GIOChannel, using a #GString as a buffer.
1305  *
1306  * Return value:
1307  **/
1308 GIOStatus
1309 g_io_channel_read_line_string (GIOChannel *channel,
1310                                GString    *buffer,
1311                                gsize      *terminator_pos,
1312                                GError    **error)
1313 {
1314   gsize length;
1315   GIOStatus status;
1316
1317   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
1318   g_return_val_if_fail (buffer != NULL, G_IO_STATUS_ERROR);
1319   g_return_val_if_fail ((error == NULL) || (*error == NULL),
1320                         G_IO_STATUS_ERROR);
1321   g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR);
1322
1323   if (buffer->len > 0)
1324     g_string_truncate (buffer, 0); /* clear out the buffer */
1325
1326   status = g_io_channel_read_line_backend (channel, &length, terminator_pos, error);
1327
1328   if (status == G_IO_STATUS_NORMAL)
1329     {
1330       g_assert (USE_BUF (channel));
1331       g_string_append_len (buffer, USE_BUF (channel)->str, length);
1332       g_string_erase (USE_BUF (channel), 0, length);
1333     }
1334
1335   return status;
1336 }
1337
1338
1339 static GIOStatus
1340 g_io_channel_read_line_backend  (GIOChannel *channel,
1341                                  gsize      *length,
1342                                  gsize      *terminator_pos,
1343                                  GError    **error)
1344 {
1345   GIOStatus status;
1346   gsize checked_to, line_term_len, line_length, got_term_len;
1347   gboolean first_time = TRUE;
1348
1349   if (!channel->use_buffer)
1350     {
1351       /* Can't do a raw read in read_line */
1352       g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
1353                    _("Can't do a raw read in g_io_channel_read_line_string"));
1354       return G_IO_STATUS_ERROR;
1355     }
1356
1357   status = G_IO_STATUS_NORMAL;
1358
1359   if (channel->line_term)
1360     line_term_len = strlen (channel->line_term);
1361   else
1362     line_term_len = 3;
1363     /* This value used for setting checked_to, it's the longest of the four
1364      * we autodetect for.
1365      */
1366
1367   checked_to = 0;
1368
1369   while (TRUE)
1370     {
1371       gchar *nextchar, *lastchar;
1372       GString *use_buf;
1373
1374       if (!first_time || (BUF_LEN (USE_BUF (channel)) == 0))
1375         {
1376 read_again:
1377           status = g_io_channel_fill_buffer (channel, error);
1378           switch (status)
1379             {
1380               case G_IO_STATUS_NORMAL:
1381                 if (BUF_LEN (USE_BUF (channel)) == 0)
1382                   /* Can happen when using conversion and only read
1383                    * part of a character
1384                    */
1385                   {
1386                     first_time = FALSE;
1387                     continue;
1388                   }
1389                 break;
1390               case G_IO_STATUS_EOF:
1391                 if (BUF_LEN (USE_BUF (channel)) == 0)
1392                   {
1393                     if (length)
1394                       *length = 0;
1395
1396                     if (channel->encoding && channel->read_buf->len != 0)
1397                       {
1398                         g_set_error (error, G_CONVERT_ERROR,
1399                                      G_CONVERT_ERROR_PARTIAL_INPUT,
1400                                      "Leftover unconverted data in read buffer");
1401                         return G_IO_STATUS_ERROR;
1402                       }
1403                     else
1404                       return G_IO_STATUS_EOF;
1405                   }
1406                 break;
1407               default:
1408                 if (length)
1409                   *length = 0;
1410                 return status;
1411             }
1412         }
1413
1414       g_assert (BUF_LEN (USE_BUF (channel)) != 0);
1415
1416       use_buf = USE_BUF (channel); /* The buffer has been created by this point */
1417
1418       first_time = FALSE;
1419
1420       lastchar = use_buf->str + strlen (use_buf->str);
1421
1422       for (nextchar = use_buf->str + checked_to; nextchar < lastchar;
1423            channel->encoding ? nextchar = g_utf8_next_char (nextchar) : nextchar++)
1424         {
1425           if (channel->line_term)
1426             {
1427               if (strncmp (channel->line_term, nextchar, line_term_len) == 0)
1428                 {
1429                   line_length = nextchar - use_buf->str;
1430                   got_term_len = line_term_len;
1431                   goto done;
1432                 }
1433             }
1434           else /* auto detect */
1435             {
1436               switch (*nextchar)
1437                 {
1438                   case '\n': /* unix */
1439                     line_length = nextchar - use_buf->str;
1440                     got_term_len = 1;
1441                     goto done;
1442                   case '\r': /* Warning: do not use with sockets */
1443                     line_length = nextchar - use_buf->str;
1444                     if ((nextchar == lastchar - 1) && (status != G_IO_STATUS_EOF)
1445                        && (lastchar == use_buf->str + use_buf->len))
1446                       goto read_again; /* Try to read more data */
1447                     if ((nextchar < lastchar - 1) && (*(nextchar + 1) == '\n')) /* dos */
1448                       got_term_len = 2;
1449                     else /* mac */
1450                       got_term_len = 1;
1451                     goto done;
1452                   case '\xe2': /* Unicode paragraph separator */
1453                     if (strncmp ("\xe2\x80\xa9", nextchar, 3) == 0)
1454                       {
1455                         line_length = nextchar - use_buf->str;
1456                         got_term_len = 3;
1457                         goto done;
1458                       }
1459                     break;
1460                   default: /* no match */
1461                     break;
1462                 }
1463             }
1464         }
1465
1466       g_assert (nextchar == lastchar); /* Valid UTF-8, didn't overshoot */
1467
1468       /* Also terminate on '\0' */
1469
1470       line_length = lastchar - use_buf->str;
1471       if (line_length < use_buf->len)
1472         {
1473           got_term_len = 0;
1474           break;
1475         }
1476
1477       /* Check for EOF */
1478
1479       if (status == G_IO_STATUS_EOF)
1480         {
1481           if (channel->encoding && channel->read_buf->len > 0)
1482             {
1483               g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT,
1484                            "Channel terminates in a partial character");
1485               return G_IO_STATUS_ERROR;
1486             }
1487           line_length = use_buf->len;
1488           got_term_len = 0;
1489           break;
1490         }
1491
1492       if (use_buf->len > line_term_len - 1)
1493         checked_to = use_buf->len - (line_term_len - 1);
1494       else
1495         checked_to = 0;
1496     }
1497
1498 done:
1499
1500   if (terminator_pos)
1501     *terminator_pos = line_length;
1502
1503   if (length)
1504     *length = line_length + got_term_len;
1505
1506   return G_IO_STATUS_NORMAL;
1507 }
1508
1509 /**
1510  * g_io_channel_read_to_end:
1511  * @channel: a #GIOChannel
1512  * @str_return: Location to store a pointer to a string holding
1513  *              the remaining data in the #GIOChannel. This data should
1514  *              be freed with g_free() when no longer needed. This
1515  *              data is terminated by an extra null, but there may be other
1516  *              nulls in the intervening data.
1517  * @length: Location to store length of the data
1518  * @error: A location to return an error of type #GConvertError
1519  *         or #GIOChannelError
1520  *
1521  * Read all the remaining data from the file. Parameters as
1522  * for g_io_channel_read_line.
1523  *
1524  * Return value: One of #G_IO_STATUS_EOF or #G_IO_STATUS_PARTIAL_CHARS
1525  *               on success
1526  **/
1527 GIOStatus
1528 g_io_channel_read_to_end (GIOChannel    *channel,
1529                           gchar        **str_return,
1530                           gsize         *length,
1531                           GError       **error)
1532 {
1533   GIOStatus status;
1534     
1535   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
1536   g_return_val_if_fail ((error == NULL) || (*error == NULL),
1537     G_IO_STATUS_ERROR);
1538   g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR);
1539
1540   if (str_return)
1541     *str_return = NULL;
1542   if (length)
1543     *length = 0;
1544
1545   if (!channel->use_buffer)
1546     {
1547       g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
1548                    _("Can't do a raw read in g_io_channel_read_to_end"));
1549       return G_IO_STATUS_ERROR;
1550     }
1551
1552   do
1553     status = g_io_channel_fill_buffer (channel, error);
1554   while (status == G_IO_STATUS_NORMAL);
1555
1556   if (status != G_IO_STATUS_EOF)
1557     return status;
1558
1559   if (channel->encoding && channel->read_buf->len > 0)
1560     {
1561       g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT,
1562                    "Channel terminates in a partial character");
1563       return G_IO_STATUS_ERROR;
1564     }
1565
1566   if (USE_BUF (channel) == NULL)
1567     {
1568       /* length is already set to zero */
1569       if (str_return)
1570         *str_return = g_strdup ("");
1571     }
1572   else
1573     {
1574       if (length)
1575         *length = USE_BUF (channel)->len;
1576
1577       if (str_return)
1578         *str_return = g_string_free (USE_BUF (channel), FALSE);
1579       else
1580         g_string_free (USE_BUF (channel), TRUE);
1581
1582       /* This only works because USE_BUF () is a macro */
1583       USE_BUF (channel) = NULL;
1584     }
1585
1586   return G_IO_STATUS_NORMAL;
1587 }
1588
1589 /**
1590  * g_io_channel_read_chars:
1591  * @channel: a #GIOChannel
1592  * @buf: a buffer to read data into
1593  * @count: the size of the buffer. Note that the buffer may
1594  *         not be complelely filled even if there is data
1595  *         in the buffer if the remaining data is not a
1596  *         complete character.
1597  * @bytes_read: The number of bytes read.
1598  * @error: A location to return an error of type #GConvertError
1599  *         or #GIOChannelError.
1600  *
1601  * Replacement for g_io_channel_read() with the new API.
1602  *
1603  * Return value:
1604  **/
1605 GIOStatus
1606 g_io_channel_read_chars (GIOChannel     *channel,
1607                          gchar          *buf,
1608                          gsize           count,
1609                          gsize          *bytes_read,
1610                          GError        **error)
1611 {
1612   GIOStatus status;
1613   gsize got_bytes;
1614
1615   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
1616   g_return_val_if_fail ((error == NULL) || (*error == NULL),
1617                         G_IO_STATUS_ERROR);
1618   g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR);
1619
1620   if (count == 0)
1621     {
1622       *bytes_read = 0;
1623       return G_IO_STATUS_NORMAL;
1624     }
1625   g_return_val_if_fail (buf != NULL, G_IO_STATUS_ERROR);
1626
1627   if (!channel->use_buffer)
1628     {
1629       g_assert (!channel->read_buf || channel->read_buf->len == 0);
1630
1631       return channel->funcs->io_read (channel, buf, count, bytes_read, error);
1632     }
1633
1634   status = G_IO_STATUS_NORMAL;
1635
1636   while (BUF_LEN (USE_BUF (channel)) < count && status == G_IO_STATUS_NORMAL)
1637     status = g_io_channel_fill_buffer (channel, error);
1638
1639   /* Only return an error if we have no data */
1640
1641   if (BUF_LEN (USE_BUF (channel)) == 0)
1642     {
1643       g_assert (status != G_IO_STATUS_NORMAL);
1644
1645       if (status == G_IO_STATUS_EOF && channel->encoding
1646           && BUF_LEN (channel->read_buf) > 0)
1647         {
1648           g_set_error (error, G_CONVERT_ERROR,
1649                        G_CONVERT_ERROR_PARTIAL_INPUT,
1650                        "Leftover unconverted data in read buffer");
1651           status = G_IO_STATUS_ERROR;
1652         }
1653
1654       if (bytes_read)
1655         *bytes_read = 0;
1656
1657       return status;
1658     }
1659
1660   if (status == G_IO_STATUS_ERROR)
1661     g_clear_error (error);
1662
1663   got_bytes = MIN (count, BUF_LEN (USE_BUF (channel)));
1664
1665   g_assert (got_bytes > 0);
1666
1667   if (channel->encoding)
1668     /* Don't validate for NULL encoding, binary safe */
1669     {
1670       gchar *nextchar, *prevchar;
1671
1672       g_assert (USE_BUF (channel) == channel->encoded_read_buf);
1673
1674       nextchar = channel->encoded_read_buf->str;
1675
1676       do
1677         {
1678           prevchar = nextchar;
1679           nextchar = g_utf8_next_char (nextchar);
1680           g_assert (nextchar != prevchar); /* Posibile for *prevchar of -1 or -2 */
1681         }
1682       while (nextchar < channel->encoded_read_buf->str + got_bytes);
1683
1684       if (nextchar > channel->encoded_read_buf->str + got_bytes)
1685         got_bytes = prevchar - channel->encoded_read_buf->str;
1686
1687       g_assert (got_bytes > 0 || count < 6);
1688     }
1689
1690   memcpy (buf, USE_BUF (channel)->str, got_bytes);
1691   g_string_erase (USE_BUF (channel), 0, got_bytes);
1692
1693   if (bytes_read)
1694     *bytes_read = got_bytes;
1695
1696   return G_IO_STATUS_NORMAL;
1697 }
1698
1699 /**
1700  * g_io_channel_read_unichar:
1701  * @channel: a #GIOChannel
1702  * @thechar: a location to return a character
1703  * @error: A location to return an error of type #GConvertError
1704  *         or #GIOChannelError
1705  *
1706  * This function cannot be called on a channel with %NULL encoding.
1707  *
1708  * Return value: a #GIOStatus
1709  **/
1710 GIOStatus
1711 g_io_channel_read_unichar     (GIOChannel   *channel,
1712                                gunichar     *thechar,
1713                                GError      **error)
1714 {
1715   GIOStatus status = G_IO_STATUS_NORMAL;
1716
1717   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
1718   g_return_val_if_fail (channel->encoding != NULL, G_IO_STATUS_ERROR);
1719   g_return_val_if_fail ((error == NULL) || (*error == NULL),
1720                         G_IO_STATUS_ERROR);
1721   g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR);
1722
1723   while (BUF_LEN (channel->encoded_read_buf) == 0 && status == G_IO_STATUS_NORMAL)
1724     status = g_io_channel_fill_buffer (channel, error);
1725
1726   /* Only return an error if we have no data */
1727
1728   if (BUF_LEN (USE_BUF (channel)) == 0)
1729     {
1730       g_assert (status != G_IO_STATUS_NORMAL);
1731
1732       if (status == G_IO_STATUS_EOF && BUF_LEN (channel->read_buf) > 0)
1733         {
1734           g_set_error (error, G_CONVERT_ERROR,
1735                        G_CONVERT_ERROR_PARTIAL_INPUT,
1736                        "Leftover unconverted data in read buffer");
1737           status = G_IO_STATUS_ERROR;
1738         }
1739
1740       if (thechar)
1741         *thechar = (gunichar) -1;
1742
1743       return status;
1744     }
1745
1746   if (status == G_IO_STATUS_ERROR)
1747     g_clear_error (error);
1748
1749   if (thechar)
1750     *thechar = g_utf8_get_char (channel->encoded_read_buf->str);
1751
1752   g_string_erase (channel->encoded_read_buf, 0,
1753                   g_utf8_next_char (channel->encoded_read_buf->str)
1754                   - channel->encoded_read_buf->str);
1755
1756   return G_IO_STATUS_NORMAL;
1757 }
1758
1759 /**
1760  * g_io_channel_write_chars:
1761  * @channel: a #GIOChannel
1762  * @buf: a buffer to write data from
1763  * @count: the size of the buffer. If -1, the buffer
1764  *         is taken to be a nul terminated string.
1765  * @bytes_written: The number of bytes written. This can be nonzero
1766  *                 even if the return value is not %G_IO_STATUS_NORMAL.
1767  * @error: A location to return an error of type #GConvertError
1768  *         or #GIOChannelError
1769  *
1770  * Replacement for g_io_channel_write() with the new API.
1771  *
1772  * Return value:
1773  **/
1774 GIOStatus
1775 g_io_channel_write_chars (GIOChannel    *channel,
1776                           const gchar   *buf,
1777                           gssize         count,
1778                           gsize         *bytes_written,
1779                           GError       **error)
1780 {
1781   GIOStatus status;
1782   gssize wrote_bytes = 0;
1783
1784   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
1785   g_return_val_if_fail ((error == NULL) || (*error == NULL),
1786                         G_IO_STATUS_ERROR);
1787   g_return_val_if_fail (channel->is_writeable, G_IO_STATUS_ERROR);
1788
1789   if ((count < 0) && buf)
1790     count = strlen (buf);
1791   
1792   if (count == 0)
1793     return G_IO_STATUS_NORMAL;
1794
1795   g_return_val_if_fail (buf != NULL, G_IO_STATUS_ERROR);
1796   g_return_val_if_fail (count > 0, G_IO_STATUS_ERROR);
1797
1798   /* Raw write case */
1799
1800   if (!channel->use_buffer)
1801     {
1802       g_assert (!channel->write_buf || channel->write_buf->len == 0);
1803       g_assert (channel->partial_write_buf[0] == '\0');
1804       return channel->funcs->io_write (channel, buf, count, bytes_written, error);
1805     }
1806
1807   /* General case */
1808
1809   if (channel->is_seekable && (( BUF_LEN (channel->read_buf) > 0)
1810     || (BUF_LEN (channel->encoded_read_buf) > 0)))
1811     {
1812       if (channel->do_encode && BUF_LEN (channel->encoded_read_buf) > 0)
1813         {
1814           g_warning("Mixed reading and writing not allowed on encoded files");
1815           return G_IO_STATUS_ERROR;
1816         }
1817       status = g_io_channel_seek_position (channel, 0, G_SEEK_CUR, error);
1818       if (status != G_IO_STATUS_NORMAL)
1819         return status;
1820     }
1821
1822   if (!channel->write_buf)
1823     channel->write_buf = g_string_sized_new (channel->buf_size);
1824
1825   while (wrote_bytes < count)
1826     {
1827       gsize space_in_buf;
1828
1829       /* If the buffer is full, try a write immediately. In
1830        * the nonblocking case, this prevents the user from
1831        * writing just a little bit to the buffer every time
1832        * and never receiving an EAGAIN.
1833        */
1834
1835       if (channel->write_buf->len >= channel->buf_size)
1836         {
1837           gsize did_write = 0, this_time;
1838
1839           do
1840             {
1841               status = channel->funcs->io_write (channel, channel->write_buf->str
1842                                                  + did_write, channel->write_buf->len
1843                                                  - did_write, &this_time, error);
1844               did_write += this_time;
1845             }
1846           while (status == G_IO_STATUS_NORMAL &&
1847                  did_write < MIN (channel->write_buf->len, MAX_CHAR_SIZE));
1848
1849           g_string_erase (channel->write_buf, 0, did_write);
1850
1851           if (status != G_IO_STATUS_NORMAL)
1852             {
1853               if (status == G_IO_STATUS_AGAIN && wrote_bytes > 0)
1854                 status = G_IO_STATUS_NORMAL;
1855               if (bytes_written)
1856                 *bytes_written = wrote_bytes;
1857               return status;
1858             }
1859         }
1860
1861       space_in_buf = MAX (channel->buf_size, channel->write_buf->allocated_len)
1862                      - channel->write_buf->len;
1863
1864       /* This is only true because g_io_channel_set_buffer_size ()
1865        * ensures that channel->buf_size >= MAX_CHAR_SIZE.
1866        */
1867       g_assert (space_in_buf >= MAX_CHAR_SIZE);
1868
1869       if (!channel->encoding)
1870         {
1871           gssize write_this = MIN (space_in_buf, count - wrote_bytes);
1872
1873           g_string_append_len (channel->write_buf, buf, write_this);
1874           buf += write_this;
1875           wrote_bytes += write_this;
1876         }
1877       else
1878         {
1879           const gchar *from_buf;
1880           gsize from_buf_len, from_buf_old_len, left_len;
1881           size_t err;
1882           gint errnum;
1883
1884           if (channel->partial_write_buf[0] != '\0')
1885             {
1886               g_assert (wrote_bytes == 0);
1887
1888               from_buf = channel->partial_write_buf;
1889               from_buf_old_len = strlen (channel->partial_write_buf);
1890               g_assert (from_buf_old_len > 0);
1891               from_buf_len = MIN (6, from_buf_old_len + count);
1892
1893               memcpy (channel->partial_write_buf + from_buf_old_len, buf,
1894                       from_buf_len - from_buf_old_len);
1895             }
1896           else
1897             {
1898               from_buf = buf;
1899               from_buf_len = count - wrote_bytes;
1900               from_buf_old_len = 0;
1901             }
1902
1903 reconvert:
1904
1905           if (!channel->do_encode)
1906             {
1907               const gchar *badchar;
1908
1909               /* UTF-8, just validate, emulate g_iconv */
1910
1911               if (!g_utf8_validate (from_buf, from_buf_len, &badchar))
1912                 {
1913                   gunichar try_char;
1914
1915                   left_len = from_buf + from_buf_len - badchar;
1916
1917                   try_char = g_utf8_get_char_validated (badchar, left_len);
1918
1919                   switch (try_char)
1920                     {
1921                       case -2:
1922                         g_assert (left_len < 6);
1923                         errnum = EINVAL;
1924                         break;
1925                       case -1:
1926                         errnum = EILSEQ;
1927                         break;
1928                       default:
1929                         g_assert_not_reached ();
1930                         errnum = 0; /* Don't confunse the compiler */
1931                     }
1932                   err = (size_t) -1;
1933                 }
1934               else
1935                 {
1936                   err = (size_t) 0;
1937                   errnum = 0;
1938                   left_len = 0;
1939                 }
1940
1941               g_string_append_len (channel->write_buf, from_buf,
1942                                    from_buf_len - left_len);
1943               from_buf += from_buf_len - left_len;
1944             }
1945           else
1946             {
1947                gchar *outbuf;
1948
1949                left_len = from_buf_len;
1950                outbuf = channel->write_buf->str + channel->write_buf->len;
1951                g_string_set_size (channel->write_buf, channel->write_buf->len
1952                                   + space_in_buf);
1953                err = g_iconv (channel->write_cd, (gchar **) &from_buf, &left_len,
1954                               &outbuf, &space_in_buf);
1955                errnum = errno;
1956                g_string_truncate (channel->write_buf, channel->write_buf->len
1957                                   - space_in_buf);
1958             }
1959
1960           if (err == (size_t) -1)
1961             {
1962               switch (errnum)
1963                 {
1964                   case EINVAL:
1965                     g_assert (left_len < 6);
1966
1967                     if (from_buf_old_len == 0)
1968                       {
1969                         /* Not from partial_write_buf */
1970
1971                         memcpy (channel->partial_write_buf, from_buf, left_len);
1972                         channel->partial_write_buf[left_len] = '\0';
1973                         return G_IO_STATUS_NORMAL;
1974                       }
1975
1976                     /* Working in partial_write_buf */
1977
1978                     if (left_len == from_buf_len)
1979                       {
1980                         /* Didn't convert anything, must still have
1981                          * less than a full character
1982                          */
1983
1984                         g_assert (count == from_buf_len - from_buf_old_len);
1985
1986                         channel->partial_write_buf[from_buf_len] = '\0';
1987
1988                         if (bytes_written)
1989                           *bytes_written = count;
1990
1991                         return G_IO_STATUS_NORMAL;
1992                       }
1993
1994                     g_assert (from_buf_len - left_len >= from_buf_old_len);
1995
1996                     /* We converted all the old data. This is fine */
1997
1998                     break;
1999                   case E2BIG:
2000                     if (from_buf_len == left_len)
2001                       {
2002                         /* Nothing was written, add enough space for
2003                          * at least one character.
2004                          */
2005                         space_in_buf += MAX_CHAR_SIZE;
2006                         goto reconvert;
2007                       }
2008                     break;
2009                   case EILSEQ:
2010                     g_set_error (error, G_CONVERT_ERROR,
2011                       G_CONVERT_ERROR_ILLEGAL_SEQUENCE,
2012                       _("Invalid byte sequence in conversion input"));
2013                     if (from_buf_old_len > 0 && from_buf_len == left_len)
2014                       g_warning ("Illegal sequence due to partial character "
2015                                  "at the end of a previous write.\n");
2016                     else
2017                       wrote_bytes += from_buf_len - left_len - from_buf_old_len;
2018                     if (bytes_written)
2019                       *bytes_written = wrote_bytes;
2020                     channel->partial_write_buf[0] = '\0';
2021                     return G_IO_STATUS_ERROR;
2022                   default:
2023                     g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
2024                       _("Error during conversion: %s"), strerror (errno));
2025                     if (from_buf_len >= left_len + from_buf_old_len)
2026                       wrote_bytes += from_buf_len - left_len - from_buf_old_len;
2027                     if (bytes_written)
2028                       *bytes_written = wrote_bytes;
2029                     channel->partial_write_buf[0] = '\0';
2030                     return G_IO_STATUS_ERROR;
2031                 }
2032             }
2033
2034           g_assert (from_buf_len - left_len >= from_buf_old_len);
2035
2036           wrote_bytes += from_buf_len - left_len - from_buf_old_len;
2037
2038           if (from_buf_old_len > 0)
2039             {
2040               /* We were working in partial_write_buf */
2041
2042               buf += from_buf_len - left_len - from_buf_old_len;
2043               channel->partial_write_buf[0] = '\0';
2044             }
2045           else
2046             buf = from_buf;
2047         }
2048     }
2049
2050   if (bytes_written)
2051     *bytes_written = wrote_bytes;
2052
2053   return G_IO_STATUS_NORMAL;
2054 }
2055
2056 /**
2057  * g_io_channel_write_unichar:
2058  * @channel: a #GIOChannel
2059  * @thechar: a character
2060  * @error: A location to return an error of type #GConvertError
2061  *         or #GIOChannelError
2062  *
2063  * This function cannot be called on a channel with %NULL encoding.
2064  *
2065  * Return value: a #GIOStatus
2066  **/
2067 GIOStatus
2068 g_io_channel_write_unichar    (GIOChannel   *channel,
2069                                gunichar      thechar,
2070                                GError      **error)
2071 {
2072   GIOStatus status;
2073   gchar static_buf[6];
2074   gsize char_len, wrote_len;
2075
2076   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
2077   g_return_val_if_fail (channel->encoding != NULL, G_IO_STATUS_ERROR);
2078   g_return_val_if_fail ((error == NULL) || (*error == NULL),
2079                         G_IO_STATUS_ERROR);
2080   g_return_val_if_fail (channel->is_writeable, G_IO_STATUS_ERROR);
2081
2082   char_len = g_unichar_to_utf8 (thechar, static_buf);
2083
2084   if (channel->partial_write_buf[0] != '\0')
2085     {
2086       g_warning ("Partial charater written before writing unichar.\n");
2087       channel->partial_write_buf[0] = '\0';
2088     }
2089
2090   status = g_io_channel_write_chars (channel, static_buf,
2091                                      char_len, &wrote_len, error);
2092
2093   /* We validate UTF-8, so we can't get a partial write */
2094
2095   g_assert (wrote_len == char_len || status != G_IO_STATUS_NORMAL);
2096
2097   return status;
2098 }
2099
2100 /**
2101  * g_io_channel_error_quark:
2102  *
2103  * Return value: The quark used as %G_IO_CHANNEL_ERROR
2104  **/
2105 GQuark
2106 g_io_channel_error_quark (void)
2107 {
2108   static GQuark q = 0;
2109   if (q == 0)
2110     q = g_quark_from_static_string ("g-io-channel-error-quark");
2111
2112   return q;
2113 }