154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "generate_java.h"
254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "Type.h"
30aa7fe6876d533610b4b993035030b946cc32e4cAlexey Zaytsev#include <string.h>
454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <stdio.h>
5b798689749c64baba81f02e10cf2157c747d6b46The Android Open Source Project#include <stdlib.h>
6b798689749c64baba81f02e10cf2157c747d6b46The Android Open Source Project#include <string.h>
754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// =================================================
954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectVariableFactory::VariableFactory(const string& base)
1054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    :m_base(base),
1154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     m_index(0)
1254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
1354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
1454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
1554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectVariable*
1654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectVariableFactory::Get(Type* type)
1754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
1854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    char name[100];
1954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    sprintf(name, "%s%d", m_base.c_str(), m_index);
2054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    m_index++;
2154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Variable* v = new Variable(type, name);
2254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    m_vars.push_back(v);
2354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return v;
2454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
2554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
2654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectVariable*
2754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectVariableFactory::Get(int index)
2854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
2954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return m_vars[index];
3054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
3154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
3254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// =================================================
33fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onoratostring
3454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectgather_comments(extra_text_type* extra)
3554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
3654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    string s;
3754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    while (extra) {
3854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (extra->which == SHORT_COMMENT) {
3954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            s += extra->data;
4054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
4154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        else if (extra->which == LONG_COMMENT) {
4254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            s += "/*";
4354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            s += extra->data;
4454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            s += "*/";
4554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
4654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        extra = extra->next;
4754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
4854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return s;
4954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
5054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
51fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onoratostring
5254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectappend(const char* a, const char* b)
5354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
5454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    string s = a;
5554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    s += b;
5654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return s;
5754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
5854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
59fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato// =================================================
60fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onoratoint
61fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onoratogenerate_java(const string& filename, const string& originalSrc,
62fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato                interface_type* iface)
6354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
64fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato    Class* cl;
6554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
66fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato    if (iface->document_item.item_type == INTERFACE_TYPE_BINDER) {
67fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato        cl = generate_binder_interface_class(iface);
6854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
69fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato    else if (iface->document_item.item_type == INTERFACE_TYPE_RPC) {
70fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato        cl = generate_rpc_interface_class(iface);
7154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
7254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
7354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Document* document = new Document;
7454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        document->comment = "";
7554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (iface->package) document->package = iface->package;
7654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        document->originalSrc = originalSrc;
77fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato        document->classes.push_back(cl);
7854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
7954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project//    printf("outputting... filename=%s\n", filename.c_str());
8054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    FILE* to;
8154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (filename == "-") {
8254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        to = stdout;
8354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    } else {
8454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project       /* open file in binary mode to ensure that the tool produces the
8554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        * same output on all platforms !!
8654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        */
8754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        to = fopen(filename.c_str(), "wb");
8854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (to == NULL) {
8954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            fprintf(stderr, "unable to open %s for write\n", filename.c_str());
9054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            return 1;
9154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
9254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
9354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
9454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    document->Write(to);
9554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
9654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    fclose(to);
9754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return 0;
9854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
9954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
100