qpid_proton 0.9.0 → 0.10

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.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/lib/codec/data.rb +912 -0
  3. data/lib/codec/mapping.rb +169 -0
  4. data/lib/{qpid_proton/tracker.rb → core/base_handler.rb} +4 -15
  5. data/lib/core/connection.rb +328 -0
  6. data/lib/core/delivery.rb +271 -0
  7. data/lib/core/disposition.rb +158 -0
  8. data/lib/core/endpoint.rb +140 -0
  9. data/lib/{qpid_proton → core}/exceptions.rb +43 -2
  10. data/lib/core/link.rb +387 -0
  11. data/lib/core/message.rb +633 -0
  12. data/lib/core/receiver.rb +95 -0
  13. data/lib/core/sasl.rb +94 -0
  14. data/lib/core/selectable.rb +130 -0
  15. data/lib/core/sender.rb +76 -0
  16. data/lib/core/session.rb +163 -0
  17. data/lib/core/ssl.rb +164 -0
  18. data/lib/{qpid_proton/version.rb → core/ssl_details.rb} +7 -6
  19. data/lib/core/ssl_domain.rb +156 -0
  20. data/lib/core/terminus.rb +218 -0
  21. data/lib/core/transport.rb +411 -0
  22. data/lib/core/url.rb +77 -0
  23. data/lib/event/collector.rb +148 -0
  24. data/lib/event/event.rb +318 -0
  25. data/lib/event/event_base.rb +91 -0
  26. data/lib/event/event_type.rb +71 -0
  27. data/lib/handler/acking.rb +70 -0
  28. data/lib/handler/c_adaptor.rb +47 -0
  29. data/lib/handler/c_flow_controller.rb +33 -0
  30. data/lib/handler/endpoint_state_handler.rb +217 -0
  31. data/lib/handler/incoming_message_handler.rb +74 -0
  32. data/lib/handler/messaging_handler.rb +218 -0
  33. data/lib/handler/outgoing_message_handler.rb +98 -0
  34. data/lib/handler/wrapped_handler.rb +76 -0
  35. data/lib/messenger/messenger.rb +702 -0
  36. data/lib/messenger/subscription.rb +37 -0
  37. data/lib/messenger/tracker.rb +38 -0
  38. data/lib/messenger/tracker_status.rb +69 -0
  39. data/lib/qpid_proton.rb +106 -16
  40. data/lib/reactor/acceptor.rb +41 -0
  41. data/lib/reactor/backoff.rb +41 -0
  42. data/lib/reactor/connector.rb +98 -0
  43. data/lib/reactor/container.rb +272 -0
  44. data/lib/reactor/global_overrides.rb +44 -0
  45. data/lib/reactor/link_option.rb +90 -0
  46. data/lib/reactor/reactor.rb +198 -0
  47. data/lib/reactor/session_per_connection.rb +45 -0
  48. data/lib/reactor/ssl_config.rb +41 -0
  49. data/lib/reactor/task.rb +39 -0
  50. data/lib/{qpid_proton/subscription.rb → reactor/urls.rb} +12 -13
  51. data/lib/{qpid_proton → types}/array.rb +28 -29
  52. data/lib/types/described.rb +63 -0
  53. data/lib/{qpid_proton → types}/hash.rb +4 -3
  54. data/lib/types/strings.rb +62 -0
  55. data/lib/util/class_wrapper.rb +54 -0
  56. data/lib/util/condition.rb +45 -0
  57. data/lib/util/constants.rb +85 -0
  58. data/lib/util/engine.rb +82 -0
  59. data/lib/util/error_handler.rb +127 -0
  60. data/lib/util/handler.rb +41 -0
  61. data/lib/util/reactor.rb +32 -0
  62. data/lib/util/swig_helper.rb +114 -0
  63. data/lib/util/timeout.rb +50 -0
  64. data/lib/util/uuid.rb +32 -0
  65. data/lib/util/version.rb +30 -0
  66. data/lib/util/wrapper.rb +124 -0
  67. metadata +67 -21
  68. data/ext/cproton/cproton.c +0 -22196
  69. data/lib/qpid_proton/data.rb +0 -788
  70. data/lib/qpid_proton/described.rb +0 -66
  71. data/lib/qpid_proton/exception_handling.rb +0 -127
  72. data/lib/qpid_proton/filters.rb +0 -67
  73. data/lib/qpid_proton/mapping.rb +0 -170
  74. data/lib/qpid_proton/message.rb +0 -621
  75. data/lib/qpid_proton/messenger.rb +0 -702
  76. data/lib/qpid_proton/selectable.rb +0 -126
  77. data/lib/qpid_proton/strings.rb +0 -65
  78. data/lib/qpid_proton/tracker_status.rb +0 -73
