generate_java_rpc.cpp revision 7add83bbb52d8783be9c3c68dc3dd4d7f2fead54
17add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato#include "generate_java.h"
27add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato#include "Type.h"
37add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato#include <string.h>
47add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato#include <stdio.h>
57add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato#include <stdlib.h>
67add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato#include <string.h>
77add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
87add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoType* SERVICE_CONTAINER_TYPE = new Type("com.android.athome.service",
97add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        "AndroidAtHomeServiceContainer", Type::BUILT_IN, false, false);
107add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
117add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic string
127add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratoformat_int(int n)
137add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
147add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    char str[20];
157add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    sprintf(str, "%d", n);
167add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    return string(str);
177add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
187add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
197add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic string
207add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratoclass_name_leaf(const string& str)
217add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
227add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    string::size_type pos = str.rfind('.');
237add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (pos == string::npos) {
247add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        return str;
257add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    } else {
267add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        return string(str, pos+1);
277add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
287add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
297add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
307add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato// =================================================
317add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratoclass RpcProxyClass : public Class
327add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
337add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratopublic:
347add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    RpcProxyClass(const interface_type* iface, InterfaceType* interfaceType);
357add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    virtual ~RpcProxyClass();
367add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
377add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* endpoint;
387add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* context;
397add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
407add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratoprivate:
417add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    void generate_ctor();
427add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato};
437add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
447add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoRpcProxyClass::RpcProxyClass(const interface_type* iface, InterfaceType* interfaceType)
457add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    :Class()
467add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
477add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->comment = gather_comments(iface->comments_token->extra);
487add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->modifiers = PUBLIC;
497add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->what = Class::CLASS;
507add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->type = interfaceType;
517add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
527add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // context
537add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->context = new Variable(CONTEXT_TYPE, "_context");
547add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->elements.push_back(new Field(PRIVATE, this->context));
557add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // endpoint
567add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->endpoint = new Variable(RPC_ENDPOINT_INFO_TYPE, "_endpoint");
577add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->elements.push_back(new Field(PRIVATE, this->endpoint));
587add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
597add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // methods
607add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    generate_ctor();
617add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
627add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
637add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoRpcProxyClass::~RpcProxyClass()
647add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
657add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
667add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
677add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratovoid
687add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoRpcProxyClass::generate_ctor()
697add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
707add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* context = new Variable(CONTEXT_TYPE, "context");
717add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* endpoint = new Variable(RPC_ENDPOINT_INFO_TYPE, "endpoint");
727add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Method* ctor = new Method;
737add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->modifiers = PUBLIC;
747add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->name = this->type->Name();
757add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->statements = new StatementBlock;
767add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->parameters.push_back(context);
777add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->parameters.push_back(endpoint);
787add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->elements.push_back(ctor);
797add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
807add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    ctor->statements->Add(new Assignment(this->context, context));
817add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    ctor->statements->Add(new Assignment(this->endpoint, endpoint));
827add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
837add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
847add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato// =================================================
857add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratoclass ServiceBaseClass : public Class
867add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
877add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratopublic:
887add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    ServiceBaseClass(const interface_type* iface);
897add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    virtual ~ServiceBaseClass();
907add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
917add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    void AddMethod(const string& methodName, StatementBlock** statements);
927add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    void DoneWithMethods();
937add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
947add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    bool needed;
957add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Method* processMethod;
967add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* actionParam;
977add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* errorParam;
987add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* requestData;
997add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* resultData;
1007add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    IfStatement* dispatchIfStatement;
1017add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1027add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratoprivate:
1037add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    void generate_ctor();
1047add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    void generate_process();
1057add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato};
1067add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1077add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoServiceBaseClass::ServiceBaseClass(const interface_type* iface)
1087add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    :Class(),
1097add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato     needed(false),
1107add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato     dispatchIfStatement(NULL)
1117add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
1127add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->comment = "/** Extend this to implement a link service. */";
1137add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->modifiers = STATIC | PUBLIC | ABSTRACT;
1147add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->what = Class::CLASS;
1157add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->type = NAMES.Find(iface->package, append(iface->name.data, ".ServiceBase").c_str());
1167add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->extends = RPC_SERVICE_BASE_TYPE;
1177add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1187add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // methods
1197add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    generate_ctor();
1207add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    generate_process();
1217add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
1227add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1237add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoServiceBaseClass::~ServiceBaseClass()
1247add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
1257add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
1267add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1277add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratovoid
1287add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoServiceBaseClass::generate_ctor()
1297add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
1307add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* container = new Variable(SERVICE_CONTAINER_TYPE, "container");
1317add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* name = new Variable(STRING_TYPE, "name");
1327add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* type = new Variable(STRING_TYPE, "type");
1337add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* version = new Variable(INT_TYPE, "version");
1347add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Method* ctor = new Method;
1357add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->modifiers = PUBLIC;
1367add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->name = class_name_leaf(this->type->Name());
1377add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->statements = new StatementBlock;
1387add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->parameters.push_back(container);
1397add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->parameters.push_back(name);
1407add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->parameters.push_back(type);
1417add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->parameters.push_back(version);
1427add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->elements.push_back(ctor);
1437add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1447add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    ctor->statements->Add(new MethodCall("super", 4, container, name, type, version));
1457add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
1467add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1477add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratovoid
1487add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoServiceBaseClass::generate_process()
1497add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
1507add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // byte[] process(String action, byte[] params, RpcError status)
1517add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->processMethod = new Method;
1527add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->processMethod->modifiers = PUBLIC;
1537add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->processMethod->returnType = BYTE_TYPE;
1547add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->processMethod->returnTypeDimension = 1;
1557add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->processMethod->name = "process";
1567add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->processMethod->statements = new StatementBlock;
1577add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->elements.push_back(this->processMethod);
1587add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1597add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->actionParam = new Variable(STRING_TYPE, "action");
1607add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->processMethod->parameters.push_back(this->actionParam);
1617add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1627add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* requestParam = new Variable(BYTE_TYPE, "requestParam", 1);
1637add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->processMethod->parameters.push_back(requestParam);
1647add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1657add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->errorParam = new Variable(RPC_ERROR_TYPE, "errorParam", 0);
1667add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->processMethod->parameters.push_back(this->errorParam);
1677add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1687add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->requestData = new Variable(RPC_DATA_TYPE, "request");
1697add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->processMethod->statements->Add(new VariableDeclaration(requestData,
1707add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                new NewExpression(RPC_DATA_TYPE, 1, requestParam)));
1717add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1727add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->resultData = new Variable(RPC_DATA_TYPE, "response");
1737add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->processMethod->statements->Add(new VariableDeclaration(this->resultData,
1747add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                NULL_VALUE));
1757add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
1767add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1777add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratovoid
1787add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoServiceBaseClass::AddMethod(const string& methodName, StatementBlock** statements)
1797add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
1807add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    IfStatement* ifs = new IfStatement();
1817add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ifs->expression = new MethodCall(new StringLiteralExpression(methodName), "equals", 1,
1827add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                this->actionParam);
1837add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ifs->statements = *statements = new StatementBlock;
1847add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (this->dispatchIfStatement == NULL) {
1857add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->dispatchIfStatement = ifs;
1867add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->processMethod->statements->Add(dispatchIfStatement);
1877add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    } else {
1887add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->dispatchIfStatement->elseif = ifs;
1897add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->dispatchIfStatement = ifs;
1907add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
1917add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
1927add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1937add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratovoid
1947add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoServiceBaseClass::DoneWithMethods()
1957add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
1967add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    IfStatement* s = new IfStatement;
1977add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        s->statements = new StatementBlock;
1987add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->processMethod->statements->Add(s);
1997add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    s->expression = new Comparison(this->resultData, "!=", NULL_VALUE);
2007add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    s->statements->Add(new ReturnStatement(new MethodCall(this->resultData, "serialize")));
2017add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    s->elseif = new IfStatement;
2027add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    s = s->elseif;
2037add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    s->statements->Add(new ReturnStatement(NULL_VALUE));
2047add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
2057add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2067add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato// =================================================
2077add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratoclass ResultDispatcherClass : public Class
2087add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
2097add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratopublic:
2107add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    ResultDispatcherClass();
2117add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    virtual ~ResultDispatcherClass();
2127add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2137add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    void AddMethod(int index, const string& name, Method** method, Variable** param);
2147add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2157add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    bool needed;
2167add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* methodId;
2177add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* callback;
2187add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Method* onResultMethod;
2197add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* resultParam;
2207add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    SwitchStatement* methodSwitch;
2217add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2227add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratoprivate:
2237add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    void generate_ctor();
2247add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    void generate_onResult();
2257add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato};
2267add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2277add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoResultDispatcherClass::ResultDispatcherClass()
2287add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    :Class(),
2297add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato     needed(false)
2307add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
2317add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->modifiers = PRIVATE | FINAL;
2327add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->what = Class::CLASS;
2337add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->type = new Type("_ResultDispatcher", Type::GENERATED, false, false);
2347add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->interfaces.push_back(RPC_RESULT_HANDLER_TYPE);
2357add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2367add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // methodId
2377add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->methodId = new Variable(INT_TYPE, "methodId");
2387add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->elements.push_back(new Field(PRIVATE, this->methodId));
2397add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->callback = new Variable(OBJECT_TYPE, "callback");
2407add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->elements.push_back(new Field(PRIVATE, this->callback));
2417add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2427add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // methods
2437add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    generate_ctor();
2447add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    generate_onResult();
2457add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
2467add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2477add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoResultDispatcherClass::~ResultDispatcherClass()
2487add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
2497add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
2507add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2517add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratovoid
2527add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoResultDispatcherClass::generate_ctor()
2537add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
2547add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* methodIdParam = new Variable(INT_TYPE, "methId");
2557add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* callbackParam = new Variable(OBJECT_TYPE, "cbObj");
2567add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Method* ctor = new Method;
2577add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->modifiers = PUBLIC;
2587add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->name = this->type->Name();
2597add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->statements = new StatementBlock;
2607add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->parameters.push_back(methodIdParam);
2617add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->parameters.push_back(callbackParam);
2627add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->elements.push_back(ctor);
2637add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2647add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    ctor->statements->Add(new Assignment(this->methodId, methodIdParam));
2657add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    ctor->statements->Add(new Assignment(this->callback, callbackParam));
2667add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
2677add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2687add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratovoid
2697add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoResultDispatcherClass::generate_onResult()
2707add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
2717add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->onResultMethod = new Method;
2727add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->onResultMethod->modifiers = PUBLIC;
2737add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->onResultMethod->returnType = VOID_TYPE;
2747add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->onResultMethod->returnTypeDimension = 0;
2757add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->onResultMethod->name = "onResult";
2767add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->onResultMethod->statements = new StatementBlock;
2777add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->elements.push_back(this->onResultMethod);
2787add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2797add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->resultParam = new Variable(BYTE_TYPE, "result", 1);
2807add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->onResultMethod->parameters.push_back(this->resultParam);
2817add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2827add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->methodSwitch = new SwitchStatement(this->methodId);
2837add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->onResultMethod->statements->Add(this->methodSwitch);
2847add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
2857add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2867add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratovoid
2877add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoResultDispatcherClass::AddMethod(int index, const string& name, Method** method, Variable** param)
2887add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
2897add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Method* m = new Method;
2907add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        m->modifiers = PUBLIC;
2917add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        m->returnType = VOID_TYPE;
2927add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        m->returnTypeDimension = 0;
2937add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        m->name = name;
2947add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        m->statements = new StatementBlock;
2957add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    *param = new Variable(BYTE_TYPE, "result", 1);
2967add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    m->parameters.push_back(*param);
2977add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->elements.push_back(m);
2987add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    *method = m;
2997add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3007add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Case* c = new Case(format_int(index));
3017add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    c->statements->Add(new MethodCall(new LiteralExpression("this"), name, 1, this->resultParam));
3027add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3037add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->methodSwitch->cases.push_back(c);
3047add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
3057add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3067add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato// =================================================
3077add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic void
3087add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratogenerate_new_array(Type* t, StatementBlock* addTo, Variable* v, Variable* from)
3097add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
3107add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    fprintf(stderr, "aidl: implement generate_new_array %s:%d\n", __FILE__, __LINE__);
3117add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    exit(1);
3127add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
3137add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3147add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic void
3157add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratogenerate_create_from_data(Type* t, StatementBlock* addTo, const string& key, Variable* v,
3167add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                            Variable* data, Variable** cl)
3177add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
3187add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Expression* k = new StringLiteralExpression(key);
3197add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (v->dimension == 0) {
3207add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        t->CreateFromRpcData(addTo, k, v, data, cl);
3217add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
3227add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (v->dimension == 1) {
3237add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        //t->ReadArrayFromRpcData(addTo, v, data, cl);
3247add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        fprintf(stderr, "aidl: implement generate_create_from_data for arrays%s:%d\n",
3257add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                __FILE__, __LINE__);
3267add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
3277add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
3287add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3297add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic void
3307add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratogenerate_write_to_data(Type* t, StatementBlock* addTo, Expression* k, Variable* v, Variable* data)
3317add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
3327add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (v->dimension == 0) {
3337add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        t->WriteToRpcData(addTo, k, v, data, 0);
3347add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
3357add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (v->dimension == 1) {
3367add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        //t->WriteArrayToParcel(addTo, v, data);
3377add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        fprintf(stderr, "aidl: implement generate_write_to_data for arrays%s:%d\n",
3387add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                __FILE__, __LINE__);
3397add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
3407add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
3417add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3427add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato// =================================================
3437add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic string
3447add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratoresults_class_name(const string& n)
3457add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
3467add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    string str = n;
3477add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    str[0] = toupper(str[0]);
3487add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    str.insert(0, "On");
3497add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    return str;
3507add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
3517add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3527add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic string
3537add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratoresults_method_name(const string& n)
3547add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
3557add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    string str = n;
3567add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    str[0] = toupper(str[0]);
3577add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    str.insert(0, "on");
3587add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    return str;
3597add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
3607add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3617add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic Type*
3627add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratogenerate_results_method(const method_type* method, RpcProxyClass* proxyClass)
3637add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
3647add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    arg_type* arg;
3657add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3667add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    string resultsMethodName = results_method_name(method->name.data);
3677add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Type* resultsInterfaceType = new Type(results_class_name(method->name.data),
3687add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            Type::GENERATED, false, false);
3697add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3707add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (!method->oneway) {
3717add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        Class* resultsClass = new Class;
3727add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            resultsClass->modifiers = STATIC | PUBLIC;
3737add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            resultsClass->what = Class::INTERFACE;
3747add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            resultsClass->type = resultsInterfaceType;
3757add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3767add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        Method* resultMethod = new Method;
3777add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            resultMethod->comment = gather_comments(method->comments_token->extra);
3787add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            resultMethod->modifiers = PUBLIC;
3797add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            resultMethod->returnType = VOID_TYPE;
3807add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            resultMethod->returnTypeDimension = 0;
3817add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            resultMethod->name = resultsMethodName;
3827add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        if (0 != strcmp("void", method->type.type.data)) {
3837add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            resultMethod->parameters.push_back(new Variable(NAMES.Search(method->type.type.data),
3847add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                        "_result", method->type.dimension));
3857add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        }
3867add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        arg = method->args;
3877add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        while (arg != NULL) {
3887add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            if (convert_direction(arg->direction.data) & OUT_PARAMETER) {
3897add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                resultMethod->parameters.push_back(new Variable(
3907add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                                    NAMES.Search(arg->type.type.data), arg->name.data,
3917add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                                    arg->type.dimension));
3927add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            }
3937add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            arg = arg->next;
3947add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        }
3957add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        resultsClass->elements.push_back(resultMethod);
3967add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3977add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        if (resultMethod->parameters.size() > 0) {
3987add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            proxyClass->elements.push_back(resultsClass);
3997add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            return resultsInterfaceType;
4007add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        }
4017add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
4027add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    //delete resultsInterfaceType;
4037add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    return NULL;
4047add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
4057add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4067add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic void
4077add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratogenerate_proxy_method(const method_type* method, RpcProxyClass* proxyClass,
4087add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ResultDispatcherClass* resultsDispatcherClass, Type* resultsInterfaceType, int index)
4097add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
4107add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    arg_type* arg;
4117add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Method* proxyMethod = new Method;
4127add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        proxyMethod->comment = gather_comments(method->comments_token->extra);
4137add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        proxyMethod->modifiers = PUBLIC;
4147add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        proxyMethod->returnType = VOID_TYPE;
4157add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        proxyMethod->returnTypeDimension = 0;
4167add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        proxyMethod->name = method->name.data;
4177add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        proxyMethod->statements = new StatementBlock;
4187add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    proxyClass->elements.push_back(proxyMethod);
4197add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4207add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // The local variables
4217add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* _data = new Variable(RPC_DATA_TYPE, "_data");
4227add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    proxyMethod->statements->Add(new VariableDeclaration(_data, new NewExpression(RPC_DATA_TYPE)));
4237add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4247add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // Add the arguments
4257add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    arg = method->args;
4267add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    while (arg != NULL) {
4277add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        if (convert_direction(arg->direction.data) & IN_PARAMETER) {
4287add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            // Function signature
4297add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            Type* t = NAMES.Search(arg->type.type.data);
4307add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            Variable* v = new Variable(t, arg->name.data, arg->type.dimension);
4317add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            proxyMethod->parameters.push_back(v);
4327add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4337add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            // Input parameter marshalling
4347add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            generate_write_to_data(t, proxyMethod->statements,
4357add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                    new StringLiteralExpression(arg->name.data), v, _data);
4367add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        }
4377add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        arg = arg->next;
4387add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
4397add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4407add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // If there is a results interface for this class
4417add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Expression* resultParameter;
4427add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (resultsInterfaceType != NULL) {
4437add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        // Result interface parameter
4447add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        Variable* resultListener = new Variable(resultsInterfaceType, "_result");
4457add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        proxyMethod->parameters.push_back(resultListener);
4467add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4477add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        // Add the results dispatcher callback
4487add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        resultsDispatcherClass->needed = true;
4497add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        resultParameter = new NewExpression(resultsDispatcherClass->type, 2,
4507add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                new LiteralExpression(format_int(index)), resultListener);
4517add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    } else {
4527add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        resultParameter = NULL_VALUE;
4537add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
4547add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4557add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // All proxy methods take an error parameter
4567add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* errorListener = new Variable(RPC_ERROR_LISTENER_TYPE, "_errors");
4577add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    proxyMethod->parameters.push_back(errorListener);
4587add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4597add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // Call the broker
4607add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    proxyMethod->statements->Add(new MethodCall(RPC_BROKER_TYPE, "sendRequest", 6,
4617add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                new FieldVariable(THIS_VALUE, "_context"),
4627add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                new StringLiteralExpression(method->name.data),
4637add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                proxyClass->endpoint,
4647add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                new MethodCall(_data, "serialize"),
4657add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                resultParameter,
4667add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                errorListener));
4677add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
4687add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4697add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic void
4707add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratogenerate_result_dispatcher_method(const method_type* method,
4717add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ResultDispatcherClass* resultsDispatcherClass, Type* resultsInterfaceType, int index)
4727add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
4737add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    arg_type* arg;
4747add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Method* dispatchMethod;
4757add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* dispatchParam;
4767add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    resultsDispatcherClass->AddMethod(index, method->name.data, &dispatchMethod, &dispatchParam);
4777add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4787add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* classLoader = NULL;
4797add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* resultData = new Variable(RPC_DATA_TYPE, "resultData");
4807add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    dispatchMethod->statements->Add(new VariableDeclaration(resultData,
4817add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                new NewExpression(RPC_DATA_TYPE, 1, dispatchParam)));
4827add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4837add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // The callback method itself
4847add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    MethodCall* realCall = new MethodCall(
4857add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            new Cast(resultsInterfaceType, new FieldVariable(THIS_VALUE, "callback")),
4867add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            results_method_name(method->name.data));
4877add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4887add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // The return value
4897add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    {
4907add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        Type* t = NAMES.Search(method->type.type.data);
4917add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        Variable* rv = new Variable(t, "rv");
4927add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        dispatchMethod->statements->Add(new VariableDeclaration(rv));
4937add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        generate_create_from_data(t, dispatchMethod->statements, "_result", rv,
4947add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                resultData, &classLoader);
4957add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        realCall->arguments.push_back(rv);
4967add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
4977add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4987add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    VariableFactory stubArgs("arg");
4997add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    arg = method->args;
5007add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    while (arg != NULL) {
5017add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        if (convert_direction(arg->direction.data) & OUT_PARAMETER) {
5027add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            // Unmarshall the results
5037add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            Type* t = NAMES.Search(arg->type.type.data);
5047add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            Variable* v = stubArgs.Get(t);
5057add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            dispatchMethod->statements->Add(new VariableDeclaration(v));
5067add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5077add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            generate_create_from_data(t, dispatchMethod->statements, arg->name.data, v,
5087add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                    resultData, &classLoader);
5097add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5107add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            // Add the argument to the callback
5117add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            realCall->arguments.push_back(v);
5127add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        }
5137add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        arg = arg->next;
5147add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
5157add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5167add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // Call the callback method
5177add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    dispatchMethod->statements->Add(realCall);
5187add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
5197add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5207add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic void
5217add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratogenerate_service_base_methods(const method_type* method, ServiceBaseClass* serviceBaseClass)
5227add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
5237add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    arg_type* arg;
5247add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    StatementBlock* block;
5257add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    serviceBaseClass->AddMethod(method->name.data, &block);
5267add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5277add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // The abstract method that the service developers implement
5287add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Method* decl = new Method;
5297add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        decl->comment = gather_comments(method->comments_token->extra);
5307add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        decl->modifiers = PUBLIC | ABSTRACT;
5317add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        decl->returnType = NAMES.Search(method->type.type.data);
5327add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        decl->returnTypeDimension = method->type.dimension;
5337add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        decl->name = method->name.data;
5347add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5357add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    arg = method->args;
5367add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    while (arg != NULL) {
5377add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        decl->parameters.push_back(new Variable(
5387add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                            NAMES.Search(arg->type.type.data), arg->name.data,
5397add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                            arg->type.dimension));
5407add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        arg = arg->next;
5417add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
5427add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5437add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    serviceBaseClass->elements.push_back(decl);
5447add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5457add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // The call to decl (from above)
5467add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    MethodCall* realCall = new MethodCall(THIS_VALUE, method->name.data);
5477add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5487add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // args
5497add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* classLoader = NULL;
5507add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    VariableFactory stubArgs("_arg");
5517add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    arg = method->args;
5527add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    while (arg != NULL) {
5537add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        Type* t = NAMES.Search(arg->type.type.data);
5547add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        Variable* v = stubArgs.Get(t);
5557add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        v->dimension = arg->type.dimension;
5567add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5577add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        // Unmarshall the parameter
5587add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        block->Add(new VariableDeclaration(v));
5597add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        if (convert_direction(arg->direction.data) & IN_PARAMETER) {
5607add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            generate_create_from_data(t, block, arg->name.data, v,
5617add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                    serviceBaseClass->requestData, &classLoader);
5627add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        } else {
5637add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            if (arg->type.dimension == 0) {
5647add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                block->Add(new Assignment(v, new NewExpression(v->type)));
5657add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            }
5667add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            else if (arg->type.dimension == 1) {
5677add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                generate_new_array(v->type, block, v, serviceBaseClass->requestData);
5687add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            }
5697add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            else {
5707add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__,
5717add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                        __LINE__);
5727add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            }
5737add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        }
5747add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5757add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        // Add that parameter to the method call
5767add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        realCall->arguments.push_back(v);
5777add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5787add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        arg = arg->next;
5797add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
5807add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5817add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // the real call
5827add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* _result = NULL;
5837add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (0 == strcmp(method->type.type.data, "void")) {
5847add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        block->Add(realCall);
5857add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    } else {
5867add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        _result = new Variable(decl->returnType, "_result",
5877add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                                decl->returnTypeDimension);
5887add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        block->Add(new VariableDeclaration(_result, realCall));
5897add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5907add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        // marshall the return value
5917add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        generate_write_to_data(decl->returnType, block,
5927add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                new StringLiteralExpression("_result"), _result, serviceBaseClass->resultData);
5937add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
5947add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5957add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // out parameters
5967add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    int i = 0;
5977add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    arg = method->args;
5987add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    while (arg != NULL) {
5997add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        Type* t = NAMES.Search(arg->type.type.data);
6007add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        Variable* v = stubArgs.Get(i++);
6017add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6027add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        if (convert_direction(arg->direction.data) & OUT_PARAMETER) {
6037add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            generate_write_to_data(t, block, new StringLiteralExpression(arg->name.data),
6047add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                    v, serviceBaseClass->resultData);
6057add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        }
6067add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6077add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        arg = arg->next;
6087add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
6097add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
6107add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6117add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic void
6127add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratogenerate_method(const method_type* method, RpcProxyClass* proxyClass,
6137add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ServiceBaseClass* serviceBaseClass, ResultDispatcherClass* resultsDispatcherClass,
6147add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        int index)
6157add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
6167add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // == the callback interface for results =================================
6177add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // the service base class
6187add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Type* resultsInterfaceType = generate_results_method(method, proxyClass);
6197add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6207add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // == the method in the proxy class =====================================
6217add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    generate_proxy_method(method, proxyClass, resultsDispatcherClass, resultsInterfaceType, index);
6227add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6237add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // == the method in the result dispatcher class =========================
6247add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (resultsInterfaceType != NULL) {
6257add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        generate_result_dispatcher_method(method, resultsDispatcherClass, resultsInterfaceType,
6267add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                index);
6277add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
6287add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6297add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // == the dispatch method in the service base class ======================
6307add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    generate_service_base_methods(method, serviceBaseClass);
6317add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
6327add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6337add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoClass*
6347add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratogenerate_rpc_interface_class(const interface_type* iface)
6357add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
6367add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // the proxy class
6377add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    InterfaceType* interfaceType = static_cast<InterfaceType*>(
6387add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        NAMES.Find(iface->package, iface->name.data));
6397add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    RpcProxyClass* proxy = new RpcProxyClass(iface, interfaceType);
6407add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6417add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // the service base class
6427add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    ServiceBaseClass* base = new ServiceBaseClass(iface);
6437add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    proxy->elements.push_back(base);
6447add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6457add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // the result dispatcher
6467add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    ResultDispatcherClass* results = new ResultDispatcherClass();
6477add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6487add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // all the declared methods of the proxy
6497add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    int index = 0;
6507add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    interface_item_type* item = iface->interface_items;
6517add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    while (item != NULL) {
6527add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        if (item->item_type == METHOD_TYPE) {
6537add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            generate_method((method_type*)item, proxy, base, results, index);
6547add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        }
6557add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        item = item->next;
6567add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        index++;
6577add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
6587add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    base->DoneWithMethods();
6597add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6607add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // only add this if there are methods with results / out parameters
6617add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (results->needed) {
6627add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        proxy->elements.push_back(results);
6637add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
6647add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6657add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    return proxy;
6667add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
6677add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
668