cups 0.0.7 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/cups.c +105 -43
- data/ext/extconf.rb +8 -1
- data/ext/ruby_cups.h +0 -0
- data/lib/cups/print_job/transient.rb +0 -0
- data/lib/cups/printer/printer.rb +0 -0
- data/test/cups_test.rb +0 -0
- data/test/sample.txt +0 -0
- data/test/sample_blank.txt +0 -0
- metadata +32 -42
data/ext/cups.c
CHANGED
@@ -6,7 +6,6 @@ VALUE rubyCups, printJobs;
|
|
6
6
|
// Need to abstract this out of cups.c
|
7
7
|
VALUE ipp_state_to_symbol(int state)
|
8
8
|
{
|
9
|
-
|
10
9
|
VALUE jstate;
|
11
10
|
|
12
11
|
switch (state) {
|
@@ -58,6 +57,7 @@ static VALUE job_init(int argc, VALUE* argv, VALUE self)
|
|
58
57
|
rb_scan_args(argc, argv, "12", &filename, &printer, &job_options);
|
59
58
|
|
60
59
|
rb_iv_set(self, "@filename", filename);
|
60
|
+
rb_iv_set(self, "@url_path", rb_str_new2(cupsServer()));
|
61
61
|
|
62
62
|
if (NIL_P(job_options)) {
|
63
63
|
rb_iv_set(self, "@job_options", rb_hash_new());
|
@@ -110,55 +110,53 @@ static VALUE cups_print(VALUE self)
|
|
110
110
|
int job_id;
|
111
111
|
VALUE file = rb_iv_get(self, "@filename");
|
112
112
|
VALUE printer = rb_iv_get(self, "@printer");
|
113
|
+
VALUE url_path = rb_iv_get(self, "@url_path");
|
113
114
|
|
114
115
|
char *fname = RSTRING_PTR(file); // Filename
|
115
116
|
char *target = RSTRING_PTR(printer); // Target printer string
|
117
|
+
char *url = RSTRING_PTR(url_path); // Server URL address
|
118
|
+
int port = 631; // Default CUPS port
|
119
|
+
|
120
|
+
VALUE job_options = rb_iv_get(self, "@job_options");
|
116
121
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
fclose(fp);
|
121
|
-
|
122
|
-
VALUE job_options = rb_iv_get(self, "@job_options");
|
123
|
-
|
124
|
-
// Create an array of the keys from the job_options hash
|
125
|
-
VALUE job_options_keys = rb_ary_new();
|
126
|
-
rb_hash_foreach(job_options, cups_keys_i, job_options_keys);
|
122
|
+
// Create an array of the keys from the job_options hash
|
123
|
+
VALUE job_options_keys = rb_ary_new();
|
124
|
+
rb_hash_foreach(job_options, cups_keys_i, job_options_keys);
|
127
125
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
// foreach option in the job options array
|
133
|
-
while (! NIL_P(iter = rb_ary_pop(job_options_keys))) {
|
126
|
+
VALUE iter;
|
127
|
+
int num_options = 0;
|
128
|
+
cups_option_t *options = NULL;
|
134
129
|
|
135
|
-
|
130
|
+
// foreach option in the job options array
|
131
|
+
while (! NIL_P(iter = rb_ary_pop(job_options_keys))) {
|
136
132
|
|
137
|
-
|
138
|
-
if (NIL_P(rb_check_string_type(iter)) || NIL_P(rb_check_string_type(value))) {
|
139
|
-
cupsFreeOptions(num_options, options);
|
140
|
-
rb_raise(rb_eTypeError, "job options is not string => string hash");
|
141
|
-
return Qfalse;
|
142
|
-
}
|
133
|
+
VALUE value = rb_hash_aref(job_options, iter);
|
143
134
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
135
|
+
// assert the key and value are strings
|
136
|
+
if (NIL_P(rb_check_string_type(iter)) || NIL_P(rb_check_string_type(value))) {
|
137
|
+
cupsFreeOptions(num_options, options);
|
138
|
+
rb_raise(rb_eTypeError, "job options is not string => string hash");
|
139
|
+
return Qfalse;
|
148
140
|
}
|
149
141
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
142
|
+
// convert to char pointers and add to cups optoins
|
143
|
+
char * iter_str = rb_string_value_ptr(&iter);
|
144
|
+
char * value_str = rb_string_value_ptr(&value);
|
145
|
+
cupsAddOption(iter_str, value_str, num_options++, &options);
|
146
|
+
}
|
155
147
|
|
156
|
-
|
157
|
-
|
158
|
-
// and if it doesn't...
|
159
|
-
rb_raise(rb_eRuntimeError, "Couldn't find file");
|
160
|
-
return Qfalse;
|
148
|
+
if(NIL_P(url)) {
|
149
|
+
url = cupsServer();
|
161
150
|
}
|
151
|
+
|
152
|
+
int encryption = (http_encryption_t)cupsEncryption();
|
153
|
+
http_t *http = httpConnectEncrypt (url, port, (http_encryption_t) encryption);
|
154
|
+
job_id = cupsPrintFile2(http, target, fname, "rCups", num_options, options); // Do it. "rCups" should be the filename/path
|
155
|
+
//
|
156
|
+
// cupsFreeOptions(num_options, options);
|
157
|
+
|
158
|
+
rb_iv_set(self, "@job_id", INT2NUM(job_id));
|
159
|
+
return Qtrue;
|
162
160
|
}
|
163
161
|
|
164
162
|
/*
|
@@ -178,6 +176,8 @@ static VALUE cups_show_dests(VALUE self)
|
|
178
176
|
VALUE destination = rb_str_new2(dest->name);
|
179
177
|
rb_ary_push(dest_list, destination); // Add this testination name to dest_list string
|
180
178
|
}
|
179
|
+
|
180
|
+
cupsFreeDests(num_dests, dests);
|
181
181
|
return dest_list;
|
182
182
|
}
|
183
183
|
|
@@ -194,6 +194,7 @@ static VALUE cups_get_default(VALUE self)
|
|
194
194
|
|
195
195
|
if (default_printer != NULL) {
|
196
196
|
VALUE def_p = rb_str_new2(default_printer);
|
197
|
+
|
197
198
|
return def_p;
|
198
199
|
}
|
199
200
|
// should return nil if no default printer is found!
|
@@ -309,7 +310,6 @@ static VALUE cups_get_job_state(VALUE self)
|
|
309
310
|
cupsFreeJobs(num_jobs, jobs);
|
310
311
|
|
311
312
|
jstate = ipp_state_to_symbol(job_state);
|
312
|
-
|
313
313
|
return jstate;
|
314
314
|
}
|
315
315
|
}
|
@@ -407,10 +407,69 @@ static VALUE cups_get_jobs(VALUE self, VALUE printer)
|
|
407
407
|
|
408
408
|
// Free job array
|
409
409
|
cupsFreeJobs(num_jobs, jobs);
|
410
|
-
|
411
410
|
return job_list;
|
412
411
|
}
|
413
412
|
|
413
|
+
/*
|
414
|
+
* call-seq:
|
415
|
+
* Cups.cancel_print(cups_id, printer_name) -> true or false
|
416
|
+
*
|
417
|
+
* Cancel the print job. Returns true if successful, false otherwise.
|
418
|
+
*/
|
419
|
+
static VALUE cups_cancel_print(int argc, VALUE* argv, VALUE self)
|
420
|
+
{
|
421
|
+
VALUE printer, job_id;
|
422
|
+
rb_scan_args(argc, argv, "20", &job_id, &printer);
|
423
|
+
|
424
|
+
if (NIL_P(job_id)) {
|
425
|
+
return Qfalse; // If @job_id is nil
|
426
|
+
} else { // Otherwise attempt to cancel
|
427
|
+
int job = NUM2INT(job_id);
|
428
|
+
char *target = RSTRING_PTR(printer); // Target printer string
|
429
|
+
int cancellation;
|
430
|
+
cancellation = cupsCancelJob(target, job);
|
431
|
+
|
432
|
+
return Qtrue;
|
433
|
+
}
|
434
|
+
}
|
435
|
+
|
436
|
+
/*
|
437
|
+
* call-seq:
|
438
|
+
* Cups.device_uri_for(printer_name) -> String
|
439
|
+
*
|
440
|
+
* Return uri for requested printer.
|
441
|
+
*/
|
442
|
+
static VALUE cups_get_device_uri(VALUE self, VALUE printer)
|
443
|
+
{
|
444
|
+
if (!printer_exists(printer))
|
445
|
+
{
|
446
|
+
rb_raise(rb_eRuntimeError, "The printer or destination doesn't exist!");
|
447
|
+
}
|
448
|
+
|
449
|
+
VALUE options_list;
|
450
|
+
http_t *http;
|
451
|
+
ipp_t *request;
|
452
|
+
ipp_t *response;
|
453
|
+
ipp_attribute_t *attr;
|
454
|
+
char uri[1024];
|
455
|
+
char *location;
|
456
|
+
char *name = RSTRING_PTR(printer);
|
457
|
+
|
458
|
+
request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
|
459
|
+
httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/printers/%s", name);
|
460
|
+
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
|
461
|
+
|
462
|
+
if ((response = cupsDoRequest(http, request, "/")) != NULL)
|
463
|
+
{
|
464
|
+
if((attr = ippFindAttribute(response, "device-uri", IPP_TAG_URI)) != NULL)
|
465
|
+
{
|
466
|
+
return rb_str_new2(attr->values[0].string.text);
|
467
|
+
}
|
468
|
+
ippDelete(response);
|
469
|
+
}
|
470
|
+
return Qtrue;
|
471
|
+
}
|
472
|
+
|
414
473
|
/*
|
415
474
|
* call-seq:
|
416
475
|
* Cups.options_for(name) -> Hash or nil
|
@@ -436,13 +495,12 @@ static VALUE cups_get_options(VALUE self, VALUE printer)
|
|
436
495
|
cups_dest_t *dest = cupsGetDest(printer_arg, NULL, num_dests, dests);
|
437
496
|
|
438
497
|
if (dest == NULL) {
|
439
|
-
cupsFreeDests(num_dests, dests);
|
498
|
+
cupsFreeDests(num_dests, dests);
|
440
499
|
return Qnil;
|
441
500
|
} else {
|
442
501
|
for(i =0; i< dest->num_options; i++) {
|
443
502
|
rb_hash_aset(options_list, rb_str_new2(dest->options[i].name), rb_str_new2(dest->options[i].value));
|
444
503
|
}
|
445
|
-
|
446
504
|
cupsFreeDests(num_dests, dests);
|
447
505
|
return options_list;
|
448
506
|
}
|
@@ -459,6 +517,7 @@ void Init_cups() {
|
|
459
517
|
// Cups::PrintJob Attributes
|
460
518
|
rb_define_attr(printJobs, "printer", 1, 0);
|
461
519
|
rb_define_attr(printJobs, "filename", 1, 0);
|
520
|
+
rb_define_attr(printJobs, "url_path", 1, 0);
|
462
521
|
rb_define_attr(printJobs, "job_id", 1, 0);
|
463
522
|
rb_define_attr(printJobs, "job_options", 1, 0);
|
464
523
|
|
@@ -476,5 +535,8 @@ void Init_cups() {
|
|
476
535
|
rb_define_singleton_method(rubyCups, "show_destinations", cups_show_dests, 0);
|
477
536
|
rb_define_singleton_method(rubyCups, "default_printer", cups_get_default, 0);
|
478
537
|
rb_define_singleton_method(rubyCups, "all_jobs", cups_get_jobs, 1);
|
538
|
+
rb_define_singleton_method(rubyCups, "cancel_print", cups_cancel_print, -1);
|
479
539
|
rb_define_singleton_method(rubyCups, "options_for", cups_get_options, 1);
|
480
|
-
|
540
|
+
rb_define_singleton_method(rubyCups, "device_uri_for", cups_get_device_uri, 1);
|
541
|
+
rb_define_singleton_method(rubyCups, "get_connection_for", cups_get_device_uri, 1);
|
542
|
+
}
|
data/ext/extconf.rb
CHANGED
@@ -5,11 +5,18 @@ unless have_library("cups") && find_executable("cups-config")
|
|
5
5
|
exit
|
6
6
|
end
|
7
7
|
|
8
|
+
def has_cups_1_6_installed?
|
9
|
+
puts 'cups version:'
|
10
|
+
puts `cups-config --version`
|
11
|
+
`cups-config --version`.scan(/1.6/).size > 0
|
12
|
+
end
|
13
|
+
|
8
14
|
cups_cflags = `cups-config --cflags`.chomp || ""
|
15
|
+
cups_cflags += ' -D_IPP_PRIVATE_STRUCTURES' if has_cups_1_6_installed?
|
9
16
|
cups_libs = `cups-config --libs`.chomp || ""
|
10
17
|
|
11
18
|
with_cflags(cups_cflags) {
|
12
19
|
with_ldflags(cups_libs) {
|
13
20
|
create_makefile("cups")
|
14
21
|
}
|
15
|
-
}
|
22
|
+
}
|
data/ext/ruby_cups.h
CHANGED
File without changes
|
File without changes
|
data/lib/cups/printer/printer.rb
CHANGED
File without changes
|
data/test/cups_test.rb
CHANGED
File without changes
|
data/test/sample.txt
CHANGED
File without changes
|
data/test/sample_blank.txt
CHANGED
File without changes
|
metadata
CHANGED
@@ -1,72 +1,62 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: cups
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 0
|
8
|
-
- 7
|
9
|
-
version: 0.0.7
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.5
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
7
|
+
authors:
|
8
|
+
- Tadej Murovec
|
9
|
+
- Ivan Turkovic
|
12
10
|
- Chris Mowforth
|
13
11
|
autorequire:
|
14
12
|
bindir: bin
|
15
13
|
cert_chain: []
|
16
|
-
|
17
|
-
date: 2010-11-12 00:00:00 +00:00
|
18
|
-
default_executable:
|
14
|
+
date: 2013-04-28 00:00:00.000000000 Z
|
19
15
|
dependencies: []
|
20
|
-
|
21
|
-
|
22
|
-
|
16
|
+
description: ! ' Ruby CUPS provides a wrapper for the Common UNIX Printing System,
|
17
|
+
allowing rubyists to perform basic tasks like printer discovery, job submission
|
18
|
+
& querying.
|
19
|
+
|
20
|
+
'
|
21
|
+
email:
|
22
|
+
- tadej.murovec@gmail.com
|
23
|
+
- me@ivanturkovic.com
|
23
24
|
- chris@mowforth.com
|
24
25
|
executables: []
|
25
|
-
|
26
|
-
extensions:
|
26
|
+
extensions:
|
27
27
|
- ext/extconf.rb
|
28
28
|
extra_rdoc_files: []
|
29
|
-
|
30
|
-
files:
|
31
|
-
- test/cups_test.rb
|
29
|
+
files:
|
32
30
|
- test/sample.txt
|
33
31
|
- test/sample_blank.txt
|
32
|
+
- test/cups_test.rb
|
34
33
|
- ext/cups.c
|
35
34
|
- ext/ruby_cups.h
|
36
35
|
- ext/extconf.rb
|
37
36
|
- lib/cups/print_job/transient.rb
|
38
37
|
- lib/cups/printer/printer.rb
|
39
|
-
|
40
|
-
homepage: http://cups.rubyforge.org/
|
38
|
+
homepage: https://github.com/m0wfo/cups
|
41
39
|
licenses: []
|
42
|
-
|
43
40
|
post_install_message:
|
44
41
|
rdoc_options: []
|
45
|
-
|
46
|
-
require_paths:
|
42
|
+
require_paths:
|
47
43
|
- lib
|
48
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
45
|
none: false
|
50
|
-
requirements:
|
51
|
-
- -
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
|
54
|
-
|
55
|
-
version: "0"
|
56
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ! '>='
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
51
|
none: false
|
58
|
-
requirements:
|
59
|
-
- -
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
|
62
|
-
- 0
|
63
|
-
version: "0"
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
64
56
|
requirements: []
|
65
|
-
|
66
57
|
rubyforge_project: cups
|
67
|
-
rubygems_version: 1.
|
58
|
+
rubygems_version: 1.8.23
|
68
59
|
signing_key:
|
69
60
|
specification_version: 3
|
70
61
|
summary: A lightweight Ruby library for printing.
|
71
62
|
test_files: []
|
72
|
-
|