/* */ #include "ShaVisitor.h" #include "Util.h" ShaVisitor::ShaVisitor() { ctx.trySetAlgo("sha1"); ctx.digestInit(); } ShaVisitor::~ShaVisitor() {} void ShaVisitor::visit(const Data* d) { if(d->isNumber()) { ctx.digestUpdate("i", 1); } else { string lenStr = Util::llitos(d->getLen()); ctx.digestUpdate(lenStr.c_str(), lenStr.size()); ctx.digestUpdate(":", 1); } ctx.digestUpdate(d->getData(), d->getLen()); if(d->isNumber()) { ctx.digestUpdate("e", 1); } } void ShaVisitor::visit(const Dictionary* d) { ctx.digestUpdate("d", 1); const Order& v = d->getOrder(); for(Order::const_iterator itr = v.begin(); itr != v.end(); itr++) { string lenStr = Util::llitos(itr->size()); ctx.digestUpdate(lenStr.c_str(), lenStr.size()); ctx.digestUpdate(":", 1); ctx.digestUpdate(itr->c_str(), itr->size()); const MetaEntry* e = d->get(*itr); this->visit(e); } ctx.digestUpdate("e", 1); } void ShaVisitor::visit(const List* l) { ctx.digestUpdate("l", 1); for(MetaList::const_iterator itr = l->getList().begin(); itr != l->getList().end(); itr++) { this->visit(*itr); } ctx.digestUpdate("e", 1); } void ShaVisitor::visit(const MetaEntry* e) { if(dynamic_cast(e) != NULL) { visit((const Data*)e); } else if(dynamic_cast(e) != NULL) { visit((const Dictionary*)e); } else if(dynamic_cast(e) != NULL) { visit((const List*)e); } } void ShaVisitor::getHash(unsigned char* hashValue, int& len) { len = ctx.digestLength(); ctx.digestFinal(hashValue); }