static void test_stream_gets (GMimeStream *stream, const char *filename) { char sbuf[100], rbuf[100]; ssize_t slen; FILE *fp; /* '0x1a' character is treated as EOF (Ctrl+Z) on Windows if file is opened in text mode, * thus it's opened in binary mode. */ if (!(fp = fopen (filename, "r+b"))) throw (exception_new ("could not open `%s': %s", filename, g_strerror (errno))); while (!g_mime_stream_eos (stream)) { rbuf[0] = '\0'; slen = g_mime_stream_buffer_gets (stream, sbuf, sizeof (sbuf)); if (!fgets (rbuf, sizeof (rbuf), fp)) break; if (strcmp (sbuf, rbuf) != 0) break; } fclose (fp); if (strcmp (sbuf, rbuf) != 0) { v(fprintf (stderr, "\tstream: \"%s\" (%" G_GSIZE_FORMAT ")\n", sbuf, strlen (sbuf))); v(fprintf (stderr, "\treal: \"%s\" (%" G_GSIZE_FORMAT ")\n", rbuf, strlen (rbuf))); throw (exception_new ("streams did not match")); } }
/** * g_mime_stream_write_to_stream: * @src: source stream * @dest: destination stream * * Attempts to write the source stream to the destination stream. * * Returns: the number of bytes written or %-1 on fail. **/ ssize_t g_mime_stream_write_to_stream (GMimeStream *src, GMimeStream *dest) { ssize_t nread, nwritten, total = 0; char buf[4096]; g_return_val_if_fail (GMIME_IS_STREAM (src), -1); g_return_val_if_fail (GMIME_IS_STREAM (dest), -1); while (!g_mime_stream_eos (src)) { if ((nread = g_mime_stream_read (src, buf, sizeof (buf))) < 0) return -1; if (nread > 0) { nwritten = 0; while (nwritten < nread) { ssize_t len; if ((len = g_mime_stream_write (dest, buf + nwritten, nread - nwritten)) < 0) return -1; nwritten += len; } total += nwritten; } } return total; }
/* * callback to get data from a stream */ static ssize_t g_mime_gpgme_stream_rd(GMimeStream * stream, void *buffer, size_t size) { ssize_t result; result = g_mime_stream_read(stream, buffer, size); if (result == -1 && g_mime_stream_eos(stream)) result = 0; return result; }