#include "lpsched.h"
#include <syslog.h>
static int max_requests_needing_form_mounted ( FSTATUS * );
static int max_requests_needing_pwheel_mounted ( char * );
void
queue_form(RSTATUS *prs, FSTATUS *pfs)
{
if ((prs->form = pfs) != NULL) {
prs->form->requests++;
if (prs->printer)
check_form_alert (prs->form, (_FORM *)0);
}
return;
}
void
unqueue_form(RSTATUS *prs)
{
FSTATUS * pfs = prs->form;
prs->form = 0;
if (pfs) {
pfs->requests--;
if (prs->printer)
check_form_alert (pfs, (_FORM *)0);
}
return;
}
void
queue_pwheel(RSTATUS *prs, char *name)
{
if (name) {
prs->pwheel_name = Strdup(name);
if (
!one_printer_with_charsets(prs)
&& (prs->pwheel = search_pwstatus(name))
) {
prs->pwheel->requests++;
check_pwheel_alert (prs->pwheel, (PWHEEL *)0);
}
}
return;
}
void
unqueue_pwheel(RSTATUS *prs)
{
PWSTATUS * ppws = prs->pwheel;
prs->pwheel = 0;
unload_str (&(prs->pwheel_name));
if (ppws) {
ppws->requests--;
check_pwheel_alert (ppws, (PWHEEL *)0);
}
return;
}
void
check_form_alert(FSTATUS *pfs, _FORM *pf)
{
short trigger,
fire_off_alert = 0;
int requests_waiting;
syslog(LOG_DEBUG, "check_form_alert:\n");
if (pfs)
syslog(LOG_DEBUG, "check_form_alert: pfs->name <%s>\n",
(pfs->form->name != NULL) ? pfs->form->name : "null");
if (pf)
syslog(LOG_DEBUG, "check_form_alert: pf->name <%s>\n",
(pf->name != NULL) ? pf->name : "null");
if (pf) {
if ((trigger = pf->alert.Q) <= 0)
trigger = 1;
} else
trigger = pfs->trigger;
if (Starting)
goto Return;
#define OALERT pfs->form->alert
#define NALERT pf->alert
requests_waiting = max_requests_needing_form_mounted(pfs);
if (pfs->alert->active)
if (!requests_waiting || requests_waiting < trigger)
cancel_alert (A_FORM, pfs);
else if (
pf
&& (
!SAME(NALERT.shcmd, OALERT.shcmd)
|| NALERT.W != OALERT.W
|| NALERT.Q != OALERT.Q
)
)
cancel_alert (A_FORM, pfs);
if (trigger > 0 && requests_waiting >= trigger)
if ((pf && NALERT.shcmd) || OALERT.shcmd)
fire_off_alert = 1;
#undef OALERT
#undef NALERT
Return: if (pf) {
pfs->form = pf;
pfs->trigger = trigger;
}
if (fire_off_alert)
alert (A_FORM, pfs);
return;
}
void
check_pwheel_alert(PWSTATUS *ppws, PWHEEL *ppw)
{
short trigger,
fire_off_alert = 0;
int requests_waiting;
if (ppw) {
if ((trigger = ppw->alert.Q) <= 0)
trigger = 1;
} else
trigger = ppws->trigger;
if (Starting)
goto Return;
#define OALERT ppws->pwheel->alert
#define NALERT ppw->alert
requests_waiting = max_requests_needing_pwheel_mounted(ppws->pwheel->name);
if (ppws->alert->active)
if (!requests_waiting || requests_waiting < trigger)
cancel_alert (A_PWHEEL, ppws);
else if (
ppw
&& (
!SAME(NALERT.shcmd, OALERT.shcmd)
|| NALERT.W != OALERT.W
|| NALERT.Q != OALERT.Q
)
)
cancel_alert (A_PWHEEL, ppws);
if (trigger > 0 && requests_waiting >= trigger)
if ((ppw && NALERT.shcmd) || OALERT.shcmd)
fire_off_alert = 1;
#undef OALERT
#undef NALERT
Return: if (ppw) {
ppws->pwheel = ppw;
ppws->trigger = trigger;
}
if (fire_off_alert)
alert (A_PWHEEL, ppws);
return;
}
static int
trayWithForm(PSTATUS *pps, FSTATUS *pfs, int startingTray, int checkAvail)
{
int i;
PFSTATUS *ppfs;
ppfs = pps->forms;
if (startingTray < 0)
startingTray = 0;
if (ppfs) {
for (i = startingTray; i < pps->numForms; i++)
if ((!checkAvail || ppfs[i].isAvailable) &&
(ppfs[i].form == pfs))
return(i);
}
else if (!pfs)
return(0);
return(-1);
}
char *
allTraysWithForm(PSTATUS *pps, FSTATUS *pfs)
{
int tray = 0;
char *ptr, *p;
char trayList[MAX_INPUT];
int n;
ptr = trayList;
if (pfs && pfs->form && pfs->form->paper)
p = pfs->form->paper;
else
p = "";
n = sizeof (trayList);
snprintf(ptr, n, "LP_TRAY_ARG=%s:", p);
ptr += strlen(ptr);
n -= strlen(ptr);
while ((tray = trayWithForm(pps, pfs, tray, 1)) > 0) {
tray++;
snprintf(ptr, n, "%d,", tray);
ptr += strlen(ptr);
n -= strlen(ptr);
}
if (*(ptr-1) == ',')
*(ptr-1) = 0;
putenv(trayList);
return(NULL);
}
int
isFormUsableOnPrinter(PSTATUS *pps, FSTATUS *pfs)
{
return (trayWithForm(pps,pfs,0,1) >= 0 );
}
int
isFormMountedOnPrinter(PSTATUS *pps, FSTATUS *pfs)
{
return (trayWithForm(pps,pfs,0,0) >= 0 );
}
static int
max_requests_needing_form_mounted(FSTATUS *pfs)
{
PSTATUS * pps;
RSTATUS * prs;
int max = 0;
int i;
for (i = 0; PStatus != NULL && PStatus[i] != NULL; i++)
PStatus[i]->nrequests = 0;
for (prs = Request_List; prs != NULL; prs = prs->next)
if ((prs->form == pfs) && ((pps = prs->printer) != NULL) &&
(!isFormMountedOnPrinter(pps,pfs)) &&
(++pps->nrequests >= max))
max = pps->nrequests;
if (NewRequest)
if (((pps = NewRequest->printer) != NULL) &&
(!isFormMountedOnPrinter(pps,pfs)))
if (++pps->nrequests >= max)
max = pps->nrequests;
return (max);
}
static int
max_requests_needing_pwheel_mounted(char *pwheel_name)
{
PSTATUS * pps;
RSTATUS * prs;
int max = 0;
int i;
for (i = 0; PStatus != NULL && PStatus[i] != NULL; i++)
PStatus[i]->nrequests = 0;
for (prs = Request_List; prs != NULL; prs = prs->next)
if ((prs->pwheel_name != NULL) &&
(STREQU(prs->pwheel_name, pwheel_name)) &&
((pps = prs->printer) != NULL) && pps->printer->daisy &&
(!SAME(pps->pwheel_name, pwheel_name)))
if (++pps->nrequests >= max)
max = pps->nrequests;
if (NewRequest)
if (
((pps = NewRequest->printer) != NULL)
&& pps->printer->daisy
&& !SAME(pps->pwheel_name, pwheel_name)
)
if (++pps->nrequests >= max)
max = pps->nrequests;
return (max);
}
int
one_printer_with_charsets(RSTATUS *prs)
{
return (
STREQU(prs->request->destination, prs->printer->printer->name)
&& !prs->printer->printer->daisy
);
}