X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/460b9539a7c15580e41a71bbc0f47ae776238915..ca6b4a12640792d416b9fcbeb4baa8a3b84285ff:/disobedience/client.c diff --git a/disobedience/client.c b/disobedience/client.c index d03e9de..dd40597 100644 --- a/disobedience/client.c +++ b/disobedience/client.c @@ -1,26 +1,27 @@ /* * This file is part of DisOrder. - * Copyright (C) 2006 Richard Kettlewell + * Copyright (C) 2006, 2007, 2008 Richard Kettlewell * - * This program is free software; you can redistribute it and/or modify + * 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 - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * 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 - * General Public License for more details. - * + * 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 General Public License for more details. + * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA + * along with this program. If not, see . + */ +/** @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 +29,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 +43,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 +51,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 +70,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 +80,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,29 +109,32 @@ 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)); 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 drop the error message in the + * status bar. + */ static void gtkclient_protocol_error(void attribute((unused)) *u, - void *v, - int code, + void attribute((unused)) *v, + int attribute((unused)) code, const char *msg) { - struct callbackdata *cbd = v; - D(("gtkclient_protocol_error %s", msg)); - if(cbd && cbd->onerror) - cbd->onerror(cbd, code, msg); - else - popup_protocol_error(code, msg); + gtk_label_set_text(GTK_LABEL(report_label), msg); } +/** @brief Report callback from eclient */ static void gtkclient_report(void attribute((unused)) *u, const char *msg) { if(!msg) @@ -136,13 +142,14 @@ static void gtkclient_report(void attribute((unused)) *u, gtk_label_set_text(GTK_LABEL(report_label), ""); } +/** @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); + popup_msg(GTK_MESSAGE_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 +157,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 +168,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 +184,3 @@ fill-column:79 indent-tabs-mode:nil End: */ -/* arch-tag:32Qju8BYS5FZvqbPHElgcg */