[Asterisk-code-review] res_calendar_exchange: Use libxml2 instead of libiksemel (...asterisk[13])

Sean Bright asteriskteam at digium.com
Thu Oct 24 16:28:31 CDT 2019


Sean Bright has uploaded this change for review. ( https://gerrit.asterisk.org/c/asterisk/+/13124


Change subject: res_calendar_exchange: Use libxml2 instead of libiksemel
......................................................................

res_calendar_exchange: Use libxml2 instead of libiksemel

Change-Id: I1ad47fdf13f4146996ac94be7181ee075d2480d8
---
M res/res_calendar_exchange.c
1 file changed, 65 insertions(+), 63 deletions(-)



  git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/24/13124/1

diff --git a/res/res_calendar_exchange.c b/res/res_calendar_exchange.c
index d2edd01..b48023c 100644
--- a/res/res_calendar_exchange.c
+++ b/res/res_calendar_exchange.c
@@ -24,7 +24,6 @@
 	<depend>res_calendar</depend>
 	<depend>neon</depend>
 	<depend>ical</depend>
-	<depend>iksemel</depend>
 	<support_level>core</support_level>
 ***/
 
@@ -38,7 +37,7 @@
 #include <ne_request.h>
 #include <ne_auth.h>
 #include <ne_redirect.h>
-#include <iksemel.h>
+#include <libxml/parser.h>
 
 #include "asterisk/module.h"
 #include "asterisk/channel.h"
@@ -82,61 +81,61 @@
 	struct exchangecal_pvt *pvt;
 };
 
