view DependencyLoader/Addon.lua @ 13:110baf84e7a8

fixed the LibPrint external in .pkgmeta (maybe)
author mckenziemc
date Fri, 10 Dec 2010 04:33:30 -0800
parents b230b94d4487
children a46bf694050c
line wrap: on
line source
--	Addon
--	Represents individual addon modules.


local addonName, addonTable = ...


--	TODO: test if the API functions are quicker with indexes than names.
--	TODO: modify the dependency stuff to check the Errata module.

local Addon, addon = addonTable:NewClass("Addon")

Addon.enableAddon = EnableAddOn		--	TODO: use raw hook from main module?

Addon.addons = {}
Addon.nameToIndex = {}


--	Internal function
--	Creates a new Addon object
--	@param	id		Name or index of the addon.
function Addon:New(id)
	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
			local message = "Addon not found: "..(id or "nil")
			error(message)
		end
	end
	
	return instance
end


---	Retrieves an Addon object.
--	@param	id	Name or index of the addon to retrieve.
--	@return 	The Addon object, or nil if not found.
function Addon:Get(id)
	if not self:Exists(id) then
		return nil
	end
	
	if type(id) == "number" then
		if self.addons[id] ~= nil then
			return self.addons[id]
		end
		
		local new = self:New(id)
		self.addons[new:GetIndex()] = new
		self.nameToIndex[new:GetName()] = id
		
		return new
	elseif type(id) == "string" then
		if self.nameToIndex[id] then
			return self.addons[self.nameToIndex[id] ]
		end
		
		local new = self:New(id)
		self.addons[new:GetIndex()] = new
		self.nameToIndex[id] = new:GetIndex()
		
		return new
	end
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


---	Checks if the addon is loadable.
--	Considers interface issues, missing, etc. (NYI)
--	Does not check dependencies.
function addon:CanLoad()
	--	FIXME: an addon may be present but unloadable if loading out of date addons is disabled.
	return true
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


function addon:CanForceLoadAfter()
	--	TODO: check Errata module
	return false
end


function addon:CanForceLoadBefore()
	--	TODO: check Errata module
	return false		--	TODO: check if there's any reason addons can't be forceloaded
end


function addon:CanForceLoad()
	--	FIXME: check if this would've already been loaded
	return self:CanForceLoadAfter()
end


function addon:Enable()
	--	FIXME: delay this till after PLAYER_LOGIN or it'll get force-loaded
	Addon.enableAddon(self.name)
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()
	--	TODO: consider no-lib embeds as deps?
	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