40 lines
845 B
C++
40 lines
845 B
C++
#include "ProcedureManager.h"
|
|
|
|
ProcedureManager::ProcedureManager() {}
|
|
|
|
struct ProcedureCallHeader {
|
|
uint64_t rd;
|
|
int32_t method;
|
|
uint32_t len;
|
|
};
|
|
|
|
struct ProcedureReturnHeader {
|
|
uint64_t rd;
|
|
uint32_t len;
|
|
};
|
|
|
|
void ProcedureManager::handleCall(FILE *in, FILE *out) const {
|
|
ProcedureCallHeader header;
|
|
auto ptr = reinterpret_cast<byte*>(&header);
|
|
std::size_t sz = 0;
|
|
while (sz < sizeof(header))
|
|
sz += fread(ptr + sz, 1, sizeof(header) - sz, in);
|
|
|
|
auto buf = new byte[header.len];
|
|
sz = 0;
|
|
while (sz < header.len)
|
|
sz += fread(buf + sz, 1, header.len - sz, in);
|
|
|
|
BinaryBuffer bb(header.len, buf);
|
|
delete[] buf;
|
|
if (procedures.count(header.method)) {
|
|
auto res = procedures.at(header.method)(bb);
|
|
ProcedureReturnHeader rh;
|
|
rh.rd = header.rd;
|
|
rh.len = header.len;
|
|
fwrite(&rh, 1, sizeof(rh), out);
|
|
res.writeTo(out);
|
|
}
|
|
}
|
|
|