Jabber WindowGram Client (JWGC)

Introduction Screenshots Installation Downloads
Documentation Browse Source Resources Project Site

Stable Version
-none-

Latest Version
beta5



Main Page | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

JForm.c

Go to the documentation of this file.
00001 /* $Id: JForm.c,v 1.7 2004/04/13 18:39:01 jadestorm Exp $ */
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         /* unsupported */
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         /* unsupported */
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         /* unsupported */
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         /* unsupported */
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                 /* We don't know this type, fallback to TEXT_SINGLE */
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         /* unsupported */
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         /* unsupported */
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         /* unsupported */
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         /* unsupported */
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         /* unsupported */
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                 /* Unsupported, punt to text_single */
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 }


Last updated at Tue Dec 18 21:07:42 PST 2007. This site and project hosted by...SourceForge.net Logo
Source Perspective by Fisheye