diff DependencyLoader_Core/Addon.lua @ 0:9852fcd5e59e

initial import
author mckenziemc
date Tue, 30 Nov 2010 16:13:04 -0800
parents
children 930871e163bc
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DependencyLoader_Core/Addon.lua	Tue Nov 30 16:13:04 2010 -0800
@@ -0,0 +1,152 @@
+--	Addon
+--	Represents individual addon modules
+
+
+local addonName, addonTable = ...
+
+print("running Addon.lua")
+
+--	NOTE: I assume that the API addon functions are 
+--	slightly quicker with an index than with a number.
+
+--	TODO: modify the dependency stuff to use the Errata module if available
+
+local Addon, addon = addonTable:NewClass("Addon")
+
+function Addon:New(id)
+	assert(type(id) == "number" or type(id) == "string")
+
+	local instance = {}
+	
+	setmetatable(instance, self.instanceMetatable)
+	
+	if type(id) == "number" then
+		--	TODO: make sure it's in range
+		instance.index = id
+		instance.name = GetAddOnInfo(id)
+	else
+		--	FIXME: allow blizzard addons?
+		local index
+		
+		for i=1,GetNumAddOns() do
+			if GetAddOnInfo(i) == id then
+				index = i
+				break
+			end
+		end
+		
+		if index then
+			instance.name = GetAddOnInfo(id)
+			instance.index = index
+		else
+			error("Addon not found")
+		end
+	end
+	
+	return instance
+end
+
+
+--	Checks if an addon exists with the specified name.
+--	@param	addon	Name of the addon.
+--	@return			True if the addon is present, false otherwise.
+function Addon:Exists(addon)
+	if type(addon) == "number" then
+		if addon >= 1 and addon <= GetNumAddOns() then
+			return true
+		else
+			return false
+		end
+	elseif type(addon) == "string" then
+		local status = select(6, GetAddOnInfo(addon))
+		
+		if status == "MISSING" then
+			return false
+		else
+			return true
+		end
+	else
+		error()
+	end
+end
+
+
+function addon:GetName()
+	return self.name
+end
+
+
+function addon:GetIndex()
+	return self.index
+end
+
+
+function addon:IsEnabled()
+	--	FIXME: written while tired; review later
+	local status = select(6, GetAddOnInfo(self.index))
+	
+	if status == "DISABLED"	then
+		return false
+	else
+		return true
+	end
+end
+
+--	FIXME: an addon may be present but unloadable if loading out of date addons is disabled.
+--	NOTE: CanForceLoad and CanLoD don't check the status of dependencies
+
+function addon:CanForceLoad()
+	return true		--	TODO: check if there's any reason addons can't be forceloaded
+end
+
+function addon:CanLoD()
+	--	FIXME: what will the client say about addons using LoadManagers if the LM was force-loaded?
+	if IsAddOnLoadOnDemand(self.name) then
+		return true
+	else
+		return false
+	end
+end
+
+--	NOTE: only call for LoD, not force-loading
+function addon:Load()
+	assert(self:CanLoD())
+	
+	EnableAddOn(self.name)
+	LoadAddOn(self.name)
+end
+
+function addon:ForceLoad()
+	assert(self:CanForceLoad())
+	--	TODO: make sure force-loading is available at this time
+	
+	EnableAddOn(self.name)	--	This should cause the game to also load this addon
+end
+
+
+function addon:GetDependencies()
+	return GetAddOnDependencies(self.index)
+end
+
+
+function addon:GetEmbeds()
+	local embeds = {}
+	
+	local embedString = GetAddOnMetadata(self.name, "X-Embeds")
+	
+	if embedString then
+		for match in string.gmatch(embedString, "[^,%s]+") do
+			table.insert(embeds, match)
+		end
+	end
+	
+	return unpack(embeds)
+end
+
+function addon:IsLoaded()
+	if IsAddOnLoaded(self.index) then
+		return true
+	else
+		return false
+	end
+end