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