Skip to content

Commit

Permalink
Add pause/resume buttons and sub-commands (Issue #124)
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelrsweet committed Aug 31, 2021
1 parent 176be96 commit b418ad4
Show file tree
Hide file tree
Showing 5 changed files with 169 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ Changes in v1.1b1
- Added support for Windows 10 and higher.
- Added `PAPPL_SOPTIONS_NO_TLS` option to disable TLS support.
- Added Wi-Fi callbacks to support configuration over IPP-USB (Issue #45)
- Added buttons and sub-commands to pause and resume printers (Issue #124)
- `papplMainLoop` now uses a persistent location for state and spool files by
default (Issue #128)
- `papplMainLoop` now supports clients talking to a system-wide server running
Expand Down
2 changes: 2 additions & 0 deletions pappl/mainloop-private.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ extern int _papplMainloopCancelJob(const char *base_name, int num_options, cups_
extern int _papplMainloopDeletePrinter(const char *base_name, int num_options, cups_option_t *options) _PAPPL_PRIVATE;
extern int _papplMainloopGetSetDefaultPrinter(const char *base_name, int num_options, cups_option_t *options) _PAPPL_PRIVATE;
extern int _papplMainloopModifyPrinter(const char *base_name, int num_options, cups_option_t *options) _PAPPL_PRIVATE;
extern int _papplMainloopPausePrinter(const char *base_name, int num_options, cups_option_t *options) _PAPPL_PRIVATE;
extern int _papplMainloopResumePrinter(const char *base_name, int num_options, cups_option_t *options) _PAPPL_PRIVATE;
extern int _papplMainloopRunServer(const char *base_name, const char *version, const char *footer_html, int num_drivers, pappl_pr_driver_t *drivers, pappl_pr_autoadd_cb_t autoadd_cb, pappl_pr_driver_cb_t driver_cb, int num_options, cups_option_t *options, pappl_ml_system_cb_t system_cb, void *data) _PAPPL_PRIVATE;
extern int _papplMainloopShowDevices(const char *base_name, int num_options, cups_option_t *options) _PAPPL_PRIVATE;
extern int _papplMainloopShowDrivers(const char *base_name, int num_drivers, pappl_pr_driver_t *drivers, pappl_pr_autoadd_cb_t autoadd_cb, pappl_pr_driver_cb_t driver_cb, int num_options, cups_option_t *options, pappl_ml_system_cb_t system_cb, void *data) _PAPPL_PRIVATE;
Expand Down
114 changes: 114 additions & 0 deletions pappl/mainloop-subcommands.c
Original file line number Diff line number Diff line change
Expand Up @@ -499,6 +499,120 @@ _papplMainloopModifyPrinter(
}


//
// '_papplMainloopPausePrinter()' - Pause printer.
//

int // O - Exit status
_papplMainloopPausePrinter(
const char *base_name, // I - Base name
int num_options, // I - Number of options
cups_option_t *options) // I - Options
{
http_t *http; // Connection to server
ipp_t *request; // Pause-Printer request
const char *printer_uri, // Printer URI
*printer_name; // Name of printer
char resource[1024]; // Resource path


// Open a connection to the server...
if ((printer_uri = cupsGetOption("printer-uri", num_options, options)) != NULL)
{
// Connect to the remote printer...
if ((http = _papplMainloopConnectURI(base_name, printer_uri, resource, sizeof(resource))) == NULL)
return (1);

printer_name = NULL;
}
else if ((http = _papplMainloopConnect(base_name, true)) == NULL)
{
return (1);
}
else if ((printer_name = cupsGetOption("printer-name", num_options, options)) == NULL)
{
fprintf(stderr, "%s: Missing '-d PRINTER'.\n", base_name);
return (1);
}

// Send a Pause-Printer request to the server...
request = ippNewRequest(IPP_OP_PAUSE_PRINTER);
if (printer_uri)
ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri", NULL, printer_uri);
else
_papplMainloopAddPrinterURI(request, printer_name, resource, sizeof(resource));

ippDelete(cupsDoRequest(http, request, resource));

httpClose(http);

if (cupsLastError() != IPP_STATUS_OK)
{
fprintf(stderr, "%s: Unable to pause printer: %s\n", base_name, cupsLastErrorString());
return (1);
}

return (0);
}


//
// '_papplMainloopResumePrinter()' - Resume printer.
//

int // O - Exit status
_papplMainloopResumePrinter(
const char *base_name, // I - Base name
int num_options, // I - Number of options
cups_option_t *options) // I - Options
{
http_t *http; // Connection to server
ipp_t *request; // Pause-Printer request
const char *printer_uri, // Printer URI
*printer_name; // Name of printer
char resource[1024]; // Resource path


// Open a connection to the server...
if ((printer_uri = cupsGetOption("printer-uri", num_options, options)) != NULL)
{
// Connect to the remote printer...
if ((http = _papplMainloopConnectURI(base_name, printer_uri, resource, sizeof(resource))) == NULL)
return (1);

printer_name = NULL;
}
else if ((http = _papplMainloopConnect(base_name, true)) == NULL)
{
return (1);
}
else if ((printer_name = cupsGetOption("printer-name", num_options, options)) == NULL)
{
fprintf(stderr, "%s: Missing '-d PRINTER'.\n", base_name);
return (1);
}

// Send a Resume-Printer request to the server...
request = ippNewRequest(IPP_OP_RESUME_PRINTER);
if (printer_uri)
ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri", NULL, printer_uri);
else
_papplMainloopAddPrinterURI(request, printer_name, resource, sizeof(resource));

ippDelete(cupsDoRequest(http, request, resource));

httpClose(http);

if (cupsLastError() != IPP_STATUS_OK)
{
fprintf(stderr, "%s: Unable to resume printer: %s\n", base_name, cupsLastErrorString());
return (1);
}

return (0);
}


//
// '_papplMainloopRunServer()' - Run server.
//
Expand Down
12 changes: 12 additions & 0 deletions pappl/mainloop.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,9 @@ papplMainloop(
"jobs",
"modify",
"options",
"pause",
"printers",
"resume",
"server",
"shutdown",
"status",
Expand Down Expand Up @@ -405,10 +407,18 @@ papplMainloop(
{
return (_papplMainloopShowOptions(base_name, num_options, options));
}
else if (!strcmp(subcommand, "pause"))
{
return (_papplMainloopPausePrinter(base_name, num_options, options));
}
else if (!strcmp(subcommand, "printers"))
{
return (_papplMainloopShowPrinters(base_name, num_options, options));
}
else if (!strcmp(subcommand, "resume"))
{
return (_papplMainloopResumePrinter(base_name, num_options, options));
}
else if (!strcmp(subcommand, "server"))
{
return (_papplMainloopRunServer(base_name, version, footer_html, num_drivers, drivers, autoadd_cb, driver_cb, num_options, options, system_cb, data));
Expand Down Expand Up @@ -454,7 +464,9 @@ usage(const char *base_name, // I - Base name of application
puts(" jobs List jobs.");
puts(" modify Modify a printer.");
puts(" options List printer options.");
puts(" pause Pause printing for a printer.");
puts(" printers List printers.");
puts(" resume Resume printing for a printer.");
puts(" server Run a server.");
puts(" shutdown Shutdown a running server.");
puts(" status Show server/printer/job status.");
Expand Down
40 changes: 40 additions & 0 deletions pappl/printer-webif.c
Original file line number Diff line number Diff line change
Expand Up @@ -897,6 +897,26 @@ _papplPrinterWebHome(
printer_state = IPP_PSTATE_PROCESSING;
}
}
else if (!strcmp(action, "pause-printer"))
{
papplPrinterPause(printer);

if (printer->state == IPP_PSTATE_STOPPED)
status = "Printer paused.";
else
status = "Printer pausing.";
}
else if (!strcmp(action, "resume-printer"))
{
papplPrinterResume(printer);

status = "Printer resuming.";
}
else if (!strcmp(action, "set-as-default"))
{
papplSystemSetDefaultPrinterID(printer->system, printer->printer_id);
status = "Default printer set.";
}
else
status = "Unknown action.";

Expand Down Expand Up @@ -1049,6 +1069,26 @@ _papplPrinterWebIteratorCallback(
papplClientHTMLPrintf(client, "<input type=\"hidden\" name=\"action\" value=\"print-test-page\"><input type=\"submit\" value=\"Print Test Page\"></form>");
}

if (printer->system->options & PAPPL_SOPTIONS_MULTI_QUEUE)
{
if (printer->state == IPP_PSTATE_STOPPED)
{
papplClientHTMLStartForm(client, uri, false);
papplClientHTMLPrintf(client, "<input type=\"hidden\" name=\"action\" value=\"resume-printer\"><input type=\"submit\" value=\"Resume Printing\"></form>");
}
else
{
papplClientHTMLStartForm(client, uri, false);
papplClientHTMLPrintf(client, "<input type=\"hidden\" name=\"action\" value=\"pause-printer\"><input type=\"submit\" value=\"Pause Printing\"></form>");
}

if (printer->printer_id != printer->system->default_printer_id)
{
papplClientHTMLStartForm(client, uri, false);
papplClientHTMLPrintf(client, "<input type=\"hidden\" name=\"action\" value=\"set-as-default\"><input type=\"submit\" value=\"Set as Default\"></form>");
}
}

if (strcmp(client->uri, "/") && (client->system->options & PAPPL_SOPTIONS_MULTI_QUEUE))
papplClientHTMLPrintf(client, " <a class=\"btn\" href=\"https://%s:%d%s/delete\">Delete Printer</a>", client->host_field, client->host_port, printer->uriname);

Expand Down

0 comments on commit b418ad4

Please sign in to comment.