diff --git a/lib/hardware_information.rb b/lib/hardware_information.rb new file mode 100644 index 0000000..d2e332b --- /dev/null +++ b/lib/hardware_information.rb @@ -0,0 +1,6 @@ +module W3DHubLauncher + class HardwareInformation + def initialize + end + end +end diff --git a/lib/worker/api/legacy_manifest.rb b/lib/worker/api/legacy_manifest.rb new file mode 100644 index 0000000..672c3e6 --- /dev/null +++ b/lib/worker/api/legacy_manifest.rb @@ -0,0 +1,95 @@ +module W3DHubLauncher + class Worker + class Api + class LegacyManifest + attr_reader :game, :type, :version, :base_version, :files, :dependencies + + def initialize(file_path) + @document = REXML::Document.new(File.read(file_path)) + root = @document.root + + @game = root["game"] + @type = root["type"] + @version = root["version"] + @base_version = root["baseVersion"] + + @files = [] + @dependencies = [] + + parse_files + parse_dependencies + end + + def patch? + @type == "Patch" + end + + def full? + @type == "Full" + end + + def parse_files + @document.root.elements.each("//File") do |element| + @files.push(ManifestFile.new(element, @version)) + end + end + + def parse_dependencies + @document.root.elements.each("//Dependency") do |element| + @dependencies.push(Dependency.new(element)) + end + end + + class ManifestFile + attr_reader :name, :checksum, :package, :patch_package, :removed_since, :from, :version + + def initialize(xml, version) + @data = xml + + @name = @data["name"] + @checksum = @data["checksum"] + @package = @data["package"] + @removed_since = @data["removedsince"] + + xml.elements.each("Patch") do |patch| + @patch = true + + @from = patch["from"] + + if @package.to_s.empty? + @package = patch["package"] + else + @patch_package = patch["package"] + end + end + + @version = version + end + + def removed? + @removed_since + end + + def patch? + @patch + end + + def full_and_patch? + @package && @patch_package + end + end + + class Dependency + attr_reader :name, :removed_since + + def initialize(xml) + @data = xml + + @name = @data["name"] + @removed_since = @data["removed_since"] + end + end + end + end + end +end diff --git a/lib/worker/api/legacy_manifest_package.rb b/lib/worker/api/legacy_manifest_package.rb new file mode 100644 index 0000000..98425bd --- /dev/null +++ b/lib/worker/api/legacy_manifest_package.rb @@ -0,0 +1,67 @@ +require "json" +require "digest/sha2" + +module W3DHubBackend + class Worker + class Api + class LegacyManifestPackage + attr_reader :category, :subcategory, :version, :name, :error, :file_size, + :checksum_chunk_size, :sha256_checksum, :checksum_chunks + + def initialize(hash) + @category = hash["category"] + @subcategory = hash["subcategory"] + @version = Gem::Version.new(hash["version"] || "0.0.0.0") + @name = hash["name"] + @error = hash["error"] + @file_size = Integer(hash["size"] || 0) + @checksum_chunk_size = Integer(hash["checksum-size"] || 0) + @sha256_checksum = hash["checksum"] + @checksum_chunks = hash["checksum-chunks"] + end + + def error? + @error + end + + # checksum whole file and file chunks until a mismatch occurs or the whole file is verified. + def verify_file(filename) + file_size = File.size(filename) + + checksum_chunks = {} + overall_checksum = "" + overall_digest = Digest::SHA256.new + chunk_digest = Digest::SHA256.new + + File.open(filename, "rb") do |f| + f.pos = 0 + offset = 0 + + while (chunk = f.read(@checksum_chunk_size)) + + overall_digest << chunk + + checksum_chunks[offset] = chunk_digest.update(chunk).hexdigest.upcase + + offset += @checksum_chunk_size + chunk_digest.reset + end + end + + overall_checksum = overall_digest.hexdigest.upcase + + # FIXME: Make this a nice Data struct object + [overall_checksum, checksum_chunks, file_size] + end + end + end + + def package_cache_filename(category, subcategory) + if subcategory.empty? + category + else + "#{category}-#{subcategory}" + end + end + end +end