🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by tanner Mon, 04 Jan 1993 20:47
DWProfile V3.3, part 03/06
#137
Author: tanner
Date: Mon, 04 Jan 1993 20:47
1408 lines
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
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads