diff options
author | Benjamin Valentin <[email protected]> | 2012-03-27 03:03:55 +0200 |
---|---|---|
committer | Benjamin Valentin <[email protected]> | 2012-03-27 03:03:55 +0200 |
commit | e214b332395adbc77ad596218895a4834cad434d (patch) | |
tree | 52df3b5c109d78f18e2d48f1b34336561e939c93 /src/async-io-coroutine.h | |
parent | d367ab28270220c1378d2a7ca9bda4a9012c76cb (diff) | |
download | caja-dropbox-e214b332395adbc77ad596218895a4834cad434d.tar.bz2 caja-dropbox-e214b332395adbc77ad596218895a4834cad434d.tar.xz |
import nautilus dropbox 0.7.1
Diffstat (limited to 'src/async-io-coroutine.h')
-rw-r--r-- | src/async-io-coroutine.h | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/async-io-coroutine.h b/src/async-io-coroutine.h new file mode 100644 index 0000000..125d84e --- /dev/null +++ b/src/async-io-coroutine.h @@ -0,0 +1,65 @@ +/* + * Copyright 2008 Evenflow, Inc. + * + * async-io-coroutine.h + * Macros to simplify writing coroutines for the glib main loop. + * + * This file is part of nautilus-dropbox. + * + * nautilus-dropbox 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 3 of the License, or + * (at your option) any later version. + * + * nautilus-dropbox 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 nautilus-dropbox. If not, see <http://www.gnu.org/licenses/>. + * + */ + +#ifndef ASYNC_IO_COROUTINE_H +#define ASYNC_IO_COROUTINE_H + +#include <glib.h> + +G_BEGIN_DECLS + +#define CRBEGIN(pos) switch (pos) { case 0: +#define CREND } return FALSE +#define CRYIELD(pos) do { pos = __LINE__; return TRUE; case __LINE__:;} while (0) +#define CRHALT return FALSE + +#define CRREADLINE(pos, chan, where) \ + while (1) { \ + gchar *__line; \ + gsize __line_length, __newline_pos; \ + GIOStatus __iostat; \ + \ + __iostat = g_io_channel_read_line(chan, &__line, \ + &__line_length, \ + &__newline_pos, NULL); \ + if (__iostat == G_IO_STATUS_AGAIN) { \ + CRYIELD(pos); \ + } \ + else if (__iostat == G_IO_STATUS_NORMAL) { \ + *(__line + __newline_pos) = '\0'; \ + where = __line; \ + break; \ + } \ + else if (__iostat == G_IO_STATUS_EOF || \ + __iostat == G_IO_STATUS_ERROR) { \ + CRHALT; \ + } \ + else { \ + g_assert_not_reached(); \ + CRHALT; \ + } \ + } + +G_END_DECLS + +#endif |