From fb1b9c2833c3f42a8811a6bb83a54136b73baa94 Mon Sep 17 00:00:00 2001 From: James Whitehead II Date: Mon, 1 Jan 2007 22:33:27 +0000 Subject: [PATCH] * Dongle-0.5.0-Alpha --- Dongle.lua | 108 ++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 62 insertions(+), 46 deletions(-) diff --git a/Dongle.lua b/Dongle.lua index e910122..0bc0e43 100644 --- a/Dongle.lua +++ b/Dongle.lua @@ -91,7 +91,7 @@ end ---------------------------------------------------------------------------]] local major = "Dongle" -local minor = tonumber(string.match("$Revision: 169 $", "(%d+)") or 1) +local minor = tonumber(string.match("$Revision: 188 $", "(%d+)") or 1) assert(DongleStub, string.format("%s requires DongleStub.", major)) if not DongleStub:IsNewerVersion(major, minor) then return end @@ -192,13 +192,21 @@ function Dongle:HasModule(module) return reg.modules[module] end -local EMPTY_TABLE = {} +local NIL_FUNC = function() end function Dongle:IterateModules() local reg = lookup[self] assert(3, reg, "You must call 'IterateModules' from a registered Dongle.") + + if not reg.modules or not next(reg.modules) then return NIL_FUNC end - return ipairs(reg.modules or EMPTY_TABLE) + local i=1 + return function() + local name = reg.modules[i] + if not name then return end + i = i + 1 + return name, reg.modules[name] + end end function Dongle:ADDON_LOADED(event, ...) @@ -395,13 +403,7 @@ local dbMethods = { "ResetProfile", "ResetDB", } -function Dongle:InitializeDB(name, defaults, defaultProfile) - local reg = lookup[self] - assert(3, reg, "You must call 'InitializeDB' from a registered Dongle.") - argcheck(name, 2, "string") - argcheck(defaults, 3, "table", "nil") - argcheck(defaultProfile, 4, "string", "nil") - +local function initdb(parent, name, defaults, defaultProfile, olddb) local sv = getglobal(name) if not sv then @@ -409,6 +411,7 @@ function Dongle:InitializeDB(name, defaults, defaultProfile) setglobal(name, sv) -- Lets do the initial setup + sv.char = {} sv.faction = {} sv.realm = {} @@ -443,17 +446,21 @@ function Dongle:InitializeDB(name, defaults, defaultProfile) local profileKey = sv.profileKeys[char] or defaultProfile or char sv.profileKeys[char] = profileKey - if not sv.profiles[profileKey] then sv.profiles[profileKey] = {} end + local profileCreated + if not sv.profiles[profileKey] then sv.profiles[profileKey] = {} profileCreated = true end - local db = { - ["char"] = sv.char[char], - ["realm"] = sv.realm[realm], - ["class"] = sv.class[class], - ["faction"] = sv.faction[faction], - ["profile"] = sv.profiles[profileKey], - ["global"] = sv.global, - ["profiles"] = sv.profiles, - } + if olddb then + for k,v in pairs(olddb) do olddb[k] = nil end + end + + local db = olddb or {} + db.char = sv.char[char] + db.realm = sv.realm[realm] + db.class = sv.class[class] + db.faction = sv.faction[faction] + db.profile = sv.profiles[profileKey] + db.global = sv.global + db.profiles = sv.profiles -- Copy methods locally for idx,method in pairs(dbMethods) do @@ -464,8 +471,7 @@ function Dongle:InitializeDB(name, defaults, defaultProfile) db.sv = sv db.sv_name = name db.profileKey = profileKey - -- FIXME: Why not just db.parent = self? - db.parent = reg.name + db.parent = parent db.charKey = char db.realmKey = realm db.classKey = class @@ -477,6 +483,21 @@ function Dongle:InitializeDB(name, defaults, defaultProfile) db:RegisterDefaults(defaults) end + return db,profileCreated +end + +function Dongle:InitializeDB(name, defaults, defaultProfile) + local reg = lookup[self] + assert(3, reg, "You must call 'InitializeDB' from a registered Dongle.") + argcheck(name, 2, "string") + argcheck(defaults, 3, "table", "nil") + argcheck(defaultProfile, 4, "string", "nil") + + local db,profileCreated = initdb(self, name, defaults, defaultProfile) + + if profileCreated then + Dongle:TriggerEvent("DONGLE_PROFILE_CREATED", db, self, db.sv_name, db.profileKey) + end return db end @@ -486,7 +507,7 @@ local function copyDefaults(dest, src, force) if not dest[k] then dest[k] = {} end copyDefaults(dest[k], v, force) else - if not dest[k] or force then + if (dest[k] == nil) or force then dest[k] = v end end @@ -558,10 +579,12 @@ function Dongle.SetProfile(db, name) local sv = db.sv local old = sv.profiles[db.profileKey] local new = sv.profiles[name] - + local profileCreated + if not new then sv.profiles[name] = {} new = sv.profiles[name] + profileCreated = true end if db.defaults and db.defaults.profile then @@ -578,9 +601,11 @@ function Dongle.SetProfile(db, name) sv.profileKeys[db.charKey] = name db.profileKey = name - -- FIRE: DONGLE_PROFILE_CHANGED, "DongleName", "SVName", "ProfileName" - local parent = lookup[db.parent].obj - parent:TriggerEvent("DONGLE_PROFILE_CHANGED", db.parent, db.sv_name, name) + if profileCreated then + Dongle:TriggerEvent("DONGLE_PROFILE_CREATED", db, db.parent, db.sv_name, db.profileKey) + end + + Dongle:TriggerEvent("DONGLE_PROFILE_CHANGED", db, db.parent, db.sv_name, db.profileKey) end function Dongle.GetProfiles(db, t) @@ -605,8 +630,7 @@ function Dongle.DeleteProfile(db, name) end db.sv.profiles[name] = nil - local parent = lookup[db.parent].obj - parent:TriggerEvent("DONGLE_PROFILE_DELETED", db.parent, db.sv_name, name) + Dongle:TriggerEvent("DONGLE_PROFILE_DELETED", db, db.parent, db.sv_name, name) end function Dongle.CopyProfile(db, name) @@ -619,11 +643,8 @@ function Dongle.CopyProfile(db, name) local profile = db.profile local source = db.sv.profiles[name] - -- Don't do a destructive copy, just do what we're told copyDefaults(profile, source, true) - -- FIRE: DONGLE_PROFILE_COPIED, "DongleName", "SVName", "SourceProfile", "DestProfile" - local parent = lookup[db.parent].obj - parent:TriggerEvent("DONGLE_PROFILE_COPIED", db.parent, db.sv_name, name, db.profileKey) + Dongle:TriggerEvent("DONGLE_PROFILE_COPIED", db, db.parent, db.sv_name, name, db.profileKey) end function Dongle.ResetProfile(db) @@ -637,9 +658,7 @@ function Dongle.ResetProfile(db) if db.defaults and db.defaults.profile then copyDefaults(profile, db.defaults.profile) end - -- FIRE: DONGLE_PROFILE_RESET, "DongleName", "SVName", "ProfileName" - local parent = lookup[db.parent].obj - parent:TriggerEvent("DONGLE_PROFILE_RESET", db.parent, db.sv_name, db.profileKey) + Dongle:TriggerEvent("DONGLE_PROFILE_RESET", db, db.parent, db.sv_name, db.profileKey) end @@ -651,17 +670,14 @@ function Dongle.ResetDB(db, defaultProfile) for k,v in pairs(sv) do sv[k] = nil end + + local parent = db.parent - local parent = lookup[db.parent].obj - - local newdb = parent:InitializeDB(db.sv_name, db.defaults, defaultProfile) - newdb:SetProfile(newdb.profileKey) - local parent = lookup[db.parent].obj - parent:TriggerEvent("DONGLE_DATABASE_RESET", newdb.parent, newdb.sv_name, newdb.profileKey) - - -- Remove the old database from the lookup table - databases[db] = nil - return newdb + initdb(parent, db.sv_name, db.defaults, defaultProfile, db) + Dongle:TriggerEvent("DONGLE_DATABASE_RESET", db, parent, db.sv_name, db.profileKey) + Dongle:TriggerEvent("DONGLE_PROFILE_CREATED", db, db.parent, db.sv_name, db.profileKey) + Dongle:TriggerEvent("DONGLE_PROFILE_CHANGED", db, db.parent, db.sv_name, db.profileKey) + return db end local slashCmdMethods = { -- 1.7.9.5