Annotation of libwww/Library/src/HTAlert.c, revision 2.34

2.18      frystyk     1: /*                                                                   HTAlert.c
                      2: **     DISPLAYING MESSAGES AND GETTING INPUT FOR LINEMODE BROWSER
                      3: **
2.23      frystyk     4: **     (c) COPYRIGHT MIT 1995.
2.18      frystyk     5: **     Please first read the full copyright statement in the file COPYRIGH.
1.1       timbl       6: **
                      7: **     REPLACE THIS MODULE with a GUI version in a GUI environment!
                      8: **
                      9: ** History:
                     10: **        Jun 92 Created May 1992 By C.T. Barker
                     11: **        Feb 93 Simplified, portablised TBL
2.8       luotonen   12: **        Sep 93 Corrected 3 bugs in HTConfirm() :-( AL
1.1       timbl      13: */
                     14: 
2.20      frystyk    15: /* Library include files */
2.29      frystyk    16: #include "WWWLib.h"
2.21      frystyk    17: #include "HTError.h"                                    /* Implemented here */
                     18: #include "HTAlert.h"                                    /* Implemented here */
1.1       timbl      19: 
2.28      frystyk    20: typedef struct _HTProgMsg {
                     21:     HTProgressState    state;
                     22:     char *             msg;
                     23: } HTProgMsg;
                     24: 
2.25      frystyk    25: PRIVATE BOOL HTInteractive=YES;                    /* Any prompts from the Library? */
1.1       timbl      26: 
2.21      frystyk    27: /* ------------------------------------------------------------------------- */
2.25      frystyk    28: 
2.26      frystyk    29: PUBLIC void HTPrompt_setInteractive ARGS1(BOOL, interactive)
2.25      frystyk    30: {
                     31:     HTInteractive = interactive;
                     32: }
                     33: 
2.26      frystyk    34: PUBLIC BOOL HTPrompt_interactive NOARGS
2.25      frystyk    35: {
                     36:     return HTInteractive;
                     37: }
2.21      frystyk    38: 
2.28      frystyk    39: PUBLIC void HTProgress ARGS3(HTRequest *, request, HTProgressState, state,
                     40:                             void *, param)
2.21      frystyk    41: {
2.28      frystyk    42:     /* This is just to avoid that we get a lot of progress messages in LMB */
2.33      frystyk    43:     if (!(WWWTRACE)) return;
2.28      frystyk    44: 
2.29      frystyk    45:     if (!request) {
2.33      frystyk    46:        if (WWWTRACE)
2.28      frystyk    47:            fprintf(TDEST, "HTProgress.. Bad argument\n");
                     48:        return;
                     49:     }
                     50:     switch (state) {
                     51:       case HT_PROG_DNS:
                     52:        fprintf(TDEST, "Looking up %s\n", (char *) param);
                     53:        break;
                     54: 
                     55:       case HT_PROG_CONNECT:
                     56:        fprintf(TDEST, "Contacting host...\n");
                     57:        break;
                     58: 
2.31      frystyk    59:       case HT_PROG_ACCEPT:
                     60:        fprintf(TDEST, "Waiting for connection...\n");
                     61:        break;
                     62: 
2.28      frystyk    63:       case HT_PROG_READ:
                     64:        {
2.29      frystyk    65:            long cl = HTAnchor_length(HTRequest_anchor(request));
2.28      frystyk    66:            if (cl > 0) {
2.29      frystyk    67:                long b_read = HTRequest_bytesRead(request);
2.28      frystyk    68:                double pro = (double) b_read/cl*100;
                     69:                char buf[10];
2.32      frystyk    70:                HTNumToStr((unsigned long) cl, buf, 10);
2.28      frystyk    71:                fprintf(TDEST, "Read (%d%% of %s)\n", (int) pro, buf);
                     72:            } else
                     73:                fprintf(TDEST, "Reading...\n");
                     74:        }
                     75:        break;
                     76: 
                     77:       case HT_PROG_WRITE:
                     78:        fprintf(TDEST, "Writing...\n");
                     79:        break;
                     80: 
                     81:       case HT_PROG_DONE:
                     82:        fprintf(TDEST, "Finished\n");
                     83:        break;
                     84: 
2.30      frystyk    85:       case HT_PROG_WAIT:
                     86:        fprintf(TDEST, "Waiting for free socket...\n");
                     87:        break;
                     88: 
2.28      frystyk    89:       default:
                     90:        fprintf(TDEST, "UNKNOWN PROGRESS STATE\n");
                     91:        break;
                     92:     }
2.21      frystyk    93: }
                     94: 
                     95: 
2.27      frystyk    96: PUBLIC void HTAlert ARGS2(HTRequest *, request, CONST char *, Msg)
1.1       timbl      97: {
2.20      frystyk    98: #ifdef NeXTStep
2.6       timbl      99:     NXRunAlertPanel(NULL, "%s", NULL, NULL, NULL, Msg);
                    100: #else
2.21      frystyk   101:     fprintf(TDEST, "\nWARNING:  %s\n", Msg ? Msg : "UNKNOWN");
2.6       timbl     102: #endif
1.1       timbl     103: }
                    104: 
