diff options
Diffstat (limited to 'drivers/gator/daemon/SessionXML.cpp')
-rw-r--r-- | drivers/gator/daemon/SessionXML.cpp | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/drivers/gator/daemon/SessionXML.cpp b/drivers/gator/daemon/SessionXML.cpp new file mode 100644 index 00000000000..4604d7cf193 --- /dev/null +++ b/drivers/gator/daemon/SessionXML.cpp @@ -0,0 +1,119 @@ +/** + * Copyright (C) ARM Limited 2010-2012. 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. + */ + +#include <string.h> +#include <stdlib.h> +#include <limits.h> +#include "SessionXML.h" +#include "Logging.h" + +extern void handleException(); + +static const char* TAG_SESSION = "session"; +static const char* TAG_IMAGE = "image"; + +static const char* ATTR_VERSION = "version"; +static const char* ATTR_TITLE = "title"; +static const char* ATTR_UUID = "uuid"; +static const char* ATTR_CALL_STACK_UNWINDING = "call_stack_unwinding"; +static const char* ATTR_BUFFER_MODE = "buffer_mode"; +static const char* ATTR_SAMPLE_RATE = "sample_rate"; +static const char* ATTR_TARGET_PATH = "target_path"; +static const char* ATTR_OUTPUT_PATH = "output_path"; +static const char* ATTR_DURATION = "duration"; +static const char* ATTR_PATH = "path"; + +SessionXML::SessionXML(const char * str) { + parameters.title = 0; + parameters.uuid[0] = 0; + parameters.target_path = 0; + parameters.output_path = 0; + parameters.buffer_mode[0] = 0; + parameters.sample_rate[0] = 0; + parameters.duration = 0; + parameters.call_stack_unwinding = false; + parameters.images = NULL; + mPath = 0; + mSessionXML = (char*)str; + logg->logMessage(mSessionXML); +} + +SessionXML::~SessionXML() { + if (mPath != 0) { + free(mSessionXML); + } +} + +void SessionXML::parse() { + XMLReader reader(mSessionXML); + char * tag = reader.nextTag(); + while(tag != 0) { + if (strcmp(tag, TAG_SESSION) == 0) { + sessionTag(&reader); + return; + } + tag = reader.nextTag(); + } + + logg->logError(__FILE__, __LINE__, "No session tag found in the session.xml file"); + handleException(); +} + +void SessionXML::sessionTag(XMLReader* in) { + char* tempBuffer = (char*)malloc(PATH_MAX); + int version = in->getAttributeAsInteger(ATTR_VERSION, 0); + if (version != 1) { + logg->logError(__FILE__, __LINE__, "Invalid session.xml version: %d", version); + handleException(); + } + + in->getAttribute(ATTR_TITLE, tempBuffer, PATH_MAX, "unnamed"); + parameters.title = strdup(tempBuffer); // freed when the child process exits + if (parameters.title == NULL) { + logg->logError(__FILE__, __LINE__, "failed to allocate parameters.title (%d bytes)", strlen(tempBuffer)); + handleException(); + } + in->getAttribute(ATTR_UUID, parameters.uuid, sizeof(parameters.uuid), ""); + parameters.duration = in->getAttributeAsInteger(ATTR_DURATION, 0); + parameters.call_stack_unwinding = in->getAttributeAsBoolean(ATTR_CALL_STACK_UNWINDING, true); + in->getAttribute(ATTR_BUFFER_MODE, parameters.buffer_mode, sizeof(parameters.buffer_mode), "normal"); + in->getAttribute(ATTR_SAMPLE_RATE, parameters.sample_rate, sizeof(parameters.sample_rate), ""); + in->getAttribute(ATTR_TARGET_PATH, tempBuffer, PATH_MAX, ""); + parameters.target_path = strdup(tempBuffer); // freed when the child process exits + if (parameters.target_path == NULL) { + logg->logError(__FILE__, __LINE__, "failed to allocate parameters.target_path (%d bytes)", strlen(tempBuffer)); + handleException(); + } + in->getAttribute(ATTR_OUTPUT_PATH, tempBuffer, PATH_MAX, ""); + parameters.output_path = strdup(tempBuffer); // freed when the child process exits + if (parameters.output_path == NULL) { + logg->logError(__FILE__, __LINE__, "failed to allocate parameters.output_path (%d bytes)", strlen(tempBuffer)); + handleException(); + } + + free(tempBuffer); + + char * tag = in->nextTag(); + while(tag != 0) { + if (strcmp(tag, TAG_IMAGE) == 0) { + sessionImage(in); + } + tag = in->nextTag(); + } +} + +void SessionXML::sessionImage(XMLReader* in) { + int length = in->getAttributeLength(ATTR_PATH); + struct ImageLinkList *image; + + image = (struct ImageLinkList *)malloc(sizeof(struct ImageLinkList)); + image->path = (char *)malloc(length + 1); + in->getAttribute(ATTR_PATH, image->path, length + 1, ""); + image->next = parameters.images; + parameters.images = image; +} |