Skip to content

Commit

Permalink
msgproto add bytes and protoheader + fix implementation (#91)
Browse files Browse the repository at this point in the history
* msgproto add bytes and protoheader + fix implementation

* fix put string + put int
  • Loading branch information
visill authored Feb 5, 2025
1 parent 8b1a31a commit 9f9ac06
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 8 deletions.
12 changes: 11 additions & 1 deletion include/msgproto.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <cstring>
#include <string>
#include <vector>

const char DecryptRequest = 1;
const char NoDecryptRequest = 0;
const char ExtendedMessage = 1;
Expand Down Expand Up @@ -33,18 +34,27 @@ class MsgBuilder {
// description
MsgBuilder &fieldMessageType();
MsgBuilder &fieldUInt64();
MsgBuilder &fieldString(ssize_t val);
MsgBuilder &fieldString(ssize_t len);
MsgBuilder &fieldProto();
MsgBuilder &fieldBytes(ssize_t len);
MsgBuilder &endDescription();
// place values
MsgBuilder &addMessageType(char message_type);
MsgBuilder &addUInt64(uint64_t val);
MsgBuilder &addString(std::string str);
MsgBuilder &addBytes(const char *bytes, ssize_t len);
MsgBuilder &addProto(char farg);
MsgBuilder &addProto(char farg, char sarg);
MsgBuilder &addProto(char farg, char sarg, char targ);
MsgBuilder &addProto(char farg, char sarg, char targ, char larg);
std::vector<char> get();

protected:
ssize_t putUInt64(uint64_t val, ssize_t padding);
ssize_t putString(std::string val, ssize_t padding);
ssize_t putChar(char c, ssize_t padding);
ssize_t putProto(char farg, char sarg, char targ, char larg, ssize_t cursor);
ssize_t putBytes(const char *bytes, ssize_t len, ssize_t padding);
ssize_t length;
ssize_t cursor;
std::vector<char> data;
Expand Down
67 changes: 60 additions & 7 deletions src/msgproto.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,55 @@ ssize_t MsgBuilder::putChar(char c, ssize_t padding) {
ssize_t MsgBuilder::putUInt64(uint64_t val, ssize_t padding) {
uint64_t cp = val;
for (ssize_t i = UINT64_SZ - 1; i >= 0; --i) {
data.at(i) = cp & ((1 << 8) - 1);
data[i+padding] = cp & ((1 << 8) - 1);
cp >>= 8;
}
return UINT64_SZ;
}

ssize_t MsgBuilder::putString(std::string val, ssize_t padding) {
strncpy(&data[padding], val.c_str(), val.size());
strncpy(data.data()+padding, val.c_str(), val.size());
return val.size() + CHAR_SZ;
}
ssize_t MsgBuilder::putProto(char farg, char sarg, char targ, char larg,
ssize_t padding) {
padding += this->putChar(farg, padding);
padding += this->putChar(sarg, padding);
padding += this->putChar(targ, padding);
padding += this->putChar(larg, padding);
return PROTO_HEADER_SIZE;
}
ssize_t MsgBuilder::putBytes(const char *bytes, ssize_t len, ssize_t padding) {
memcpy(data.data() + padding, bytes, len);
return len;
}
MsgBuilder &MsgBuilder::fieldMessageType() {
length += UINT64_SZ;
return *this;
}

MsgBuilder &MsgBuilder::fieldMessageType() { length += UINT64_SZ; }

MsgBuilder &MsgBuilder::fieldUInt64() { length += UINT64_SZ; }
MsgBuilder &MsgBuilder::fieldUInt64() {
length += UINT64_SZ;
return *this;
}

MsgBuilder &MsgBuilder::fieldString(ssize_t val) { length += val + CHAR_SZ; }
MsgBuilder &MsgBuilder::fieldString(ssize_t len) {
length += len + CHAR_SZ;
return *this;
}

MsgBuilder &MsgBuilder::fieldProto() {
length += PROTO_HEADER_SIZE;
return *this;
}
MsgBuilder &MsgBuilder::fieldBytes(ssize_t len) {
length += len;
return *this;
}
MsgBuilder &MsgBuilder::endDescription() {
data = std::vector<char>(length);
data = std::vector<char>(length, 0);
cursor += this->putUInt64(length, cursor);
return *this;
}

MsgBuilder &MsgBuilder::addMessageType(char message_type) {
Expand All @@ -39,8 +68,32 @@ MsgBuilder &MsgBuilder::addMessageType(char message_type) {
}
MsgBuilder &MsgBuilder::addUInt64(uint64_t val) {
cursor += this->putUInt64(val, cursor);
return *this;
}
MsgBuilder &MsgBuilder::addString(std::string str) {
cursor += this->putString(str, cursor);
return *this;
}

MsgBuilder &MsgBuilder::addProto(char farg, char sarg, char targ, char larg) {
cursor += this->putProto(farg, sarg, targ, larg, cursor);
return *this;
}
MsgBuilder &MsgBuilder::addProto(char farg, char sarg, char targ) {
cursor += this->putProto(farg, sarg, targ, 0, cursor);
return *this;
}
MsgBuilder &MsgBuilder::addProto(char farg, char sarg) {
cursor += this->putProto(farg, sarg, 0, 0, cursor);
return *this;
}
MsgBuilder &MsgBuilder::addProto(char farg) {
cursor += this->putProto(farg, 0, 0, 0, cursor);
return *this;
}
MsgBuilder &MsgBuilder::addBytes(const char *bytes, ssize_t len) {
cursor += this->putBytes(bytes, len, cursor);
return *this;
}

std::vector<char> MsgBuilder::get() { return data; }

0 comments on commit 9f9ac06

Please sign in to comment.