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