summaryrefslogtreecommitdiff
path: root/prnt/backend/hp.c
diff options
context:
space:
mode:
Diffstat (limited to 'prnt/backend/hp.c')
-rw-r--r--prnt/backend/hp.c147
1 files changed, 93 insertions, 54 deletions
diff --git a/prnt/backend/hp.c b/prnt/backend/hp.c
index d86be15b3..d0d44d137 100644
--- a/prnt/backend/hp.c
+++ b/prnt/backend/hp.c
@@ -2,7 +2,7 @@
hp.c - hp cups backend
- (c) 2004-2007 Copyright Hewlett-Packard Development Company, LP
+ (c) 2004-2008 Copyright Hewlett-Packard Development Company, LP
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -29,7 +29,6 @@
#include <sys/types.h>
#include <sys/stat.h>
-#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
@@ -41,6 +40,9 @@
#include <syslog.h>
#include <ctype.h>
#include <pthread.h>
+#ifdef HAVE_FAX
+#include <dbus/dbus.h>
+#endif
#include "hpmud.h"
//#define HP_DEBUG
@@ -129,6 +131,13 @@ static const char pjl_ustatus_cmd[] = "\e%-12345X@PJL USTATUS DEVICE = ON \r\n@P
static const char pjl_job_end_cmd[] = "\e%-12345X@PJL EOJ \r\n\e%-12345X";
static const char pjl_ustatus_off_cmd[] = "\e%-12345X@PJL USTATUSOFF \r\n\e%-12345X";
+#ifdef HAVE_FAX
+#define DBUS_INTERFACE "com.hplip.Service"
+#define DBUS_PATH "/"
+static DBusError dbus_err;
+static DBusConnection *dbus_conn;
+#endif
+
static int bug(const char *fmt, ...)
{
char buf[256];
@@ -473,51 +482,75 @@ bugout:
return r;
}
-static int device_event(const char *dev, const char *jobid, int code, char *type, int timeout)
+#ifdef HAVE_FAX
+static int device_event(const char *dev, const char *printer, int code,
+ const char *username, const char *jobid, const char *title)
+{
+ DBusMessage * msg = NULL;
+ int id = atoi(jobid);
+
+ msg = dbus_message_new_signal(DBUS_PATH, DBUS_INTERFACE, "Event");
+
+ if (NULL == msg)
+ {
+ BUG("dbus message is NULL!\n");
+ return 0;
+ }
+
+ dbus_message_append_args(msg,
+ DBUS_TYPE_STRING, &dev,
+ DBUS_TYPE_STRING, &printer,
+ DBUS_TYPE_UINT32, &code,
+ DBUS_TYPE_STRING, &username,
+ DBUS_TYPE_UINT32, &id,
+ DBUS_TYPE_STRING, &title,
+ DBUS_TYPE_INVALID);
+
+ if (!dbus_connection_send(dbus_conn, msg, NULL))
+ {
+ BUG("dbus message send failed!\n");
+ return 0;
+ }
+
+ dbus_connection_flush(dbus_conn);
+ dbus_message_unref(msg);
+
+ return 1;
+}
+
+int init_dbus(void)
{
- struct sockaddr_in pin;
- char message[512];
- int len=0;
- int hpssd_socket=-1, hpssd_port_num=2207;
-
- bzero(&pin, sizeof(pin));
- pin.sin_family = AF_INET;
- pin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
- pin.sin_port = htons(hpssd_port_num);
+ dbus_error_init(&dbus_err);
+ dbus_conn = dbus_bus_get(DBUS_BUS_SYSTEM, &dbus_err);
- if ((hpssd_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {
- BUG("unable to create hpssd socket %d: %m\n", hpssd_port_num);
- goto bugout;
- }
-
- if (connect(hpssd_socket, (void *)&pin, sizeof(pin)) == -1)
- {
- BUG("unable to connect hpssd socket %d: %m\n", hpssd_port_num);
- goto bugout;
- }
-
- if (timeout == 0)
- len = sprintf(message, "msg=Event\ndevice-uri=%s\njob-id=%s\nevent-code=%d\nevent-type=%s\n", dev, jobid, code, type);
- else
- len = sprintf(message, "msg=Event\ndevice-uri=%s\njob-id=%s\nevent-code=%d\nevent-type=%s\nretry-timeout=%d\n",
- dev, jobid, code, type, timeout);
-
- /* Send message with no response. */
- if (send(hpssd_socket, message, len, 0) == -1)
- {
- BUG("unable to send Event %s %s %d: %m\n", dev, jobid, code);
- }
+ if (dbus_error_is_set(&dbus_err))
+ {
+ BUG("dBus Connection Error (%s)!\n", dbus_err.message);
+ dbus_error_free(&dbus_err);
+ }
-bugout:
- if (hpssd_socket >= 0)
- close(hpssd_socket);
+ if (dbus_conn == NULL)
+ {
+ return 0;
+ }
- return 0;
+ return 1;
+}
+#else
+static int device_event(const char *dev, const char *printer, int code,
+ const char *username, const char *jobid, const char *title)
+{
+ return 1;
+}
+int init_dbus(void)
+{
+ return 1;
}
+#endif /* HAVE_FAX */
/* Check printer status, if in an error state, loop until error condition is cleared. */
-static int loop_test(HPMUD_DEVICE dd, HPMUD_CHANNEL cd, struct pjl_attributes *pa, const char *uri, const char *job)
+static int loop_test(HPMUD_DEVICE dd, HPMUD_CHANNEL cd, struct pjl_attributes *pa,
+ const char *dev, const char *printer, const char *username, const char *jobid, const char *title)
{
int retry=0, status;
const char *pstate;
@@ -533,7 +566,7 @@ static int loop_test(HPMUD_DEVICE dd, HPMUD_CHANNEL cd, struct pjl_attributes *p
if (retry)
{
/* Clear error. */
- device_event(uri, job, VSTATUS_PRNT, "event", 0);
+ device_event(dev, printer, VSTATUS_PRNT, username, jobid, title);
fputs("INFO: Printing...\n", stderr);
fprintf(stderr, "STATE: -%s\n", error_state);
retry=0;
@@ -545,14 +578,14 @@ static int loop_test(HPMUD_DEVICE dd, HPMUD_CHANNEL cd, struct pjl_attributes *p
{
/* Display error. */
error_state = pstate;
- device_event(uri, job, status, "error", RETRY_TIMEOUT);
+ device_event(dev, printer, status, username, jobid, title);
fprintf(stderr, "STATE: +%s\n", error_state);
}
if (strcmp(pstate, error_state) != 0)
{
/* Clear old error and display new error. */
- device_event(uri, job, status, "error", RETRY_TIMEOUT);
+ device_event(dev, printer, status, username, jobid, title);
fprintf(stderr, "STATE: -%s\n", error_state);
error_state = pstate;
fprintf(stderr, "STATE: +%s\n", error_state);
@@ -578,14 +611,18 @@ int main(int argc, char *argv[])
HPMUD_CHANNEL cd=-1;
int n, total, retry=0, size, pages;
enum HPMUD_RESULT stat;
-
+ char *printer = getenv("PRINTER");
+
+ // 0 1 2 3 4 5
+ // device_uri job-id user title copies options
+
if (argc > 1)
{
const char *arg = argv[1];
if ((arg[0] == '-') && (arg[1] == 'h'))
{
fprintf(stdout, "HP Linux Imaging and Printing System\nCUPS Backend %s\n", VERSION);
- fprintf(stdout, "(c) 2003-2007 Copyright Hewlett-Packard Development Company, LP\n");
+ fprintf(stdout, "(c) 2003-2008 Copyright Hewlett-Packard Development Company, LP\n");
exit(0);
}
}
@@ -614,6 +651,8 @@ int main(int argc, char *argv[])
copies = atoi(argv[4]);
}
+ init_dbus();
+
fputs("STATE: +connecting-to-device\n", stderr);
/* Get any parameters needed for DeviceOpen. */
@@ -625,13 +664,13 @@ int main(int argc, char *argv[])
if (strcasestr(argv[0], ":/net") == NULL && (ma.statustype==HPMUD_STATUSTYPE_PJL || ma.statustype==HPMUD_STATUSTYPE_PJLPML))
pa.pjl_device = 1;
- device_event(argv[0], argv[1], EVENT_START_JOB, "event", 0);
+ device_event(argv[0], printer, EVENT_START_JOB, argv[2], argv[1], argv[3]);
/* Open hp device. */
while ((stat = hpmud_open_device(argv[0], ma.prt_mode, &hd)) != HPMUD_R_OK)
{
/* Display user error. */
- device_event(argv[0], argv[1], 5000+stat, "error", RETRY_TIMEOUT);
+ device_event(argv[0], printer, 5000+stat, argv[2], argv[1], argv[3]);
BUG("INFO: open device failed; will retry in %d seconds...\n", RETRY_TIMEOUT);
sleep(RETRY_TIMEOUT);
@@ -641,7 +680,7 @@ int main(int argc, char *argv[])
if (retry)
{
/* Clear user error. */
- device_event(argv[0], argv[1], VSTATUS_PRNT, "event", 0);
+ device_event(argv[0], printer, VSTATUS_PRNT, argv[2], argv[1], argv[3]);
retry=0;
}
@@ -668,7 +707,7 @@ int main(int argc, char *argv[])
{
while ((stat = hpmud_open_channel(hd, HPMUD_S_PRINT_CHANNEL, &cd)) != HPMUD_R_OK)
{
- device_event(argv[0], argv[1], 5000+stat, "error", RETRY_TIMEOUT);
+ device_event(argv[0], printer, 5000+stat, argv[2], argv[1], argv[3]);
BUG("INFO: open print channel failed; will retry in %d seconds...\n", RETRY_TIMEOUT);
sleep(RETRY_TIMEOUT);
retry = 1;
@@ -677,7 +716,7 @@ int main(int argc, char *argv[])
if (retry)
{
/* Clear user error. */
- device_event(argv[0], argv[1], VSTATUS_PRNT, "event", 0);
+ device_event(argv[0], printer, VSTATUS_PRNT, argv[2], argv[1], argv[3]);
retry=0;
}
@@ -700,7 +739,7 @@ int main(int argc, char *argv[])
if (n != size)
{
/* IO error, get printer status. */
- loop_test(hd, cd, &pa, argv[0], argv[1]);
+ loop_test(hd, cd, &pa, argv[0], printer, argv[2], argv[1], argv[3]);
}
else
{
@@ -708,7 +747,7 @@ int main(int argc, char *argv[])
if (pa.pjl_device)
{
/* Laserjets have a large data buffer, so manually check for operator intervention condition. */
- loop_test(hd, cd, &pa, argv[0], argv[1]);
+ loop_test(hd, cd, &pa, argv[0], printer, argv[2], argv[1], argv[3]);
}
}
total+=n;
@@ -729,7 +768,7 @@ int main(int argc, char *argv[])
/* Look for job end status. */
for (cnt=0; cnt<10; cnt++)
{
- loop_test(hd, cd, &pa, argv[0], argv[1]);
+ loop_test(hd, cd, &pa, argv[0], printer, argv[2], argv[1], argv[3]);
pthread_mutex_lock(&pa.mutex);
pages = pa.eoj_pages;
pthread_mutex_unlock(&pa.mutex);
@@ -775,7 +814,7 @@ int main(int argc, char *argv[])
sleep(8);
}
- device_event(argv[0], argv[1], EVENT_END_JOB, "event", 0);
+ device_event(argv[0], printer, EVENT_END_JOB, argv[2], argv[1], argv[3]);
fputs("INFO: ready to print\n", stderr);
if (cd >= 0)