qpid_proton 0.8 → 0.9.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.
@@ -17,9 +17,9 @@
17
17
  # under the License.
18
18
  #
19
19
 
20
- module Qpid
20
+ module Qpid # :nodoc:
21
21
 
22
- module Proton
22
+ module Proton # :nodoc:
23
23
 
24
24
  # The +Messenger+ class defines a high level interface for
25
25
  # sending and receiving Messages. Every Messenger contains
@@ -59,6 +59,11 @@ module Qpid
59
59
 
60
60
  include Qpid::Proton::ExceptionHandling
61
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
+
62
67
  # Creates a new +Messenger+.
63
68
  #
64
69
  # The +name+ parameter is optional. If one is not provided then
@@ -94,7 +99,7 @@ module Qpid
94
99
  # * password - the password
95
100
  #
96
101
  def password=(password)
97
- check_for_error(Cproton.pn_messenger_set_password(@impl, password))
102
+ Cproton.pn_messenger_set_password(@impl, password)
98
103
  end
99
104
 
100
105
  # Returns the password property for the Messenger.private_key file.
@@ -179,25 +184,34 @@ module Qpid
179
184
  Cproton.pn_error_text(Cproton.pn_messenger_error(@impl))
180
185
  end
181
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
+
182
196
  # Currently a no-op placeholder.
183
197
  # For future compatibility, do not send or recv messages
184
198
  # before starting the +Messenger+.
185
199
  #
186
200
  def start
187
- check_for_error(Cproton.pn_messenger_start(@impl))
201
+ Cproton.pn_messenger_start(@impl)
188
202
  end
189
203
 
190
204
  # Stops the +Messenger+, preventing it from sending or receiving
191
205
  # any more messages.
192
206
  #
193
207
  def stop
194
- check_for_error(Cproton.pn_messenger_stop(@impl))
208
+ Cproton.pn_messenger_stop(@impl)
195
209
  end
196
210
 
197
- # Returns true iff a Messenger is in the stopped state.
211
+ # Returns true if a Messenger is in the stopped state.
198
212
  # This function does not block.
199
213
  #
200
- def stopped
214
+ def stopped?
201
215
  Cproton.pn_messenger_stopped(@impl)
202
216
  end
203
217
 
@@ -207,13 +221,19 @@ module Qpid
207
221
  # domain portion of the address begins with the '~' character, the
208
222
  # Messenger will interpret the domain as host/port, bind to it,
209
223
  # and listen for incoming messages. For example "~0.0.0.0",
210
- # "amqp://~0.0.0.0" will all bind to any local interface and
211
- # listen for incoming messages. Ad address of # "amqps://~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"
212
226
  # will only permit incoming SSL connections.
213
227
  #
214
- def subscribe(address)
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)
215
235
  raise TypeError.new("invalid address: #{address}") if address.nil?
216
- subscription = Cproton.pn_messenger_subscribe(@impl, address)
236
+ subscription = Cproton.pn_messenger_subscribe_ttl(@impl, address, timeout)
217
237
  raise Qpid::Proton::ProtonError.new("Subscribe failed") if subscription.nil?
218
238
  Qpid::Proton::Subscription.new(subscription)
219
239
  end
@@ -282,10 +302,10 @@ module Qpid
282
302
  # Places the content contained in the message onto the outgoing
283
303
  # queue of the Messenger.
284
304
  #
285
- # This method will never block, however it will send any unblocked
305
+ # This method will never block, however it will send any unblocked
286
306
  # Messages in the outgoing queue immediately and leave any blocked
287
307
  # Messages remaining in the outgoing queue.
288
- # The send call may then be used to block until the outgoing queue
308
+ # The send call may then be used to block until the outgoing queue
289
309
  # is empty. The outgoing attribute may be used to check the depth
290
310
  # of the outgoing queue.
291
311
  #
@@ -298,18 +318,27 @@ module Qpid
298
318
  raise ArgumentError.new("invalid message type: #{message.class}") unless message.kind_of?(Message)
299
319
  # encode the message first
