X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/460b9539a7c15580e41a71bbc0f47ae776238915..16e145a5cf55ff3826656faedfba13460e4ab28b:/disobedience/client.c diff --git a/disobedience/client.c b/disobedience/client.c index d03e9de..8539221 100644 --- a/disobedience/client.c +++ b/disobedience/client.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder. - * Copyright (C) 2006 Richard Kettlewell + * Copyright (C) 2006, 2007 Richard Kettlewell * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,10 +17,13 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ +/** @file disobedience/client.c + * @brief GLIB integration for @ref lib/eclient.c client + */ #include "disobedience.h" -/* GSource subclass for disorder_eclient */ +/** @brief GSource subclass for disorder_eclient */ struct eclient_source { GSource gsource; disorder_eclient *client; @@ -28,8 +31,10 @@ struct eclient_source { GPollFD pollfd; }; -/* Called before FDs are polled to choose a timeout. We ask for a 3s - * timeout and every 10s or so we force a dispatch. */ +/** @brief Called before FDs are polled to choose a timeout. + * + * We ask for a 3s timeout and every 10s or so we force a dispatch. + */ static gboolean gtkclient_prepare(GSource *source, gint *timeout) { const struct eclient_source *esource = (struct eclient_source *)source; @@ -40,7 +45,7 @@ static gboolean gtkclient_prepare(GSource *source, return FALSE; /* please poll */ } -/* Check whether we're ready to dispatch. */ +/** @brief Check whether we're ready to dispatch */ static gboolean gtkclient_check(GSource *source) { const struct eclient_source *esource = (struct eclient_source *)source; D(("gtkclient_check fd=%d events=%x revents=%x", @@ -48,7 +53,7 @@ static gboolean gtkclient_check(GSource *source) { return esource->pollfd.fd != -1 && esource->pollfd.revents != 0; } -/* Dispatch */ +/** @brief Called after poll() (or otherwise) to dispatch an event */ static gboolean gtkclient_dispatch(GSource *source, GSourceFunc attribute((unused)) callback, gpointer attribute((unused)) user_data) { @@ -67,7 +72,7 @@ static gboolean gtkclient_dispatch(GSource *source, return TRUE; /* ??? not documented */ } -/* Table of callbacks for GSource subclass */ +/** @brief Table of callbacks for GSource subclass */ static const GSourceFuncs sourcefuncs = { gtkclient_prepare, gtkclient_check, @@ -77,7 +82,7 @@ static const GSourceFuncs sourcefuncs = { 0, }; -/* Tell the mainloop what we need */ +/** @brief Tell the mainloop what we need */ static void gtkclient_poll(void *u, disorder_eclient attribute((unused)) *c, int fd, unsigned mode) { @@ -106,16 +111,23 @@ static void gtkclient_poll(void *u, } } -/* Report a communication-level error. It will be automatically retried. */ +/** @brief Report a communication-level error + * + * Any operations still outstanding are automatically replied by the underlying + * @ref lib/eclient.c code. + */ static void gtkclient_comms_error(void attribute((unused)) *u, const char *msg) { D(("gtkclient_comms_error %s", msg)); + menu_update(-1); gtk_label_set_text(GTK_LABEL(report_label), msg); } -/* Report a protocol error. It will not be retried. We offer a callback to - * the submitter of the original command and if none is supplied we pop up an - * error box. */ +/** @brief Report a protocol-level error + * + * The error will not be retried. We offer a callback to the submitter of the + * original command and if none is supplied we pop up an error box. + */ static void gtkclient_protocol_error(void attribute((unused)) *u, void *v, int code, @@ -129,20 +141,23 @@ static void gtkclient_protocol_error(void attribute((unused)) *u, popup_protocol_error(code, msg); } +/** @brief Report callback from eclient */ static void gtkclient_report(void attribute((unused)) *u, const char *msg) { if(!msg) /* We're idle - clear the report line */ gtk_label_set_text(GTK_LABEL(report_label), ""); + menu_update(-1); } +/** @brief Repoort an unhandled protocol-level error to the user */ void popup_protocol_error(int attribute((unused)) code, const char *msg) { gtk_label_set_text(GTK_LABEL(report_label), msg); popup_error(msg); } -/* Table of eclient callbacks */ +/** @brief Table of eclient callbacks */ static const disorder_eclient_callbacks gtkclient_callbacks = { gtkclient_comms_error, gtkclient_protocol_error, @@ -150,7 +165,7 @@ static const disorder_eclient_callbacks gtkclient_callbacks = { gtkclient_report }; -/* Create an eclient using the GLib main loop */ +/** @brief Create a @ref disorder_eclient using the GLib main loop */ disorder_eclient *gtkclient(void) { GSource *source; struct eclient_source *esource; @@ -161,6 +176,10 @@ disorder_eclient *gtkclient(void) { esource = (struct eclient_source *)source; esource->pollfd.fd = -1; esource->client = disorder_eclient_new(>kclient_callbacks, source); + if(!esource->client) { + g_source_destroy(source); + return 0; + } g_source_attach(source, 0); return esource->client; } @@ -173,4 +192,3 @@ fill-column:79 indent-tabs-mode:nil End: */ -/* arch-tag:32Qju8BYS5FZvqbPHElgcg */