Bug-fix: wireEncode "corrupts" implicit digest
* Removed wireEncde()
* Implemented finalize()
* Minor change to constructor to resolve code quality warnings (-Weffc++)

Refs: #3490

Change-Id: Ic943e12b0fd2d24dbfe46e7f5824051d308fb0ec
diff --git a/src/file-manifest.cpp b/src/file-manifest.cpp
index 7352699..fe4fec8 100644
--- a/src/file-manifest.cpp
+++ b/src/file-manifest.cpp
@@ -42,13 +42,6 @@
   this->decodeContent();
 }
 
-const Block&
-FileManifest::wireEncode()
-{
-  encodeContent();
-  return Data::wireEncode();
-}
-
 template<ndn::encoding::Tag TAG>
 size_t
 FileManifest::encodeContent(ndn::EncodingImpl<TAG>& encoder) const {
@@ -126,6 +119,12 @@
   return true;
 }
 
+void
+FileManifest::finalize() {
+  m_catalog.shrink_to_fit();
+  encodeContent();
+}
+
 void FileManifest::encodeContent() {
   // Name
   //     <file_name>/ImplicitDigest
diff --git a/src/file-manifest.hpp b/src/file-manifest.hpp
index 0a46574..6ce957e 100644
--- a/src/file-manifest.hpp
+++ b/src/file-manifest.hpp
@@ -144,9 +144,15 @@
   * @param wire the write to be decoded
   * @throws Error if decoding fails
   */
-  const Block&
-  wireEncode();
-  /// Encodes this FileManifest into the wire format and returns a Block with the contents
+
+  void
+  finalize();
+  /*
+   * \brief Performs all final processing on this manifest
+   *
+   * This method should be called once this manifest is populated and *must* be called before
+   * signing it or  calling wireEncode().
+   */
 
 private:
   void
@@ -204,6 +210,11 @@
 
 inline
 FileManifest::FileManifest(const Block& block)
+: Data()
+, m_dataPacketSize(0)
+, m_catalogPrefix("")
+, m_catalog()
+, m_submanifestPtr(nullptr)
 {
   wireDecode(block);
 }
diff --git a/tests/unit-tests/file-manifest.t.cpp b/tests/unit-tests/file-manifest.t.cpp
index 4bc69bd..a8181ad 100644
--- a/tests/unit-tests/file-manifest.t.cpp
+++ b/tests/unit-tests/file-manifest.t.cpp
@@ -270,19 +270,21 @@
                   std::make_shared<Name>("/file0/1/5E6F7G8H"));
 
   KeyChain keyChain;
+  m1.finalize();
   keyChain.sign(m1);
   BOOST_CHECK_EQUAL(m1, FileManifest(m1.wireEncode()));
 
   // Change value and be sure that wireEncoding still works
   m1.remove("/foo/2/CAFEBABE");
+  m1.finalize();
   keyChain.sign(m1);
-
   BOOST_CHECK_EQUAL(m1, FileManifest(m1.wireEncode()));
 
   // Explicitly call wireEncode and ensure the value works
   FileManifest m2 = m1;
   m1.remove("/foo/0/ABC123");
   keyChain.sign(m1);
+  m1.finalize();
   m2.wireDecode(m1.wireEncode());
   BOOST_CHECK_EQUAL(m1, m2);
 }