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

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.35      frystyk    29: PUBLIC void HTPrompt_setInteractive (BOOL interactive)
2.25      frystyk    30: {
                     31:     HTInteractive = interactive;
                     32: }
                     33: 
2.35      frystyk    34: PUBLIC BOOL HTPrompt_interactive (void)
2.25      frystyk    35: {
                     36:     return HTInteractive;
                     37: }
2.21      frystyk    38: 
2.35      frystyk    39: PUBLIC void HTProgress (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.36      frystyk    47:            TTYPrint(TDEST, "HTProgress.. Bad argument\n");
2.28      frystyk    48:        return;
                     49:     }
                     50:     switch (state) {
                     51:       case HT_PROG_DNS:
2.36      frystyk    52:        TTYPrint(TDEST, "Looking up %s\n", (char *) param);
2.28      frystyk    53:        break;
                     54: 
                     55:       case HT_PROG_CONNECT:
2.36      frystyk    56:        TTYPrint(TDEST, "Contacting host...\n");
2.28      frystyk    57:        break;
                     58: 
2.31      frystyk    59:       case HT_PROG_ACCEPT:
2.36      frystyk    60:        TTYPrint(TDEST, "Waiting for connection...\n");
2.31      frystyk    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.36      frystyk    71:                TTYPrint(TDEST, "Read (%d%% of %s)\n", (int) pro, buf);
2.28      frystyk    72:            } else
2.36      frystyk    73:                TTYPrint(TDEST, "Reading...\n");
2.28      frystyk    74:        }
                     75:        break;
                     76: 
                     77:       case HT_PROG_WRITE:
2.36      frystyk    78:        TTYPrint(TDEST, "Writing...\n");
2.28      frystyk    79:        break;
                     80: 
                     81:       case HT_PROG_DONE:
2.36      frystyk    82:        TTYPrint(TDEST, "Finished\n");
2.28      frystyk    83:        break;
                     84: 
2.30      frystyk    85:       case HT_PROG_WAIT:
2.36      frystyk    86:        TTYPrint(TDEST, "Waiting for free socket...\n");
2.30      frystyk    87:        break;
                     88: 
2.28      frystyk    89:       default:
2.36      frystyk    90:        TTYPrint(TDEST, "UNKNOWN PROGRESS STATE\n");
2.28      frystyk    91:        break;
                     92:     }
2.21      frystyk    93: }
                     94: 
                     95: 
2.35      frystyk    96: PUBLIC void HTAlert (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.36      frystyk   101:     TTYPrint(TDEST, "\nWARNING:  %s\n", Msg ? Msg : "UNKNOWN");
2.6       timbl     102: #endif
1.1       timbl     103: }
                    104: 
