noggin 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4f3c0bc5a5a640b5822bf85970579af604d006d3
4
+ data.tar.gz: d47a8a20702b937c304b1b7af1fc6aa32c89fbe3
5
+ SHA512:
6
+ metadata.gz: c2474bab572fff36b7f0e7566d8dfad018df21ae0aec337fc02be0c742dda55eab029f80953c0e4ed739bfd0cd20305be3b17d3e8ea891ecad132bc6fd0d70d9
7
+ data.tar.gz: dac26f05f9844e3763d55b9d917a219c064e13495e0686db719c63ae530a1892084fecf826fb67df3cf973c1ceadc0533af1b76715a7256ad0e96bc6590e5549
data/Rakefile CHANGED
@@ -27,7 +27,8 @@ spec = Gem::Specification.new do |s|
27
27
  s.version = Noggin::VERSION
28
28
  s.homepage = "http://github.com/geoffyoungs/noggin"
29
29
  s.summary = "libcups bindings for ruby"
30
- s.add_dependency("rubber-generate", ">= 0.0.17")
30
+ s.add_dependency("rubber-generate", ">= 0.0.21")
31
+ s.add_development_dependency("prawn", ">= 0.0.21")
31
32
  s.platform = Gem::Platform::RUBY
32
33
  s.license = 'MIT'
33
34
  s.extensions = FileList["ext/*/extconf.rb"]
@@ -19,21 +19,59 @@ end
19
19
  # Look for headers in {gem_root}/ext/{package}
20
20
  if use_gems
21
21
  %w[
22
- gdk_pixbuf2 atk gtk2 ].each do |package|
23
- require package
24
- $CFLAGS += " -I"+Gem.loaded_specs[package].full_gem_path+"/ext/"+package
22
+ gdk_pixbuf2 atk gtk2].each do |package|
23
+ require package
24
+ if Gem.loaded_specs[package]
25
+ $CFLAGS += " -I" + Gem.loaded_specs[package].full_gem_path + "/ext/" + package
26
+ else
27
+ if fn = $".find { |n| n.sub(/[.](so|rb)$/,'') == package }
28
+ dr = $:.find { |d| File.exist?(File.join(d, fn)) }
29
+ pt = File.join(dr,fn) if dr && fn
30
+ else
31
+ pt = "??"
32
+ end
33
+ STDERR.puts "require '" + package + "' loaded '"+pt+"' instead of the gem - trying to continue, but build may fail"
34
+ end
25
35
  end
26
36
  end
27
37
  if RbConfig::CONFIG.has_key?('rubyhdrdir')
28
- $CFLAGS += " -I" + RbConfig::CONFIG['rubyhdrdir']+'/ruby'
38
+ $CFLAGS += " -I" + RbConfig::CONFIG['rubyhdrdir']+'/ruby'
29
39
  end
30
40
 
31
41
  $CFLAGS += " -I."
32
42
  have_func("rb_errinfo")
33
- have_header("cups/cups.h") or exit(-1)
34
- have_header("cups/ipp.h") or exit(-1)
35
- have_header("ruby.h") or exit(-1)
36
- have_header("st.h") or exit(-1)
43
+
44
+ unless have_header("cups/cups.h")
45
+ paths = Gem.find_files("cups/cups.h")
46
+ paths.each do |path|
47
+ $CFLAGS += " '-I#{File.dirname(path)}'"
48
+ end
49
+ have_header("cups/cups.h") or exit -1
50
+ end
51
+
52
+ unless have_header("cups/ipp.h")
53
+ paths = Gem.find_files("cups/ipp.h")
54
+ paths.each do |path|
55
+ $CFLAGS += " '-I#{File.dirname(path)}'"
56
+ end
57
+ have_header("cups/ipp.h") or exit -1
58
+ end
59
+
60
+ unless have_header("ruby.h")
61
+ paths = Gem.find_files("ruby.h")
62
+ paths.each do |path|
63
+ $CFLAGS += " '-I#{File.dirname(path)}'"
64
+ end
65
+ have_header("ruby.h") or exit -1
66
+ end
67
+
68
+ unless have_header("st.h")
69
+ paths = Gem.find_files("st.h")
70
+ paths.each do |path|
71
+ $CFLAGS += " '-I#{File.dirname(path)}'"
72
+ end
73
+ have_header("st.h") or exit -1
74
+ end
37
75
  have_library("cups") or exit(-1)
38
76
  $LIBS += " -lcups"
39
77
 
data/ext/noggin/noggin.c CHANGED
@@ -22,10 +22,18 @@ static VALUE
22
22
  Noggin_CLASS_jobs(VALUE self, VALUE printer, VALUE __v_mine, VALUE __v_whichjobs);
23
23
  static VALUE
24
24
  Noggin_CLASS_ippRequest(VALUE self, VALUE __v_operation, VALUE request_attributes);
