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