diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2010-01-23 11:20:00 +0100 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2010-01-23 11:20:00 +0100 |
commit | b5795c2b12e34ab29ad283b2ece3a507b17e3cb9 (patch) | |
tree | 6f7ab6ae70018300dee57e8d1c66e9ca886348ea /gatchat | |
parent | 88d5a1eeb0389c65c06c41fb4dc11bcd70dfc6a2 (diff) | |
download | connman-b5795c2b12e34ab29ad283b2ece3a507b17e3cb9.tar.gz connman-b5795c2b12e34ab29ad283b2ece3a507b17e3cb9.tar.bz2 connman-b5795c2b12e34ab29ad283b2ece3a507b17e3cb9.zip |
Sync GAtChat library with oFono
Diffstat (limited to 'gatchat')
-rw-r--r-- | gatchat/gat.h | 36 | ||||
-rw-r--r-- | gatchat/gatchat.c | 97 | ||||
-rw-r--r-- | gatchat/gatchat.h | 3 | ||||
-rw-r--r-- | gatchat/gatutil.c | 129 | ||||
-rw-r--r-- | gatchat/gatutil.h | 40 |
5 files changed, 211 insertions, 94 deletions
diff --git a/gatchat/gat.h b/gatchat/gat.h new file mode 100644 index 00000000..6696e7d4 --- /dev/null +++ b/gatchat/gat.h @@ -0,0 +1,36 @@ +/* + * + * AT chat library with GLib integration + * + * Copyright (C) 2008-2010 Intel Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __GAT_H +#define __GAT_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void (*GAtDisconnectFunc)(gpointer user_data); +typedef void (*GAtDebugFunc)(const char *str, gpointer user_data); + +#ifdef __cplusplus +} +#endif + +#endif /* __GAT_H */ diff --git a/gatchat/gatchat.c b/gatchat/gatchat.c index 7dfc4cb8..7026408c 100644 --- a/gatchat/gatchat.c +++ b/gatchat/gatchat.c @@ -40,7 +40,6 @@ static const char *none_prefix[] = { NULL }; static void g_at_chat_wakeup_writer(GAtChat *chat); -static void debug_chat(GAtChat *chat, gboolean in, const char *str, gsize len); struct at_command { char *cmd; @@ -686,81 +685,6 @@ static void new_bytes(GAtChat *p) g_at_chat_unref(p); } -static void debug_chat(GAtChat *chat, gboolean in, const char *str, gsize len) -{ - char type = in ? '<' : '>'; - gsize escaped = 2; /* Enough for '<', ' ' */ - char *escaped_str; - const char *esc = "<ESC>"; - gsize esc_size = strlen(esc); - const char *ctrlz = "<CtrlZ>"; - gsize ctrlz_size = strlen(ctrlz); - gsize i; - - if (!chat->debugf || !len) - return; - - for (i = 0; i < len; i++) { - char c = str[i]; - - if (isprint(c)) - escaped += 1; - else if (c == '\r' || c == '\t' || c == '\n') - escaped += 2; - else if (c == 26) - escaped += ctrlz_size; - else if (c == 25) - escaped += esc_size; - else - escaped += 4; - } - - escaped_str = g_malloc(escaped + 1); - escaped_str[0] = type; - escaped_str[1] = ' '; - escaped_str[2] = '\0'; - escaped_str[escaped] = '\0'; - - for (escaped = 2, i = 0; i < len; i++) { - char c = str[i]; - - switch (c) { - case '\r': - escaped_str[escaped++] = '\\'; - escaped_str[escaped++] = 'r'; - break; - case '\t': - escaped_str[escaped++] = '\\'; - escaped_str[escaped++] = 't'; - break; - case '\n': - escaped_str[escaped++] = '\\'; - escaped_str[escaped++] = 'n'; - break; - case 26: - strncpy(&escaped_str[escaped], ctrlz, ctrlz_size); - escaped += ctrlz_size; - break; - case 25: - strncpy(&escaped_str[escaped], esc, esc_size); - escaped += esc_size; - break; - default: - if (isprint(c)) - escaped_str[escaped++] = c; - else { - escaped_str[escaped++] = '\\'; - escaped_str[escaped++] = '0' + ((c >> 6) & 07); - escaped_str[escaped++] = '0' + ((c >> 3) & 07); - escaped_str[escaped++] = '0' + (c & 07); - } - } - } - - chat->debugf(escaped_str, chat->debug_data); - g_free(escaped_str); -} - static gboolean received_data(GIOChannel *channel, GIOCondition cond, gpointer data) { @@ -785,7 +709,8 @@ static gboolean received_data(GIOChannel *channel, GIOCondition cond, buf = ring_buffer_write_ptr(chat->buf); err = g_io_channel_read(channel, (char *) buf, toread, &rbytes); - debug_chat(chat, TRUE, (char *)buf, rbytes); + g_at_util_debug_chat(TRUE, (char *)buf, rbytes, + chat->debugf, chat->debug_data); total_read += rbytes; @@ -931,8 +856,8 @@ static gboolean can_write_data(GIOChannel *channel, GIOCondition cond, return FALSE; } - debug_chat(chat, FALSE, cmd->cmd + chat->cmd_bytes_written, - bytes_written); + g_at_util_debug_chat(FALSE, cmd->cmd + chat->cmd_bytes_written, + bytes_written, chat->debugf, chat->debug_data); chat->cmd_bytes_written += bytes_written; if (bytes_written < towrite) @@ -960,7 +885,6 @@ static void g_at_chat_wakeup_writer(GAtChat *chat) GAtChat *g_at_chat_new(GIOChannel *channel, GAtSyntax *syntax) { GAtChat *chat; - GIOFlags io_flags; if (!channel) return NULL; @@ -991,20 +915,9 @@ GAtChat *g_at_chat_new(GIOChannel *channel, GAtSyntax *syntax) chat->notify_list = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)at_notify_destroy); - if (g_io_channel_set_encoding(channel, NULL, NULL) != - G_IO_STATUS_NORMAL) - goto error; - - io_flags = g_io_channel_get_flags(channel); - - io_flags |= G_IO_FLAG_NONBLOCK; - - if (g_io_channel_set_flags(channel, io_flags, NULL) != - G_IO_STATUS_NORMAL) + if (!g_at_util_setup_io(channel)) goto error; - g_io_channel_set_close_on_unref(channel, TRUE); - chat->channel = channel; chat->read_watch = g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL, diff --git a/gatchat/gatchat.h b/gatchat/gatchat.h index 999b92dd..f76fc421 100644 --- a/gatchat/gatchat.h +++ b/gatchat/gatchat.h @@ -28,6 +28,7 @@ extern "C" { #include "gatresult.h" #include "gatsyntax.h" +#include "gatutil.h" struct _GAtChat; @@ -36,8 +37,6 @@ typedef struct _GAtChat GAtChat; typedef void (*GAtResultFunc)(gboolean success, GAtResult *result, gpointer user_data); typedef void (*GAtNotifyFunc)(GAtResult *result, gpointer user_data); -typedef void (*GAtDisconnectFunc)(gpointer user_data); -typedef void (*GAtDebugFunc)(const char *str, gpointer user_data); GAtChat *g_at_chat_new(GIOChannel *channel, GAtSyntax *syntax); diff --git a/gatchat/gatutil.c b/gatchat/gatutil.c new file mode 100644 index 00000000..dcff4c7b --- /dev/null +++ b/gatchat/gatutil.c @@ -0,0 +1,129 @@ +/* + * + * AT chat library with GLib integration + * + * Copyright (C) 2008-2010 Intel Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string.h> +#include <ctype.h> + +#include <glib.h> + +#include "gatutil.h" + +void g_at_util_debug_chat(gboolean in, const char *str, gsize len, + GAtDebugFunc debugf, gpointer user_data) +{ + char type = in ? '<' : '>'; + gsize escaped = 2; /* Enough for '<', ' ' */ + char *escaped_str; + const char *esc = "<ESC>"; + gsize esc_size = strlen(esc); + const char *ctrlz = "<CtrlZ>"; + gsize ctrlz_size = strlen(ctrlz); + gsize i; + + if (!debugf || !len) + return; + + for (i = 0; i < len; i++) { + char c = str[i]; + + if (isprint(c)) + escaped += 1; + else if (c == '\r' || c == '\t' || c == '\n') + escaped += 2; + else if (c == 26) + escaped += ctrlz_size; + else if (c == 25) + escaped += esc_size; + else + escaped += 4; + } + + escaped_str = g_malloc(escaped + 1); + escaped_str[0] = type; + escaped_str[1] = ' '; + escaped_str[2] = '\0'; + escaped_str[escaped] = '\0'; + + for (escaped = 2, i = 0; i < len; i++) { + char c = str[i]; + + switch (c) { + case '\r': + escaped_str[escaped++] = '\\'; + escaped_str[escaped++] = 'r'; + break; + case '\t': + escaped_str[escaped++] = '\\'; + escaped_str[escaped++] = 't'; + break; + case '\n': + escaped_str[escaped++] = '\\'; + escaped_str[escaped++] = 'n'; + break; + case 26: + strncpy(&escaped_str[escaped], ctrlz, ctrlz_size); + escaped += ctrlz_size; + break; + case 25: + strncpy(&escaped_str[escaped], esc, esc_size); + escaped += esc_size; + break; + default: + if (isprint(c)) + escaped_str[escaped++] = c; + else { + escaped_str[escaped++] = '\\'; + escaped_str[escaped++] = '0' + ((c >> 6) & 07); + escaped_str[escaped++] = '0' + ((c >> 3) & 07); + escaped_str[escaped++] = '0' + (c & 07); + } + } + } + + debugf(escaped_str, user_data); + g_free(escaped_str); +} + +gboolean g_at_util_setup_io(GIOChannel *io) +{ + GIOFlags io_flags; + + if (g_io_channel_set_encoding(io, NULL, NULL) != + G_IO_STATUS_NORMAL) + return FALSE; + + io_flags = g_io_channel_get_flags(io); + + io_flags |= G_IO_FLAG_NONBLOCK; + + if (g_io_channel_set_flags(io, io_flags, NULL) != + G_IO_STATUS_NORMAL) + return FALSE; + + g_io_channel_set_close_on_unref(io, TRUE); + + return TRUE; +} + diff --git a/gatchat/gatutil.h b/gatchat/gatutil.h new file mode 100644 index 00000000..3aa82652 --- /dev/null +++ b/gatchat/gatutil.h @@ -0,0 +1,40 @@ +/* + * + * AT chat library with GLib integration + * + * Copyright (C) 2008-2010 Intel Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __GATUTIL_H +#define __GATUTIL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "gat.h" + +void g_at_util_debug_chat(gboolean in, const char *str, gsize len, + GAtDebugFunc debugf, gpointer user_data); + +gboolean g_at_util_setup_io(GIOChannel *io); + +#ifdef __cplusplus +} +#endif + +#endif /* __GATUTIL_H */ |