300
320
  message.pre_encode
301
- check_for_error(Cproton.pn_messenger_put(@impl, message.impl))
321
+ perform_put(message)
302
322
  return outgoing_tracker
303
323
  end
304
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
+
305
334
  # This call will block until the indicated number of messages
306
335
  # have been sent, or until the operation times out.
307
- # If n is -1 this call will block until all outgoing messages
308
- # have been sent. If n is 0 then this call will send whatever
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
309
338
  # it can without blocking.
310
339
  #
311
340
  def send(n = -1)
312
- check_for_error(Cproton.pn_messenger_send(@impl, n))
341
+ Cproton.pn_messenger_send(@impl, n)
313
342
  end
314
343
 
315
344
  # Moves the message from the head of the incoming message queue into
@@ -333,11 +362,19 @@ module Qpid
333
362
  else
334
363
  msg_impl = msg.impl
335
364
  end
336
- check_for_error(Cproton.pn_messenger_get(@impl, msg_impl))
365
+ perform_get(msg_impl)
337
366
  msg.post_decode unless msg.nil?
338
367
  return incoming_tracker
339
368
  end
340
369
 
370
+ private
371
+
372
+ def perform_get(msg) # :nodoc:
373
+ Cproton.pn_messenger_get(@impl, msg)
374
+ end
375
+
376
+ public
377
+
341
378
  # Receives up to limit messages into the incoming queue. If no value
342
379
  # for limit is supplied, this call will receive as many messages as it
343
380
  # can buffer internally. If the Messenger is in blocking mode, this
@@ -349,10 +386,11 @@ module Qpid
349
386
  # * limit - the maximum number of messages to receive
350
387
  #
351
388
  def receive(limit = -1)
352
- check_for_error(Cproton.pn_messenger_recv(@impl, limit))
389
+ Cproton.pn_messenger_recv(@impl, limit)
353
390
  end
354
391
 
355
- def receiving
392
+ # Returns true if the messenger is currently receiving data.
393
+ def receiving?
356
394
  Cproton.pn_messenger_receiving(@impl)
357
395
  end
358
396
 
@@ -369,7 +407,7 @@ module Qpid
369
407
  # originated the interrupt.
370
408
  #
371
409
  def interrupt
372
- check_for_error(Cproton.pn_messenger_interrupt(@impl))
410
+ Cproton.pn_messenger_interrupt(@impl)
373
411
  end
374
412
 
375
413
  # Sends or receives any outstanding messages queued for a Messenger.
@@ -377,7 +415,7 @@ module Qpid
377
415
  # This will block for the indicated timeout. This method may also do I/O
378
416
  # other than sending and receiving messages. For example, closing
379
417
  # connections after stop() has been called.
380
- #
418
+ #
381
419
  def work(timeout=-1)
382
420
  err = Cproton.pn_messenger_work(@impl, timeout)
383
421
  if (err == Cproton::PN_TIMEOUT) then
@@ -457,7 +495,7 @@ module Qpid
457
495
  # messenger.route("*", "amqp://user:password@broker/$1")
458
496
  #
459
497
  def route(pattern, address)
460
- check_for_error(Cproton.pn_messenger_route(@impl, pattern, address))
498
+ Cproton.pn_messenger_route(@impl, pattern, address)
461
499
  end
462
500
 
463
501
  # Similar to #route, except that the destination of
@@ -479,7 +517,7 @@ module Qpid
479
517
  # * address - the target address
480
518
  #
481
519
  def rewrite(pattern, address)
482
- check_for_error(Cproton.pn_messenger_rewrite(@impl, pattern, address))
520
+ Cproton.pn_messenger_rewrite(@impl, pattern, address)
483
521
  end
484
522
 
485
523
  def selectable
@@ -533,7 +571,7 @@ module Qpid
533
571
  else
534
572
  flag = 0
535
573
  end
536
- check_for_error(Cproton.pn_messenger_accept(@impl, tracker.impl, flag))
574
+ Cproton.pn_messenger_accept(@impl, tracker.impl, flag)
537
575
  end
