qpid_proton 0.9.0 → 0.10

Sign up to get free protection for your applications and to get access to all the features.
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,66 +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
- class Described
25
-
26
- attr_reader :descriptor
27
- attr_reader :value
28
-
29
- def initialize(descriptor, value)
30
- @descriptor = descriptor
31
- @value = value
32
- end
33
-
34
- # Puts the description into the Data object.
35
- #
36
- # ==== Arguments
37
- #
38
- # * data - the Qpid::Proton::Data instance
39
- #
40
- # ==== Examples
41
- #
42
- # described = Qpid::Proton::Described.new("my-descriptor", "the value")
43
- # data = Qpid::Proton::Data.new
44
- # ...
45
- # described.put(data)
46
- #
47
- def put(data)
48
- data.symbol = @descriptor
49
- data.string = @value
50
- end
51
-
52
- def ==(that) # :nodoc:
53
- (that.is_a?(Qpid::Proton::Described) &&
54
- (self.descriptor == that.descriptor) &&
55
- (self.value == that.value))
56
- end
57
-
58
- def to_s # :nodoc:
59
- "descriptor=#{descriptor} value=#{value}"
60
- end
61
-
62
- end
63
-
64
- end
65
-
66
- end
@@ -1,127 +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
- # Provides mixin functionality for dealing with exception conditions.
25
- #
26
- module ExceptionHandling
27
-
28
- def self.included(base)
29
- base.extend(self)
30
-
31
- unless defined? base.to_be_wrapped
32
- class << base
33
- @@to_be_wrapped = []
34
- end
35
- end
36
-
37
- define_method :method_added do |name|
38
- if (!@@to_be_wrapped.nil?) && (@@to_be_wrapped.include? name)
39
- @@to_be_wrapped.delete name
40
- create_exception_handler_wrapper(name)
41
- end
42
- end
43
- end
44
-
45
- def can_raise_exception(method_names)
46
- # coerce the names to be an array
47
- Array(method_names).each do |method_name|
48
- # if the method doesn't already exist then queue this aliasing
49
- unless self.method_defined? method_name
50
- @@to_be_wrapped ||= []
51
- @@to_be_wrapped << method_name
52
- else
53
- create_exception_handler_wrapper(method_name)
54
- end
55
- end
56
- end
57
-
58
- def create_exception_handler_wrapper(method_name)
59
- original_method_name = method_name.to_s
60
- wrapped_method_name = "_excwrap_#{original_method_name}"
61
- alias_method wrapped_method_name, original_method_name
62
- define_method original_method_name do |*args, &block|
63
- # need to get a reference to the method object itself since
64
- # calls to Class.send interfere with Messenger.send
65
- method = self.method(wrapped_method_name.to_sym)
66
- rc = method.call(*args, &block)
67
- check_for_error(rc)
68
- end
69
- end
70
-
71
- # Raises an Proton-specific error if a return code is non-zero.
72
- #
73
- # Expects the class to provide an +error+ method.
74
- def check_for_error(code)
75
-
76
- raise ::ArgumentError.new("Invalid error code: #{code}") if code.nil?
77
-
78
- return code if code > 0
79
-
80
- case(code)
81
-
82
- when Qpid::Proton::Error::NONE
83
- return
84
-
85
- when Qpid::Proton::Error::EOS
86
- raise Qpid::Proton::EOSError.new(self.error)
87
-
88
- when Qpid::Proton::Error::ERROR
89
- raise Qpid::Proton::ProtonError.new(self.error)
90
-
91
- when Qpid::Proton::Error::OVERFLOW
92
- raise Qpid::Proton::OverflowError.new(self.error)
93
-
94
- when Qpid::Proton::Error::UNDERFLOW
95
- raise Qpid::Proton::UnderflowError.new(self.error)
96
-
97
- when Qpid::Proton::Error::ARGUMENT
98
- raise Qpid::Proton::ArgumentError.new(self.error)
99
-
100
- when Qpid::Proton::Error::STATE
101
- raise Qpid::Proton::StateError.new(self.error)
102
-
103
- when Qpid::Proton::Error::TIMEOUT
104
- raise Qpid::Proton::TimeoutError.new(self.error)
105
-
106
- when Qpid::Proton::Error::INPROGRESS
107
- return
108
-
109
- when Qpid::Proton::Error::INTERRUPTED
110
- raise Qpid::Proton::InterruptedError.new(self.error)
111
-
112
- when Qpid::Proton::Error::INPROGRESS
113
- raise Qpid::Proton::InProgressError.new(self.error)
114
-
115
- else
116
-
117
- raise ::ArgumentError.new("Unknown error code: #{code}")
118
-
119
- end
120
-
121
- end
122
-
123
- end
124
-
125
- end
126
-
127
- end
@@ -1,67 +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
- module Filters
25
-
26
- def self.included(base)
27
- base.class_eval do
28
- extend ClassMethods
29
- end
30
- end
31
-
32
- module ClassMethods
33
-
34
- def method_added(method_name)
35
- @@hooked_methods ||= []
36
- return if @@hooked_methods.include?(method_name)
37
- @@hooked_methods << method_name
38
- hooks = @@before_hooks[method_name]
39
- return if hooks.nil?
40
- orig_method = instance_method(method_name)
41
- define_method(method_name) do |*args, &block|
42
- hooks = @@before_hooks[method_name]
43
- hooks.each do |hook|
44
- method(hook).call
45
- end
46
-
47
- orig_method.bind(self).call(*args, &block)
48
- end
49
- end
50
-
51
- def call_before(before_method, *methods)
52
- @@before_hooks ||= {}
53
- methods.each do |method|
54
- hooks = @@before_hooks[method] || []
55
- raise "Repeat filter: #{before_method}" if hooks.include? before_method
56
- hooks << before_method
57
- @@before_hooks[method] = hooks
58
- end
59
- end
60
-
61
- end
62
-
63
- end
64
-
65
- end
66
-
67
- end
@@ -1,170 +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
- # Maps between Proton types and their Ruby native language counterparts.
25
- #
26
- class Mapping
27
-
28
- attr_reader :code
29
- attr_reader :put_method
30
- attr_reader :get_method
31
-
32
- # Creates a new mapping.
33
- #
34
- # ==== Arguments
35
- #
36
- # * code - the AMQP code for this type
37
- # * name - the AMQP name for this type
38
- # * klasses - the Ruby classes for this type
39
- # * getter - overrides the get method for the type
40
- def initialize(code, name, klasses = nil, getter = nil)
41
-
42
- @debug = (name == "bool")
43
-
44
- @code = code
45
- @name = name
46
-
47
- @@by_preferred ||= {}
48
- @@by_code ||= {}
49
- @@by_code["#{code}"] = self
50
- @@by_name ||= {}
51
- @@by_name[name] = self
52
- @@by_class ||= {}
53
-
54
- unless klasses.nil?
55
- klasses.each do |klass|
56
- raise "entry exists for #{klass}" if @@by_class.keys.include? klass
57
- @@by_class[klass] = self unless klass.nil?
58
- end
59
- end
60
-
61
- @put_method = (name + "=").intern
62
-
63
- if getter.nil?
64
- @get_method = name.intern
65
- else
66
- @get_method = getter.intern
67
- end
68
- end
69
-
70
- def to_s; @name; end
71
-
72
- def put(data, value)
73
- data.send(@put_method, value)
74
- end
75
-
76
- def get(data)
77
- data.send(@get_method)
78
- end
79
-
80
- def self.for_class(klass) # :nodoc:
81
- @@by_class[klass]
82
- end
83
-
84
- def self.for_code(code)
85
- @@by_code["#{code}"]
86
- end
87
-
88
- end
89
-
90
- NULL = Mapping.new(Cproton::PN_NULL, "null", [NilClass], "nil?")
91
- BOOL = Mapping.new(Cproton::PN_BOOL, "bool", [TrueClass, FalseClass], "bool")
92
- UBYTE = Mapping.new(Cproton::PN_UBYTE, "ubyte")
93
- BYTE = Mapping.new(Cproton::PN_BYTE, "byte")
94
- USHORT = Mapping.new(Cproton::PN_USHORT, "ushort")
95
- SHORT = Mapping.new(Cproton::PN_SHORT, "short")
96
- UINT = Mapping.new(Cproton::PN_UINT, "uint")
97
- INT = Mapping.new(Cproton::PN_INT, "int")
98
- CHAR = Mapping.new(Cproton::PN_CHAR, "char")
99
- ULONG = Mapping.new(Cproton::PN_ULONG, "ulong")
100
- LONG = Mapping.new(Cproton::PN_LONG, "long", [Fixnum, Bignum])
101
- TIMESTAMP = Mapping.new(Cproton::PN_TIMESTAMP, "timestamp", [Date, Time])
102
- FLOAT = Mapping.new(Cproton::PN_FLOAT, "float")
103
- DOUBLE = Mapping.new(Cproton::PN_DOUBLE, "double", [Float])
104
- DECIMAL32 = Mapping.new(Cproton::PN_DECIMAL32, "decimal32")
105
- DECIMAL64 = Mapping.new(Cproton::PN_DECIMAL64, "decimal64")
106
- DECIMAL128 = Mapping.new(Cproton::PN_DECIMAL128, "decimal128")
107
- UUID = Mapping.new(Cproton::PN_UUID, "uuid")
108
- BINARY = Mapping.new(Cproton::PN_BINARY, "binary")
109
- STRING = Mapping.new(Cproton::PN_STRING, "string", [String, Symbol,
110
- UTFString,
111
- BinaryString])
112
-
113
- class << STRING # :nodoc:
114
- def put(data, value)
115
- # if we have a symbol then convert it to a string
116
- value = value.to_s if value.is_a?(Symbol)
117
-
118
- isutf = false
119
-
120
- if value.is_a?(Qpid::Proton::UTFString)
121
- isutf = true
122
- else
123
- # For Ruby 1.8 we will just treat all strings as binary.
124
- # For Ruby 1.9+ we can check the encoding first to see what it is
125
- if RUBY_VERSION >= "1.9"
126
- # If the string is ASCII-8BIT then treat is as binary. Otherwise,
127
- # try to convert it to UTF-8 and, if successful, send as that.
128
- if value.encoding != Encoding::ASCII_8BIT &&
129
- value.encode(Encoding::UTF_8).valid_encoding?
130
- isutf = true
131
- end
132
- end
133
- end
134
-
135
- data.string = value if isutf
136
- data.binary = value if !isutf
137
-
138
- end
139
- end
140
-
141
- SYMBOL = Mapping.new(Cproton::PN_SYMBOL, "symbol")
142
- DESCRIBED = Mapping.new(Cproton::PN_DESCRIBED, "described", [Qpid::Proton::Described], "get_described")
143
- ARRAY = Mapping.new(Cproton::PN_ARRAY, "array", nil, "get_array")
144
- LIST = Mapping.new(Cproton::PN_LIST, "list", [::Array], "get_array")
145
- MAP = Mapping.new(Cproton::PN_MAP, "map", [::Hash], "get_map")
146
-
147
- class << MAP # :nodoc:
148
- def put(data, map, options = {})
149
- data.put_map
150
- data.enter
151
- map.each_pair do |key, value|
152
- if options[:keys] == :SYMBOL
153
- SYMBOL.put(data, key)
154
- else
155
- Mapping.for_class(key.class).put(data, key)
156
- end
157
-
158
- if value.nil?
159
- data.null
160
- else
161
- Mapping.for_class(value.class).put(data, value)
162
- end
163
- end
164
- data.exit
165
- end
166
- end
167
-
168
- end
169
-
170
- end
@@ -1,621 +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
- # A Message represents an addressable quantity of data.
25
- #
26
- # ==== Message Body
27
- #
28
- # The message body can be set using the #body= method. The message will
29
- # then attempt to determine how exactly to encode the content.
30
- #
31
- # ==== Examples
32
- #
33
- # To create a message for sending:
34
- #
35
- # # send a simple text message
36
- # msg = Qpid::Proton::Message.new
37
- # msg.body = "STATE: update"
38
- #
39
- # # send a binary chunk of data
40
- # data = File.binread("/home/qpid/binfile.tar.gz")
41
- # msg = Qpid::Proton::Message.new
42
- # msg.body = Qpid::Proton::BinaryString.new(data)
43
- #
44
- class Message
45
-
46
- # Decodes a message from supplied AMQP data and returns the number
47
- # of bytes consumed.
48
- #
49
- # ==== Options
50
- #
51
- # * encoded - the encoded data
52
- #
53
- def decode(encoded)
54
- check(Cproton.pn_message_decode(@impl, encoded, encoded.length))
55
-
56
- post_decode
57
- end
58
-
59
- def post_decode # :nodoc:
60
- # decode elements from the message
61
- @properties = {}
62
- props = Qpid::Proton::Data.new(Cproton::pn_message_properties(@impl))
63
- if props.next
64
- @properties = props.type.get(props)
65
- end
66
- @instructions = nil
67
- insts = Qpid::Proton::Data.new(Cproton::pn_message_instructions(@impl))
68
- if insts.next
69
- @instructions = insts.type.get(insts)
70
- end
71
- @annotations = nil
72
- annts = Qpid::Proton::Data.new(Cproton::pn_message_annotations(@impl))
73
- if annts.next
74
- @annotations = annts.type.get(annts)
75
- end
76
- @body = nil
77
- body = Qpid::Proton::Data.new(Cproton::pn_message_body(@impl))
78
- if body.next
79
- @body = body.type.get(body)
80
- end
81
- end
82
-
83
- # Encodes the message.
84
- def encode
85
- pre_encode
86
- size = 16
87
- loop do
88
- error, data = Cproton::pn_message_encode(@impl, size)
89
- if error == Qpid::Proton::Error::OVERFLOW
90
- size *= 2
91
- else
92
- check(error)
93
- return data
94
- end
95
- end
96
- end
97
-
98
- def pre_encode # :nodoc:
99
- # encode elements from the message
100
- props = Qpid::Proton::Data.new(Cproton::pn_message_properties(@impl))
101
- props.clear
102
- Qpid::Proton::Mapping.for_class(@properties.class).put(props, @properties) unless @properties.empty?
103
- insts = Qpid::Proton::Data.new(Cproton::pn_message_instructions(@impl))
104
- insts.clear
105
- if !@instructions.nil?
106
- mapping = Qpid::Proton::Mapping.for_class(@instructions.class)
107
- mapping.put(insts, @instructions)
108
- end
109
- annts = Qpid::Proton::Data.new(Cproton::pn_message_annotations(@impl))
110
- annts.clear
111
- if !@annotations.nil?
112
- mapping = Qpid::Proton::Mapping.for_class(@annotations.class)
113
- mapping.put(annts, @annotations, :keys => :SYMBOL)
114
- end
115
- body = Qpid::Proton::Data.new(Cproton::pn_message_body(@impl))
116
- body.clear
117
- if !@body.nil?
118
- mapping = Qpid::Proton::Mapping.for_class(@body.class)
119
- mapping.put(body, @body)
120
- end
121
- end
122
-
123
- # Creates a new +Message+ instance.
124
- def initialize
125
- @impl = Cproton.pn_message
126
- ObjectSpace.define_finalizer(self, self.class.finalize!(@impl))
127
- @properties = {}
128
- @instructions = {}
129
- @annotations = {}
130
- @body = nil
131
- end
132
-
133
- def to_s
134
- tmp = Cproton.pn_string("")
135
- Cproton.pn_inspect(@impl, tmp)
136
- result = Cproton.pn_string_get(tmp)
137
- Cproton.pn_free(tmp)
138
- return result
139
- end
140
-
141
- # Invoked by garbage collection to clean up resources used
142
- # by the underlying message implementation.
143
- def self.finalize!(impl) # :nodoc:
144
- proc {
145
- Cproton.pn_message_free(impl)
146
- }
147
- end
148
-
149
- # Returns the underlying message implementation.
150
- def impl # :nodoc:
151
- @impl
152
- end
153
-
154
- # Clears the state of the +Message+. This allows a single instance of
155
- # +Message+ to be reused.
156
- #
157
- def clear
158
- Cproton.pn_message_clear(@impl)
159
- @properties.clear unless @properties.nil?
160
- @instructions.clear unless @instructions.nil?
161
- @annotations.clear unless @annotations.nil?
162
- @body = nil
163
- end
164
-
165
- # Returns the most recent error number.
166
- #
167
- def errno
168
- Cproton.pn_message_errno(@impl)
169
- end
170
-
171
- # Returns the most recent error message.
172
- #
173
- def error
174
- Cproton.pn_error_text(Cproton.pn_message_error(@impl))
175
- end
176
-
177
- # Returns whether there is currently an error reported.
178
- #
179
- def error?
180
- !Cproton.pn_message_errno(@impl).zero?
181
- end
182
-
183
- # Sets the durable flag.
184
- #
185
- # See ::durable for more details on message durability.
186
- #
187
- # ==== Options
188
- #
189
- # * state - the durable state
190
- #
191
- def durable=(state)
192
- raise TypeError.new("state cannot be nil") if state.nil?
193
- Cproton.pn_message_set_durable(@impl, state)
194
- end
195
-
196
- # Returns the durable property.
197
- #
198
- # The durable property indicates that the emessage should be held durably
199
- # by any intermediaries taking responsibility for the message.
200
- #
201
- # ==== Examples
202
- #
203
- # msg = Qpid::Proton::Message.new
204
- # msg.durable = true
205
- #
206
- def durable
207
- Cproton.pn_message_is_durable(@impl)
208
- end
209
-
210
- # Sets the priority.
211
- #
212
- # +NOTE:+ Priority values are limited to the range [0,255].
213
- #
214
- # ==== Options
215
- #
216
- # * priority - the priority value
217
- #
218
- def priority=(priority)
219
- raise TypeError.new("invalid priority: #{priority}") if priority.nil? || !([Float, Fixnum].include?(priority.class))
220
- raise RangeError.new("priority out of range: #{priority}") if ((priority > 255) || (priority < 0))
221
- Cproton.pn_message_set_priority(@impl, priority.floor)
222
- end
223
-
224
- # Returns the priority.
225
- #
226
- def priority
227
- Cproton.pn_message_get_priority(@impl)
228
- end
229
-
230
- # Sets the time-to-live for the message.
231
- #
232
- # ==== Options
233
- #
234
- # * time - the time in milliseconds
235
- #
236
- def ttl=(time)
237
- raise TypeError.new("invalid ttl: #{time}") if time.nil? || !([Float, Fixnum].include?(time.class))
238
- raise RangeError.new("time out of range: #{time}") if ((time < 0))
239
- Cproton.pn_message_set_ttl(@impl, time.floor)
240
- end
241
-
242
- # Returns the time-to-live, in milliseconds.
243
- #
244
- def ttl
245
- Cproton.pn_message_get_ttl(@impl)
246
- end
247
-
248
- # Sets whether this is the first time the message was acquired.
249
- #
250
- # See ::first_acquirer? for more details.
251
- #
252
- # ==== Options
253
- #
254
- # * state - true if claiming the message
255
- #
256
- def first_acquirer=(state)
257
- raise TypeError.new("invalid state: #{state}") if state.nil? || !([TrueClass, FalseClass].include?(state.class))
258
- Cproton.pn_message_set_first_acquirer(@impl, state)
259
- end
260
-
261
- # Sets the delivery count for the message.
262
- #
263
- # See ::delivery_count for more details.
264
- #
265
- # ==== Options
266
- #
267
- # * count - the delivery count
268
- #
269
- def delivery_count=(count)
270
- raise ArgumentError.new("invalid count: #{count}") if count.nil? || !([Float, Fixnum].include?(count.class))
271
- raise RangeError.new("count out of range: #{count}") if count < 0
272
-
273
- Cproton.pn_message_set_delivery_count(@impl, count.floor)
274
- end
275
-
276
- # Returns the delivery count for the message.
277
- #
278
- # This is the number of delivery attempts for the given message.
279
- #
280
- def delivery_count
281
- Cproton.pn_message_get_delivery_count(@impl)
282
- end
283
-
284
- # Returns whether this is the first acquirer.
285
- #
286
- #
287
- def first_acquirer?
288
- Cproton.pn_message_is_first_acquirer(@impl)
289
- end
290
-
291
- # Sets the message id.
292
- #
293
- # ==== Options
294
- #
295
- # * id = the id
296
- #
297
- def id=(id)
298
- Cproton.pn_message_set_id(@impl, id)
299
- end
300
-
301
- # Returns the message id.
302
- #
303
- def id
304
- Cproton.pn_message_get_id(@impl)
305
- end
306
-
307
- # Sets the user id.
308
- #
309
- # ==== Options
310
- #
311
- # * id - the user id
312
- #
313
- def user_id=(id)
314
- Cproton.pn_message_set_user_id(@impl, id)
315
- end
316
-
317
- # Returns the user id.
318
- #
319
- def user_id
320
- Cproton.pn_message_get_user_id(@impl)
321
- end
322
-
323
- # Sets the destination address.
324
- #
325
- # ==== Options
326
- #
327
- # * address - the address
328
- #
329
- def address=(address)
330
- Cproton.pn_message_set_address(@impl, address)
331
- end
332
-
333
- # Returns the destination address.
334
- #
335
- def address
336
- Cproton.pn_message_get_address(@impl)
337
- end
338
-
339
- # Sets the subject.
340
- #
341
- # ==== Options
342
- #
343
- # * subject - the subject
344
- #
345
- def subject=(subject)
346
- Cproton.pn_message_set_subject(@impl, subject)
347
- end
348
-
349
- # Returns the subject
350
- #
351
- def subject
352
- Cproton.pn_message_get_subject(@impl)
353
- end
354
-
355
- # Sets the reply-to address.
356
- #
357
- # ==== Options
358
- #
359
- # * address - the reply-to address
360
- #
361
- def reply_to=(address)
362
- Cproton.pn_message_set_reply_to(@impl, address)
363
- end
364
-
365
- # Returns the reply-to address
366
- #
367
- def reply_to
368
- Cproton.pn_message_get_reply_to(@impl)
369
- end
370
-
371
- # Sets the correlation id.
372
- #
373
- # ==== Options
374
- #
375
- # * id - the correlation id
376
- #
377
- def correlation_id=(id)
378
- Cproton.pn_message_set_correlation_id(@impl, id)
379
- end
380
-
381
- # Returns the correlation id.
382
- #
383
- def correlation_id
384
- Cproton.pn_message_get_correlation_id(@impl)
385
- end
386
-
387
- # Sets the message format.
388
- #
389
- # See MessageFormat for more details on formats.
390
- #
391
- # *Warning:* This method has been deprecated.
392
- #
393
- # ==== Options
394
- #
395
- # * format - the format
396
- #
397
- def format=(format)
398
- raise TypeError.new("invalid message format: #{format}") if (format.nil? || !format.kind_of?(Qpid::Proton::MessageFormat))
399
- Cproton.pn_message_set_format(@impl, format.value)
400
- end
401
-
402
- # Returns the message format
403
- #
404
- # *Warning:* This method has been deprecated.
405
- #
406
- # ==== Note
407
- #
408
- # This method is now deprecated.
409
- #
410
- def format
411
- Qpid::Proton::MessageFormat.by_value(Cproton.pn_message_get_format(@impl))
412
- end
413
-
414
- # Sets the content type.
415
- #
416
- # ==== Options
417
- #
418
- # * content_type - the content type
419
- #
420
- def content_type=(content_type)
421
- Cproton.pn_message_set_content_type(@impl, content_type)
422
- end
423
-
424
- # Returns the content type
425
- #
426
- def content_type
427
- Cproton.pn_message_get_content_type(@impl)
428
- end
429
-
430
- # Sets the content encoding type.
431
- #
432
- # ==== Options
433
- #
434
- # * encoding - the content encoding
435
- #
436
- def content_encoding=(encoding)
437
- Cproton.pn_message_set_content_encoding(@impl, encoding)
438
- end
439
-
440
- # Returns the content encoding type.
441
- #
442
- def content_encoding
443
- Cproton.pn_message_get_content_encoding(@impl)
444
- end
445
-
446
- # Sets the expiration time.
447
- #
448
- # ==== Options
449
- #
450
- # * time - the expiry time
451
- #
452
- def expires=(time)
453
- raise TypeError.new("invalid expiry time: #{time}") if time.nil?
454
- raise ArgumentError.new("expiry time cannot be negative: #{time}") if time < 0
455
- Cproton.pn_message_set_expiry_time(@impl, time)
456
- end
457
-
458
- # Returns the expiration time.
459
- #
460
- def expires
461
- Cproton.pn_message_get_expiry_time(@impl)
462
- end
463
-
464
- # Sets the creation time.
465
- #
466
- # ==== Options
467
- #
468
- # * time - the creation time
469
- #
470
- def creation_time=(time)
471
- raise TypeError.new("invalid time: #{time}") if time.nil?
472
- raise ArgumentError.new("time cannot be negative") if time < 0
473
- Cproton.pn_message_set_creation_time(@impl, time)
474
- end
475
-
476
- # Returns the creation time.
477
- #
478
- def creation_time
479
- Cproton.pn_message_get_creation_time(@impl)
480
- end
481
-
482
- # Sets the group id.
483
- #
484
- # ==== Options
485
- #
486
- # * id - the group id
487
- #
488
- def group_id=(id)
489
- Cproton.pn_message_set_group_id(@impl, id)
490
- end
491
-
492
- # Returns the group id.
493
- #
494
- def group_id
495
- Cproton.pn_message_get_group_id(@impl)
496
- end
497
-
498
- # Sets the group sequence number.
499
- #
500
- # ==== Options
501
- #
502
- # * seq - the sequence number
503
- #
504
- def group_sequence=(seq)
505
- raise TypeError.new("invalid seq: #{seq}") if seq.nil?
506
- Cproton.pn_message_set_group_sequence(@impl, seq)
507
- end
508
-
509
- # Returns the group sequence number.
510
- #
511
- def group_sequence
512
- Cproton.pn_message_get_group_sequence(@impl)
513
- end
514
-
515
- # Sets the reply-to group id.
516
- #
517
- # ==== Options
518
- #
519
- # * id - the id
520
- #
521
- def reply_to_group_id=(id)
522
- Cproton.pn_message_set_reply_to_group_id(@impl, id)
523
- end
524
-
525
- # Returns the reply-to group id.
526
- #
527
- def reply_to_group_id
528
- Cproton.pn_message_get_reply_to_group_id(@impl)
529
- end
530
-
531
- # Returns the list of property names for associated with this message.
532
- #
533
- # ==== Examples
534
- #
535
- # msg.properties.each do |name|
536
- # end
537
- #
538
- def properties
539
- @properties
540
- end
541
-
542
- # Replaces the entire set of properties with the specified hash.
543
- #
544
- def properties=(properties)
545
- @properties = properties
546
- end
547
-
548
- # Assigns the value given to the named property.
549
- #
550
- # ==== Arguments
551
- #
552
- # * name - the property name
553
- # * value - the property value
554
- #
555
- def []=(name, value)
556
- @properties[name] = value
557
- end
558
-
559
- # Retrieves the value for the specified property name. If not found, then
560
- # it returns nil.
561
- #
562
- def [](name)
563
- @properties[name]
564
- end
565
-
566
- # Deletes the named property.
567
- #
568
- def delete_property(name)
569
- @properties.delete(name)
570
- end
571
-
572
- # Returns the instructions for this message.
573
- #
574
- def instructions
575
- @instructions
576
- end
577
-
578
- # Assigns instructions to this message.
579
- #
580
- def instructions=(instr)
581
- @instructions = instr
582
- end
583
-
584
- # Returns the annotations for this message.
585
- #
586
- def annotations
587
- @annotations
588
- end
589
-
590
- # Assigns annotations to this message.
591
- #
592
- def annotations=(annotations)
593
- @annotations = annotations
594
- end
595
-
596
- # Returns the body property of the message.
597
- #
598
- def body
599
- @body
600
- end
601
-
602
- # Assigns a new value to the body of the message.
603
- #
604
- def body=(body)
605
- @body = body
606
- end
607
-
608
- private
609
-
610
- def check(err) # :nodoc:
611
- if err < 0
612
- raise DataError, "[#{err}]: #{Cproton.pn_message_error(@impl)}"
613
- else
614
- return err
615
- end
616
- end
617
- end
618
-
619
- end
620
-
621
- end