1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 17:47:44 +00:00

IPCCompiler: Emit message constructors + include ID in serialization

This commit is contained in:
Andreas Kling 2019-08-03 16:35:49 +02:00
parent 05e08afcd8
commit 36b352554e

View file

@ -201,28 +201,59 @@ int main(int argc, char** argv)
dbg() << "};"; dbg() << "};";
dbg(); dbg();
auto constructor_for_message = [&](const String& name, const Vector<Parameter>& parameters) {
StringBuilder builder;
builder.append(name);
if (parameters.is_empty()) {
builder.append("() {}");
return builder.to_string();
}
builder.append('(');
for (int i = 0; i < parameters.size(); ++i) {
auto& parameter = parameters[i];
builder.append(parameter.type);
builder.append(' ');
builder.append(parameter.name);
if (i != parameters.size() - 1)
builder.append(", ");
}
builder.append(") : ");
for (int i = 0; i < parameters.size(); ++i) {
auto& parameter = parameters[i];
builder.append("m_");
builder.append(parameter.name);
builder.append("(");
builder.append(parameter.name);
builder.append(")");
if (i != parameters.size() - 1)
builder.append(", ");
}
builder.append(" {}");
return builder.to_string();
};
auto do_message = [&](const String& name, const Vector<Parameter>& parameters, String response_type = {}) { auto do_message = [&](const String& name, const Vector<Parameter>& parameters, String response_type = {}) {
dbg() << "class " << name << " final : public IMessage {"; dbg() << "class " << name << " final : public IMessage {";
dbg() << "public:"; dbg() << "public:";
if (!response_type.is_null()) if (!response_type.is_null())
dbg() << " typedef class " << response_type << " ResponseType;"; dbg() << " typedef class " << response_type << " ResponseType;";
dbg() << " " << constructor_for_message(name, parameters);
dbg() << " virtual ~" << name << "() override {}"; dbg() << " virtual ~" << name << "() override {}";
dbg() << " virtual int id() const override { return (int)MessageID::" << name << "; }"; dbg() << " virtual int id() const override { return (int)MessageID::" << name << "; }";
dbg() << " virtual String name() const override { return \"" << endpoint.name << "::" << name << "\"; }"; dbg() << " virtual String name() const override { return \"" << endpoint.name << "::" << name << "\"; }";
dbg() << " virtual ByteBuffer encode() override"; dbg() << " virtual ByteBuffer encode() override";
dbg() << " {"; dbg() << " {";
if (parameters.is_empty()) { // FIXME: Support longer messages:
dbg() << " return {};"; dbg() << " auto buffer = ByteBuffer::create_uninitialized(1024);";
} else { dbg() << " BufferStream stream(buffer);";
// FIXME: Support longer messages: dbg() << " stream << (int)MessageID::" << name << ";";
dbg() << " auto buffer = ByteBuffer::create_uninitialized(1024);"; for (auto& parameter : parameters) {
dbg() << " BufferStream stream(buffer);"; dbg() << " stream << m_" << parameter.name << ";";
for (auto& parameter : parameters) {
dbg() << " stream << m_" << parameter.name << ";";
}
dbg() << " stream.snip();";
dbg() << " return buffer;";
} }
dbg() << " stream.snip();";
dbg() << " return buffer;";
dbg() << " }"; dbg() << " }";
dbg() << "private:"; dbg() << "private:";
for (auto& parameter : parameters) { for (auto& parameter : parameters) {