2.27      frystyk   105: PUBLIC BOOL HTConfirm ARGS2(HTRequest *, request, CONST char *, Msg)
1.1       timbl     106: {
2.8       luotonen  107:   char Reply[4];       /* One more for terminating NULL -- AL */
1.1       timbl     108:   char *URep;
                    109:   
2.21      frystyk   110:   fprintf(TDEST, "%s (y/n) ", Msg ? Msg : "UNKNOWN");
2.20      frystyk   111: #ifndef NO_STDIO
2.16      frystyk   112:   if (!HTInteractive || !fgets(Reply, 4, stdin))   /* get reply, max 3 chars */
2.20      frystyk   113: #endif
2.14      frystyk   114:       return NO;
1.1       timbl     115:   URep=Reply;
2.8       luotonen  116:   while (*URep) {
2.9       luotonen  117:     if (*URep == '\n') {
2.10      luotonen  118:        *URep = (char)0;        /* Overwrite newline */
2.9       luotonen  119:        break;
                    120:     }
2.8       luotonen  121:     *URep=TOUPPER(*URep);
                    122:     URep++;    /* This was previously embedded in the TOUPPER */
                    123:                 /* call an it became evaluated twice because   */
                    124:                 /* TOUPPER is a macro -- AL */
                    125:   }
                    126: 
1.1       timbl     127:   if ((strcmp(Reply,"YES")==0) || (strcmp(Reply,"Y")==0))
                    128:     return(YES);
                    129:   else
                    130:     return(NO);
                    131: }
                    132: 
2.20      frystyk   133: /*     Prompt for answer and get text back. Reply text is either NULL on
                    134: **     error or a dynamic string which the caller must free.
1.1       timbl     135: */
2.27      frystyk   136: PUBLIC char * HTPrompt ARGS3(HTRequest *, request, CONST char *, Msg,
                    137:                             CONST char *, deflt)
1.1       timbl     138: {
2.20      frystyk   139:     char buffer[200];
                    140:     char *reply = NULL;
2.24      frystyk   141:     fprintf(TDEST, "%s ", Msg ? Msg : "UNKNOWN");
2.20      frystyk   142:     if (deflt)
2.24      frystyk   143:        fprintf(TDEST, "(RETURN for [%s]) ", deflt);
2.20      frystyk   144: 
                    145:     if (HTInteractive) {
                    146: #ifndef NO_STDIO
                    147:        if (!fgets(buffer, 200, stdin))
                    148:            return NULL;                     /* NULL string on error, Henrik */
                    149:        buffer[strlen(buffer)-1] = '\0';                /* Overwrite newline */
2.24      frystyk   150:        if (*buffer)
                    151:            StrAllocCopy(reply, buffer);
                    152:        else if (deflt)
                    153:            StrAllocCopy(reply, deflt);
2.20      frystyk   154: #endif
                    155:     }
                    156:     return reply;
1.1       timbl     157: }
2.8       luotonen  158: 
                    159: 
2.20      frystyk   160: /*     Prompt for password without echoing the reply. Reply text is
                    161: **     either NULL on error or a dynamic string which the caller must free.
2.8       luotonen  162: */
2.27      frystyk   163: PUBLIC char * HTPromptPassword ARGS2(HTRequest *, request, CONST char *, Msg)
2.8       luotonen  164: {
2.20      frystyk   165:     char *reply = NULL;
                    166:     if (HTInteractive) {
                    167: #ifndef NO_PASSWD
                    168:        char *pw = (char *) getpass(Msg ? Msg : "Password: ");
                    169:        if (pw)
                    170:            StrAllocCopy(reply, pw);
2.19      roeber    171: #endif
2.20      frystyk   172:     }
                    173:     return reply;
2.11      luotonen  174: }
                    175: 
                    176: 
                    177: /*     Prompt both username and password       HTPromptUsernameAndPassword()
                    178: **     ---------------------------------
                    179: ** On entry,
                    180: **     Msg             is the prompting message.
                    181: **     *username and
                    182: **     *password       are char pointers; they are changed
                    183: **                     to point to result strings.
                    184: **
                    185: **                     If *username is not NULL, it is taken
                    186: **                     to point to  a default value.
                    187: **                     Initial value of *password is
                    188: **                     completely discarded.
                    189: **
                    190: ** On exit,
                    191: **     *username and *password point to newly allocated
                    192: **     strings -- original strings pointed to by them
                    193: **     are NOT freed.
                    194: **     
                    195: */
2.27      frystyk   196: PUBLIC void HTPromptUsernameAndPassword ARGS4(HTRequest *,     request,
                    197:                                              CONST char *,     Msg,
2.11      luotonen  198:                                              char **,          username,
                    199:                                              char **,          password)
                    200: {
2.21      frystyk   201:     fprintf(TDEST, "%s\n", Msg ? Msg : "UNKNOWN");
2.27      frystyk   202:     *username = HTPrompt(request, "Username:", *username);
                    203:     *password = HTPromptPassword(request, "Password: ");
2.8       luotonen  204: }
                    205: 
