zeek/auxil/libunistd/portable/ipc/PacketWriter.h
Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

100 lines
2.0 KiB
C++

// portable/PacketWriter.h
// Copyright 2016/1/16 Robin.Rowe@cinepaint.org
// License open source MIT/BSD
#ifndef PacketWriter_h
#define PacketWriter_h
#include "Packet.h"
namespace portable
{
class PacketWriter
: public Packet
{
public:
PacketWriter(char* buffer,unsigned bufsize)
: Packet(buffer,bufsize)
{ Reset();
}
PacketWriter(const PacketSizer& sizer)
: Packet(sizer)
{ Reset();
}
PacketWriter(std::vector<char>& v)
: Packet(&v[0],unsigned(v.size()))
{ Reset();
}
bool IsGood() const override
{ if(!header.isGood)
{ return false;
}
return Packet::IsGood();
}
void Reset() override
{ header.ResetWrite();
}
bool Skip(unsigned length) override
{ if (header.packetSize + length > bufsize)
{ return false;
}
header.packetSize += length;
return true;
}
bool Write(const char* data,unsigned length)
{ if (header.packetSize + length > bufsize)
{ puts("Packet write failed");
return false;
}
memcpy(GetEndPtr(),data,length);
header.packetSize += length;
return true;
}
bool Write(const std::string& s)
{ const unsigned zlength = (unsigned) s.length()+1;
return Write(s.c_str(),zlength);
}
bool Write(const char* s)
{ if(!s)
{ return false;
}
const unsigned zlength = (unsigned) strlen(s)+1;
return Write(s,zlength);
}
char* GetEndPtr() const
{ return packet+header.packetSize;
}
void Duplicate()
{ char* end=GetEndPtr();
const unsigned size=GetPacketSize();
memcpy(end,packet,size);
}
bool WriteHash(XXH64_hash_t* hashReturn = nullptr)
{ header.WriteSizeId(buffer);
const XXH64_hash_t packetHash = CalcHash();
if(hashReturn)
{ *hashReturn = packetHash;
}
header.WriteHash(buffer,packetHash);
return true;
}
};
template <typename T>
PacketWriter& operator<<(PacketWriter& packet,T data)
{ const char* p = (const char*) &data;
const bool ok = packet.Write(p,sizeof(data));
return packet;
}
inline
PacketWriter& operator<<(PacketWriter& packet,const std::string& data)
{ const bool ok = packet.Write(data);
// std::cout<<"read string" << std::endl;
return packet;
}
}
#endif