00001
00002
00003 #include <sysdep.h>
00004 #include "include/libjwgc.h"
00005
00006 #define SEPARATOR "\
00007 ----------------------------------------------------------------------------\n\
00008 "
00009
00010 xode set_filled_form(xode filledform, char *variable, char *setting)
00011 {
00012 xode x, entry, value;
00013 char *var;
00014
00015 if (!variable) {
00016 return filledform;
00017 }
00018
00019 entry = NULL;
00020 x = xode_get_firstchild(filledform);
00021 while (x) {
00022 var = xode_get_attrib(x, "var");
00023 if (!var) {
00024 continue;
00025 }
00026
00027 if (!strcmp(var, variable)) {
00028 entry = x;
00029 break;
00030 }
00031
00032 x = xode_get_nextsibling(x);
00033 }
00034
00035 if (entry) {
00036 xode_hide(entry);
00037 }
00038
00039 if (!setting) {
00040 return filledform;
00041 }
00042
00043 entry = xode_insert_tag(filledform, "field");
00044 xode_put_attrib(entry, "var", variable);
00045 value = xode_insert_tag(entry, "value");
00046 xode_insert_cdata(value, setting, strlen(setting));
00047
00048 return filledform;
00049 }
00050
00051 char *get_filled_form(xode filledform, char *variable)
00052 {
00053 char *value, *var;
00054 xode entry, x;
00055
00056 if (!variable) {
00057 return NULL;
00058 }
00059
00060 entry = NULL;
00061 x = xode_get_firstchild(filledform);
00062 while (x) {
00063 var = xode_get_attrib(x, "var");
00064 if (!var) {
00065 continue;
00066 }
00067
00068 if (!strcmp(var, variable)) {
00069 entry = x;
00070 break;
00071 }
00072
00073 x = xode_get_nextsibling(x);
00074 }
00075
00076 if (!entry) {
00077 return NULL;
00078 }
00079
00080 value = xode_get_tagdata(entry, "value");
00081 return value;
00082 }
00083
00084 xode set_filled_nonform(xode filledform, char *variable, char *setting)
00085 {
00086 xode entry;
00087
00088 if (!variable) {
00089 return filledform;
00090 }
00091
00092 entry = xode_get_tag(filledform, variable);
00093 if (entry) {
00094 xode_hide(entry);
00095 }
00096
00097 if (!setting) {
00098 return filledform;
00099 }
00100
00101 entry = xode_insert_tag(filledform, variable);
00102 xode_insert_cdata(entry, setting, strlen(setting));
00103
00104 return filledform;
00105 }
00106
00107 char *get_filled_nonform(xode filledform, char *variable)
00108 {
00109 char *entry;
00110
00111 if (!variable) {
00112 return NULL;
00113 }
00114
00115 entry = xode_get_tagdata(filledform, variable);
00116 return entry;
00117 }
00118
00119 xode display_field_text_single(xode field, xode filledform, char id)
00120 {
00121 char *value, *label, *var, *setting;
00122
00123 var = xode_get_attrib(field, "var");
00124 if (!var) {
00125 return filledform;
00126 }
00127
00128 label = xode_get_attrib(field, "label");
00129 value = xode_get_tagdata(field, "value");
00130 setting = get_filled_form(filledform, var);
00131 if (!setting && value) {
00132 setting = value;
00133 filledform = set_filled_form(filledform, var, setting);
00134 }
00135
00136 printf("%c. %-20.20s = %s\n",
00137 id,
00138 label ? label : var,
00139 setting ? setting : "<not set>");
00140
00141 return filledform;
00142 }
00143
00144 xode display_field_text_private(xode field, xode filledform, char id)
00145 {
00146 char *value, *label, *var, *setting, *tmpstr;
00147 int i;
00148
00149 var = xode_get_attrib(field, "var");
00150 if (!var) {
00151 return filledform;
00152 }
00153
00154 label = xode_get_attrib(field, "label");
00155 value = xode_get_tagdata(field, "value");
00156 setting = get_filled_form(filledform, var);
00157 if (!setting && value) {
00158 setting = value;
00159 filledform = set_filled_form(filledform, var, setting);
00160 }
00161
00162 if (setting) {
00163 tmpstr = (char *)malloc(sizeof(char) * (strlen(setting) + 1));
00164 for (i = 0; i < strlen(setting); i++) {
00165 tmpstr[i] = '*';
00166 }
00167 tmpstr[strlen(setting)+1] = '\0';
00168 }
00169
00170 printf("%c. %-20.20s = %s\n",
00171 id,
00172 label ? label : var,
00173 setting ? tmpstr : "<not set>");
00174
00175 free(tmpstr);
00176
00177 return filledform;
00178 }
00179
00180 xode display_field_text_multi(xode field, xode filledform, char id)
00181 {
00182
00183 return display_field_text_single(field, filledform, id);
00184 }
00185
00186 char *find_list_label(xode field, char *target)
00187 {
00188 xode option;
00189 char *value;
00190
00191 option = xode_get_tag(field, "option");
00192 while (option) {
00193 value = xode_get_tagdata(option, "value");
00194 if (!value) {
00195 continue;
00196 }
00197
00198 if (!strcmp(value, target)) {
00199 char *label;
00200
00201 label = xode_get_attrib(option, "label");
00202 if (label) {
00203 return label;
00204 }
00205 else {
00206 return target;
00207 }
00208 }
00209
00210 option = xode_get_nextsibling(option);
00211 }
00212
00213 return NULL;
00214 }
00215
00216 char *find_list_id(xode field, int choice)
00217 {
00218 xode option;
00219 int id = 0;
00220
00221 option = xode_get_tag(field, "option");
00222 while (option) {
00223 char *label, *value;
00224
00225 value = xode_get_tagdata(option, "value");
00226 if (!value) {
00227 continue;
00228 }
00229
00230 label = xode_get_attrib(option, "label");
00231
00232 id++;
00233 if (id == choice) {
00234 return (label ? label : value);
00235 }
00236
00237 option = xode_get_nextsibling(option);
00238 }
00239
00240 return NULL;
00241 }
00242
00243 int show_list_labels(xode field)
00244 {
00245 xode option;
00246 int id = 0;
00247
00248 option = xode_get_tag(field, "option");
00249 while (option) {
00250 char *label, *value;
00251
00252 value = xode_get_tagdata(option, "value");
00253 if (!value) {
00254 continue;
00255 }
00256
00257 label = xode_get_attrib(option, "label");
00258 printf("%d. %s\n", id++, label ? label : value);
00259
00260 option = xode_get_nextsibling(option);
00261 }
00262
00263 return --id;
00264 }
00265
00266 xode display_field_list_single(xode field, xode filledform, char id)
00267 {
00268 char *value, *label, *var, *setting;
00269
00270 var = xode_get_attrib(field, "var");
00271 if (!var) {
00272 return filledform;
00273 }
00274
00275 label = xode_get_attrib(field, "label");
00276 value = xode_get_tagdata(field, "value");
00277 setting = get_filled_form(filledform, var);
00278 if (!setting && value) {
00279 setting = value;
00280 filledform = set_filled_form(filledform, var, setting);
00281 }
00282
00283 setting = find_list_label(field, setting);
00284
00285 printf("%c: %-20.20s = %s\n",
00286 id,
00287 label ? label : var,
00288 setting ? setting : "<not set>");
00289
00290 return filledform;
00291 }
00292
00293 xode display_field_list_multi(xode field, xode filledform, char id)
00294 {
00295
00296 return display_field_text_single(field, filledform, id);
00297 }
00298
00299 xode display_field_boolean(xode field, xode filledform, char id)
00300 {
00301 char *value, *label, *var, *setting;
00302
00303 var = xode_get_attrib(field, "var");
00304 if (!var) {
00305 return filledform;
00306 }
00307
00308 label = xode_get_attrib(field, "label");
00309 value = xode_get_tagdata(field, "value");
00310 setting = get_filled_form(filledform, var);
00311 if (!setting && value) {
00312 setting = value;
00313 filledform = set_filled_form(filledform, var, setting);
00314 }
00315
00316 printf("%c: %-20.20s = %s\n",
00317 id,
00318 label ? label : var,
00319 setting ?
00320 ((!strcmp(setting, "1")) ||
00321 (!strcmp(setting, "true")) ||
00322 (!strcmp(setting, "yes")) ? "true" : "false")
00323 : "<not set>");
00324
00325 return filledform;
00326 }
00327
00328 xode display_field_fixed(xode field, xode filledform)
00329 {
00330 char *value, *label, *var, *setting;
00331
00332 var = xode_get_attrib(field, "var");
00333 if (!var) {
00334 return filledform;
00335 }
00336
00337 label = xode_get_attrib(field, "label");
00338 value = xode_get_tagdata(field, "value");
00339 setting = get_filled_form(filledform, var);
00340 if (!setting && value) {
00341 setting = value;
00342 filledform = set_filled_form(filledform, var, setting);
00343 }
00344
00345 setting = find_list_label(field, setting);
00346
00347 printf("--: %-20.20s = %s\n",
00348 label ? label : var,
00349 setting ? setting : "<not set>");
00350
00351 return filledform;
00352 }
00353
00354 xode display_field_hidden(xode field, xode filledform)
00355 {
00356 char *variable, *setting;
00357
00358 variable = xode_get_attrib(field, "var");
00359 if (!variable) {
00360 return filledform;
00361 }
00362
00363 setting = xode_get_tagdata(field, "value");
00364
00365 filledform = set_filled_form(filledform, variable, setting);
00366
00367 return filledform;
00368 }
00369
00370 xode display_field_jid_single(xode field, xode filledform, char id)
00371 {
00372
00373 return display_field_text_single(field, filledform, id);
00374 }
00375
00376 xode display_field_jid_multi(xode field, xode filledform, char id)
00377 {
00378
00379 return display_field_text_single(field, filledform, id);
00380 }
00381
00382 xode display_field(xode field, xode filledform, char *id)
00383 {
00384 char *type;
00385
00386 type = xode_get_attrib(field, "type");
00387 if (!type) {
00388 return filledform;
00389 }
00390
00391 if (!strcmp(type, JFORM_FIELD_TEXT_SINGLE)) {
00392 filledform = display_field_text_single(field, filledform, (*id)++);
00393 }
00394 else if (!strcmp(type, JFORM_FIELD_TEXT_PRIVATE)) {
00395 filledform = display_field_text_private(field, filledform, (*id)++);
00396 }
00397 else if (!strcmp(type, JFORM_FIELD_TEXT_MULTI)) {
00398 filledform = display_field_text_multi(field, filledform, (*id)++);
00399 }
00400 else if (!strcmp(type, JFORM_FIELD_LIST_SINGLE)) {
00401 filledform = display_field_list_single(field, filledform, (*id)++);
00402 }
00403 else if (!strcmp(type, JFORM_FIELD_LIST_MULTI)) {
00404 filledform = display_field_list_multi(field, filledform, (*id)++);
00405 }
00406 else if (!strcmp(type, JFORM_FIELD_BOOLEAN)) {
00407 filledform = display_field_boolean(field, filledform, (*id)++);
00408 }
00409 else if (!strcmp(type, JFORM_FIELD_FIXED)) {
00410 filledform = display_field_fixed(field, filledform);
00411 }
00412 else if (!strcmp(type, JFORM_FIELD_HIDDEN)) {
00413 filledform = display_field_hidden(field, filledform);
00414 }
00415 else if (!strcmp(type, JFORM_FIELD_JID_SINGLE)) {
00416 filledform = display_field_jid_single(field, filledform, (*id)++);
00417 }
00418 else if (!strcmp(type, JFORM_FIELD_JID_MULTI)) {
00419 filledform = display_field_jid_multi(field, filledform, (*id)++);
00420 }
00421 else {
00422
00423 filledform = display_field_text_single(field, filledform, (*id)++);
00424 }
00425
00426 return filledform;
00427 }
00428
00429 xode display_nonform_field(xode field, xode filledform, char id)
00430 {
00431 char *var, *setting, *current;
00432
00433 var = xode_get_name(field);
00434 if (!var) {
00435 return filledform;
00436 }
00437
00438 if (!strcmp(var, "key")) {
00439 setting = xode_get_data(field);
00440 filledform = set_filled_form(filledform, var, setting);
00441 }
00442 else {
00443 setting = xode_get_data(field);
00444 current = get_filled_nonform(filledform, var);
00445 if (current) {
00446 setting = current;
00447 }
00448
00449 printf("%c: %-20.20s = %s\n",
00450 id,
00451 var,
00452 setting ? setting : "<not set>");
00453 }
00454
00455 return filledform;
00456 }
00457
00458 xode
00459 display_form(xode form, xode filledform)
00460 {
00461 xode x;
00462 char *type = NULL;
00463 char id = 'A';
00464
00465 x = xode_get_tag(form, "x");
00466 if (x) {
00467 type = xode_get_attrib(x, "type");
00468 }
00469
00470 if (type && !strcmp(type, "form")) {
00471 xode y;
00472 char *title, *instructions;
00473
00474 printf(SEPARATOR);
00475 title = xode_get_tagdata(x, JFORM_TITLE);
00476 if (title) {
00477 printf("%s\n", title);
00478 }
00479
00480 instructions = xode_get_tagdata(x, JFORM_INSTRUCTIONS);
00481 if (instructions) {
00482 printf("Instructions: %s\n", instructions);
00483 }
00484 printf(SEPARATOR);
00485
00486 y = xode_get_firstchild(x);
00487 while (y) {
00488 char *tag;
00489
00490 tag = xode_get_name(y);
00491 if (!tag || strcmp(tag, JFORM_FIELD)) {
00492 y = xode_get_nextsibling(y);
00493 continue;
00494 }
00495
00496 filledform = display_field(y, filledform, &id);
00497
00498 y = xode_get_nextsibling(y);
00499 }
00500 }
00501 else {
00502 xode y;
00503 char *title, *instructions;
00504
00505 printf(SEPARATOR);
00506 title = xode_get_tagdata(form, JFORM_TITLE);
00507 if (title) {
00508 printf("%s\n", title);
00509 }
00510
00511 instructions = xode_get_tagdata(form, JFORM_INSTRUCTIONS);
00512 if (instructions) {
00513 printf("Instructions: %s\n", instructions);
00514 }
00515 printf(SEPARATOR);
00516
00517 y = xode_get_firstchild(form);
00518 while (y) {
00519 char *tag;
00520
00521 tag = xode_get_name(y);
00522 if (!tag
00523 || !strcmp(tag, JFORM_INSTRUCTIONS)
00524 || !strcmp(tag, JFORM_TITLE)
00525 ) {
00526 y = xode_get_nextsibling(y);
00527 continue;
00528 }
00529
00530 filledform = display_nonform_field(y, filledform, id++);
00531
00532 y = xode_get_nextsibling(y);
00533 }
00534 }
00535
00536 return filledform;
00537 }
00538
00539 xode edit_field_text_single(xode field, xode filledform, char *id)
00540 {
00541 char *name, *setting, *desc;
00542 char bfr[256];
00543
00544 name = xode_get_attrib(field, "var");
00545 if (!name) {
00546 return filledform;
00547 }
00548
00549 desc = xode_get_tagdata(field, "desc");
00550
00551 setting = get_filled_form(filledform, name);
00552
00553 printf(SEPARATOR);
00554 printf("%s. %s: %s\n",
00555 id,
00556 name,
00557 setting ? setting : "<not set>");
00558 if (desc) {
00559 printf("%s\n", desc);
00560 }
00561 printf(SEPARATOR);
00562 printf("Enter setting: ");
00563 fflush(stdout);
00564
00565 if (!fgets(bfr, sizeof(bfr), stdin)) {
00566 return filledform;
00567 }
00568
00569 bfr[strlen(bfr) - 1] = '\0';
00570
00571 if (!strcmp(bfr, "")) {
00572 filledform = set_filled_form(filledform, name, NULL);
00573 }
00574 else {
00575 filledform = set_filled_form(filledform, name, bfr);
00576 }
00577
00578 printf("\n");
00579
00580 return filledform;
00581 }
00582
00583 xode edit_field_text_private(xode field, xode filledform, char *id)
00584 {
00585
00586 return edit_field_text_single(field, filledform, id);
00587 }
00588
00589 xode edit_field_text_multi(xode field, xode filledform, char *id)
00590 {
00591
00592 return edit_field_text_single(field, filledform, id);
00593 }
00594
00595 xode edit_field_list_single(xode field, xode filledform, char *id)
00596 {
00597 char *name, *setting, *desc;
00598 char bfr[256];
00599 int maxid, choiceid;
00600
00601 name = xode_get_attrib(field, "var");
00602 if (!name) {
00603 return filledform;
00604 }
00605
00606 desc = xode_get_tagdata(field, "desc");
00607
00608 setting = get_filled_form(filledform, name);
00609
00610 printf(SEPARATOR);
00611 printf("%s. %s: %s\n",
00612 id,
00613 name,
00614 setting ?
00615 ((!strcmp(setting, "1")) ||
00616 (!strcmp(setting, "true")) ||
00617 (!strcmp(setting, "yes")) ? "true" : "false")
00618 : "<not set>");
00619 if (desc) {
00620 printf("%s\n", desc);
00621 }
00622 printf(SEPARATOR);
00623 maxid = show_list_labels(field);
00624 printf(SEPARATOR);
00625 printf("Enter setting: ");
00626 fflush(stdout);
00627
00628 if (!fgets(bfr, sizeof(bfr), stdin)) {
00629 return filledform;
00630 }
00631
00632 bfr[strlen(bfr) - 1] = '\0';
00633 choiceid = atoi(bfr);
00634
00635 if (!strcmp(bfr, "")) {
00636 filledform = set_filled_form(filledform, name, NULL);
00637 }
00638 else if (isdigit(bfr[0]) && (choiceid <= maxid) && (choiceid >= 0)) {
00639 filledform = set_filled_form(filledform, name, bfr);
00640 }
00641 else {
00642 printf("Illegal choice specified.\n");
00643 return edit_field_list_single(field, filledform, id);
00644 }
00645
00646 printf("\n");
00647
00648 return filledform;
00649 }
00650
00651 xode edit_field_list_multi(xode field, xode filledform, char *id)
00652 {
00653
00654 return edit_field_text_single(field, filledform, id);
00655 }
00656
00657 xode edit_field_boolean(xode field, xode filledform, char *id)
00658 {
00659 char *name, *setting, *desc;
00660 char bfr[256];
00661
00662 name = xode_get_attrib(field, "var");
00663 if (!name) {
00664 return filledform;
00665 }
00666
00667 desc = xode_get_tagdata(field, "desc");
00668
00669 setting = get_filled_form(filledform, name);
00670
00671 printf(SEPARATOR);
00672 printf("%s. %s: %s\n",
00673 id,
00674 name,
00675 setting ?
00676 ((!strcmp(setting, "1")) ||
00677 (!strcmp(setting, "true")) ||
00678 (!strcmp(setting, "yes")) ? "true" : "false")
00679 : "<not set>");
00680 if (desc) {
00681 printf("%s\n", desc);
00682 }
00683 printf(SEPARATOR);
00684 printf("0. false\n");
00685 printf("1. true\n");
00686 printf(SEPARATOR);
00687 printf("Enter setting: ");
00688 fflush(stdout);
00689
00690 if (!fgets(bfr, sizeof(bfr), stdin)) {
00691 return filledform;
00692 }
00693
00694 bfr[strlen(bfr) - 1] = '\0';
00695
00696 if (!strcmp(bfr, "")) {
00697 filledform = set_filled_form(filledform, name, NULL);
00698 }
00699 else if (!strcmp(bfr, "0") || !strcmp(bfr, "false") ||
00700 !strcmp(bfr, "no")) {
00701 filledform = set_filled_form(filledform, name, "0");
00702 }
00703 else if (!strcmp(bfr, "1") || !strcmp(bfr, "true") ||
00704 !strcmp(bfr, "yes")) {
00705 filledform = set_filled_form(filledform, name, "1");
00706 }
00707 else {
00708 printf("Illegal setting specified.\n");
00709 return edit_field_boolean(field, filledform, id);
00710 }
00711
00712 printf("\n");
00713
00714 return filledform;
00715 }
00716
00717 xode edit_field_jid_single(xode field, xode filledform, char *id)
00718 {
00719
00720 return edit_field_text_single(field, filledform, id);
00721 }
00722
00723 xode edit_field_jid_multi(xode field, xode filledform, char *id)
00724 {
00725
00726 return edit_field_text_single(field, filledform, id);
00727 }
00728
00729 xode
00730 edit_form_entry(char *id, xode entry, xode filledform)
00731 {
00732 char *type;
00733
00734 type = xode_get_attrib(entry, "type");
00735 if (!type) {
00736 return filledform;
00737 }
00738
00739 if (!strcmp(type, JFORM_FIELD_TEXT_SINGLE)) {
00740 filledform = edit_field_text_single(entry, filledform, id);
00741 }
00742 else if (!strcmp(type, JFORM_FIELD_TEXT_PRIVATE)) {
00743 filledform = edit_field_text_private(entry, filledform, id);
00744 }
00745 else if (!strcmp(type, JFORM_FIELD_TEXT_MULTI)) {
00746 filledform = edit_field_text_multi(entry, filledform, id);
00747 }
00748 else if (!strcmp(type, JFORM_FIELD_LIST_SINGLE)) {
00749 filledform = edit_field_list_single(entry, filledform, id);
00750 }
00751 else if (!strcmp(type, JFORM_FIELD_LIST_MULTI)) {
00752 filledform = edit_field_list_multi(entry, filledform, id);
00753 }
00754 else if (!strcmp(type, JFORM_FIELD_BOOLEAN)) {
00755 filledform = edit_field_boolean(entry, filledform, id);
00756 }
00757 else if (!strcmp(type, JFORM_FIELD_JID_SINGLE)) {
00758 filledform = edit_field_jid_single(entry, filledform, id);
00759 }
00760 else if (!strcmp(type, JFORM_FIELD_JID_MULTI)) {
00761 filledform = edit_field_jid_multi(entry, filledform, id);
00762 }
00763 else {
00764
00765 filledform = edit_field_text_single(entry, filledform, id);
00766 }
00767
00768 return filledform;
00769 }
00770
00771 xode
00772 process_form_choice(char *choice, xode form, xode filledform)
00773 {
00774 xode x, y;
00775 char id = 'A';
00776 char idstr[2];
00777 idstr[1] = '\0';
00778
00779 x = xode_get_firstchild(form);
00780 while (x) {
00781 char *tag;
00782
00783 tag = xode_get_name(x);
00784 if (!tag || strcmp(tag, JFORM_FIELD)) {
00785 x = xode_get_nextsibling(x);
00786 continue;
00787 }
00788
00789 idstr[0] = id++;
00790 if (!strncasecmp(idstr, choice, 1)) {
00791 filledform = edit_form_entry(idstr, x, filledform);
00792 return filledform;
00793 }
00794
00795 x = xode_get_nextsibling(x);
00796 }
00797
00798 return filledform;
00799 }
00800
00801 xode
00802 edit_nonform_entry(char *id, xode entry, xode filledform)
00803 {
00804 char *name, *setting;
00805 char bfr[256];
00806
00807 name = xode_get_name(entry);
00808 if (!name) {
00809 return filledform;
00810 }
00811
00812 setting = get_filled_nonform(filledform, name);
00813
00814 printf(SEPARATOR);
00815 printf("%s. %s: %s\n",
00816 id,
00817 name,
00818 setting ? setting : "<not set>");
00819 printf(SEPARATOR);
00820 printf("Enter setting: ");
00821 fflush(stdout);
00822
00823 if (!fgets(bfr, sizeof(bfr), stdin)) {
00824 return filledform;
00825 }
00826
00827 bfr[strlen(bfr) - 1] = '\0';
00828
00829 if (!strcmp(bfr, "")) {
00830 filledform = set_filled_nonform(filledform, name, NULL);
00831 }
00832 else {
00833 filledform = set_filled_nonform(filledform, name, bfr);
00834 }
00835
00836 printf("\n");
00837
00838 return filledform;
00839 }
00840
00841 xode
00842 process_nonform_choice(char *choice, xode form, xode filledform)
00843 {
00844 xode x;
00845 char id = 'A';
00846 char idstr[2];
00847 idstr[1] = '\0';
00848
00849 x = xode_get_firstchild(form);
00850 while (x) {
00851 char *tag;
00852
00853 tag = xode_get_name(x);
00854 if (!tag
00855 || !strcmp(tag, JFORM_INSTRUCTIONS)
00856 || !strcmp(tag, JFORM_TITLE)
00857 || !strcmp(tag, "key")
00858 ) {
00859 x = xode_get_nextsibling(x);
00860 continue;
00861 }
00862
00863 idstr[0] = id++;
00864 if (!strncasecmp(idstr, choice, 1)) {
00865 filledform = edit_nonform_entry(idstr, x, filledform);
00866 return filledform;
00867 }
00868
00869 x = xode_get_nextsibling(x);
00870 }
00871
00872 return filledform;
00873 }
00874
00875 xode
00876 process_choice(char *choice, xode form, xode filledform)
00877 {
00878 xode x;
00879 char *type;
00880
00881 if (!choice) {
00882 return filledform;
00883 }
00884
00885 x = xode_get_tag(form, "x");
00886 if (x) {
00887 type = xode_get_attrib(x, "type");
00888 }
00889
00890 if (type && !strcmp(type, "form")) {
00891 filledform = process_form_choice(choice, x, filledform);
00892 }
00893 else {
00894 filledform = process_nonform_choice(choice, form, filledform);
00895 }
00896
00897 return filledform;
00898 }
00899
00900 xode
00901 JFormHandler(xode form)
00902 {
00903 xode baseform, filledform, query, x;
00904 char *ns, *type;
00905 char bfr[100];
00906
00907 ns = xode_get_attrib(form, "xmlns");
00908 if (!ns) {
00909 printf("Invalid form returned, no query namespace.\n");
00910 return NULL;
00911 }
00912
00913 baseform = xode_new("query");
00914 xode_put_attrib(baseform, "xmlns", ns);
00915
00916 type = ns = NULL;
00917
00918 x = xode_get_tag(form, "x");
00919 if (x) {
00920 type = xode_get_attrib(x, "type");
00921 }
00922
00923 if (type && !strcmp(type, "form")) {
00924 filledform = xode_insert_tag(baseform, "x");
00925 xode_put_attrib(filledform, "xmlns", NS_DATA);
00926 xode_put_attrib(filledform, "type", "submit");
00927 }
00928 else {
00929 filledform = baseform;
00930 }
00931
00932 for (;;) {
00933 filledform = display_form(form, filledform);
00934 printf("\n");
00935 printf("Enter a letter id to modify, 'submit' to submit, or 'cancel' to cancel.\n");
00936 printf("Command: ");
00937 fflush(stdout);
00938
00939 if (!fgets(bfr, sizeof(bfr), stdin)) {
00940 break;
00941 }
00942
00943 printf("\n");
00944 bfr[strlen(bfr) - 1] = '\0';
00945
00946 if (!strncmp(bfr, "cancel", 6)) {
00947 return NULL;
00948 }
00949 else if (!strncmp(bfr, "submit", 6)) {
00950 break;
00951 }
00952 else if (strlen(bfr) > 1) {
00953 continue;
00954 }
00955 else {
00956 filledform = process_choice(bfr, form, filledform);
00957 }
00958 }
00959
00960 return baseform;
00961 }
00962
00963 void
00964 display_form_results(xode form)
00965 {
00966 xode legend, x, item;
00967 char *title;
00968 int cnt;
00969
00970 title = xode_get_tagdata(form, "title");
00971 printf(SEPARATOR);
00972 if (title) {
00973 printf("%s\n", title);
00974 }
00975 else {
00976 printf("Results\n");
00977 }
00978 printf(SEPARATOR);
00979
00980 legend = xode_new("legend");
00981 x = xode_get_tag(form, "reported");
00982 if (x) {
00983 x = xode_get_firstchild(x);
00984 while (x) {
00985 char *var, *label;
00986
00987 var = xode_get_attrib(x, "var");
00988 label = xode_get_attrib(x, "label");
00989 if (var && label) {
00990 xode tag;
00991
00992 tag = xode_insert_tag(legend, var);
00993 xode_insert_cdata(tag, label, strlen(label));
00994 }
00995 x = xode_get_nextsibling(x);
00996 }
00997 }
00998
00999 cnt = 0;
01000 item = xode_get_tag(form, "item");
01001 while (item) {
01002 xode field;
01003
01004 cnt++;
01005 field = xode_get_tag(item, "field");
01006 while (field) {
01007 char *label, *var, *value;
01008
01009 var = xode_get_attrib(field, "var");
01010 if (!var) {
01011 field = xode_get_nextsibling(field);
01012 continue;
01013 }
01014
01015 label = xode_get_tagdata(legend, var);
01016 value = xode_get_tagdata(field, "value");
01017
01018 printf("%-20.20s = %s\n",
01019 label ? label : var,
01020 value ? value : "");
01021 field = xode_get_nextsibling(field);
01022 }
01023 item = xode_get_nextsibling(item);
01024 printf(SEPARATOR);
01025 }
01026
01027 printf("%d results returned.\n", cnt);
01028 }
01029
01030 void
01031 display_nonform_results(xode form)
01032 {
01033 printf("Non-Form results:\n%s\n", xode_to_prettystr(form));
01034 }
01035
01036 void
01037 JDisplayForm(xode form)
01038 {
01039 xode x;
01040 char *type;
01041
01042 x = xode_get_tag(form, "x");
01043 if (x) {
01044 return display_form_results(x);
01045 }
01046 else {
01047 return display_nonform_results(form);
01048 }
01049 }