From 9ba8adf164b316a3d6914b3b187f371f6e19066d Mon Sep 17 00:00:00 2001 From: James Maki Date: Mon, 10 May 2010 14:26:36 -0500 Subject: Add sms web service example --- contrib/smsweb/smswsc/builder.rb | 23 ++++++++++++ contrib/smsweb/smswsc/phonebook_entry.rb | 56 ++++++++++++++++++++++++++++ contrib/smsweb/smswsc/sms_message.rb | 62 +++++++++++++++++++++++++++++++ contrib/smsweb/smswsc/utils.rb | 63 ++++++++++++++++++++++++++++++++ 4 files changed, 204 insertions(+) create mode 100644 contrib/smsweb/smswsc/builder.rb create mode 100644 contrib/smsweb/smswsc/phonebook_entry.rb create mode 100644 contrib/smsweb/smswsc/sms_message.rb create mode 100644 contrib/smsweb/smswsc/utils.rb (limited to 'contrib/smsweb/smswsc') diff --git a/contrib/smsweb/smswsc/builder.rb b/contrib/smsweb/smswsc/builder.rb new file mode 100644 index 0000000..a6e25a9 --- /dev/null +++ b/contrib/smsweb/smswsc/builder.rb @@ -0,0 +1,23 @@ +require 'builder' + +module SMSWSC + XmlOptions = { + :version => "1.0", + :encoding => "UTF-8", + :indent => 0, + } + + def self.new_builder(xml) + builder = Builder::XmlMarkup.new( + :target => xml, + :indent => SMSWSC::XmlOptions[:indent] + ) + builder.instruct!( + :xml, + :version => SMSWSC::XmlOptions[:version], + :encoding => SMSWSC::XmlOptions[:encoding] + ) + + return builder + end +end diff --git a/contrib/smsweb/smswsc/phonebook_entry.rb b/contrib/smsweb/smswsc/phonebook_entry.rb new file mode 100644 index 0000000..ef13bc4 --- /dev/null +++ b/contrib/smsweb/smswsc/phonebook_entry.rb @@ -0,0 +1,56 @@ +require 'smswsc/builder' +require 'rexml/document' + +module SMSWSC + + class PhonebookEntry + attr_accessor :name + attr_accessor :addr_type + attr_accessor :addr + attr_accessor :uri + + def initialize(options = {}) + @addr_type = options["addr-type"] + @addr = options["addr"] + @name = options["name"] + end + + def uri=(value) + @uri = value + end + + def self.load_xml(parent) + entry = PhonebookEntry.new + + parent.each_element do |element| + case element.name + when "addr-type" + entry.addr_type = element.text.to_s + when "addr" + entry.addr = element.text.to_s + when "name" + entry.name = element.text.to_s + when "uri" + entry.uri = URI.parse(element.text.to_s) + end + end + + return entry + end + + def to_xml(builder = nil, element = "phonebook-entry") + xml = "" + unless builder + builder = SMSWSC.new_builder(xml) + end + + builder.tag!(element.to_s) { + builder.tag! "addr-type", @addr_type + builder.tag! "addr", @addr + builder.tag! "name", @name + } + + return xml + end + end +end diff --git a/contrib/smsweb/smswsc/sms_message.rb b/contrib/smsweb/smswsc/sms_message.rb new file mode 100644 index 0000000..787b58b --- /dev/null +++ b/contrib/smsweb/smswsc/sms_message.rb @@ -0,0 +1,62 @@ +require 'smswsc/builder' +require 'rexml/document' +require 'base64' + +module SMSWSC + + class SMSMessage + attr_accessor :message_status + attr_accessor :addr_type + attr_accessor :addr + attr_accessor :user_data + attr_accessor :uri + + def initialize(options = {}) + @message_status = options["message_status"] + @addr_type = options["addr-type"] + @addr = options["addr"] + @user_data = options["user-data"] + end + + def uri=(value) + @uri = value + end + + def self.load_xml(parent) + message = SMSMessage.new + + parent.each_element do |element| + case element.name + when "message-status" + message.message_status = element.text.to_s + when "addr-type" + message.addr_type = element.text.to_s + when "addr" + message.addr = element.text.to_s + when "user-data" + message.user_data = Base64.decode64(element.text.to_s) + when "uri" + message.uri = URI.parse(element.text.to_s) + end + end + + return message + end + + def to_xml(builder = nil, element = "sms-message") + xml = "" + unless builder + builder = SMSWSC.new_builder(xml) + end + + builder.tag!(element.to_s) { + builder.tag! "message-status", @message_status + builder.tag! "addr-type", @addr_type + builder.tag! "addr", @addr + builder.tag! "user-data", Base64.encode64(@user_data) + } + + return xml + end + end +end diff --git a/contrib/smsweb/smswsc/utils.rb b/contrib/smsweb/smswsc/utils.rb new file mode 100644 index 0000000..fa07efd --- /dev/null +++ b/contrib/smsweb/smswsc/utils.rb @@ -0,0 +1,63 @@ +require 'cgi' + +class Time + # try rfc3339 + # try sql + # try rfc822 + def self.rfcdate(str) + if str =~ /\A(\d{4})-(\d{2})-(\d{2})[T ](\d{2})\:(\d{2})\:(\d{2})/ + return Time.utc($1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i).localtime + elsif str =~ /\A\w{3}, (\d{1,2}) (\w{3}) (\d{4}) (\d{2})\:(\d{2})\:(\d{2})/ + return Time.utc($3.to_i, $2, $1.to_i, $4.to_i, $5.to_i, $6.to_i).localtime + else + return nil + end + end +end + +class Array + def urlpath + args, atoms = self.flatten.partition { |a| a.is_a?(Hash) } + args = args.flatten.inject { |s, v| s.merge!(v) } + + front = atoms.join('/').squeeze('/') + + if args + rear = args.inject('?') { |s, (k, v)| + s << CGI::escape(k.to_s) + "=" + CGI::escape(v.to_s) + ";" + } [0 .. -2] + + front + rear + else + front + end + end +end + +module SMSWSC + module Utils + + # Assemble a reference from arguments. + # + # ref("/path", "to", "it", {:q => "test"}) => "/path/to/it?q=test" + + def ref(*atoms) + args, atoms = atoms.flatten.partition{|a| a.is_a?(Hash) } + args = args.flatten.inject { |s, v| s.merge!(v) } + + front = atoms.join('/').squeeze('/') + + if args + rear = args.inject('?') { |s, (k, v)| + s << CGI::escape(k.to_s) + "=" + CGI::escape(v.to_s) + ";" + } [0 .. -2] + + front + rear + else + front + end + end + module_function :ref + + end +end -- cgit v1.2.3