generate_java_rpc.cpp revision 0ca2a36d8dd783e7ba5abffd5929c0e33c6ba91d
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",
90ca2a36d8dd783e7ba5abffd5929c0e33c6ba91dJoe Onorato        "AndroidAtHomeServiceContainer", Type::BUILT_IN, false, 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;
974742c0cd30b6e76361cc72182339f0a30efceee2Joe Onorato    Variable* requestParam;
987add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* errorParam;
997add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* requestData;
1007add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* resultData;
1017add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    IfStatement* dispatchIfStatement;
1027add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1037add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratoprivate:
1047add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    void generate_ctor();
1057add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    void generate_process();
1067add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato};
1077add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1087add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoServiceBaseClass::ServiceBaseClass(const interface_type* iface)
1097add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    :Class(),
1107add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato     needed(false),
1117add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato     dispatchIfStatement(NULL)
1127add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
1137add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->comment = "/** Extend this to implement a link service. */";
1147add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->modifiers = STATIC | PUBLIC | ABSTRACT;
1157add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->what = Class::CLASS;
1167add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->type = NAMES.Find(iface->package, append(iface->name.data, ".ServiceBase").c_str());
1177add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->extends = RPC_SERVICE_BASE_TYPE;
1187add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1197add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // methods
1207add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    generate_ctor();
1217add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    generate_process();
1227add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
1237add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1247add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoServiceBaseClass::~ServiceBaseClass()
1257add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
1267add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
1277add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1287add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratovoid
1297add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoServiceBaseClass::generate_ctor()
1307add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
1317add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* container = new Variable(SERVICE_CONTAINER_TYPE, "container");
1327add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* name = new Variable(STRING_TYPE, "name");
1337add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* type = new Variable(STRING_TYPE, "type");
1347add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* version = new Variable(INT_TYPE, "version");
1357add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Method* ctor = new Method;
1367add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->modifiers = PUBLIC;
1377add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->name = class_name_leaf(this->type->Name());
1387add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->statements = new StatementBlock;
1397add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->parameters.push_back(container);
1407add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->parameters.push_back(name);
1417add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->parameters.push_back(type);
1427add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->parameters.push_back(version);
1437add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->elements.push_back(ctor);
1447add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1457add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    ctor->statements->Add(new MethodCall("super", 4, container, name, type, version));
1467add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
1477add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1487add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratovoid
1497add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoServiceBaseClass::generate_process()
1507add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
1517add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // byte[] process(String action, byte[] params, RpcError status)
1527add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->processMethod = new Method;
1537add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->processMethod->modifiers = PUBLIC;
1547add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->processMethod->returnType = BYTE_TYPE;
1557add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->processMethod->returnTypeDimension = 1;
1567add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->processMethod->name = "process";
1577add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->processMethod->statements = new StatementBlock;
1587add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->elements.push_back(this->processMethod);
1597add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1607add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->actionParam = new Variable(STRING_TYPE, "action");
1617add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->processMethod->parameters.push_back(this->actionParam);
1627add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1634742c0cd30b6e76361cc72182339f0a30efceee2Joe Onorato    this->requestParam = new Variable(BYTE_TYPE, "requestParam", 1);
1644742c0cd30b6e76361cc72182339f0a30efceee2Joe Onorato    this->processMethod->parameters.push_back(this->requestParam);
1657add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1667add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->errorParam = new Variable(RPC_ERROR_TYPE, "errorParam", 0);
1677add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->processMethod->parameters.push_back(this->errorParam);
1687add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1697add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->requestData = new Variable(RPC_DATA_TYPE, "request");
1707add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->processMethod->statements->Add(new VariableDeclaration(requestData,
1714742c0cd30b6e76361cc72182339f0a30efceee2Joe Onorato                new NewExpression(RPC_DATA_TYPE, 1, this->requestParam)));
1727add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
173a1426e61f4004ed8744f81366d15c209fa7cf9b7Joe Onorato    this->resultData = new Variable(RPC_DATA_TYPE, "resultData");
1747add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->processMethod->statements->Add(new VariableDeclaration(this->resultData,
1757add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                NULL_VALUE));
1767add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
1777add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1787add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratovoid
1797add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoServiceBaseClass::AddMethod(const string& methodName, StatementBlock** statements)
1807add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
1817add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    IfStatement* ifs = new IfStatement();
1827add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ifs->expression = new MethodCall(new StringLiteralExpression(methodName), "equals", 1,
1837add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                this->actionParam);
1847add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ifs->statements = *statements = new StatementBlock;
1857add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (this->dispatchIfStatement == NULL) {
1867add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->dispatchIfStatement = ifs;
1877add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->processMethod->statements->Add(dispatchIfStatement);
1887add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    } else {
1897add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->dispatchIfStatement->elseif = ifs;
1907add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->dispatchIfStatement = ifs;
1917add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
1927add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
1937add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
1947add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratovoid
1957add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoServiceBaseClass::DoneWithMethods()
1967add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
1974742c0cd30b6e76361cc72182339f0a30efceee2Joe Onorato    IfStatement* fallthrough = new IfStatement();
1984742c0cd30b6e76361cc72182339f0a30efceee2Joe Onorato        fallthrough->statements = new StatementBlock;
1994742c0cd30b6e76361cc72182339f0a30efceee2Joe Onorato        fallthrough->statements->Add(new ReturnStatement(
2004742c0cd30b6e76361cc72182339f0a30efceee2Joe Onorato                    new MethodCall(SUPER_VALUE, "process", 3, this->actionParam, this->requestParam,
2014742c0cd30b6e76361cc72182339f0a30efceee2Joe Onorato                        this->errorParam)));
2024742c0cd30b6e76361cc72182339f0a30efceee2Joe Onorato    this->dispatchIfStatement->elseif = fallthrough;
2037add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    IfStatement* s = new IfStatement;
2047add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        s->statements = new StatementBlock;
2057add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->processMethod->statements->Add(s);
2067add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    s->expression = new Comparison(this->resultData, "!=", NULL_VALUE);
2077add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    s->statements->Add(new ReturnStatement(new MethodCall(this->resultData, "serialize")));
2087add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    s->elseif = new IfStatement;
2097add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    s = s->elseif;
2107add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    s->statements->Add(new ReturnStatement(NULL_VALUE));
2117add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
2127add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2137add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato// =================================================
2147add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratoclass ResultDispatcherClass : public Class
2157add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
2167add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratopublic:
2177add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    ResultDispatcherClass();
2187add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    virtual ~ResultDispatcherClass();
2197add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2207add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    void AddMethod(int index, const string& name, Method** method, Variable** param);
2217add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2227add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    bool needed;
2237add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* methodId;
2247add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* callback;
2257add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Method* onResultMethod;
2267add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* resultParam;
2277add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    SwitchStatement* methodSwitch;
2287add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2297add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratoprivate:
2307add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    void generate_ctor();
2317add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    void generate_onResult();
2327add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato};
2337add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2347add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoResultDispatcherClass::ResultDispatcherClass()
2357add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    :Class(),
2367add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato     needed(false)
2377add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
2387add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->modifiers = PRIVATE | FINAL;
2397add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->what = Class::CLASS;
2400ca2a36d8dd783e7ba5abffd5929c0e33c6ba91dJoe Onorato    this->type = new Type("_ResultDispatcher", Type::GENERATED, false, false, false);
2417add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->interfaces.push_back(RPC_RESULT_HANDLER_TYPE);
2427add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2437add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // methodId
2447add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->methodId = new Variable(INT_TYPE, "methodId");
2457add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->elements.push_back(new Field(PRIVATE, this->methodId));
2467add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->callback = new Variable(OBJECT_TYPE, "callback");
2477add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->elements.push_back(new Field(PRIVATE, this->callback));
2487add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2497add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // methods
2507add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    generate_ctor();
2517add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    generate_onResult();
2527add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
2537add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2547add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoResultDispatcherClass::~ResultDispatcherClass()
2557add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
2567add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
2577add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2587add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratovoid
2597add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoResultDispatcherClass::generate_ctor()
2607add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
2617add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* methodIdParam = new Variable(INT_TYPE, "methId");
2627add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* callbackParam = new Variable(OBJECT_TYPE, "cbObj");
2637add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Method* ctor = new Method;
2647add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->modifiers = PUBLIC;
2657add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->name = this->type->Name();
2667add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->statements = new StatementBlock;
2677add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->parameters.push_back(methodIdParam);
2687add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ctor->parameters.push_back(callbackParam);
2697add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->elements.push_back(ctor);
2707add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2717add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    ctor->statements->Add(new Assignment(this->methodId, methodIdParam));
2727add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    ctor->statements->Add(new Assignment(this->callback, callbackParam));
2737add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
2747add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2757add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratovoid
2767add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoResultDispatcherClass::generate_onResult()
2777add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
2787add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->onResultMethod = new Method;
2797add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->onResultMethod->modifiers = PUBLIC;
2807add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->onResultMethod->returnType = VOID_TYPE;
2817add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->onResultMethod->returnTypeDimension = 0;
2827add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->onResultMethod->name = "onResult";
2837add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        this->onResultMethod->statements = new StatementBlock;
2847add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->elements.push_back(this->onResultMethod);
2857add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2867add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->resultParam = new Variable(BYTE_TYPE, "result", 1);
2877add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->onResultMethod->parameters.push_back(this->resultParam);
2887add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2897add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->methodSwitch = new SwitchStatement(this->methodId);
2907add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->onResultMethod->statements->Add(this->methodSwitch);
2917add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
2927add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
2937add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratovoid
2947add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoResultDispatcherClass::AddMethod(int index, const string& name, Method** method, Variable** param)
2957add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
2967add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Method* m = new Method;
2977add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        m->modifiers = PUBLIC;
2987add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        m->returnType = VOID_TYPE;
2997add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        m->returnTypeDimension = 0;
3007add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        m->name = name;
3017add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        m->statements = new StatementBlock;
3027add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    *param = new Variable(BYTE_TYPE, "result", 1);
3037add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    m->parameters.push_back(*param);
3047add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->elements.push_back(m);
3057add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    *method = m;
3067add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3077add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Case* c = new Case(format_int(index));
3087add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    c->statements->Add(new MethodCall(new LiteralExpression("this"), name, 1, this->resultParam));
309a1426e61f4004ed8744f81366d15c209fa7cf9b7Joe Onorato    c->statements->Add(new Break());
3107add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3117add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    this->methodSwitch->cases.push_back(c);
3127add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
3137add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3147add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato// =================================================
3157add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic void
3167add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratogenerate_new_array(Type* t, StatementBlock* addTo, Variable* v, Variable* from)
3177add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
3187add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    fprintf(stderr, "aidl: implement generate_new_array %s:%d\n", __FILE__, __LINE__);
3197add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    exit(1);
3207add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
3217add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3227add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic void
3237add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratogenerate_create_from_data(Type* t, StatementBlock* addTo, const string& key, Variable* v,
3247add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                            Variable* data, Variable** cl)
3257add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
3267add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Expression* k = new StringLiteralExpression(key);
3277add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (v->dimension == 0) {
3287add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        t->CreateFromRpcData(addTo, k, v, data, cl);
3297add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
3307add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (v->dimension == 1) {
3317add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        //t->ReadArrayFromRpcData(addTo, v, data, cl);
3327add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        fprintf(stderr, "aidl: implement generate_create_from_data for arrays%s:%d\n",
3337add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                __FILE__, __LINE__);
3347add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
3357add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
3367add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3377add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic void
3387add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratogenerate_write_to_data(Type* t, StatementBlock* addTo, Expression* k, Variable* v, Variable* data)
3397add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
3407add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (v->dimension == 0) {
3417add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        t->WriteToRpcData(addTo, k, v, data, 0);
3427add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
3437add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (v->dimension == 1) {
3447add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        //t->WriteArrayToParcel(addTo, v, data);
3457add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        fprintf(stderr, "aidl: implement generate_write_to_data for arrays%s:%d\n",
3467add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                __FILE__, __LINE__);
3477add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
3487add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
3497add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3507add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato// =================================================
3517add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic string
3527add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratoresults_class_name(const string& n)
3537add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
3547add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    string str = n;
3557add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    str[0] = toupper(str[0]);
3567add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    str.insert(0, "On");
3577add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    return str;
3587add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
3597add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3607add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic string
3617add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratoresults_method_name(const string& n)
3627add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
3637add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    string str = n;
3647add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    str[0] = toupper(str[0]);
3657add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    str.insert(0, "on");
3667add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    return str;
3677add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
3687add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3697add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic Type*
3707add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratogenerate_results_method(const method_type* method, RpcProxyClass* proxyClass)
3717add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
3727add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    arg_type* arg;
3737add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3747add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    string resultsMethodName = results_method_name(method->name.data);
3757add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Type* resultsInterfaceType = new Type(results_class_name(method->name.data),
3760ca2a36d8dd783e7ba5abffd5929c0e33c6ba91dJoe Onorato            Type::GENERATED, false, false, false);
3777add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3787add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (!method->oneway) {
3797add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        Class* resultsClass = new Class;
3807add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            resultsClass->modifiers = STATIC | PUBLIC;
3817add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            resultsClass->what = Class::INTERFACE;
3827add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            resultsClass->type = resultsInterfaceType;
3837add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
3847add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        Method* resultMethod = new Method;
3857add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            resultMethod->comment = gather_comments(method->comments_token->extra);
3867add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            resultMethod->modifiers = PUBLIC;
3877add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            resultMethod->returnType = VOID_TYPE;
3887add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            resultMethod->returnTypeDimension = 0;
3897add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            resultMethod->name = resultsMethodName;
3907add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        if (0 != strcmp("void", method->type.type.data)) {
3917add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            resultMethod->parameters.push_back(new Variable(NAMES.Search(method->type.type.data),
3927add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                        "_result", method->type.dimension));
3937add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        }
3947add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        arg = method->args;
3957add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        while (arg != NULL) {
3967add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            if (convert_direction(arg->direction.data) & OUT_PARAMETER) {
3977add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                resultMethod->parameters.push_back(new Variable(
3987add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                                    NAMES.Search(arg->type.type.data), arg->name.data,
3997add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                                    arg->type.dimension));
4007add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            }
4017add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            arg = arg->next;
4027add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        }
4037add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        resultsClass->elements.push_back(resultMethod);
4047add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4057add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        if (resultMethod->parameters.size() > 0) {
4067add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            proxyClass->elements.push_back(resultsClass);
4077add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            return resultsInterfaceType;
4087add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        }
4097add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
4107add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    //delete resultsInterfaceType;
4117add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    return NULL;
4127add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
4137add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4147add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic void
4157add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratogenerate_proxy_method(const method_type* method, RpcProxyClass* proxyClass,
4167add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ResultDispatcherClass* resultsDispatcherClass, Type* resultsInterfaceType, int index)
4177add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
4187add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    arg_type* arg;
4197add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Method* proxyMethod = new Method;
4207add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        proxyMethod->comment = gather_comments(method->comments_token->extra);
4217add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        proxyMethod->modifiers = PUBLIC;
4227add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        proxyMethod->returnType = VOID_TYPE;
4237add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        proxyMethod->returnTypeDimension = 0;
4247add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        proxyMethod->name = method->name.data;
4257add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        proxyMethod->statements = new StatementBlock;
4267add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    proxyClass->elements.push_back(proxyMethod);
4277add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4287add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // The local variables
4297add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* _data = new Variable(RPC_DATA_TYPE, "_data");
4307add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    proxyMethod->statements->Add(new VariableDeclaration(_data, new NewExpression(RPC_DATA_TYPE)));
4317add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4327add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // Add the arguments
4337add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    arg = method->args;
4347add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    while (arg != NULL) {
4357add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        if (convert_direction(arg->direction.data) & IN_PARAMETER) {
4367add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            // Function signature
4377add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            Type* t = NAMES.Search(arg->type.type.data);
4387add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            Variable* v = new Variable(t, arg->name.data, arg->type.dimension);
4397add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            proxyMethod->parameters.push_back(v);
4407add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4417add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            // Input parameter marshalling
4427add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            generate_write_to_data(t, proxyMethod->statements,
4437add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                    new StringLiteralExpression(arg->name.data), v, _data);
4447add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        }
4457add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        arg = arg->next;
4467add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
4477add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4487add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // If there is a results interface for this class
4497add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Expression* resultParameter;
4507add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (resultsInterfaceType != NULL) {
4517add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        // Result interface parameter
4527add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        Variable* resultListener = new Variable(resultsInterfaceType, "_result");
4537add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        proxyMethod->parameters.push_back(resultListener);
4547add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4557add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        // Add the results dispatcher callback
4567add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        resultsDispatcherClass->needed = true;
4577add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        resultParameter = new NewExpression(resultsDispatcherClass->type, 2,
4587add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                new LiteralExpression(format_int(index)), resultListener);
4597add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    } else {
4607add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        resultParameter = NULL_VALUE;
4617add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
4627add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4637add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // All proxy methods take an error parameter
4647add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* errorListener = new Variable(RPC_ERROR_LISTENER_TYPE, "_errors");
4657add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    proxyMethod->parameters.push_back(errorListener);
4667add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4677add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // Call the broker
4687add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    proxyMethod->statements->Add(new MethodCall(RPC_BROKER_TYPE, "sendRequest", 6,
4697add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                new FieldVariable(THIS_VALUE, "_context"),
4707add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                new StringLiteralExpression(method->name.data),
4717add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                proxyClass->endpoint,
4727add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                new MethodCall(_data, "serialize"),
4737add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                resultParameter,
4747add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                errorListener));
4757add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
4767add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4777add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic void
4787add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratogenerate_result_dispatcher_method(const method_type* method,
4797add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ResultDispatcherClass* resultsDispatcherClass, Type* resultsInterfaceType, int index)
4807add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
4817add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    arg_type* arg;
4827add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Method* dispatchMethod;
4837add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* dispatchParam;
4847add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    resultsDispatcherClass->AddMethod(index, method->name.data, &dispatchMethod, &dispatchParam);
4857add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4867add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* classLoader = NULL;
4877add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* resultData = new Variable(RPC_DATA_TYPE, "resultData");
4887add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    dispatchMethod->statements->Add(new VariableDeclaration(resultData,
4897add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                new NewExpression(RPC_DATA_TYPE, 1, dispatchParam)));
4907add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4917add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // The callback method itself
4927add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    MethodCall* realCall = new MethodCall(
4937add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            new Cast(resultsInterfaceType, new FieldVariable(THIS_VALUE, "callback")),
4947add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            results_method_name(method->name.data));
4957add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
4967add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // The return value
4977add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    {
4987add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        Type* t = NAMES.Search(method->type.type.data);
4997add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        Variable* rv = new Variable(t, "rv");
5007add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        dispatchMethod->statements->Add(new VariableDeclaration(rv));
5017add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        generate_create_from_data(t, dispatchMethod->statements, "_result", rv,
5027add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                resultData, &classLoader);
5037add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        realCall->arguments.push_back(rv);
5047add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
5057add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5067add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    VariableFactory stubArgs("arg");
5077add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    arg = method->args;
5087add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    while (arg != NULL) {
5097add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        if (convert_direction(arg->direction.data) & OUT_PARAMETER) {
5107add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            // Unmarshall the results
5117add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            Type* t = NAMES.Search(arg->type.type.data);
5127add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            Variable* v = stubArgs.Get(t);
5137add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            dispatchMethod->statements->Add(new VariableDeclaration(v));
5147add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5157add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            generate_create_from_data(t, dispatchMethod->statements, arg->name.data, v,
5167add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                    resultData, &classLoader);
5177add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5187add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            // Add the argument to the callback
5197add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            realCall->arguments.push_back(v);
5207add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        }
5217add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        arg = arg->next;
5227add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
5237add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5247add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // Call the callback method
5257add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    dispatchMethod->statements->Add(realCall);
5267add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
5277add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5287add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic void
5297add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratogenerate_service_base_methods(const method_type* method, ServiceBaseClass* serviceBaseClass)
5307add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
5317add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    arg_type* arg;
5327add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    StatementBlock* block;
5337add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    serviceBaseClass->AddMethod(method->name.data, &block);
5347add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5357add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // The abstract method that the service developers implement
5367add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Method* decl = new Method;
5377add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        decl->comment = gather_comments(method->comments_token->extra);
5387add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        decl->modifiers = PUBLIC | ABSTRACT;
5397add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        decl->returnType = NAMES.Search(method->type.type.data);
5407add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        decl->returnTypeDimension = method->type.dimension;
5417add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        decl->name = method->name.data;
5427add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5437add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    arg = method->args;
5447add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    while (arg != NULL) {
5457add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        decl->parameters.push_back(new Variable(
5467add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                            NAMES.Search(arg->type.type.data), arg->name.data,
5477add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                            arg->type.dimension));
5487add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        arg = arg->next;
5497add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
5507add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5517add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    serviceBaseClass->elements.push_back(decl);
5527add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5537add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // The call to decl (from above)
5547add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    MethodCall* realCall = new MethodCall(THIS_VALUE, method->name.data);
5557add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5567add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // args
5577add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* classLoader = NULL;
5587add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    VariableFactory stubArgs("_arg");
5597add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    arg = method->args;
5607add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    while (arg != NULL) {
5617add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        Type* t = NAMES.Search(arg->type.type.data);
5627add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        Variable* v = stubArgs.Get(t);
5637add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        v->dimension = arg->type.dimension;
5647add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5657add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        // Unmarshall the parameter
5667add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        block->Add(new VariableDeclaration(v));
5677add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        if (convert_direction(arg->direction.data) & IN_PARAMETER) {
5687add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            generate_create_from_data(t, block, arg->name.data, v,
5697add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                    serviceBaseClass->requestData, &classLoader);
5707add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        } else {
5717add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            if (arg->type.dimension == 0) {
5727add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                block->Add(new Assignment(v, new NewExpression(v->type)));
5737add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            }
5747add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            else if (arg->type.dimension == 1) {
5757add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                generate_new_array(v->type, block, v, serviceBaseClass->requestData);
5767add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            }
5777add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            else {
5787add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__,
5797add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                        __LINE__);
5807add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            }
5817add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        }
5827add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5837add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        // Add that parameter to the method call
5847add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        realCall->arguments.push_back(v);
5857add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5867add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        arg = arg->next;
5877add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
5887add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
5897add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // the real call
590a1426e61f4004ed8744f81366d15c209fa7cf9b7Joe Onorato    bool first = true;
5917add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Variable* _result = NULL;
5927add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (0 == strcmp(method->type.type.data, "void")) {
5937add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        block->Add(realCall);
5947add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    } else {
5957add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        _result = new Variable(decl->returnType, "_result",
5967add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                                decl->returnTypeDimension);
5977add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        block->Add(new VariableDeclaration(_result, realCall));
5987add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
599a1426e61f4004ed8744f81366d15c209fa7cf9b7Joe Onorato        // need the result RpcData
600a1426e61f4004ed8744f81366d15c209fa7cf9b7Joe Onorato        if (first) {
601a1426e61f4004ed8744f81366d15c209fa7cf9b7Joe Onorato            block->Add(new Assignment(serviceBaseClass->resultData,
602a1426e61f4004ed8744f81366d15c209fa7cf9b7Joe Onorato                        new NewExpression(RPC_DATA_TYPE)));
603a1426e61f4004ed8744f81366d15c209fa7cf9b7Joe Onorato            first = false;
604a1426e61f4004ed8744f81366d15c209fa7cf9b7Joe Onorato        }
605a1426e61f4004ed8744f81366d15c209fa7cf9b7Joe Onorato
6067add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        // marshall the return value
6077add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        generate_write_to_data(decl->returnType, block,
6087add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                new StringLiteralExpression("_result"), _result, serviceBaseClass->resultData);
6097add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
6107add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6117add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // out parameters
6127add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    int i = 0;
6137add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    arg = method->args;
6147add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    while (arg != NULL) {
6157add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        Type* t = NAMES.Search(arg->type.type.data);
6167add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        Variable* v = stubArgs.Get(i++);
6177add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6187add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        if (convert_direction(arg->direction.data) & OUT_PARAMETER) {
619a1426e61f4004ed8744f81366d15c209fa7cf9b7Joe Onorato            // need the result RpcData
620a1426e61f4004ed8744f81366d15c209fa7cf9b7Joe Onorato            if (first) {
621a1426e61f4004ed8744f81366d15c209fa7cf9b7Joe Onorato                block->Add(new Assignment(serviceBaseClass->resultData,
622a1426e61f4004ed8744f81366d15c209fa7cf9b7Joe Onorato                            new NewExpression(RPC_DATA_TYPE)));
623a1426e61f4004ed8744f81366d15c209fa7cf9b7Joe Onorato                first = false;
624a1426e61f4004ed8744f81366d15c209fa7cf9b7Joe Onorato            }
625a1426e61f4004ed8744f81366d15c209fa7cf9b7Joe Onorato
626a1426e61f4004ed8744f81366d15c209fa7cf9b7Joe Onorato
6277add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            generate_write_to_data(t, block, new StringLiteralExpression(arg->name.data),
6287add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                    v, serviceBaseClass->resultData);
6297add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        }
6307add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6317add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        arg = arg->next;
6327add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
6337add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
6347add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6357add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratostatic void
6367add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratogenerate_method(const method_type* method, RpcProxyClass* proxyClass,
6377add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        ServiceBaseClass* serviceBaseClass, ResultDispatcherClass* resultsDispatcherClass,
6387add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        int index)
6397add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
6407add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // == the callback interface for results =================================
6417add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // the service base class
6427add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    Type* resultsInterfaceType = generate_results_method(method, proxyClass);
6437add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6447add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // == the method in the proxy class =====================================
6457add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    generate_proxy_method(method, proxyClass, resultsDispatcherClass, resultsInterfaceType, index);
6467add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6477add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // == the method in the result dispatcher class =========================
6487add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (resultsInterfaceType != NULL) {
6497add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        generate_result_dispatcher_method(method, resultsDispatcherClass, resultsInterfaceType,
6507add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato                index);
6517add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
6527add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6537add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // == the dispatch method in the service base class ======================
6547add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    generate_service_base_methods(method, serviceBaseClass);
6557add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
6567add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6577add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe OnoratoClass*
6587add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onoratogenerate_rpc_interface_class(const interface_type* iface)
6597add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato{
6607add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // the proxy class
6617add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    InterfaceType* interfaceType = static_cast<InterfaceType*>(
6627add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        NAMES.Find(iface->package, iface->name.data));
6637add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    RpcProxyClass* proxy = new RpcProxyClass(iface, interfaceType);
6647add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6657add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // the service base class
6667add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    ServiceBaseClass* base = new ServiceBaseClass(iface);
6677add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    proxy->elements.push_back(base);
6687add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6697add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // the result dispatcher
6707add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    ResultDispatcherClass* results = new ResultDispatcherClass();
6717add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6727add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // all the declared methods of the proxy
6737add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    int index = 0;
6747add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    interface_item_type* item = iface->interface_items;
6757add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    while (item != NULL) {
6767add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        if (item->item_type == METHOD_TYPE) {
6777add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato            generate_method((method_type*)item, proxy, base, results, index);
6787add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        }
6797add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        item = item->next;
6807add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        index++;
6817add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
6827add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    base->DoneWithMethods();
6837add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6847add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    // only add this if there are methods with results / out parameters
6857add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    if (results->needed) {
6867add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato        proxy->elements.push_back(results);
6877add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    }
6887add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
6897add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato    return proxy;
6907add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato}
6917add83bbb52d8783be9c3c68dc3dd4d7f2fead54Joe Onorato
692