class ScormCloud::Base
Attributes
appid[R]
Public Class Methods
new(appid, secret)
click to toggle source
# File lib/scorm_cloud/base.rb, line 6 def initialize(appid, secret) @appid = appid @secret = secret end
Private Class Methods
add_service(hash)
click to toggle source
Add services
# File lib/scorm_cloud/base.rb, line 96 def self.add_service(hash) hash.each do |name, klass| define_method(name) do service = instance_variable_get("@#{name.to_s}") unless service service = instance_variable_set("@#{name.to_s}", klass.new(self)) end service end end end
Public Instance Methods
call(method, params = {})
click to toggle source
# File lib/scorm_cloud/base.rb, line 11 def call(method, params = {}) url = prepare_url(method, params) execute_call_xml(url) end
call_raw(method, params = {})
click to toggle source
# File lib/scorm_cloud/base.rb, line 16 def call_raw(method, params = {}) url = prepare_url(method, params) execute_call_plain(url) end
call_url(url)
click to toggle source
# File lib/scorm_cloud/base.rb, line 21 def call_url(url) execute_call_plain(url) end
launch_url(method, params = {})
click to toggle source
# File lib/scorm_cloud/base.rb, line 39 def launch_url(method, params = {}) prepare_url(method, params) end
post(method, path, params = {})
click to toggle source
# File lib/scorm_cloud/base.rb, line 25 def post(method, path, params = {}) url = URI.parse(prepare_url(method, params)) body = nil File.open(path) do |f| req = Net::HTTP::Post::Multipart.new "#{url.path}?#{url.query}", "file" => UploadIO.new(f, "application/zip", "scorm.zip") res = Net::HTTP.start(url.host, url.port) do |http| http.request(req) end body = res.body end REXML::Document.new(body) end
Private Instance Methods
create_error(doc, url)
click to toggle source
Create an exception with code & message
# File lib/scorm_cloud/base.rb, line 87 def create_error(doc, url) err = doc.elements["rsp"].elements["err"] code = err.attributes["code"] msg = err.attributes["msg"] "Error In Scorm Cloud: Error=#{code} Message=#{msg} URL=#{url}" end
execute_call_plain(url)
click to toggle source
Execute the call - returns response body or redirect url
# File lib/scorm_cloud/base.rb, line 72 def execute_call_plain(url) res = Net::HTTP.get_response(URI.parse(url)) case res when Net::HTTPRedirection # Return the new URL res['location'] when Net::HTTPSuccess res.body else raise "HTTP Error connecting to scorm cloud: #{res.inspect}" end end
execute_call_xml(url)
click to toggle source
Get plain response body and parse the XML doc
# File lib/scorm_cloud/base.rb, line 65 def execute_call_xml(url) doc = REXML::Document.new(execute_call_plain(url)) raise create_error(doc, url) unless doc.elements["rsp"].attributes["stat"] == "ok" doc end
prepare_url(method, params = {})
click to toggle source
Get the URL for the call
# File lib/scorm_cloud/base.rb, line 47 def prepare_url(method, params = {}) timestamp = Time.now.utc.strftime('%Y%m%d%H%M%S') params[:method] = method params[:appid] = @appid params[:ts] = timestamp html_params = params.map { |k,v| "#{k.to_s}=#{v}" }.join("&") raw = @secret + params.keys. sort{ |a,b| a.to_s.downcase <=> b.to_s.downcase }. map{ |k| "#{k.to_s}#{params[k]}" }. join sig = Digest::MD5.hexdigest(raw) "http://cloud.scorm.com/api?#{html_params}&sig=#{sig}" end