aidl.cpp revision e24dbeafe64278408b3342fcb77756bc7d091791
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "aidl_language.h" 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "options.h" 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "search_path.h" 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "Type.h" 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "generate_java.h" 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h> 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h> 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/param.h> 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/stat.h> 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h> 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string.h> 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <map> 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_MS_C_RUNTIME 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <io.h> 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/stat.h> 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef O_BINARY 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project# define O_BINARY 0 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace std; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttest_document(document_item_type* d) 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (d) { 32fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato if (d->item_type == INTERFACE_TYPE_BINDER) { 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_type* c = (interface_type*)d; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("interface %s %s {\n", c->package, c->name.data); 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_item_type *q = (interface_item_type*)c->interface_items; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (q) { 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (q->item_type == METHOD_TYPE) { 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method_type *m = (method_type*)q; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf(" %s %s(", m->type.type.data, m->name.data); 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg_type *p = m->args; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (p) { 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("%s %s",p->type.type.data,p->name.data); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p->next) printf(", "); 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p=p->next; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf(")"); 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf(";\n"); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project q=q->next; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("}\n"); 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (d->item_type == PARCELABLE_TYPE) { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcelable_type* b = (parcelable_type*)d; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("parcelable %s %s;\n", b->package, b->name.data); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 577db766c3fec2795b08d237f29b972f474983684bJoe Onorato else if (d->item_type == FLATTENABLE_TYPE) { 587db766c3fec2795b08d237f29b972f474983684bJoe Onorato parcelable_type* b = (parcelable_type*)d; 597db766c3fec2795b08d237f29b972f474983684bJoe Onorato printf("flattenable %s %s;\n", b->package, b->name.data); 607db766c3fec2795b08d237f29b972f474983684bJoe Onorato } 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 62066aa99d2d114d46406e00fcc23d193d117395b1Scott Turner printf("UNKNOWN d=0x%08lx d->item_type=%d\n", (long)d, d->item_type); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d = d->next; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================== 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconvert_direction(const char* direction) 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (direction == NULL) { 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return IN_PARAMETER; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (0 == strcmp(direction, "in")) { 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return IN_PARAMETER; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (0 == strcmp(direction, "out")) { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return OUT_PARAMETER; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return INOUT_PARAMETER; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================== 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct import_info { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* from; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* filename; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer_type statement; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* neededClass; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project document_item_type* doc; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct import_info* next; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdocument_item_type* g_document = NULL; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport_info* g_imports = NULL; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmain_document_parsed(document_item_type* d) 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_document = d; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmain_import_parsed(buffer_type* statement) 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import_info* import = (import_info*)malloc(sizeof(import_info)); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(import, 0, sizeof(import_info)); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->from = strdup(g_currentFilename); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->statement.lineno = statement->lineno; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->statement.data = strdup(statement->data); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->statement.extra = NULL; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->next = g_imports; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->neededClass = parse_import_statement(statement->data); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_imports = import; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic ParserCallbacks g_mainCallbacks = { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &main_document_parsed, 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &main_import_parsed 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectchar* 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectparse_import_statement(const char* text) 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* end; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int len; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (isspace(*text)) { 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text++; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!isspace(*text)) { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text++; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (isspace(*text)) { 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text++; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project end = text; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!isspace(*end) && *end != ';') { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project end++; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len = end-text; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char* rv = (char*)malloc(len+1); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcpy(rv, text, len); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rv[len] = '\0'; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rv; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================== 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport_import_parsed(buffer_type* statement) 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic ParserCallbacks g_importCallbacks = { 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &main_document_parsed, 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &import_import_parsed 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================== 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectcheck_filename(const char* filename, const char* package, buffer_type* name) 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* p; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project string expected; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project string fn; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t len; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char cwd[MAXPATHLEN]; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool valid = false; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_WINDOWS_PATHS 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isalpha(filename[0]) && filename[1] == ':' 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && filename[2] == OS_PATH_SEPARATOR) { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (filename[0] == OS_PATH_SEPARATOR) { 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fn = filename; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fn = getcwd(cwd, sizeof(cwd)); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len = fn.length(); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fn[len-1] != OS_PATH_SEPARATOR) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fn += OS_PATH_SEPARATOR; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fn += filename; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (package) { 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project expected = package; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project expected += '.'; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len = expected.length(); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; i<len; i++) { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (expected[i] == '.') { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project expected[i] = OS_PATH_SEPARATOR; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = strchr(name->data, '.'); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len = p ? p-name->data : strlen(name->data); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project expected.append(name->data, len); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project expected += ".aidl"; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len = fn.length(); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project valid = (len >= expected.length()); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (valid) { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = fn.c_str() + (len - expected.length()); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_WINDOWS_PATHS 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (OS_PATH_SEPARATOR != '/') { 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Input filename under cygwin most likely has / separators 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // whereas the expected string uses \\ separators. Adjust 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // them accordingly. 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (char *c = const_cast<char *>(p); *c; ++c) { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*c == '/') *c = OS_PATH_SEPARATOR; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef OS_CASE_SENSITIVE 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project valid = (expected == p); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project valid = !strcasecmp(expected.c_str(), p); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!valid) { 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d interface %s should be declared in a file" 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " called %s.\n", 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, name->lineno, name->data, expected.c_str()); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectcheck_filenames(const char* filename, document_item_type* items) 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int err = 0; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (items) { 2457db766c3fec2795b08d237f29b972f474983684bJoe Onorato if (items->item_type == PARCELABLE_TYPE 2467db766c3fec2795b08d237f29b972f474983684bJoe Onorato || items->item_type == FLATTENABLE_TYPE) { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcelable_type* p = (parcelable_type*)items; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= check_filename(filename, p->package, &p->name); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 250fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato else if (items->item_type == INTERFACE_TYPE_BINDER 251fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato || items->item_type == INTERFACE_TYPE_RPC) { 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_type* c = (interface_type*)items; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= check_filename(filename, c->package, &c->name); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "aidl: internal error unkown document type %d.\n", 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project items->item_type); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project items = items->next; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================== 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectkind_to_string(int kind) 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (kind) 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Type::INTERFACE: 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "an interface"; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Type::PARCELABLE: 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "a parcelable"; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "ERROR"; 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic char* 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectrfind(char* str, char c) 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char* p = str + strlen(str) - 1; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (p >= str) { 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*p == c) { 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p--; 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectgather_types(const char* filename, document_item_type* items) 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int err = 0; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (items) { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Type* type; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (items->item_type == PARCELABLE_TYPE) { 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcelable_type* p = (parcelable_type*)items; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type = new ParcelableType(p->package ? p->package : "", 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p->name.data, false, filename, p->name.lineno); 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3047db766c3fec2795b08d237f29b972f474983684bJoe Onorato else if (items->item_type == FLATTENABLE_TYPE) { 3057db766c3fec2795b08d237f29b972f474983684bJoe Onorato parcelable_type* p = (parcelable_type*)items; 3067db766c3fec2795b08d237f29b972f474983684bJoe Onorato type = new FlattenableType(p->package ? p->package : "", 3077db766c3fec2795b08d237f29b972f474983684bJoe Onorato p->name.data, false, filename, p->name.lineno); 3087db766c3fec2795b08d237f29b972f474983684bJoe Onorato } 309fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato else if (items->item_type == INTERFACE_TYPE_BINDER 310fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato || items->item_type == INTERFACE_TYPE_RPC) { 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_type* c = (interface_type*)items; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type = new InterfaceType(c->package ? c->package : "", 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->name.data, false, c->oneway, 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, c->name.lineno); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "aidl: internal error %s:%d\n", __FILE__, __LINE__); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Type* old = NAMES.Find(type->QualifiedName()); 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (old == NULL) { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NAMES.Add(type); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 325fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato if (items->item_type == INTERFACE_TYPE_BINDER) { 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for interfaces, also add the stub and proxy types, we don't 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // bother checking these for duplicates, because the parser 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // won't let us do it. 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_type* c = (interface_type*)items; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project string name = c->name.data; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name += ".Stub"; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Type* stub = new Type(c->package ? c->package : "", 3347db766c3fec2795b08d237f29b972f474983684bJoe Onorato name, Type::GENERATED, false, false, false, 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, c->name.lineno); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NAMES.Add(stub); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = c->name.data; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name += ".Stub.Proxy"; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Type* proxy = new Type(c->package ? c->package : "", 3417db766c3fec2795b08d237f29b972f474983684bJoe Onorato name, Type::GENERATED, false, false, false, 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, c->name.lineno); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NAMES.Add(proxy); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 345fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato else if (items->item_type == INTERFACE_TYPE_RPC) { 346fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato // for interfaces, also add the service base type, we don't 347fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato // bother checking these for duplicates, because the parser 348fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato // won't let us do it. 349fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato interface_type* c = (interface_type*)items; 350fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato 351fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato string name = c->name.data; 352fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato name += ".ServiceBase"; 353fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato Type* base = new Type(c->package ? c->package : "", 3547db766c3fec2795b08d237f29b972f474983684bJoe Onorato name, Type::GENERATED, false, false, false, 355fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato filename, c->name.lineno); 356fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato NAMES.Add(base); 357fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato } 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (old->Kind() == Type::BUILT_IN) { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d attempt to redefine built in class %s\n", 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, type->DeclLine(), 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type->QualifiedName().c_str()); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (type->Kind() != old->Kind()) { 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* oldKind = kind_to_string(old->Kind()); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* newKind = kind_to_string(type->Kind()); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d attempt to redefine %s as %s,\n", 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, type->DeclLine(), 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type->QualifiedName().c_str(), newKind); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d previously defined here as %s.\n", 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project old->DeclFile().c_str(), old->DeclLine(), oldKind); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project items = items->next; 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================== 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic bool 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmatches_keyword(const char* str) 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static const char* KEYWORDS[] = { "abstract", "assert", "boolean", "break", 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "byte", "case", "catch", "char", "class", "const", "continue", 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "default", "do", "double", "else", "enum", "extends", "final", 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "finally", "float", "for", "goto", "if", "implements", "import", 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "instanceof", "int", "interface", "long", "native", "new", "package", 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "private", "protected", "public", "return", "short", "static", 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "strictfp", "super", "switch", "synchronized", "this", "throw", 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "throws", "transient", "try", "void", "volatile", "while", 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "true", "false", "null", 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NULL 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char** k = KEYWORDS; 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*k) { 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (0 == strcmp(str, *k)) { 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project k++; 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 4097db766c3fec2795b08d237f29b972f474983684bJoe Onoratocheck_method(const char* filename, int kind, method_type* m) 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int err = 0; 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // return type 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Type* returnType = NAMES.Search(m->type.type.data); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (returnType == NULL) { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d unknown return type %s\n", filename, 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m->type.type.lineno, m->type.type.data); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 422e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato if (returnType == EVENT_FAKE_TYPE) { 423e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato if (kind != INTERFACE_TYPE_RPC) { 424e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato fprintf(stderr, "%s:%d event methods only supported for rpc interfaces\n", 425e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato filename, m->type.type.lineno); 426e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato err = 1; 427e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato } 428e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato } else { 429e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato if (!(kind == INTERFACE_TYPE_BINDER ? returnType->CanWriteToParcel() 430e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato : returnType->CanWriteToRpcData())) { 431e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato fprintf(stderr, "%s:%d return type %s can't be marshalled.\n", filename, 432e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato m->type.type.lineno, m->type.type.data); 433e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato err = 1; 434e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato } 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (m->type.dimension > 0 && !returnType->CanBeArray()) { 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d return type %s%s can't be an array.\n", filename, 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m->type.array_token.lineno, m->type.type.data, 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m->type.array_token.data); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (m->type.dimension > 1) { 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d return type %s%s only one" 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " dimensional arrays are supported\n", filename, 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m->type.array_token.lineno, m->type.type.data, 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m->type.array_token.data); 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = 1; 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg_type* arg = m->args; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (arg) { 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Type* t = NAMES.Search(arg->type.type.data); 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // check the arg type 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == NULL) { 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d parameter %s (%d) unknown type %s\n", 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, m->type.type.lineno, arg->name.data, index, 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->type.type.data); 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto next; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 466e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato 467e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato if (t == EVENT_FAKE_TYPE) { 468e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato fprintf(stderr, "%s:%d parameter %s (%d) event can not be used as a parameter %s\n", 469e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato filename, m->type.type.lineno, arg->name.data, index, 470e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato arg->type.type.data); 471e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato err = 1; 472e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato goto next; 473e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4757db766c3fec2795b08d237f29b972f474983684bJoe Onorato if (!(kind == INTERFACE_TYPE_BINDER ? t->CanWriteToParcel() : t->CanWriteToRpcData())) { 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d parameter %d: '%s %s' can't be marshalled.\n", 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, m->type.type.lineno, index, 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->type.type.data, arg->name.data); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg->direction.data == NULL 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (arg->type.dimension != 0 || t->CanBeOutParameter())) { 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d parameter %d: '%s %s' can be an out" 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " parameter, so you must declare it as in," 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " out or inout.\n", 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, m->type.type.lineno, index, 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->type.type.data, arg->name.data); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (convert_direction(arg->direction.data) != IN_PARAMETER 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !t->CanBeOutParameter() 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && arg->type.dimension == 0) { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d parameter %d: '%s %s %s' can only be an in" 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " parameter.\n", 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, m->type.type.lineno, index, 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->direction.data, arg->type.type.data, 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->name.data); 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg->type.dimension > 0 && !t->CanBeArray()) { 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d parameter %d: '%s %s%s %s' can't be an" 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " array.\n", filename, 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m->type.array_token.lineno, index, arg->direction.data, 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->type.type.data, arg->type.array_token.data, 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->name.data); 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg->type.dimension > 1) { 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d parameter %d: '%s %s%s %s' only one" 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " dimensional arrays are supported\n", filename, 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m->type.array_token.lineno, index, arg->direction.data, 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->type.type.data, arg->type.array_token.data, 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->name.data); 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // check that the name doesn't match a keyword 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (matches_keyword(arg->name.data)) { 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d parameter %d %s is named the same as a" 524e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato " Java or aidl keyword\n", 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, m->name.lineno, index, arg->name.data); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnext: 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg = arg->next; 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectcheck_types(const char* filename, document_item_type* items) 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int err = 0; 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (items) { 5427db766c3fec2795b08d237f29b972f474983684bJoe Onorato // (nothing to check for PARCELABLE_TYPE or FLATTENABLE_TYPE) 5437db766c3fec2795b08d237f29b972f474983684bJoe Onorato if (items->item_type == INTERFACE_TYPE_BINDER 5447db766c3fec2795b08d237f29b972f474983684bJoe Onorato || items->item_type == INTERFACE_TYPE_RPC) { 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map<string,method_type*> methodNames; 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_type* c = (interface_type*)items; 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_item_type* member = c->interface_items; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (member) { 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (member->item_type == METHOD_TYPE) { 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method_type* m = (method_type*)member; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5537db766c3fec2795b08d237f29b972f474983684bJoe Onorato err |= check_method(filename, items->item_type, m); 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // prevent duplicate methods 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (methodNames.find(m->name.data) == methodNames.end()) { 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project methodNames[m->name.data] = m; 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr,"%s:%d attempt to redefine method %s,\n", 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, m->name.lineno, m->name.data); 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method_type* old = methodNames[m->name.data]; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d previously defined here.\n", 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, old->name.lineno); 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project member = member->next; 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project items = items->next; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================== 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectexactly_one_interface(const char* filename, const document_item_type* items, const Options& options, 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool* onlyParcelable) 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (items == NULL) { 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s: file does not contain any interfaces\n", 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename); 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const document_item_type* next = items->next; 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (items->next != NULL) { 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int lineno = -1; 590fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato if (next->item_type == INTERFACE_TYPE_BINDER) { 591fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato lineno = ((interface_type*)next)->interface_token.lineno; 592fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato } 593fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato else if (next->item_type == INTERFACE_TYPE_RPC) { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lineno = ((interface_type*)next)->interface_token.lineno; 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (next->item_type == PARCELABLE_TYPE) { 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lineno = ((parcelable_type*)next)->parcelable_token.lineno; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5997db766c3fec2795b08d237f29b972f474983684bJoe Onorato else if (next->item_type == FLATTENABLE_TYPE) { 6007db766c3fec2795b08d237f29b972f474983684bJoe Onorato lineno = ((parcelable_type*)next)->parcelable_token.lineno; 6017db766c3fec2795b08d237f29b972f474983684bJoe Onorato } 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d aidl can only handle one interface per file\n", 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, lineno); 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6077db766c3fec2795b08d237f29b972f474983684bJoe Onorato if (items->item_type == PARCELABLE_TYPE || items->item_type == FLATTENABLE_TYPE) { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *onlyParcelable = true; 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (options.failOnParcelable) { 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d aidl can only generate code for interfaces, not" 6117db766c3fec2795b08d237f29b972f474983684bJoe Onorato " parcelables or flattenables,\n", filename, 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((parcelable_type*)items)->parcelable_token.lineno); 6137db766c3fec2795b08d237f29b972f474983684bJoe Onorato fprintf(stderr, "%s:%d .aidl files that only declare parcelables or flattenables" 6147db766c3fec2795b08d237f29b972f474983684bJoe Onorato "may not go in the Makefile.\n", filename, 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((parcelable_type*)items)->parcelable_token.lineno); 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *onlyParcelable = false; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================== 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid 62718fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohetgenerate_dep_file(const Options& options, const document_item_type* items) 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 62918fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet /* we open the file in binary mode to ensure that the same output is 63018fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet * generated on all platforms !! 63118fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet */ 63218fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet FILE* to = NULL; 63318fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet if (options.autoDepFile) { 63418fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet string fileName = options.outputFileName + ".d"; 63518fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet to = fopen(fileName.c_str(), "wb"); 63618fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet } else { 63718fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet to = fopen(options.depFileName.c_str(), "wb"); 63818fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet } 63918fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (to == NULL) { 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* slash = "\\"; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import_info* import = g_imports; 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (import == NULL) { 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project slash = ""; 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 650fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato if (items->item_type == INTERFACE_TYPE_BINDER || items->item_type == INTERFACE_TYPE_RPC) { 65118fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet fprintf(to, "%s: \\\n", options.outputFileName.c_str()); 65218fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet } else { 65318fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet // parcelable: there's no output file. 65418fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet fprintf(to, " : \\\n"); 65518fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet } 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(to, " %s %s\n", options.inputFileName.c_str(), slash); 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (import) { 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (import->next == NULL) { 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project slash = ""; 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (import->filename) { 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(to, " %s %s\n", import->filename, slash); 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import = import->next; 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(to, "\n"); 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fclose(to); 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================== 674ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectstatic string 67518fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohetgenerate_outputFileName2(const Options& options, const buffer_type& name, const char* package) 676ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project{ 677ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project string result; 678ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 67918fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet // create the path to the destination folder based on the 68018fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet // interface package name 68118fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet result = options.outputBaseFolder; 68218fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet result += OS_PATH_SEPARATOR; 683ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 68418fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet string packageStr = package; 68518fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet size_t len = packageStr.length(); 68618fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet for (size_t i=0; i<len; i++) { 68718fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet if (packageStr[i] == '.') { 68818fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet packageStr[i] = OS_PATH_SEPARATOR; 689ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 69018fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet } 691ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 69218fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet result += packageStr; 69318fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet 69418fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet // add the filename by replacing the .aidl extension to .java 69518fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet const char* p = strchr(name.data, '.'); 69618fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet len = p ? p-name.data : strlen(name.data); 69718fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet 69818fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet result += OS_PATH_SEPARATOR; 69918fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet result.append(name.data, len); 70018fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet result += ".java"; 701ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 70218fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet return result; 70318fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet} 70418fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet 70518fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet// ========================================================== 70618fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohetstatic string 70718fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohetgenerate_outputFileName(const Options& options, const document_item_type* items) 70818fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet{ 70918fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet // items has already been checked to have only one interface. 710fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato if (items->item_type == INTERFACE_TYPE_BINDER || items->item_type == INTERFACE_TYPE_RPC) { 71118fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet interface_type* type = (interface_type*)items; 71218fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet 71318fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet return generate_outputFileName2(options, type->name, type->package); 7147db766c3fec2795b08d237f29b972f474983684bJoe Onorato } else if (items->item_type == PARCELABLE_TYPE || items->item_type == FLATTENABLE_TYPE) { 71518fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet parcelable_type* type = (parcelable_type*)items; 71618fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet return generate_outputFileName2(options, type->name, type->package); 717ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 718ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 71918fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet // I don't think we can come here, but safer than returning NULL. 72018fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet string result; 721ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return result; 722ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project} 723ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 72418fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet 72518fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet 726ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project// ========================================================== 727ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectstatic void 72818fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohetcheck_outputFilePath(const string& path) { 729ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project size_t len = path.length(); 730ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project for (size_t i=0; i<len ; i++) { 731ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (path[i] == OS_PATH_SEPARATOR) { 732ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project string p = path.substr(0, i); 733ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (access(path.data(), F_OK) != 0) { 734ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project#ifdef HAVE_MS_C_RUNTIME 735ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project _mkdir(p.data()); 736ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project#else 737ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mkdir(p.data(), S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP); 738ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project#endif 739ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 740ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 741ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 742ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project} 743ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 744ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 745ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project// ========================================================== 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectparse_preprocessed_file(const string& filename) 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int err; 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FILE* f = fopen(filename.c_str(), "rb"); 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (f == NULL) { 7534df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project fprintf(stderr, "aidl: can't open preprocessed file: %s\n", 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename.c_str()); 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int lineno = 1; 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char line[1024]; 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char type[1024]; 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char fullname[1024]; 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (fgets(line, sizeof(line), f)) { 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // skip comments and empty lines 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!line[0] || strncmp(line, "//", 2) == 0) { 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sscanf(line, "%s %[^; \r\n\t];", type, fullname); 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char* packagename; 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char* classname = rfind(fullname, '.'); 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (classname != NULL) { 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *classname = '\0'; 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project classname++; 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packagename = fullname; 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project classname = fullname; 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packagename = NULL; 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("%s:%d:...%s...%s...%s...\n", filename.c_str(), lineno, 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // type, packagename, classname); 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project document_item_type* doc; 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (0 == strcmp("parcelable", type)) { 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcelable_type* parcl = (parcelable_type*)malloc( 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sizeof(parcelable_type)); 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(parcl, 0, sizeof(parcelable_type)); 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcl->document_item.item_type = PARCELABLE_TYPE; 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcl->parcelable_token.lineno = lineno; 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcl->parcelable_token.data = strdup(type); 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcl->package = packagename ? strdup(packagename) : NULL; 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcl->name.lineno = lineno; 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcl->name.data = strdup(classname); 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcl->semicolon_token.lineno = lineno; 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcl->semicolon_token.data = strdup(";"); 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doc = (document_item_type*)parcl; 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7997db766c3fec2795b08d237f29b972f474983684bJoe Onorato else if (0 == strcmp("flattenable", type)) { 8007db766c3fec2795b08d237f29b972f474983684bJoe Onorato parcelable_type* parcl = (parcelable_type*)malloc( 8017db766c3fec2795b08d237f29b972f474983684bJoe Onorato sizeof(parcelable_type)); 8027db766c3fec2795b08d237f29b972f474983684bJoe Onorato memset(parcl, 0, sizeof(parcelable_type)); 8037db766c3fec2795b08d237f29b972f474983684bJoe Onorato parcl->document_item.item_type = FLATTENABLE_TYPE; 8047db766c3fec2795b08d237f29b972f474983684bJoe Onorato parcl->parcelable_token.lineno = lineno; 8057db766c3fec2795b08d237f29b972f474983684bJoe Onorato parcl->parcelable_token.data = strdup(type); 8067db766c3fec2795b08d237f29b972f474983684bJoe Onorato parcl->package = packagename ? strdup(packagename) : NULL; 8077db766c3fec2795b08d237f29b972f474983684bJoe Onorato parcl->name.lineno = lineno; 8087db766c3fec2795b08d237f29b972f474983684bJoe Onorato parcl->name.data = strdup(classname); 8097db766c3fec2795b08d237f29b972f474983684bJoe Onorato parcl->semicolon_token.lineno = lineno; 8107db766c3fec2795b08d237f29b972f474983684bJoe Onorato parcl->semicolon_token.data = strdup(";"); 8117db766c3fec2795b08d237f29b972f474983684bJoe Onorato doc = (document_item_type*)parcl; 8127db766c3fec2795b08d237f29b972f474983684bJoe Onorato } 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (0 == strcmp("interface", type)) { 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_type* iface = (interface_type*)malloc( 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sizeof(interface_type)); 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(iface, 0, sizeof(interface_type)); 817fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato iface->document_item.item_type = INTERFACE_TYPE_BINDER; 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iface->interface_token.lineno = lineno; 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iface->interface_token.data = strdup(type); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iface->package = packagename ? strdup(packagename) : NULL; 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iface->name.lineno = lineno; 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iface->name.data = strdup(classname); 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iface->open_brace_token.lineno = lineno; 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iface->open_brace_token.data = strdup("{"); 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iface->close_brace_token.lineno = lineno; 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iface->close_brace_token.data = strdup("}"); 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doc = (document_item_type*)iface; 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d: bad type in line: %s\n", 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename.c_str(), lineno, line); 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = gather_types(filename.c_str(), doc); 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lineno++; 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!feof(f)) { 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d: error reading file, line to long.\n", 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename.c_str(), lineno); 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fclose(f); 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================== 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 85018fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohetcompile_aidl(Options& options) 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int err = 0, N; 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project set_import_paths(options.importPaths); 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project register_base_types(); 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // import the preprocessed file 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N = options.preprocessedFiles.size(); 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const string& s = options.preprocessedFiles[i]; 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= parse_preprocessed_file(s); 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != 0) { 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // parse the main file 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_callbacks = &g_mainCallbacks; 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = parse_aidl(options.inputFileName.c_str()); 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project document_item_type* mainDoc = g_document; 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_document = NULL; 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // parse the imports 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_callbacks = &g_mainCallbacks; 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import_info* import = g_imports; 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (import) { 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NAMES.Find(import->neededClass) == NULL) { 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->filename = find_import_file(import->neededClass); 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!import->filename) { 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d: couldn't find import for class %s\n", 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->from, import->statement.lineno, 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->neededClass); 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= 1; 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= parse_aidl(import->filename); 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->doc = g_document; 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (import->doc == NULL) { 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= 1; 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import = import->next; 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // bail out now if parsing wasn't successful 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != 0 || mainDoc == NULL) { 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //fprintf(stderr, "aidl: parsing failed, stopping.\n"); 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // complain about ones that aren't in the right files 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= check_filenames(options.inputFileName.c_str(), mainDoc); 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import = g_imports; 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (import) { 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= check_filenames(import->filename, import->doc); 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import = import->next; 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // gather the types that have been declared 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= gather_types(options.inputFileName.c_str(), mainDoc); 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import = g_imports; 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (import) { 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= gather_types(import->filename, import->doc); 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import = import->next; 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("---- main doc ----\n"); 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project test_document(mainDoc); 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import = g_imports; 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (import) { 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("---- import doc ----\n"); 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project test_document(import->doc); 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import = import->next; 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NAMES.Dump(); 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // check the referenced types in mainDoc to make sure we've imported them 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= check_types(options.inputFileName.c_str(), mainDoc); 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // finally, there really only needs to be one thing in mainDoc, and it 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // needs to be an interface. 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool onlyParcelable = false; 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= exactly_one_interface(options.inputFileName.c_str(), mainDoc, options, &onlyParcelable); 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // after this, there shouldn't be any more errors because of the 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // input. 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != 0 || mainDoc == NULL) { 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 94418fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet // if needed, generate the outputFileName from the outputBaseFolder 94518fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet if (options.outputFileName.length() == 0 && 94618fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet options.outputBaseFolder.length() > 0) { 94718fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet options.outputFileName = generate_outputFileName(options, mainDoc); 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if we were asked to, generate a make dependency file 95118fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet // unless it's a parcelable *and* it's supposed to fail on parcelable 95218fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet if ((options.autoDepFile || options.depFileName != "") && 95318fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet !(onlyParcelable && options.failOnParcelable)) { 95418fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet // make sure the folders of the output file all exists 95518fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet check_outputFilePath(options.outputFileName); 95618fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet generate_dep_file(options, mainDoc); 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 95918fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet // they didn't ask to fail on parcelables, so just exit quietly. 96018fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet if (onlyParcelable && !options.failOnParcelable) { 96118fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet return 0; 962ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 96318fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet 964ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // make sure the folders of the output file all exists 96518fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet check_outputFilePath(options.outputFileName); 966ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 96718fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet err = generate_java(options.outputFileName, options.inputFileName.c_str(), 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (interface_type*)mainDoc); 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpreprocess_aidl(const Options& options) 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vector<string> lines; 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int err; 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // read files 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = options.filesToPreprocess.size(); 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_callbacks = &g_mainCallbacks; 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = parse_aidl(options.filesToPreprocess[i].c_str()); 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != 0) { 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project document_item_type* doc = g_document; 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project string line; 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (doc->item_type == PARCELABLE_TYPE) { 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line = "parcelable "; 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcelable_type* parcelable = (parcelable_type*)doc; 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcelable->package) { 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line += parcelable->package; 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line += '.'; 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line += parcelable->name.data; 9977db766c3fec2795b08d237f29b972f474983684bJoe Onorato } 9987db766c3fec2795b08d237f29b972f474983684bJoe Onorato else if (doc->item_type == FLATTENABLE_TYPE) { 9997db766c3fec2795b08d237f29b972f474983684bJoe Onorato line = "parcelable "; 10007db766c3fec2795b08d237f29b972f474983684bJoe Onorato parcelable_type* parcelable = (parcelable_type*)doc; 10017db766c3fec2795b08d237f29b972f474983684bJoe Onorato if (parcelable->package) { 10027db766c3fec2795b08d237f29b972f474983684bJoe Onorato line += parcelable->package; 10037db766c3fec2795b08d237f29b972f474983684bJoe Onorato line += '.'; 10047db766c3fec2795b08d237f29b972f474983684bJoe Onorato } 10057db766c3fec2795b08d237f29b972f474983684bJoe Onorato line += parcelable->name.data; 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line = "interface "; 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_type* iface = (interface_type*)doc; 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (iface->package) { 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line += iface->package; 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line += '.'; 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line += iface->name.data; 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line += ";\n"; 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lines.push_back(line); 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // write preprocessed file 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int fd = open( options.outputFileName.c_str(), 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project O_RDWR|O_CREAT|O_TRUNC|O_BINARY, 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_MS_C_RUNTIME 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project _S_IREAD|_S_IWRITE); 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project S_IRUSR|S_IWUSR|S_IRGRP); 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == -1) { 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "aidl: could not open file for write: %s\n", 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project options.outputFileName.c_str()); 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N = lines.size(); 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const string& s = lines[i]; 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int len = s.length(); 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (len != write(fd, s.c_str(), len)) { 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "aidl: error writing to file %s\n", 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project options.outputFileName.c_str()); 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close(fd); 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unlink(options.outputFileName.c_str()); 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close(fd); 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================== 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmain(int argc, const char **argv) 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Options options; 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result = parse_options(argc, argv, &options); 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result) { 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (options.task) 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case COMPILE_AIDL: 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return compile_aidl(options); 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PREPROCESS_AIDL: 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return preprocess_aidl(options); 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "aidl: internal error\n"); 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1070