// portable/PacketReader.h // Libunistd Copyright 2016/1/16 Robin.Rowe@cinepaint.org // License open source MIT/BSD #ifndef PacketReader_h #define PacketReader_h #include "Packet.h" namespace portable { class PacketReader : public Packet { const char* readPtr; const char* endPtr; const char* dumpFilename; bool IsInvalid() const {// std::cout << "readOffset "<dumpFilename = dumpFilename; } bool IsGood() const override { return !IsInvalid(); } void NextInPipeline() { readPtr = endPtr; Reset(); } void SeekEnd() { readPtr = (char*) endPtr; } void Invalidate() { TRACE("Packet Invalidated"); readPtr=0; } bool Read(char* data,unsigned length) { if(IsInvalid()) { return false; } memcpy(data,readPtr,length); readPtr+=length; return true; } bool Read(std::string& s); bool Read(const char*& s,unsigned& size); void Dump() const; bool Skip(unsigned length) override { readPtr+=length; return true; } bool IsGoodHash() const { const XXH64_hash_t readHash = GetHash(); const XXH64_hash_t calcHash = CalcHash(); if(readHash != calcHash) { printf("Error: read hash %llx packetId #%u\n" "mismatch calc hash %llx size=%u\n",readHash,header.packetId,calcHash,header.packetSize); PrintOffsets(); return false; } return true; } void PrintOffsets() const { const unsigned remaining = unsigned(endPtr-readPtr); printf("PacketReader size=%u offset=%u remaining=%u\n",header.packetSize,header.packetSize-remaining,remaining); } }; template PacketReader& operator>>(PacketReader& packet,T& data) { const bool ok = packet.Read((char*) &data,sizeof(data)); // std::cout<<"read T" << std::endl; return packet; } template<> PacketReader& operator>>(PacketReader& packet,std::string& data); } #endif