File: printer-io.c

package info (click to toggle)
libinklevel 0.9.7-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,840 kB
  • sloc: sh: 4,488; ansic: 4,422; python: 44; makefile: 26
file content (138 lines) | stat: -rw-r--r-- 3,304 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/* printer-io.c
 *
 * (c) 2014, 2015, 2018, 2022 Markus Heinz
 *
 * This software is licensed under the terms of the GPL.
 * For details see file COPYING.
 */

#include "config.h"

#include <libusb.h>
#include "libusb-utils.h"

#include <stdio.h>

#include "printer-io.h"
#include "devices.h"
#include "inklevel.h"
#include "util.h"

#include <unistd.h>

/*
 * Open the needed connection to the printer. The connection details are stored
 * in the passed struct. If the connection can be established the connection is
 * stored in the passed struct for future reference.
 *
 * Returns PRINTER_SUCCESS or PRINTER_FAILURE.
 */
int open_wrapper(printer_descriptor *desc) {

  desc->mode = PRINTER_MODE_DEVICE;

  if (desc->port == USB) {
    desc->mode = PRINTER_MODE_LIBUSB;
  }

  if (desc->mode == PRINTER_MODE_LIBUSB) {
    if (init_usb() == USB_SUCCESS) {
      usb_printer *printer = find_printer(desc->portnumber);

      if (printer != NULL) {
	desc->printer = printer;

	if (open_device_handle(printer) == USB_SUCCESS) {
	  return PRINTER_SUCCESS;
	} else {
	  return PRINTER_FAILURE;
	}
      } else {
	return PRINTER_FAILURE;
      }
    }
  }
  
  return PRINTER_FAILURE;
}

/*
 * Closes the connection to the printer specified by the passed struct.
 *
 * Returns PRINTER_SUCCESS or PRINTER_FAILURE.
 */
int close_wrapper(printer_descriptor *desc) {

  if (desc->mode == PRINTER_MODE_LIBUSB) {
    if (desc->printer != NULL) {
      
      int result = release_device_handle(desc->printer);

      shutdown_usb();

      if (result == USB_SUCCESS) {
	return PRINTER_SUCCESS;
      } else {
	return PRINTER_FAILURE;
      }

    } else {

#ifdef DEBUG
      printf("printer handle is NULL\n");
#endif
      
      shutdown_usb();
      return PRINTER_FAILURE;
    }
  }

  return PRINTER_FAILURE;
}

/*
 * Tries to read bufsize characters from the printer specified by desc into
 * buffer. The actual number of read characters will be stored in transfered.
 *
 * The nonblocking parameter only comes into effect when device node based 
 * communication is performed. Libusb based reads are always nonblocking.
 *
 * Returns PRINTER_SUCCESS or PRINTER_FAILURE.
 */ 
int read_wrapper(printer_descriptor *desc, char *buffer, 
		 size_t bufsize, int *transfered, int nonblocking) {

  if (desc->mode == PRINTER_MODE_LIBUSB && desc->printer != NULL) {
    int result = bulk_transfer(desc->printer->handle, 
                               desc->printer->read_endp, buffer, bufsize, 
                               transfered);

    if (result == USB_SUCCESS) {
      return PRINTER_SUCCESS;
    }
  }

  return PRINTER_FAILURE;
}

/* 
 * Tries to write bufsize characters to the printer specified by desc stored in
 * buffer.  The actual number of written characters will be stored in 
 * transfered.
 * 
 * Returns PRINTER_SUCCESS or PRINTER_FAILURE.
 */
int write_wrapper(printer_descriptor *desc, char *buffer, 
		  size_t bufsize, int *transfered) {
  if (desc->mode == PRINTER_MODE_LIBUSB && desc->printer != NULL) {
    int result = bulk_transfer(desc->printer->handle, 
                               desc->printer->write_endp, buffer, bufsize, 
                               transfered);

    if (result == USB_SUCCESS) {
      return PRINTER_SUCCESS;
    }
  }
  
  return PRINTER_FAILURE;
}