Annotation of libwww/Library/src/HTAlert.c, revision 2.38
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: }
2.38 ! frystyk 293:
! 294: /* TTYPrint
! 295: ** --------
! 296: ** Single function through which all trace messages must pass - EGP
! 297: */
! 298: #if WWWTRACE_MODE == WWWTRACE_TTY && (!defined(_WINDOWS) || defined(_CONSOLE))
! 299: int TTYPrint(FILE* file, const char* fmt, ...)
! 300: {
! 301: int len;
! 302: char space[513];
! 303: char* pArgs;
! 304:
! 305: pArgs = (char*)(&fmt + 1);
! 306: len = vsprintf(space, (char*)fmt, (char*)pArgs);
! 307: fprintf(file, space);
! 308: return (len);
! 309: }
! 310: /* otherwise handled in www.c with the rest of the window shit */
! 311: #endif
Webmaster