generate_java.cpp revision 54b6cfa9a9e5b861a9930af873580d6dc20f773
154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "generate_java.h" 254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "AST.h" 354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "Type.h" 454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <stdio.h> 554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// ================================================= 754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectclass VariableFactory 854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpublic: 1054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project VariableFactory(const string& base); // base must be short 1154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* Get(Type* type); 1254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* Get(int index); 1354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectprivate: 1454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project vector<Variable*> m_vars; 1554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string m_base; 1654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int m_index; 1754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}; 1854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectVariableFactory::VariableFactory(const string& base) 2054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project :m_base(base), 2154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m_index(0) 2254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 2354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 2454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 2554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectVariable* 2654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectVariableFactory::Get(Type* type) 2754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 2854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project char name[100]; 2954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project sprintf(name, "%s%d", m_base.c_str(), m_index); 3054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m_index++; 3154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* v = new Variable(type, name); 3254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m_vars.push_back(v); 3354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return v; 3454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 3554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 3654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectVariable* 3754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectVariableFactory::Get(int index) 3854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 3954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return m_vars[index]; 4054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 4154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 4254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// ================================================= 4354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectclass StubClass : public Class 4454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 4554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpublic: 4654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project StubClass(Type* type, Type* interfaceType); 4754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project virtual ~StubClass(); 4854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 4954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* transact_code; 5054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* transact_data; 5154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* transact_reply; 5254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* transact_flags; 5354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project SwitchStatement* transact_switch; 5454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectprivate: 5554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project void make_as_interface(Type* interfaceType); 5654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}; 5754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 5854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectStubClass::StubClass(Type* type, Type* interfaceType) 5954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project :Class() 6054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 6154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->comment = "/** Local-side IPC implementation stub class. */"; 6254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->modifiers = PUBLIC | ABSTRACT | STATIC; 6354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->what = Class::CLASS; 6454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->type = type; 6554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->extends = BINDER_NATIVE_TYPE; 6654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->interfaces.push_back(interfaceType); 6754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 6854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // descriptor 6954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Field* descriptor = new Field(STATIC | FINAL | PRIVATE, 7054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project new Variable(STRING_TYPE, "DESCRIPTOR")); 7154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project descriptor->value = "\"" + interfaceType->QualifiedName() + "\""; 7254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->elements.push_back(descriptor); 7354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 7454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // ctor 7554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Method* ctor = new Method; 7654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ctor->modifiers = PUBLIC; 7754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ctor->comment = "/** Construct the stub at attach it to the " 7854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "interface. */"; 7954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ctor->name = "Stub"; 8054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ctor->statements = new StatementBlock; 8154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project MethodCall* attach = new MethodCall(THIS_VALUE, "attachInterface", 8254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 2, THIS_VALUE, new LiteralExpression("DESCRIPTOR")); 8354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ctor->statements->Add(attach); 8454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->elements.push_back(ctor); 8554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 8654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // asInterface 8754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project make_as_interface(interfaceType); 8854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 8954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // asBinder 9054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Method* asBinder = new Method; 9154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project asBinder->modifiers = PUBLIC; 9254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project asBinder->returnType = IBINDER_TYPE; 9354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project asBinder->name = "asBinder"; 9454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project asBinder->statements = new StatementBlock; 9554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project asBinder->statements->Add(new ReturnStatement(THIS_VALUE)); 9654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->elements.push_back(asBinder); 9754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 9854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // onTransact 9954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->transact_code = new Variable(INT_TYPE, "code"); 10054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->transact_data = new Variable(PARCEL_TYPE, "data"); 10154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->transact_reply = new Variable(PARCEL_TYPE, "reply"); 10254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->transact_flags = new Variable(INT_TYPE, "flags"); 10354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Method* onTransact = new Method; 10454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project onTransact->modifiers = PUBLIC; 10554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project onTransact->returnType = BOOLEAN_TYPE; 10654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project onTransact->name = "onTransact"; 10754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project onTransact->parameters.push_back(this->transact_code); 10854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project onTransact->parameters.push_back(this->transact_data); 10954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project onTransact->parameters.push_back(this->transact_reply); 11054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project onTransact->parameters.push_back(this->transact_flags); 11154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project onTransact->statements = new StatementBlock; 11254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project onTransact->exceptions.push_back(REMOTE_EXCEPTION_TYPE); 11354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->elements.push_back(onTransact); 11454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->transact_switch = new SwitchStatement(this->transact_code); 11554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 11654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project onTransact->statements->Add(this->transact_switch); 11754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project MethodCall* superCall = new MethodCall(SUPER_VALUE, "onTransact", 4, 11854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->transact_code, this->transact_data, 11954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->transact_reply, this->transact_flags); 12054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project onTransact->statements->Add(new ReturnStatement(superCall)); 12154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 12254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 12354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectStubClass::~StubClass() 12454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 12554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 12654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 12754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid 12854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectStubClass::make_as_interface(Type *interfaceType) 12954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 13054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* obj = new Variable(IBINDER_TYPE, "obj"); 13154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 13254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Method* m = new Method; 13354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m->comment = "/**\n * Cast an IBinder object into an "; 13454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m->comment += interfaceType->Name(); 13554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m->comment += " interface,\n"; 13654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m->comment += " * generating a proxy if needed.\n */"; 13754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m->modifiers = PUBLIC | STATIC; 13854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m->returnType = interfaceType; 13954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m->name = "asInterface"; 14054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m->parameters.push_back(obj); 14154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m->statements = new StatementBlock; 14254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 14354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project IfStatement* ifstatement = new IfStatement(); 14454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ifstatement->expression = new Comparison(obj, "==", NULL_VALUE); 14554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ifstatement->statements = new StatementBlock; 14654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ifstatement->statements->Add(new ReturnStatement(NULL_VALUE)); 14754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m->statements->Add(ifstatement); 14854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 14954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // IInterface iin = obj.queryLocalInterface(DESCRIPTOR) 15054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project MethodCall* queryLocalInterface = new MethodCall(obj, "queryLocalInterface"); 15154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project queryLocalInterface->arguments.push_back(new LiteralExpression("DESCRIPTOR")); 15254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project IInterfaceType* iinType = new IInterfaceType(); 15354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable *iin = new Variable(iinType, "iin"); 15454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project VariableDeclaration* iinVd = new VariableDeclaration(iin, queryLocalInterface, iinType); 15554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m->statements->Add(iinVd); 15654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 15754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // Ensure the instance type of the local object is as expected. 15854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // One scenario where this is needed is if another package (with a 15954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // different class loader) runs in the same process as the service. 16054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 16154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // if (iin != null && iin instanceof <interfaceType>) return (<interfaceType>) iin; 16254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Comparison* iinNotNull = new Comparison(iin, "!=", NULL_VALUE); 16354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Comparison* instOfCheck = new Comparison(iin, " instanceof ", 16454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project new LiteralExpression(interfaceType->QualifiedName())); 16554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project IfStatement* instOfStatement = new IfStatement(); 16654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project instOfStatement->expression = new Comparison(iinNotNull, "&&", instOfCheck); 16754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project instOfStatement->statements = new StatementBlock; 16854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project instOfStatement->statements->Add(new ReturnStatement(new Cast(interfaceType, iin))); 16954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m->statements->Add(instOfStatement); 17054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 17154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string proxyType = interfaceType->QualifiedName(); 17254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project proxyType += ".Stub.Proxy"; 17354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project NewExpression* ne = new NewExpression(NAMES.Find(proxyType)); 17454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ne->arguments.push_back(obj); 17554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m->statements->Add(new ReturnStatement(ne)); 17654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 17754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->elements.push_back(m); 17854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 17954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 18054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 18154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 18254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// ================================================= 18354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectclass ProxyClass : public Class 18454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 18554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpublic: 18654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ProxyClass(Type* type, InterfaceType* interfaceType); 18754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project virtual ~ProxyClass(); 18854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 18954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* mRemote; 19054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project bool mOneWay; 19154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}; 19254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 19354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectProxyClass::ProxyClass(Type* type, InterfaceType* interfaceType) 19454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project :Class() 19554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 19654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->modifiers = PRIVATE | STATIC; 19754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->what = Class::CLASS; 19854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->type = type; 19954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->interfaces.push_back(interfaceType); 20054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 20154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mOneWay = interfaceType->OneWay(); 20254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 20354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // IBinder mRemote 20454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mRemote = new Variable(IBINDER_TYPE, "mRemote"); 20554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->elements.push_back(new Field(PRIVATE, mRemote)); 20654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 20754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // Proxy() 20854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* remote = new Variable(IBINDER_TYPE, "remote"); 20954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Method* ctor = new Method; 21054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ctor->name = "Proxy"; 21154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ctor->statements = new StatementBlock; 21254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ctor->parameters.push_back(remote); 21354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ctor->statements->Add(new Assignment(mRemote, remote)); 21454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->elements.push_back(ctor); 21554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 21654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // IBinder asBinder() 21754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Method* asBinder = new Method; 21854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project asBinder->modifiers = PUBLIC; 21954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project asBinder->returnType = IBINDER_TYPE; 22054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project asBinder->name = "asBinder"; 22154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project asBinder->statements = new StatementBlock; 22254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project asBinder->statements->Add(new ReturnStatement(mRemote)); 22354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this->elements.push_back(asBinder); 22454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 22554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 22654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectProxyClass::~ProxyClass() 22754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 22854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 22954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 23054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// ================================================= 23154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic string 23254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectgather_comments(extra_text_type* extra) 23354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 23454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string s; 23554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (extra) { 23654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (extra->which == SHORT_COMMENT) { 23754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project s += extra->data; 23854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 23954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else if (extra->which == LONG_COMMENT) { 24054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project s += "/*"; 24154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project s += extra->data; 24254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project s += "*/"; 24354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 24454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project extra = extra->next; 24554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 24654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return s; 24754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 24854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 24954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic string 25054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectappend(const char* a, const char* b) 25154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 25254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string s = a; 25354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project s += b; 25454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return s; 25554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 25654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 25754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic void 25854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectgenerate_new_array(Type* t, StatementBlock* addTo, Variable* v, 25954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* parcel) 26054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 26154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* len = new Variable(INT_TYPE, v->name + "_length"); 26254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project addTo->Add(new VariableDeclaration(len, new MethodCall(parcel, "readInt"))); 26354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project IfStatement* lencheck = new IfStatement(); 26454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project lencheck->expression = new Comparison(len, "<", new LiteralExpression("0")); 26554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project lencheck->statements->Add(new Assignment(v, NULL_VALUE)); 26654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project lencheck->elseif = new IfStatement(); 26754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project lencheck->elseif->statements->Add(new Assignment(v, 26854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project new NewArrayExpression(t, len))); 26954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project addTo->Add(lencheck); 27054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 27154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 27254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic void 27354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectgenerate_write_to_parcel(Type* t, StatementBlock* addTo, Variable* v, 27454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* parcel, int flags) 27554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 27654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (v->dimension == 0) { 27754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project t->WriteToParcel(addTo, v, parcel, flags); 27854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 27954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (v->dimension == 1) { 28054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project t->WriteArrayToParcel(addTo, v, parcel, flags); 28154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 28254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 28354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 28454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic void 28554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectgenerate_create_from_parcel(Type* t, StatementBlock* addTo, Variable* v, 28654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* parcel) 28754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 28854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (v->dimension == 0) { 28954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project t->CreateFromParcel(addTo, v, parcel); 29054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 29154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (v->dimension == 1) { 29254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project t->CreateArrayFromParcel(addTo, v, parcel); 29354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 29454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 29554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 29654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic void 29754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectgenerate_read_from_parcel(Type* t, StatementBlock* addTo, Variable* v, 29854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* parcel) 29954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 30054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (v->dimension == 0) { 30154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project t->ReadFromParcel(addTo, v, parcel); 30254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 30354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (v->dimension == 1) { 30454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project t->ReadArrayFromParcel(addTo, v, parcel); 30554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 30654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 30754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 30854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 30954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic void 31054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectgenerate_method(const method_type* method, Class* interface, 31154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project StubClass* stubClass, ProxyClass* proxyClass, int index) 31254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 31354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project arg_type* arg; 31454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int i; 31554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project bool hasOutParams = false; 31654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 31754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const bool oneway = proxyClass->mOneWay || method->oneway; 31854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 31954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // == the TRANSACT_ constant ============================================= 32054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string transactCodeName = "TRANSACTION_"; 32154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project transactCodeName += method->name.data; 32254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 32354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project char transactCodeValue[50]; 32454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project sprintf(transactCodeValue, "(IBinder.FIRST_CALL_TRANSACTION + %d)", index); 32554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 32654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Field* transactCode = new Field(STATIC | FINAL, 32754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project new Variable(INT_TYPE, transactCodeName)); 32854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project transactCode->value = transactCodeValue; 32954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project stubClass->elements.push_back(transactCode); 33054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 33154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // == the declaration in the interface =================================== 33254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Method* decl = new Method; 33354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project decl->comment = gather_comments(method->comments_token->extra); 33454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project decl->modifiers = PUBLIC; 33554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project decl->returnType = NAMES.Search(method->type.type.data); 33654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project decl->returnTypeDimension = method->type.dimension; 33754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project decl->name = method->name.data; 33854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 33954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project arg = method->args; 34054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (arg != NULL) { 34154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project decl->parameters.push_back(new Variable( 34254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project NAMES.Search(arg->type.type.data), arg->name.data, 34354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project arg->type.dimension)); 34454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project arg = arg->next; 34554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 34654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 34754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project decl->exceptions.push_back(REMOTE_EXCEPTION_TYPE); 34854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 34954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project interface->elements.push_back(decl); 35054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 35154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // == the stub method ==================================================== 35254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 35354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Case* c = new Case(transactCodeName); 35454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 35554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project MethodCall* realCall = new MethodCall(THIS_VALUE, method->name.data); 35654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 35754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // interface token validation is the very first thing we do 35854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project c->statements->Add(new MethodCall(stubClass->transact_data, 35954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "enforceInterface", 1, new LiteralExpression("DESCRIPTOR"))); 36054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 36154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // args 36254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project VariableFactory stubArgs("_arg"); 36354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project arg = method->args; 36454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (arg != NULL) { 36554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Type* t = NAMES.Search(arg->type.type.data); 36654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* v = stubArgs.Get(t); 36754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project v->dimension = arg->type.dimension; 36854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 36954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project c->statements->Add(new VariableDeclaration(v)); 37054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 37154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (convert_direction(arg->direction.data) & IN_PARAMETER) { 37254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project generate_create_from_parcel(t, c->statements, v, 37354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project stubClass->transact_data); 37454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 37554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (arg->type.dimension == 0) { 37654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project c->statements->Add(new Assignment( 37754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project v, new NewExpression(v->type))); 37854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 37954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else if (arg->type.dimension == 1) { 38054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project generate_new_array(v->type, c->statements, v, 38154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project stubClass->transact_data); 38254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 38354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else { 38454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project fprintf(stderr, "aidl:internal error %s:%d\n", __FILE__, 38554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project __LINE__); 38654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 38754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 38854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 38954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project realCall->arguments.push_back(v); 39054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 39154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project arg = arg->next; 39254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 39354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 39454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the real call 39554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* _result = NULL; 39654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (0 == strcmp(method->type.type.data, "void")) { 39754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project c->statements->Add(realCall); 39854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 39954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (!oneway) { 40054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // report that there were no exceptions 40154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project MethodCall* ex = new MethodCall(stubClass->transact_reply, 40254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "writeNoException", 0); 40354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project c->statements->Add(ex); 40454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 40554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 40654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project _result = new Variable(decl->returnType, "_result", 40754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project decl->returnTypeDimension); 40854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project c->statements->Add(new VariableDeclaration(_result, realCall)); 40954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 41054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (!oneway) { 41154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // report that there were no exceptions 41254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project MethodCall* ex = new MethodCall(stubClass->transact_reply, 41354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "writeNoException", 0); 41454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project c->statements->Add(ex); 41554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 41654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 41754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // marshall the return value 41854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project generate_write_to_parcel(decl->returnType, c->statements, _result, 41954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project stubClass->transact_reply, 42054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Type::PARCELABLE_WRITE_RETURN_VALUE); 42154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 42254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 42354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // out parameters 42454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project i = 0; 42554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project arg = method->args; 42654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (arg != NULL) { 42754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Type* t = NAMES.Search(arg->type.type.data); 42854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* v = stubArgs.Get(i++); 42954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 43054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (convert_direction(arg->direction.data) & OUT_PARAMETER) { 43154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project generate_write_to_parcel(t, c->statements, v, 43254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project stubClass->transact_reply, 43354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Type::PARCELABLE_WRITE_RETURN_VALUE); 43454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project hasOutParams = true; 43554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 43654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 43754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project arg = arg->next; 43854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 43954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 44054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // return true 44154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project c->statements->Add(new ReturnStatement(TRUE_VALUE)); 44254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project stubClass->transact_switch->cases.push_back(c); 44354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 44454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // == the proxy method =================================================== 44554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Method* proxy = new Method; 44654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project proxy->comment = gather_comments(method->comments_token->extra); 44754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project proxy->modifiers = PUBLIC; 44854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project proxy->returnType = NAMES.Search(method->type.type.data); 44954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project proxy->returnTypeDimension = method->type.dimension; 45054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project proxy->name = method->name.data; 45154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project proxy->statements = new StatementBlock; 45254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project arg = method->args; 45354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (arg != NULL) { 45454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project proxy->parameters.push_back(new Variable( 45554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project NAMES.Search(arg->type.type.data), arg->name.data, 45654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project arg->type.dimension)); 45754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project arg = arg->next; 45854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 45954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project proxy->exceptions.push_back(REMOTE_EXCEPTION_TYPE); 46054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project proxyClass->elements.push_back(proxy); 46154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 46254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the parcels 46354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* _data = new Variable(PARCEL_TYPE, "_data"); 46454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project proxy->statements->Add(new VariableDeclaration(_data, 46554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project new MethodCall(PARCEL_TYPE, "obtain"))); 46654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* _reply = NULL; 46754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (!oneway) { 46854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project _reply = new Variable(PARCEL_TYPE, "_reply"); 46954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project proxy->statements->Add(new VariableDeclaration(_reply, 47054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project new MethodCall(PARCEL_TYPE, "obtain"))); 47154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 47254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 47354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the return value 47454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project _result = NULL; 47554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (0 != strcmp(method->type.type.data, "void")) { 47654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project _result = new Variable(proxy->returnType, "_result", 47754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project method->type.dimension); 47854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project proxy->statements->Add(new VariableDeclaration(_result)); 47954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 48054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 48154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // try and finally 48254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project TryStatement* tryStatement = new TryStatement(); 48354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project proxy->statements->Add(tryStatement); 48454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project FinallyStatement* finallyStatement = new FinallyStatement(); 48554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project proxy->statements->Add(finallyStatement); 48654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 48754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the interface identifier token: the DESCRIPTOR constant, marshalled as a string 48854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project tryStatement->statements->Add(new MethodCall(_data, "writeInterfaceToken", 48954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1, new LiteralExpression("DESCRIPTOR"))); 49054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 49154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the parameters 49254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project arg = method->args; 49354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (arg != NULL) { 49454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Type* t = NAMES.Search(arg->type.type.data); 49554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* v = new Variable(t, arg->name.data, arg->type.dimension); 49654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int dir = convert_direction(arg->direction.data); 49754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (dir == OUT_PARAMETER && arg->type.dimension != 0) { 49854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project IfStatement* checklen = new IfStatement(); 49954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project checklen->expression = new Comparison(v, "==", NULL_VALUE); 50054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project checklen->statements->Add(new MethodCall(_data, "writeInt", 1, 50154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project new LiteralExpression("-1"))); 50254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project checklen->elseif = new IfStatement(); 50354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project checklen->elseif->statements->Add(new MethodCall(_data, "writeInt", 50454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1, new FieldVariable(v, "length"))); 50554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project tryStatement->statements->Add(checklen); 50654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 50754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else if (dir & IN_PARAMETER) { 50854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project generate_write_to_parcel(t, tryStatement->statements, v, _data, 0); 50954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 51054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project arg = arg->next; 51154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 51254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 51354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the transact call 51454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project MethodCall* call = new MethodCall(proxyClass->mRemote, "transact", 4, 51554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project new LiteralExpression("Stub." + transactCodeName), 51654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project _data, _reply ? _reply : NULL_VALUE, 51754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project new LiteralExpression( 51854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project oneway ? "IBinder.FLAG_ONEWAY" : "0")); 51954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project tryStatement->statements->Add(call); 52054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 52154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // throw back exceptions. 52254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (_reply) { 52354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project MethodCall* ex = new MethodCall(_reply, "readException", 0); 52454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project tryStatement->statements->Add(ex); 52554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 52654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 52754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // returning and cleanup 52854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (_reply != NULL) { 52954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (_result != NULL) { 53054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project generate_create_from_parcel(proxy->returnType, 53154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project tryStatement->statements, _result, _reply); 53254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 53354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 53454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the out/inout parameters 53554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project arg = method->args; 53654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (arg != NULL) { 53754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Type* t = NAMES.Search(arg->type.type.data); 53854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Variable* v = new Variable(t, arg->name.data, arg->type.dimension); 53954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (convert_direction(arg->direction.data) & OUT_PARAMETER) { 54054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project generate_read_from_parcel(t, tryStatement->statements, 54154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project v, _reply); 54254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 54354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project arg = arg->next; 54454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 54554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 54654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project finallyStatement->statements->Add(new MethodCall(_reply, "recycle")); 54754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 54854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project finallyStatement->statements->Add(new MethodCall(_data, "recycle")); 54954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 55054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (_result != NULL) { 55154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project proxy->statements->Add(new ReturnStatement(_result)); 55254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 55354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 55454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 55554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic void 55654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectgenerate_interface_descriptors(StubClass* stub, ProxyClass* proxy) 55754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 55854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the interface descriptor transaction handler 55954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Case* c = new Case("INTERFACE_TRANSACTION"); 56054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project c->statements->Add(new MethodCall(stub->transact_reply, "writeString", 56154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1, new LiteralExpression("DESCRIPTOR"))); 56254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project c->statements->Add(new ReturnStatement(TRUE_VALUE)); 56354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project stub->transact_switch->cases.push_back(c); 56454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 56554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // and the proxy-side method returning the descriptor directly 56654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Method* getDesc = new Method; 56754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project getDesc->modifiers = PUBLIC; 56854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project getDesc->returnType = STRING_TYPE; 56954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project getDesc->returnTypeDimension = 0; 57054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project getDesc->name = "getInterfaceDescriptor"; 57154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project getDesc->statements = new StatementBlock; 57254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project getDesc->statements->Add(new ReturnStatement(new LiteralExpression("DESCRIPTOR"))); 57354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project proxy->elements.push_back(getDesc); 57454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 57554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 57654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic Class* 57754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectgenerate_interface_class(const interface_type* iface) 57854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 57954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project InterfaceType* interfaceType = static_cast<InterfaceType*>( 58054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project NAMES.Find(iface->package, iface->name.data)); 58154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 58254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the interface class 58354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Class* interface = new Class; 58454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project interface->comment = gather_comments(iface->comments_token->extra); 58554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project interface->modifiers = PUBLIC; 58654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project interface->what = Class::INTERFACE; 58754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project interface->type = interfaceType; 58854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project interface->interfaces.push_back(IINTERFACE_TYPE); 58954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 59054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the stub inner class 59154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project StubClass* stub = new StubClass( 59254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project NAMES.Find(iface->package, append(iface->name.data, ".Stub").c_str()), 59354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project interfaceType); 59454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project interface->elements.push_back(stub); 59554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 59654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the proxy inner class 59754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ProxyClass* proxy = new ProxyClass( 59854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project NAMES.Find(iface->package, 59954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project append(iface->name.data, ".Stub.Proxy").c_str()), 60054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project interfaceType); 60154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project stub->elements.push_back(proxy); 60254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 60354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // stub and proxy support for getInterfaceDescriptor() 60454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project generate_interface_descriptors(stub, proxy); 60554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 60654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // all the declared methods of the interface 60754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int index = 0; 60854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project interface_item_type* item = iface->interface_items; 60954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (item != NULL) { 61054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (item->item_type == METHOD_TYPE) { 61154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project generate_method((method_type*)item, interface, stub, proxy, index); 61254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 61354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project item = item->next; 61454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project index++; 61554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 61654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 61754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return interface; 61854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 61954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 62054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint 62154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectgenerate_java(const string& filename, const string& originalSrc, 62254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project interface_type* iface) 62354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 62454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Document* document = new Document; 62554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project document->comment = ""; 62654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (iface->package) document->package = iface->package; 62754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project document->originalSrc = originalSrc; 62854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project document->classes.push_back(generate_interface_class(iface)); 62954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 63054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// printf("outputting... filename=%s\n", filename.c_str()); 63154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project FILE* to; 63254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (filename == "-") { 63354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project to = stdout; 63454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 63554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /* open file in binary mode to ensure that the tool produces the 63654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * same output on all platforms !! 63754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 63854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project to = fopen(filename.c_str(), "wb"); 63954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (to == NULL) { 64054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project fprintf(stderr, "unable to open %s for write\n", filename.c_str()); 64154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 1; 64254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 64354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 64454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 64554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project document->Write(to); 64654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 64754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project fclose(to); 64854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 0; 64954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 65054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 651