model: Slight modification with wire format processing
Now it is possible to convert Name from/to wire format via ndn::Face
helper method (since Face is getting configured with specific wire
format)
Refs #1008 (http://redmine.named-data.net/issues/1008)
diff --git a/model/wire/ccnb/ccnb-parser/visitors/name-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/name-visitor.cc
index 13043d3..965b320 100644
--- a/model/wire/ccnb/ccnb-parser/visitors/name-visitor.cc
+++ b/model/wire/ccnb/ccnb-parser/visitors/name-visitor.cc
@@ -50,8 +50,7 @@
)));
break;
default:
- // ignore any other components
- // when parsing Exclude, there could be <Any /> and <Bloom /> tags
+ VoidDepthFirstVisitor::visit (n, param);
break;
}
}
diff --git a/model/wire/ccnb/wire-ccnb-data.cc b/model/wire/ccnb/wire-ccnb-data.cc
index 767d57b..0770c3d 100644
--- a/model/wire/ccnb/wire-ccnb-data.cc
+++ b/model/wire/ccnb/wire-ccnb-data.cc
@@ -194,8 +194,8 @@
Ccnb::AppendCloser (start); // </Signature>
Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Name, CcnbParser::CCN_DTAG); // <Name>
- Ccnb::AppendName (start, m_data->GetName()); // <Component>...</Component>...
- Ccnb::AppendCloser (start); // </Name>
+ Ccnb::SerializeName (start, m_data->GetName()); // <Component>...</Component>...
+ Ccnb::AppendCloser (start); // </Name>
// fake signature
Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_SignedInfo, CcnbParser::CCN_DTAG); // <SignedInfo>
@@ -234,7 +234,7 @@
Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_KeyName, CcnbParser::CCN_DTAG); // <KeyName>
{
Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Name, CcnbParser::CCN_DTAG); // <Name>
- Ccnb::AppendName (start, *m_data->GetKeyLocator ()); // <Component>...</Component>...
+ Ccnb::SerializeName (start, *m_data->GetKeyLocator ()); // <Component>...</Component>...
Ccnb::AppendCloser (start); // </Name>
}
Ccnb::AppendCloser (start); // </KeyName>
@@ -270,7 +270,7 @@
written += 1; // </Signature>
written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Name); // <Name>
- written += Ccnb::EstimateName (m_data->GetName ()); // <Component>...</Component>...
+ written += Ccnb::SerializedSizeName (m_data->GetName ()); // <Component>...</Component>...
written += 1; // </Name>
// fake signature
@@ -307,7 +307,7 @@
written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_KeyName); // <KeyName>
{
written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Name); // <Name>
- written += Ccnb::EstimateName (*m_data->GetKeyLocator ()); // <Component>...</Component>...
+ written += Ccnb::SerializedSizeName (*m_data->GetKeyLocator ()); // <Component>...</Component>...
written += 1; // </Name>
}
written += 1; // </KeyName>
@@ -353,11 +353,7 @@
{
// process name components
Ptr<Name> name = Create<Name> ();
-
- BOOST_FOREACH (Ptr<CcnbParser::Block> block, n.m_nestedTags)
- {
- block->accept (nameVisitor, &(*name));
- }
+ n.accept (nameVisitor, GetPointer (name));
contentObject.SetName (name);
break;
}
@@ -454,17 +450,9 @@
if (n.m_nestedTags.size ()!=1) // should be exactly one nested tag
throw CcnbParser::CcnbDecodingException ();
- Ptr<CcnbParser::BaseTag> nameTag = DynamicCast<CcnbParser::BaseTag>(n.m_nestedTags.front ());
- if (nameTag == 0)
- throw CcnbParser::CcnbDecodingException ();
-
// process name components
Ptr<Name> name = Create<Name> ();
-
- BOOST_FOREACH (Ptr<CcnbParser::Block> block, nameTag->m_nestedTags)
- {
- block->accept (nameVisitor, &(*name));
- }
+ n.accept (nameVisitor, GetPointer (name));
contentObject.SetKeyLocator (name);
break;
}
diff --git a/model/wire/ccnb/wire-ccnb-interest.cc b/model/wire/ccnb/wire-ccnb-interest.cc
index 8a0ec3b..8d622a4 100644
--- a/model/wire/ccnb/wire-ccnb-interest.cc
+++ b/model/wire/ccnb/wire-ccnb-interest.cc
@@ -116,7 +116,7 @@
Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Interest, CcnbParser::CCN_DTAG); // <Interest>
Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Name, CcnbParser::CCN_DTAG); // <Name>
- Ccnb::AppendName (start, m_interest->GetName()); // <Component>...</Component>...
+ Ccnb::SerializeName (start, m_interest->GetName()); // <Component>...</Component>...
Ccnb::AppendCloser (start); // </Name>
// if (m_interest->GetMinSuffixComponents() >= 0)
@@ -183,7 +183,7 @@
written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Interest); // <Interest>
written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Name); // <Name>
- written += Ccnb::EstimateName (m_interest->GetName()); // <Component>...</Component>...
+ written += Ccnb::SerializedSizeName (m_interest->GetName()); // <Component>...</Component>...
written += 1; // </Name>
// if (m_interest->GetMinSuffixComponents() >= 0)
@@ -281,11 +281,7 @@
// process name components
Ptr<Name> name = Create<Name> ();
-
- BOOST_FOREACH (Ptr<CcnbParser::Block> block, n.m_nestedTags)
- {
- block->accept (nameVisitor, &(*name));
- }
+ n.accept (nameVisitor, GetPointer (name));
interest.SetName (name);
break;
}
diff --git a/model/wire/ccnb/wire-ccnb.cc b/model/wire/ccnb/wire-ccnb.cc
index 4f4f695..9033d3f 100644
--- a/model/wire/ccnb/wire-ccnb.cc
+++ b/model/wire/ccnb/wire-ccnb.cc
@@ -23,6 +23,8 @@
#include <sstream>
#include <boost/foreach.hpp>
#include "ccnb-parser/common.h"
+#include "ccnb-parser/visitors/name-visitor.h"
+#include "ccnb-parser/syntax-tree/block.h"
NDN_NAMESPACE_BEGIN
@@ -99,29 +101,6 @@
}
size_t
-Ccnb::AppendName (Buffer::Iterator &start, const Name &name)
-{
- size_t written = 0;
- BOOST_FOREACH (const std::string &component, name.GetComponents())
- {
- written += AppendTaggedBlob (start, CcnbParser::CCN_DTAG_Component,
- reinterpret_cast<const uint8_t*>(component.c_str()), component.size());
- }
- return written;
-}
-
-size_t
-Ccnb::EstimateName (const Name &name)
-{
- size_t written = 0;
- BOOST_FOREACH (const std::string &component, name.GetComponents())
- {
- written += EstimateTaggedBlob (CcnbParser::CCN_DTAG_Component, component.size());
- }
- return written;
-}
-
-size_t
Ccnb::AppendTimestampBlob (Buffer::Iterator &start, const Time &time)
{
// the original function implements Markers... thought not sure what are these markers for...
@@ -208,6 +187,41 @@
return EstimateBlockHeader (dtag) + EstimateBlockHeader (string.size ()) + string.size () + 1;
}
+size_t
+Ccnb::SerializeName (Buffer::Iterator &start, const Name &name)
+{
+ size_t written = 0;
+ BOOST_FOREACH (const std::string &component, name.GetComponents())
+ {
+ written += AppendTaggedBlob (start, CcnbParser::CCN_DTAG_Component,
+ reinterpret_cast<const uint8_t*>(component.c_str()), component.size());
+ }
+ return written;
+}
+
+size_t
+Ccnb::SerializedSizeName (const Name &name)
+{
+ size_t written = 0;
+ BOOST_FOREACH (const std::string &component, name.GetComponents())
+ {
+ written += EstimateTaggedBlob (CcnbParser::CCN_DTAG_Component, component.size());
+ }
+ return written;
+}
+
+Ptr<Name>
+Ccnb::DeserializeName (Buffer::Iterator &i)
+{
+ Ptr<Name> name = Create<Name> ();
+ CcnbParser::NameVisitor nameVisitor;
+
+ Ptr<CcnbParser::Block> root = CcnbParser::Block::ParseBlock (i);
+ root->accept (nameVisitor, GetPointer (name));
+
+ return name;
+}
+
} // wire
NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/wire-ccnb.h b/model/wire/ccnb/wire-ccnb.h
index 42764c4..91d3d9e 100644
--- a/model/wire/ccnb/wire-ccnb.h
+++ b/model/wire/ccnb/wire-ccnb.h
@@ -85,24 +85,6 @@
AppendCloser (Buffer::Iterator &start);
/**
- * @brief Append Name in CCNB encoding
- * @param start Buffer to store serialized Interest
- * @param name constant reference to Name object
- *
- * @returns written length
- */
- static size_t
- AppendName (Buffer::Iterator &start, const Name &name);
-
- /**
- * @brief Estimate size of Name in CCNB encoding
- * @param name constant reference to Name object
- * @returns estimated length
- */
- static size_t
- EstimateName (const Name &name);
-
- /**
* Append a binary timestamp as a BLOB using the ccn binary
* Timestamp representation (12-bit fraction).
*
@@ -187,6 +169,36 @@
*/
static size_t
EstimateString (uint32_t dtag, const std::string &string);
+
+ ////////////////////////////////
+ // General use wire formatters
+ ////////////////////////////////
+
+ /**
+ * @brief Append Name in CCNB encoding
+ * @param start Buffer to store serialized Interest
+ * @param name constant reference to Name object
+ *
+ * @returns written length
+ */
+ static size_t
+ SerializeName (Buffer::Iterator &start, const Name &name);
+
+ /**
+ * @brief Estimate size of Name in CCNB encoding
+ * @param name constant reference to Name object
+ * @returns estimated length
+ */
+ static size_t
+ SerializedSizeName (const Name &name);
+
+ /**
+ * @brief Deserialize Name from CCNB encodeing
+ * @param start Buffer that stores serialized Interest
+ * @param name Name object
+ */
+ static Ptr<Name>
+ DeserializeName (Buffer::Iterator &start);
}; // Ccnb