anthill_ruby 0.5.2
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.
- data/MIT-LICENSE +21 -0
- data/README +22 -0
- data/anthill_ruby.gemspec +17 -0
- data/changelog +21 -0
- data/examples/data_converter.rb +1 -0
- data/knownbugs +19 -0
- data/lib/anthill_constants.rb +44 -0
- data/lib/anthill_ruby.rb +36 -0
- data/lib/binary_decoder.rb +227 -0
- data/lib/binary_encoder.rb +131 -0
- data/lib/byte_buffer.rb +88 -0
- data/lib/decoder_base.rb +23 -0
- data/lib/encoder_base.rb +24 -0
- data/lib/outputter_base.rb +31 -0
- data/lib/txt_outputter.rb +29 -0
- data/lib/validator_base.rb +26 -0
- data/lib/xml_outputter.rb +29 -0
- data/roadmap +18 -0
- data/setup.rb +1585 -0
- data/test/anthill_test.rb +27 -0
- data/test/binary_decoder_test.rb +30 -0
- data/test/binary_encoder_test.rb +30 -0
- data/test/byte_buffer_test.rb +117 -0
- data/test/decoder_base_test.rb +30 -0
- data/test/encoder_base_test.rb +30 -0
- data/test/outputter_base_test.rb +30 -0
- metadata +76 -0
data/MIT-LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
Copyright (c) 2011 Artem Rufanov
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
21
|
+
|
data/README
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Introduction:
|
|
2
|
+
The AntHill is a powerful networking library which implements network fail-over and scaling functionality for any user applications.
|
|
3
|
+
|
|
4
|
+
Report a bug:
|
|
5
|
+
Try to search for similar issues in our bug database (http:://www.majoron.com/support/) before report a bug.
|
|
6
|
+
If you did not find anything similar then please submit the new bug. Please use following tips to report a bug:
|
|
7
|
+
The basics: what you did, what you wanted to happen, and what actually happened.
|
|
8
|
+
If you don't understand the error message - please ask for help in forum.
|
|
9
|
+
Be brief, but don't leave any important details out.
|
|
10
|
+
Use plain English describing the problem.
|
|
11
|
+
Please describe one problem in each separate bug report.
|
|
12
|
+
Please do not report bugs for old versions.
|
|
13
|
+
|
|
14
|
+
Release Notes:
|
|
15
|
+
|
|
16
|
+
Version 0.5
|
|
17
|
+
-----------
|
|
18
|
+
-Implemented binary encoder/decoder. Support primitive datatypes
|
|
19
|
+
-Implemented a lot of unit tests to verify coding and decoding
|
|
20
|
+
|
|
21
|
+
Copyright (c) 2011 arufanov, released under the MIT license.
|
|
22
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'date'
|
|
2
|
+
Gem::Specification.new do |s|
|
|
3
|
+
s.name = %q{anthill_ruby}
|
|
4
|
+
s.version = "0.5.2"
|
|
5
|
+
s.date = Date.today.to_s
|
|
6
|
+
s.summary = %q{The AntHill is a powerful networking library which implements network fail-over and scaling functionality for any user applications.}
|
|
7
|
+
s.description = %q{The AntHill is a powerful networking library which implements network fail-over and scaling functionality for any user applications.}
|
|
8
|
+
s.author = %q{Artem Rufanov}
|
|
9
|
+
s.email = %q{developers@majoron.com}
|
|
10
|
+
s.homepage = %q{http://www.majoron.com/project/anthill/ruby}
|
|
11
|
+
s.files = Dir.glob('**/*') - Dir.glob('distrib/**/*') - Dir.glob('lib/api/**/*') - Dir.glob('doc/*.xpr')
|
|
12
|
+
s.bindir = 'bin'
|
|
13
|
+
s.executables = Dir.glob('bin/*').collect {|f| File.basename(f)}
|
|
14
|
+
s.require_paths << 'doc' << 'examples' << 'lib' << 'test'
|
|
15
|
+
s.has_rdoc = true
|
|
16
|
+
s.required_ruby_version = '>= 1.8.6'
|
|
17
|
+
end
|
data/changelog
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
Introduction:
|
|
2
|
+
To see the latest list of the change log please visit the Change Log page at www.majoron.com.
|
|
3
|
+
|
|
4
|
+
Legend:
|
|
5
|
+
Follow notation is used at change log, roadmap and known bugs. Each bug begins with a version,
|
|
6
|
+
then follow category of the bug inside {}. It can be bug report, feature request and etc.
|
|
7
|
+
Then follow component inside []. After follow bug number at bug tracking system between // signs.
|
|
8
|
+
And then follow a short description of the bug.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
For example bug: "1.0 { Feature Request } [ AntHill ] / 380 / STLport support required" means
|
|
12
|
+
that bug was created for 1.0 version of the AntHill component, bug is feature request with
|
|
13
|
+
380 number at bug tracking system. And bug requires STLPort support implementation.
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
Version 0.5
|
|
17
|
+
-----------
|
|
18
|
+
0.5 { Feature Request } [ AntHill Core ] / X / Support two types: 0B 05 04 and 0B0504
|
|
19
|
+
0.5 { Feature Request } [ AntHill Core ] / X / Make single namespace AntHill
|
|
20
|
+
0.5 { Feature Request } [ AntHill Core ] / X / Ruby 1.9.x support has been added
|
|
21
|
+
0.5 { Feature Request } [ AntHill Core ] / 774 / Write to readme.txt files how to report a bug.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#1
|
data/knownbugs
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
Introduction:
|
|
2
|
+
To see the latest list of the known bugs please visit the Known bugs page at www.majoron.com.
|
|
3
|
+
|
|
4
|
+
Legend:
|
|
5
|
+
Follow notation is used at change log, roadmap and known bugs. Each bug begins with a version,
|
|
6
|
+
then follow category of the bug inside {}. It can be bug report, feature request and etc.
|
|
7
|
+
Then follow component inside []. After follow bug number at bug tracking system between // signs.
|
|
8
|
+
And then follow a short description of the bug.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
For example bug: "1.0 { Feature Request } [ AntHill ] / 380 / STLport support required" means
|
|
12
|
+
that bug was created for 1.0 version of the AntHill component, bug is feature request with
|
|
13
|
+
380 number at bug tracking system. And bug requires STLPort support implementation.
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
Version 0.5
|
|
17
|
+
-----------
|
|
18
|
+
0.5 { --- } [ AntHill Core ] / 782 / Codec tests, puts test from AntHill SMPP Cpp
|
|
19
|
+
0.5 { Bug Report } [ AntHill Core ] / 771 / Good message for unparsable dump
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright 2007 Majoron.com (developers@majoron.com)
|
|
3
|
+
# Original sources are available at www.majoron.com
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
module Majoron
|
|
20
|
+
module AntHill
|
|
21
|
+
# Module contains encoder and decoder errors
|
|
22
|
+
module CodecErrors
|
|
23
|
+
DECODER_INV_SKIPPING = "Unable to padding. Offset is: %d."
|
|
24
|
+
DECODER_INV_PADDING = "Unable to padding. Offset is: %d."
|
|
25
|
+
DECODER_INV_CHAR = "Unable to decode char. Offset is: %d."
|
|
26
|
+
DECODER_INV_UNSIGNED_CHAR = "Unable to decode unsigned char. Offset is: %d."
|
|
27
|
+
|
|
28
|
+
DECODER_INV_INTEGER32 = "Unable to decode integer32. Offset is: %d."
|
|
29
|
+
DECODER_INV_INTEGER24 = "Unable to decode integer24. Offset is: %d."
|
|
30
|
+
DECODER_INV_INTEGER16 = "Unable to decode integer16. Offset is: %d."
|
|
31
|
+
|
|
32
|
+
DECODER_INV_UNSIGNED32 = "Unable to decode integer32. Offset is: %d."
|
|
33
|
+
DECODER_INV_UNSIGNED24 = "Unable to decode integer24. Offset is: %d."
|
|
34
|
+
DECODER_INV_UNSIGNED16 = "Unable to decode integer16. Offset is: %d."
|
|
35
|
+
|
|
36
|
+
DECODER_INV_CSTRING = "Unable to decode cstring. Offset is: %d."
|
|
37
|
+
DECODER_OVERFLOW_CSTRING = "Unable to decode cstring due to overflow. Offset is: %d."
|
|
38
|
+
DECODER_INV_BINARY = "Unable to decode cstring. Offset is: %d."
|
|
39
|
+
|
|
40
|
+
DECODER_INV_OFFSET = "Unable to decode package. Offset after decoding is not equal to length. Offset is: %d. Lenght is: %d"
|
|
41
|
+
DECODER_DUE_TO_LIMIT = "Unable to decode package. Offset after decoding is greater than length. Offset is: %d. Lenght is: %d"
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
data/lib/anthill_ruby.rb
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright 2007 Majoron.com (developers@majoron.com)
|
|
3
|
+
# Original sources are available at www.majoron.com
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
$:.unshift(File.dirname(__FILE__))
|
|
19
|
+
|
|
20
|
+
# Include all files from anthill library
|
|
21
|
+
require "anthill_constants"
|
|
22
|
+
require "byte_buffer"
|
|
23
|
+
require "encoder_base"
|
|
24
|
+
require "decoder_base"
|
|
25
|
+
require "validator_base"
|
|
26
|
+
require "binary_encoder"
|
|
27
|
+
require "binary_decoder"
|
|
28
|
+
require "outputter_base"
|
|
29
|
+
require "txt_outputter"
|
|
30
|
+
require "xml_outputter"
|
|
31
|
+
|
|
32
|
+
module Majoron
|
|
33
|
+
module AntHill
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright 2007 Majoron.com (developers@majoron.com)
|
|
3
|
+
# Original sources are available at www.majoron.com
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
module Majoron
|
|
20
|
+
module AntHill
|
|
21
|
+
class BinaryDecoder < DecoderBase
|
|
22
|
+
# Constructor.
|
|
23
|
+
def initialize()
|
|
24
|
+
super()
|
|
25
|
+
@offset = 0
|
|
26
|
+
@buffer = ""
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Method to skip n bytes
|
|
31
|
+
def skip_n_bytes(bytes, limit = nil)
|
|
32
|
+
return if bytes == 0
|
|
33
|
+
if @offset <= @buffer.size() - bytes
|
|
34
|
+
@offset += bytes
|
|
35
|
+
|
|
36
|
+
# Check overflow
|
|
37
|
+
overflow = !limit.nil? && @offset > limit
|
|
38
|
+
raise sprintf(CodecErrors::DECODER_DUE_TO_LIMIT, @offset, limit) if overflow
|
|
39
|
+
else
|
|
40
|
+
raise sprintf(CodecErrors::DECODER_INV_CHAR, @offset)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# Methods to align on n bytes
|
|
46
|
+
def padding_n_bytes(bytes, limit = nil)
|
|
47
|
+
raise "not implemented"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Decode methods
|
|
51
|
+
def decode_char(limit = nil)
|
|
52
|
+
sizeof = 1
|
|
53
|
+
if @offset <= @buffer.size() - sizeof
|
|
54
|
+
if RUBY_VERSION >= "1.9.0"
|
|
55
|
+
value = @buffer[@offset].ord
|
|
56
|
+
else
|
|
57
|
+
value = @buffer[@offset]
|
|
58
|
+
end
|
|
59
|
+
# value = @buffer[@offset]
|
|
60
|
+
@offset += sizeof
|
|
61
|
+
|
|
62
|
+
# Check overflow
|
|
63
|
+
overflow = !limit.nil? && @offset > limit
|
|
64
|
+
raise sprintf(CodecErrors::DECODER_DUE_TO_LIMIT, @offset, limit) if overflow
|
|
65
|
+
value
|
|
66
|
+
else
|
|
67
|
+
raise sprintf(CodecErrors::DECODER_INV_CHAR, @offset)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Decode methods
|
|
72
|
+
def decode_uchar(limit = nil)
|
|
73
|
+
sizeof = 1
|
|
74
|
+
if @offset <= @buffer.size() - sizeof
|
|
75
|
+
if RUBY_VERSION >= "1.9.0"
|
|
76
|
+
value = @buffer[@offset].ord
|
|
77
|
+
else
|
|
78
|
+
value = @buffer[@offset]
|
|
79
|
+
end
|
|
80
|
+
# value = @buffer[@offset]
|
|
81
|
+
@offset += sizeof
|
|
82
|
+
|
|
83
|
+
# Check overflow
|
|
84
|
+
overflow = !limit.nil? && @offset > limit
|
|
85
|
+
raise sprintf(CodecErrors::DECODER_DUE_TO_LIMIT, @offset, limit) if overflow
|
|
86
|
+
value
|
|
87
|
+
else
|
|
88
|
+
raise sprintf(CodecErrors::DECODER_INV_CHAR, @offset)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Decode methods
|
|
93
|
+
def decode_integer32(value, limit = nil)
|
|
94
|
+
raise "not implemented"
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Decode methods
|
|
98
|
+
def decode_integer24(value, limit = nil)
|
|
99
|
+
raise "not implemented"
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Decode methods
|
|
103
|
+
def decode_integer16(value, limit = nil)
|
|
104
|
+
raise "not implemented"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Decode methods
|
|
108
|
+
def decode_unsigned32(limit = nil)
|
|
109
|
+
sizeof = 4
|
|
110
|
+
if @offset <= @buffer.size() - sizeof
|
|
111
|
+
value = @buffer[@offset..@offset+(sizeof-1)].unpack('N').first
|
|
112
|
+
@offset += sizeof
|
|
113
|
+
|
|
114
|
+
# Check overflow
|
|
115
|
+
overflow = !limit.nil? && @offset > limit
|
|
116
|
+
raise sprintf(CodecErrors::DECODER_DUE_TO_LIMIT, @offset, limit) if overflow
|
|
117
|
+
value
|
|
118
|
+
else
|
|
119
|
+
raise sprintf(CodecErrors::DECODER_INV_CHAR, @offset)
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Decode methods
|
|
124
|
+
def decode_unsigned16(limit = nil)
|
|
125
|
+
sizeof = 2
|
|
126
|
+
if @offset <= @buffer.size() - sizeof
|
|
127
|
+
value = @buffer[@offset..@offset+(sizeof-1)].unpack('n').first
|
|
128
|
+
@offset += sizeof
|
|
129
|
+
|
|
130
|
+
# Check overflow
|
|
131
|
+
overflow = !limit.nil? && @offset > limit
|
|
132
|
+
raise sprintf(CodecErrors::DECODER_DUE_TO_LIMIT, @offset, limit) if overflow
|
|
133
|
+
value
|
|
134
|
+
else
|
|
135
|
+
raise sprintf(CodecErrors::DECODER_INV_CHAR, @offset)
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Decode methods
|
|
140
|
+
def decode_cstring(value, limit = nil)
|
|
141
|
+
raise "not implemented"
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Decode methods
|
|
145
|
+
def decode_cstring_max(maxlen, limit = nil)
|
|
146
|
+
if @offset <= @buffer.size
|
|
147
|
+
value = ""
|
|
148
|
+
if RUBY_VERSION >= "1.9.0"
|
|
149
|
+
while @offset < @buffer.size() && @buffer[@offset].ord != 0
|
|
150
|
+
value << @buffer [ @offset ]
|
|
151
|
+
@offset += 1
|
|
152
|
+
|
|
153
|
+
# Check max limitation
|
|
154
|
+
overmax = value.size() + 1 > maxlen
|
|
155
|
+
raise sprintf(CodecErrors::DECODER_OVERFLOW_CSTRING, @offset) if overmax
|
|
156
|
+
end
|
|
157
|
+
else
|
|
158
|
+
while @offset < @buffer.size() && @buffer[@offset] != 0
|
|
159
|
+
value << @buffer [ @offset ]
|
|
160
|
+
@offset += 1
|
|
161
|
+
|
|
162
|
+
# Check max limitation
|
|
163
|
+
overmax = value.size() + 1 > maxlen
|
|
164
|
+
raise sprintf(CodecErrors::DECODER_OVERFLOW_CSTRING, @offset) if overmax
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
@offset += 1
|
|
168
|
+
|
|
169
|
+
# Check overflow
|
|
170
|
+
overflow = !limit.nil? && @offset > limit
|
|
171
|
+
raise sprintf(CodecErrors::DECODER_DUE_TO_LIMIT, @offset, limit) if overflow
|
|
172
|
+
value
|
|
173
|
+
else
|
|
174
|
+
raise sprintf( CodecErrors::DECODER_INV_CSTRING, @offset)
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# Decode methods
|
|
179
|
+
def decode_binary(size, limit = nil)
|
|
180
|
+
if @offset <= @buffer.size
|
|
181
|
+
pos = 0
|
|
182
|
+
value = ""
|
|
183
|
+
while @offset < @buffer.size() && pos < size
|
|
184
|
+
value << @buffer [ @offset ]
|
|
185
|
+
@offset += 1
|
|
186
|
+
pos += 1
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# Check overflow
|
|
190
|
+
overflow = !limit.nil? && @offset > limit
|
|
191
|
+
raise sprintf(CodecErrors::DECODER_DUE_TO_LIMIT, @offset, limit) if overflow
|
|
192
|
+
value
|
|
193
|
+
else
|
|
194
|
+
raise sprintf( CodecErrors::DECODER_INV_BINARY, @offset)
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
#
|
|
200
|
+
def reset_buffer()
|
|
201
|
+
@offset = 0
|
|
202
|
+
@buffer = ""
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
#
|
|
206
|
+
def get_buffer()
|
|
207
|
+
@buffer
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
#
|
|
211
|
+
def append_buffer(buf)
|
|
212
|
+
@buffer << buf
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
#
|
|
216
|
+
def validate_offset(len)
|
|
217
|
+
return if @offset == len
|
|
218
|
+
raise sprintf(CodecErrors::DECODER_INV_OFFSET, @offset, len)
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
private
|
|
222
|
+
attr_accessor :buffer
|
|
223
|
+
attr_accessor :offset
|
|
224
|
+
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
end
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright 2007 Majoron.com (developers@majoron.com)
|
|
3
|
+
# Original sources are available at www.majoron.com
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
module Majoron
|
|
20
|
+
module AntHill
|
|
21
|
+
class BinaryEncoder < EncoderBase
|
|
22
|
+
# Constructor.
|
|
23
|
+
def initialize()
|
|
24
|
+
super()
|
|
25
|
+
@offset = 0
|
|
26
|
+
@buffer = ""
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Method to skip n bytes
|
|
31
|
+
def skip_n_bytes(bytes)
|
|
32
|
+
# TODO: implement
|
|
33
|
+
raise "skip_n_bytes is not implemented"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# Padding function to align on n bytes
|
|
38
|
+
def padding_n_bytes(bytes)
|
|
39
|
+
# TODO: implement
|
|
40
|
+
raise "padding_n_bytes is not implemented"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Encode functions
|
|
44
|
+
def encode_char(value)
|
|
45
|
+
sizeof = 1
|
|
46
|
+
@buffer << value
|
|
47
|
+
@offset += sizeof
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def encode_uchar(value)
|
|
51
|
+
sizeof = 1
|
|
52
|
+
@buffer << value
|
|
53
|
+
@offset += sizeof
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def encode_integer32(value)
|
|
57
|
+
# TODO: implement
|
|
58
|
+
raise "encode_integer32 is not implemented"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def encode_integer24(value)
|
|
62
|
+
# TODO: implement
|
|
63
|
+
raise "encode_integer24 is not implemented"
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def encode_integer16(value)
|
|
67
|
+
# TODO: implement
|
|
68
|
+
raise "encode_integer16 is not implemented"
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def encode_unsigned32(value)
|
|
72
|
+
sizeof = 4
|
|
73
|
+
# @buffer << sprintf("%c%c%c%c", value >> 24, value >> 16, value >> 8, value & 0xff)
|
|
74
|
+
@buffer << sprintf("%c%c%c%c", value >> 24, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff)
|
|
75
|
+
@offset += sizeof
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def encode_unsigned16(value)
|
|
79
|
+
sizeof = 2
|
|
80
|
+
@buffer << sprintf("%c%c", value >> 8, value & 0xff)
|
|
81
|
+
@offset += sizeof
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def encode_cstring(value, limit = nil)
|
|
85
|
+
# Encoding::CompatibilityError: incompatible character encodings: US-ASCII and ASCII-8BIT
|
|
86
|
+
# ASCII-8BIT is a binary data, I am not able to find how to set encoding in constructor
|
|
87
|
+
if RUBY_VERSION >= "1.9.0"
|
|
88
|
+
@buffer.force_encoding("ASCII-8BIT")
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
sizeof = value.size() + 1 # 1 = NULL terminator
|
|
92
|
+
@buffer << value << 0 # 0 = NULL terminator
|
|
93
|
+
@offset += sizeof
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def encode_binary(value)
|
|
97
|
+
# Encoding::CompatibilityError: incompatible character encodings: US-ASCII and ASCII-8BIT
|
|
98
|
+
# ASCII-8BIT is a binary data, I am not able to find how to set encoding in constructor
|
|
99
|
+
if RUBY_VERSION >= "1.9.0"
|
|
100
|
+
@buffer.force_encoding("ASCII-8BIT")
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
sizeof = value.size()
|
|
104
|
+
@buffer << value
|
|
105
|
+
@offset += sizeof
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
#
|
|
110
|
+
def reset_buffer()
|
|
111
|
+
@offset = 0
|
|
112
|
+
@buffer = ""
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
#
|
|
116
|
+
def get_buffer()
|
|
117
|
+
@buffer
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
#
|
|
121
|
+
def append_buffer(buf)
|
|
122
|
+
@buffer << buf
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
private
|
|
127
|
+
attr_accessor :buffer
|
|
128
|
+
attr_accessor :offset
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|