2.35      frystyk   105: PUBLIC BOOL HTConfirm (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.36      frystyk   110:   TTYPrint(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.35      frystyk   136: PUBLIC char * HTPrompt (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.36      frystyk   141:     TTYPrint(TDEST, "%s ", Msg ? Msg : "UNKNOWN");
2.20      frystyk   142:     if (deflt)
2.36      frystyk   143:        TTYPrint(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.35      frystyk   163: PUBLIC char * HTPromptPassword (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.35      frystyk   196: PUBLIC void HTPromptUsernameAndPassword (HTRequest *   request,
                    197:                                         CONST char *   Msg,
                    198:                                         char **        username,
                    199:                                         char **        password)
2.11      luotonen  200: {
2.36      frystyk   201:     TTYPrint(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: 
2.37    ! frystyk   207: /*                                                             HTError_print
2.21      frystyk   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: */
2.37    ! frystyk   214: PUBLIC void HTError_print (HTRequest * request, HTList * list)
2.21      frystyk   215: {
2.37    ! frystyk   216:     HTList *cur = list;
        !           217:     HTError *pres;
        !           218:     HTErrorShow showmask = HTError_show();
        !           219:     HTChunk *msg = NULL;
        !           220:     int code;
        !           221:     if (WWWTRACE) TTYPrint(TDEST, "HTError..... Generating message\n");
        !           222:     if (!request || !list) return;
        !           223:     while ((pres = (HTError *) HTList_nextObject(cur))) {
        !           224:        if (HTError_doShow(pres)) {
        !           225:            if (!msg) {
        !           226:                HTSeverity severity = HTError_severity(pres);
        !           227:                msg = HTChunkCreate(128);
        !           228:                if (severity == ERR_WARN)
        !           229:                    HTChunkPuts(msg, "Warning: ");
        !           230:                else if (severity == ERR_NON_FATAL)
        !           231:                    HTChunkPuts(msg, "Non Fatal Error: ");
        !           232:                else if (severity == ERR_FATAL)
        !           233:                    HTChunkPuts(msg, "Fatal Error: ");
        !           234:                else if (severity == ERR_INFO)
        !           235:                    HTChunkPuts(msg, "Information: ");
2.21      frystyk   236:                else {
2.33      frystyk   237:                    if (WWWTRACE)
2.37    ! frystyk   238:                        TTYPrint(TDEST, "HTError..... Unknown Classification of Error (%d)...\n", severity);
        !           239:                    HTChunkFree(msg);
2.21      frystyk   240:                    return;
                    241:                }
2.37    ! frystyk   242:                if ((code = HTError_code(pres)) > 0) {       /* Error number */
        !           243:                    char buf[10];
        !           244:                    sprintf(buf, "%d ", code);
        !           245:                    HTChunkPuts(msg, buf);
2.21      frystyk   246:                }
                    247:            } else
2.37    ! frystyk   248:                HTChunkPuts(msg, "\nReason: ");
        !           249:            HTChunkPuts(msg, HTError_message(pres));        /* Error message */
2.21      frystyk   250: 
2.37    ! frystyk   251:            if (showmask & HT_ERR_SHOW_PARS) {           /* Error parameters */
        !           252:                int length;
        !           253:                int cnt;                
        !           254:                char *pars = (char *) HTError_parameter(pres, &length);
        !           255:                if (length && pars) {
        !           256:                    HTChunkPuts(msg, " (");
        !           257:                    for (cnt=0; cnt<length; cnt++) {
        !           258:                        char ch = *(pars+cnt);
        !           259:                        if (ch < 0x20 || ch >= 0x7F)
        !           260:                            HTChunkPutc(msg, '#');
        !           261:                        else
        !           262:                            HTChunkPutc(msg, ch);
        !           263:                    }
        !           264:                    HTChunkPuts(msg, ") ");
2.21      frystyk   265:                }
                    266:            }
                    267: 
2.37    ! frystyk   268:            if (showmask & HT_ERR_SHOW_LOCATION) {         /* Error Location */
        !           269:                HTChunkPuts(msg, "This occured in ");
        !           270:                HTChunkPuts(msg, HTError_location(pres));
        !           271:                HTChunkPutc(msg, '\n');
2.21      frystyk   272:            }
                    273: 
2.37    ! frystyk   274:            /*
        !           275:            ** Make sure that we don't get this error more than once even
        !           276:            ** if we are keeping the error stack from one request to another
        !           277:            */
        !           278:            HTError_setIgnore(pres);
2.21      frystyk   279:            
2.37    ! frystyk   280:            /* If we only are show the most recent entry then break here */
        !           281:            if (showmask & HT_ERR_SHOW_FIRST)
2.21      frystyk   282:                break;
                    283:        }
                    284:     }
2.37    ! frystyk   285: 
        !           286:     if (msg) {
        !           287:        HTChunkPutc(msg, '\n');
        !           288:        HTAlert(request, HTChunkData(msg));
        !           289:        HTChunkFree(msg);
2.34      frystyk   290:     }
2.21      frystyk   291:     return;
                    292: }

Webmaster