File: addonRevisions.lua

package info (click to toggle)
spring 106.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 55,260 kB
  • sloc: cpp: 543,946; ansic: 44,800; python: 12,575; java: 12,201; awk: 5,889; sh: 1,796; asm: 1,546; xml: 655; perl: 405; php: 211; objc: 194; makefile: 76; sed: 2
file content (249 lines) | stat: -rw-r--r-- 7,362 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--
--  file:    addonRevisions.lua
--  brief:
--  author:  jK
--
--  Copyright (C) 2007-2013.
--  Licensed under the terms of the GNU GPL, v2 or later.
--
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

require "crashHandler.lua"
require "table.lua"


--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Addon Info

AddonRevs = {}

local startTimer = Spring.GetTimer()

local function GetDefaultKnownInfo(filepath, basename)
	return {
		filepath = filepath,
		basename = basename,
		name     = basename,
		version  = "0.1",
		layer    = 0,
		desc     = "",
		author   = "",
		license  = "",
		enabled  = false,
		api      = false,
		handler  = false,
		before   = {},
		after    = {},
		depend   = {},
		_rev     = 0,
	}
end


function AddonRevs.LoadAddonInfoRev2(filepath, _VFSMODE)
	local basename = Basename(filepath)

	local ki = GetDefaultKnownInfo(filepath, basename)
	ki._rev = 2

	_VFSMODE = _VFSMODE or VFSMODE
	local loadEnv = {addon = {InGetInfo = true}, math = math}

	local success, rvalue = pcall(VFS.Include, filepath, loadEnv, _VFSMODE)
		if not success then
			return "Failed to load: " .. basename .. "  (" .. tostring(rvalue) .. ")"
		end
		if rvalue == false then
			return true --// addon asked for a silent death
		end
		if type(rvalue) ~= "table" then
			return "Wrong return value: " .. basename
		end

	tcopy(ki, rvalue)
	return false, ki
end


function AddonRevs.LoadAddonInfoRev1(filepath, _VFSMODE)
	local addon = AddonRevs.ParseAddon(1, filepath, _VFSMODE)
	if addon then
		local basename = Basename(filepath)

		local ki = GetDefaultKnownInfo(filepath, basename)
		ki._rev = 1

		local rvalue
		if (addon.GetInfo) then
			rvalue = SafeCallAddon(addon, "GetInfo")
			if type(rvalue) ~= "table" then
				return "Failed to call GetInfo() in: " .. basename
			end
		else
			return "Missing GetInfo() in: " .. basename
		end

		tcopy(ki, rvalue)
		return false, ki
	end
end


function AddonRevs.ValidateKnownInfo(ki, _VFSMODE)
	if not ki then
		return "No KnownInfo given"
	end

	--// load/create data
	local knownInfo = handler.knownInfos[ki.name]
	if (not knowInfo) then
		knownInfo = {}
		handler.knownInfos[ki.name] = knownInfo
	end

	--// check for duplicated name
	if (knownInfo.filepath)and(knownInfo.filepath ~= ki.filepath) then
		return "Failed to load: " .. ki.basename .. " (duplicate name)"
	end

	--// create/update knownInfo table
	tcopy(knownInfo, ki) --// update table
end



--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Addon Parsing

