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