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 } 53a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato else if (d->item_type == USER_DATA_TYPE) { 54a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato user_data_type* b = (user_data_type*)d; 55a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato if ((b->flattening_methods & PARCELABLE_DATA) != 0) { 56a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato printf("parcelable %s %s;\n", b->package, b->name.data); 57a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato } 58a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato if ((b->flattening_methods & RPC_DATA) != 0) { 59a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato printf("flattenable %s %s;\n", b->package, b->name.data); 60a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato } 617db766c3fec2795b08d237f29b972f474983684bJoe Onorato } 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 63066aa99d2d114d46406e00fcc23d193d117395b1Scott Turner printf("UNKNOWN d=0x%08lx d->item_type=%d\n", (long)d, d->item_type); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d = d->next; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================== 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconvert_direction(const char* direction) 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (direction == NULL) { 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return IN_PARAMETER; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (0 == strcmp(direction, "in")) { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return IN_PARAMETER; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (0 == strcmp(direction, "out")) { 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return OUT_PARAMETER; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return INOUT_PARAMETER; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================== 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct import_info { 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* from; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* filename; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer_type statement; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* neededClass; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project document_item_type* doc; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct import_info* next; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdocument_item_type* g_document = NULL; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport_info* g_imports = NULL; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmain_document_parsed(document_item_type* d) 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_document = d; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmain_import_parsed(buffer_type* statement) 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import_info* import = (import_info*)malloc(sizeof(import_info)); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(import, 0, sizeof(import_info)); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->from = strdup(g_currentFilename); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->statement.lineno = statement->lineno; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->statement.data = strdup(statement->data); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->statement.extra = NULL; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->next = g_imports; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->neededClass = parse_import_statement(statement->data); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_imports = import; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic ParserCallbacks g_mainCallbacks = { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &main_document_parsed, 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &main_import_parsed 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectchar* 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectparse_import_statement(const char* text) 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* end; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int len; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (isspace(*text)) { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text++; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!isspace(*text)) { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text++; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (isspace(*text)) { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text++; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project end = text; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!isspace(*end) && *end != ';') { 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project end++; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len = end-text; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char* rv = (char*)malloc(len+1); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcpy(rv, text, len); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rv[len] = '\0'; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rv; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================== 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport_import_parsed(buffer_type* statement) 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic ParserCallbacks g_importCallbacks = { 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &main_document_parsed, 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &import_import_parsed 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================== 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectcheck_filename(const char* filename, const char* package, buffer_type* name) 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* p; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project string expected; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project string fn; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t len; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char cwd[MAXPATHLEN]; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool valid = false; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_WINDOWS_PATHS 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isalpha(filename[0]) && filename[1] == ':' 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && filename[2] == OS_PATH_SEPARATOR) { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (filename[0] == OS_PATH_SEPARATOR) { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fn = filename; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fn = getcwd(cwd, sizeof(cwd)); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len = fn.length(); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fn[len-1] != OS_PATH_SEPARATOR) { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fn += OS_PATH_SEPARATOR; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fn += filename; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (package) { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project expected = package; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project expected += '.'; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len = expected.length(); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; i<len; i++) { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (expected[i] == '.') { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project expected[i] = OS_PATH_SEPARATOR; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = strchr(name->data, '.'); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len = p ? p-name->data : strlen(name->data); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project expected.append(name->data, len); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project expected += ".aidl"; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len = fn.length(); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project valid = (len >= expected.length()); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (valid) { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = fn.c_str() + (len - expected.length()); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_WINDOWS_PATHS 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (OS_PATH_SEPARATOR != '/') { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Input filename under cygwin most likely has / separators 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // whereas the expected string uses \\ separators. Adjust 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // them accordingly. 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (char *c = const_cast<char *>(p); *c; ++c) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*c == '/') *c = OS_PATH_SEPARATOR; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef OS_CASE_SENSITIVE 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project valid = (expected == p); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project valid = !strcasecmp(expected.c_str(), p); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!valid) { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d interface %s should be declared in a file" 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " called %s.\n", 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, name->lineno, name->data, expected.c_str()); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectcheck_filenames(const char* filename, document_item_type* items) 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int err = 0; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (items) { 246a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato if (items->item_type == USER_DATA_TYPE) { 247a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato user_data_type* p = (user_data_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"; 273a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato case Type::USERDATA: 274a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato return "a user data"; 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; 299a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato if (items->item_type == USER_DATA_TYPE) { 300a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato user_data_type* p = (user_data_type*)items; 301a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato type = new UserDataType(p->package ? p->package : "", p->name.data, 302a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato false, ((p->flattening_methods & PARCELABLE_DATA) != 0), 303a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato ((p->flattening_methods & RPC_DATA) != 0), filename, p->name.lineno); 3047db766c3fec2795b08d237f29b972f474983684bJoe Onorato } 305fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato else if (items->item_type == INTERFACE_TYPE_BINDER 306fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato || items->item_type == INTERFACE_TYPE_RPC) { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_type* c = (interface_type*)items; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type = new InterfaceType(c->package ? c->package : "", 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->name.data, false, c->oneway, 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, c->name.lineno); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "aidl: internal error %s:%d\n", __FILE__, __LINE__); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Type* old = NAMES.Find(type->QualifiedName()); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (old == NULL) { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NAMES.Add(type); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 321fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato if (items->item_type == INTERFACE_TYPE_BINDER) { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for interfaces, also add the stub and proxy types, we don't 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // bother checking these for duplicates, because the parser 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // won't let us do it. 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_type* c = (interface_type*)items; 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project string name = c->name.data; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name += ".Stub"; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Type* stub = new Type(c->package ? c->package : "", 3307db766c3fec2795b08d237f29b972f474983684bJoe Onorato name, Type::GENERATED, false, false, false, 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, c->name.lineno); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NAMES.Add(stub); 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = c->name.data; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name += ".Stub.Proxy"; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Type* proxy = new Type(c->package ? c->package : "", 3377db766c3fec2795b08d237f29b972f474983684bJoe Onorato name, Type::GENERATED, false, false, false, 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, c->name.lineno); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NAMES.Add(proxy); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 341fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato else if (items->item_type == INTERFACE_TYPE_RPC) { 342fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato // for interfaces, also add the service base type, we don't 343fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato // bother checking these for duplicates, because the parser 344fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato // won't let us do it. 345fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato interface_type* c = (interface_type*)items; 346fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato 347fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato string name = c->name.data; 348fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato name += ".ServiceBase"; 349fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato Type* base = new Type(c->package ? c->package : "", 3507db766c3fec2795b08d237f29b972f474983684bJoe Onorato name, Type::GENERATED, false, false, false, 351fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato filename, c->name.lineno); 352fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato NAMES.Add(base); 353fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato } 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (old->Kind() == Type::BUILT_IN) { 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d attempt to redefine built in class %s\n", 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, type->DeclLine(), 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type->QualifiedName().c_str()); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (type->Kind() != old->Kind()) { 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* oldKind = kind_to_string(old->Kind()); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* newKind = kind_to_string(type->Kind()); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d attempt to redefine %s as %s,\n", 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, type->DeclLine(), 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type->QualifiedName().c_str(), newKind); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d previously defined here as %s.\n", 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project old->DeclFile().c_str(), old->DeclLine(), oldKind); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project items = items->next; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================== 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic bool 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmatches_keyword(const char* str) 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static const char* KEYWORDS[] = { "abstract", "assert", "boolean", "break", 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "byte", "case", "catch", "char", "class", "const", "continue", 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "default", "do", "double", "else", "enum", "extends", "final", 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "finally", "float", "for", "goto", "if", "implements", "import", 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "instanceof", "int", "interface", "long", "native", "new", "package", 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "private", "protected", "public", "return", "short", "static", 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "strictfp", "super", "switch", "synchronized", "this", "throw", 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "throws", "transient", "try", "void", "volatile", "while", 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "true", "false", "null", 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NULL 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char** k = KEYWORDS; 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*k) { 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (0 == strcmp(str, *k)) { 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project k++; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 4057db766c3fec2795b08d237f29b972f474983684bJoe Onoratocheck_method(const char* filename, int kind, method_type* m) 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int err = 0; 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // return type 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Type* returnType = NAMES.Search(m->type.type.data); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (returnType == NULL) { 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d unknown return type %s\n", filename, 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m->type.type.lineno, m->type.type.data); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 418e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato if (returnType == EVENT_FAKE_TYPE) { 419e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato if (kind != INTERFACE_TYPE_RPC) { 420e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato fprintf(stderr, "%s:%d event methods only supported for rpc interfaces\n", 421e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato filename, m->type.type.lineno); 422e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato err = 1; 423e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato } 424e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato } else { 425e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato if (!(kind == INTERFACE_TYPE_BINDER ? returnType->CanWriteToParcel() 426e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato : returnType->CanWriteToRpcData())) { 427e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato fprintf(stderr, "%s:%d return type %s can't be marshalled.\n", filename, 428e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato m->type.type.lineno, m->type.type.data); 429e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato err = 1; 430e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato } 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (m->type.dimension > 0 && !returnType->CanBeArray()) { 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d return type %s%s can't be an array.\n", filename, 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m->type.array_token.lineno, m->type.type.data, 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m->type.array_token.data); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (m->type.dimension > 1) { 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d return type %s%s only one" 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " dimensional arrays are supported\n", filename, 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m->type.array_token.lineno, m->type.type.data, 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m->type.array_token.data); 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = 1; 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg_type* arg = m->args; 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (arg) { 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Type* t = NAMES.Search(arg->type.type.data); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // check the arg type 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == NULL) { 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d parameter %s (%d) unknown type %s\n", 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, m->type.type.lineno, arg->name.data, index, 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->type.type.data); 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto next; 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 462e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato 463e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato if (t == EVENT_FAKE_TYPE) { 464e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato fprintf(stderr, "%s:%d parameter %s (%d) event can not be used as a parameter %s\n", 465e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato filename, m->type.type.lineno, arg->name.data, index, 466e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato arg->type.type.data); 467e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato err = 1; 468e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato goto next; 469e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato } 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4717db766c3fec2795b08d237f29b972f474983684bJoe Onorato if (!(kind == INTERFACE_TYPE_BINDER ? t->CanWriteToParcel() : t->CanWriteToRpcData())) { 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d parameter %d: '%s %s' can't be marshalled.\n", 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, m->type.type.lineno, index, 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->type.type.data, arg->name.data); 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 478fcb310f93680b87943c90a321e2beedcb8c528b8Joe Onorato if (returnType == EVENT_FAKE_TYPE 479fcb310f93680b87943c90a321e2beedcb8c528b8Joe Onorato && convert_direction(arg->direction.data) != IN_PARAMETER) { 480fcb310f93680b87943c90a321e2beedcb8c528b8Joe Onorato fprintf(stderr, "%s:%d parameter %d: '%s %s' All paremeters on events must be 'in'.\n", 481fcb310f93680b87943c90a321e2beedcb8c528b8Joe Onorato filename, m->type.type.lineno, index, 482fcb310f93680b87943c90a321e2beedcb8c528b8Joe Onorato arg->type.type.data, arg->name.data); 483fcb310f93680b87943c90a321e2beedcb8c528b8Joe Onorato err = 1; 484fcb310f93680b87943c90a321e2beedcb8c528b8Joe Onorato goto next; 485fcb310f93680b87943c90a321e2beedcb8c528b8Joe Onorato } 486fcb310f93680b87943c90a321e2beedcb8c528b8Joe Onorato 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg->direction.data == NULL 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (arg->type.dimension != 0 || t->CanBeOutParameter())) { 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d parameter %d: '%s %s' can be an out" 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " parameter, so you must declare it as in," 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " out or inout.\n", 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, m->type.type.lineno, index, 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->type.type.data, arg->name.data); 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (convert_direction(arg->direction.data) != IN_PARAMETER 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !t->CanBeOutParameter() 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && arg->type.dimension == 0) { 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d parameter %d: '%s %s %s' can only be an in" 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " parameter.\n", 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, m->type.type.lineno, index, 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->direction.data, arg->type.type.data, 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->name.data); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg->type.dimension > 0 && !t->CanBeArray()) { 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d parameter %d: '%s %s%s %s' can't be an" 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " array.\n", filename, 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m->type.array_token.lineno, index, arg->direction.data, 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->type.type.data, arg->type.array_token.data, 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->name.data); 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg->type.dimension > 1) { 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d parameter %d: '%s %s%s %s' only one" 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " dimensional arrays are supported\n", filename, 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m->type.array_token.lineno, index, arg->direction.data, 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->type.type.data, arg->type.array_token.data, 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->name.data); 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // check that the name doesn't match a keyword 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (matches_keyword(arg->name.data)) { 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d parameter %d %s is named the same as a" 529e24dbeafe64278408b3342fcb77756bc7d091791Joe Onorato " Java or aidl keyword\n", 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, m->name.lineno, index, arg->name.data); 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnext: 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg = arg->next; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectcheck_types(const char* filename, document_item_type* items) 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int err = 0; 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (items) { 547a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato // (nothing to check for USER_DATA_TYPE) 5487db766c3fec2795b08d237f29b972f474983684bJoe Onorato if (items->item_type == INTERFACE_TYPE_BINDER 5497db766c3fec2795b08d237f29b972f474983684bJoe Onorato || items->item_type == INTERFACE_TYPE_RPC) { 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map<string,method_type*> methodNames; 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_type* c = (interface_type*)items; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_item_type* member = c->interface_items; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (member) { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (member->item_type == METHOD_TYPE) { 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method_type* m = (method_type*)member; 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5587db766c3fec2795b08d237f29b972f474983684bJoe Onorato err |= check_method(filename, items->item_type, m); 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // prevent duplicate methods 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (methodNames.find(m->name.data) == methodNames.end()) { 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project methodNames[m->name.data] = m; 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr,"%s:%d attempt to redefine method %s,\n", 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, m->name.lineno, m->name.data); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method_type* old = methodNames[m->name.data]; 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d previously defined here.\n", 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename, old->name.lineno); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = 1; 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project member = member->next; 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project items = items->next; 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================== 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectexactly_one_interface(const char* filename, const document_item_type* items, const Options& options, 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool* onlyParcelable) 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (items == NULL) { 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s: file does not contain any interfaces\n", 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename); 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const document_item_type* next = items->next; 59350a94b86307793ca9d4d8f8564e5f2ba78fdde14Adam Powell // Allow parcelables to skip the "one-only" rule. 59450a94b86307793ca9d4d8f8564e5f2ba78fdde14Adam Powell if (items->next != NULL && next->item_type != USER_DATA_TYPE) { 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int lineno = -1; 596fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato if (next->item_type == INTERFACE_TYPE_BINDER) { 597fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato lineno = ((interface_type*)next)->interface_token.lineno; 598fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato } 599fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato else if (next->item_type == INTERFACE_TYPE_RPC) { 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lineno = ((interface_type*)next)->interface_token.lineno; 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 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 607a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato if (items->item_type == USER_DATA_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, 612a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato ((user_data_type*)items)->keyword_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, 615a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato ((user_data_type*)items)->keyword_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); 714a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato } else if (items->item_type == USER_DATA_TYPE) { 715a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato user_data_type* type = (user_data_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)) { 786a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato user_data_type* parcl = (user_data_type*)malloc( 787a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato sizeof(user_data_type)); 788a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato memset(parcl, 0, sizeof(user_data_type)); 789a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato parcl->document_item.item_type = USER_DATA_TYPE; 790a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato parcl->keyword_token.lineno = lineno; 791a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato parcl->keyword_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(";"); 797a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato parcl->flattening_methods = PARCELABLE_DATA; 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doc = (document_item_type*)parcl; 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8007db766c3fec2795b08d237f29b972f474983684bJoe Onorato else if (0 == strcmp("flattenable", type)) { 801a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato user_data_type* parcl = (user_data_type*)malloc( 802a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato sizeof(user_data_type)); 803a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato memset(parcl, 0, sizeof(user_data_type)); 804a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato parcl->document_item.item_type = USER_DATA_TYPE; 805a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato parcl->keyword_token.lineno = lineno; 806a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato parcl->keyword_token.data = strdup(type); 8077db766c3fec2795b08d237f29b972f474983684bJoe Onorato parcl->package = packagename ? strdup(packagename) : NULL; 8087db766c3fec2795b08d237f29b972f474983684bJoe Onorato parcl->name.lineno = lineno; 8097db766c3fec2795b08d237f29b972f474983684bJoe Onorato parcl->name.data = strdup(classname); 8107db766c3fec2795b08d237f29b972f474983684bJoe Onorato parcl->semicolon_token.lineno = lineno; 8117db766c3fec2795b08d237f29b972f474983684bJoe Onorato parcl->semicolon_token.data = strdup(";"); 812a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato parcl->flattening_methods = RPC_DATA; 8137db766c3fec2795b08d237f29b972f474983684bJoe Onorato doc = (document_item_type*)parcl; 8147db766c3fec2795b08d237f29b972f474983684bJoe Onorato } 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (0 == strcmp("interface", type)) { 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_type* iface = (interface_type*)malloc( 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sizeof(interface_type)); 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(iface, 0, sizeof(interface_type)); 819fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato iface->document_item.item_type = INTERFACE_TYPE_BINDER; 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iface->interface_token.lineno = lineno; 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iface->interface_token.data = strdup(type); 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iface->package = packagename ? strdup(packagename) : NULL; 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iface->name.lineno = lineno; 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iface->name.data = strdup(classname); 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iface->open_brace_token.lineno = lineno; 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iface->open_brace_token.data = strdup("{"); 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iface->close_brace_token.lineno = lineno; 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iface->close_brace_token.data = strdup("}"); 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doc = (document_item_type*)iface; 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d: bad type in line: %s\n", 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename.c_str(), lineno, line); 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = gather_types(filename.c_str(), doc); 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lineno++; 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!feof(f)) { 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d: error reading file, line to long.\n", 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filename.c_str(), lineno); 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fclose(f); 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================== 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 85218fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohetcompile_aidl(Options& options) 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int err = 0, N; 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project set_import_paths(options.importPaths); 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project register_base_types(); 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // import the preprocessed file 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N = options.preprocessedFiles.size(); 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const string& s = options.preprocessedFiles[i]; 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= parse_preprocessed_file(s); 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != 0) { 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // parse the main file 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_callbacks = &g_mainCallbacks; 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = parse_aidl(options.inputFileName.c_str()); 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project document_item_type* mainDoc = g_document; 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_document = NULL; 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // parse the imports 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_callbacks = &g_mainCallbacks; 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import_info* import = g_imports; 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (import) { 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NAMES.Find(import->neededClass) == NULL) { 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->filename = find_import_file(import->neededClass); 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!import->filename) { 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d: couldn't find import for class %s\n", 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->from, import->statement.lineno, 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->neededClass); 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= 1; 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= parse_aidl(import->filename); 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import->doc = g_document; 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (import->doc == NULL) { 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= 1; 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import = import->next; 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // bail out now if parsing wasn't successful 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != 0 || mainDoc == NULL) { 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //fprintf(stderr, "aidl: parsing failed, stopping.\n"); 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // complain about ones that aren't in the right files 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= check_filenames(options.inputFileName.c_str(), mainDoc); 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import = g_imports; 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (import) { 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= check_filenames(import->filename, import->doc); 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import = import->next; 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // gather the types that have been declared 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= gather_types(options.inputFileName.c_str(), mainDoc); 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import = g_imports; 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (import) { 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= gather_types(import->filename, import->doc); 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import = import->next; 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("---- main doc ----\n"); 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project test_document(mainDoc); 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import = g_imports; 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (import) { 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("---- import doc ----\n"); 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project test_document(import->doc); 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project import = import->next; 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NAMES.Dump(); 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // check the referenced types in mainDoc to make sure we've imported them 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= check_types(options.inputFileName.c_str(), mainDoc); 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // finally, there really only needs to be one thing in mainDoc, and it 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // needs to be an interface. 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool onlyParcelable = false; 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err |= exactly_one_interface(options.inputFileName.c_str(), mainDoc, options, &onlyParcelable); 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // after this, there shouldn't be any more errors because of the 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // input. 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != 0 || mainDoc == NULL) { 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 94618fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet // if needed, generate the outputFileName from the outputBaseFolder 94718fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet if (options.outputFileName.length() == 0 && 94818fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet options.outputBaseFolder.length() > 0) { 94918fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet options.outputFileName = generate_outputFileName(options, mainDoc); 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if we were asked to, generate a make dependency file 95318fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet // unless it's a parcelable *and* it's supposed to fail on parcelable 95418fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet if ((options.autoDepFile || options.depFileName != "") && 95518fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet !(onlyParcelable && options.failOnParcelable)) { 95618fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet // make sure the folders of the output file all exists 95718fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet check_outputFilePath(options.outputFileName); 95818fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet generate_dep_file(options, mainDoc); 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 96118fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet // they didn't ask to fail on parcelables, so just exit quietly. 96218fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet if (onlyParcelable && !options.failOnParcelable) { 96318fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet return 0; 964ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 96518fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet 966ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project // make sure the folders of the output file all exists 96718fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet check_outputFilePath(options.outputFileName); 968ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 96918fff11e15dc1b4fe53cb37fa39637aa3fb9bc36Xavier Ducrohet err = generate_java(options.outputFileName, options.inputFileName.c_str(), 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (interface_type*)mainDoc); 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpreprocess_aidl(const Options& options) 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vector<string> lines; 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int err; 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // read files 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = options.filesToPreprocess.size(); 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_callbacks = &g_mainCallbacks; 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = parse_aidl(options.filesToPreprocess[i].c_str()); 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != 0) { 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err; 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project document_item_type* doc = g_document; 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project string line; 991a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato if (doc->item_type == USER_DATA_TYPE) { 992a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato user_data_type* parcelable = (user_data_type*)doc; 993a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato if ((parcelable->flattening_methods & PARCELABLE_DATA) != 0) { 994a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato line = "parcelable "; 995a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato } 996a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato if ((parcelable->flattening_methods & RPC_DATA) != 0) { 997a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato line = "flattenable "; 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9997db766c3fec2795b08d237f29b972f474983684bJoe Onorato if (parcelable->package) { 10007db766c3fec2795b08d237f29b972f474983684bJoe Onorato line += parcelable->package; 10017db766c3fec2795b08d237f29b972f474983684bJoe Onorato line += '.'; 10027db766c3fec2795b08d237f29b972f474983684bJoe Onorato } 10037db766c3fec2795b08d237f29b972f474983684bJoe Onorato line += parcelable->name.data; 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line = "interface "; 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_type* iface = (interface_type*)doc; 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (iface->package) { 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line += iface->package; 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line += '.'; 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line += iface->name.data; 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line += ";\n"; 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lines.push_back(line); 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // write preprocessed file 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int fd = open( options.outputFileName.c_str(), 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project O_RDWR|O_CREAT|O_TRUNC|O_BINARY, 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_MS_C_RUNTIME 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project _S_IREAD|_S_IWRITE); 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project S_IRUSR|S_IWUSR|S_IRGRP); 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd == -1) { 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "aidl: could not open file for write: %s\n", 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project options.outputFileName.c_str()); 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N = lines.size(); 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const string& s = lines[i]; 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int len = s.length(); 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (len != write(fd, s.c_str(), len)) { 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "aidl: error writing to file %s\n", 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project options.outputFileName.c_str()); 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close(fd); 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unlink(options.outputFileName.c_str()); 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close(fd); 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ========================================================== 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmain(int argc, const char **argv) 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Options options; 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result = parse_options(argc, argv, &options); 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result) { 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (options.task) 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case COMPILE_AIDL: 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return compile_aidl(options); 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PREPROCESS_AIDL: 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return preprocess_aidl(options); 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "aidl: internal error\n"); 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1068