function AddonRevs.NewAddonRev2()
	local addonEnv = {}
	local addon = addonEnv
	addonEnv.widget = addon
	addonEnv.addon  = addon  --// makes `function Initizalize` & `function addon.Initialize` point to the same data

	--// copy the engine enviroment to the addon
		tcopy(addonEnv, handler.EG)

	--// the shared table
		addonEnv.SG = handler.SG

	--// addon related methods
		tmergein(addonEnv.addon, {
			Remove = function() handler:Remove(addon, "auto") end,
			IsMouseOwner = function() return (handler.mouseOwner == addon) end,
			DisownMouse  = function()
				if (handler.mouseOwner == addon) then
					handler.mouseOwner = nil
				end
			end,
			UpdateCallIn = function(name) handler:UpdateAddonCallIn(name, addon) end,
			RemoveCallIn = function(name) handler:RemoveAddonCallIn(name, addon) end,
			AddAction    = function(cmd, func, data, types) return actionHandler.AddAction(addon, cmd, func, data, types) end,
			RemoveAction = function(cmd, types)             return actionHandler.RemoveAction(addon, cmd, types) end,
--[[
FIXME???
			AddLayoutCommand = function(_, cmd)
				if (handler.inCommandsChanged) then
					table.insert(handler.customCommands, cmd)
				else
					Spring.Echo("AddLayoutCommand() can only be used in CommandsChanged()")
				end
			end,
			GetCommands  = function() return handler.commands end,
--]]
			RegisterGlobal   = function(name, value) return handler:RegisterGlobal(addon, name, value) end,
			DeregisterGlobal = function(name)        return handler:DeregisterGlobal(addon, name) end,
			SetGlobal        = function(name, value) return handler:SetGlobal(addon, name, value) end,
		})

	--// insert handler
		addonEnv.handler = handler
		addonEnv[handler.name] = handler
	return addon
end


function AddonRevs.NewAddonRev1()
	local addonEnv = {}
	local addon = addonEnv --// easy self referencing
	addonEnv.addon  = addon
	addonEnv.widget = addon

	--// copy the engine enviroment to the addon
	tcopy(addonEnv, handler.EG)

	--// the shared table
	addonEnv.SG = handler.SG
	addonEnv.WG = handler.SG

	--// wrapped calls (closures)
	local h = {}
	addonEnv.handler = h
	addonEnv[handler.name] = h
	addonEnv.include = function(f) return include(f, addon) end
	h.ForceLayout  = handler.EG.ForceLayout
	h.RemoveWidget = function() handler:Remove(addon, "auto") end
	h.GetCommands  = function() return handler.commands end
	h.GetViewSizes = function() return gl.GetViewSizes() end
	h.GetHourTimer = function() return Spring.DiffTimers(Spring.GetTimer(), startTimer) % 3600 end
	h.IsMouseOwner = function() return (handler.mouseOwner == addon) end
	h.DisownMouse  = function()
		if (handler.mouseOwner == addon) then
			handler.mouseOwner = nil
		end
	end

	h.UpdateCallIn = function(_, name) handler:UpdateAddonCallIn(name, addon) end
	h.RemoveCallIn = function(_, name) handler:RemoveAddonCallIn(name, addon) end

	h.AddAction    = function(_, cmd, func, data, types) return actionHandler.AddAction(addon, cmd, func, data, types) end
	h.RemoveAction = function(_, cmd, types)             return actionHandler.RemoveAction(addon, cmd, types) end
	h.actionHandler    = actionHandler.oldSyntax

	h.AddLayoutCommand = function(_, cmd)
		if (handler.inCommandsChanged) then
			table.insert(handler.customCommands, cmd)
		else
			Spring.Echo("AddLayoutCommand() can only be used in CommandsChanged()")
		end
	end

	h.RegisterGlobal   = function(_, name, value) return handler:RegisterGlobal(addon, name, value) end
	h.DeregisterGlobal = function(_, name)        return handler:DeregisterGlobal(addon, name) end
	h.SetGlobal        = function(_, name, value) return handler:SetGlobal(addon, name, value) end

	return addonEnv
end


function AddonRevs.ParseAddon(rev, filepath, _VFSMODE)
	_VFSMODE = _VFSMODE or VFSMODE
	local basename = Basename(filepath)

	--// load the code
	local addonEnv = handler:NewAddon(rev)
	local success, err = pcall(VFS.Include, filepath, addonEnv, _VFSMODE)
	if (not success) then
		Spring.Log(LUA_NAME, "error", 'Failed to load: ' .. basename .. '  (' .. tostring(err) .. ')')
		return nil
	end
	if (err == false) then
		return nil --// addon asked for a silent death
	end

	local addon = addonEnv.addon

	--// Validate Callins
	err = handler:ValidateAddon(addon)
	if (err) then
		Spring.Log(LUA_NAME, "error", 'Failed to load: ' .. basename .. '  (' .. tostring(err) .. ')')
		return nil
	end

	return addon
end