ffi-cups 0.1.9 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2cd36e5fc525b811e3fedc0ef3b015aa47e04cf93528510a539ae3562a0e0357
4
- data.tar.gz: ca00e58337c11b4291dc1debd2908e21e3bb772d4127779fc28937043fd77aa6
3
+ metadata.gz: 7522a8f004aef5162693ba55306f59971b2ab415210574b2bd9f64ed5b38e108
4
+ data.tar.gz: 54631757a4c36c0bfcc97d02e17a4f105d1cbd71562c816305bf8b7856448840
5
5
  SHA512:
6
- metadata.gz: 2f751bb3648d4b66926dc962a469f6446de032c0d309892ff8defae327051c5425bdb54ad7bf52f557e11d4f03e120269abc63b17a0091ac47652042e6350bfa
7
- data.tar.gz: 5726071fba04a620382afc78954c3f0790c496befdecc0cad3a3c8327cf440c4fd9f68e03a96d695fa6c2ef737bbcdb709f49cbe89889feb7eaa20292b1c2f14
6
+ metadata.gz: 1019c7ca45a16385c847b756052adbd2c5d0cef20149ec642e14428af3fe2aa20b3e58932e1da2a9b7bd69f5a62b0aea652905fc3aef67da65f3bab2ef4bba63
7
+ data.tar.gz: 6d17ccd12bc7449f92ce2dd6b9f4f02d0a2fcb277836984651ae8a05bbef6c8f3d878eb7ad732cdcb91935e89db759f7211ff704dc3f91c63124295a2b12deef
data/README.md CHANGED
@@ -1,31 +1,18 @@
1
- # ffi-cups
1
+ # FFI-Cups
2
2
  [![Gem Version](https://badge.fury.io/rb/ffi-cups.svg)](https://badge.fury.io/rb/ffi-cups)
3
3
 
4
- ffi-cups is a FFI wrapper around libcups providing access to the Cups API.
5
- It was written using Ruby 2.7.0.
4
+ ffi-cups is a FFI bindings for libcups providing access to the Cups API through Ruby.
6
5
 
7
- ## About
8
- This is a complete rewrite of the cupsffi gem, it will deprecate
9
- functions deprecated by the CUPS API, if you wish to continue to use them,
10
- use the cupsffi gem.
11
-
12
- ## Authors
13
- - Hugo Marquez @ www.hugomarquez.mx
14
- - Contributors @ https://github.com/hugomarquez/ffi-cups/graphs/contributors
6
+ CUPS is the standards-based, open source printing system developed by Apple Inc. for macOS® and other UNIX®-like operating systems. CUPS uses the Internet Printing Protocol (IPP) to support printing to local and network printers. - from http://www.cups.org/
15
7
 
16
8
  ## Installation
17
9
  ```bash
18
10
  gem install ffi-cups
19
11
  ```
20
12
 
21
- ## Setup
13
+ ## Setup & Requirements
22
14
  ffi-cups requires libcups2 to be installed
23
15
 
24
- ## TODO
25
- - Job's state
26
- - Cancel jobs
27
- - Get all jobs with filters
28
-
29
16
  ## Example usage
30
17
  ```ruby
31
18
  require 'ffi-cups'
@@ -48,12 +35,23 @@ printer.state_reasons
48
35
  # Print a file (PDF, JPG, etc) you can pass a hash of printing options if you
49
36
  # want to override the printer's default. See Cups::Constants for more options
50
37
  options = {
51
- Cups::CUPS_MEDIA => Cups::CUPS_MEDIA_A4,
52
- Cups::CUPS_ORIENTATION => Cups::CUPS_ORIENTATION_LANDSCAPE
38
+ Cups::MEDIA => Cups::MEDIA_A4,
39
+ Cups::ORIENTATION => Cups::ORIENTATION_LANDSCAPE
53
40
  }
54
41
 
55
42
  job = printer.print_file('/tmp/example.jpg', 'Title', options)
43
+ # <Cups::Job:0x000055c87104d1e0 @id=10, @title="README", @printer="Virtual_PDF_Printer", @format="text/plain", @state=:processing, @size=4, @completed_time=1969-12-31 18:00:00 -0600, @creation_time=2021-04-18 17:35:04 -0500, @processing_time=2021-04-18 17:35:04 -0500>
44
+
45
+ # Get all jobs from a printer
46
+ jobs = Cups::Job.get_jobs('Virtual_PDF_Printer')
47
+ # [#<Cups::Job:0x0000563aa6359008 @id=1, @title="Test Print", @printer="Virtual_PDF_Printer", @format="text/plain", @state=:completed, @size=1, @completed_time=2021-04-08 07:06:23 -0500, @creation_time=2021-04-08 07:06:18 -0500, @processing_time=2021-04-08 07:06:18 -0500>, ...]
48
+
49
+ # filtering job's query, see Constants file for more options
50
+ jobs = Cups::Job.get_jobs('Virtual_PDF_Printer', Cups::WHICHJOBS_ACTIVE)
56
51
 
52
+ # Query job with id and printer's name
53
+ job = Cups::Job.get_job(10, 'Virtual_PDF_Printer')
54
+ # <Cups::Job:0x000055c870fc8490 @id=10, @title="README", @printer="Virtual_PDF_Printer", @format="text/plain", @state=:completed, @size=4, @completed_time=2021-04-18 17:35:04 -0500, @creation_time=2021-04-18 17:35:04 -0500, @processing_time=2021-04-18 17:35:04 -0500>
57
55
  ```
58
56
 
59
57
  ## Remote CUPS Server
@@ -61,17 +59,23 @@ You may create a connection object passing a :hostname and/or :port arguments.
61
59
 
62
60
  ```ruby
63
61
  # Create a Connection object with hostname and/or port
64
- connection = Cups::Connection.instance('print.example.com')
62
+ connection = Cups::Connection.new('print.example.com')
65
63
 
66
64
  # Get all printers from the remote connection
67
65
  remote_printers = Cups::Printer.get_destinations(connection)
68
-
69
66
  ```
70
67
 
68
+ ## Documentation
69
+ Check out the documentation - [docs](https://www.rubydoc.info/gems/ffi-cups/0.2.1)
70
+
71
+ ## Authors
72
+ - Hugo Marquez @ www.hugomarquez.mx
73
+ - Contributors @ https://github.com/hugomarquez/ffi-cups/graphs/contributors
74
+
71
75
  ## License
72
76
  The MIT License
73
77
 
74
- Copyright (c) 2021 Hugo Marquez & Contributors
78
+ Copyright (c) 2022 Hugo Marquez & Contributors
75
79
 
76
80
  Permission is hereby granted, free of charge, to any person obtaining a copy
77
81
  of this software and associated documentation files (the "Software"), to deal
@@ -3,54 +3,36 @@ module Cups
3
3
  extend Gem::Deprecate
4
4
 
5
5
  attr_accessor :hostname, :port
6
-
7
- @instance_mutex = Mutex.new
8
-
9
- private_class_method :new
10
6
 
11
7
  def initialize(hostname, port=nil)
12
8
  @hostname = hostname
13
9
  @port = port.nil? ? 631 : port
14
10
  end
15
-
16
- # Returns or creates a singleton instance
17
- # @param hostname [String]
18
- # @param port [Integer]
19
- # @return [Object] a connection object
20
- def self.instance(hostname, port=nil)
21
- return @instance if @instance
22
-
23
- @instance_mutex.synchronize do
24
- @instance ||= new(hostname, port)
25
- end
26
-
27
- @instance
28
- end
29
-
30
- # Wrapper around {::FFI::Cups::Http#httpConnectEncrypt}
11
+
12
+ # Wrapper around {::Cups::Http#httpConnectEncrypt}
31
13
  # @deprecated Use {#httpConnect2} instead
32
14
  # @return [Pointer] a http pointer
33
15
  def httpConnectEncrypt
34
- http = FFI::Cups::Http.httpConnectEncrypt(hostname, port, FFI::Cups.cupsEncryption())
16
+ http = Cups::Http.httpConnectEncrypt(hostname, port, Cups.cupsEncryption())
35
17
  raise "Print server at #{hostname}:#{port} is not available" if http.null?
36
18
  return http
37
19
  end
38
20
  deprecate :httpConnectEncrypt, "This function is deprecated by CUPS, please use httpConnect2 instead", 2025, 12
39
21
 
40
- # Wrapper around {::FFI::Cups::Http#httpConnect2}
22
+ # Wrapper around {::Cups::Http#httpConnect2}
41
23
  # Creates a http connection to a print server
42
24
  # @return [Pointer] a http pointer
43
25
  def httpConnect2
44
- http = FFI::Cups::Http.httpConnect2(hostname, port, nil, 0, FFI::Cups.cupsEncryption(), 1, 30000, nil)
26
+ http = Cups::Http.httpConnect2(hostname, port, nil, 0, Cups.cupsEncryption(), 1, 30000, nil)
45
27
  raise "Print server at #{hostname}:#{port} is not available" if http.null?
46
28
  return http
47
29
  end
48
30
 
49
31
  # Closes the http connection and autoreleases the pointer
50
- # Wrapper around {::FFI::Cups::Http#httpClose}
32
+ # Wrapper around {::Cups::Http#httpClose}
51
33
  # @param http (Pointer)
52
34
  def self.close(http)
53
- FFI::Cups::Http.httpClose(http)
35
+ Cups::Http.httpClose(http)
54
36
  end
55
37
  end
56
38
  end
@@ -1,95 +1,95 @@
1
1
  module Cups
2
2
  # cups.h
3
- CUPS_FORMAT_JPEG = "image/jpeg"
4
- CUPS_FORMAT_PDF = "application/pdf"
5
- CUPS_FORMAT_TEXT = "text/plain"
6
- CUPS_JOBID_ALL = -1
7
- CUPS_WHICHJOBS_ALL = -1
8
- CUPS_WHICHJOBS_ACTIVE = 0
9
- CUPS_WHICHJOBS_COMPLETED = 1
10
- CUPS_HTTP_DEFAULT = nil
3
+ FORMAT_JPEG = "image/jpeg"
4
+ FORMAT_PDF = "application/pdf"
5
+ FORMAT_TEXT = "text/plain"
6
+ JOBID_ALL = -1
7
+ WHICHJOBS_ALL = -1
8
+ WHICHJOBS_ACTIVE = 0
9
+ WHICHJOBS_COMPLETED = 1
10
+ HTTP_DEFAULT = nil
11
11
 
12
12
  # Options and Values
13
- CUPS_COPIES = "copies"
14
- CUPS_COPIES_SUPPORTED = "copies-supported"
15
-
16
- CUPS_FINISHINGS = "CUPS_FINISHINGS"
17
- CUPS_FINISHINGS_SUPPORTED = "finishings-supported"
18
-
19
- CUPS_FINISHINGS_BIND = "7"
20
- CUPS_FINISHINGS_COVER = "6"
21
- CUPS_FINISHINGS_FOLD = "10"
22
- CUPS_FINISHINGS_NONE = "3"
23
- CUPS_FINISHINGS_PUNCH = "5"
24
- CUPS_FINISHINGS_STAPLE = "4"
25
- CUPS_FINISHINGS_TRIM = "11"
13
+ COPIES = "copies"
14
+ COPIES_SUPPORTED = "copies-supported"
26
15
 
27
- CUPS_MEDIA = "media"
28
- CUPS_MEDIA_READY = "media-ready"
29
- CUPS_MEDIA_SUPPORTED = "media-supported"
30
-
31
- CUPS_MEDIA_3X5 = "na_index-3x5_3x5in"
32
- CUPS_MEDIA_4X6 = "na_index-4x6_4x6in"
33
- CUPS_MEDIA_5X7 = "na_5x7_5x7in"
34
- CUPS_MEDIA_8X10 = "na_govt-letter_8x10in"
35
- CUPS_MEDIA_A3 = "iso_a3_297x420mm"
36
- CUPS_MEDIA_A4 = "iso_a4_210x297mm"
37
- CUPS_MEDIA_A5 = "iso_a5_148x210mm"
38
- CUPS_MEDIA_A6 = "iso_a6_105x148mm"
39
- CUPS_MEDIA_ENV10 = "na_number-10_4.125x9.5in"
40
- CUPS_MEDIA_ENVDL = "iso_dl_110x220mm"
41
- CUPS_MEDIA_LEGAL = "na_legal_8.5x14in"
42
- CUPS_MEDIA_LETTER = "na_letter_8.5x11in"
43
- CUPS_MEDIA_PHOTO_L = "oe_photo-l_3.5x5in"
44
- CUPS_MEDIA_SUPERBA3 = "na_super-b_13x19in"
45
- CUPS_MEDIA_TABLOID = "na_ledger_11x17in"
46
-
47
- CUPS_MEDIA_SOURCE = "media-source"
48
- CUPS_MEDIA_SOURCE_SUPPORTED = "media-source-supported"
49
-
50
- CUPS_MEDIA_SOURCE_AUTO = "auto"
51
- CUPS_MEDIA_SOURCE_MANUAL = "manual"
52
-
53
- CUPS_MEDIA_TYPE = "media-type"
54
- CUPS_MEDIA_TYPE_SUPPORTED = "media-type-supported"
55
-
56
- CUPS_MEDIA_TYPE_AUTO = "auto"
57
- CUPS_MEDIA_TYPE_ENVELOPE = "envelope"
58
- CUPS_MEDIA_TYPE_LABELS = "labels"
59
- CUPS_MEDIA_TYPE_LETTERHEAD = "stationery-letterhead"
60
- CUPS_MEDIA_TYPE_PHOTO = "photographic"
61
- CUPS_MEDIA_TYPE_PHOTO_GLOSSY = "photographic-glossy"
62
- CUPS_MEDIA_TYPE_PHOTO_MATTE = "photographic-matte"
63
- CUPS_MEDIA_TYPE_PLAIN = "stationery"
64
- CUPS_MEDIA_TYPE_TRANSPARENCY = "transparency"
65
-
66
- CUPS_NUMBER_UP = "number-up"
67
- CUPS_NUMBER_UP_SUPPORTED = "number-up-supported"
68
-
69
- CUPS_ORIENTATION = "orientation-requested"
70
- CUPS_ORIENTATION_SUPPORTED = "orientation-requested-supported"
71
-
72
- CUPS_ORIENTATION_PORTRAIT = "3"
73
- CUPS_ORIENTATION_LANDSCAPE = "4"
74
-
75
- CUPS_PRINT_COLOR_MODE = "print-color-mode"
76
- CUPS_PRINT_COLOR_MODE_SUPPORTED = "print-color-mode-supported"
77
-
78
- CUPS_PRINT_COLOR_MODE_AUTO = "auto"
79
- CUPS_PRINT_COLOR_MODE_MONOCHROME = "monochrome"
80
- CUPS_PRINT_COLOR_MODE_COLOR = "color"
81
-
82
- CUPS_PRINT_QUALITY = "print-quality"
83
- CUPS_PRINT_QUALITY_SUPPORTED = "print-quality-supported"
84
-
85
- CUPS_PRINT_QUALITY_DRAFT = "3"
86
- CUPS_PRINT_QUALITY_NORMAL = "4"
87
- CUPS_PRINT_QUALITY_HIGH = "5"
88
-
89
- CUPS_SIDES = "sides"
90
- CUPS_SIDES_SUPPORTED = "sides-supported"
91
-
92
- CUPS_SIDES_ONE_SIDED = "one-sided"
93
- CUPS_SIDES_TWO_SIDED_PORTRAIT = "two-sided-long-edge"
94
- CUPS_SIDES_TWO_SIDED_LANDSCAPE = "two-sided-short-edge"
16
+ FINISHINGS = "CUPS_FINISHINGS"
17
+ FINISHINGS_SUPPORTED = "finishings-supported"
18
+ FINISHINGS_BIND = "7"
19
+ FINISHINGS_COVER = "6"
20
+ FINISHINGS_FOLD = "10"
21
+ FINISHINGS_NONE = "3"
22
+ FINISHINGS_PUNCH = "5"
23
+ FINISHINGS_STAPLE = "4"
24
+ FINISHINGS_TRIM = "11"
25
+
26
+ # MEDIA
27
+ MEDIA = "media"
28
+ MEDIA_READY = "media-ready"
29
+ MEDIA_SUPPORTED = "media-supported"
30
+
31
+ MEDIA_3X5 = "na_index-3x5_3x5in"
32
+ MEDIA_4X6 = "na_index-4x6_4x6in"
33
+ MEDIA_5X7 = "na_5x7_5x7in"
34
+ MEDIA_8X10 = "na_govt-letter_8x10in"
35
+ MEDIA_A3 = "iso_a3_297x420mm"
36
+ MEDIA_A4 = "iso_a4_210x297mm"
37
+ MEDIA_A5 = "iso_a5_148x210mm"
38
+ MEDIA_A6 = "iso_a6_105x148mm"
39
+ MEDIA_ENV10 = "na_number-10_4.125x9.5in"
40
+ MEDIA_ENVDL = "iso_dl_110x220mm"
41
+ MEDIA_LEGAL = "na_legal_8.5x14in"
42
+ MEDIA_LETTER = "na_letter_8.5x11in"
43
+ MEDIA_PHOTO_L = "oe_photo-l_3.5x5in"
44
+ MEDIA_SUPERBA3 = "na_super-b_13x19in"
45
+ MEDIA_TABLOID = "na_ledger_11x17in"
46
+
47
+ MEDIA_SOURCE = "media-source"
48
+ MEDIA_SOURCE_SUPPORTED = "media-source-supported"
49
+
50
+ MEDIA_SOURCE_AUTO = "auto"
51
+ MEDIA_SOURCE_MANUAL = "manual"
52
+
53
+ MEDIA_TYPE = "media-type"
54
+ MEDIA_TYPE_SUPPORTED = "media-type-supported"
55
+
56
+ MEDIA_TYPE_AUTO = "auto"
57
+ MEDIA_TYPE_ENVELOPE = "envelope"
58
+ MEDIA_TYPE_LABELS = "labels"
59
+ MEDIA_TYPE_LETTERHEAD = "stationery-letterhead"
60
+ MEDIA_TYPE_PHOTO = "photographic"
61
+ MEDIA_TYPE_PHOTO_GLOSSY = "photographic-glossy"
62
+ MEDIA_TYPE_PHOTO_MATTE = "photographic-matte"
63
+ MEDIA_TYPE_PLAIN = "stationery"
64
+ MEDIA_TYPE_TRANSPARENCY = "transparency"
65
+
66
+ NUMBER_UP = "number-up"
67
+ NUMBER_UP_SUPPORTED = "number-up-supported"
68
+
69
+ ORIENTATION = "orientation-requested"
70
+ ORIENTATION_SUPPORTED = "orientation-requested-supported"
71
+
72
+ ORIENTATION_PORTRAIT = "3"
73
+ ORIENTATION_LANDSCAPE = "4"
74
+
75
+ PRINT_COLOR_MODE = "print-color-mode"
76
+ PRINT_COLOR_MODE_SUPPORTED = "print-color-mode-supported"
77
+
78
+ PRINT_COLOR_MODE_AUTO = "auto"
79
+ PRINT_COLOR_MODE_MONOCHROME = "monochrome"
80
+ PRINT_COLOR_MODE_COLOR = "color"
81
+
82
+ PRINT_QUALITY = "print-quality"
83
+ PRINT_QUALITY_SUPPORTED = "print-quality-supported"
84
+
85
+ PRINT_QUALITY_DRAFT = "3"
86
+ PRINT_QUALITY_NORMAL = "4"
87
+ PRINT_QUALITY_HIGH = "5"
88
+
89
+ SIDES = "sides"
90
+ SIDES_SUPPORTED = "sides-supported"
91
+
92
+ SIDES_ONE_SIDED = "one-sided"
93
+ SIDES_TWO_SIDED_PORTRAIT = "two-sided-long-edge"
94
+ SIDES_TWO_SIDED_LANDSCAPE = "two-sided-short-edge"
95
95
  end
@@ -1,8 +1,8 @@
1
- module FFI::Cups
1
+ module Cups
2
2
  module Array
3
3
  extend FFI::Library
4
4
 
5
- ffi_lib('cups')
5
+ ffi_lib(Cups.libcups)
6
6
 
7
7
  # @overload cupsArrayFirst(pointer)
8
8
  # @param pointer [Pointer] to _cups_array_s struct
@@ -2,11 +2,11 @@
2
2
  # {https://www.cups.org/doc/cupspm.html Programming Manual}
3
3
  # {https://github.com/apple/cups/blob/master/cups/cups.h cups.h source}
4
4
 
5
- module FFI::Cups
5
+ module Cups
6
6
  extend FFI::Library
7
-
8
- ffi_lib('cups')
9
7
 
8
+ ffi_lib(Cups.libcups)
9
+
10
10
  # Get the current encryption settings.
11
11
  # @return [Integer] encryption settings
12
12
  # {https://www.cups.org/doc/cupspm.html#cupsEncryption}
@@ -94,14 +94,17 @@ module FFI::Cups
94
94
  # @overload cupsCancelJob(string, int)
95
95
  # @param name [String] of the destination
96
96
  # @param id [Ingeger] of the job
97
- attach_function 'cupsCancelJob', [:string, :int], :void, blocking: true
97
+ # @return [Integer] 1 if canceled, 0 otherwise
98
+ attach_function 'cupsCancelJob', [:string, :int], :int, blocking: true
98
99
 
99
100
  # Cancel a job on a destination
100
101
  # @overload cupsCancelJob2(pointer, string, int)
101
102
  # @param pointer [Pointer] of the http connection
102
103
  # @param name [String] of the destination
103
104
  # @param id [Ingeger] of the job
104
- attach_function 'cupsCancelJob2', [:pointer, :string, :int], :void, blocking: true
105
+ # @param purge [Integer] 1 to purge, 0 to cancel
106
+ # @return [Enum] Cups::Enun::IPP::Status
107
+ attach_function 'cupsCancelJob2', [:pointer, :string, :int, :int], Cups::Enum::IPP::Status, blocking: true
105
108
 
106
109
  # Get the jobs from a connection
107
110
  # @overload cupsGetJobs2(pointer, pointer, string, int, int)
@@ -1,8 +1,8 @@
1
- module FFI::Cups
1
+ module Cups
2
2
  module Http
3
3
  extend FFI::Library
4
-
5
- ffi_lib('cups')
4
+
5
+ ffi_lib(Cups.libcups)
6
6
 
7
7
  # @overload httpConnectEncrypt(string, int, int)
8
8
  # @param hostname [String]
@@ -30,7 +30,7 @@ module FFI::Cups
30
30
  # @param port [Integer]
31
31
  # @param addrlist [Pointer] can be NULL
32
32
  # @param family [Integer] (AF_UNSPEC=0)
33
- # @param encryption_settings [Integer] from FFI::Cups.cupsEncryption()
33
+ # @param encryption_settings [Integer] from Cups.cupsEncryption()
34
34
  # @param blocking [Integer]
35
35
  # @param msec [Integer] use 5000 or less
36
36
  # @param cancel[Pointer] integer pointer, can be NULL
data/lib/ffi-cups/job.rb CHANGED
@@ -1,11 +1,89 @@
1
1
  module Cups
2
2
  class Job
3
- attr_reader :id, :title, :printer
4
- def initialize(id, title, printer=nil)
3
+ attr_accessor :id, :title, :printer,
4
+ :format, :state, :size, :completed_time,
5
+ :creation_time, :processing_time
6
+
7
+ def initialize(id, title, printer)
5
8
  @id = id
6
9
  @title = title
7
10
  @printer = printer
8
11
  end
12
+
13
+ # get a updated job's state
14
+ # @param connection [Cups::Connection]
15
+ # @return [Symbol] job's state
16
+ def status(connection=nil)
17
+ job = self.class.get_job(@id, @printer, -1, connection)
18
+ self.state = job.state if job
19
+ end
20
+
21
+ # Cancel or purge a job
22
+ # @param connection [Cups::Connection]
23
+ def cancel(purge=0, connection=nil)
24
+ job = self.class.get_job(@id, @printer, -1, connection)
25
+ r = Cups.cupsCancelJob2(connection, @printer, @id, purge)
26
+ raise Cups.cupsLastErrorString() if r == 0
27
+ return r
28
+ end
29
+
30
+ # Get jobs by filter or destination name
31
+ # @param name [String]
32
+ # @param filter [Integer] see Constants
33
+ # @param connection [Cups::Connection]
34
+ # @return [Array] jobs
35
+ def self.get_jobs(name=nil, filter=-1, connection=nil)
36
+ p_jobs = FFI::MemoryPointer.new :pointer
37
+ cups_jobs = cupsGetJobs2(p_jobs, name, filter, connection)
38
+ jobs = []
39
+ cups_jobs.each do |j|
40
+ job = Cups::Job.new(j[:id].dup, j[:title].dup, j[:dest].dup)
41
+ job.format = j[:format]
42
+ job.state = j[:state]
43
+ job.size = j[:size]
44
+ job.completed_time = Time.at(j[:completed_time])
45
+ job.creation_time = Time.at(j[:creation_time])
46
+ job.processing_time = Time.at(j[:processing_time])
47
+ jobs.push(job)
48
+ end
49
+ return jobs
50
+ end
51
+
52
+ # Get job from id
53
+ # @param id [Integer]
54
+ # @param name [String]
55
+ # @param filter [Integer] see Constants
56
+ # @param connection [Cups::Connection]
57
+ # @return [Job] job object
58
+ def self.get_job(id, name=nil, filter=-1, connection=nil)
59
+ jobs = get_jobs(name, filter, connection)
60
+ jobs.each do |j|
61
+ return j if j.id == id
62
+ end
63
+ raise "Job with id: #{id} not found!"
64
+ end
65
+
66
+ private
67
+ # Wrapper {::Cups#cupsGetJobs2}
68
+ # @param pointer [Pointer] pointer to the jobs
69
+ # @param name [String] name of the destination or NULL
70
+ # @param filter [Integer] see Constants for more filters
71
+ # @param connection [Cups::Connection]
72
+ # @return [Array] array of job structs
73
+ def self.cupsGetJobs2(pointer, name=nil, filter=-1, connection=nil)
74
+ http = connection.nil? ? nil : connection.httpConnect2
75
+ num_jobs = Cups.cupsGetJobs2(http, pointer, name, 0, filter)
76
+ size = Cups::Struct::Job.size
77
+ jobs = []
78
+
79
+ num_jobs.times do |i|
80
+ job = Cups::Struct::Job.new(pointer.get_pointer(0) + (size * i))
81
+ jobs.push(job)
82
+ end
83
+
84
+ Cups::Connection.close(http) if http
85
+ return jobs
86
+ end
9
87
  end
10
88
  end
11
89
 
@@ -17,7 +17,7 @@ module Cups
17
17
  when '3' then :idle
18
18
  when '4' then :printing
19
19
  when '5' then :stopped
20
- else :unkown
20
+ else :unknown
21
21
  end
22
22
  end
23
23
 
@@ -33,10 +33,10 @@ module Cups
33
33
  http = @connection.nil? ? nil : @connection.httpConnect2
34
34
  # Get all destinations with cupsGetDests2
35
35
  dests = FFI::MemoryPointer.new :pointer
36
- num_dests = FFI::Cups.cupsGetDests2(http, dests)
36
+ num_dests = Cups.cupsGetDests2(http, dests)
37
37
 
38
38
  # Get the destination from name with cupsGetDest
39
- p_dest = FFI::Cups.cupsGetDest(@name, nil, num_dests, dests.get_pointer(0))
39
+ p_dest = Cups.cupsGetDest(@name, nil, num_dests, dests.get_pointer(0))
40
40
  dest = Cups::Struct::Destination.new(p_dest)
41
41
  raise "Destination with name: #{@name} not found!" if dest.null?
42
42
 
@@ -48,19 +48,20 @@ module Cups
48
48
  unless self.class.cupsCheckDestSupported(p_dest, k, v, http)
49
49
  raise "Option:#{k} #{v if v} not supported for printer: #{@name}"
50
50
  end
51
- num_options = FFI::Cups.cupsAddOption(k, v, num_options, p_options)
51
+ num_options = Cups.cupsAddOption(k, v, num_options, p_options)
52
52
  end
53
53
  p_options = p_options.get_pointer(0)
54
54
  end
55
55
 
56
- job_id = FFI::Cups.cupsPrintFile2(http, @name, filename, title, num_options, p_options)
57
- job = Cups::Job.new(job_id, title, self)
56
+ job_id = Cups.cupsPrintFile2(http, @name, filename, title, num_options, p_options)
58
57
 
59
58
  if job_id.zero?
60
59
  last_error = Cups.cupsLastErrorString()
61
60
  self.class.cupsFreeOptions(num_options, p_options) unless options.empty?
62
61
  raise last_error
63
62
  end
63
+ #job = Cups::Job.new(job_id, title, @name)
64
+ job = Cups::Job.get_job(job_id, @name, 0, @connection)
64
65
 
65
66
  self.class.cupsFreeOptions(num_options, p_options) unless options.empty?
66
67
  self.class.cupsFreeDests(num_dests, dests)
@@ -90,10 +91,10 @@ module Cups
90
91
  http = connection.nil? ? nil : connection.httpConnect2
91
92
  # Get all destinations with cupsGetDests2
92
93
  dests = FFI::MemoryPointer.new :pointer
93
- num_dests = FFI::Cups.cupsGetDests2(http, dests)
94
+ num_dests = Cups.cupsGetDests2(http, dests)
94
95
 
95
96
  # Get the destination from name with cupsGetDest
96
- p_dest = FFI::Cups.cupsGetDest(name, nil, num_dests, dests.get_pointer(0))
97
+ p_dest = Cups.cupsGetDest(name, nil, num_dests, dests.get_pointer(0))
97
98
  dest = Cups::Struct::Destination.new(p_dest)
98
99
  raise "Destination with name: #{name} not found!" if dest.null?
99
100
 
@@ -104,13 +105,13 @@ module Cups
104
105
  end
105
106
 
106
107
  private
107
- # Wrapper around {::FFI::Cups#cupsGetDests2}
108
+ # Wrapper around {::Cups#cupsGetDests2}
108
109
  # @param connection [Pointer] http pointer from {Cups::Connection#httpConnect2}
109
110
  # @param pointer [Pointer] pointer to the destinations
110
111
  # @return [Hash] hashmap of destination structs
111
112
  def self.cupsGetDests2(pointer, connection=nil)
112
113
  http = connection.nil? ? nil : connection.httpConnect2
113
- num_dests = FFI::Cups.cupsGetDests2(http, pointer)
114
+ num_dests = Cups.cupsGetDests2(http, pointer)
114
115
  size = Cups::Struct::Destination.size
115
116
  destinations = []
116
117
  num_dests.times do |i|
@@ -121,15 +122,15 @@ module Cups
121
122
  return destinations
122
123
  end
123
124
 
124
- # Wrapper around {::FFI::Cups#cupsCheckDestSupported}
125
+ # Wrapper around {::Cups#cupsCheckDestSupported}
125
126
  # @param dest [Pointer] pointer to the destination
126
127
  # @param option [String]
127
128
  # @param value [String]
128
129
  # @param connection [Pointer] http pointer from {Cups::Connection#httpConnect2}
129
130
  # @return [Boolean] true if supported, false otherwise
130
131
  def self.cupsCheckDestSupported(dest, option, value, connection=nil)
131
- info = FFI::Cups.cupsCopyDestInfo(connection, dest)
132
- i = FFI::Cups.cupsCheckDestSupported(connection, dest, info, option, value)
132
+ info = Cups.cupsCopyDestInfo(connection, dest)
133
+ i = Cups.cupsCheckDestSupported(connection, dest, info, option, value)
133
134
  return !i.zero?
134
135
  end
135
136
 
@@ -159,18 +160,18 @@ module Cups
159
160
  return options
160
161
  end
161
162
 
162
- # Wrapper around {::FFI::Cups#cupsFreeDests}
163
+ # Wrapper around {::Cups#cupsFreeDests}
163
164
  # @param num_dests [Integer]
164
165
  # @param pointer [Pointer] pointer to the destinations
165
166
  def self.cupsFreeDests(num_dests, pointer)
166
- FFI::Cups.cupsFreeDests(num_dests, pointer.get_pointer(0))
167
+ Cups.cupsFreeDests(num_dests, pointer.get_pointer(0))
167
168
  end
168
169
 
169
- # Wrapper around {::FFI::Cups#cupsFreeOptions}
170
+ # Wrapper around {::Cups#cupsFreeOptions}
170
171
  # @param num_opts [Integer]
171
172
  # @param pointer [Pointer] pointer to the options
172
173
  def self.cupsFreeOptions(num_opts, pointer)
173
- FFI::Cups.cupsFreeOptions(num_opts, pointer)
174
+ Cups.cupsFreeOptions(num_opts, pointer)
174
175
  end
175
176
  end
176
177
  end
@@ -1,3 +1,3 @@
1
1
  module Cups
2
- VERSION = "0.1.9"
2
+ VERSION = "0.3.0"
3
3
  end
data/lib/ffi-cups.rb CHANGED
@@ -2,17 +2,16 @@ require 'ffi'
2
2
  require 'byebug'
3
3
 
4
4
  module Cups
5
- extend FFI::Library
6
5
 
7
- begin
6
+ # Custom or default path for libcups.so
7
+ def self.libcups
8
8
  if ENV['CUPS_LIB']
9
- ffi_lib(ENV['CUPS_LIB'])
9
+ ENV['CUPS_LIB']
10
10
  else
11
- ffi_lib('cups')
11
+ 'cups'
12
12
  end
13
- rescue LoadError => e
14
- raise LoadError, "Didn't find libcups on your system."
15
13
  end
14
+
16
15
  end
17
16
 
18
17
  # Constants
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffi-cups
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hugo Marquez
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2021-04-18 00:00:00.000000000 Z
12
+ date: 2022-07-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi
@@ -75,7 +75,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
75
75
  - !ruby/object:Gem::Version
76
76
  version: '0'
77
77
  requirements: []
78
- rubygems_version: 3.1.2
78
+ rubygems_version: 3.1.6
79
79
  signing_key:
80
80
  specification_version: 4
81
81
  summary: FFI wrapper around libcups