/* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with the program; if not, see <http://www.gnu.org/licenses/> * * * Authors: * Jeffrey Stedfast <fejj@ximian.com> * Michael Zucchi <notzed@ximian.com> * * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) * */ #ifdef HAVE_CONFIG_H #include <config.h> #endif #include "em-sync-stream.h" #include <stdio.h> #include <string.h> #include <glib/gi18n-lib.h> #include <libedataserver/e-flag.h> #include "mail-mt.h" enum _write_msg_t { EMSS_WRITE, EMSS_FLUSH, EMSS_CLOSE }; struct _write_msg { EMSyncStream *emss; GError *error; EFlag *done; enum _write_msg_t op; const gchar *string; gsize len; }; G_DEFINE_TYPE (EMSyncStream, em_sync_stream, CAMEL_TYPE_STREAM) static gboolean sync_stream_process_message (struct _write_msg *msg) { struct _EMSyncStream *emss = msg->emss; if (emss->cancel) { /* Do not pass data to the child if we are canceled. */ e_flag_set (msg->done); return FALSE; } /* Force out any pending data before doing anything else. */ if (emss->buffer != NULL && emss->buffer->len > 0) { EM_SYNC_STREAM_GET_CLASS (emss)->sync_write ( CAMEL_STREAM (emss), emss->buffer->str, emss->buffer->len, &msg->error); g_string_set_size (emss->buffer, 0); } switch (msg->op) { case EMSS_WRITE: EM_SYNC_STREAM_GET_CLASS (emss)->sync_write ( CAMEL_STREAM (emss), msg->string, msg->len, &msg->error); break; case EMSS_FLUSH: EM_SYNC_STREAM_GET_CLASS (emss)->sync_flush ( CAMEL_STREAM (emss), &msg->error); break; case EMSS_CLOSE: EM_SYNC_STREAM_GET_CLASS (emss)->sync_close ( CAMEL_STREAM (emss), &msg->error); break; } emss->idle_id = 0; e_flag_set (msg->done); return FALSE; } static void sync_stream_sync_op (EMSyncStream *emss, enum _write_msg_t op, const gchar *string, gsize len, GError **error) { struct _write_msg msg; msg.done = e_flag_new (); msg.error = NULL; msg.emss = emss; msg.op = op; msg.string = string; msg.len = len; g_object_ref (emss); if (emss->idle_id) g_source_remove (emss->idle_id); emss->idle_id = g_idle_add ((GSourceFunc) sync_stream_process_message, &msg); e_flag_wait (msg.done); e_flag_free (msg.done); if (msg.error != NULL) g_propagate_error (error, msg.error); g_object_unref (emss); } static void sync_stream_finalize (GObject *object) { EMSyncStream *emss = EM_SYNC_STREAM (object); if (emss->buffer != NULL) g_string_free (emss->buffer, TRUE); if (emss->idle_id) g_source_remove (emss->idle_id); } static gssize sync_stream_write (CamelStream *stream, const gchar *string, gsize len, GCancellable *cancellable, GError **error) { EMSyncStream *emss = EM_SYNC_STREAM (stream); if (emss->cancel) { g_set_error ( error, G_IO_ERROR, G_IO_ERROR_CANCELLED, _("Canceled")); return -1; } if (mail_in_main_thread ()) { EM_SYNC_STREAM_GET_CLASS (emss)->sync_write (stream, string, len, error); } else if (emss->buffer != NULL) { if (len < (emss->buffer->allocated_len - emss->buffer->len)) g_string_append_len (emss->buffer, string, len); else sync_stream_sync_op (emss, EMSS_WRITE, string, len, error); } else { sync_stream_sync_op (emss, EMSS_WRITE, string, len, error); } return (gssize) len; } static gint sync_stream_flush (CamelStream *stream, GCancellable *cancellable, GError **error) { EMSyncStream *emss = EM_SYNC_STREAM (stream); if (emss->cancel) { g_set_error ( error, G_IO_ERROR, G_IO_ERROR_CANCELLED, _("Canceled")); return -1; } if (mail_in_main_thread ()) return EM_SYNC_STREAM_GET_CLASS (emss)->sync_flush (stream, error); else sync_stream_sync_op (emss, EMSS_FLUSH, NULL, 0, error); return 0; } static gint sync_stream_close (CamelStream *stream, GCancellable *cancellable, GError **error) { EMSyncStream *emss = EM_SYNC_STREAM (stream); if (emss->cancel) { g_set_error ( error, G_IO_ERROR, G_IO_ERROR_CANCELLED, _("Canceled")); return -1; } emss->idle_id = 0; if (mail_in_main_thread ()) return EM_SYNC_STREAM_GET_CLASS (emss)->sync_close (stream, error); else sync_stream_sync_op (emss, EMSS_CLOSE, NULL, 0, error); return 0; } static void em_sync_stream_class_init (EMSyncStreamClass *class) { GObjectClass *object_class; CamelStreamClass *stream_class; object_class = G_OBJECT_CLASS (class); object_class->finalize = sync_stream_finalize; stream_class = CAMEL_STREAM_CLASS (class); stream_class->write = sync_stream_write; stream_class->flush = sync_stream_flush; stream_class->close = sync_stream_close; } static void em_sync_stream_init (EMSyncStream *emss) { } void em_sync_stream_set_buffer_size (EMSyncStream *emss, gsize size) { if (emss->buffer != NULL) g_string_free (emss->buffer, TRUE); emss->buffer = g_string_sized_new (size); } and_yarn/devel/electron4/files/lodash.merge-4.6.2'>dependabot/npm_and_yarn/devel/electron4/files/lodash.merge-4.6.2</option> <option value='dependabot/npm_and_yarn/devel/electron4/files/lodash.template-4.5.0'>dependabot/npm_and_yarn/devel/electron4/files/lodash.template-4.5.0</option> <option value='dependabot/npm_and_yarn/devel/electron4/files/minimist-1.2.2'>dependabot/npm_and_yarn/devel/electron4/files/minimist-1.2.2</option> <option value='dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2'>dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2</option> <option value='main'>main</option> <option value='master'>master</option> <option value='svn_head'>svn_head</option> </select> <input type='submit' value='switch'/></form></td></tr> <tr><td class='sub'>FreeBSD Ports (https://github.com/freebsd/freebsd-ports)</td><td class='sub right'></td></tr></table> <table class='tabs'><tr><td> <a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/about/?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3'>about</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3'>summary</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/refs/?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=0bd0c72f01665c7fa75ee01ae116ffa584eb106e'>refs</a><a class='active' href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/cad/adms?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3'>log</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/tree/cad/adms?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=0bd0c72f01665c7fa75ee01ae116ffa584eb106e'>tree</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/cad/adms?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=0bd0c72f01665c7fa75ee01ae116ffa584eb106e'>commit</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/diff/cad/adms?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=0bd0c72f01665c7fa75ee01ae116ffa584eb106e'>diff</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/stats/cad/adms?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3'>stats</a></td><td class='form'><form class='right' method='get' action='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/cad/adms'> <input type='hidden' name='h' value='dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3'/><input type='hidden' name='id' value='0bd0c72f01665c7fa75ee01ae116ffa584eb106e'/><select name='qt'> <option value='grep'>log msg</option> <option value='author'>author</option> <option value='committer'>committer</option> <option value='range'>range</option> </select> <input class='txt' type='search' size='10' name='q' value=''/> <input type='submit' value='search'/> </form> </td></tr></table> <div class='path'>path: <a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=0bd0c72f01665c7fa75ee01ae116ffa584eb106e'>root</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/cad?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=0bd0c72f01665c7fa75ee01ae116ffa584eb106e'>cad</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/cad/adms?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=0bd0c72f01665c7fa75ee01ae116ffa584eb106e'>adms</a></div><div class='content'><table class='list nowrap'><tr class='nohover'><th></th><th class='left'>Commit message (<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/cad/adms?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=0bd0c72f01665c7fa75ee01ae116ffa584eb106e&showmsg=1'>Expand</a>)</th><th class='left'>Author</th><th class='left'>Age</th><th class='left'>Files</th><th class='left'>Lines</th></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/cad/adms?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=fb1cd48d36432af736f62b2db521d2b241dbabbb'>- Fix LICENSE</a></td><td>amdmi3</td><td><span title='2017-04-21 18:22:08 +0800'>2017-04-21</span></td><td>2</td><td><span class='deletions'>-1</span>/<span class='insertions'>+4</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/cad/adms?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=4cf495fd000c632a15f8b48698540908a875e0c1'>Update to 2.3.6.</a></td><td>araujo</td><td><span title='2017-03-11 15:02:50 +0800'>2017-03-11</span></td><td>2</td><td><span class='deletions'>-3</span>/<span class='insertions'>+4</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/cad/adms?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=6e502d51f3f34690037f4f33bb5cf0f0f50e2ca7'>Most commonly used build systems support silent builds, when they</a></td><td>amdmi3</td><td><span title='2016-09-10 03:42:46 +0800'>2016-09-10</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+0</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/cad/adms?h=dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3&id=7cf6b5182327a1c8a5601623f3e54bcc02c66163'>Update to 2.3.5.</a></td><td>vanilla</td><td><span title='2016-02-20 19:57:00 +0800'>2016-02-20</span>