summaryrefslogtreecommitdiffstats
path: root/gisi
diff options
context:
space:
mode:
authorAki Niemi <aki.niemi@nokia.com>2010-11-14 17:13:54 +0200
committerAki Niemi <aki.niemi@nokia.com>2010-12-22 17:13:46 +0200
commit1e8312da2b33cf4efc3d69a72697faf871099c74 (patch)
tree09c724f246031fbcd162604b886d43fc8aa0ea15 /gisi
parent14b440fd3efb6184631eea2badd4c8aefc8680d3 (diff)
downloadofono-1e8312da2b33cf4efc3d69a72697faf871099c74.tar.bz2
gisi: Add new API for ISI message handling
Diffstat (limited to 'gisi')
-rw-r--r--gisi/message.c115
-rw-r--r--gisi/message.h70
2 files changed, 185 insertions, 0 deletions
diff --git a/gisi/message.c b/gisi/message.c
new file mode 100644
index 00000000..91c5a559
--- /dev/null
+++ b/gisi/message.c
@@ -0,0 +1,115 @@
+/*
+ *
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+ *
+ * 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 <stdint.h>
+#include <errno.h>
+#include <glib.h>
+
+#include "message.h"
+
+int g_isi_msg_version_major(const GIsiMessage *msg)
+{
+ return msg && msg->version ? msg->version->major : -1;
+}
+
+int g_isi_msg_version_minor(const GIsiMessage *msg)
+{
+ return msg && msg->version ? msg->version->minor : -1;
+}
+
+int g_isi_msg_error(const GIsiMessage *msg)
+{
+ return msg ? -msg->error : -EINVAL;
+}
+
+uint8_t g_isi_msg_resource(const GIsiMessage *msg)
+{
+ return msg && msg->addr ? msg->addr->spn_resource : 0;
+}
+
+uint16_t g_isi_msg_object(const GIsiMessage *msg)
+{
+ return msg && msg->addr ? (msg->addr->spn_dev << 8) | msg->addr->spn_obj : 0;
+}
+
+uint8_t g_isi_msg_id(const GIsiMessage *msg)
+{
+ const uint8_t *buf;
+
+ if (!msg || !msg->data || msg->len < 2)
+ return 0;
+
+ buf = msg->data;
+
+ return buf[1];
+}
+
+uint8_t g_isi_msg_utid(const GIsiMessage *msg)
+{
+ const uint8_t *buf;
+
+ if (!msg || !msg->data || msg->len < 2)
+ return 0;
+
+ buf = msg->data;
+
+ return buf[0];
+}
+
+size_t g_isi_msg_data_len(const GIsiMessage *msg)
+{
+ return msg && msg->data ? msg->len - 2 : 0;
+}
+
+const void *g_isi_msg_data(const GIsiMessage *msg)
+{
+ return msg && msg->data ? msg->data + 2 : NULL;
+}
+
+gboolean g_isi_msg_data_get_byte(const GIsiMessage *msg, unsigned offset,
+ uint8_t *byte)
+{
+ const uint8_t *buf = g_isi_msg_data(msg);
+
+ if (!buf || g_isi_msg_data_len(msg) < offset)
+ return FALSE;
+
+ if (byte)
+ *byte = buf[offset];
+
+ return TRUE;
+}
+
+gboolean g_isi_msg_data_get_struct(const GIsiMessage *msg, unsigned offset,
+ const void **type, size_t len)
+{
+ if (g_isi_msg_data_len(msg) < offset + len)
+ return FALSE;
+
+ if (type)
+ *type = g_isi_msg_data(msg) + offset;
+
+ return TRUE;
+}
diff --git a/gisi/message.h b/gisi/message.h
new file mode 100644
index 00000000..0be7e5bb
--- /dev/null
+++ b/gisi/message.h
@@ -0,0 +1,70 @@
+/*
+ *
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+ *
+ * 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 __GISI_MESSAGE_H
+#define __GISI_MESSAGE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <glib/gtypes.h>
+
+#include "phonet.h"
+
+struct _GIsiVersion {
+ int major;
+ int minor;
+};
+typedef struct _GIsiVersion GIsiVersion;
+
+struct _GIsiMessage {
+ struct sockaddr_pn *addr;
+ GIsiVersion *version;
+ int error;
+ const void *__restrict data;
+ size_t len;
+ void *private;
+};
+typedef struct _GIsiMessage GIsiMessage;
+
+int g_isi_msg_version_major(const GIsiMessage *msg);
+int g_isi_msg_version_minor(const GIsiMessage *msg);
+int g_isi_msg_error(const GIsiMessage *msg);
+uint8_t g_isi_msg_resource(const GIsiMessage *msg);
+uint16_t g_isi_msg_object(const GIsiMessage *msg);
+
+uint8_t g_isi_msg_id(const GIsiMessage *msg);
+uint8_t g_isi_msg_utid(const GIsiMessage *msg);
+size_t g_isi_msg_data_len(const GIsiMessage *msg);
+const void *g_isi_msg_data(const GIsiMessage *msg);
+
+gboolean g_isi_msg_data_get_byte(const GIsiMessage *msg, unsigned offset,
+ uint8_t *byte);
+gboolean g_isi_msg_data_get_struct(const GIsiMessage *msg, unsigned offset,
+ const void **type, size_t len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __GISI_MESSAGE_H */