summaryrefslogtreecommitdiff
path: root/tools/gator/daemon/CapturedXML.cpp
blob: f02ed2a0155192bfb5d36a1608e38eb499967238 (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
112
113
114
115
116
117
118
119
120
121
122
123
/**
 * 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 <stdlib.h>
#include <string.h>
#include <dirent.h>
#include "SessionData.h"
#include "CapturedXML.h"
#include "Logging.h"
#include "OlyUtility.h"

extern void handleException();

CapturedXML::CapturedXML() {
}

CapturedXML::~CapturedXML() {
}

mxml_node_t* CapturedXML::getTree() {
	bool perfCounters = false;
	mxml_node_t *xml;
    mxml_node_t *captured;
    mxml_node_t *target;
    mxml_node_t *counters;
	mxml_node_t *counter;
	int x;

	for (x=0; x<MAX_PERFORMANCE_COUNTERS; x++) {
		if (gSessionData->mPerfCounterEnabled[x]) {
			perfCounters = true;
			break;
		}
	}

	xml = mxmlNewXML("1.0");

	captured = mxmlNewElement(xml, "captured");
	mxmlElementSetAttr(captured, "version", "1");
	mxmlElementSetAttrf(captured, "protocol", "%d", PROTOCOL_VERSION);
	if (gSessionData->mBytes > 0) { // Send the following only after the capture is complete
		if (time(NULL) > 1267000000) { // If the time is reasonable (after Feb 23, 2010)
			mxmlElementSetAttrf(captured, "created", "%lu", time(NULL)); // Valid until the year 2038
		}
		mxmlElementSetAttrf(captured, "bytes", "%d", gSessionData->mBytes);
	}

	target = mxmlNewElement(captured, "target");
	mxmlElementSetAttr(target, "name", gSessionData->mCoreName);
	mxmlElementSetAttrf(target, "sample_rate", "%d", gSessionData->mSampleRate);
	mxmlElementSetAttrf(target, "cores", "%d", gSessionData->mCores);

	if (perfCounters) {
		counters = mxmlNewElement(captured, "counters");
		for (x = 0; x < MAX_PERFORMANCE_COUNTERS; x++) {
			if (gSessionData->mPerfCounterEnabled[x]) {
				counter = mxmlNewElement(counters, "counter");
				mxmlElementSetAttr(counter, "title", gSessionData->mPerfCounterTitle[x]);
				mxmlElementSetAttr(counter, "name", gSessionData->mPerfCounterName[x]);
				mxmlElementSetAttrf(counter, "color", "0x%08x", gSessionData->mPerfCounterColor[x]);
				mxmlElementSetAttrf(counter, "key", "0x%08x", gSessionData->mPerfCounterKey[x]);
				mxmlElementSetAttr(counter, "type", gSessionData->mPerfCounterType[x]);
				mxmlElementSetAttrf(counter, "event", "0x%08x", gSessionData->mPerfCounterEvent[x]);
				if (gSessionData->mPerfCounterPerCPU[x]) {
					mxmlElementSetAttr(counter, "per_cpu", "yes");
				}
				if (strlen(gSessionData->mPerfCounterOperation[x]) > 0) {
					mxmlElementSetAttr(counter, "operation", gSessionData->mPerfCounterOperation[x]);
				}
				if (gSessionData->mPerfCounterCount[x] > 0) {
					mxmlElementSetAttrf(counter, "count", "%d", gSessionData->mPerfCounterCount[x]);
				}
				if (gSessionData->mPerfCounterLevel[x]) {
					mxmlElementSetAttr(counter, "level", "yes");
				}
				if (strlen(gSessionData->mPerfCounterAlias[x]) > 0) {
					mxmlElementSetAttr(counter, "alias", gSessionData->mPerfCounterAlias[x]);
				}
				if (strlen(gSessionData->mPerfCounterDisplay[x]) > 0) {
					mxmlElementSetAttr(counter, "display", gSessionData->mPerfCounterDisplay[x]);
				}
				if (strlen(gSessionData->mPerfCounterUnits[x]) > 0) {
					mxmlElementSetAttr(counter, "units", gSessionData->mPerfCounterUnits[x]);
				}
				if (gSessionData->mPerfCounterAverageSelection[x]) {
					mxmlElementSetAttr(counter, "average_selection", "yes");
				}
				mxmlElementSetAttr(counter, "description", gSessionData->mPerfCounterDescription[x]);
			}
		}
	}

	return xml;
}

char* CapturedXML::getXML() {
	char* xml_string;
	mxml_node_t *xml = getTree();
	xml_string = mxmlSaveAllocString(xml, mxmlWhitespaceCB);
	mxmlDelete(xml);
	return xml_string;
}

void CapturedXML::write(char* path) {
	char *file = (char*)malloc(PATH_MAX);

	// Set full path
	snprintf(file, PATH_MAX, "%s/captured.xml", path);
	
	char* xml = getXML();
	if (util->writeToDisk(file, xml) < 0) {
		logg->logError(__FILE__, __LINE__, "Error writing %s\nPlease verify the path.", file);
		handleException();
	}

	free(xml);
	free(file);
}