2
* Copyright 2006-2008 Ondrej Jirman <ondrej.jirman@zonio.net>
4
* This file is part of libxr.
6
* Libxr is free software: you can redistribute it and/or modify it under the
7
* terms of the GNU Lesser General Public License as published by the Free
8
* Software Foundation, either version 2 of the License, or (at your option) any
11
* Libxr is distributed in the hope that it will be useful, but WITHOUT ANY
12
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13
* A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
16
* You should have received a copy of the GNU Lesser General Public License
17
* along with libxr. If not, see <http://www.gnu.org/licenses/>.
29
#define EL(i, fmt, args...) \
30
line_fprintf(f, i, fmt "\n", ##args)
32
#define E(i, fmt, args...) \
33
line_fprintf(f, i, fmt, ##args)
36
line_fprintf(f, 0, "\n")
41
#define OPEN(fmt, args...) { \
44
f = fopen(current_file = S(fmt, ##args), "w"); \
46
fprintf(stderr, "Can't open output file for writing."); exit(1); } \
50
static int current_line;
51
static char* current_file = NULL;
53
static void line_fprintf(FILE* f, int indent, const char* fmt, ...)
58
for (i=0; i<indent; i++)
62
char* v = g_strdup_vprintf(fmt, ap);
67
for (i=0; i<strlen(v); i++)
73
EL(0, "#line %d \"%s\"", current_line+1, current_file)
75
#define FILE_LINE(_line, _file) \
76
EL(0, "#line %d \"%s\"", _line, _file)
82
FILE_LINE(s##_line+1, xdl_file); \
88
static void gen_type_marchalizers(FILE* f, xdl_typedef* t)
91
if (t->type == TD_STRUCT)
93
EL(0, "G_GNUC_UNUSED static xr_value* %s(%s _nstruct)", t->march_name, t->ctype);
95
EL(1, "xr_value* _struct;");
96
for (k=t->struct_members; k; k=k->next)
98
xdl_struct_member* m = k->data;
99
EL(1, "xr_value* %s = NULL;", m->name);
102
EL(1, "if (_nstruct == NULL)");
103
EL(2, "return NULL;");
106
for (k=t->struct_members; k; k=k->next)
108
xdl_struct_member* m = k->data;
109
EL(2, "(%s = %s(_nstruct->%s)) == NULL%s", m->name, m->type->march_name, m->name, k->next ? " ||" : "");
113
for (k=t->struct_members; k; k=k->next)
115
xdl_struct_member* m = k->data;
116
EL(2, "xr_value_unref(%s);", m->name);
118
EL(2, "return NULL;");
121
EL(1, "_struct = xr_value_struct_new();");
122
for (k=t->struct_members; k; k=k->next)
124
xdl_struct_member* m = k->data;
125
EL(1, "xr_value_struct_set_member(_struct, \"%s\", %s);", m->name, m->name);
127
EL(1, "return _struct;");
131
EL(0, "G_GNUC_UNUSED static gboolean %s(xr_value* _struct, %s* _nstruct)", t->demarch_name, t->ctype);
133
EL(1, "%s _tmp_nstruct;", t->ctype);
135
EL(1, "g_return_val_if_fail(_nstruct != NULL, FALSE);");
137
EL(1, "if (_struct == NULL || xr_value_get_type(_struct) != XRV_STRUCT)");
138
EL(2, "return FALSE;");
140
EL(1, "_tmp_nstruct = %s_new();", t->cname);
142
for (k=t->struct_members; k; k=k->next)
144
xdl_struct_member* m = k->data;
145
EL(2, "!%s(xr_value_get_member(_struct, \"%s\"), &_tmp_nstruct->%s)%s", m->type->demarch_name, m->name, m->name, k->next ? " ||" : "");
149
EL(2, "%s(_tmp_nstruct);", t->free_func);
150
EL(2, "return FALSE;");
153
EL(1, "*_nstruct = _tmp_nstruct;");
154
EL(1, "return TRUE;");
158
else if (t->type == TD_ARRAY)
160
EL(0, "G_GNUC_UNUSED static xr_value* %s(%s _narray)", t->march_name, t->ctype);
162
EL(1, "GSList* _item;");
163
EL(1, "xr_value* _array = xr_value_array_new();");
165
EL(1, "for (_item = _narray; _item; _item = _item->next)");
167
EL(2, "xr_value* _item_value = %s((%s)_item->data);", t->item_type->march_name, t->item_type->ctype);
169
EL(2, "if (_item_value == NULL)");
171
EL(3, "xr_value_unref(_array);");
172
EL(3, "return NULL;");
175
EL(2, "xr_value_array_append(_array, _item_value);");
178
EL(1, "return _array;");
182
EL(0, "G_GNUC_UNUSED static gboolean %s(xr_value* _array, %s* _narray)", t->demarch_name, t->ctype);
184
EL(1, "GSList *_tmp_narray = NULL, *_item;");
186
EL(1, "g_return_val_if_fail(_narray != NULL, FALSE);");
188
EL(1, "if (_array == NULL || xr_value_get_type(_array) != XRV_ARRAY)");
189
EL(2, "return FALSE;");
191
EL(1, "for (_item = xr_value_get_items(_array); _item; _item = _item->next)");
193
EL(2, "%s _item_value = %s;", t->item_type->ctype, t->item_type->cnull);
195
EL(2, "if (!%s((xr_value*)_item->data, &_item_value))", t->item_type->demarch_name);
197
EL(3, "%s(_tmp_narray);", t->free_func);
198
EL(3, "return FALSE;");
201
EL(2, "_tmp_narray = g_slist_append(_tmp_narray, (void*)_item_value);");
204
EL(1, "*_narray = _tmp_narray;");
205
EL(1, "return TRUE;");
211
static void gen_type_freealloc(FILE* f, xdl_typedef* t, int def)
217
if (t->type == TD_STRUCT)
218
EL(0, "%s %s_new();", t->ctype, t->cname);
219
if (t->type == TD_STRUCT || t->type == TD_ARRAY)
221
EL(0, "void %s(%s val);", t->free_func, t->ctype);
222
EL(0, "%s %s(%s orig);", t->ctype, t->copy_func, t->ctype);
227
if (t->type == TD_STRUCT)
230
EL(0, "%s %s_new()", t->ctype, t->cname);
232
EL(1, "return g_new0(%s, 1);", t->cname);
237
EL(0, "void %s(%s val)", t->free_func, t->ctype);
239
EL(1, "if (val == NULL)");
242
for (k=t->struct_members; k; k=k->next)
244
xdl_struct_member* m = k->data;
245
if (m->type->free_func)
246
EL(1, "%s(val->%s);", m->type->free_func, m->name);
248
EL(1, "g_free(val);");
253
EL(0, "%s %s(%s orig)", t->ctype, t->copy_func, t->ctype);
255
EL(1, "%s copy;", t->ctype);
257
EL(1, "if (orig == NULL)");
258
EL(2, "return NULL;");
260
EL(1, "copy = %s_new();", t->cname);
261
for (k=t->struct_members; k; k=k->next)
263
xdl_struct_member* m = k->data;
264
if (m->type->copy_func)
265
EL(1, "copy->%s = %s(orig->%s);", m->name, m->type->copy_func, m->name);
267
EL(1, "copy->%s = orig->%s;", m->name, m->name);
270
EL(1, "return copy;");
274
else if (t->type == TD_ARRAY)
277
EL(0, "void %s(%s val)", t->free_func, t->ctype);
279
if (t->item_type->free_func)
280
EL(1, "g_slist_foreach(val, (GFunc)%s, NULL);", t->item_type->free_func);
281
EL(1, "g_slist_free(val);");
286
EL(0, "%s %s(%s orig)", t->ctype, t->copy_func, t->ctype);
288
EL(1, "%s copy = NULL;", t->ctype);
290
EL(1, "while (orig)");
292
if (t->item_type->copy_func)
293
EL(2, "copy = g_slist_prepend(copy, (gpointer)%s((%s)orig->data));", t->item_type->copy_func, t->item_type->ctype);
295
EL(2, "copy = g_slist_prepend(copy, orig->data);");
296
EL(2, "orig = orig->next;");
299
EL(1, "return g_slist_reverse(copy);");
305
static void gen_type_defs(FILE* f, GSList* types)
309
for (j=types; j; j=j->next)
311
xdl_typedef* t = j->data;
312
if (t->type == TD_STRUCT)
319
EL(0, "typedef struct _%s %s;", t->cname, t->cname);
324
for (j=types; j; j=j->next)
326
xdl_typedef* t = j->data;
327
if (t->type == TD_STRUCT)
331
EL(0, "struct _%s", t->cname);
333
for (k=t->struct_members; k; k=k->next)
335
xdl_struct_member* m = k->data;
336
EL(1, "%s %s;%s", m->type->ctype, m->name, m->type->type == TD_ARRAY ? S(" /* %s */", m->type->cname) : "");
344
static void gen_marchalizers(FILE* f, xdl_model* xdl, xdl_servlet* s)
348
for (j=xdl->types; j; j=j->next)
350
xdl_typedef* t = j->data;
351
if (t->type == TD_ANY)
353
gen_type_marchalizers(f, t);
355
for (j=s->types; j; j=j->next)
357
xdl_typedef* t = j->data;
358
if (t->type == TD_ANY)
360
gen_type_marchalizers(f, t);
364
static void gen_errors_header(FILE* f, xdl_model* xdl, xdl_servlet* s)
367
GSList* errs = s ? s->errors : xdl->errors;
373
for (j=errs; j; j=j->next)
375
xdl_error_code* e = j->data;
376
EL(1, "%s = %d,", e->cenum, e->code);
380
EL(0, "const char* %s%s_xmlrpc_error_to_string(int code);", xdl->name, s ? s->name : "");
384
static void gen_errors_impl(FILE* f, xdl_model* xdl, xdl_servlet* s)
387
GSList* errs = s ? s->errors : xdl->errors;
391
EL(0, "const char* %s%s_xmlrpc_error_to_string(int code)", xdl->name, s ? s->name : "");
393
for (j=errs; j; j=j->next)
395
xdl_error_code* e = j->data;
396
EL(1, "if (code == %s)", e->cenum);
397
EL(2, "return \"%s\";", e->name);
399
EL(1, "return NULL;");
406
static gchar* out_dir = NULL;
407
static gchar* xdl_file = NULL;
408
static gchar* mode = "all";
409
static const GOptionEntry entries[] =
411
{ "xdl", 'i', 0, G_OPTION_ARG_STRING, &xdl_file, "Interface description file.", "FILE" },
412
{ "out", 'o', 0, G_OPTION_ARG_STRING, &out_dir, "Output directory.", "DIR" },
413
{ "mode", 'm', 0, G_OPTION_ARG_STRING, &mode, "Compiler mode (all, server-impl, pub-headers, pub-impl, vapi).", "MODE" },
414
{ NULL, 0, 0, 0, NULL, NULL, NULL }
417
#define MODE_IS(str) !strcmp(mode, G_STRINGIFY(str))
419
int main(int ac, char* av[])
422
GOptionContext* ctx = g_option_context_new("- XML-RPC Interface Generator.");
423
g_option_context_add_main_entries(ctx, entries, NULL);
424
g_option_context_parse(ctx, &ac, &av, NULL);
425
g_option_context_set_help_enabled(ctx, TRUE);
429
printf("You must specify output directory.\n");
433
if (xdl_file == NULL)
435
printf("You must specify XDL file.\n");
439
xdl_model* xdl = xdl_parse_file(xdl_file, &err);
442
printf("%s\n", err->message);
450
int pub_headers = !strcmp(mode, "all") || !strcmp(mode, "pub-headers");
451
int pub_impl = !strcmp(mode, "all") || !strcmp(mode, "pub-impl");
452
int server_impl = !strcmp(mode, "all") || !strcmp(mode, "server-impl");
453
int vapi_file = !strcmp(mode, "vapi");
454
int xdl_gen = !strcmp(mode, "xdl");
455
int js_client = !strcmp(mode, "js");
457
/***********************************************************
458
* common types header *
459
***********************************************************/
464
OPEN("%s/%sCommon.h", out_dir, xdl->name);
466
EL(0, "#ifndef __%s_Common_H__", xdl->name);
467
EL(0, "#define __%s_Common_H__", xdl->name);
470
EL(0, "#include <xr-value.h>");
473
gen_errors_header(f, xdl, NULL);
475
gen_type_defs(f, xdl->types);
477
for (j=xdl->types; j; j=j->next)
479
xdl_typedef* t = j->data;
480
gen_type_freealloc(f, t, 1);
488
/***********************************************************
489
* common types implementation *
490
***********************************************************/
495
OPEN("%s/%sCommon.c", out_dir, xdl->name);
497
EL(0, "#include \"%sCommon.h\"", xdl->name);
500
for (j=xdl->types; j; j=j->next)
502
xdl_typedef* t = j->data;
503
gen_type_freealloc(f, t, 0);
506
gen_errors_impl(f, xdl, NULL);
510
/* client/servlet implementations for specific interfaces */
512
for (i=xdl->servlets; i; i=i->next)
514
xdl_servlet* s = i->data;
516
/***********************************************************
517
* servlet types header *
518
***********************************************************/
523
OPEN("%s/%s%s.h", out_dir, xdl->name, s->name);
525
EL(0, "#ifndef __%s_%s_H__", xdl->name, s->name);
526
EL(0, "#define __%s_%s_H__", xdl->name, s->name);
529
EL(0, "#include \"%sCommon.h\"", xdl->name);
532
gen_errors_header(f, xdl, s);
534
gen_type_defs(f, s->types);
536
for (j=s->types; j; j=j->next)
538
xdl_typedef* t = j->data;
539
gen_type_freealloc(f, t, 1);
547
/***********************************************************
548
* servlet types implementation *
549
***********************************************************/
554
OPEN("%s/%s%s.c", out_dir, xdl->name, s->name);
556
EL(0, "#include \"%s%s.h\"", xdl->name, s->name);
559
for (j=s->types; j; j=j->next)
561
xdl_typedef* t = j->data;
562
gen_type_freealloc(f, t, 0);
565
gen_errors_impl(f, xdl, s);
569
/***********************************************************
570
* servlet client interface definition *
571
***********************************************************/
576
OPEN("%s/%s%s.xrc.h", out_dir, xdl->name, s->name);
578
EL(0, "#ifndef __%s_%s_XRC_H__", xdl->name, s->name);
579
EL(0, "#define __%s_%s_XRC_H__", xdl->name, s->name);
582
EL(0, "#include <xr-client.h>");
583
EL(0, "#include \"%s%s.h\"", xdl->name, s->name);
586
for (j=s->methods; j; j=j->next)
588
xdl_method* m = j->data;
592
EL(0, " * @param _conn Client connection object.");
593
for (k=m->params; k; k=k->next)
595
xdl_method_param* p = k->data;
596
EL(0, " * @param %s", p->name);
598
EL(0, " * @param _error Error variable pointer (may be NULL).");
600
EL(0, " * @return ");
603
E(0, "%s %s%s_%s(xr_client_conn* _conn", m->return_type->ctype, xdl->name, s->name, m->name);
604
for (k=m->params; k; k=k->next)
606
xdl_method_param* p = k->data;
607
E(0, ", %s%s %s", !strcmp(p->type->ctype, "char*") ? "const " : "", p->type->ctype, p->name);
609
EL(0, ", GError** _error);");
617
/***********************************************************
618
* servlet client interface implementation *
619
***********************************************************/
624
OPEN("%s/%s%s.xrc.c", out_dir, xdl->name, s->name);
626
EL(0, "#include \"%s%s.xrc.h\"", xdl->name, s->name);
629
gen_marchalizers(f, xdl, s);
632
for (j=s->methods; j; j=j->next)
634
xdl_method* m = j->data;
636
E(0, "%s %s%s_%s(xr_client_conn* _conn", m->return_type->ctype, xdl->name, s->name, m->name);
637
for (k=m->params; k; k=k->next)
639
xdl_method_param* p = k->data;
640
E(0, ", %s%s %s", !strcmp(p->type->ctype, "char*") ? "const " : "", p->type->ctype, p->name);
642
EL(0, ", GError** _error)");
644
EL(1, "%s _retval = %s;", m->return_type->ctype, m->return_type->cnull);
645
EL(1, "xr_value* _param_value;");
646
EL(1, "xr_call* _call;");
648
EL(1, "g_return_val_if_fail(_conn != NULL, _retval);");
649
EL(1, "g_return_val_if_fail(_error == NULL || *_error == NULL, _retval);");
651
EL(1, "_call = xr_call_new(\"%s%s.%s\");", xdl->name, s->name, m->name);
652
for (k=m->params; k; k=k->next)
654
xdl_method_param* p = k->data;
656
EL(1, "_param_value = %s(%s);", p->type->march_name, p->name);
657
EL(1, "if (_param_value == NULL)");
659
EL(2, "g_set_error(_error, XR_CLIENT_ERROR, XR_CLIENT_ERROR_MARCHALIZER, \"Call parameter value marchalization failed (param=%s).\");", p->name);
660
EL(2, "xr_call_free(_call);");
661
EL(2, "return _retval;");
663
EL(1, "xr_call_add_param(_call, _param_value);");
666
EL(1, "if (xr_client_call(_conn, _call, _error))");
668
EL(2, "if (!%s(xr_call_get_retval(_call), &_retval))", m->return_type->demarch_name);
669
EL(3, "g_set_error(_error, XR_CLIENT_ERROR, XR_CLIENT_ERROR_MARCHALIZER, \"Call return value demarchalization failed.\");");
672
EL(1, "xr_call_free(_call);");
673
EL(1, "return _retval;");
680
/***********************************************************
681
* servlet server stubs for implementation *
682
***********************************************************/
687
OPEN("%s/%s%s.stubs.h", out_dir, xdl->name, s->name);
689
EL(0, "#ifndef __%s_%s_STUBS_H__", xdl->name, s->name);
690
EL(0, "#define __%s_%s_STUBS_H__", xdl->name, s->name);
693
EL(0, "#include <xr-server.h>");
694
EL(0, "#include \"%s%s.h\"", xdl->name, s->name);
701
EL(0, "/** Implementation specific servlet data.");
704
EL(0, "typedef struct _%s%sServlet %s%sServlet;", xdl->name, s->name, xdl->name, s->name);
707
EL(0, "/** Utility method that returns size of the servlet private data.");
709
EL(0, " * @return Size of the @ref %s%sServlet struct.", xdl->name, s->name);
711
EL(0, "int __%s%sServlet_get_priv_size();", xdl->name, s->name);
714
EL(0, "/** Servlet constructor.");
716
EL(0, " * @param _servlet Servlet object.");
718
EL(0, " * @return TRUE if all is ok.");
720
EL(0, "gboolean %s%sServlet_init(xr_servlet* _servlet);", xdl->name, s->name);
723
EL(0, "/** Servlet destructor.");
725
EL(0, " * @param _servlet Servlet object.");
727
EL(0, "void %s%sServlet_fini(xr_servlet* _servlet);", xdl->name, s->name);
730
EL(0, "/** Pre-call hook.");
732
EL(0, " * @param _servlet Servlet object.");
733
EL(0, " * @param _call Call object.");
735
EL(0, " * @return TRUE if you want to continue execution of the call.");
737
EL(0, "gboolean %s%sServlet_pre_call(xr_servlet* _servlet, xr_call* _call);", xdl->name, s->name);
740
EL(0, "/** Post-call hook.");
742
EL(0, " * @param _servlet Servlet object.");
743
EL(0, " * @param _call Call object.");
745
EL(0, " * @return TRUE if you want to continue execution of the call.");
747
EL(0, "gboolean %s%sServlet_post_call(xr_servlet* _servlet, xr_call* _call);", xdl->name, s->name);
750
EL(0, "/** Fallback hook. (for undefined methods)");
752
EL(0, " * @param _servlet Servlet object.");
753
EL(0, " * @param _call Call object.");
755
EL(0, " * @return TRUE if you handled the call.");
757
EL(0, "gboolean %s%sServlet_fallback(xr_servlet* _servlet, xr_call* _call);", xdl->name, s->name);
760
EL(0, "/** Download hook.");
762
EL(0, " * @param _servlet Servlet object.");
764
EL(0, " * @return TRUE if you want to continue execution of the call.");
766
EL(0, "gboolean %s%sServlet_download(xr_servlet* _servlet);", xdl->name, s->name);
769
EL(0, "/** Upload hook.");
771
EL(0, " * @param _servlet Servlet object.");
773
EL(0, " * @return TRUE if you want to continue execution of the call.");
775
EL(0, "gboolean %s%sServlet_upload(xr_servlet* _servlet);", xdl->name, s->name);
778
for (j=s->methods; j; j=j->next)
780
xdl_method* m = j->data;
790
EL(0, " * @param _servlet Servlet object.");
791
for (k=m->params; k; k=k->next)
793
xdl_method_param* p = k->data;
794
EL(0, " * @param %s", p->name);
797
EL(0, " * @return ");
801
E(0, "%s %s%sServlet_%s(xr_servlet* _servlet", m->return_type->ctype, xdl->name, s->name, m->name);
802
for (k=m->params; k; k=k->next)
804
xdl_method_param* p = k->data;
805
E(0, ", %s %s", p->type->ctype, p->name);
807
EL(0, ", GError** _error);");
813
/***********************************************************
814
* servlet server stubs for implementation *
815
***********************************************************/
817
OPEN("%s/%s%s.stubs.c", out_dir, xdl->name, s->name);
819
EL(0, "#include \"%s%s.stubs.h\"", xdl->name, s->name);
824
STUB(s->stub_header);
828
EL(0, "struct _%s%sServlet", xdl->name, s->name);
834
EL(0, "int __%s%sServlet_get_priv_size()", xdl->name, s->name);
836
EL(1, "return sizeof(%s%sServlet);", xdl->name, s->name);
840
EL(0, "gboolean %s%sServlet_init(xr_servlet* _servlet)", xdl->name, s->name);
842
EL(1, "%s%sServlet* _priv = xr_servlet_get_priv(_servlet);", xdl->name, s->name);
844
EL(1, "return TRUE;");
848
EL(0, "void %s%sServlet_fini(xr_servlet* _servlet)", xdl->name, s->name);
850
EL(1, "%s%sServlet* _priv = xr_servlet_get_priv(_servlet);", xdl->name, s->name);
855
EL(0, "gboolean %s%sServlet_pre_call(xr_servlet* _servlet, xr_call* _call)", xdl->name, s->name);
857
EL(1, "%s%sServlet* _priv = xr_servlet_get_priv(_servlet);", xdl->name, s->name);
858
STUB(s->stub_pre_call);
859
EL(1, "return TRUE;");
863
EL(0, "gboolean %s%sServlet_post_call(xr_servlet* _servlet, xr_call* _call)", xdl->name, s->name);
865
EL(1, "%s%sServlet* _priv = xr_servlet_get_priv(_servlet);", xdl->name, s->name);
866
STUB(s->stub_post_call);
867
EL(1, "return TRUE;");
871
EL(0, "gboolean %s%sServlet_fallback(xr_servlet* _servlet, xr_call* _call)", xdl->name, s->name);
873
EL(1, "%s%sServlet* _priv = xr_servlet_get_priv(_servlet);", xdl->name, s->name);
874
STUB(s->stub_fallback);
875
EL(1, "return TRUE;");
879
EL(0, "gboolean %s%sServlet_download(xr_servlet* _servlet)", xdl->name, s->name);
881
EL(1, "%s%sServlet* _priv = xr_servlet_get_priv(_servlet);", xdl->name, s->name);
882
EL(1, "xr_http* _http = xr_servlet_get_http(_servlet);");
883
STUB(s->stub_download);
884
EL(1, "return FALSE;");
888
EL(0, "gboolean %s%sServlet_upload(xr_servlet* _servlet)", xdl->name, s->name);
890
EL(1, "%s%sServlet* _priv = xr_servlet_get_priv(_servlet);", xdl->name, s->name);
891
EL(1, "xr_http* _http = xr_servlet_get_http(_servlet);");
892
STUB(s->stub_upload);
893
EL(1, "return FALSE;");
897
for (j=s->methods; j; j=j->next)
899
xdl_method* m = j->data;
901
E(0, "%s %s%sServlet_%s(xr_servlet* _servlet", m->return_type->ctype, xdl->name, s->name, m->name);
902
for (k=m->params; k; k=k->next)
904
xdl_method_param* p = k->data;
905
E(0, ", %s %s", p->type->ctype, p->name);
907
EL(0, ", GError** _error)");
909
EL(1, "%s%sServlet* _priv = xr_servlet_get_priv(_servlet);", xdl->name, s->name);
910
EL(1, "%s retval = %s;", m->return_type->ctype, m->return_type->cnull);
914
EL(1, "g_set_error(_error, 0, 1, \"Method is not implemented. (%s)\");", m->name);
915
EL(1, "return retval;");
920
/***********************************************************
921
* servlet server interface internals header *
922
***********************************************************/
924
OPEN("%s/%s%s.xrs.h", out_dir, xdl->name, s->name);
926
EL(0, "#ifndef __%s_%s_XRS_H__", xdl->name, s->name);
927
EL(0, "#define __%s_%s_XRS_H__", xdl->name, s->name);
930
EL(0, "#include <xr-server.h>");
931
EL(0, "#include \"%s%s.stubs.h\"", xdl->name, s->name);
934
EL(0, "xr_servlet_def* __%s%sServlet_def();", xdl->name, s->name);
939
/***********************************************************
940
* servlet server interface implementation *
941
***********************************************************/
943
OPEN("%s/%s%s.xrs.c", out_dir, xdl->name, s->name);
945
EL(0, "#include \"%s%s.xrs.h\"", xdl->name, s->name);
948
gen_marchalizers(f, xdl, s);
951
for (j=s->methods; j; j=j->next)
953
xdl_method* m = j->data;
956
EL(0, "static gboolean __method_%s(xr_servlet* _servlet, xr_call* _call)", m->name);
958
// forward declarations
959
EL(1, "gboolean _retval = FALSE;");
960
EL(1, "%s _nreturn_value = %s;", m->return_type->ctype, m->return_type->cnull);
961
EL(1, "xr_value* _return_value;");
962
EL(1, "GError* _error = NULL;");
963
for (k=m->params; k; k=k->next)
965
xdl_method_param* p = k->data;
966
EL(1, "%s %s = %s;", p->type->ctype, p->name, p->type->cnull);
969
EL(1, "g_return_val_if_fail(_servlet != NULL, FALSE);");
970
EL(1, "g_return_val_if_fail(_call != NULL, FALSE);");
971
// prepare parameters
972
for (k=m->params; k; k=k->next)
974
xdl_method_param* p = k->data;
976
EL(1, "if (!%s(xr_call_get_param(_call, %d), &%s))", p->type->demarch_name, n++, p->name);
978
EL(2, "xr_call_set_error(_call, -1, \"Stub parameter value demarchalization failed. (%s:%s)\");", m->name, p->name);
985
E(1, "_nreturn_value = %s%sServlet_%s(_servlet", xdl->name, s->name, m->name);
986
for (k=m->params; k; k=k->next)
988
xdl_method_param* p = k->data;
989
E(0, ", %s", p->name);
991
EL(0, ", &_error);");
994
EL(1, "if (_error)");
996
EL(2, "xr_call_set_error(_call, _error->code, _error->message);");
997
EL(2, "g_error_free(_error);");
1003
EL(1, "_return_value = %s(_nreturn_value);", m->return_type->march_name);
1004
EL(1, "if (_return_value == NULL)");
1006
EL(2, "xr_call_set_error(_call, -1, \"Stub return value marchalization failed. (%s)\");", m->name);
1010
EL(1, "xr_call_set_retval(_call, _return_value);");
1011
EL(1, "_retval = TRUE;");
1013
// free native types and return
1016
if (m->return_type->free_func)
1017
EL(1, "%s(_nreturn_value);", m->return_type->free_func);
1018
for (k=m->params; k; k=k->next)
1020
xdl_method_param* p = k->data;
1021
if (!p->pass_ownership && p->type->free_func)
1022
EL(1, "%s(%s);", p->type->free_func, p->name);
1024
EL(1, "return _retval;");
1029
EL(0, "static xr_servlet_method_def __servlet_methods[] = {");
1030
for (j=s->methods; j; j=j->next)
1032
xdl_method* m = j->data;
1034
EL(2, ".name = \"%s\",", m->name);
1035
EL(2, ".cb = __method_%s", m->name);
1036
EL(1, "}%s", j->next ? "," : "");
1041
#define SET_STUB(n) \
1043
EL(1, "." G_STRINGIFY(n) " = %s%sServlet_" G_STRINGIFY(n) ",", xdl->name, s->name); \
1045
EL(1, "." G_STRINGIFY(n) " = NULL,")
1047
EL(0, "static xr_servlet_def __servlet = {");
1048
EL(1, ".name = \"%s%s\",", xdl->name, s->name);
1052
SET_STUB(post_call);
1056
EL(1, ".methods_count = %d,", g_slist_length(s->methods));
1057
EL(1, ".methods = __servlet_methods");
1061
EL(0, "xr_servlet_def* __%s%sServlet_def()", xdl->name, s->name);
1063
EL(1, "__servlet.size = __%s%sServlet_get_priv_size();", xdl->name, s->name);
1064
EL(1, "return &__servlet;");
1070
/***********************************************************
1072
***********************************************************/
1077
OPEN("%s/%s.vapi", out_dir, xdl->name);
1079
EL(0, "/* VALA bindings */");
1081
EL(0, "[CCode (cheader_filename = \"xr-lib.h\", lower_case_cprefix = \"xr_\", cprefix = \"xr_\")]");
1082
EL(0, "namespace XR");
1084
EL(1, "public static void init();");
1085
EL(1, "public static void fini();");
1087
EL(1, "[CCode (cheader_filename = \"xr-value.h\", free_function = \"xr_blob_unref\", cname = \"xr_blob\", cprefix = \"xr_blob_\")]");
1088
EL(1, "public class Blob");
1090
EL(2, "public string buf;");
1091
EL(2, "public int len;");
1092
EL(2, "[CCode (cname = \"xr_blob_new\")]");
1093
EL(2, "public Blob(string buf, int len);");
1096
EL(1, "[CCode (cprefix = \"XRV_\")]");
1097
EL(1, "public enum ValueType { ARRAY, STRUCT, MEMBER, INT, STRING, BOOLEAN, DOUBLE, TIME, BLOB }");
1099
EL(1, "[CCode (cheader_filename = \"xr-value.h\", unref_function = \"xr_value_unref\", ref_function = \"xr_value_ref\", cname = \"xr_value\", cprefix = \"xr_value_\")]");
1100
EL(1, "public class Value");
1102
EL(2, "[CCode (cname = \"xr_value_int_new\")]");
1103
EL(2, "public Value.int(int val);");
1104
EL(2, "[CCode (cname = \"xr_value_string_new\")]");
1105
EL(2, "public Value.string(string val);");
1106
EL(2, "[CCode (cname = \"xr_value_bool_new\")]");
1107
EL(2, "public Value.bool(bool val);");
1108
EL(2, "[CCode (cname = \"xr_value_double_new\")]");
1109
EL(2, "public Value.double(double val);");
1110
EL(2, "[CCode (cname = \"xr_value_time_new\")]");
1111
EL(2, "public Value.time(string val);");
1112
EL(2, "[CCode (cname = \"xr_value_blob_new\")]");
1113
EL(2, "public Value.blob(XR.Blob# val);");
1114
EL(2, "[CCode (cname = \"xr_value_array_new\")]");
1115
EL(2, "public Value.array();");
1116
EL(2, "[CCode (cname = \"xr_value_struct_new\")]");
1117
EL(2, "public Value.@struct();");
1118
EL(2, "public bool to_int(ref int nval);");
1119
EL(2, "public bool to_string(ref string nval);");
1120
EL(2, "public bool to_bool(ref bool nval);");
1121
EL(2, "public bool to_double(ref double nval);");
1122
EL(2, "public bool to_time(ref string nval);");
1123
EL(2, "public bool to_blob(ref XR.Blob nval);");
1124
EL(2, "public bool to_value(ref XR.Value nval);");
1125
EL(2, "public ValueType get_type();");
1126
EL(2, "public void array_append(Value val);");
1127
EL(2, "public GLib.SList<weak Value> get_items();");
1128
EL(2, "public void set_member(string name, Value# val);");
1129
EL(2, "public weak Value get_member(string name);");
1130
EL(2, "public weak GLib.SList<weak Value> get_members();");
1131
EL(2, "public weak string get_member_name();");
1132
EL(2, "public weak Value get_member_value();");
1133
EL(2, "public bool is_error_retval(ref int code, ref string msg);");
1134
EL(2, "public void dump(GLib.StringBuilder str, int indent);");
1138
EL(1, "[CCode (cheader_filename = \"xr-call.h\", free_function = \"xr_call_free\", cname = \"xr_call\", cprefix = \"xr_call_\")]");
1139
EL(1, "public class Call");
1141
EL(2, "public Call(string method);");
1142
EL(2, "public weak string get_method();");
1143
EL(2, "public weak string get_method_full();");
1144
EL(2, "public void add_param(Value# val);");
1145
EL(2, "public weak Value get_param(uint pos);");
1146
EL(2, "public void set_retval(Value# val);");
1147
EL(2, "public weak Value get_retval();");
1148
EL(2, "public void set_error(int code, string msg);");
1149
EL(2, "public int get_error_code();");
1150
EL(2, "public weak string get_error_message();");
1151
EL(2, "public string dump_string(int indent);");
1152
EL(2, "public void dump(int indent);");
1156
EL(0, "[CCode (cheader_filename = \"%sCommon.h\", lower_case_cprefix = \"xr_\", cprefix = \"%s\")]", xdl->name, xdl->name);
1157
EL(0, "namespace %s", xdl->name);
1159
EL(1, "[CCode (cprefix = \"%s_XMLRPC_ERROR_\")]", xdl->name);
1160
EL(1, "public enum Error");
1162
for (j=xdl->errors; j; j=j->next)
1164
xdl_error_code* e = j->data;
1165
EL(2, "%s = %d,", e->name, e->code);
1168
for (j=xdl->types; j; j=j->next)
1170
xdl_typedef* t = j->data;
1171
if (t->type == TD_STRUCT)
1175
EL(1, "[CCode (free_function = \"%s\", copy_function = \"%s\")]", t->free_func, t->copy_func);
1176
EL(1, "public class %s", t->name);
1178
for (k=t->struct_members; k; k=k->next)
1180
xdl_struct_member* m = k->data;
1181
EL(2, "public %s %s;", xdl_typedef_vala_name(m->type), m->name);
1187
for (i=xdl->servlets; i; i=i->next)
1189
xdl_servlet* s = i->data;
1192
EL(1, "[CCode (cheader_filename = \"%s%s.xrc.h\", free_function = \"xr_client_free\", cname = \"xr_client_conn\", cprefix = \"%s%s_\")]", xdl->name, s->name, xdl->name, s->name);
1193
EL(1, "public class %s", s->name);
1195
EL(2, "[CCode (cname = \"xr_client_new\")]");
1196
EL(2, "public %s() throws GLib.Error;", s->name);
1197
EL(2, "[CCode (cname = \"xr_client_open\")]");
1198
EL(2, "public bool open(string uri) throws GLib.Error;");
1199
EL(2, "[CCode (cname = \"xr_client_close\")]");
1200
EL(2, "public void close();");
1201
EL(2, "[CCode (cname = \"xr_client_set_http_header\")]");
1202
EL(2, "public void set_http_header(string name, string? value);");
1203
EL(2, "[CCode (cname = \"xr_client_reset_http_headers\")]");
1204
EL(2, "public void reset_http_headers();");
1205
EL(2, "[CCode (cname = \"xr_client_basic_auth\")]");
1206
EL(2, "public void basic_auth(string username, string password);");
1207
for (j=s->methods; j; j=j->next)
1209
xdl_method* m = j->data;
1211
E(2, "public %s %s(", xdl_typedef_vala_name(m->return_type), m->name);
1212
for (k=m->params; k; k=k->next)
1214
xdl_method_param* p = k->data;
1215
E(0, "%s %s%s", xdl_typedef_vala_name(p->type), p->name, k->next ? ", " : "");
1217
EL(0, ") throws GLib.Error;");
1227
OPEN("%s/%s.xdl", out_dir, xdl->name);
1229
EL(0, "/* Generated XDL */");
1232
EL(0, "namespace %s;", xdl->name);
1235
for (j=xdl->errors; j; j=j->next)
1237
xdl_error_code* e = j->data;
1238
EL(0, "error %-22s = %d;", e->name, e->code);
1241
for (j=xdl->types; j; j=j->next)
1243
xdl_typedef* t = j->data;
1244
if (t->type == TD_STRUCT)
1247
EL(0, "struct %s", t->name);
1249
for (k=t->struct_members; k; k=k->next)
1251
xdl_struct_member* m = k->data;
1252
EL(1, "%-24s %s;", xdl_typedef_xdl_name(m->type), m->name);
1258
for (i=xdl->servlets; i; i=i->next)
1260
xdl_servlet* s = i->data;
1262
EL(0, "servlet %s", s->name);
1265
for (j=s->errors; j; j=j->next)
1267
xdl_error_code* e = j->data;
1268
EL(1, "error %-18s = %d;", e->name, e->code);
1273
for (j=s->types; j; j=j->next)
1275
xdl_typedef* t = j->data;
1276
if (t->type == TD_STRUCT)
1278
EL(1, "struct %s", t->name);
1280
for (k=t->struct_members; k; k=k->next)
1282
xdl_struct_member* m = k->data;
1283
EL(2, "%-20s %s;", xdl_typedef_xdl_name(m->type), m->name);
1290
s->methods = g_slist_sort(s->methods, (GCompareFunc)xdl_method_compare);
1292
for (j=s->methods; j; j=j->next)
1294
xdl_method* m = j->data;
1296
E(1, "%-24s %-25s(", xdl_typedef_xdl_name(m->return_type), m->name);
1297
for (k=m->params; k; k=k->next)
1299
xdl_method_param* p = k->data;
1301
EL(0, "%-15s %s%s", xdl_typedef_xdl_name(p->type), p->name, k->next ? "," : ");");
1303
EL(0, "%-55s%-15s %s%s", "", xdl_typedef_xdl_name(p->type), p->name, k->next ? "," : ");");
1305
if (m->params == NULL)
1315
OPEN("%s/%s.js", out_dir, xdl->name);
1317
EL(0, "/* Generated JS client code */");
1319
EL(0, "var %s = {};", xdl->name);
1323
for (j = xdl->errors; j; j = j->next)
1325
xdl_error_code* e = j->data;
1326
EL(0, "%-30s = %d;", S("%s.%s", xdl->name, e->name), e->code);
1329
for (i = xdl->servlets; i; i = i->next)
1331
xdl_servlet* s = i->data;
1334
EL(0, "%s.%s = Class.create(Client,", xdl->name, s->name);
1337
for (j=s->methods; j; j=j->next)
1339
xdl_method* m = j->data;
1341
E(1, "%s: function(", m->name);
1342
for (k=m->params; k; k=k->next)
1344
xdl_method_param* p = k->data;
1345
E(0, "%s%s", p->name, k->next ? ", " : "");
1350
for (k=m->params; k; k=k->next)
1352
xdl_method_param* p = k->data;
1353
EL(2, "if (!Object.is%s(%s))", p->type->name, p->name);
1354
EL(3, "throw new Error('Parameter %s must be of type %s.');", p->name, p->type->name);
1357
E(2, "return this.call('%s%s.%s', [ ", xdl->name, s->name, m->name);
1358
for (k=m->params; k; k=k->next)
1360
xdl_method_param* p = k->data;
1361
E(0, "%s%s", p->name, k->next ? ", " : "");
1364
EL(1, "}%s", j->next ? "," : "");