Memory snapshot data structure

This commit is contained in:
Nav
2022-12-24 02:40:00 +00:00
parent fe6e5379ff
commit 59776f1a0e
3 changed files with 154 additions and 0 deletions

View File

@@ -79,6 +79,7 @@ target_sources(
${CMAKE_CURRENT_SOURCE_DIR}/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegion.cpp
${CMAKE_CURRENT_SOURCE_DIR}/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/FocusedMemoryRegion.cpp
${CMAKE_CURRENT_SOURCE_DIR}/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/ExcludedMemoryRegion.cpp
${CMAKE_CURRENT_SOURCE_DIR}/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemorySnapshot.cpp
# Memory region manager window
${CMAKE_CURRENT_SOURCE_DIR}/UserInterfaces/InsightWindow/Widgets/TargetMemoryInspectionPane/MemoryRegionManager/MemoryRegionManagerWindow.cpp

View File

@@ -0,0 +1,97 @@
#include "MemorySnapshot.hpp"
#include <QByteArray>
#include <QJsonArray>
#include "src/Helpers/EnumToStringMappings.hpp"
#include "src/Exceptions/Exception.hpp"
namespace Bloom
{
MemorySnapshot::MemorySnapshot(
const QString& name,
const QString& description,
Targets::TargetMemoryType memoryType,
const Targets::TargetMemoryBuffer& data,
Targets::TargetProgramCounter programCounter,
const std::vector<FocusedMemoryRegion>& focusedRegions,
const std::vector<ExcludedMemoryRegion>& excludedRegions
)
: name(name)
, description(description)
, memoryType(memoryType)
, data(data)
, programCounter(programCounter)
, focusedRegions(focusedRegions)
, excludedRegions(excludedRegions)
{}
MemorySnapshot::MemorySnapshot(const QJsonObject& jsonObject) {
using Exceptions::Exception;
if (
!jsonObject.contains("id")
|| !jsonObject.contains("name")
|| !jsonObject.contains("description")
|| !jsonObject.contains("memoryType")
|| !jsonObject.contains("hexData")
|| !jsonObject.contains("programCounter")
|| !jsonObject.contains("createdTimestamp")
|| !jsonObject.contains("focusedRegions")
|| !jsonObject.contains("excludedRegions")
) {
throw Exception("Missing data");
}
this->id = jsonObject.find("id")->toString();
this->name = jsonObject.find("name")->toString();
this->description = jsonObject.find("description")->toString();
this->memoryType = EnumToStringMappings::targetMemoryTypes.at(jsonObject.find("memoryType")->toString());
this->programCounter = static_cast<Targets::TargetProgramCounter>(jsonObject.find("programCounter")->toInteger());
this->createdDate.setSecsSinceEpoch(jsonObject.find("createdTimestamp")->toInteger());
const auto hexData = QByteArray::fromHex(jsonObject.find("hexData")->toString().toUtf8());
this->data = Targets::TargetMemoryBuffer(hexData.begin(), hexData.end());
// TODO: Memory regions
}
QJsonObject MemorySnapshot::toJson() const {
auto focusedRegions = QJsonArray();
for (const auto& focusedRegion : this->focusedRegions) {
focusedRegions.push_back(focusedRegion.toJson());
}
auto excludedRegions = QJsonArray();
for (const auto& excludedRegion : this->excludedRegions) {
excludedRegions.push_back(excludedRegion.toJson());
}
return QJsonObject({
{"id", this->id},
{"name", this->name},
{"description", this->description},
{"memoryType", EnumToStringMappings::targetMemoryTypes.at(this->memoryType)},
{"hexData", QString(QByteArray(
reinterpret_cast<const char*>(this->data.data()),
static_cast<qsizetype>(this->data.size())
).toHex())},
{"programCounter", static_cast<qint64>(this->programCounter)},
{"createdTimestamp", this->createdDate.toSecsSinceEpoch()},
{"focusedRegions", focusedRegions},
{"excludedRegions", excludedRegions},
});
}
bool MemorySnapshot::isCompatible(const Targets::TargetMemoryDescriptor& memoryDescriptor) const {
if (this->memoryType != memoryDescriptor.type) {
return false;
}
if (this->data.size() != memoryDescriptor.size()) {
return false;
}
return true;
}
}

View File

@@ -0,0 +1,56 @@
#pragma once
#include <cstdint>
#include <QString>
#include <utility>
#include <vector>
#include <QUuid>
#include <QJsonObject>
#include "src/Targets/TargetMemory.hpp"
#include "src/Helpers/DateTime.hpp"
#include "FocusedMemoryRegion.hpp"
#include "ExcludedMemoryRegion.hpp"
namespace Bloom
{
struct MemorySnapshot
{
public:
QString id = QUuid::createUuid().toString(QUuid::StringFormat::WithoutBraces);
QString name;
QString description;
Targets::TargetMemoryType memoryType;
Targets::TargetMemoryBuffer data;
Targets::TargetProgramCounter programCounter;
QDateTime createdDate = DateTime::currentDateTime();
std::vector<FocusedMemoryRegion> focusedRegions;
std::vector<ExcludedMemoryRegion> excludedRegions;
MemorySnapshot(
const QString& name,
const QString& description,
Targets::TargetMemoryType memoryType,
const Targets::TargetMemoryBuffer& data,
Targets::TargetProgramCounter programCounter,
const std::vector<FocusedMemoryRegion>& focusedRegions,
const std::vector<ExcludedMemoryRegion>& excludedRegions
);
MemorySnapshot(const QJsonObject& jsonObject);
QJsonObject toJson() const;
bool isCompatible(const Targets::TargetMemoryDescriptor& memoryDescriptor) const;
virtual ~MemorySnapshot() = default;
MemorySnapshot(const MemorySnapshot& other) = default;
MemorySnapshot(MemorySnapshot&& other) = default;
MemorySnapshot& operator = (const MemorySnapshot& other) = default;
MemorySnapshot& operator = (MemorySnapshot&& other) = default;
};
}