PROTON-736: Created the UTFString and BinaryString classes for Ruby. This allows users to explictly call out that a string is either UTF-8 or a binary string.
For the UTFString type, it validates that the content provided is actually UTF-8 and raises a RuntimeError if it's not. Results returned from a Message object are wrapped in the appropriate class. This solution is Ruby 1.8, 1.9 and 2.0 compatible. Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/6371e9eb Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/6371e9eb Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/6371e9eb Branch: refs/heads/examples Commit: 6371e9eba3b82a4927bcfb06919d4b3ea419a8d8 Parents: bdeaf34 Author: Darryl L. Pierce <[email protected]> Authored: Mon Nov 10 09:30:47 2014 -0500 Committer: Darryl L. Pierce <[email protected]> Committed: Mon Nov 10 11:20:15 2014 -0500 ---------------------------------------------------------------------- proton-c/bindings/ruby/lib/qpid_proton.rb | 1 + proton-c/bindings/ruby/lib/qpid_proton/data.rb | 4 +- .../bindings/ruby/lib/qpid_proton/mapping.rb | 22 +------ .../bindings/ruby/lib/qpid_proton/strings.rb | 69 ++++++++++++++++++++ 4 files changed, 75 insertions(+), 21 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6371e9eb/proton-c/bindings/ruby/lib/qpid_proton.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/qpid_proton.rb b/proton-c/bindings/ruby/lib/qpid_proton.rb index e28c684..4da4e11 100644 --- a/proton-c/bindings/ruby/lib/qpid_proton.rb +++ b/proton-c/bindings/ruby/lib/qpid_proton.rb @@ -22,6 +22,7 @@ require "date" require "qpid_proton/version" require "qpid_proton/described" +require "qpid_proton/strings" require "qpid_proton/mapping" require "qpid_proton/array" require "qpid_proton/hash" http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6371e9eb/proton-c/bindings/ruby/lib/qpid_proton/data.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/qpid_proton/data.rb b/proton-c/bindings/ruby/lib/qpid_proton/data.rb index 9644fb4..1e515c8 100644 --- a/proton-c/bindings/ruby/lib/qpid_proton/data.rb +++ b/proton-c/bindings/ruby/lib/qpid_proton/data.rb @@ -725,7 +725,7 @@ module Qpid # If the current node is binary, returns its value. Otherwise, it returns # an empty string (""). def binary - Cproton.pn_data_get_binary(@data) + Qpid::Proton::BinaryString.new(Cproton.pn_data_get_binary(@data)) end # Puts a unicode string value. @@ -742,7 +742,7 @@ module Qpid # If the current node is a string, returns its value. Otherwise, it # returns an empty string (""). def string - Cproton.pn_data_get_string(@data) + Qpid::Proton::UTFString.new(Cproton.pn_data_get_string(@data)) end # Puts a symbolic value. http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6371e9eb/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb b/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb index 841156c..e7e3322 100644 --- a/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb +++ b/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb @@ -110,26 +110,10 @@ module Qpid # :nodoc: class << STRING def put(data, value) - # In Ruby 1.9+ we have encoding methods that can check the content of - # the string, so use them to see if what we have is unicode. If so, - # good! If not, then just treat is as binary. - # - # No such thing in Ruby 1.8. So there we need to use Iconv to try and - # convert it to unicode. If it works, good! But if it raises an - # exception then we'll treat it as binary. - if RUBY_VERSION >= "1.9" - if value.encoding == "UTF-8" || value.force_encoding("UTF-8").valid_encoding? - data.string = value.to_s - else - data.binary = value.to_s - end + if value.is_a?(Qpid::Proton::UTFString) || Qpid::Proton.is_valid_utf?(value) + data.string = value.to_s else - begin - newval = Iconv.new("UTF8//TRANSLIT//IGNORE", "UTF8").iconv(value.to_s) - data.string = newval - rescue - data.binary = value - end + data.binary = value.to_s end end end http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6371e9eb/proton-c/bindings/ruby/lib/qpid_proton/strings.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/qpid_proton/strings.rb b/proton-c/bindings/ruby/lib/qpid_proton/strings.rb new file mode 100644 index 0000000..dad96ad --- /dev/null +++ b/proton-c/bindings/ruby/lib/qpid_proton/strings.rb @@ -0,0 +1,69 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +module Qpid # :nodoc: + + module Proton # :nodoc: + + def self.is_valid_utf?(value) + # In Ruby 1.9+ we have encoding methods that can check the content of + # the string, so use them to see if what we have is unicode. If so, + # good! If not, then just treat is as binary. + # + # No such thing in Ruby 1.8. So there we need to use Iconv to try and + # convert it to unicode. If it works, good! But if it raises an + # exception then we'll treat it as binary. + if RUBY_VERSION >= "1.9" + return true if (value.encoding == "UTF-8" || + value.force_encoding("UTF-8").valid_encoding?) + + return false + else + begin + newval = Iconv.new("UTF8//TRANSLIT//IGNORE", "UTF8").iconv(value.to_s) + return true + rescue + return false + end + end + end + + # UTFString lets an application explicitly state that a + # string of characters is to be UTF-8 encoded. + # + class UTFString < ::String + + def initialize(value) + if !Qpid::Proton.is_valid_utf?(value) + raise RuntimeError.new("invalid UTF string") + end + + super(value) + end + + end + + # BinaryString lets an application explicitly declare that + # a string value represents arbitrary data. + # + class BinaryString < ::String; end + + end + +end --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
