From ec69d1abd08eaf816e6fe4752ecd52b485230022 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sat, 5 Sep 2009 11:52:31 +0200 Subject: [PATCH] Add skeleton for AT multiplexer API --- Makefile.am | 3 +- gatmux/gatmux.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gatmux/gatmux.h | 45 ++++++++++++++++++++ 3 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 gatmux/gatmux.c create mode 100644 gatmux/gatmux.h diff --git a/Makefile.am b/Makefile.am index cbbdf33..face860 100644 --- a/Makefile.am +++ b/Makefile.am @@ -42,7 +42,8 @@ gisi_sources = gisi/phonet.h gisi/modem.h gisi/netlink.h gisi/netlink.c \ gisi/socket.h gisi/socket.c gisi/client.h gisi/client.c \ gisi/pep.h gisi/pep.c gisi/pipe.h gisi/pipe.c -gatmux_sources = gatmux/gsm0710_p.h gatmux/gsm0710.c +gatmux_sources = gatmux/gatmux.h gatmux/gatmux.c \ + gatmux/gsm0710_p.h gatmux/gsm0710.c gatchat_sources = gatchat/gatchat.h gatchat/gatchat.c \ gatchat/gatresult.h gatchat/gatresult.c \ diff --git a/gatmux/gatmux.c b/gatmux/gatmux.c new file mode 100644 index 0000000..14c567e --- /dev/null +++ b/gatmux/gatmux.c @@ -0,0 +1,127 @@ +/* + * + * AT multiplexer library with GLib integration + * + * Copyright (C) 2009 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 +#endif + +#include +#include +#include +#include +#include + +#include + +#include "gsm0710_p.h" +#include "gatmux.h" + +struct _GAtMux { + gint ref_count; /* Ref count */ + GIOChannel *channel; /* channel */ +}; + +GAtMux *g_at_mux_new(GIOChannel *channel) +{ + GAtMux *mux; + + if (!channel) + return NULL; + + mux = g_try_new0(GAtMux, 1); + + if (!mux) + return mux; + + mux->ref_count = 1; + + mux->channel = channel; + + return mux; +} + +static int open_device(const char *device) +{ + struct termios ti; + int fd; + + fd = open(device, O_RDWR | O_NOCTTY); + if (fd < 0) + return -1; + + tcflush(fd, TCIOFLUSH); + + /* Switch TTY to raw mode */ + memset(&ti, 0, sizeof(ti)); + cfmakeraw(&ti); + + tcsetattr(fd, TCSANOW, &ti); + + return fd; +} + +GAtMux *g_at_mux_new_from_tty(const char *device) +{ + GIOChannel *channel; + int fd; + + fd = open_device(device); + if (fd < 0) + return NULL; + + channel = g_io_channel_unix_new(fd); + if (!channel) { + close(fd); + return NULL; + } + + return g_at_mux_new(channel); +} + +GAtMux *g_at_mux_ref(GAtMux *mux) +{ + if (mux == NULL) + return NULL; + + g_atomic_int_inc(&mux->ref_count); + + return mux; +} + +void g_at_mux_unref(GAtMux *mux) +{ + if (mux == NULL) + return; + + if (g_atomic_int_dec_and_test(&mux->ref_count)) { + g_at_mux_shutdown(mux); + + g_free(mux); + } +} + +gboolean g_at_mux_shutdown(GAtMux *mux) +{ + if (mux->channel == NULL) + return FALSE; + + return TRUE; +} diff --git a/gatmux/gatmux.h b/gatmux/gatmux.h new file mode 100644 index 0000000..e21231a --- /dev/null +++ b/gatmux/gatmux.h @@ -0,0 +1,45 @@ +/* + * + * AT multiplexer library with GLib integration + * + * Copyright (C) 2009 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 __GATMUX_H +#define __GATMUX_H + +#ifdef __cplusplus +extern "C" { +#endif + +struct _GAtMux; + +typedef struct _GAtMux GAtMux; + +GAtMux *g_at_mux_new(GIOChannel *channel); +GAtMux *g_at_mux_new_from_tty(const char *device); + +GAtMux *g_at_mux_ref(GAtMux *mux); +void g_at_mux_unref(GAtMux *mux); + +gboolean g_at_mux_shutdown(GAtMux *mux); + +#ifdef __cplusplus +} +#endif + +#endif /* __GATMUX_H */ -- 2.7.4