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