@@ -1,702 +0,0 @@
1
- #
2
- # Licensed to the Apache Software Foundation (ASF) under one
3
- # or more contributor license agreements. See the NOTICE file
4
- # distributed with this work for additional information
5
- # regarding copyright ownership. The ASF licenses this file
6
- # to you under the Apache License, Version 2.0 (the
7
- # "License"); you may not use this file except in compliance
8
- # with the License. You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing,
13
- # software distributed under the License is distributed on an
14
- # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
- # KIND, either express or implied. See the License for the
16
- # specific language governing permissions and limitations
17
- # under the License.
18
- #
19
-
20
- module Qpid # :nodoc:
21
-
22
- module Proton # :nodoc:
23
-
24
- # The +Messenger+ class defines a high level interface for
25
- # sending and receiving Messages. Every Messenger contains
26
- # a single logical queue of incoming messages and a single
27
- # logical queue of outgoing messages. These messages in these
28
- # queues may be destined for, or originate from, a variety of
29
- # addresses.
30
- #
31
- # The messenger interface is single-threaded. All methods
32
- # except one ( #interrupt ) are intended to be used from within
33
- # the messenger thread.
34
- #
35
- # === Sending & Receiving Messages
36
- #
37
- # The Messenger class works in conjuction with the Message class. The
38
- # Message class is a mutable holder of message content.
39
- #
40
- # The put method copies its Message to the outgoing queue, and may
41
- # send queued messages if it can do so without blocking. The send
42
- # method blocks until it has sent the requested number of messages,
43
- # or until a timeout interrupts the attempt.
44
- #
45
- # Similarly, the recv method receives messages into the incoming
46
- # queue, and may block as it attempts to receive the requested number
47
- # of messages, or until timeout is reached. It may receive fewer
48
- # than the requested number. The get method pops the
49
- # eldest Message off the incoming queue and copies it into the Message
50
- # object that you supply. It will not block.
51
- #
52
- # The blocking attribute allows you to turn off blocking behavior entirely,
53
- # in which case send and recv will do whatever they can without
54
- # blocking, and then return. You can then look at the number
55
- # of incoming and outgoing messages to see how much outstanding work
56
- # still remains.
57
- #
58
- class Messenger
59
-
60
- include Qpid::Proton::ExceptionHandling
61
-
62
- can_raise_exception [:send, :receive, :password=, :start, :stop,
63
- :perform_put, :perform_get, :interrupt,
64
- :route, :rewrite, :accept, :reject,
65
- :incoming_window=, :outgoing_window=]
66
-
67
- # Creates a new +Messenger+.
68
- #
69
- # The +name+ parameter is optional. If one is not provided then
70
- # a unique name is generated.
71
- #
72
- # ==== Options
73
- #
74
- # * name - the name (def. nil)
75
- #
76
- def initialize(name = nil)
77
- @impl = Cproton.pn_messenger(name)
78
- @selectables = {}
79
- ObjectSpace.define_finalizer(self, self.class.finalize!(@impl))
80
- end
81
-
82
- def self.finalize!(impl) # :nodoc:
83
- proc {
84
- Cproton.pn_messenger_free(impl)
85
- }
86
- end
87
-
88
- # Returns the name.
89
- #
90
- def name
91
- Cproton.pn_messenger_name(@impl)
92
- end
93
-
94
- # This property contains the password for the Messenger.private_key
95
- # file, or +nil+ if the file is not encrypted.
96
- #
97
- # ==== Arguments
98
- #
99
- # * password - the password
100
- #
101
- def password=(password)
102
- Cproton.pn_messenger_set_password(@impl, password)
103
- end
104
-
105
- # Returns the password property for the Messenger.private_key file.
106
- #
107
- def password
108
- Cproton.pn_messenger_get_password(@impl)
109
- end
110
-
111
- # Sets the timeout period, in milliseconds.
112
- #
113
- # A negative timeout period implies an infinite timeout.
114
- #
115
- # ==== Options
116
- #
117
- # * timeout - the timeout period
118
- #
119
- def timeout=(timeout)
120
- raise TypeError.new("invalid timeout: #{timeout}") if timeout.nil?
121
- Cproton.pn_messenger_set_timeout(@impl, timeout)
122
- end
123
-
124
- # Returns the timeout period
125
- #
126
- def timeout
127
- Cproton.pn_messenger_get_timeout(@impl)
128
- end
129
-
130
- # Returns true if blocking mode is enabled.
131
- #
132
- # Enable or disable blocking behavior during message sending
133
- # and receiving. This affects every blocking call, with the
134
- # exception of work(). Currently, the affected calls are
135
- # send, recv, and stop.
136
- def blocking?
137
- Cproton.pn_messenger_is_blocking(@impl)
138
- end
139
-
140
- # Sets the blocking mode.
141
- def blocking=(blocking)
142
- Cproton.pn_messenger_set_blocking(@impl, blocking)
143
- end
144
-
145
- # Returns true if passive mode is enabled.
146
- #
147
- def passive?
148
- Cproton.pn_messenger_is_passive(@impl)
149
- end
150
-
151
- # Turns passive mode on or off.
152
- #
153
- # When set to passive mode, Messenger will not attempt to perform I/O
154
- # operations internally. In this mode it is necesssary to use the
155
- # Selectable type to drive any I/O needed to perform requestioned
156
- # actions.
157
- #
158
- # In this mode Messenger will never block.
159
- #
160
- def passive=(mode)
161
- Cproton.pn_messenger_set_passive(@impl, mode)
162
- end
163
-
164
- def deadline
165
- tstamp = Cproton.pn_messenger_deadline(@impl)
166
- return tstamp / 1000.0 unless tstamp.nil?
167
- end
168
-
169
- # Reports whether an error occurred.
170
- #
171
- def error?
172
- !Cproton.pn_messenger_errno(@impl).zero?
173
- end
174
-
175
- # Returns the most recent error number.
176
- #
177
- def errno
178
- Cproton.pn_messenger_errno(@impl)
179
- end
180
-
181
- # Returns the most recent error message.
182
- #
183
- def error
184
- Cproton.pn_error_text(Cproton.pn_messenger_error(@impl))
185
- end
186
-
187
- # Clears the current error state.
188
- #
189
- def clear_error
190
- error = Cproton.pn_messenger_error(@impl)
191
- unless error.nil?
192
- Cproton.pn_error_clear(error)
193
- end
194
- end
195
-
196
- # Currently a no-op placeholder.
197
- # For future compatibility, do not send or recv messages
198
- # before starting the +Messenger+.
199
- #
200
- def start
201
- Cproton.pn_messenger_start(@impl)
202
- end
203
-
204
- # Stops the +Messenger+, preventing it from sending or receiving
205
- # any more messages.
206
- #
207
- def stop
208
- Cproton.pn_messenger_stop(@impl)
209
- end
210
-
211
- # Returns true if a Messenger is in the stopped state.
212
- # This function does not block.
213
- #
214
- def stopped?
215
- Cproton.pn_messenger_stopped(@impl)
216
- end
217
-
218
- # Subscribes the Messenger to messages originating from the
219
- # specified source. The source is an address as specified in the
220
- # Messenger introduction with the following addition. If the
221
- # domain portion of the address begins with the '~' character, the
222
- # Messenger will interpret the domain as host/port, bind to it,
223
- # and listen for incoming messages. For example "~0.0.0.0",
224
- # "amqp://~0.0.0.0" will all bind to any local interface and
225
- # listen for incoming messages. An address of "amqps://~0.0.0.0"
226
- # will only permit incoming SSL connections.
227
- #
228
- # ==== Options
229
- #
230
- # * address - the source address to be subscribe
231
- # * timeout - an optional time-to-live value, in seconds, for the
232
- # subscription
233
- #
234
- def subscribe(address, timeout=0)
235
- raise TypeError.new("invalid address: #{address}") if address.nil?
236
- subscription = Cproton.pn_messenger_subscribe_ttl(@impl, address, timeout)
237
- raise Qpid::Proton::ProtonError.new("Subscribe failed") if subscription.nil?
238
- Qpid::Proton::Subscription.new(subscription)
239
- end
240
-
241
- # Path to a certificate file for the +Messenger+.
242
- #
243
- # This certificate is used when the +Messenger+ accepts or establishes
244
- # SSL/TLS connections. This property must be specified for the
245
- # Messenger to accept incoming SSL/TLS connections and to establish
246
- # client authenticated outgoing SSL/TLS connection. Non client authenticated
247
- # outgoing SSL/TLS connections do not require this property.
248
- #
249
- # ==== Options
250
- #
251
- # * certificate - the certificate
252
- #
253
- def certificate=(certificate)
254
- Cproton.pn_messenger_set_certificate(@impl, certificate)
255
- end
256
-
257
- # Returns the path to a certificate file.
258
- #
259
- def certificate
260
- Cproton.pn_messenger_get_certificate(@impl)
261
- end
262
-
263
- # Path to a private key file for the +Messenger+.
264
- #
265
- # The property must be specified for the +Messenger+ to accept incoming
266
- # SSL/TLS connections and to establish client authenticated outgoing
267
- # SSL/TLS connections. Non client authenticated SSL/TLS connections
268
- # do not require this property.
269
- #
270
- # ==== Options
271
- #
272
- # * key - the key file
273
- #
274
- def private_key=(key)
275
- Cproton.pn_messenger_set_private_key(@impl, key)
276
- end
277
-
278
- # Returns the path to a private key file.
279
- #
280
- def private_key
281
- Cproton.pn_messenger_get_private_key(@impl)
282
- end
283
-
284
- # A path to a database of trusted certificates for use in verifying the
285
- # peer on an SSL/TLS connection. If this property is +nil+, then the
286
- # peer will not be verified.
287
- #
288
- # ==== Options
289
- #
290
- # * certificates - the certificates path
291
- #
292
- def trusted_certificates=(certificates)
293
- Cproton.pn_messenger_set_trusted_certificates(@impl,certificates)
294
- end
295
-
296
- # The path to the databse of trusted certificates.
297
- #
298
- def trusted_certificates
299
- Cproton.pn_messenger_get_trusted_certificates(@impl)
300
- end
301
-
302
- # Places the content contained in the message onto the outgoing
303
- # queue of the Messenger.
304
- #
305
- # This method will never block, however it will send any unblocked
306
- # Messages in the outgoing queue immediately and leave any blocked
307
- # Messages remaining in the outgoing queue.
308
- # The send call may then be used to block until the outgoing queue
309
- # is empty. The outgoing attribute may be used to check the depth
310
- # of the outgoing queue.
311
- #
312
- # ==== Options
313
- #
314
- # * message - the message
315
- #
316
- def put(message)
317
- raise TypeError.new("invalid message: #{message}") if message.nil?
318
- raise ArgumentError.new("invalid message type: #{message.class}") unless message.kind_of?(Message)
319
- # encode the message first
320
- message.pre_encode
321
- perform_put(message)
322
- return outgoing_tracker
323
- end
324
-
325
- private
326
-
327
- def perform_put(message) # :nodoc:
328
- Cproton.pn_messenger_put(@impl, message.impl)
329
- end
330
-
331
- public
332
-
333
-
334
- # This call will block until the indicated number of messages
335
- # have been sent, or until the operation times out.
336
- # If n is -1 this call will block until all outgoing messages
337
- # have been sent. If n is 0 then this call will send whatever
338
- # it can without blocking.
339
- #
340
- def send(n = -1)
341
- Cproton.pn_messenger_send(@impl, n)
342
- end
343
-
344
- # Moves the message from the head of the incoming message queue into
345
- # the supplied message object. Any content in the supplied message
346
- # will be overwritten.
347
- # A tracker for the incoming Message is returned. The tracker can
348
- # later be used to communicate your acceptance or rejection of the
349
- # Message.
350
- #
351
- # If no message is provided in the argument, then one is created. In
352
- # either case, the one returned will be the fetched message.
353
- #
354
- # ==== Options
355
- #
356
- # * msg - the (optional) +Message+ instance to be used
357
- #
358
- def get(msg = nil)
359
- msg_impl = nil
360
- if msg.nil? then
361
- msg_impl = nil
362
- else
363
- msg_impl = msg.impl
364
- end
365
- perform_get(msg_impl)
366
- msg.post_decode unless msg.nil?
367
- return incoming_tracker
368
- end
369
-
370
- private
371
-
372
- def perform_get(msg) # :nodoc:
373
- Cproton.pn_messenger_get(@impl, msg)
374
- end
375
-
376
- public
377
-
378
- # Receives up to limit messages into the incoming queue. If no value
379
- # for limit is supplied, this call will receive as many messages as it
380
- # can buffer internally. If the Messenger is in blocking mode, this
381
- # call will block until at least one Message is available in the
382
- # incoming queue.
383
- #
384
- # Options ====
385
- #
386
- # * limit - the maximum number of messages to receive
387
- #
388
- def receive(limit = -1)
389
- Cproton.pn_messenger_recv(@impl, limit)
390
- end
391
-
392
- # Returns true if the messenger is currently receiving data.
393
- def receiving?
394
- Cproton.pn_messenger_receiving(@impl)
395
- end
396
-
397
- # Attempts interrupting of the messenger thread.
398
- #
399
- # The Messenger interface is single-threaded, and this is the only
400
- # function intended to be called from outside of is thread.
401
- #
402
- # Call this from a non-Messenger thread to interrupt it while it
403
- # is blocking. This will cause a ::InterruptError to be raised.
404
- #
405
- # If there is no currently blocking call, then the next blocking
406
- # call will be affected, even if it is within the same thread that
407
- # originated the interrupt.
408
- #
409
- def interrupt
410
- Cproton.pn_messenger_interrupt(@impl)
411
- end
412
-
413
- # Sends or receives any outstanding messages queued for a Messenger.
414
- #
415
- # This will block for the indicated timeout. This method may also do I/O
416
- # other than sending and receiving messages. For example, closing
417
- # connections after stop() has been called.
418
- #
419
- def work(timeout=-1)
420
- err = Cproton.pn_messenger_work(@impl, timeout)
421
- if (err == Cproton::PN_TIMEOUT) then
422
- return false
423
- else
424
- check_for_error(err)
425
- return true
426
- end
427
- end
428
-
429
- # Returns the number messages in the outgoing queue that have not been
430
- # transmitted.
431
- #
432
- def outgoing
433
- Cproton.pn_messenger_outgoing(@impl)
434
- end
435
-
436
- # Returns the number of messages in the incoming queue that have not
437
- # been retrieved.
438
- #
439
- def incoming
440
- Cproton.pn_messenger_incoming(@impl)
441
- end
442
-
443
- # Adds a routing rule to the Messenger's internal routing table.
444
- #
445
- # The route procedure may be used to influence how a Messenger will
446
- # internally treat a given address or class of addresses. Every call
447
- # to the route procedure will result in Messenger appending a routing
448
- # rule to its internal routing table.
449
- #
450
- # Whenever a Message is presented to a Messenger for delivery, it
451
- # will match the address of this message against the set of routing
452
- # rules in order. The first rule to match will be triggered, and
453
- # instead of routing based on the address presented in the message,
454
- # the Messenger will route based on the address supplied in the rule.
455
- #
456
- # The pattern matching syntax supports two types of matches, a '%'
457
- # will match any character except a '/', and a '*' will match any
458
- # character including a '/'.
459
- #
460
- # A routing address is specified as a normal AMQP address, however it
461
- # may additionally use substitution variables from the pattern match
462
- # that triggered the rule.
463
- #
464
- # ==== Arguments
465
- #
466
- # * pattern - the address pattern
467
- # * address - the target address
468
- #
469
- # ==== Examples
470
- #
471
- # # route messages sent to foo to the destionaty amqp://foo.com
472
- # messenger.route("foo", "amqp://foo.com")
473
- #
474
- # # any message to foobar will be routed to amqp://foo.com/bar
475
- # messenger.route("foobar", "amqp://foo.com/bar")
476
- #
477
- # # any message to bar/<path> will be routed to the same path within
478
- # # the amqp://bar.com domain
479
- # messenger.route("bar/*", "amqp://bar.com/$1")
480
- #
481
- # # route all Message objects over TLS
482
- # messenger.route("amqp:*", "amqps:$1")
483
- #
484
- # # supply credentials for foo
485
- # messenger.route("amqp://foo.com/*", "amqp://user:password@foo.com/$1")
486
- #
487
- # # supply credentials for all domains
488
- # messenger.route("amqp://*", "amqp://user:password@$1")
489
- #
490
- # # route all addresses through a single proxy while preserving the
491
- # # original destination
492
- # messenger.route("amqp://%$/*", "amqp://user:password@proxy/$1/$2")
493
- #
494
- # # route any address through a single broker
495
- # messenger.route("*", "amqp://user:password@broker/$1")
496
- #
497
- def route(pattern, address)
498
- Cproton.pn_messenger_route(@impl, pattern, address)
499
- end
500
-
501
- # Similar to #route, except that the destination of
502
- # the Message is determined before the message address is rewritten.
503
- #
504
- # The outgoing address is only rewritten after routing has been
505
- # finalized. If a message has an outgoing address of
506
- # "amqp://0.0.0.0:5678", and a rewriting rule that changes its
507
- # outgoing address to "foo", it will still arrive at the peer that
508
- # is listening on "amqp://0.0.0.0:5678", but when it arrives there,
509
- # the receiver will see its outgoing address as "foo".
510
- #
511
- # The default rewrite rule removes username and password from addresses
512
- # before they are transmitted.
513
- #
514
- # ==== Arguments
515
- #
516
- # * pattern - the outgoing address
517
- # * address - the target address
518
- #
519
- def rewrite(pattern, address)
520
- Cproton.pn_messenger_rewrite(@impl, pattern, address)
521
- end
522
-
523
- def selectable
524
- impl = Cproton.pn_messenger_selectable(@impl)
525
-
526
- # if we don't have any selectables, then return
527
- return nil if impl.nil?
528
-
529
- fd = Cproton.pn_selectable_fd(impl)
530
-
531
- selectable = @selectables[fd]
532
- if selectable.nil?
533
- selectable = Selectable.new(self, impl)
534
- @selectables[fd] = selectable
535
- end
536
- return selectable
537
- end
538
-
539
- # Returns a +Tracker+ for the message most recently sent via the put
540
- # method.
541
- #
542
- def outgoing_tracker
543
- impl = Cproton.pn_messenger_outgoing_tracker(@impl)
544
- return nil if impl == -1
545
- Qpid::Proton::Tracker.new(impl)
546
- end
547
-
548
- # Returns a +Tracker+ for the most recently received message.
549
- #
550
- def incoming_tracker
551
- impl = Cproton.pn_messenger_incoming_tracker(@impl)
552
- return nil if impl == -1
553
- Qpid::Proton::Tracker.new(impl)
554
- end
555
-
556
- # Signal the sender that you have acted on the Message
557
- # pointed to by the tracker. If no tracker is supplied,
558
- # then all messages that have been returned by the get
559
- # method are accepted, except those that have already been
560
- # auto-settled by passing beyond your incoming window size.
561
- #
562
- # ==== Options
563
- #
564
- # * tracker - the tracker
565
- #
566
- def accept(tracker = nil)
567
- raise TypeError.new("invalid tracker: #{tracker}") unless tracker.nil? or valid_tracker?(tracker)
568
- if tracker.nil? then
569
- tracker = self.incoming_tracker
570
- flag = Cproton::PN_CUMULATIVE
571
- else
572
- flag = 0
573
- end
574
- Cproton.pn_messenger_accept(@impl, tracker.impl, flag)
575
- end
576
-
577
- # Rejects the incoming message identified by the tracker.
578
- # If no tracker is supplied, all messages that have been returned
579
- # by the get method are rejected, except those that have already
580
- # been auto-settled by passing beyond your outgoing window size.
581
- #
582
- # ==== Options
583
- #
584
- # * tracker - the tracker
585
- #
586
- def reject(tracker)
587
- raise TypeError.new("invalid tracker: #{tracker}") unless tracker.nil? or valid_tracker?(tracker)
588
- if tracker.nil? then
589
- tracker = self.incoming_tracker
590
- flag = Cproton::PN_CUMULATIVE
591
- else
592
- flag = 0
593
- end
594
- Cproton.pn_messenger_reject(@impl, tracker.impl, flag)
595
- end
596
-
597
- # Gets the last known remote state of the delivery associated with
598
- # the given tracker, as long as the Message is still within your
599
- # outgoing window. (Also works on incoming messages that are still
600
- # within your incoming queue. See TrackerStatus for details on the
601
- # values returned.
602
- #
603
- # ==== Options
604
- #
605
- # * tracker - the tracker
606
- #
607
- def status(tracker)
608
- raise TypeError.new("invalid tracker: #{tracker}") unless valid_tracker?(tracker)
609
- Qpid::Proton::TrackerStatus.by_value(Cproton.pn_messenger_status(@impl, tracker.impl))
610
- end
611
-
612
- # Frees a Messenger from tracking the status associated
613
- # with a given tracker. If you don't supply a tracker, all
614
- # outgoing messages up to the most recent will be settled.
615
- #
616
- # ==== Options
617
- #
618
- # * tracker - the tracker
619
- #
620
- # ==== Examples
621
- #
622
- def settle(tracker)
623
- raise TypeError.new("invalid tracker: #{tracker}") unless valid_tracker?(tracker)
624
- if tracker.nil? then
625
- tracker = self.incoming_tracker
626
- flag = Cproton::PN_CUMULATIVE
627
- else
628
- flag = 0
629
- end
630
- Cproton.pn_messenger_settle(@impl, tracker.impl, flag)
631
- end
632
-
633
- # Sets the incoming window.
634
- #
635
- # The Messenger will track the remote status of this many incoming
636
- # deliveries after they have been accepted or rejected.
637
- #
638
- # Messages enter this window only when you take them into your application
639
- # using get(). If your incoming window size is n, and you get n+1 messages
640
- # without explicitly accepting or rejecting the oldest message, then the
641
- # message that passes beyond the edge of the incoming window will be
642
- # assigned the default disposition of its link.
643
- #
644
- # ==== Options
645
- #
646
- # * window - the window size
647
- #
648
- def incoming_window=(window)
649
- raise TypeError.new("invalid window: #{window}") unless valid_window?(window)
650
- Cproton.pn_messenger_set_incoming_window(@impl, window)
651
- end
652
-
653
- # Returns the incoming window.
654
- #
655
- def incoming_window
656
- Cproton.pn_messenger_get_incoming_window(@impl)
657
- end
658
-
659
- # Sets the outgoing window.
660
- #
661
- # The Messenger will track the remote status of this many outgoing
662
- # deliveries after calling send.
663
- # A Message enters this window when you call the put() method with the
664
- # message. If your outgoing window size is n, and you call put n+1
665
- # times, status information will no longer be available for the
666
- # first message.
667
- #
668
- # ==== Options
669
- #
670
- # * window - the window size
671
- #
672
- def outgoing_window=(window)
673
- raise TypeError.new("invalid window: #{window}") unless valid_window?(window)
674
- Cproton.pn_messenger_set_outgoing_window(@impl, window)
675
- end
676
-
677
- # Returns the outgoing window.
678
- #
679
- def outgoing_window
680
- Cproton.pn_messenger_get_outgoing_window(@impl)
681
- end
682
-
683
- # Unregisters a selectable object.
684
- def unregister_selectable(fileno) # :nodoc:
685
- @selectables.delete(fileno)
686
- end
687
-
688
- private
689
-
690
- def valid_tracker?(tracker)
691
- !tracker.nil? && tracker.is_a?(Qpid::Proton::Tracker)
692
- end
693
-
694
- def valid_window?(window)
695
- !window.nil? && [Float, Fixnum].include?(window.class)
696
- end
697
-
698
- end
699
-
700
- end
701
-
702
- end