diff options
-rw-r--r-- | common/sdp-glib.c | 239 |
1 files changed, 0 insertions, 239 deletions
diff --git a/common/sdp-glib.c b/common/sdp-glib.c deleted file mode 100644 index bd27d822..00000000 --- a/common/sdp-glib.c +++ /dev/null @@ -1,239 +0,0 @@ -/* - * - * BlueZ - Bluetooth protocol stack for Linux - * - * Copyright (C) 2004-2008 Marcel Holtmann <marcel@holtmann.org> - * - * - * 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 - * (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. - * - * 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 <stdlib.h> -#include <limits.h> - -#include <bluetooth/sdp.h> -#include <bluetooth/sdp_lib.h> - -#include <glib.h> - -#include "logging.h" -#include "sdp-xml.h" - -static int compute_seq_size(sdp_data_t *data) -{ - int unit_size = data->unitSize; - sdp_data_t *seq = data->val.dataseq; - - for (; seq; seq = seq->next) - unit_size += seq->unitSize; - - return unit_size; -} - -struct context_data { - sdp_record_t *record; - sdp_data_t attr_data; - struct sdp_xml_data *stack_head; - uint16_t attr_id; -}; - -static void element_start(GMarkupParseContext *context, - const gchar *element_name, const gchar **attribute_names, - const gchar **attribute_values, gpointer user_data, GError **err) -{ - struct context_data *ctx_data = user_data; - - if (!strcmp(element_name, "record")) - return; - - if (!strcmp(element_name, "attribute")) { - int i; - for (i = 0; attribute_names[i]; i++) { - if (!strcmp(attribute_names[i], "id")) { - ctx_data->attr_id = strtol(attribute_values[i], 0, 0); - break; - } - } - debug("New attribute 0x%04x", ctx_data->attr_id); - return; - } - - if (ctx_data->stack_head) { - struct sdp_xml_data *newelem = sdp_xml_data_alloc(); - newelem->next = ctx_data->stack_head; - ctx_data->stack_head = newelem; - } else { - ctx_data->stack_head = sdp_xml_data_alloc(); - ctx_data->stack_head->next = NULL; - } - - if (!strcmp(element_name, "sequence")) - ctx_data->stack_head->data = sdp_data_alloc(SDP_SEQ8, NULL); - else if (!strcmp(element_name, "alternate")) - ctx_data->stack_head->data = sdp_data_alloc(SDP_ALT8, NULL); - else { - int i; - /* Parse value, name, encoding */ - for (i = 0; attribute_names[i]; i++) { - if (!strcmp(attribute_names[i], "value")) { - int curlen = strlen(ctx_data->stack_head->text); - int attrlen = strlen(attribute_values[i]); - - /* Ensure we're big enough */ - while ((curlen + 1 + attrlen) > ctx_data->stack_head->size) { - sdp_xml_data_expand(ctx_data->stack_head); - } - - memcpy(ctx_data->stack_head->text + curlen, - attribute_values[i], attrlen); - ctx_data->stack_head->text[curlen + attrlen] = '\0'; - } - - if (!strcmp(attribute_names[i], "encoding")) { - if (!strcmp(attribute_values[i], "hex")) - ctx_data->stack_head->type = 1; - } - - if (!strcmp(attribute_names[i], "name")) { - ctx_data->stack_head->name = strdup(attribute_values[i]); - } - } - - ctx_data->stack_head->data = sdp_xml_parse_datatype(element_name, - ctx_data->stack_head, ctx_data->record); - - if (ctx_data->stack_head->data == NULL) - error("Can't parse element %s", element_name); - } -} - -static void element_end(GMarkupParseContext *context, - const gchar *element_name, gpointer user_data, GError **err) -{ - struct context_data *ctx_data = user_data; - struct sdp_xml_data *elem; - - if (!strcmp(element_name, "record")) - return; - - if (!strcmp(element_name, "attribute")) { - if (ctx_data->stack_head && ctx_data->stack_head->data) { - int ret = sdp_attr_add(ctx_data->record, ctx_data->attr_id, - ctx_data->stack_head->data); - if (ret == -1) - debug("Trouble adding attribute\n"); - - ctx_data->stack_head->data = NULL; - sdp_xml_data_free(ctx_data->stack_head); - ctx_data->stack_head = NULL; - } else { - debug("No data for attribute 0x%04x\n", ctx_data->attr_id); - } - return; - } - - if (!strcmp(element_name, "sequence")) { - ctx_data->stack_head->data->unitSize = compute_seq_size(ctx_data->stack_head->data); - - if (ctx_data->stack_head->data->unitSize > USHRT_MAX) { - ctx_data->stack_head->data->unitSize += sizeof(uint32_t); - ctx_data->stack_head->data->dtd = SDP_SEQ32; - } else if (ctx_data->stack_head->data->unitSize > UCHAR_MAX) { - ctx_data->stack_head->data->unitSize += sizeof(uint16_t); - ctx_data->stack_head->data->dtd = SDP_SEQ16; - } else { - ctx_data->stack_head->data->unitSize += sizeof(uint8_t); - } - } else if (!strcmp(element_name, "alternate")) { - ctx_data->stack_head->data->unitSize = compute_seq_size(ctx_data->stack_head->data); - - if (ctx_data->stack_head->data->unitSize > USHRT_MAX) { - ctx_data->stack_head->data->unitSize += sizeof(uint32_t); - ctx_data->stack_head->data->dtd = SDP_ALT32; - } else if (ctx_data->stack_head->data->unitSize > UCHAR_MAX) { - ctx_data->stack_head->data->unitSize += sizeof(uint16_t); - ctx_data->stack_head->data->dtd = SDP_ALT16; - } else { - ctx_data->stack_head->data->unitSize += sizeof(uint8_t); - } - } - - if (ctx_data->stack_head->next && ctx_data->stack_head->data && - ctx_data->stack_head->next->data) { - switch (ctx_data->stack_head->next->data->dtd) { - case SDP_SEQ8: - case SDP_SEQ16: - case SDP_SEQ32: - case SDP_ALT8: - case SDP_ALT16: - case SDP_ALT32: - ctx_data->stack_head->next->data->val.dataseq = - sdp_seq_append(ctx_data->stack_head->next->data->val.dataseq, - ctx_data->stack_head->data); - ctx_data->stack_head->data = NULL; - break; - } - - elem = ctx_data->stack_head; - ctx_data->stack_head = ctx_data->stack_head->next; - - sdp_xml_data_free(elem); - } -} - -static GMarkupParser parser = { - element_start, element_end, NULL, NULL, NULL -}; - -sdp_record_t *sdp_xml_parse_record(const char *data, int size) -{ - GMarkupParseContext *ctx; - struct context_data *ctx_data; - sdp_record_t *record; - - ctx_data = malloc(sizeof(*ctx_data)); - if (!ctx_data) - return NULL; - - record = sdp_record_alloc(); - if (!record) { - free(ctx_data); - return NULL; - } - - memset(ctx_data, 0, sizeof(*ctx_data)); - ctx_data->record = record; - - ctx = g_markup_parse_context_new(&parser, 0, ctx_data, NULL); - - if (g_markup_parse_context_parse(ctx, data, size, NULL) == FALSE) { - error("XML parsing error"); - g_markup_parse_context_free(ctx); - sdp_record_free(record); - free(ctx_data); - return NULL; - } - - g_markup_parse_context_free(ctx); - - free(ctx_data); - - return record; -} |