aboutsummaryrefslogtreecommitdiffstats
path: root/mail/em-sync-stream.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/em-sync-stream.c')
-rw-r--r--mail/em-sync-stream.c63
1 files changed, 57 insertions, 6 deletions
diff --git a/mail/em-sync-stream.c b/mail/em-sync-stream.c
index df5659253e..d6fae3a8d7 100644
--- a/mail/em-sync-stream.c
+++ b/mail/em-sync-stream.c
@@ -21,7 +21,6 @@
*
*/
-
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
@@ -35,7 +34,7 @@
#include "mail-mt.h"
-/*#define LOG_STREAM*/
+#define LOG_STREAM
#define d(x)
@@ -51,8 +50,16 @@ struct _EMSyncStreamPrivate {
char *buf_data;
int buf_used;
int buf_size;
+
+#ifdef LOG_STREAM
+ FILE *logfd;
+#endif
};
+#ifdef LOG_STREAM
+int dolog;
+#endif
+
/* Should probably expose messages to outside world ... so subclasses can extend */
enum _write_msg_t {
EMSS_WRITE,
@@ -85,6 +92,9 @@ em_sync_stream_get_type (void)
static CamelType type = CAMEL_INVALID_TYPE;
if (type == CAMEL_INVALID_TYPE) {
+#ifdef LOG_STREAM
+ dolog = getenv("EVOLUTION_MAIL_LOG_HTML") != NULL;
+#endif
type = camel_type_register (CAMEL_STREAM_TYPE,
"EMSyncStream",
sizeof (EMSyncStream),
@@ -130,6 +140,10 @@ emcs_gui_received(GIOChannel *source, GIOCondition cond, void *data)
/* force out any pending data before doing anything else */
if (p->buf_used > 0) {
EMSS_CLASS(emss)->sync_write((CamelStream *)emss, p->buf_data, p->buf_used);
+#ifdef LOG_STREAM
+ if (p->logfd)
+ fwrite(p->buf_data, 1, p->buf_used, p->logfd);
+#endif
p->buf_used = 0;
}
@@ -138,12 +152,22 @@ emcs_gui_received(GIOChannel *source, GIOCondition cond, void *data)
switch (msg->op) {
case EMSS_WRITE:
EMSS_CLASS(emss)->sync_write((CamelStream *)emss, msg->data, msg->n);
+#ifdef LOG_STREAM
+ if (p->logfd)
+ fwrite(msg->data, 1, msg->n, p->logfd);
+#endif
break;
case EMSS_FLUSH:
EMSS_CLASS(emss)->sync_flush((CamelStream *)emss);
break;
case EMSS_CLOSE:
EMSS_CLASS(emss)->sync_close((CamelStream *)emss);
+#ifdef LOG_STREAM
+ if (p->logfd) {
+ fclose(p->logfd);
+ p->logfd = NULL;
+ }
+#endif
break;
}
@@ -167,6 +191,17 @@ em_sync_stream_init (CamelObject *object)
p->gui_channel = g_io_channel_unix_new(e_msgport_fd(p->data_port));
p->gui_watch = g_io_add_watch(p->gui_channel, G_IO_IN, emcs_gui_received, emss);
+#ifdef LOG_STREAM
+ if (dolog) {
+ char name[32];
+ static int count;
+
+ sprintf(name, "sync-stream.%d.html", count++);
+ printf("Saving raw data stream to '%s'\n", name);
+ p->logfd = fopen(name, "w");
+ }
+#endif
+
d(printf("%p: new emss\n", emss));
}
@@ -210,6 +245,12 @@ em_sync_stream_finalize (CamelObject *object)
p->reply_port = NULL;
g_free(p->buf_data);
+
+#ifdef LOG_STREAM
+ if (p->logfd)
+ fclose(p->logfd);
+#endif
+
g_free(p);
}
@@ -222,9 +263,13 @@ stream_write (CamelStream *stream, const char *buffer, size_t n)
if (emss->cancel)
return -1;
- if (pthread_self() == mail_gui_thread)
+ if (pthread_self() == mail_gui_thread) {
EMSS_CLASS(emss)->sync_write(stream, buffer, n);
- else if (p->buf_size > 0) {
+#ifdef LOG_STREAM
+ if (p->logfd)
+ fwrite(buffer, 1, n, p->logfd);
+#endif
+ } else if (p->buf_size > 0) {
size_t left = p->buf_size-p->buf_used;
if (n >= left) {
@@ -266,9 +311,15 @@ stream_close(CamelStream *stream)
d(printf("%p: closing stream\n", stream));
- if (pthread_self() == mail_gui_thread)
+ if (pthread_self() == mail_gui_thread) {
+#ifdef LOG_STREAM
+ if (emss->priv->logfd) {
+ fclose(emss->priv->logfd);
+ emss->priv->logfd = NULL;
+ }
+#endif
return ((EMSyncStreamClass *)(((CamelObject *)emss)->klass))->sync_close(stream);
- else
+ } else
sync_op(emss, EMSS_CLOSE, NULL, 0);
return 0;