Log PEL and dump VPD if invalid record(s) found

This commit adds changes in ipz parser to log predictive PEL if any
invalid record(s) is found while parsing. Processing of records still
continues even if any invalid record is found. At the end of parsing the
VPD:
1. A predictive PEL is logged which specifies FRU path and list of
   invalid records.
2. The bad VPD binary data is dumped to filesystem so that it can be
   collected by FFDC.

Test:
```
1. Using dd command, zero out VINI DR and VMPU VZ  keyword values of Op
   Panel EEPROM(/sys/bus/i2c/drivers/at24/7-0051/eeprom).
2. Restart vpd-manager service.
3. Check PEL list using peltool and observe that a predictive PEL is
   logged with the Op Panel EEPROM path in the description and a list of
   bad record names and respective error(Data/ECC) in the UserData1
   section.
4. Check /var/lib/vpd/ directory and see dumps directory is created with
   a dump file which contains the Op Panel EEPROM binary data
5. Restore the Op Panel EEPROM with backed up correct data
6. Clear all PELs using peltool
7. Restart vpd-manager
8. Observe no new PELs logged for invalid records
```

Change-Id: Iebb526bae3c467b1cd0a256c93d57a56fb87e9f6
Signed-off-by: Souvik Roy <souvikroyofficial10@gmail.com>
diff --git a/vpd-manager/include/ipz_parser.hpp b/vpd-manager/include/ipz_parser.hpp
index b41b7b6..61100e9 100644
--- a/vpd-manager/include/ipz_parser.hpp
+++ b/vpd-manager/include/ipz_parser.hpp
@@ -152,10 +152,11 @@
      *
      * @param[in] itrToPT - Iterator to PT record in VPD vector.
      * @param[in] ptLength - length of the PT record.
-     * @return List of record's offset.
+     * @return Pair of list of record's offset and a list of invalid
+     * records found during parsing
      */
-    types::RecordOffsetList readPT(types::BinaryVector::const_iterator& itrToPT,
-                                   auto ptLength);
+    std::pair<types::RecordOffsetList, types::InvalidRecordList> readPT(
+        types::BinaryVector::const_iterator& itrToPT, auto ptLength);
 
     /**
      * @brief API to read keyword data based on its encoding type.
@@ -255,6 +256,20 @@
                                 const types::RecordOffset& i_recordDataOffset,
                                 types::BinaryVector& io_vpdVector);
 
+    /**
+     * @brief API to process list of invalid records found during parsing
+     *
+     * This API takes a list of invalid records found while parsing a given
+     * EEPROM, logs a predictive PEL with details about the invalid records and
+     * then dumps the EEPROM data to filesystem.
+     *
+     * @param[in] i_invalidRecordList - a list of invalid records
+     *
+     * @return On success returns true, false otherwise.
+     */
+    bool processInvalidRecords(
+        const types::InvalidRecordList& i_invalidRecordList) const noexcept;
+
     // Holds VPD data.
     const types::BinaryVector& m_vpdVector;