diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2004-05-02 03:36:18 +0000 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2004-05-02 03:36:18 +0000 |
commit | bc085054220d80e9308fe5f4c2260e7ccc06e7e3 (patch) | |
tree | 0f178396a0abd3b507ca9cc80f5c54c665631c6e /cups/main.c | |
parent | 417d75ccb5aa92384fd75651b6cd8a53193439e4 (diff) |
Add Bluetooth backend for CUPS
Diffstat (limited to 'cups/main.c')
-rw-r--r-- | cups/main.c | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/cups/main.c b/cups/main.c new file mode 100644 index 00000000..352ea4ea --- /dev/null +++ b/cups/main.c @@ -0,0 +1,188 @@ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2003-2004 Marcel Holtmann <marcel@holtmann.org> + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + * CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + * COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + * SOFTWARE IS DISCLAIMED. + * + * + * $Id$ + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <errno.h> +#include <fcntl.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <signal.h> + +#include <bluetooth/bluetooth.h> +#include <bluetooth/sdp.h> +#include <bluetooth/sdp_lib.h> + +int sdp_search_spp(sdp_session_t *sdp, uint8_t *channel); +int sdp_search_hcrp(sdp_session_t *sdp, unsigned short *ctrl_psm, unsigned short *data_psm); + +int spp_print(bdaddr_t *src, bdaddr_t *dst, uint8_t channel, int fd, int copies); +int hcrp_print(bdaddr_t *src, bdaddr_t *dst, unsigned short ctrl_psm, unsigned short data_psm, int fd, int copies); + +static void list_devices(void) +{ +} + +/* + * Usage: printer-uri job-id user title copies options [file] + * + */ + +int main(int argc, char *argv[]) +{ + sdp_session_t *sdp; + bdaddr_t bdaddr; + unsigned short ctrl_psm, data_psm; + uint8_t channel, b[6]; + char *ptr, str[3], device[18], service[12]; + int i, err, fd, copies, proto; + + /* Make sure status messages are not buffered */ + setbuf(stderr, NULL); + + /* Ignore SIGPIPE signals */ +#ifdef HAVE_SIGSET + sigset(SIGPIPE, SIG_IGN); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + action.sa_handler = SIG_IGN; + sigaction(SIGPIPE, &action, NULL); +#else + signal(SIGPIPE, SIG_IGN); +#endif /* HAVE_SIGSET */ + + if (argc == 1) { + list_devices(); + return 0; + } + + if (argc < 6 || argc > 7) { + fprintf(stderr, "Usage: bluetooth job-id user title copies options [file]\n"); + return 1; + } + + if (argc == 6) { + fd = 0; + copies = 1; + } else { + if ((fd = open(argv[6], O_RDONLY)) < 0) { + perror("ERROR: Unable to open print file"); + return 1; + } + copies = atoi(argv[4]); + } + + if (strncasecmp(argv[0], "bluetooth://", 12)) { + fprintf(stderr, "ERROR: No device URI found\n"); + return 1; + } + + ptr = argv[0] + 12; + for (i = 0; i < 6; i++) { + strncpy(str, ptr, 2); + b[i] = (uint8_t) strtol(str, NULL, 16); + ptr += 2; + } + sprintf(device, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X", + b[0], b[1], b[2], b[3], b[4], b[5]); + + str2ba(device, &bdaddr); + + ptr = strchr(ptr, '/'); + if (ptr) { + strncpy(service, ptr + 1, 12); + + if (!strncasecmp(ptr + 1, "spp", 3)) + proto = 1; + else if (!strncasecmp(ptr + 1, "hcrp", 4)) + proto = 2; + else + proto = 0; + } else { + strcpy(service, "auto"); + proto = 0; + } + + fprintf(stderr, "DEBUG: %s device %s service %s fd %d copies %d\n", + argv[0], device, service, fd, copies); + + sdp = sdp_connect(BDADDR_ANY, &bdaddr, 0 /*SDP_RETRY_IF_BUSY*/); + if (!sdp) { + fprintf(stderr, "ERROR: Can't open Bluetooth connection\n"); + return 1; + } + + switch (proto) { + case 1: + err = sdp_search_spp(sdp, &channel); + break; + case 2: + err = sdp_search_hcrp(sdp, &ctrl_psm, &data_psm); + break; + default: + proto = 2; + err = sdp_search_hcrp(sdp, &ctrl_psm, &data_psm); + if (err) { + proto = 1; + err = sdp_search_spp(sdp, &channel); + } + break; + } + + sdp_close(sdp); + + if (err) { + fprintf(stderr, "ERROR: Can't get service information\n"); + return 1; + } + + switch (proto) { + case 1: + err = spp_print(BDADDR_ANY, &bdaddr, channel, fd, copies); + break; + case 2: + err = hcrp_print(BDADDR_ANY, &bdaddr, ctrl_psm, data_psm, fd, copies); + break; + default: + err = 1; + fprintf(stderr, "ERROR: Unsupported protocol\n"); + break; + } + + if (fd != 0) + close(fd); + + if (!err) + fprintf(stderr, "INFO: Ready to print\n"); + + return err; +} |