25
+ static VALUE
26
+ Noggin_CLASS_printFile(int __p_argc, VALUE *__p_argv, VALUE self);
25
27
  static VALUE mJob;
26
28
  static VALUE
27
29
  Job_CLASS_cancel(VALUE self, VALUE __v_printer, VALUE __v_job_id);
28
30
  static VALUE mIPP;
31
+ static VALUE cIppRequest;
32
+ static VALUE _gcpool_Keep = Qnil;
33
+ static void __gcpool_Keep_add(VALUE val);
34
+ static void __gcpool_Keep_del(VALUE val);
35
+ #define KEEP_ADD(val) __gcpool_Keep_add(val)
36
+ #define KEEP_DEL(val) __gcpool_Keep_del(val)
29
37
 
30
38
  /* Inline C code */
31
39
 
@@ -34,23 +42,51 @@ VALUE inline as_string(const char *string) { return string ? rb_str_new2(string)
34
42
 
35
43
  #define TO_STRING(v) ((v) ? rb_str_new2((v)) : Qnil)
36
44
 
45
+ static VALUE sym_aborted = Qnil;
46
+ static VALUE sym_cancelled = Qnil;
47
+ static VALUE sym_completed = Qnil;
48
+ static VALUE sym_held = Qnil;
49
+ static VALUE sym_pending = Qnil;
50
+ static VALUE sym_processing = Qnil;
51
+ static VALUE sym_stopped = Qnil;
52
+
53
+ #define STATIC_STR(name) static VALUE str_##name = Qnil;
54
+ #define STATIC_STR_INIT(name) KEEP_ADD(str_##name = rb_str_new2(#name)); rb_obj_freeze(str_##name);
55
+ STATIC_STR(completed_time);
56
+ STATIC_STR(creation_time);
57
+ STATIC_STR(dest);
58
+ STATIC_STR(format);
59
+ STATIC_STR(id);
60
+ STATIC_STR(priority);
61
+ STATIC_STR(processing_time);
62
+ STATIC_STR(size);
63
+ STATIC_STR(title);
64
+ STATIC_STR(user);
65
+ STATIC_STR(state);
66
+
67
+ STATIC_STR(name);
68
+ STATIC_STR(instance);
69
+ STATIC_STR(is_default);
70
+ STATIC_STR(options);
71
+
37
72
  VALUE job_state(ipp_jstate_t state) {
38
73
  switch(state) {
39
74
  case IPP_JOB_ABORTED:
40
- return ID2SYM(rb_intern("aborted"));
75
+ return sym_aborted;
41
76
  case IPP_JOB_CANCELED:
42
- return ID2SYM(rb_intern("cancelled"));
77
+ return sym_cancelled;
43
78
  case IPP_JOB_COMPLETED:
44
- return ID2SYM(rb_intern("completed"));
79
+ return sym_completed;
45
80
  case IPP_JOB_HELD:
46
- return ID2SYM(rb_intern("held"));
81
+ return sym_held;
47
82
  case IPP_JOB_PENDING:
48
- return ID2SYM(rb_intern("pending"));
83
+ return sym_pending;
49
84
  case IPP_JOB_PROCESSING:
50
- return ID2SYM(rb_intern("processing"));
85
+ return sym_processing;
51
86
  case IPP_JOB_STOPPED:
52
- return ID2SYM(rb_intern("stopped"));
87
+ return sym_stopped;
53
88
  }
89
+ return INT2FIX(state);
54
90
  }
55
91
 
56
92
  VALUE rb_ipp_value(ipp_attribute_t* attr) {
@@ -62,13 +98,26 @@ VALUE rb_ipp_value(ipp_attribute_t* attr) {
62
98
  case IPP_TAG_NAME:
63
99
  case IPP_TAG_URI:
64
100
  case IPP_TAG_URISCHEME:
65
- return as_string(ippGetString(attr, 0, &lang));
101
+ return as_string(ippGetString(attr, 0, &lang));
66
102
  case IPP_TAG_BOOLEAN:
67
103
  return ippGetBoolean(attr, 0) ? Qtrue : Qfalse;
68
104
  }
69
105
  return Qnil;
70
106
 
71
107
  }
108
+
109
+ struct svp_it {
110
+ int num_options;
111
+ cups_option_t *options;
112
+ };
113
+
114
+ int hash_to_cups_options_it(VALUE key, VALUE val, VALUE data) {
115
+ struct svp_it *svp = (struct svp_it *)data;
116
+
117
+ svp->num_options = cupsAddOption(StringValuePtr(key), StringValuePtr(val), svp->num_options, &(svp->options));
118
+
119
+ return ST_CONTINUE;
120
+ }
72
121
  int add_to_request_iterator(VALUE key, VALUE val, VALUE data) {
73
122
  ipp_t *request = (ipp_t*) data;
74
123
  char *name = RSTRING_PTR(key);
@@ -80,7 +129,7 @@ int add_to_request_iterator(VALUE key, VALUE val, VALUE data) {
80
129
  case T_STRING:
81
130
  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, name, NULL, RSTRING_PTR(val));
82
131
  break;
83
- case T_TRUE:
132
+ case T_TRUE:
84
133
  case T_FALSE:
85
134
  ippAddBoolean(request, IPP_TAG_OPERATION, name, (val) ? 1 : 0);
86
135
  break;
@@ -95,7 +144,7 @@ Noggin_CLASS_destinations(VALUE self)
95
144
  {
96
145
  VALUE __p_retval = Qnil;
97
146
 
98
- #line 96 "/home/geoff/Projects/noggin/ext/noggin/noggin.cr"
147
+ #line 161 "/home/geoff/Projects/noggin/ext/noggin/noggin.cr"
99
148
 
100
149
  do {
101
150
  VALUE list =
@@ -111,10 +160,10 @@ Noggin_CLASS_destinations(VALUE self)
111
160
  i > 0;
112
161
  i --, dest ++) { VALUE hash =
113
162
  rb_hash_new(), options = rb_hash_new();
114
- rb_hash_aset(hash, rb_str_new2("name"), as_string(dest->name));
115
- rb_hash_aset(hash, rb_str_new2("instance"), as_string(dest->instance));
116
- rb_hash_aset(hash, rb_str_new2("is_default"), INT2NUM(dest->is_default));
117
- rb_hash_aset(hash, rb_str_new2("options"), options);
163
+ rb_hash_aset(hash, str_name, as_string(dest->name));
164
+ rb_hash_aset(hash, str_instance, as_string(dest->instance));
165
+ rb_hash_aset(hash, str_is_default, INT2NUM(dest->is_default));
166
+ rb_hash_aset(hash, str_options, options);
118
167
  for (j = 0;
119
168
  j < dest->num_options;
120
169
  j++) { rb_hash_aset(options, as_string(dest->options[j].name), as_string(dest->options[j].value));
@@ -139,7 +188,7 @@ Noggin_CLASS_jobs(VALUE self, VALUE printer, VALUE __v_mine, VALUE __v_whichjobs
139
188
  __orig_mine = mine = RTEST(__v_mine);
140
189
  __orig_whichjobs = whichjobs = NUM2INT(__v_whichjobs);
141
190
 
142
- #line 126 "/home/geoff/Projects/noggin/ext/noggin/noggin.cr"
191
+ #line 192 "/home/geoff/Projects/noggin/ext/noggin/noggin.cr"
143
192
 
144
193
  do {
145
194
  VALUE list =
@@ -152,17 +201,17 @@ Noggin_CLASS_jobs(VALUE self, VALUE printer, VALUE __v_mine, VALUE __v_whichjobs
152
201
  i > 0;
153
202
  i --, job ++) { VALUE hash =
154
203
  rb_hash_new();
155
- rb_hash_aset(hash, rb_str_new2("completed_time"), rb_time_new(job->completed_time, 0));
156
- rb_hash_aset(hash, rb_str_new2("creation_time"), rb_time_new(job->creation_time, 0));
157
- rb_hash_aset(hash, rb_str_new2("dest"), as_string(job->dest));
158
- rb_hash_aset(hash, rb_str_new2("format"), as_string(job->format));
159
- rb_hash_aset(hash, rb_str_new2("id"), INT2NUM(job->id));
160
- rb_hash_aset(hash, rb_str_new2("priority"), INT2NUM(job->priority));
161
- rb_hash_aset(hash, rb_str_new2("processing_time"), rb_time_new(job->processing_time, 0));
162
- rb_hash_aset(hash, rb_str_new2("size"), INT2NUM(job->size));
163
- rb_hash_aset(hash, rb_str_new2("title"), as_string(job->title));
164
- rb_hash_aset(hash, rb_str_new2("user"), as_string(job->user));
165
- rb_hash_aset(hash, rb_str_new2("state"), job_state(job->state));
204
+ rb_hash_aset(hash, str_completed_time, rb_time_new(job->completed_time, 0));
205
+ rb_hash_aset(hash, str_creation_time, rb_time_new(job->creation_time, 0));
206
+ rb_hash_aset(hash, str_dest, as_string(job->dest));
207
+ rb_hash_aset(hash, str_format, as_string(job->format));
208
+ rb_hash_aset(hash, str_id, INT2NUM(job->id));
209
+ rb_hash_aset(hash, str_priority, INT2NUM(job->priority));
210
+ rb_hash_aset(hash, str_processing_time, rb_time_new(job->processing_time, 0));
211
+ rb_hash_aset(hash, str_size, INT2NUM(job->size));
212
+ rb_hash_aset(hash, str_title, as_string(job->title));
213
+ rb_hash_aset(hash, str_user, as_string(job->user));
214
+ rb_hash_aset(hash, str_state, job_state(job->state));
166
215
  rb_ary_push(list, hash);
167
216
  } cupsFreeJobs(num_jobs, jobs);
168
217
  do { __p_retval = list; goto out; } while(0);
@@ -180,7 +229,7 @@ Noggin_CLASS_ippRequest(VALUE self, VALUE __v_operation, VALUE request_attribute
180
229
  int operation; int __orig_operation;
181
230
  __orig_operation = operation = NUM2INT(__v_operation);
182
231
 
183
- #line 158 "/home/geoff/Projects/noggin/ext/noggin/noggin.cr"
232
+ #line 227 "/home/geoff/Projects/noggin/ext/noggin/noggin.cr"
184
233
 
185
234
  do {
186
235
  VALUE resp =
@@ -204,6 +253,52 @@ out:
204
253
  return __p_retval;
205
254
  }
206
255
 
256
+ static VALUE
257
+ Noggin_CLASS_printFile(int __p_argc, VALUE *__p_argv, VALUE self)
258
+ {
259
+ VALUE __p_retval = Qnil;
260
+ VALUE __v_destinationName = Qnil;
261
+ char * destinationName; char * __orig_destinationName;
262
+ VALUE __v_fileName = Qnil;
263
+ char * fileName; char * __orig_fileName;
264
+ VALUE __v_title = Qnil;
265
+ char * title; char * __orig_title;
266
+ VALUE options = Qnil;
267
+
268
+ /* Scan arguments */
269
+ rb_scan_args(__p_argc, __p_argv, "31",&__v_destinationName, &__v_fileName, &__v_title, &options);
270
+
271
+ /* Set defaults */
272
+ __orig_destinationName = destinationName = ( NIL_P(__v_destinationName) ? NULL : StringValuePtr(__v_destinationName) );
273
+
274
+ __orig_fileName = fileName = ( NIL_P(__v_fileName) ? NULL : StringValuePtr(__v_fileName) );
275
+
276
+ __orig_title = title = ( NIL_P(__v_title) ? NULL : StringValuePtr(__v_title) );
277
+
278
+ if (__p_argc <= 3)
279
+ options = Qnil;
280
+ else
281
+ if (! ((TYPE(options) == T_HASH) || (TYPE(options) == T_NIL)) )
282
+ rb_raise(rb_eArgError, "options argument must be one of Hash, Nil");
283
+
284
+
285
+ #line 246 "/home/geoff/Projects/noggin/ext/noggin/noggin.cr"
286
+
287
+ do {
288
+ struct svp_it info =
289
+ {0, NULL};
290
+ int job_id = -1;
291
+ if (TYPE(options) == T_HASH) { rb_hash_foreach(options, hash_to_cups_options_it, (VALUE)&info);
292
+ } job_id = cupsPrintFile(destinationName, fileName, title, info.num_options, info.options);
293
+ if (info.options) { cupsFreeOptions(info.num_options, info.options);
294
+ } do { __p_retval = INT2NUM(job_id); goto out; } while(0);
295
+
296
+ } while(0);
297
+
298
+ out:
299
+ return __p_retval;
300
+ }
301
+
207
302
  static VALUE
208
303
  Job_CLASS_cancel(VALUE self, VALUE __v_printer, VALUE __v_job_id)
209
304
  {
@@ -212,21 +307,46 @@ Job_CLASS_cancel(VALUE self, VALUE __v_printer, VALUE __v_job_id)
212
307
  __orig_printer = printer = ( NIL_P(__v_printer) ? NULL : StringValuePtr(__v_printer) );
213
308
  __orig_job_id = job_id = NUM2INT(__v_job_id);
214
309
 
215
- #line 87 "/home/geoff/Projects/noggin/ext/noggin/noggin.cr"
310
+ #line 152 "/home/geoff/Projects/noggin/ext/noggin/noggin.cr"
216
311
  if (cupsCancelJob(printer, job_id) == 0) { rb_raise(rb_eRuntimeError, "CUPS Error: %d - %s", cupsLastError(), cupsLastErrorString());
217
312
  }
218
313
  return Qnil;
219
314
  }
220
315
 
316
+ static void __gcpool_Keep_add(VALUE val)
317
+ {
318
+ if (_gcpool_Keep == Qnil)
319
+ {
320
+ _gcpool_Keep = rb_ary_new3(1, val);
321
+ }
322
+ else
323
+ {
324
+ rb_ary_push(_gcpool_Keep, val);
325
+ }
326
+ }
327
+
328
+ static void __gcpool_Keep_del(VALUE val)
329
+ {
330
+ if (_gcpool_Keep == Qnil)
331
+ {
332
+ rb_warn("Trying to remove object from empty GC queue Keep");
333
+ return;
334
+ }
335
+ rb_ary_delete(_gcpool_Keep, val);
336
+ // If nothing is referenced, don't keep an empty array in the pool...
337
+ if (RARRAY_LEN(_gcpool_Keep) == 0)
338
+ _gcpool_Keep = Qnil;
339
+ }
340
+
221
341
  /* Init */
222
342
  void
223
343
  Init_noggin(void)
224
344
  {
225
-
226
345
  mNoggin = rb_define_module("Noggin");
227
346
  rb_define_singleton_method(mNoggin, "destinations", Noggin_CLASS_destinations, 0);
228
347
  rb_define_singleton_method(mNoggin, "jobs", Noggin_CLASS_jobs, 3);
229
348
  rb_define_singleton_method(mNoggin, "ippRequest", Noggin_CLASS_ippRequest, 2);
349
+ rb_define_singleton_method(mNoggin, "printFile", Noggin_CLASS_printFile, -1);
230
350
  rb_define_const(mNoggin, "WHICHJOBS_ALL", INT2NUM(CUPS_WHICHJOBS_ALL));
231
351
  rb_define_const(mNoggin, "WHICHJOBS_ACTIVE", INT2NUM(CUPS_WHICHJOBS_ACTIVE));
232
352
  rb_define_const(mNoggin, "WHICHJOBS_COMPLETED", INT2NUM(CUPS_WHICHJOBS_COMPLETED));
@@ -236,4 +356,30 @@ Init_noggin(void)
236
356
  rb_define_const(mJob, "ALL", INT2NUM(CUPS_JOBID_ALL));
237
357
  mIPP = rb_define_module_under(mNoggin, "IPP");
238
358
  rb_define_const(mIPP, "GET_JOBS", INT2NUM(IPP_GET_JOBS));
359
+ cIppRequest = rb_define_class_under(mNoggin, "IppRequest", rb_cObject);
360
+ rb_gc_register_address(&_gcpool_Keep);
361
+
362
+ KEEP_ADD(sym_cancelled = ID2SYM(rb_intern("cancelled")));
363
+ KEEP_ADD(sym_completed = ID2SYM(rb_intern("completed")));
364
+ KEEP_ADD(sym_held = ID2SYM(rb_intern("held")));
365
+ KEEP_ADD(sym_pending = ID2SYM(rb_intern("pending")));
366
+ KEEP_ADD(sym_processing = ID2SYM(rb_intern("processing")));
367
+ KEEP_ADD(sym_stopped = ID2SYM(rb_intern("stopped")));
368
+
369
+ STATIC_STR_INIT(completed_time);
370
+ STATIC_STR_INIT(creation_time);
371
+ STATIC_STR_INIT(dest);
372
+ STATIC_STR_INIT(format);
373
+ STATIC_STR_INIT(id);
374
+ STATIC_STR_INIT(priority);
375
+ STATIC_STR_INIT(processing_time);
376
+ STATIC_STR_INIT(size);
377
+ STATIC_STR_INIT(title);
378
+ STATIC_STR_INIT(user);
379
+ STATIC_STR_INIT(state);
380
+
381
+ STATIC_STR_INIT(name);
382
+ STATIC_STR_INIT(instance);
383
+ STATIC_STR_INIT(is_default);
384
+ STATIC_STR_INIT(options);
239
385
  }
data/ext/noggin/noggin.cr CHANGED
@@ -12,23 +12,51 @@ VALUE inline as_string(const char *string) { return string ? rb_str_new2(string)
12
12
 
13
13
  #define TO_STRING(v) ((v) ? rb_str_new2((v)) : Qnil)
14
14
 
15
+ static VALUE sym_aborted = Qnil;
16
+ static VALUE sym_cancelled = Qnil;
17
+ static VALUE sym_completed = Qnil;
18
+ static VALUE sym_held = Qnil;
19
+ static VALUE sym_pending = Qnil;
20
+ static VALUE sym_processing = Qnil;
21
+ static VALUE sym_stopped = Qnil;
22
+
23
+ #define STATIC_STR(name) static VALUE str_##name = Qnil;
24
+ #define STATIC_STR_INIT(name) KEEP_ADD(str_##name = rb_str_new2(#name)); rb_obj_freeze(str_##name);
25
+ STATIC_STR(completed_time);
26
+ STATIC_STR(creation_time);
27
+ STATIC_STR(dest);
28
+ STATIC_STR(format);
29
+ STATIC_STR(id);
30
+ STATIC_STR(priority);
31
+ STATIC_STR(processing_time);
32
+ STATIC_STR(size);
33
+ STATIC_STR(title);
34
+ STATIC_STR(user);
35
+ STATIC_STR(state);
36
+
37
+ STATIC_STR(name);
38
+ STATIC_STR(instance);
39
+ STATIC_STR(is_default);
40
+ STATIC_STR(options);
41
+
15
42
  VALUE job_state(ipp_jstate_t state) {
16
43
  switch(state) {
17
44
  case IPP_JOB_ABORTED:
18
- return ID2SYM(rb_intern("aborted"));
45
+ return sym_aborted;
19
46
  case IPP_JOB_CANCELED:
20
- return ID2SYM(rb_intern("cancelled"));
47
+ return sym_cancelled;
21
48
  case IPP_JOB_COMPLETED:
22
- return ID2SYM(rb_intern("completed"));
49
+ return sym_completed;
23
50
  case IPP_JOB_HELD:
24
- return ID2SYM(rb_intern("held"));
51
+ return sym_held;
25
52
  case IPP_JOB_PENDING:
26
- return ID2SYM(rb_intern("pending"));
53
+ return sym_pending;
27
54
  case IPP_JOB_PROCESSING:
28
- return ID2SYM(rb_intern("processing"));
55
+ return sym_processing;
29
56
  case IPP_JOB_STOPPED:
30
- return ID2SYM(rb_intern("stopped"));
57
+ return sym_stopped;
31
58
  }
59
+ return INT2FIX(state);
32
60
  }
33
61
 
34
62
  VALUE rb_ipp_value(ipp_attribute_t* attr) {
@@ -40,13 +68,26 @@ VALUE rb_ipp_value(ipp_attribute_t* attr) {
40
68
  case IPP_TAG_NAME:
41
69
  case IPP_TAG_URI:
42
70
  case IPP_TAG_URISCHEME:
43
- return as_string(ippGetString(attr, 0, &lang));
71
+ return as_string(ippGetString(attr, 0, &lang));
44
72
  case IPP_TAG_BOOLEAN:
45
73
  return ippGetBoolean(attr, 0) ? Qtrue : Qfalse;
46
74
  }
47
75
  return Qnil;
48
76
 
49
77
  }
78
+
79
+ struct svp_it {
80
+ int num_options;
81
+ cups_option_t *options;
82
+ };
83
+
84
+ int hash_to_cups_options_it(VALUE key, VALUE val, VALUE data) {
85
+ struct svp_it *svp = (struct svp_it *)data;
86
+
87
+ svp->num_options = cupsAddOption(StringValuePtr(key), StringValuePtr(val), svp->num_options, &(svp->options));
88
+
89
+ return ST_CONTINUE;
90
+ }
50
91
  int add_to_request_iterator(VALUE key, VALUE val, VALUE data) {
51
92
  ipp_t *request = (ipp_t*) data;
52
93
  char *name = RSTRING_PTR(key);
@@ -58,7 +99,7 @@ int add_to_request_iterator(VALUE key, VALUE val, VALUE data) {
58
99
  case T_STRING:
59
100
  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, name, NULL, RSTRING_PTR(val));
60
101
  break;
61
- case T_TRUE:
102
+ case T_TRUE:
62
103
  case T_FALSE:
63
104
  ippAddBoolean(request, IPP_TAG_OPERATION, name, (val) ? 1 : 0);
64
105
  break;
@@ -68,7 +109,30 @@ int add_to_request_iterator(VALUE key, VALUE val, VALUE data) {
68
109
 
69
110
  %}
70
111
 
71
- %pre_init{
112
+ %post_init{
113
+ KEEP_ADD(sym_cancelled = ID2SYM(rb_intern("cancelled")));
114
+ KEEP_ADD(sym_completed = ID2SYM(rb_intern("completed")));
115
+ KEEP_ADD(sym_held = ID2SYM(rb_intern("held")));
116
+ KEEP_ADD(sym_pending = ID2SYM(rb_intern("pending")));
117
+ KEEP_ADD(sym_processing = ID2SYM(rb_intern("processing")));
118
+ KEEP_ADD(sym_stopped = ID2SYM(rb_intern("stopped")));
119
+
120
+ STATIC_STR_INIT(completed_time);
121
+ STATIC_STR_INIT(creation_time);
122
+ STATIC_STR_INIT(dest);
123
+ STATIC_STR_INIT(format);
124
+ STATIC_STR_INIT(id);
125
+ STATIC_STR_INIT(priority);
126
+ STATIC_STR_INIT(processing_time);
127
+ STATIC_STR_INIT(size);
128
+ STATIC_STR_INIT(title);
129
+ STATIC_STR_INIT(user);
130
+ STATIC_STR_INIT(state);
131
+
132
+ STATIC_STR_INIT(name);
133
+ STATIC_STR_INIT(instance);
134
+ STATIC_STR_INIT(is_default);
135
+ STATIC_STR_INIT(options);
72
136
  %}
73
137
 
74
138
  %map ruby - (char *) => (VALUE): rb_str_new2(#0)
@@ -81,10 +145,11 @@ module Noggin
81
145
  int WHICHJOBS_ACTIVE = CUPS_WHICHJOBS_ACTIVE
82
146
  int WHICHJOBS_COMPLETED = CUPS_WHICHJOBS_COMPLETED
83
147
 
148
+ gcpool Keep
84
149
  module Job
85
150
  int CURRENT = CUPS_JOBID_CURRENT
86
151
  int ALL = CUPS_JOBID_ALL
87
- def int:self.cancel(char * printer, int job_id)
152
+ def self.cancel(char * printer, int job_id)
88
153
  if (cupsCancelJob(printer, job_id) == 0) {
89
154
  rb_raise(rb_eRuntimeError, "CUPS Error: %d - %s", cupsLastError(), cupsLastErrorString());
90
155
  }
@@ -103,18 +168,18 @@ module Noggin
103
168
  int j;
104
169
 
105
170
  list = rb_ary_new2(num_dests);
106
- for (i = num_dests, dest = dests; i > 0; i --, dest ++)
171
+ for (i = num_dests, dest = dests; i > 0; i --, dest ++)
107
172
  {
108
173
  VALUE hash = rb_hash_new(), options = rb_hash_new();
109
- rb_hash_aset(hash, rb_str_new2("name"), as_string(dest->name));
110
- rb_hash_aset(hash, rb_str_new2("instance"), as_string(dest->instance));
111
- rb_hash_aset(hash, rb_str_new2("is_default"), INT2NUM(dest->is_default));
112
- rb_hash_aset(hash, rb_str_new2("options"), options);
174
+ rb_hash_aset(hash, str_name, as_string(dest->name));
175
+ rb_hash_aset(hash, str_instance, as_string(dest->instance));
176
+ rb_hash_aset(hash, str_is_default, INT2NUM(dest->is_default));
177
+ rb_hash_aset(hash, str_options, options);
113
178
 
114
179
  for (j = 0; j < dest->num_options; j++) {
115
180
  rb_hash_aset(options, as_string(dest->options[j].name), as_string(dest->options[j].value));
116
181
  }
117
-
182
+
118
183
 
119
184
  rb_ary_push(list, hash);
120
185
  }
@@ -124,28 +189,28 @@ module Noggin
124
189
  return list;
125
190
  end
126
191
 
127
- def self.jobs(T_NIL|T_STRING printer, bool mine, int whichjobs)
192
+ def self.jobs(T_NIL|T_STRING printer, bool mine, int whichjobs)
128
193
  VALUE list = Qnil;
129
194
  cups_job_t *jobs, *job;
130
195
  int num_jobs, i;
131
-
196
+
132
197
  num_jobs = cupsGetJobs(&jobs, (NIL_P(printer) ? (char*)0 : RSTRING_PTR(printer)), (mine ? 1 : 0), whichjobs);
133
198
 
134
199
  list = rb_ary_new2(num_jobs);
135
- for (i = num_jobs, job = jobs; i > 0; i --, job ++)
200
+ for (i = num_jobs, job = jobs; i > 0; i --, job ++)
136
201
  {
137
202
  VALUE hash = rb_hash_new();
138
- rb_hash_aset(hash, rb_str_new2("completed_time"), rb_time_new(job->completed_time, 0));
139
- rb_hash_aset(hash, rb_str_new2("creation_time"), rb_time_new(job->creation_time, 0));
140
- rb_hash_aset(hash, rb_str_new2("dest"), as_string(job->dest));
141
- rb_hash_aset(hash, rb_str_new2("format"), as_string(job->format));
142
- rb_hash_aset(hash, rb_str_new2("id"), INT2NUM(job->id));
143
- rb_hash_aset(hash, rb_str_new2("priority"), INT2NUM(job->priority));
144
- rb_hash_aset(hash, rb_str_new2("processing_time"), rb_time_new(job->processing_time, 0));
145
- rb_hash_aset(hash, rb_str_new2("size"), INT2NUM(job->size));
146
- rb_hash_aset(hash, rb_str_new2("title"), as_string(job->title));
147
- rb_hash_aset(hash, rb_str_new2("user"), as_string(job->user));
148
- rb_hash_aset(hash, rb_str_new2("state"), job_state(job->state));
203
+ rb_hash_aset(hash, str_completed_time, rb_time_new(job->completed_time, 0));
204
+ rb_hash_aset(hash, str_creation_time, rb_time_new(job->creation_time, 0));
205
+ rb_hash_aset(hash, str_dest, as_string(job->dest));
206
+ rb_hash_aset(hash, str_format, as_string(job->format));
207
+ rb_hash_aset(hash, str_id, INT2NUM(job->id));
208
+ rb_hash_aset(hash, str_priority, INT2NUM(job->priority));
209
+ rb_hash_aset(hash, str_processing_time, rb_time_new(job->processing_time, 0));
210
+ rb_hash_aset(hash, str_size, INT2NUM(job->size));
211
+ rb_hash_aset(hash, str_title, as_string(job->title));
212
+ rb_hash_aset(hash, str_user, as_string(job->user));
213
+ rb_hash_aset(hash, str_state, job_state(job->state));
149
214
 
150
215
  rb_ary_push(list, hash);
151
216
  }
@@ -155,6 +220,10 @@ module Noggin
155
220
  return list;
156
221
  end
157
222
 
223
+ class IppRequest
224
+
225
+ end
226
+
158
227
  def self.ippRequest(int operation, VALUE request_attributes)
159
228
  VALUE resp = Qnil;
160
229
  ipp_t *request = NULL , *response = NULL;
@@ -164,7 +233,7 @@ module Noggin
164
233
  rb_hash_foreach(request_attributes, add_to_request_iterator, (VALUE)request);
165
234
 
166
235
  response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/");
167
-
236
+
168
237
  resp = rb_hash_new();
169
238
 
170
239
  for (attr = ippFirstAttribute(response); attr != NULL; attr = ippNextAttribute(response)) {
@@ -173,4 +242,21 @@ module Noggin
173
242
 
174
243
  return resp;
175
244
  end
245
+
246
+ def int:self.printFile(char *destinationName, char *fileName, char *title, T_HASH|T_NIL options = Qnil)
247
+ struct svp_it info = {0, NULL};
248
+ int job_id = -1;
249
+
250
+ if (TYPE(options) == T_HASH) {
251
+ rb_hash_foreach(options, hash_to_cups_options_it, (VALUE)&info);
252
+ }
253
+
254
+ job_id = cupsPrintFile(destinationName, fileName, title, info.num_options, info.options);
255
+
256
+ if (info.options) {
257
+ cupsFreeOptions(info.num_options, info.options);
258
+ }
259
+
260
+ return job_id;
261
+ end
176
262
  end
data/ext/noggin/noggin.rd CHANGED
@@ -8,6 +8,9 @@
8
8
  --- Noggin.ippRequest(Integer operation, request_attributes)
9
9
 
10
10
 
11
+ --- Noggin.printFile(String destinationName, String fileName, String title, Hash options)
12
+
13
+
11
14
  == Noggin::WHICHJOBS_ALL
12
15
  == Noggin::WHICHJOBS_ACTIVE
13
16
  == Noggin::WHICHJOBS_COMPLETED
@@ -19,3 +22,4 @@
19
22
  === Noggin::Job::ALL
20
23
  == module Noggin::IPP
21
24
  === Noggin::IPP::GET_JOBS
25
+ == class Noggin::IppRequest
@@ -1,4 +1,4 @@
1
1
  module Noggin
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
4
4
 
metadata CHANGED
@@ -1,49 +1,51 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: noggin
3
- version: !ruby/object:Gem::Version
4
- hash: 29
5
- prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 1
10
- version: 0.0.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Geoff Youngs
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2013-08-23 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
11
+ date: 2013-09-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
21
14
  name: rubber-generate
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 61
29
- segments:
30
- - 0
31
- - 0
32
- - 17
33
- version: 0.0.17
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.21
34
20
  type: :runtime
35
- version_requirements: *id001
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.21
27
+ - !ruby/object:Gem::Dependency
28
+ name: prawn
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.0.21
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.0.21
36
41
  description: |
37
42
  smb
38
-
39
43
  email: git@intersect-uk.co.uk
40
44
  executables: []
41
-
42
- extensions:
45
+ extensions:
43
46
  - ext/noggin/extconf.rb
44
47
  extra_rdoc_files: []
45
-
46
- files:
48
+ files:
47
49
  - ext/noggin/noggin.c
48
50
  - ext/noggin/noggin.cr
49
51
  - ext/noggin/noggin.rd
@@ -53,37 +55,27 @@ files:
53
55
  - lib/noggin/version.rb
54
56
  - ext/noggin/extconf.rb
55
57
  homepage: http://github.com/geoffyoungs/noggin
56
- licenses:
58
+ licenses:
57
59
  - MIT
60
+ metadata: {}
58
61
  post_install_message:
59
62
  rdoc_options: []
60
-
61
- require_paths:
63
+ require_paths:
62
64
  - lib
63
- required_ruby_version: !ruby/object:Gem::Requirement
64
- none: false
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- hash: 3
69
- segments:
70
- - 0
71
- version: "0"
72
- required_rubygems_version: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ">="
76
- - !ruby/object:Gem::Version
77
- hash: 3
78
- segments:
79
- - 0
80
- version: "0"
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - '>='
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
81
75
  requirements: []
82
-
83
76
  rubyforge_project:
84
- rubygems_version: 1.8.15
77
+ rubygems_version: 2.0.3
85
78
  signing_key:
86
- specification_version: 3
79
+ specification_version: 4
87
80
  summary: libcups bindings for ruby
88
81
  test_files: []
89
-