Article View: vmsnet.sources
Article #137DWProfile V3.3, part 03/06
From: tanner
Date: Mon, 04 Jan 1993 20:47
Date: Mon, 04 Jan 1993 20:47
1408 lines
50329 bytes
50329 bytes
Submitted-by: tanner@cerritos.edu
Posting-number: Volume 4, Issue 28
Archive-name: dwprofile/part03
-+-+-+-+-+-+-+-+ START OF PART 3 -+-+-+-+-+-+-+-+
X ident_dsc.dsc$w_length = strlen(select_ptr->name);
X switch (select_data`5Bselect_index`5D.type) `7B
X case DWP_ALPHA:
X if (select_data`5Bselect_index`5D.code == UAI$_USERNAME) `7B
X matched = (str$match_wild(&ident_dsc, &select_dsc) == STR$_MATCH
V);
X break;
X `7D
X else `7B
X itmlst`5B0`5D.buflen = select_data`5Bselect_index`5D.size;
X itmlst`5B0`5D.itmcode = select_data`5Bselect_index`5D.code;
X itmlst`5B0`5D.bufadr = match_string;
X itmlst`5B0`5D.retadr = 0;
X itmlst`5B1`5D.buflen = 0;
X itmlst`5B1`5D.itmcode = 0;
X status = sys$getuai(0, 0, &ident_dsc, &itmlst, 0, 0, 0);
X if ((status & 7) != SS$_NORMAL) `7B
X sprintf(message, "Username %s does not exist", select_ptr->n
Vame);
X DWPerror("Find", message, resource_data.find_interval);
X break;
X `7D
X match_string`5B8`5D = ' '; /* make sure ' ' */
X match_string`5B9`5D = '\0'; /* make sure null */
X sptr = strchr(match_string, ' ');
X if (sptr) *sptr = '\0';
X match_dsc.dsc$w_length = strlen(match_string);
X matched = (str$match_wild(&match_dsc, &select_dsc) == STR$_MATCH
V);
X break;
X `7D
X case DWP_LALPHA:
X itmlst`5B0`5D.buflen = select_data`5Bselect_index`5D.size;
X itmlst`5B0`5D.itmcode = select_data`5Bselect_index`5D.code;
X itmlst`5B0`5D.bufadr = match_string;
X itmlst`5B0`5D.retadr = &length;
X itmlst`5B1`5D.buflen = 0;
X itmlst`5B1`5D.itmcode = 0;
X status = sys$getuai(0, 0, &ident_dsc, &itmlst, 0, 0, 0);
X if ((status & 7) != SS$_NORMAL) `7B
X sprintf(message, "Username %s does not exist", select_ptr->name)
V;
X DWPerror("Find", message, resource_data.find_interval);
X break;
X `7D
X match_string`5Blength`5D = ' '; /* make sure ' ' */
X match_string`5Blength+1`5D = '\0'; /* make sure null */
X strcpy(match_string, unpad(match_string)); /* get rid of length byt
Ve */
X match_dsc.dsc$w_length = strlen(match_string);
X matched = (str$match_wild(&match_dsc, &select_dsc) == STR$_MATCH);
X break;
X case DWP_UIC:
X itmlst`5B0`5D.buflen = select_data`5Bselect_index`5D.size;
X itmlst`5B0`5D.itmcode = select_data`5Bselect_index`5D.code;
X itmlst`5B0`5D.bufadr = &uic;
X itmlst`5B0`5D.retadr = &length;
X itmlst`5B1`5D.buflen = 0;
X itmlst`5B1`5D.itmcode = 0;
X status = sys$getuai(0, 0, &ident_dsc, &itmlst, 0, 0, 0);
X if ((status & 7) != SS$_NORMAL) `7B
X sprintf(message, "Username %s does not exist", select_ptr->name)
V;
X DWPerror("Find", message, resource_data.find_interval);
X break;
X `7D
X /* convert UIC to text and do text wildcard match */
X sprintf(match_string, "`5B%o,%o`5D", uic >> 16, uic & 0xFFFF);
X match_dsc.dsc$w_length = strlen(match_string);
X matched = (str$match_wild(&match_dsc, &select_dsc) == STR$_MATCH);
X break;
X case DWP_DATE:
X itmlst`5B0`5D.buflen = select_data`5Bselect_index`5D.size;
X itmlst`5B0`5D.itmcode = select_data`5Bselect_index`5D.code;
X itmlst`5B0`5D.bufadr = match_string;
X itmlst`5B0`5D.retadr = 0;
X itmlst`5B1`5D.buflen = 0;
X itmlst`5B1`5D.itmcode = 0;
X status = sys$getuai(0, 0, &ident_dsc, &itmlst, 0, 0, 0);
X if ((status & 7) != SS$_NORMAL) `7B
X sprintf(message, "Username %s does not exist", select_ptr->name)
V;
X DWPerror("Find", message, resource_data.find_interval);
X break;
X `7D
X matched = (!memcmp(match_string, select_string,
X select_data`5Bselect_index`5D.size));
X break;
X case DWP_RINT:
X /* special test - the only test of a RINT is logfails > 0 */
X itmlst`5B0`5D.buflen = select_data`5Bselect_index`5D.size;
X itmlst`5B0`5D.itmcode = select_data`5Bselect_index`5D.code;
X itmlst`5B0`5D.bufadr = &logfails;
X itmlst`5B0`5D.retadr = &length;
X itmlst`5B1`5D.buflen = 0;
X itmlst`5B1`5D.itmcode = 0;
X status = sys$getuai(0, 0, &ident_dsc, &itmlst, 0, 0, 0);
X if ((status & 7) != SS$_NORMAL) `7B
X sprintf(message, "Username %s does not exist", select_ptr->name)
V;
X DWPerror("Find", message, resource_data.find_interval);
X break;
X `7D
X matched = logfails;
X break;
X `7D
X if (matched) `7B
X if (found_add)
X found_add = found_add->next = XtNew(ident);
X else
X found_add = found_list.next = XtNew(ident);
X found_add->name = XtNewString(select_ptr->name);
X found_add->next = NULL;
X `7D
X if (select_ptr = select_ptr->next)
X return FALSE;
X else `7B
X if (!found_ptr->next) `7B /* no more to display */
X XtSetSensitive(button_array`5Bfind_button`5D, OFF); /* 'find' b
Vutton is inactive */
X XtSetSensitive(button_array`5Bfind_menu`5D, OFF);
X `7D
X progress(NULL);
X find_work_proc_id = (XtWorkProcId) 0;
X return TRUE;
X `7D
X`7D
X
X
X/*
X * Parse textual date to 64 bit binary value`20
X * Returns false if illegal date
X */
X
Xstatic Boolean parse_date(Cardinal value)
X`7B
X Cardinal status, count = 0;
X String str;
X $DESCRIPTOR(time_dsc, uafdata`5Bvalue`5D.sdata);
X
X if (!strlen(uafdata`5Bvalue`5D.sdata)) `7B /* empty date means (none) */
X memset(uafdata`5Bvalue`5D.sdata, 0, 8); /* make date 'none' */
X return TRUE;
X `7D
X /* default expiration date to midnight instead of current time */
X for (str = uafdata`5Bvalue`5D.sdata; str;) `7B
X if((str = strchr(str, ':')) == NULL)
X break; /* no more colons */
X count++; /* count the colons in date */
X str++; /* skip over the colon we just counted */
X `7D
X if (count < 1) /* no hh:mm:ss.cc */
X strcat(uafdata`5Bvalue`5D.sdata, " 00:00:00.00");
X else if (count < 2) /* no ss.cc */
X strcat(uafdata`5Bvalue`5D.sdata, ":00.00");
X time_dsc.dsc$w_length = strlen(uafdata`5Bvalue`5D.sdata);
X status = sys$bintim(&time_dsc, &uafdata`5Bvalue`5D.sdata);
X /* .sdata will now contain the 64-bit system time */
X return (status == SS$_NORMAL);
X`7D
X
X
X/*
X * Parse textual UIC to binary value`20
X * Returns false if illegal UIC format
X */
X
Xstatic Boolean parse_uic(int code)
X`7B
X Cardinal status, grp = 0, mem = 0;
X
X status = sscanf(uafdata`5Bcode`5D.sdata, "`5B%o,%o`5D", &grp, &mem);
X if (status != 2) /* try without `5B`5D */
X status = sscanf(uafdata`5Bcode`5D.sdata, "%o,%o", &grp, &mem);
X uafdata`5BUAI$_UIC`5D.idata = (grp << 16) + mem;
X return (status == 2);
X`7D
X
X
X/*
X * Build the list of accounts for accounts_box
X */
X
Xstatic void build_accounts()
X`7B
X ident *ptr;
X XmString *items;
X Widget list;
X Cardinal ind;
X
X if (!accounts_box `7C`7C !XtIsManaged(accounts_box))
X return; /* box isn't there */
X
X list = XmSelectionBoxGetChild(accounts_box, XmDIALOG_LIST);
X XmListDeleteAllItems(list);
X items = (XmString *)XtCalloc(account_count, sizeof(XmString));
X for (ptr = ident_list, ind = 0; ptr; ptr = ptr->next)
X if (ptr->status == account)
X items`5Bind++`5D = XmStringCreateSimple(ptr->name);
X XmListAddItems(list, items, ind, 0);
X for (ind = 0; ind < account_count; ind++)
X XmStringFree(items`5Bind`5D);
X XtFree(items);
X`7D
X
X
X/*
X * Show the progress of 'Find Next'
X */
X
Xstatic void progress(ident *location)
X`7B
X static Widget progress_box = NULL;
X XmString xmstr;
X char str`5B80`5D;
X Cardinal ac, count, pct;
X static int old_pct = -1;
X Arg arglist`5B10`5D;
X ident *ptr;
X Display *display;
X Window window;
X
X if (progress_id) `7B
X XtRemoveTimeOut(progress_id); /* clear out any old timers */
X progress_id = (XtIntervalId) 0;
X `7D
X
X if (!location) `7B /* location = null means pop down box */
X if (progress_box && XtIsManaged(progress_box))
X XtUnmanageChild(progress_box);
X return;
X `7D
X
X if (!progress_box) `7B
X ac = 0;
X xmstr = XmStringCreateSimple("DWProfile: Find progress");
X XtSetArg(arglist`5Bac`5D, XmNheight, 112); ac++;
X XtSetArg(arglist`5Bac`5D, XmNwidth, 224); ac++;
X XtSetArg(arglist`5Bac`5D, XmNresizePolicy, XmRESIZE_NONE); ac++;
X XtSetArg(arglist`5Bac`5D, XmNdialogTitle, xmstr); ac++;
X progress_box = XmCreateWorkingDialog(dwprofile_main, "progress_box",
V arglist, ac);
X XmStringFree(xmstr);
X XtUnmanageChild(XmMessageBoxGetChild(progress_box, XmDIALOG_OK_BUTTO
VN));
X XtUnmanageChild(XmMessageBoxGetChild(progress_box, XmDIALOG_HELP_BUT
VTON));
X XtAddCallback(progress_box, XmNcancelCallback, FindCancelCallback, N
VULL);
X `7D
X
X if (!XtIsManaged(progress_box))
X XtManageChild(progress_box); /* pop up progress box */
X
X if (location->next) `7B
X for (ptr = ident_list, count = 0; ptr != location; ptr = ptr->next)
X if (ptr->status == uic_ident)
X count++; /* count idents read so far */
X pct = (count * 100) / uic_count; /* idents read as a percent */
X if (pct != old_pct) `7B
X old_pct = pct;
X sprintf(str, "%d%% of identifiers searched", pct);
X xmstr = XmStringCreateSimple(str);
X ac = 0;
X XtSetArg(arglist`5Bac`5D, XmNmessageString, xmstr); ac++;
X XtSetValues(progress_box, arglist, ac);
X XmStringFree(xmstr);
X `7D
X /* leave this dialog box up, call Find in 1 second */
X progress_id = XtAppAddTimeOut(context, 1000, Find, NULL);
X
X `7D
X else /* this is the last item, pop down the box */
X XtUnmanageChild(progress_box);
X`7D
X
X
X
X/*** Event Handlers ***/
X
X/*
X * Called by mouse button and exposure events in access windows
X */
X
Xstatic XtEventHandler access_handler(Widget w, XtPointer data,
X XButtonEvent *event, Boolean *dispatch)
X`7B
X Cardinal wi, hour;
X static Boolean mode;
X
X /* find the uai code for this event */
X for (wi = UAI$_NETWORK_ACCESS_P;
X widget_array`5Bwi`5D != w && wi <= UAI$_REMOTE_ACCESS_S; wi++)
X /* just calc index */ ;
X
X switch (event->type) `7B
X case Expose :
X update_time(wi); /* update the exposed window */
X break;
X case ButtonPress :
X uafdata`5Bwi`5D.changed = TRUE;
X hour = event->x / resource_data.hour_size;
X mode = uafdata`5Bwi`5D.idata >> hour & 1 `5E 1; /* flip current *
V/
X case MotionNotify: /* common code for ButtonPress, Motion */
X hour = event->x / resource_data.hour_size;
X XFillRectangle(event->display, event->window,
X mode ? gc_clear : gc_draw,
X hour * resource_data.hour_size, 0,
X resource_data.hour_size, k_hours_height);
X if (mode)
X uafdata`5Bwi`5D.idata `7C= 1 << hour;
X else
X uafdata`5Bwi`5D.idata &= `7E(1 << hour);
X break;
X `7D
X`7D
X
X
X/*
X * Called by event handler on MB3 push
X */
X
Xstatic XtEventHandler popup_handler(Widget widget, Widget popup_menu,
X XButtonPressedEvent *event, Boolean *dis
Vpatch)
X`7B
X if (event->button != Button3)
X return;
X XmMenuPosition(popup_menu, event); /* position popup menu */
X XtManageChild(popup_menu); /* manage it */
X`7D
X
X
X/*
X * Called when a return is pressed in a text widget
X */
X
Xstatic XtActionProc return_key(Widget widget, XKeyPressedEvent *event, `2
V0
X String *str, Cardinal *args)
X`7B
X if (widget == widget_array`5BUAI$_USERNAME`5D)
X Read(NULL, NULL, NULL); /* read new username */
X else if (widget == widget_array`5BUAI$_ACCOUNT`5D) `7B
X calc_uic(); /* figure out a new uic */
X trans_uic(uafdata`5BUAI$_UIC`5D.idata); /* in case calc_uic didn't *
V/
X `7D
X`7D
X
X
X/*
X * Select menu shortcut
X * Set up select_data index for call to Select()
X */
X
Xstatic XtActionProc select_key(Widget widget, XKeyPressedEvent *event, `2
V0
X String *str, Cardinal *args)
X`7B
X Cardinal wi, si;
X
X /* find the widget_array index */
X for(wi = 0; items`5Bwi`5D.code; wi++)
X if (widget == widget_array`5Bwi`5D)
X break;
X /* find the select_data index */
X for(si = 0; select_data`5Bsi`5D.code; si++)
X if (wi == select_data`5Bsi`5D.code)
X break;
X /* call Select() with the index */
X if (select_data`5Bsi`5D.code)
X Select(NULL, &si, NULL);
X`7D
X
X
X
X/*** Callbacks ***/
X
X/*
X * Called by 'Quit' menu item
X */
X
Xstatic XtCallbackProc Quit(Widget widget, XtPointer data, `20
X XmPushButtonCallbackStruct *reason)
X`7B
X exit();
X`7D
X
X
X/*
X * Read in the uaf entry specified by username; if error, load DEFAULT
X * Called by 'Read' menu or return_key from username text widget
X */
X
Xstatic XtCallbackProc Read(Widget widget, XtPointer data,
X XmPushButtonCallbackStruct *reason)
X`7B
X String str;
X
X XDefineCursor(top_display, top_window, wait_cursor);
X XFlush(top_display);
X str = XmTextGetString(widget_array`5BUAI$_USERNAME`5D);
X if (!get_record(str)) `7B
X if (get_record("DEFAULT")) `7B
X set_defaults(str);
X DWPerror("Read", "Username does not exist, defaults applied",
X resource_data.read_interval);
X `7D
X else
X DWPerror("Read", "Cannot read username DEFAULT", 0);
X `7D
X XtFree(str);
X XUndefineCursor(top_display, top_window);
X`7D
X
X
X/*
X * Find the next UAF entry that matches the current criteria
X *
X * Note: UAF entry is defined as a UIC-type identifier.
X * If a UAF entry does not have an identifier of the same
X * name, it will not be searched.
X *
X * Called by 'Find' menu item
X */
X
Xstatic XtCallbackProc Find(Widget widget, XtPointer data,
X XmPushButtonCallbackStruct *reason)
X`7B
X
X /* if nothing found yet and still looking, mark time */
X if (!found_ptr->next && find_work_proc_id) `7B
X progress(select_ptr);
X return;
X `7D
X
X#ifdef DEBUG
X if (!XtIsSensitive(button_array`5Bfind_button`5D)) `7B /* stray timer c
Vallback */
X printf("Find() callback with button insensitive\n");
X return;
X `7D
X#endif
X
X progress(NULL); /* something is found or search done, get rid of progre
Vss box */
X
X /* get next found ident and display it */
X if (found_ptr->next) `7B
X found_ptr = found_ptr->next;
X get_record(found_ptr->name);
X if (!found_ptr->next && !find_work_proc_id) `7B /* last item
V on found list? */
X XtSetSensitive(button_array`5Bfind_button`5D, OFF);
X XtSetSensitive(button_array`5Bfind_menu`5D, OFF);
X `7D
X `7D
X /* we get here when something allows a Find Next with nothing to get */
X else `7B
X#ifdef DEBUG
X printf("This shouldn't happen, tell me\n");
X#endif
X XtSetSensitive(button_array`5Bfind_button`5D, OFF); /* turn off but
Vton */
X XtSetSensitive(button_array`5Bfind_menu`5D, OFF);
X `7D
X`7D
X
X
X/*
X * Update the UAF record for 'username'
X * Called by 'Write' menu item
X */
X
Xstatic XtCallbackProc Write(Widget widget, XtPointer data,
X XmPushButtonCallbackStruct *reason)
X`7B
X Cardinal ind, pad, item, value, status, dd, hh, mm, ss, cc,
X holder`5B2`5D = `7B0, 0`7D;
X ident *ptr, *prev, *next;
X held_ident *hptr, *prev_hptr, *tmp_hptr;
X char command`5B200`5D = "", temp`5B100`5D;
X $DESCRIPTOR(acct_dsc, uafdata`5BUAI$_USERNAME`5D.sdata);
X
X XDefineCursor(top_display, top_window, wait_cursor);
X XFlush(top_display);
X
X /* make sure uafdata`5Buai$_uic`5D.idata matches the text */
X if (!parse_uic(UAI$_UIC)) /* if not good uic */
X uafdata`5BUAI$_UIC`5D.idata = 0; /* force error */
X `20
X if (!strlen(uafdata`5BUAI$_OWNER`5D.sdata) `7C`7C
X !strncmp(uafdata`5BUAI$_ACCOUNT`5D.sdata, "DEFAULT", 7) `7C`7C
X !strncmp(uafdata`5BUAI$_DEFDIR`5D.sdata, "`5BUSER`5D", 6) `7C`7C
X !strlen(unpad(uafdata`5BUAI$_DEFDEV`5D.sdata)) `7C`7C
X !strlen(unpad(uafdata`5BUAI$_DEFDIR`5D.sdata)) `7C`7C
X !uafdata`5BUAI$_UIC`5D.idata) `7B
X DWPerror("Write","Bad Owner, Account, UIC or Directory name", 0)
V;
X XUndefineCursor(top_display, top_window);
X return;
X `7D
X /* item code UAI$_USERNAME is never used by sys$setuai */
X if (uafdata`5BUAI$_USERNAME`5D.changed) `7B
X if (uafdata`5BUAI$_USERNAME`5D.sdata`5B0`5D &&
X uafdata`5BUAI$_UIC`5D.idata) `7B /* create a new user */
X sprintf(temp, "$ UAF ADD %s/UIC=%s", uafdata`5BUAI$_USERNAME`5D.
Vsdata,
X uafdata`5BUAI$_UIC`5D.sdata);
X strcpy(command, temp);
X uafdata`5BUAI$_USERNAME`5D.changed = FALSE;
X uafdata`5BUAI$_UIC`5D.changed = FALSE;
X if (uafdata`5BUAI$_ACCOUNT`5D.sdata`5B0`5D) `7B
X sprintf(temp, "/ACCOUNT=%s", uafdata`5BUAI$_ACCOUNT`5D.sdata
V);
X strcat(command, temp);
X uafdata`5BUAI$_ACCOUNT`5D.changed = FALSE;
X `7D
X if (uafdata`5BUAI$_PWD`5D.sdata`5B0`5D) `7B
X sprintf(temp, "/PASSWORD=%s", uafdata`5BUAI$_PWD`5D.sdata);
X strcat(command, temp);
X uafdata`5BUAI$_PWD`5D.changed = FALSE;
X `7D
X spawn_dcl(command);
X `7D
X else `7B
X DWPerror("Write","No username or no UIC", 0);
X XUndefineCursor(top_display, top_window);
X return;
X `7D
X `7D
X else `7B
X /* check for password change; is setuai able to do this now? */
X if (uafdata`5BUAI$_PWD`5D.changed &&
X uafdata`5BUAI$_USERNAME`5D.sdata`5B0`5D &&
X uafdata`5BUAI$_PWD`5D.sdata`5B0`5D) `7B
X sprintf(temp, "$ UAF MODIFY %s/PASSWORD=%s\n",
X uafdata`5BUAI$_USERNAME`5D.sdata, uafdata`5BUAI$_PWD`5D.
Vsdata);
X strcat(command, temp);
X uafdata`5BUAI$_PWD`5D.changed = FALSE;
X `7D
X /* check for device/directory change; the directory tree needs to be
V moved */
X if ((uafdata`5BUAI$_DEFDEV`5D.changed && strlen(uafdata`5BUAI$_DEFDE
VV`5D.sdata))
X `7C`7C (uafdata`5BUAI$_DEFDIR`5D.changed && strlen(uafdata`5BUAI
V$_DEFDIR`5D.sdata))) `7B
X sprintf(temp, "$ @DWPUID:MOVE_DIRECTORY %s %s %s %s\n",
X unpad(uafdata`5BUAI$_DEFDEV`5D.odata),
X unpad(uafdata`5BUAI$_DEFDIR`5D.odata),
X unpad(uafdata`5BUAI$_DEFDEV`5D.sdata),
X unpad(uafdata`5BUAI$_DEFDIR`5D.sdata));
X strcat(command, temp);
X /* update the old values */
X strcpy(uafdata`5BUAI$_DEFDEV`5D.odata, unpad(uafdata`5BUAI$_DEFD
VEV`5D.sdata));
X strcpy(uafdata`5BUAI$_DEFDIR`5D.odata, unpad(uafdata`5BUAI$_DEFD
VIR`5D.sdata));
X `7D
X /* check for UIC change; old identifier must be deleted, new ident
V created */
X /* let authorize handle it. new UIC will be added to idents list be
Vlow */
X if (uafdata`5BUAI$_UIC`5D.changed &&
X uafdata`5BUAI$_UIC`5D.idata) `7B
X sprintf(temp, "$ UAF MODIFY %s/UIC=%s\n",
X uafdata`5BUAI$_USERNAME`5D.sdata, uafdata`5BUAI$_UIC`5D.
Vsdata);
X strcat(command, temp);
X uafdata`5BUAI$_UIC`5D.changed = FALSE;
X sprintf(temp, "$ @DWPUID:RESETOWNER %s%s %s\n",
X unpad(uafdata`5BUAI$_DEFDEV`5D.sdata),
X unpad(uafdata`5BUAI$_DEFDIR`5D.sdata),
X uafdata`5BUAI$_USERNAME`5D.sdata);
X strcat(command, temp);
X `7D
X /* any of these generated a DCL command? */
X if (strlen(command))
X spawn_dcl(command);
X `7D
X item = 0;
X for (ind = 0; value = items`5Bind`5D.code; ind++) `7B
X if (value && uafdata`5Bvalue`5D.changed) `7B
X uafdata`5Bvalue`5D.changed = FALSE;
X itmlst`5Bitem`5D.itmcode = value;
X itmlst`5Bitem`5D.buflen = items`5Bind`5D.size;
X switch (items`5Bind`5D.type) `7B
X case DWP_LALPHA: /* if it's been changed, it has no length byte
V */
X if (value == UAI$_DEFDIR && strlen(uafdata`5Bvalue`5D.sdata)
V) `7B
X if (uafdata`5Bvalue`5D.sdata`5B0`5D != '`5B') `7B
X sprintf(temp, "`5B%s", uafdata`5Bvalue`5D.sdata);
X strcpy(uafdata`5Bvalue`5D.sdata, temp);
X `7D
X if (uafdata`5Bvalue`5D.sdata`5Bstrlen(uafdata`5Bvalue`5D
V.sdata)-1`5D
X != '`5D')
X strcat(uafdata`5Bvalue`5D.sdata, "`5D"); /* dir h
Vas `5B`5D */
X `7D
X if (value == UAI$_DEFDEV &&
X strlen(uafdata`5Bvalue`5D.sdata) &&
X uafdata`5Bvalue`5D.sdata`5Bstrlen(uafdata`5Bvalue`5D
V.sdata)-1`5D
X != ':')
X strcat(uafdata`5Bvalue`5D.sdata, ":"); /* ends with '
V:' */
X strcpy(temp, uafdata`5Bvalue`5D.sdata);
X uafdata`5Bvalue`5D.sdata`5B0`5D = strlen(temp); /* make le
Vngth byte */
X for (pad = strlen(temp); pad < items`5Bind`5D.size; pad++)
X temp`5Bpad`5D = ' '; /* pad with spaces, no null */
X strncpy(&uafdata`5Bvalue`5D.sdata`5B1`5D, temp, items`5Bind`
V5D.size);
X itmlst`5Bitem`5D.bufadr = uafdata`5Bvalue`5D.sdata;
X break;
X case DWP_ALPHA: /* account */
X for (pad = 0; pad < items`5Bind`5D.size && uafdata`5Bvalue`5
VD.sdata`5Bpad`5D;)
X pad++; /* skip over string */
X for (; pad < items`5Bind`5D.size; pad++)
X uafdata`5Bvalue`5D.sdata`5Bpad`5D = ' '; /* pad with spa
Vces, no null */
X case DWP_PRIV: /* common code for all alphabetic, priv */
X itmlst`5Bitem`5D.bufadr = uafdata`5Bvalue`5D.sdata;
X break;
X case DWP_INT:
X sscanf(uafdata`5Bvalue`5D.sdata, "%d", &uafdata`5Bvalue`5D.i
Vdata);
X case DWP_TIME: /* these have correct data in .idata */
X case DWP_FLAG:
X case DWP_PRIME:
X itmlst`5Bitem`5D.bufadr = &uafdata`5Bvalue`5D.idata;
X break;
X case DWP_CPU:
X dd = hh = mm = ss = cc = 0;
X status = sscanf(uafdata`5Bvalue`5D.sdata, "%d %02d:%02d:%02d
V.%02d",
X &dd, &hh, &mm, &ss, &c
Vc);
X if (status < 4) `7B /* try hh:mm:ss */
X dd = hh = mm = ss = cc = 0;
X status = sscanf(uafdata`5Bvalue`5D.sdata, "%02d:%02d:%02
Vd.%02d",
X &hh, &mm, &ss, &
Vcc);
X `7D
X if (status < 3) `7B /* try mm:ss */
X dd = hh = mm = ss = cc = 0;
X status = sscanf(uafdata`5Bvalue`5D.sdata, "%02d:%02d.%02
Vd",
X &mm, &ss, &cc);
X `7D
X if (status < 2) `7B /* try ss */
X dd = hh = mm = ss = cc = 0;
X status = sscanf(uafdata`5Bvalue`5D.sdata, "%d.%02d",
X &ss, &cc);
X `7D
X uafdata`5Bvalue`5D.idata = dd * 8640000 + hh * 360000 +
X mm * 6000 + ss * 100 + cc;
X itmlst`5Bitem`5D.bufadr = &uafdata`5Bvalue`5D.idata;
X break;
X case DWP_DATE: `7B
X /* This one's kinda tricky, .sdata can contain a 64-bit */
X /* system time or a string. At this point it should contain
V */
X /* a string, since .changed is set only in WidgetChanged */
X if (parse_date(value))
X itmlst`5Bitem`5D.bufadr = &uafdata`5Bvalue`5D.sdata;
X else `7B
X DWPerror("Write","Illegal date format", 0);
X --item;
X `7D
X break;
X `7D
X case DWP_UIC:
X itmlst`5Bitem`5D.bufadr = &uafdata`5Bvalue`5D.idata;
X break;
X `7D
X itmlst`5Bitem`5D.retadr = 0;
X item++;
X `7D
X `7D
X itmlst`5Bitem`5D.itmcode = itmlst`5Bitem`5D.buflen = 0; /* end the li
Vst */
X acct_dsc.dsc$w_length = strlen(uafdata`5BUAI$_USERNAME`5D.sdata);
X if (item) `7B
X status = sys$setuai(0, 0, &acct_dsc, &itmlst, 0, 0, 0);
V `20
X if (status != SS$_NORMAL)
X DWPmsg("Write/SETUAI", status);
X else
X DWPerror("Write", "SETUAI successful", resource_data.write_inter
Vval);
X `7D
X update_strings(); /* undo the padding of strings done above */
X
X holder`5B0`5D = uafdata`5BUAI$_UIC`5D.idata;
X for (hptr = held_list, prev_hptr = NULL; hptr;) `7B
X tmp_hptr = NULL;
X switch (hptr->status) `7B
X case add_ident: /* ident flagged for pending add */
X status = sys$add_holder(hptr->identifier, &holder, 0);
X if (status != SS$_NORMAL)
X DWPmsg("Write/ADD_HOLDER", status);
X else
X DWPerror("Write","ADD_HOLDER successful", resource_data.writ
Ve_interval);
X hptr->status = original; /* ident is now permanently held */
X break;
X case del_orig: /* ident flagged for pending delete */
X status = sys$rem_holder(hptr->identifier, &holder);
X if (status != SS$_NORMAL)
X DWPmsg("Write/REM_HOLDER", status);
X else
X DWPerror("Write","REM_HOLDER successful", resource_data.writ
Ve_interval);
X if (prev_hptr)
X prev_hptr->next = hptr->next; /* remove node from list */
X else
X held_list = hptr->next;
X tmp_hptr = hptr;
X break;
X case original: /* originally held id, no need to add it again */
X break;
X `7D
X prev_hptr = hptr;
X hptr = hptr->next;
X if (tmp_hptr)
X XtFree(tmp_hptr);
X `7D
X
X /* add identifier to list */
X for (ptr = ident_list, prev = NULL; ptr; prev = ptr, ptr = ptr->next
V)
X if (strcmp(ptr->name, uafdata`5BUAI$_USERNAME`5D.sdata) >= 0) br
Veak;
X /* if ptr = 0, no identifier was higher than username
X if strcmp > 0, ptr->name is the next higher name
X if strcmp = 0, names matched; don't insert
X */
X if (!ptr `7C`7C strcmp(ptr->name, uafdata`5BUAI$_USERNAME`5D.sdata))
V `7B
X next = ptr;
X ptr = XtNew(ident);
X if (prev)
X prev->next = ptr;
X else
X ident_list = ptr;
X ptr->name = XtNewString(uafdata`5BUAI$_USERNAME`5D.sdata);
X ptr->next = next;
X ptr->identifier = uafdata`5BUAI$_UIC`5D.idata;
X ptr->status = uic_ident;
X uic_count++;
X `7D
X /* add group identifier to list */
X for (ptr = ident_list, prev = NULL; ptr; prev = ptr, ptr = ptr->next
V)`20
X if (strcmp(ptr->name, uafdata`5BUAI$_ACCOUNT`5D.sdata) >= 0) bre
Vak;
X if (!ptr `7C`7C strcmp(ptr->name, uafdata`5BUAI$_ACCOUNT`5D.sdata))
V `7B
X next = ptr;
X ptr = XtNew(ident);
X if (prev)
X prev->next = ptr;
X else
X ident_list = ptr;
X ptr->name = XtNewString(uafdata`5BUAI$_ACCOUNT`5D.sdata);
X ptr->next = next;
X ptr->identifier = (uafdata`5BUAI$_UIC`5D.idata `7C 0xFFFF);
X ptr->status = account;
X account_count++;
X if (accounts_box && XtIsManaged(accounts_box)) `7B
X build_accounts(); /* reload accounts info */
X `7D
X `7D
X
X XUndefineCursor(top_display, top_window);
X`7D
X
X
X/*
X * Delete a UAF record
X * Called by 'Remove' menu item
X */
X
Xstatic XtCallbackProc Remove(Widget widget, XtPointer data,
X XmPushButtonCallbackStruct *reason)
X`7B
X Cardinal ac;
X Arg arglist`5B5`5D;
X char msg`5B30`5D;
X XmString xmstr;
X String str;
X static Widget caution_box = NULL;
X
X str = XmTextGetString(widget_array`5BUAI$_USERNAME`5D);
X strcpy(msg, str);
X XtFree(str);
X if (!get_record(msg)) `7B
X sprintf(msg, "User %s doesn't exist", uafdata`5BUAI$_USERNAME`5D.sda
Vta);
X DWPerror("Remove", msg, 0);
X return;
X `7D
X if (!caution_box) `7B
X ac = 0;
X xmstr = XmStringCreateSimple("DWProfile: Remove");
X XtSetArg(arglist`5Bac`5D, XmNdialogTitle, xmstr); ac++;
X XtSetArg(arglist`5Bac`5D, XmNdialogStyle, XmDIALOG_APPLICATION_MODAL
V); ac++;
X caution_box = XmCreateWarningDialog(dwprofile_main, "caution_box", a
Vrglist, ac);
X XmStringFree(xmstr);
X XtUnmanageChild(XmMessageBoxGetChild(caution_box, XmDIALOG_HELP_BUTT
VON));
X XtAddCallback(caution_box, XmNokCallback, CautionCallback, NULL);
X `7D
X ac = 0;
X sprintf(msg, "Remove user %s?", uafdata`5BUAI$_USERNAME`5D.sdata);
X xmstr = XmStringCreateSimple(msg);
X XtSetArg(arglist`5Bac`5D, XmNmessageString, xmstr); ac++;
X XtSetValues(caution_box, arglist, ac);
X XmStringFree(xmstr);
X XtManageChild(caution_box); /* popup modal caution box */
X`7D
X
X
X/*
X * Issue REMOVE UAF command if OK button pressed in caution box
X */
X
Xstatic XtCallbackProc CautionCallback(Widget widget, XtPointer data,
X XmPushButtonCallbackStruct *reason)
X`7B
X char command`5B20`5D;
X
X XtUnmanageChild(widget);
X XDefineCursor(top_display, top_window, wait_cursor);
X XFlush(top_display);
X if (reason->reason == XmCR_OK
X && uafdata`5BUAI$_USERNAME`5D.sdata`5B0`5D) `7B
X sprintf(command, "$ UAF REMOVE %s", uafdata`5BUAI$_USERNAME`5D.sdata
V);
X spawn_dcl(command);
X get_record("");
X `7D
X XUndefineCursor(top_display, top_window);
X`7D
X
X
X/*
X * Remove the error message widget when ack'ed or timed out
X */
X
Xstatic XtTimerCallbackProc MessageCallback(Widget widget, XtPointer data)
X`7B
X XtUnmanageChild(widget); /* popdown message box */
X XtRemoveTimeOut(timeout_id); /* clear out timer */
X`7D
X
X
X/*
X * Stop the idents work proc when 'reading idents' WorkingDialog widget is
V cancelled
X */
X
Xstatic XtCallbackProc IdentsCancelCallback(Widget widget, XtPointer data,
X XmPushButtonCallbackStruct *reason)
X`7B
X XtRemoveWorkProc(idents_work_proc_id);
X idents_work_proc_id = (XtWorkProcId) 0;
X`7D
X
X
X/*
X * Stop find() when 'find progress' WorkingDialog widget is cancelled
X */
X
Xstatic XtCallbackProc FindCancelCallback(Widget widget, XtPointer data,
X XmPushButtonCallbackStruct *reason)
X`7B
X XtRemoveWorkProc(find_work_proc_id);
X find_work_proc_id = (XtWorkProcId) 0;
X if (progress_id) `7B
X XtRemoveTimeOut(progress_id); /* cancel pending timeout */
X progress_id = (XtIntervalId) 0;
X `7D
X
X if (!found_ptr->next) `7B /* nothing left on found list? */
X XtSetSensitive(button_array`5Bfind_button`5D, OFF);
X XtSetSensitive(button_array`5Bfind_menu`5D, OFF);
X `7D
X`7D
X
X
X/*
X * Pop up (or remove) the access dialog box
X * Called by 'Access' menu item
X */
X
Xstatic XtCallbackProc Access(Widget widget, XtPointer data,
X XmToggleButtonCallbackStruct *reason)
X`7B
X Cardinal wi, ac;
X Arg arglist`5B2`5D;
X
X if (!access_box) `7B
X if ((MrmFetchWidget(Hierarchy, "access_box", toplevel,
X &access_box, &class)) != MrmSUCCESS)
X XtAppError(context, "Error Fetching Access main widget");
X /* adjust drawing area using hourSize resource */
X for (wi = UAI$_NETWORK_ACCESS_P; wi <= UAI$_REMOTE_ACCESS_S; wi++) `
V7B
X ac = 0;
X XtSetArg(arglist`5Bac`5D, XmNwidth, resource_data.hour_size * 24
V); ac++; `20
X if (widget_array`5Bwi`5D)
X XtSetValues(widget_array`5Bwi`5D, arglist, ac);
X `7D
X `7D
X if (XtIsManaged(access_box)) `7B
X XtUnmanageChild(access_box);
X XmToggleButtonSetState(button_array`5Baccess_menu`5D, OFF, NO);
X `7D
X else `7B
X XtManageChild(access_box);
X XmToggleButtonSetState(button_array`5Baccess_menu`5D, ON, NO);
X update_prime(); /* may not have existed */
X set_handlers(); /* set window event handlers */
X `7D
X`7D
X
X
X/*
X * Pop up (or remove) the privs dialog box
X * Called by 'Privs' menu item
X */
X
Xstatic XtCallbackProc Privs(Widget widget, XtPointer data,
X XmToggleButtonCallbackStruct *reason)
X`7B
X if (!privs_box)
X if ((MrmFetchWidget(Hierarchy, "privs_box", toplevel,
X &privs_box, &class)) != MrmSUCCESS)
X XtAppError(context, "Error Fetching Privs main widget");
X if (XtIsManaged(privs_box)) `7B
X XtUnmanageChild(privs_box);
X XmToggleButtonSetState(button_array`5Bprivs_menu`5D, OFF, NO);
X `7D
X else `7B
X XtManageChild(privs_box);
X XmToggleButtonSetState(button_array`5Bprivs_menu`5D, ON, NO);
X update_privs(); /* may not have existed */
X `7D
X`7D
X
X
X/*
X * Activation callback on Select menu item
X * also called by select_key()
X * widget, reason not referenced
X */
X
Xstatic XtCallbackProc Select(Widget widget, int *data,
X XmPushButtonCallbackStruct *reason)
X`7B
X Cardinal ind, ac;
X Arg arglist`5B10`5D;
X ident *ptr, *tptr;
X char str`5B80`5D;
X XmString xmstr;
X
X if (found_list.next `7C`7C *data < 100) `7B /* skip if 100 and nothing
V on list */
X XtSetSensitive(button_array`5Bfind_button`5D, ON); /* 'find' button
V is now active */
X XtSetSensitive(button_array`5Bfind_menu`5D, ON); /* 'find' menu i
Vtem is now active */
X `7D
X if (*data == 100) `7B /* 100 means re-enable found_list */
X found_ptr = &found_list;
X return;
X `7D
X
X sprintf(str, "Reset %s search", select_data`5B*data`5D.name);
X xmstr = XmStringCreateSimple(str);
X ac = 0;
X XtSetArg(arglist`5Bac`5D, XmNlabelString, xmstr); ac++;
X XtSetArg(arglist`5Bac`5D, XmNsensitive, TRUE); ac++;
X XtSetValues(button_array`5Brestart_button`5D, arglist, ac);
X XmStringFree(xmstr);
X
X for (ptr = found_list.next; ptr;) `7B /* free old found list */
X XtFree(ptr->name);
X tptr = ptr;
X ptr = ptr->next;
X XtFree(tptr);
X `7D
X select_index = *data; /* which field to match */
X if (select_string)
X XtFree(select_string); /* free memory used by old string */
X switch (select_data`5B*data`5D.type) `7B
X case DWP_ALPHA: /* username, account */
X case DWP_LALPHA: /* other text fields */
X case DWP_UIC: /* use the text of UIC */
X /* we could parse_dev(), parse_dir(), etc. here to ensure match */
X select_string = XtNewString(unpad(uafdata`5Bselect_data`5B*data`5D.c
Vode`5D.sdata));
X break;
X case DWP_DATE: /* pwdlifetime, expiration; text string or 64 bit date *
V/
X if (uafdata`5Bselect_data`5B*data`5D.code`5D.changed) /* text was e
Vntered */
X if (!parse_date(select_data`5B*data`5D.code)) /* convert text t
Vo binary */
X DWPerror("Select","Illegal date format", 0);
X select_string = XtMalloc(select_data`5B*data`5D.size);
X memcpy(select_string, uafdata`5Bselect_data`5B*data`5D.code`5D.sdata
V,
X select_data`5B*data`5D.size);
X break;
X default:
X select_string = XtNewString(""); /* so find_work_proc won't blow up
V */
X `7D
X select_ptr = found_add = NULL; /* restart find from the beginning */
X found_list.next = NULL;
X found_ptr = &found_list;
X if (find_work_proc_id) /* is there one going on now? */
X XtRemoveWorkProc(find_work_proc_id); /* stop it */
X find_work_proc_id = XtAppAddWorkProc(context, find_work_proc, NULL);
X /* note: to be run first, read_identifiers must be called after AppAddWo
VrkProc */
X read_identifiers(FALSE); /* set up ident_list if necessary */
X`7D
X
X
X/*
X * Creation callback; save the widget using the UAI code as the index
X */
X
Xstatic XtCallbackProc WidgetCreated(Widget widget, XtPointer data,
X XmAnyCallbackStruct *reason)
X`7B
X widget_array`5B*data`5D = widget;
X`7D
X
X
X/*
X * Creation callback; save the save menu button widget in button_array
X */
X
Xstatic XtCallbackProc ButtonCreated(Widget widget, XtPointer data,
X XmAnyCallbackStruct *reason)
X`7B
X button_array`5B*data`5D = widget;
X`7D
X
X
X/*
X * Called whenever a key is pressed in a text widget
X */
X
Xstatic XtCallbackProc WidgetChanged(Widget widget, XtPointer data,
X XmTextVerifyCallbackStruct *reason)
X`7B
X String str;
X Cardinal pos;
X
X if (setting_widgets) return;
X pos = XmTextGetInsertionPosition(widget);
X str = XmTextGetString(widget);
X uafdata`5B*data`5D.changed = TRUE; /* element has changed */
X if (*data != UAI$_OWNER)
X uppercase(str);
X strcpy(uafdata`5B*data`5D.sdata, str);
X setting_widgets = TRUE; /* Don't allow recursion */
X XmTextSetString(widget, str);
X XmTextSetInsertionPosition(widget, pos);
X setting_widgets = FALSE;
X XtFree(str);
X`7D
X
X
X/*
X * Called when flag toggle button is created
X */
X
Xstatic XtCallbackProc FlagsCreated(Widget widget, XtPointer data,
X XmAnyCallbackStruct *reason)
X`7B
X flags_array`5B*data`5D = widget;
X`7D
X
X
X/*
X * Called whenever a flag toggle button is pressed
X */
X
Xstatic XtCallbackProc FlagsChanged(Widget widget, XtPointer data,
X XmAnyCallbackStruct *reason)
X`7B
X if (setting_flags) return;
X uafdata`5BUAI$_FLAGS`5D.changed = TRUE; /* element has changed */
X uafdata`5BUAI$_FLAGS`5D.idata `5E= 1 << *data; /* toggle flag bit */
X`7D
X
X
X/*
X * Called when a primary day toggle button is created
X */
X
Xstatic XtCallbackProc PrimeCreated(Widget widget, XtPointer data,
X XmAnyCallbackStruct *reason)
X`7B
X prime_array`5B*data`5D = widget;
X`7D
X
X
X/*
X * Called whenever a prime day toggle button is pressed
X */
X
Xstatic XtCallbackProc PrimeChanged(Widget widget, XtPointer data,
X XmAnyCallbackStruct *reason)
X`7B
X if (setting_prime) return;
X uafdata`5BUAI$_PRIMEDAYS`5D.changed = TRUE; /* element has change
Vd */
X uafdata`5BUAI$_PRIMEDAYS`5D.idata `5E= 1 << *data; /* toggle bit in p
Vrimedays */
X`7D
X
X
X/*
X * Called when a privs toggle button is created
X */
X
Xstatic XtCallbackProc PrivsCreated(Widget widget, XtPointer data,
X XmAnyCallbackStruct *reason)
X`7B
X privs_array`5B*data`5D = widget;
X`7D
X
X
X/*
X * Called whenever a privs toggle button is pressed
X */
X
Xstatic XtCallbackProc PrivsChanged(Widget widget, XtPointer data,
X XmAnyCallbackStruct *reason)
X`7B
X if (setting_privs) return;
X if (*data < PRIVS_BIAS) `7B
X uafdata`5BUAI$_PRIV`5D.sdata`5B*data >> 3`5D `5E= 1 << (*data & 7);
X uafdata`5BUAI$_PRIV`5D.changed = TRUE; /* element has changed */
X `7D
X else `7B
X uafdata`5BUAI$_DEF_PRIV`5D.sdata`5B(*data - PRIVS_BIAS) >> 3`5D `5E=
X 1 << (*data - PRIVS_BIAS & 7);
X uafdata`5BUAI$_DEF_PRIV`5D.changed = TRUE;
X `7D
X`7D
X
X
X/*
X * Read selection box widget to get account name
X * Create new UIC
X */
X
Xstatic XtCallbackProc AccountChanged(Widget widget, XtPointer data,
X XmSelectionBoxCallbackStruct *reason)
X`7B
X String str;
X Cardinal ind;
X
X if (reason->reason == XmCR_CANCEL) `7B
X XmTextSetString(widget_array`5BUAI$_ACCOUNT`5D, "");
X uafdata`5BUAI$_ACCOUNT`5D.changed = TRUE;
X strcpy(uafdata`5BUAI$_ACCOUNT`5D.sdata, "");
X return;
X `7D
X
X XmStringGetLtoR(reason->value, XmSTRING_DEFAULT_CHARSET, &str);
X XmTextSetString(widget_array`5BUAI$_ACCOUNT`5D, str);
X uafdata`5BUAI$_ACCOUNT`5D.changed = TRUE;
X strcpy(uafdata`5BUAI$_ACCOUNT`5D.sdata, str);
X uppercase(uafdata`5BUAI$_ACCOUNT`5D.sdata);
X XtFree(str);
X strcpy(uafdata`5BUAI$_UIC`5D.sdata, "`5B0,0`5D"); /* force UIC recalc
V */
X calc_uic();
X trans_uic(uafdata`5BUAI$_UIC`5D.idata);
X`7D
X
X
X/*
X * Called by 'Read Identifiers' menu item
X */
X
Xstatic XtCallbackProc ReadIdentifiers(Widget widget, XtPointer data,
X XmAnyCallbackStruct *reason)
X`7B
X read_identifiers(TRUE);
X`7D
X
X
X/*
X * Pop up accounts selection box widget
X * Called by 'Accounts' menu item
X */
X
Xstatic XtCallbackProc Accounts(Widget widget, XtPointer data,
X XmAnyCallbackStruct *reason)
X`7B
X Cardinal ac;
X Arg arglist`5B5`5D;
X XmString xmstr;
X
X /* make accounts_box */
X /* this could be fetched from a UID file, but it's easier here */
X if (!accounts_box) `7B
X ac = 0;
X xmstr = XmStringCreateSimple("DWProfile: Accounts");
X XtSetArg(arglist`5Bac`5D, XmNdialogTitle, xmstr); ac++;
X`09XtSetArg(arglist`5Bac`5D, XmNdefaultPosition, FALSE); ac++;
X accounts_box = XmCreateSelectionDialog(toplevel, "accounts_box", arg
Vlist, ac);
X XmStringFree(xmstr);
X XtAddCallback(accounts_box, XmNapplyCallback, AccountChanged, NULL);
X XtAddCallback(accounts_box, XmNhelpCallback, Help, "menus windows ac
Vcounts");
X XtUnmanageChild(XmSelectionBoxGetChild(accounts_box, XmDIALOG_OK_BUT
VTON));
X XtUnmanageChild(XmSelectionBoxGetChild(accounts_box, XmDIALOG_CANCEL
V_BUTTON));
X `7D
X if (XtIsManaged(accounts_box)) `7B
X XtUnmanageChild(accounts_box);
X XmToggleButtonSetState(button_array`5Baccounts_menu`5D, OFF, NO);
X return;
X `7D
X XtManageChild(accounts_box);
X XmToggleButtonSetState(button_array`5Baccounts_menu`5D, ON, NO);
X if (ident_list)
X build_accounts(); /* build list from idents */
X else
X read_identifiers(FALSE); /* get idents, build list when done */
X`7D
X
X
X/*
X * Pop up (or remove) the idents dialog box
X * Called by 'Idents' menu item
X */
X
Xstatic XtCallbackProc Idents(Widget widget, XtPointer data,
X XmAnyCallbackStruct *reason)
X`7B
X if (!idents_box)
X if ((MrmFetchWidget(Hierarchy, "idents_box", toplevel,
X &idents_box, &class)) != MrmSUCCESS)
X XtAppError(context, "Error Fetching Idents main widget");
X if (XtIsManaged(idents_box)) `7B
X XtUnmanageChild(idents_box);
X XmToggleButtonSetState(button_array`5Bidents_menu`5D, OFF, NO);
X return;
X `7D
X XtManageChild(idents_box);
X XmToggleButtonSetState(button_array`5Bidents_menu`5D, ON, NO);
X if (ident_list)
X update_held(); /* build list from idents */
X else
X read_identifiers(FALSE); /* get idents, build list when done */
X`7D
X
X
X/*
X * Add (or remove) the identifier for the user
X * Called by selecting identifier from list box
X */
X
Xstatic XtCallbackProc ListSelect(Widget widget, XtPointer data,
X XmListCallbackStruct *list)
X`7B
X Cardinal count, ind;
X ident *ptr;
X held_ident *hptr, *prev_hptr, *tmp_hptr;
X String str;
X
X switch(*data) `7B
X case k_widget_all_list:
X XmStringGetLtoR(list->item, XmSTRING_DEFAULT_CHARSET, &str);
X /* find the identifier that matches the selected item */
X for (ptr = ident_list; ptr; ptr = ptr->next)
X if (!strcmp(ptr->name, str)) break;
X XtFree(str);
X for (hptr = held_list, prev_hptr = NULL; hptr; prev_hptr = hptr, hpt
Vr = hptr->next) /* find deleted id or end */
X if (hptr->identifier == ptr->identifier) break;
X if (!hptr) `7B /* not in held list, make new node */
X hptr = XtNew(held_ident);
X hptr->name = XtNewString(ptr->name);
X hptr->identifier = NULL;
X hptr->next = NULL;
X if (prev_hptr)
X prev_hptr->next = hptr; /* point prev node to new node */
X else
X held_list = hptr; /* or start list with first new nod
Ve */
X `7D
X if (!hptr->identifier) `7B
X hptr->status = add_ident; /* not found */
X hptr->identifier = ptr->identifier;
X `7D
X else
X hptr->status = original; /* orig ident deleted then added back *
V/
X break;
X case k_widget_held_list:
X count = 0;
X for (hptr = held_list, prev_hptr = NULL; hptr;) `7B
X tmp_hptr = NULL;
X if (hptr->status == original `7C`7C
X hptr->status == add_ident) count++;
X if (count == list->item_position) `7B /* is this the list item
V selected ? */
X if (hptr->status == add_ident) `7B /* if this is a pending
V add */
X if (prev_hptr) /* remove it from held_lis
Vt */
X prev_hptr->next = hptr->next;
X else
X held_list = hptr->next;
X tmp_hptr = hptr; /* and flag it for delete
V */
X `7D
X hptr->status = del_orig; /* original ident marked for remova
Vl */
X break;
X `7D
X prev_hptr = hptr;
X hptr = hptr->next;
X if (tmp_hptr)
X XtFree(tmp_hptr);
X `7D
X break;
X `7D
X update_held();
X`7D
X
X`20
X/*
X * Activation callback on a help menu or help callback
X */
X
Xstatic XtCallbackProc Help(Widget widget, String data,
X XmPushButtonCallbackStruct *reason)
X`7B
X
X Cardinal ac;
X Arg arglist`5B10`5D;
X XmString appname, glossarytopic, overviewtopic, libspec, topic;
X static Widget help_box = NULL;
X Widget temp_help_box;
X
X if (!strcmp(data, "context")) `7B
X /* context sensitive help mode, we'll get back here via helpcallback
V */
X DXmHelpOnContext(toplevel, FALSE);`09
X return;
X `7D
X
X topic = XmStringCreateSimple(data);
X
X if (!help_box `7C`7C XtIsManaged(help_box)) `7B
X /* We're going to create a help widget */
X ac = 0;
X appname = XmStringCreateSimple("DWProfile");
X overviewtopic = XmStringCreateSimple("overview");
X libspec = XmStringCreateSimple(HELP_LIBRARY);
X XtSetArg(arglist`5Bac`5D, DXmNapplicationName, appname); ac++;
X XtSetArg(arglist`5Bac`5D, DXmNoverviewTopic, overviewtopic); ac++;
X XtSetArg(arglist`5Bac`5D, DXmNlibrarySpec, libspec); ac++;
X `7D
X
X if (!help_box) `7B /* create the help box */
X help_box = DXmCreateHelpDialog (toplevel, "help_box", arglist, ac);
X XmStringFree(appname);
X XmStringFree(overviewtopic);
X XmStringFree(libspec);
X `7D
X
+-+-+-+-+-+-+-+- END OF PART 3 +-+-+-+-+-+-+-+-
--
Bruce Tanner (310) 860-2451 x 596 Tanner@Cerritos.EDU
Cerritos College Norwalk, CA DoD #0161 NOMAD #007
Technical Details
Message-ID:
<9908592@MVB.SAIC.COM>Path:
arc1-ca.pugleaf.net!sparky!uunet!wupost!cs.utexas.edu!swrinde!network.ucsd.edu!mvb.saic.com!vmsnet-sourcesShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!sparky!uunet!wupost!cs.utexas.edu!swrinde!network.ucsd.edu!mvb.saic.com!vmsnet-sources From: tanner@cerritos.edu Newsgroups: vmsnet.sources Subject: DWProfile V3.3, part 03/06 Message-ID: <9908592@MVB.SAIC.COM> Date: Mon, 04 Jan 1993 20:47:05 GMT Organization: Cerritos College, Norwalk CA Lines: 1408 Approved: Mark.Berryman@Mvb.Saic.Com