blob: c638dea4591226f4a9b67fd484498ce32b4c3c45 [file] [log] [blame]
Jon Medhurstaaf37a32013-06-11 12:10:56 +01001/**
Jon Medhurstb1d07442015-05-08 12:04:18 +01002 * Copyright (C) ARM Limited 2010-2015. All rights reserved.
Jon Medhurstaaf37a32013-06-11 12:10:56 +01003 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8
Jon Medhurst15ce78d2014-04-10 09:02:02 +01009#include "SessionXML.h"
10
Jon Medhurstaaf37a32013-06-11 12:10:56 +010011#include <string.h>
12#include <stdlib.h>
13#include <limits.h>
Jon Medhurst15ce78d2014-04-10 09:02:02 +010014
Jon Medhurstaaf37a32013-06-11 12:10:56 +010015#include "Logging.h"
16#include "OlyUtility.h"
17#include "SessionData.h"
18
Jon Medhurst96b56152014-10-30 18:01:15 +000019static const char *TAG_SESSION = "session";
20static const char *TAG_IMAGE = "image";
Jon Medhurstaaf37a32013-06-11 12:10:56 +010021
Jon Medhurst96b56152014-10-30 18:01:15 +000022static const char *ATTR_VERSION = "version";
23static const char *ATTR_CALL_STACK_UNWINDING = "call_stack_unwinding";
24static const char *ATTR_BUFFER_MODE = "buffer_mode";
25static const char *ATTR_SAMPLE_RATE = "sample_rate";
26static const char *ATTR_DURATION = "duration";
27static const char *ATTR_PATH = "path";
28static const char *ATTR_LIVE_RATE = "live_rate";
29static const char *ATTR_CAPTURE_WORKING_DIR = "capture_working_dir";
30static const char *ATTR_CAPTURE_COMMAND = "capture_command";
31static const char *ATTR_CAPTURE_USER = "capture_user";
Jon Medhurstaaf37a32013-06-11 12:10:56 +010032
Jon Medhurst15ce78d2014-04-10 09:02:02 +010033SessionXML::SessionXML(const char *str) {
Jon Medhurstaaf37a32013-06-11 12:10:56 +010034 parameters.buffer_mode[0] = 0;
35 parameters.sample_rate[0] = 0;
Jon Medhurstaaf37a32013-06-11 12:10:56 +010036 parameters.call_stack_unwinding = false;
37 parameters.live_rate = 0;
Jon Medhurst96b56152014-10-30 18:01:15 +000038 mSessionXML = str;
Jon Medhurstb1d07442015-05-08 12:04:18 +010039 logg->logMessage("%s", mSessionXML);
Jon Medhurstaaf37a32013-06-11 12:10:56 +010040}
41
42SessionXML::~SessionXML() {
Jon Medhurstaaf37a32013-06-11 12:10:56 +010043}
44
45void SessionXML::parse() {
46 mxml_node_t *tree;
47 mxml_node_t *node;
48
49 tree = mxmlLoadString(NULL, mSessionXML, MXML_NO_CALLBACK);
50 node = mxmlFindElement(tree, tree, TAG_SESSION, NULL, NULL, MXML_DESCEND);
51
52 if (node) {
53 sessionTag(tree, node);
54 mxmlDelete(tree);
55 return;
56 }
57
Jon Medhurstb1d07442015-05-08 12:04:18 +010058 logg->logError("No session tag found in the session.xml file");
Jon Medhurstaaf37a32013-06-11 12:10:56 +010059 handleException();
60}
61
62void SessionXML::sessionTag(mxml_node_t *tree, mxml_node_t *node) {
63 int version = 0;
64 if (mxmlElementGetAttr(node, ATTR_VERSION)) version = strtol(mxmlElementGetAttr(node, ATTR_VERSION), NULL, 10);
65 if (version != 1) {
Jon Medhurstb1d07442015-05-08 12:04:18 +010066 logg->logError("Invalid session.xml version: %d", version);
Jon Medhurstaaf37a32013-06-11 12:10:56 +010067 handleException();
68 }
69
70 // copy to pre-allocated strings
71 if (mxmlElementGetAttr(node, ATTR_BUFFER_MODE)) {
72 strncpy(parameters.buffer_mode, mxmlElementGetAttr(node, ATTR_BUFFER_MODE), sizeof(parameters.buffer_mode));
73 parameters.buffer_mode[sizeof(parameters.buffer_mode) - 1] = 0; // strncpy does not guarantee a null-terminated string
74 }
75 if (mxmlElementGetAttr(node, ATTR_SAMPLE_RATE)) {
76 strncpy(parameters.sample_rate, mxmlElementGetAttr(node, ATTR_SAMPLE_RATE), sizeof(parameters.sample_rate));
77 parameters.sample_rate[sizeof(parameters.sample_rate) - 1] = 0; // strncpy does not guarantee a null-terminated string
78 }
Jon Medhurst96b56152014-10-30 18:01:15 +000079 if (mxmlElementGetAttr(node, ATTR_CAPTURE_WORKING_DIR)) gSessionData->mCaptureWorkingDir = strdup(mxmlElementGetAttr(node, ATTR_CAPTURE_WORKING_DIR));
80 if (mxmlElementGetAttr(node, ATTR_CAPTURE_COMMAND)) gSessionData->mCaptureCommand = strdup(mxmlElementGetAttr(node, ATTR_CAPTURE_COMMAND));
81 if (mxmlElementGetAttr(node, ATTR_CAPTURE_USER)) gSessionData->mCaptureUser = strdup(mxmlElementGetAttr(node, ATTR_CAPTURE_USER));
Jon Medhurstaaf37a32013-06-11 12:10:56 +010082
83 // integers/bools
84 parameters.call_stack_unwinding = util->stringToBool(mxmlElementGetAttr(node, ATTR_CALL_STACK_UNWINDING), false);
Jon Medhurst96b56152014-10-30 18:01:15 +000085 if (mxmlElementGetAttr(node, ATTR_DURATION)) gSessionData->mDuration = strtol(mxmlElementGetAttr(node, ATTR_DURATION), NULL, 10);
Jon Medhurstaaf37a32013-06-11 12:10:56 +010086 if (mxmlElementGetAttr(node, ATTR_LIVE_RATE)) parameters.live_rate = strtol(mxmlElementGetAttr(node, ATTR_LIVE_RATE), NULL, 10);
87
88 // parse subtags
89 node = mxmlGetFirstChild(node);
90 while (node) {
91 if (mxmlGetType(node) != MXML_ELEMENT) {
92 node = mxmlWalkNext(node, tree, MXML_NO_DESCEND);
93 continue;
94 }
95 if (strcmp(TAG_IMAGE, mxmlGetElement(node)) == 0) {
96 sessionImage(node);
97 }
98 node = mxmlWalkNext(node, tree, MXML_NO_DESCEND);
99 }
100}
101
102void SessionXML::sessionImage(mxml_node_t *node) {
103 int length = strlen(mxmlElementGetAttr(node, ATTR_PATH));
104 struct ImageLinkList *image;
105
106 image = (struct ImageLinkList *)malloc(sizeof(struct ImageLinkList));
107 image->path = (char*)malloc(length + 1);
108 image->path = strdup(mxmlElementGetAttr(node, ATTR_PATH));
Jon Medhurst96b56152014-10-30 18:01:15 +0000109 image->next = gSessionData->mImages;
110 gSessionData->mImages = image;
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100111}