comparison DependencyLoader_Core/Addon.lua @ 0:9852fcd5e59e

initial import
author mckenziemc
date Tue, 30 Nov 2010 16:13:04 -0800
parents
children 930871e163bc
comparison
equal deleted inserted replaced
-1:000000000000 0:9852fcd5e59e
1 -- Addon
2 -- Represents individual addon modules
3
4
5 local addonName, addonTable = ...
6
7 print("running Addon.lua")
8
9 -- NOTE: I assume that the API addon functions are
10 -- slightly quicker with an index than with a number.
11
12 -- TODO: modify the dependency stuff to use the Errata module if available
13
14 local Addon, addon = addonTable:NewClass("Addon")
15
16 function Addon:New(id)
17 assert(type(id) == "number" or type(id) == "string")
18
19 local instance = {}
20
21 setmetatable(instance, self.instanceMetatable)
22
23 if type(id) == "number" then
24 -- TODO: make sure it's in range
25 instance.index = id
26 instance.name = GetAddOnInfo(id)
27 else
28 -- FIXME: allow blizzard addons?
29 local index
30
31 for i=1,GetNumAddOns() do
32 if GetAddOnInfo(i) == id then
33 index = i
34 break
35 end
36 end
37
38 if index then
39 instance.name = GetAddOnInfo(id)
40 instance.index = index
41 else
42 error("Addon not found")
43 end
44 end
45
46 return instance
47 end
48
49
50 -- Checks if an addon exists with the specified name.
51 -- @param addon Name of the addon.
52 -- @return True if the addon is present, false otherwise.
53 function Addon:Exists(addon)
54 if type(addon) == "number" then
55 if addon >= 1 and addon <= GetNumAddOns() then
56 return true
57 else
58 return false
59 end
60 elseif type(addon) == "string" then
61 local status = select(6, GetAddOnInfo(addon))
62
63 if status == "MISSING" then
64 return false
65 else
66 return true
67 end
68 else
69 error()
70 end
71 end
72
73
74 function addon:GetName()
75 return self.name
76 end
77
78
79 function addon:GetIndex()
80 return self.index
81 end
82
83
84 function addon:IsEnabled()
85 -- FIXME: written while tired; review later
86 local status = select(6, GetAddOnInfo(self.index))
87
88 if status == "DISABLED" then
89 return false
90 else
91 return true
92 end
93 end
94
95 -- FIXME: an addon may be present but unloadable if loading out of date addons is disabled.
96 -- NOTE: CanForceLoad and CanLoD don't check the status of dependencies
97
98 function addon:CanForceLoad()
99 return true -- TODO: check if there's any reason addons can't be forceloaded
100 end
101
102 function addon:CanLoD()
103 -- FIXME: what will the client say about addons using LoadManagers if the LM was force-loaded?
104 if IsAddOnLoadOnDemand(self.name) then
105 return true
106 else
107 return false
108 end
109 end
110
111 -- NOTE: only call for LoD, not force-loading
112 function addon:Load()
113 assert(self:CanLoD())
114
115 EnableAddOn(self.name)
116 LoadAddOn(self.name)
117 end
118
119 function addon:ForceLoad()
120 assert(self:CanForceLoad())
121 -- TODO: make sure force-loading is available at this time
122
123 EnableAddOn(self.name) -- This should cause the game to also load this addon
124 end
125
126
127 function addon:GetDependencies()
128 return GetAddOnDependencies(self.index)
129 end
130
131
132 function addon:GetEmbeds()
133 local embeds = {}
134
135 local embedString = GetAddOnMetadata(self.name, "X-Embeds")
136
137 if embedString then
138 for match in string.gmatch(embedString, "[^,%s]+") do
139 table.insert(embeds, match)
140 end
141 end
142
143 return unpack(embeds)
144 end
145
146 function addon:IsLoaded()
147 if IsAddOnLoaded(self.index) then
148 return true
149 else
150 return false
151 end
152 end