538
576
 
539
577
  # Rejects the incoming message identified by the tracker.
@@ -553,13 +591,13 @@ module Qpid
553
591
  else
554
592
  flag = 0
555
593
  end
556
- check_for_error(Cproton.pn_messenger_reject(@impl, tracker.impl, flag))
594
+ Cproton.pn_messenger_reject(@impl, tracker.impl, flag)
557
595
  end
558
596
 
559
597
  # Gets the last known remote state of the delivery associated with
560
- # the given tracker, as long as the Message is still within your
561
- # outgoing window. (Also works on incoming messages that are still
562
- # within your incoming queue. See TrackerStatus for details on the
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
563
601
  # values returned.
564
602
  #
565
603
  # ==== Options
@@ -594,13 +632,13 @@ module Qpid
594
632
 
595
633
  # Sets the incoming window.
596
634
  #
597
- # The Messenger will track the remote status of this many incoming
635
+ # The Messenger will track the remote status of this many incoming
598
636
  # deliveries after they have been accepted or rejected.
599
637
  #
600
638
  # Messages enter this window only when you take them into your application
601
639
  # using get(). If your incoming window size is n, and you get n+1 messages
602
640
  # without explicitly accepting or rejecting the oldest message, then the
603
- # message that passes beyond the edge of the incoming window will be
641
+ # message that passes beyond the edge of the incoming window will be
604
642
  # assigned the default disposition of its link.
605
643
  #
606
644
  # ==== Options
@@ -609,7 +647,7 @@ module Qpid
609
647
  #
610
648
  def incoming_window=(window)
611
649
  raise TypeError.new("invalid window: #{window}") unless valid_window?(window)
612
- check_for_error(Cproton.pn_messenger_set_incoming_window(@impl, window))
650
+ Cproton.pn_messenger_set_incoming_window(@impl, window)
613
651
  end
614
652
 
615
653
  # Returns the incoming window.
@@ -620,7 +658,7 @@ module Qpid
620
658
 
621
659
  # Sets the outgoing window.
622
660
  #
623
- # The Messenger will track the remote status of this many outgoing
661
+ # The Messenger will track the remote status of this many outgoing
624
662
  # deliveries after calling send.
625
663
  # A Message enters this window when you call the put() method with the
626
664
  # message. If your outgoing window size is n, and you call put n+1
@@ -633,7 +671,7 @@ module Qpid
633
671
  #
634
672
  def outgoing_window=(window)
635
673
  raise TypeError.new("invalid window: #{window}") unless valid_window?(window)
636
- check_for_error(Cproton.pn_messenger_set_outgoing_window(@impl, window))
674
+ Cproton.pn_messenger_set_outgoing_window(@impl, window)
637
675
  end
638
676
 
639
677
  # Returns the outgoing window.
@@ -1,4 +1,4 @@
1
- #
1
+ #--
2
2
  # Licensed to the Apache Software Foundation (ASF) under one
3
3
  # or more contributor license agreements. See the NOTICE file
4
4
  # distributed with this work for additional information
@@ -15,11 +15,11 @@
15
15
  # KIND, either express or implied. See the License for the
16
16
  # specific language governing permissions and limitations
17
17
  # under the License.
18
- #
18
+ #++
19
19
 
20
- module Qpid
20
+ module Qpid # :nodoc:
21
21
 
22
- module Proton
22
+ module Proton # :nodoc:
23
23
 
24
24
  # Selectable enables accessing the underlying file descriptors
25
25
  # for Messenger.
