Stub HardwareInformation (hardware survey) class, added LegacyManifest and LegacyManifastPackage handling classes

This commit is contained in:
2026-09-09 10:16:09 -05:00
parent b52f6e2183
commit 0693733179
3 changed files with 168 additions and 0 deletions

View File

@@ -0,0 +1,6 @@
module W3DHubLauncher
class HardwareInformation
def initialize
end
end
end

View File

@@ -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

View File

@@ -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