-static int parse_tag(void *data, char *name, char **atts, int type)
+static void parse_start_tag(void *data,
+							const xmlChar *local_name,
+							const xmlChar *prefix,
+							const xmlChar *uri,
+							int nb_namespaces,
+							const xmlChar **namespaces,
+							int nb_attributes,
+							int nb_defaulted,
+							const xmlChar **attributes)
 {
 	struct xmlstate *state = data;
-	char *tmp;
 
-	if ((tmp = strchr(name, ':'))) {
-		tmp++;
-	} else {
-		return IKS_HOOK;
-	}
+	ast_copy_string(state->tag, (char *) local_name, sizeof(state->tag));
 
-	ast_copy_string(state->tag, tmp, sizeof(state->tag));
+	if (!strcasecmp(state->tag, "response")) {
+		struct ast_calendar_event *event;
 
-	switch (type) {
-	case IKS_OPEN:
-		if (!strcasecmp(state->tag, "response")) {
-			struct ast_calendar_event *event;
-
-			state->in_response = 1;
-			if (!(event = ast_calendar_event_alloc(state->pvt->owner))) {
-				return IKS_NOMEM;
-			}
-			state->ptr = event;
-		} else if (!strcasecmp(state->tag, "propstat")) {
-			state->in_propstat = 1;
-		} else if (!strcasecmp(state->tag, "prop")) {
-			state->in_prop = 1;
+		state->in_response = 1;
+		if (!(event = ast_calendar_event_alloc(state->pvt->owner))) {
+			return;
 		}
-		break;
+		state->ptr = event;
+	} else if (!strcasecmp(state->tag, "propstat")) {
+		state->in_propstat = 1;
+	} else if (!strcasecmp(state->tag, "prop")) {
+		state->in_prop = 1;
+	}
+}
 
-	case IKS_CLOSE:
-		if (!strcasecmp(state->tag, "response")) {
-			struct ao2_container *events = state->pvt->events;
-			struct ast_calendar_event *event = state->ptr;
+static void parse_end_tag(void *data,
+						  const xmlChar *local_name,
+						  const xmlChar *prefix,
+						  const xmlChar *uri)
+{
+	struct xmlstate *state = data;
 
-			state->in_response = 0;
-			if (ast_strlen_zero(event->uid)) {
-				ast_log(LOG_ERROR, "This event has no UID, something has gone wrong\n");
-				event = ast_calendar_unref_event(event);
-				return IKS_HOOK;
-			}
-			ao2_link(events, event);
+	ast_copy_string(state->tag, (char *) local_name, sizeof(state->tag));
+
+	if (!strcasecmp(state->tag, "response")) {
+		struct ao2_container *events = state->pvt->events;
+		struct ast_calendar_event *event = state->ptr;
+
+		state->in_response = 0;
+		if (ast_strlen_zero(event->uid)) {
+			ast_log(LOG_ERROR, "This event has no UID, something has gone wrong\n");
 			event = ast_calendar_unref_event(event);
-		} else if (!strcasecmp(state->tag, "propstat")) {
-			state->in_propstat = 0;
-		} else if (!strcasecmp(state->tag, "prop")) {
-			state->in_prop = 0;
+			return;
 		}
-		break;
-
-	default:
-		return IKS_OK;
+		ao2_link(events, event);
+		event = ast_calendar_unref_event(event);
+	} else if (!strcasecmp(state->tag, "propstat")) {
+		state->in_propstat = 0;
+	} else if (!strcasecmp(state->tag, "prop")) {
+		state->in_prop = 0;
 	}
-
-	return IKS_OK;
 }
 
 static time_t mstime_to_time_t(char *mstime)
@@ -170,28 +169,28 @@
 	}
 }
 
-static int parse_cdata(void *data, char *value, size_t len)
+static void parse_cdata(void *data, const xmlChar *ch, int len)
 {
 	char *str;
+	char *value = (char *) ch;
 	struct xmlstate *state = data;
 	struct ast_calendar_event *event = state->ptr;
 
+	if (!state->in_response || !state->in_propstat || !state->in_prop) {
+		return;
+	}
 
+	/* Check if we're empty */
 	str = ast_skip_blanks(value);
-
-	if (str == value + len)
-		return IKS_OK;
-
-	if (!(str = ast_calloc(1, len + 1))) {
-		return IKS_NOMEM;
+	if (!*str) {
+		return;
 	}
-	memcpy(str, value, len);
-	if (!(state->in_response && state->in_propstat && state->in_prop)) {
-		ast_free(str);
-		return IKS_OK;
+
+	str = ast_strdup(value);
+	if (!str) {
+		return;
 	}
-	/* We use ast_string_field_build here because libiksemel is parsing CDATA with < as
-	 * new elements which is a bit odd and shouldn't happen */
+
 	if (!strcasecmp(state->tag, "subject")) {
 		ast_string_field_build(event, summary, "%s%s", event->summary, str);
 	} else if (!strcasecmp(state->tag, "location")) {
@@ -215,7 +214,6 @@
 	}
 
 	ast_free(str);
-	return IKS_OK;
 }
 
 static void exchangecal_destructor(void *obj)
@@ -581,7 +579,12 @@
 	struct timeval now = ast_tvnow();
 	time_t start, end;
 	struct ast_str *response;
-	iksparser *p;
+	xmlSAXHandler sax = {
+		.initialized = XML_SAX2_MAGIC,
+		.startElementNs = parse_start_tag,
+		.endElementNs = parse_end_tag,
+		.characters = parse_cdata,
+	};
 
 	state.pvt = pvt;
 	start = now.tv_sec;
@@ -590,8 +593,7 @@
 		return -1;
 	}
 
-	p = iks_sax_new(&state, parse_tag, parse_cdata);
-	iks_parse(p, ast_str_buffer(response), ast_str_strlen(response), 1);
+	xmlSAXUserParseMemory(&sax, &state, ast_str_buffer(response), ast_str_strlen(response));
 	ast_calendar_merge_events(pvt->owner, pvt->events);
 	ast_free(response);
 

-- 
To view, visit https://gerrit.asterisk.org/c/asterisk/+/13124
To unsubscribe, or for help writing mail filters, visit https://gerrit.asterisk.org/settings

Gerrit-Project: asterisk
Gerrit-Branch: 13
Gerrit-Change-Id: I1ad47fdf13f4146996ac94be7181ee075d2480d8
Gerrit-Change-Number: 13124
Gerrit-PatchSet: 1
Gerrit-Owner: Sean Bright <sean.bright at gmail.com>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20191024/7629632e/attachment-0001.html>


More information about the asterisk-code-review mailing list