@@ -0,0 +1,65 @@
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
+ def self.is_valid_utf?(value)
25
+ # In Ruby 1.9+ we have encoding methods that can check the content of
26
+ # the string, so use them to see if what we have is unicode. If so,
27
+ # good! If not, then just treat is as binary.
28
+ #
29
+ # No such thing in Ruby 1.8. So there we need to use Iconv to try and
30
+ # convert it to unicode. If it works, good! But if it raises an
31
+ # exception then we'll treat it as binary.
32
+ if RUBY_VERSION < "1.9"
33
+ return true if value.isutf8
34
+ return false
35
+ else
36
+ return true if (value.encoding == "UTF-8" ||
37
+ value.encode("UTF-8").valid_encoding?)
38
+
39
+ return false
40
+ end
41
+ end
42
+
43
+ # UTFString lets an application explicitly state that a
44
+ # string of characters is to be UTF-8 encoded.
45
+ #
46
+ class UTFString < ::String
47
+
48
+ def initialize(value)
49
+ if !Qpid::Proton.is_valid_utf?(value)
50
+ raise RuntimeError.new("invalid UTF string")
51
+ end
52
+
53
+ super(value)
54
+ end
55
+
56
+ end
57
+
58
+ # BinaryString lets an application explicitly declare that
59
+ # a string value represents arbitrary data.
60
+ #
61
+ class BinaryString < ::String; end
62
+
63
+ end
64
+
65
+ end
@@ -1,4 +1,4 @@
1
- #
1
+ #--
2
2
  # Licensed to the Apache Software Foundation (ASF) under one
3
3
  # or more contributor license agreements. See the NOTICE file
4
4
  # distributed with this work for additional information
@@ -15,11 +15,11 @@
15
15
  # KIND, either express or implied. See the License for the
16
16
  # specific language governing permissions and limitations
17
17
  # under the License.
18
- #
18
+ #++
19
19
 
20
- module Qpid
20
+ module Qpid # :nodoc:
21
21
 
22
- module Proton
22
+ module Proton # :nodoc:
23
23
 
24
24
  # A +Subscription+ is an opaque object for working with a +Messenger+'s
25
25
  # subscriptions.
@@ -1,4 +1,4 @@
1
- #
1
+ #--
2
2
  # Licensed to the Apache Software Foundation (ASF) under one
3
3
  # or more contributor license agreements. See the NOTICE file
4
4
  # distributed with this work for additional information
@@ -15,11 +15,11 @@
15
15
  # KIND, either express or implied. See the License for the
16
16
  # specific language governing permissions and limitations
17
17
  # under the License.
18
- #
18
+ #++
19
19
 
20
- module Qpid
20
+ module Qpid # :nodoc:
21
21
 
22
- module Proton
22
+ module Proton # :nodoc:
23
23
 
24
24
  # A +Tracker+ is used to track the disposition of a +Message+.
25
25
  #
@@ -1,4 +1,4 @@
1
- #
1
+ #--
2
2
  # Licensed to the Apache Software Foundation (ASF) under one
3
3
  # or more contributor license agreements. See the NOTICE file
4
4
  # distributed with this work for additional information
@@ -15,11 +15,11 @@
15
15
  # KIND, either express or implied. See the License for the
16
16
  # specific language governing permissions and limitations
17
17
  # under the License.
18
- #
18
+ #++
19
19
 
20
- module Qpid
20
+ module Qpid # :nodoc:
21
21
 
22
- module Proton
22
+ module Proton # :nodoc:
23
23
 
24
24
  # TrackerStatus contains symbols that represent the status value for a
25
25
  # Tracker.
@@ -1,4 +1,4 @@
1
- #
1
+ #--
2
2
  # Licensed to the Apache Software Foundation (ASF) under one
3
3
  # or more contributor license agreements. See the NOTICE file
4
4
  # distributed with this work for additional information
@@ -15,13 +15,16 @@
15
15
  # KIND, either express or implied. See the License for the
16
16
  # specific language governing permissions and limitations
17
17
  # under the License.
18
- #
18
+ #++
19
19
 
20
- module Qpid
20
+ module Qpid # :nodoc:
21
21
 
22
- module Proton
22
+ module Proton # :nodoc:
23
23
 
24
+ # The major version for the underlying Proton library.
24
25
  VERSION_MAJOR = Cproton::PN_VERSION_MAJOR
26
+
27
+ # The minor version for the underlying Proton library.
25
28
  VERSION_MINOR = Cproton::PN_VERSION_MINOR
26
29
 
27
30
  end