aboutsummaryrefslogtreecommitdiff
path: root/daemon/SessionXML.cpp
blob: dea4c8f299ecc1d8661654b41153b67533a74fae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/**
 * Copyright (C) ARM Limited 2010-2014. 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 "SessionXML.h"

#include <string.h>
#include <stdlib.h>
#include <limits.h>

#include "Logging.h"
#include "OlyUtility.h"
#include "SessionData.h"

static const char *TAG_SESSION = "session";
static const char *TAG_IMAGE   = "image";

static const char *ATTR_VERSION              = "version";
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_DURATION             = "duration";
static const char *ATTR_PATH                 = "path";
static const char *ATTR_LIVE_RATE            = "live_rate";
static const char *ATTR_CAPTURE_WORKING_DIR  = "capture_working_dir";
static const char *ATTR_CAPTURE_COMMAND      = "capture_command";
static const char *ATTR_CAPTURE_USER         = "capture_user";

SessionXML::SessionXML(const char *str) {
	parameters.buffer_mode[0] = 0;
	parameters.sample_rate[0] = 0;
	parameters.call_stack_unwinding = false;
	parameters.live_rate = 0;
	mSessionXML = str;
	logg->logMessage(mSessionXML);
}

SessionXML::~SessionXML() {
}

void SessionXML::parse() {
	mxml_node_t *tree;
	mxml_node_t *node;

	tree = mxmlLoadString(NULL, mSessionXML, MXML_NO_CALLBACK);
	node = mxmlFindElement(tree, tree, TAG_SESSION, NULL, NULL, MXML_DESCEND);

	if (node) {
		sessionTag(tree, node);
		mxmlDelete(tree);
		return;
	}

	logg->logError(__FILE__, __LINE__, "No session tag found in the session.xml file");
	handleException();
}

void SessionXML::sessionTag(mxml_node_t *tree, mxml_node_t *node) {
	int version = 0;
	if (mxmlElementGetAttr(node, ATTR_VERSION)) version = strtol(mxmlElementGetAttr(node, ATTR_VERSION), NULL, 10);
	if (version != 1) {
		logg->logError(__FILE__, __LINE__, "Invalid session.xml version: %d", version);
		handleException();
	}

	// copy to pre-allocated strings
	if (mxmlElementGetAttr(node, ATTR_BUFFER_MODE)) {
		strncpy(parameters.buffer_mode, mxmlElementGetAttr(node, ATTR_BUFFER_MODE), sizeof(parameters.buffer_mode));
		parameters.buffer_mode[sizeof(parameters.buffer_mode) - 1] = 0; // strncpy does not guarantee a null-terminated string
	}
	if (mxmlElementGetAttr(node, ATTR_SAMPLE_RATE)) {
		strncpy(parameters.sample_rate, mxmlElementGetAttr(node, ATTR_SAMPLE_RATE), sizeof(parameters.sample_rate));
		parameters.sample_rate[sizeof(parameters.sample_rate) - 1] = 0; // strncpy does not guarantee a null-terminated string
	}
	if (mxmlElementGetAttr(node, ATTR_CAPTURE_WORKING_DIR)) gSessionData->mCaptureWorkingDir = strdup(mxmlElementGetAttr(node, ATTR_CAPTURE_WORKING_DIR));
	if (mxmlElementGetAttr(node, ATTR_CAPTURE_COMMAND)) gSessionData->mCaptureCommand = strdup(mxmlElementGetAttr(node, ATTR_CAPTURE_COMMAND));
	if (mxmlElementGetAttr(node, ATTR_CAPTURE_USER)) gSessionData->mCaptureUser = strdup(mxmlElementGetAttr(node, ATTR_CAPTURE_USER));

	// integers/bools
	parameters.call_stack_unwinding = util->stringToBool(mxmlElementGetAttr(node, ATTR_CALL_STACK_UNWINDING), false);
	if (mxmlElementGetAttr(node, ATTR_DURATION)) gSessionData->mDuration = strtol(mxmlElementGetAttr(node, ATTR_DURATION), NULL, 10);
	if (mxmlElementGetAttr(node, ATTR_LIVE_RATE)) parameters.live_rate = strtol(mxmlElementGetAttr(node, ATTR_LIVE_RATE), NULL, 10);

	// parse subtags
	node = mxmlGetFirstChild(node);
	while (node) {
		if (mxmlGetType(node) != MXML_ELEMENT) {
			node = mxmlWalkNext(node, tree, MXML_NO_DESCEND);
			continue;
		}
		if (strcmp(TAG_IMAGE, mxmlGetElement(node)) == 0) {
			sessionImage(node);
		}
		node = mxmlWalkNext(node, tree, MXML_NO_DESCEND);
	}
}

void SessionXML::sessionImage(mxml_node_t *node) {
	int length = strlen(mxmlElementGetAttr(node, ATTR_PATH));
	struct ImageLinkList *image;

	image = (struct ImageLinkList *)malloc(sizeof(struct ImageLinkList));
	image->path = (char*)malloc(length + 1);
	image->path = strdup(mxmlElementGetAttr(node, ATTR_PATH));
	image->next = gSessionData->mImages;
	gSessionData->mImages = image;
}