diff options
Diffstat (limited to 'drivers/gator/daemon/CapturedXML.cpp')
-rw-r--r-- | drivers/gator/daemon/CapturedXML.cpp | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/drivers/gator/daemon/CapturedXML.cpp b/drivers/gator/daemon/CapturedXML.cpp new file mode 100644 index 00000000000..51076dd4871 --- /dev/null +++ b/drivers/gator/daemon/CapturedXML.cpp @@ -0,0 +1,97 @@ +/** + * 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() { +} + +const char* CapturedXML::getXML() { + bool perfCounters = false; + int x; + + clearXmlString(); + xmlHeader(); + + for (x=0; x<MAX_PERFORMANCE_COUNTERS; x++) { + if (gSessionData->mPerfCounterEnabled[x]) { + perfCounters = true; + break; + } + } + + startElement("captured"); + attributeInt("version", 1); + attributeInt("protocol", 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) + attributeUInt("created", time(NULL)); // Valid until the year 2038 + } + attributeUInt("bytes", gSessionData->mBytes); + } + startElement("target"); + attributeString("name", gSessionData->mCoreName); + attributeInt("sample_rate", gSessionData->mSampleRate); + attributeInt("cores", gSessionData->mCores); + endElement("target"); + if (perfCounters) { + startElement("counters"); + for (x = 0; x < MAX_PERFORMANCE_COUNTERS; x++) { + if (gSessionData->mPerfCounterEnabled[x]) { + startElement("counter"); + attributeString("title", gSessionData->mPerfCounterTitle[x]); + attributeString("name", gSessionData->mPerfCounterName[x]); + attributeHex8("color", gSessionData->mPerfCounterColor[x]); + attributeHex8("key", gSessionData->mPerfCounterKey[x]); + attributeString("type", gSessionData->mPerfCounterType[x]); + attributeHex8("event", gSessionData->mPerfCounterEvent[x]); + if (gSessionData->mPerfCounterPerCPU[x]) { + attributeBool("per_cpu", true); + } + if (strlen(gSessionData->mPerfCounterOperation[x]) > 0) { + attributeString("operation", gSessionData->mPerfCounterOperation[x]); + } + if (gSessionData->mPerfCounterCount[x] > 0) { + attributeInt("count", gSessionData->mPerfCounterCount[x]); + } + attributeString("description", gSessionData->mPerfCounterDescription[x]); + endElement("counter"); + } + } + endElement("counters"); + } + endElement("captured"); + return getXmlString(); +} + +void CapturedXML::write(char* path) { + char* file = (char*)malloc(PATH_MAX); + + // Set full path + snprintf(file, PATH_MAX, "%s/captured.xml", path); + + // Write the file + const char* xml = getXML(); + if (util->writeToDisk(file, xml) < 0) { + logg->logError(__FILE__, __LINE__, "Error writing %s\nPlease verify the path.", file); + handleException(); + } + + free(file); +} |