sl@0: /* Portion Copyright © 2008-09 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.*/ sl@0: sl@0: #undef G_DISABLE_ASSERT sl@0: #undef G_LOG_DOMAIN sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: #include "mrt2_glib2_test.h" sl@0: #endif /*__SYMBIAN32__*/ sl@0: sl@0: sl@0: #define BUFFER_SIZE 1024 sl@0: sl@0: static void sl@0: test_small_writes (void) sl@0: { sl@0: GIOChannel *io; sl@0: GIOStatus status; sl@0: guint cnt; sl@0: gchar tmp; sl@0: GError *error = NULL; sl@0: sl@0: io = g_io_channel_new_file ("c:\\iochannel-test-outfile", "w", &error); sl@0: if (error) sl@0: { sl@0: g_warning ("Unable to open file %s: %s", sl@0: "iochannel-test-outfile", sl@0: error->message); sl@0: g_error_free (error); sl@0: sl@0: exit (1); sl@0: } sl@0: sl@0: g_io_channel_set_encoding (io, NULL, NULL); sl@0: g_io_channel_set_buffer_size (io, 1022); sl@0: sl@0: cnt = 2 * g_io_channel_get_buffer_size (io); sl@0: tmp = 0; sl@0: sl@0: while (cnt) sl@0: { sl@0: status = g_io_channel_write_chars (io, &tmp, 1, NULL, NULL); sl@0: if (status == G_IO_STATUS_ERROR) sl@0: break; sl@0: if (status == G_IO_STATUS_NORMAL) sl@0: cnt--; sl@0: } sl@0: sl@0: g_assert (status == G_IO_STATUS_NORMAL); sl@0: sl@0: g_io_channel_unref (io); sl@0: } sl@0: sl@0: sl@0: gint main (gint argc, gchar * argv[]) sl@0: { sl@0: GIOChannel *gio_r, *gio_w ; sl@0: GError *gerr = NULL; sl@0: GString *buffer; sl@0: char *filename; sl@0: char *srcdir = getenv ("srcdir"); sl@0: gint rlength = 0; sl@0: glong wlength = 0; sl@0: gsize length_out; sl@0: const gchar encoding[] = "ISO-8859-5"; sl@0: GIOStatus status; sl@0: GIOFlags flags; sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: g_log_set_handler (NULL, G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG, &mrtLogHandler, NULL); sl@0: g_set_print_handler(mrtPrintHandler); sl@0: #endif /*__SYMBIAN32__*/ sl@0: sl@0: sl@0: if (!srcdir) sl@0: srcdir = "c:"; sl@0: filename = g_strconcat (srcdir, G_DIR_SEPARATOR_S, "iochannel-test-infile", NULL); sl@0: sl@0: setbuf (stdout, NULL); /* For debugging */ sl@0: sl@0: gio_r = g_io_channel_new_file (filename, "r", &gerr); sl@0: if (gerr) sl@0: { sl@0: g_warning ("Unable to open file %s: %s", filename, gerr->message); sl@0: g_error_free (gerr); sl@0: sl@0: g_assert(FALSE && "iochannel-test failed"); sl@0: sl@0: #if __SYMBIAN32__ sl@0: testResultXml("iochannel-test"); sl@0: #endif /* EMULATOR */ sl@0: return 1; sl@0: } sl@0: gio_w = g_io_channel_new_file ("c:\\iochannel-test-outfile", "w", &gerr); sl@0: if (gerr) sl@0: { sl@0: g_warning ("Unable to open file %s: %s", "iochannel-test-outfile", gerr->message); sl@0: g_error_free (gerr); sl@0: #if __SYMBIAN32__ sl@0: testResultXml("iochannel-test"); sl@0: #endif /* EMULATOR */ sl@0: sl@0: return 1; sl@0: } sl@0: sl@0: g_io_channel_set_encoding (gio_r, encoding, &gerr); sl@0: if (gerr) sl@0: { sl@0: g_warning (gerr->message); sl@0: /* Keep going if this is just a case of iconv not supporting EUC-JP, see bug 428048 */ sl@0: if (gerr->code != G_CONVERT_ERROR_NO_CONVERSION) sl@0: return 1; sl@0: g_error_free (gerr); sl@0: sl@0: g_assert(FALSE && "iochannel-test failed"); sl@0: sl@0: #if __SYMBIAN32__ sl@0: testResultXml("iochannel-test"); sl@0: #endif /* EMULATOR */ sl@0: sl@0: return 1; sl@0: } sl@0: sl@0: g_io_channel_set_buffer_size (gio_r, BUFFER_SIZE); sl@0: sl@0: status = g_io_channel_set_flags (gio_r, G_IO_FLAG_NONBLOCK, &gerr); sl@0: if (status == G_IO_STATUS_ERROR) sl@0: { sl@0: g_warning (gerr->message); sl@0: g_assert(FALSE && "iochannel-test failed"); sl@0: g_error_free (gerr); sl@0: gerr = NULL; sl@0: } sl@0: flags = g_io_channel_get_flags (gio_r); sl@0: buffer = g_string_sized_new (BUFFER_SIZE); sl@0: sl@0: while (TRUE) sl@0: { sl@0: do sl@0: status = g_io_channel_read_line_string (gio_r, buffer, NULL, &gerr); sl@0: while (status == G_IO_STATUS_AGAIN); sl@0: if (status != G_IO_STATUS_NORMAL) sl@0: break; sl@0: sl@0: rlength += buffer->len; sl@0: sl@0: do sl@0: status = g_io_channel_write_chars (gio_w, buffer->str, buffer->len, sl@0: &length_out, &gerr); sl@0: while (status == G_IO_STATUS_AGAIN); sl@0: if (status != G_IO_STATUS_NORMAL) sl@0: break; sl@0: sl@0: wlength += length_out; sl@0: sl@0: if (length_out < buffer->len) sl@0: { sl@0: g_warning ("Only wrote part of the line."); sl@0: g_assert(FALSE && "iochannel-test failed"); sl@0: } sl@0: sl@0: sl@0: #ifdef VERBOSE sl@0: g_print ("%s", buffer->str); sl@0: #endif sl@0: g_string_truncate (buffer, 0); sl@0: } sl@0: sl@0: switch (status) sl@0: { sl@0: case G_IO_STATUS_EOF: sl@0: break; sl@0: case G_IO_STATUS_ERROR: sl@0: g_warning (gerr->message); sl@0: g_error_free (gerr); sl@0: gerr = NULL; sl@0: break; sl@0: default: sl@0: g_warning ("Abnormal exit from write loop."); sl@0: g_assert(FALSE && "iochannel-test failed"); sl@0: break; sl@0: } sl@0: sl@0: do sl@0: status = g_io_channel_flush (gio_w, &gerr); sl@0: while (status == G_IO_STATUS_AGAIN); sl@0: sl@0: if (status == G_IO_STATUS_ERROR) sl@0: { sl@0: g_warning (gerr->message); sl@0: g_assert(FALSE && "iochannel-test failed"); sl@0: g_error_free (gerr); sl@0: gerr = NULL; sl@0: } sl@0: sl@0: #ifdef VERBOSE sl@0: g_print ("read %d bytes, wrote %ld bytes\n", rlength, wlength); sl@0: #endif sl@0: sl@0: g_io_channel_unref(gio_r); sl@0: g_io_channel_unref(gio_w); sl@0: sl@0: test_small_writes (); sl@0: sl@0: #if __SYMBIAN32__ sl@0: testResultXml("iochannel-test"); sl@0: #endif /* EMULATOR */ sl@0: sl@0: return 0; sl@0: }