#include "core/Function.hxx"
#include "core/BasicBlock.hxx"
#include "core/Comment.hxx"
+#include "core/events/NewFunctionEvent.hxx"
+#include "core/events/ChangeCommentEvent.hxx"
#include "gui/qt.hxx"
#include <quazip/quazip.h>
zip.close();
}
-void InformationManager::signal_new_function(Function* fun) {
-}
-
-
/* *******************************
* Accessors for the Functions map
return blocks.end();
}
+/* *********************************
+ * Accessors for the Comments map
+ */
+std::pair<
+ std::multimap<uint64_t, Comment*>::const_iterator,
+ std::multimap<uint64_t, Comment*>::const_iterator>
+InformationManager::getComments(uint64_t address) {
+ return comments.equal_range(address);
+}
+
+std::multimap<uint64_t, Comment*>::const_iterator InformationManager::beginComments() {
+ return comments.begin();
+}
+std::multimap<uint64_t, Comment*>::const_iterator InformationManager::endComments() {
+ return comments.end();
+}
/* *********************************
* Accessors for the Interpreter map
*/
Function* InformationManager::newFunction(uint64_t address) {
- Function* fun = new Function(address, this);
+ Function* fun = new Function(address, false, this);
+ functions.insert(std::make_pair(address, fun));
+ return fun;
+}
+
+Function* InformationManager::newDynamicFunction(uint64_t address) {
+ Function* fun = new Function(address, true, this);
functions.insert(std::make_pair(address, fun));
return fun;
}
}
Comment* InformationManager::newGlobalComment(uint64_t address) {
- return NULL;
+ Comment* comment = new Comment(address, this);
+ comments.insert(std::make_pair(address, comment));
+ return comment;
}
Comment* InformationManager::newLocalComment(uint64_t address, Function* f) {
- return NULL;
+ Comment* comment = new Comment(address, f, this);
+ comments.insert(std::make_pair(address, comment));
+ return comment;
}
void InformationManager::finishFunction(Function* fun) {
BasicBlock* bl = b.second;
blocks.insert(std::make_pair(bl->getStartAddress(), bl));
}
- new_function_signal(fun);
+ NewFunctionEvent event(fun->getStartAddress(), fun);
+ dispatch(&event);
}
-void InformationManager::finishBasicBlock(BasicBlock* b) {
+void InformationManager::finishBasicBlock(BasicBlock*) {
}
-void InformationManager::finnishComment(Comment* c) {
+void InformationManager::finishComment(Comment* c) {
+ LOG4CXX_DEBUG(logger, "Finishing comment " << c->getAddress());
+ ChangeCommentEvent event(c->getAddress(), c->getLocation(), c);
+ dispatch(&event);
}
void InformationManager::deleteFunction(Function* f) {
}
void InformationManager::deleteComment(Comment* c) {
+ auto range = comments.equal_range(c->getAddress());
+ for (auto it = range.first; it != range.second; ++it) {
+ if (it->second == c) {
+ comments.erase(it);
+ break;
+ }
+ }
delete c;
}