2.21      frystyk   206: 
                    207: /*                                                             HTErrorMsg
                    208: **
                    209: **     Default function that creates an error message using HTAlert() to
                    210: **     put out the contents of the error_stack messages. Furthermore, the
                    211: **     error_info structure contains a name of a help file that might be put
                    212: **     up as a link. This file can then be multi-linguistic.
                    213: **
                    214: **     This function might be overwritten by a smart server or client.
                    215: */
                    216: PUBLIC void HTErrorMsg ARGS1(HTRequest *, request)
                    217: {
2.29      frystyk   218:     HTList *cur = HTRequest_errorStack(request);
2.21      frystyk   219:     BOOL highest = YES;
                    220:     HTChunk *chunk;
                    221:     HTErrorInfo *pres;
                    222: 
                    223:     /* Output messages */
                    224:     chunk = HTChunkCreate(128);
                    225:     while ((pres = (HTErrorInfo *) HTList_nextObject(cur))) {
                    226: 
                    227:        /* Check if we are going to show the message */
                    228:        if ((!pres->ignore || HTErrorShowMask & HT_ERR_SHOW_IGNORE) && 
                    229:            (HTErrorShowMask & pres->severity)) {
                    230: 
                    231:            /* Output code number */
                    232:            if (highest) {                          /* If first time through */
2.33      frystyk   233:                if (WWWTRACE)
2.21      frystyk   234:                    fprintf(TDEST,
                    235:                            "HTError..... Generating message.\n");
                    236:                
                    237:                /* Output title */
                    238:                if (pres->severity == ERR_WARN)
                    239:                    HTChunkPuts(chunk, "Warning ");
                    240:                else if (pres->severity == ERR_NON_FATAL)
                    241:                    HTChunkPuts(chunk, "Non Fatal Error ");
                    242:                else if (pres->severity == ERR_FATAL)
                    243:                    HTChunkPuts(chunk, "Fatal Error ");
                    244:                else if (pres->severity == ERR_INFO)
                    245:                    HTChunkPuts(chunk, "Information ");
                    246:                else {
2.33      frystyk   247:                    if (WWWTRACE)
2.21      frystyk   248:                        fprintf(TDEST, "HTError..... Unknown Classification of Error (%d)...\n", pres->severity);
                    249:                    HTChunkFree(chunk);
                    250:                    return;
                    251:                }
                    252: 
                    253:                /* Only output error code if it is a real HTTP code */
                    254:                if (pres->element < HTERR_HTTP_CODES_END) {
                    255:                    char codestr[10];
                    256:                    sprintf(codestr, "%d ", error_info[pres->element].code);
                    257:                    HTChunkPuts(chunk, codestr);
                    258:                }
                    259:                highest = NO;
                    260:            } else
                    261:                HTChunkPuts(chunk, "\nReason: ");
                    262: 
                    263:            /* Output error message */
                    264:            if (pres->element != HTERR_SYSTEM) {
                    265:                HTChunkPuts(chunk, error_info[pres->element].msg);
                    266:                HTChunkPutc(chunk, ' ');
                    267:            }
                    268: 
                    269:            /* Output parameters */
                    270:            if (pres->par && HTErrorShowMask & HT_ERR_SHOW_PARS) {
                    271:                unsigned int cnt;
                    272:                char ch;
2.22      frystyk   273:                HTChunkPutc(chunk, '(');
2.21      frystyk   274:                for (cnt=0; cnt<pres->par_length; cnt++) {
                    275:                    ch = *((char *)(pres->par)+cnt);
                    276:                    if (ch < 0x20 || ch >= 0x7F)
                    277:                        HTChunkPutc(chunk, '#'); /* Can't print real content */
                    278:                    else
                    279:                        HTChunkPutc(chunk, ch);
                    280:                }
2.22      frystyk   281:                HTChunkPutc(chunk, ')');
2.21      frystyk   282:            }
                    283: 
                    284:            /* Output location */
                    285:            if (pres->where && HTErrorShowMask & HT_ERR_SHOW_LOCATION) {
                    286:                HTChunkPuts(chunk, "This occured in ");
                    287:                HTChunkPuts(chunk, pres->where);
                    288:                HTChunkPutc(chunk, '\n');
                    289:            }
                    290: 
                    291:            /* We don't want the message more than once */
                    292:            HTErrorIgnore(request, pres->handle);
                    293:            
                    294:            /* If we only are going to show the higest entry */
                    295:            if (HTErrorShowMask & HT_ERR_SHOW_FIRST)
                    296:                break;
                    297:        }
                    298:     }
2.34    ! frystyk   299:     if (HTChunkSize(chunk)) {
        !           300:        HTChunkPutc(chunk, '\n');
2.27      frystyk   301:        HTAlert(request, HTChunkData(chunk));
2.34    ! frystyk   302:     }
2.21      frystyk   303:     HTChunkFree(chunk);
                    304:     return;
                    305: }

Webmaster