/** @brief determines if entry can satisfy interest * @param hash SHA256 hash of PublisherPublicKeyLocator if exists in interest, otherwise ignored */ static bool matchesSimpleSelectors(const Interest& interest, ndn::ConstBufferPtr& hash, const Index::Entry& entry) { const Name& fullName = entry.getName(); if (!interest.getName().isPrefixOf(fullName)) return false; size_t nSuffixComponents = fullName.size() - interest.getName().size(); if (interest.getMinSuffixComponents() >= 0 && nSuffixComponents < static_cast<size_t>(interest.getMinSuffixComponents())) return false; if (interest.getMaxSuffixComponents() >= 0 && nSuffixComponents > static_cast<size_t>(interest.getMaxSuffixComponents())) return false; if (!interest.getExclude().empty() && entry.getName().size() > interest.getName().size() && interest.getExclude().isExcluded(entry.getName()[interest.getName().size()])) { return false; } if (!interest.getPublisherPublicKeyLocator().empty()) { if (*entry.getKeyLocatorHash() != *hash) return false; } return true; }
shared_ptr<Data> StorageEngineImpl::read(const Interest &interest) { shared_ptr<Data> data; #if HAVE_PERSISTENT_STORAGE bool canBePrefix = interest.getCanBePrefix(); if (canBePrefix) { // extract by prefix match Name prefix = interest.getName(), keyName; auto it = db_->NewIterator(db_namespace::ReadOptions()); std::string key = ""; bool checkMaxSuffixComponents = interest.getMaxSuffixComponents() != -1; bool checkMinSuffixComponents = interest.getMinSuffixComponents() != -1; for (it->Seek(prefix.toUri()); it->Valid() && it->key().starts_with(prefix.toUri()); it->Next()) { if (checkMaxSuffixComponents || checkMinSuffixComponents) { keyName = Name(it->key().ToString()); int nSuffixComponents = keyName.size() - prefix.size(); bool passCheck = false; if (checkMaxSuffixComponents && nSuffixComponents <= interest.getMaxSuffixComponents()) passCheck = true; if (checkMinSuffixComponents && nSuffixComponents >= interest.getMinSuffixComponents()) passCheck = true; if (passCheck) key = it->key().ToString(); } else key = it->key().ToString(); } if (key != "") data = get(Name(key)); delete it; } else data = get(interest.getName()); #endif return data; }
static vector<string> dumpInterest(const Interest& interest) { vector<string> result; result.push_back(dump("name:", interest.getName().toUri())); result.push_back(dump("minSuffixComponents:", interest.getMinSuffixComponents() >= 0 ? toString(interest.getMinSuffixComponents()) : "<none>")); result.push_back(dump("maxSuffixComponents:", interest.getMaxSuffixComponents() >= 0 ? toString(interest.getMaxSuffixComponents()) : "<none>")); if ((int)interest.getKeyLocator().getType() >= 0) { if (interest.getKeyLocator().getType() == ndn_KeyLocatorType_KEY_LOCATOR_DIGEST) result.push_back(dump("keyLocator: KeyLocatorDigest:", interest.getKeyLocator().getKeyData().toHex())); else if (interest.getKeyLocator().getType() == ndn_KeyLocatorType_KEYNAME) result.push_back(dump("keyLocator: KeyName:", interest.getKeyLocator().getKeyName().toUri())); else result.push_back(dump("keyLocator: <unrecognized KeyLocatorType")); } else result.push_back(dump("keyLocator: <none>")); result.push_back(dump("exclude:", interest.getExclude().size() > 0 ? interest.getExclude().toUri() : "<none>")); result.push_back(dump("childSelector:", interest.getChildSelector() >= 0 ? toString(interest.getChildSelector()) : "<none>")); result.push_back(dump("mustBeFresh:", interest.getMustBeFresh() ? "True" : "False")); result.push_back(dump("nonce:", interest.getNonce().size() == 0 ? "<none>" : interest.getNonce().toHex())); result.push_back(dump("lifetimeMilliseconds:", interest.getInterestLifetimeMilliseconds() < 0 ? "<none>" : toString(interest.getInterestLifetimeMilliseconds()))); return result; };
static void dumpInterest(const Interest& interest) { cout << "name: " << interest.getName().toUri() << endl; cout << "minSuffixComponents: "; if (interest.getMinSuffixComponents() >= 0) cout << interest.getMinSuffixComponents() << endl; else cout << "<none>" << endl; cout << "maxSuffixComponents: "; if (interest.getMaxSuffixComponents() >= 0) cout << interest.getMaxSuffixComponents() << endl; else cout << "<none>" << endl; cout << "keyLocator: "; if ((int)interest.getKeyLocator().getType() >= 0) { if (interest.getKeyLocator().getType() == ndn_KeyLocatorType_KEY_LOCATOR_DIGEST) cout << "KeyLocatorDigest: " << interest.getKeyLocator().getKeyData().toHex() << endl; else if (interest.getKeyLocator().getType() == ndn_KeyLocatorType_KEYNAME) cout << "KeyName: " << interest.getKeyLocator().getKeyName().toUri() << endl; else cout << "<unrecognized ndn_KeyLocatorType " << interest.getKeyLocator().getType() << ">" << endl; } else cout << "<none>" << endl; cout << "exclude: " << (interest.getExclude().size() > 0 ? interest.getExclude().toUri() : "<none>") << endl; cout << "lifetimeMilliseconds: "; if (interest.getInterestLifetimeMilliseconds() >= 0) cout << interest.getInterestLifetimeMilliseconds() << endl; else cout << "<none>" << endl; cout << "childSelector: "; if (interest.getChildSelector() >= 0) cout << interest.getChildSelector() << endl; else cout << "<none>" << endl; cout << "mustBeFresh: " << (interest.getMustBeFresh() ? "true" : "false") << endl; cout << "nonce: " << (interest.getNonce().size() > 0 ? interest.getNonce().toHex() : "<none>") << endl; }