#include "InformationManager.hxx"
#include "disassembler/llvm/LLVMDisassembler.hxx"
+#include "core/Function.hxx"
+#include "core/BasicBlock.hxx"
-#include <iostream>
+#include "gui/qt.hxx"
+#include <quazip/quazip.h>
+#include <quazip/quazipfile.h>
void InformationManager::reset(const std::string& filename) {
- disassembler.reset(new LLVMDisassembler(filename, this));
- disassembler.get()->start();
+ disassembler.reset(createLLVMDisassembler(filename, this));
+ if (disassembler.get() != NULL)
+ disassembler.get()->start();
+}
+
+void InformationManager::save(const QString& filename) {
+ QuaZip zip(filename);
+ zip.open(QuaZip::mdCreate);
+ zip.setComment("FRIDA 0.0");
+ QuaZipFile outZipFile(&zip);
+
+ for (Function* fun : functions) {
+ QuaZipNewInfo zipinfo(fun->getName().c_str());
+ zipinfo.setPermissions(static_cast<QFile::Permissions>(0x6444));
+ outZipFile.open(QIODevice::WriteOnly, zipinfo);
+ QXmlStreamWriter stream(&outZipFile);
+ stream.setAutoFormatting(true);
+ stream.setAutoFormattingIndent(-1);
+ stream.writeStartDocument();
+ stream.writeStartElement("function");
+ stream.writeAttribute("name", fun->getName().c_str());
+ stream.writeAttribute("entry", QString::number(fun->getStartAddress(), 16));
+
+ for (auto& blockentry : fun->blocks()) {
+ stream.writeStartElement("block");
+ stream.writeAttribute("id", blockentry.second->getName().c_str());
+ stream.writeTextElement("start", QString::number(blockentry.second->getStartAddress(), 16));
+ stream.writeTextElement("end", QString::number(blockentry.second->getEndAddress(), 16));
+ if (0 != blockentry.second->getNextBlock(0))
+ stream.writeTextElement("next", QString::number(blockentry.second->getNextBlock(0), 16));
+ if (0 != blockentry.second->getNextBlock(1))
+ stream.writeTextElement("next", QString::number(blockentry.second->getNextBlock(1), 16));
+ stream.writeEndElement(); // "block"
+ }
+
+ stream.writeEndElement(); // "function"
+ stream.writeEndDocument();
+ outZipFile.close();
+ }
+
+ zip.close();
}