Added:
tags/Dongle-1.1-r649/
tags/Dongle-1.1-r649/Dongle.lua
tags/Dongle-1.1-r649/Dongle.toc
tags/Dongle-1.1-r649/DongleUnitTests/
tags/Dongle-1.1-r649/DongleUnitTests/DongleUnitTests.toc
tags/Dongle-1.1-r649/DongleUnitTests/MONACO.TTF (contents, props changed)
tags/Dongle-1.1-r649/DongleUnitTests/Tests/
tags/Dongle-1.1-r649/DongleUnitTests/Tests/01DongleStub.lua
tags/Dongle-1.1-r649/DongleUnitTests/Tests/02DongleCore.lua
tags/Dongle-1.1-r649/DongleUnitTests/Tests/03DongleModules.lua
tags/Dongle-1.1-r649/DongleUnitTests/Tests/04DongleMessage.lua
tags/Dongle-1.1-r649/DongleUnitTests/Tests/05DonglePrint.lua
tags/Dongle-1.1-r649/DongleUnitTests/Tests/06DongleDB.lua
tags/Dongle-1.1-r649/DongleUnitTests/Tests/07DongleSlash.lua
tags/Dongle-1.1-r649/DongleUnitTests/Tests/08DongleError.lua
tags/Dongle-1.1-r649/DongleUnitTests/Tests/09DongleTimer.lua
tags/Dongle-1.1-r649/DongleUnitTests/Tests/99Completion.lua
tags/Dongle-1.1-r649/DongleUnitTests/UnitTests.lua
tags/Dongle-1.1-r649/changelog.txt
Log:
* Tagging and importing Dongle-1.1-r649
Added: tags/Dongle-1.1-r649/Dongle.lua
==============================================================================
--- (empty file)
+++ tags/Dongle-1.1-r649/Dongle.lua Mon Nov 12 12:07:06 2007
@@ -0,0 +1,1431 @@
+--[[-------------------------------------------------------------------------
+ Copyright (c) 2006-2007, Dongle Development Team
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of the Dongle Development Team nor the names of
+ its contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------]]
+local major = "DongleStub"
+local minor = tonumber(string.match("$Revision: 313 $", "(%d+)") or 1)
+
+local g = getfenv(0)
+
+if not g.DongleStub or g.DongleStub:IsNewerVersion(major, minor) then
+ local lib = setmetatable({}, {
+ __call = function(t,k)
+ if type(t.versions) == "table" and t.versions[k] then
+ return t.versions[k].instance
+ else
+ error("Cannot find a library with name '"..tostring(k).."'", 2)
+ end
+ end
+ })
+
+ function lib:IsNewerVersion(major, minor)
+ local versionData = self.versions and self.versions[major]
+
+ -- If DongleStub versions have differing major version names
+ -- such as DongleStub-Beta0 and DongleStub-1.0-RC2 then a second
+ -- instance will be loaded, with older logic. This code attempts
+ -- to compensate for that by matching the major version against
+ -- "^DongleStub", and handling the version check correctly.
+
+ if major:match("^DongleStub") then
+ local oldmajor,oldminor = self:GetVersion()
+ if self.versions and self.versions[oldmajor] then
+ return minor > oldminor
+ else
+ return true
+ end
+ end
+
+ if not versionData then return true end
+ local oldmajor,oldminor = versionData.instance:GetVersion()
+ return minor > oldminor
+ end
+
+ local function NilCopyTable(src, dest)
+ for k,v in pairs(dest) do dest[k] = nil end
+ for k,v in pairs(src) do dest[k] = v end
+ end
+
+ function lib:Register(newInstance, activate, deactivate)
+ assert(type(newInstance.GetVersion) == "function",
+ "Attempt to register a library with DongleStub that does not have
a 'GetVersion' method.")
+
+ local major,minor = newInstance:GetVersion()
+ assert(type(major) == "string",
+ "Attempt to register a library with DongleStub that does not have a
proper major version.")
+ assert(type(minor) == "number",
+ "Attempt to register a library with DongleStub that does not have a
proper minor version.")
+
+ -- Generate a log of all library registrations
+ if not self.log then self.log = {} end
+ table.insert(self.log, string.format("Register: %s, %s", major, minor))
+
+ if not self:IsNewerVersion(major, minor) then return false end
+ if not self.versions then self.versions = {} end
+
+ local versionData = self.versions[major]
+ if not versionData then
+ -- New major version
+ versionData = {
+ ["instance"] = newInstance,
+ ["deactivate"] = deactivate,
+ }
+
+ self.versions[major] = versionData
+ if type(activate) == "function" then
+ table.insert(self.log, string.format("Activate: %s, %s", major, minor))
+ activate(newInstance)
+ end
+ return newInstance
+ end
+
+ local oldDeactivate = versionData.deactivate
+ local oldInstance = versionData.instance
+
+ versionData.deactivate = deactivate
+
+ local skipCopy
+ if type(activate) == "function" then
+ table.insert(self.log, string.format("Activate: %s, %s", major, minor))
+ skipCopy = activate(newInstance, oldInstance)
+ end
+
+ -- Deactivate the old libary if necessary
+ if type(oldDeactivate) == "function" then
+ local major, minor = oldInstance:GetVersion()
+ table.insert(self.log, string.format("Deactivate: %s, %s", major, minor))
+ oldDeactivate(oldInstance, newInstance)
+ end
+
+ -- Re-use the old table, and discard the new one
+ if not skipCopy then
+ NilCopyTable(newInstance, oldInstance)
+ end
+ return oldInstance
+ end
+
+ function lib:GetVersion() return major,minor end
+
+ local function Activate(new, old)
+ -- This code ensures that we'll move the versions table even
+ -- if the major version names are different, in the case of
+ -- DongleStub
+ if not old then old = g.DongleStub end
+
+ if old then
+ new.versions = old.versions
+ new.log = old.log
+ end
+ g.DongleStub = new
+ end
+
+ -- Actually trigger libary activation here
+ local stub = g.DongleStub or lib
+ lib = stub:Register(lib, Activate)
+end
+
+--[[-------------------------------------------------------------------------
+ Begin Library Implementation
+---------------------------------------------------------------------------]]
+
+local major = "Dongle-1.1"
+local minor = tonumber(string.match("$Revision: 647 $", "(%d+)") or 1)
+
+assert(DongleStub, string.format("%s requires DongleStub.", major))
+
+if not DongleStub:IsNewerVersion(major, minor) then return end
+
+local Dongle = {}
+local methods = {
+ "RegisterEvent", "UnregisterEvent", "UnregisterAllEvents", "IsEventRegistered",
+ "RegisterMessage", "UnregisterMessage", "UnregisterAllMessages", "TriggerMessage", "IsMessageRegistered",
+ "ScheduleTimer", "ScheduleRepeatingTimer", "CancelTimer", "IsTimerScheduled",
+ "EnableDebug", "IsDebugEnabled", "Print", "PrintF", "Debug", "DebugF", "Echo", "EchoF",
+ "InitializeDB",
+ "InitializeSlashCommand",
+ "NewModule", "HasModule", "IterateModules",
+}
+
+local registry = {}
+local lookup = {}
+local loadqueue = {}
+local loadorder = {}
+local events = {}
+local databases = {}
+local commands = {}
+local messages = {}
+local timers = {}
+local heap = {}
+
+local frame
+
+--[[-------------------------------------------------------------------------
+ Message Localization
+---------------------------------------------------------------------------]]
+
+local L = {
+ ["ADDMESSAGE_REQUIRED"] = "The frame you specify must have
an 'AddMessage' method.",
+ ["ALREADY_REGISTERED"] = "A Dongle with the name '%s' is already registered.",
+ ["BAD_ARGUMENT"] = "bad argument #%d to '%s' (%s expected, got %s)",
+ ["BAD_ARGUMENT_DB"] = "bad argument #%d to '%s' (DongleDB expected)",
+ ["CANNOT_DELETE_ACTIVE_PROFILE"] = "You cannot delete your active
profile. Change profiles, then attempt to delete.",
+ ["DELETE_NONEXISTANT_PROFILE"] = "You cannot delete a non-existant profile.",
+ ["MUST_CALLFROM_DBOBJECT"] = "You must call '%s' from a Dongle
database object.",
+ ["MUST_CALLFROM_REGISTERED"] = "You must call '%s' from a registered Dongle.",
+ ["MUST_CALLFROM_SLASH"] = "You must call '%s' from a Dongle slash
command object.",
+ ["PROFILE_DOES_NOT_EXIST"] = "Profile '%s' doesn't exist.",
+ ["REPLACE_DEFAULTS"] = "You are attempting to register defaults with
a database that already contains defaults.",
+ ["SAME_SOURCE_DEST"] = "Source/Destination profile cannot be the same profile.",
+ ["EVENT_REGISTER_SPECIAL"] = "You cannot register for the '%s' event.
Use the '%s' method instead.",
+ ["Unknown"] = "Unknown",
+ ["INJECTDB_USAGE"] = "Usage: DongleCmd:InjectDBCommands(db, ['copy', 'delete', 'list', 'reset', 'set'])",
+ ["DBSLASH_PROFILE_COPY_DESC"] = "profile copy <name> - Copies profile
<name> into your current profile.",
+ ["DBSLASH_PROFILE_COPY_PATTERN"] = "^profile copy (.+)$",
+ ["DBSLASH_PROFILE_DELETE_DESC"] = "profile delete <name> - Deletes
the profile <name>.",
+ ["DBSLASH_PROFILE_DELETE_PATTERN"] = "^profile delete (.+)$",
+ ["DBSLASH_PROFILE_LIST_DESC"] = "profile list - Lists all valid profiles.",
+ ["DBSLASH_PROFILE_LIST_PATTERN"] = "^profile list$",
+ ["DBSLASH_PROFILE_RESET_DESC"] = "profile reset - Resets the current profile.",
+ ["DBSLASH_PROFILE_RESET_PATTERN"] = "^profile reset$",
+ ["DBSLASH_PROFILE_SET_DESC"] = "profile set <name> - Sets the current
profile to <name>.",
+ ["DBSLASH_PROFILE_SET_PATTERN"] = "^profile set (.+)$",
+ ["DBSLASH_PROFILE_LIST_OUT"] = "Profile List:",
+}
+
+--[[-------------------------------------------------------------------------
+ Utility functions for Dongle use
+---------------------------------------------------------------------------]]
+
+local function assert(level,condition,message)
+ if not condition then
+ error(message,level)
+ end
+end
+
+local function argcheck(value, num, ...)
+ if type(num) ~= "number" then
+ error(L["BAD_ARGUMENT"]:format(2, "argcheck", "number", type(num)), 1)
+ end
+
+ for i=1,select("#", ...) do
+ if type(value) == select(i, ...) then return end
+ end
+
+ local types = strjoin(", ", ...)
+ local name = string.match(debugstack(2,2,0), ": in function [`<](.-)['>]")
+ error(L["BAD_ARGUMENT"]:format(num, name, types, type(value)), 3)
+end
+
+local function safecall(func,...)
+ local success,err = pcall(func,...)
+ if not success then
+ geterrorhandler()(err)
+ end
+end
+
+--[[-------------------------------------------------------------------------
+ Dongle constructor, and DongleModule system
+---------------------------------------------------------------------------]]
+
+function Dongle:New(name, obj)
+ argcheck(name, 2, "string")
+ argcheck(obj, 3, "table", "nil")
+
+ if not obj then
+ obj = {}
+ end
+
+ if registry[name] then
+ error(string.format(L["ALREADY_REGISTERED"], name))
+ end
+
+ local reg = {["obj"] = obj, ["name"] = name}
+
+ registry[name] = reg
+ lookup[obj] = reg
+ lookup[name] = reg
+
+ for k,v in pairs(methods) do
+ obj[v] = self[v]
+ end
+
+ -- Add this Dongle to the end of the queue
+ table.insert(loadqueue, obj)
+ return obj,name
+end
+
+function Dongle:NewModule(name, obj)
+ local reg = lookup[self]
+ assert(3, reg, string.format(L["MUST_CALLFROM_REGISTERED"], "NewModule"))
+ argcheck(name, 2, "string")
+ argcheck(obj, 3, "table", "nil")
+
+ obj,name = Dongle:New(name, obj)
+
+ if not reg.modules then reg.modules = {} end
+ reg.modules[obj] = obj
+ reg.modules[name] = obj
+
+ return obj,name
+end
+
+function Dongle:HasModule(module)
+ local reg = lookup[self]
+ assert(3, reg, string.format(L["MUST_CALLFROM_REGISTERED"], "HasModule"))
+ argcheck(module, 2, "string", "table")
+
+ return reg.modules and reg.modules[module]
+end
+
+local function ModuleIterator(t, name)
+ if not t then return end
+ local obj
+ repeat
+ name,obj = next(t, name)
+ until type(name) == "string" or not name
+
+ return name,obj
+end
+
+function Dongle:IterateModules()
+ local reg = lookup[self]
+ assert(3, reg, string.format(L["MUST_CALLFROM_REGISTERED"], "IterateModules"))
+
+ return ModuleIterator, reg.modules
+end
+
+--[[-------------------------------------------------------------------------
+ Event registration system
+---------------------------------------------------------------------------]]
+
+local function OnEvent(frame, event, ...)
+ local eventTbl = events[event]
+ if eventTbl then
+ for obj,func in pairs(eventTbl) do
+ if type(func) == "string" then
+ if type(obj[func]) == "function" then
+ safecall(obj[func], obj, event, ...)
+ end
+ else
+ safecall(func, event, ...)
+ end
+ end
+ end
+end
+
+local specialEvents = {
+ ["PLAYER_LOGIN"] = "Enable",
+ ["PLAYER_LOGOUT"] = "Disable",
+}
+
+function Dongle:RegisterEvent(event, func)
+ local reg = lookup[self]
+ assert(3, reg, string.format(L["MUST_CALLFROM_REGISTERED"], "RegisterEvent"))
+ argcheck(event, 2, "string")
+ argcheck(func, 3, "string", "function", "nil")
+
+ local special = (self ~= Dongle) and specialEvents[event]
+ if special then
+ error(string.format(L["EVENT_REGISTER_SPECIAL"], event, special), 3)
+ end
+
+ -- Name the method the same as the event if necessary
+ if not func then func = event end
+
+ if not events[event] then
+ events[event] = {}
+ frame:RegisterEvent(event)
+ end
+ events[event][self] = func
+end
+
+function Dongle:UnregisterEvent(event)
+ local reg = lookup[self]
+ assert(3, reg, string.format(L["MUST_CALLFROM_REGISTERED"], "UnregisterEvent"))
+ argcheck(event, 2, "string")
+
+ local tbl = events[event]
+ if tbl then
+ tbl[self] = nil
+ if not next(tbl) then
+ events[event] = nil
+ frame:UnregisterEvent(event)
+ end
+ end
+end
+
+function Dongle:UnregisterAllEvents()
+ local reg = lookup[self]
+ assert(3, reg, string.format(L["MUST_CALLFROM_REGISTERED"], "UnregisterAllEvents"))
+
+ for event,tbl in pairs(events) do
+ tbl[self] = nil
+ if not next(tbl) then
+ events[event] = nil
+ frame:UnregisterEvent(event)
+ end
+ end
+end
+
+function Dongle:IsEventRegistered(event)
+ local reg = lookup[self]
+ assert(3, reg, string.format(L["MUST_CALLFROM_REGISTERED"], "IsEventRegistered"))
+ argcheck(event, 2, "string")
+
+ local tbl = events[event]
+ return tbl
+end
+
+--[[-------------------------------------------------------------------------
+ Inter-Addon Messaging System
+---------------------------------------------------------------------------]]
+
+function Dongle:RegisterMessage(msg, func)
+ argcheck(self, 1, "table")
+ argcheck(msg, 2, "string")
+ argcheck(func, 3, "string", "function", "nil")
+
+ -- Name the method the same as the message if necessary
+ if not func then func = msg end
+
+ if not messages[msg] then
+ messages[msg] = {}
+ end
+ messages[msg][self] = func
+end
+
+function Dongle:UnregisterMessage(msg)
+ argcheck(self, 1, "table")
+ argcheck(msg, 2, "string")
+
+ local tbl = messages[msg]
+ if tbl then
+ tbl[self] = nil
+ if not next(tbl) then
+ messages[msg] = nil
+ end
+ end
+end
+
+function Dongle:UnregisterAllMessages()
+ argcheck(self, 1, "table")
+
+ for msg,tbl in pairs(messages) do
+ tbl[self] = nil
+ if not next(tbl) then
+ messages[msg] = nil
+ end
+ end
+end
+
+function Dongle:TriggerMessage(msg, ...)
+ argcheck(self, 1, "table")
+ argcheck(msg, 2, "string")
+ local msgTbl = messages[msg]
+ if not msgTbl then return end
+
+ for obj,func in pairs(msgTbl) do
+ if type(func) == "string" then
+ if type(obj[func]) == "function" then
+ safecall(obj[func], obj, msg, ...)
+ end
+ else
+ safecall(func, msg, ...)
+ end
+ end
+end
+
+function Dongle:IsMessageRegistered(msg)
+ argcheck(self, 1, "table")
+ argcheck(msg, 2, "string")
+
+ local tbl = messages[msg]
+ return tbl[self]
+end
+
+--[[-------------------------------------------------------------------------
+ Timer System
+---------------------------------------------------------------------------]]
+
+local function HeapSwap(i1, i2)
+ heap[i1], heap[i2] = heap[i2], heap[i1]
+end
+
+local function HeapBubbleUp(index)
+ while index > 1 do
+ local parentIndex = math.floor(index / 2)
+ if heap[index].timeToFire < heap[parentIndex].timeToFire then
+ HeapSwap(index, parentIndex)
+ index = parentIndex
+ else
+ break
+ end
+ end
+end
+
+local function HeapBubbleDown(index)
+ while 2 * index <= heap.lastIndex do
+ local leftIndex = 2 * index
+ local rightIndex = leftIndex + 1
+ local current = heap[index]
+ local leftChild = heap[leftIndex]
+ local rightChild = heap[rightIndex]
+
+ if not rightChild then
+ if leftChild.timeToFire < current.timeToFire then
+ HeapSwap(index, leftIndex)
+ index = leftIndex
+ else
+ break
+ end
+ else
+ if leftChild.timeToFire < current.timeToFire or
+ rightChild.timeToFire < current.timeToFire then
+ if leftChild.timeToFire < rightChild.timeToFire then
+ HeapSwap(index, leftIndex)
+ index = leftIndex
+ else
+ HeapSwap(index, rightIndex)
+ index = rightIndex
+ end
+ else
+ break
+ end
+ end
+ end
+end
+
+local function OnUpdate(frame, elapsed)
+ local schedule = heap[1]
+ while schedule and schedule.timeToFire < GetTime() do
+ if schedule.cancelled then
+ HeapSwap(1, heap.lastIndex)
+ heap[heap.lastIndex] = nil
+ heap.lastIndex = heap.lastIndex - 1
+ HeapBubbleDown(1)
+ else
+ if schedule.args then
+ safecall(schedule.func, schedule.name, unpack(schedule.args))
+ else
+ safecall(schedule.func, schedule.name)
+ end
+
+ if schedule.repeating then
+ schedule.timeToFire = schedule.timeToFire + schedule.repeating
+ HeapBubbleDown(1)
+ else
+ HeapSwap(1, heap.lastIndex)
+ heap[heap.lastIndex] = nil
+ heap.lastIndex = heap.lastIndex - 1
+ HeapBubbleDown(1)
+ timers[schedule.name] = nil
+ end
+ end
+ schedule = heap[1]
+ end
+ if not schedule then frame:Hide() end
+end
+
+function Dongle:ScheduleTimer(name, func, delay, ...)
+ argcheck(self, 1, "table")
+ argcheck(name, 2, "string")
+ argcheck(func, 3, "function")
+ argcheck(delay, 4, "number")
+
+ if Dongle:IsTimerScheduled(name) then
+ Dongle:CancelTimer(name)
+ end
+
+ local schedule = {}
+ timers[name] = schedule
+ schedule.timeToFire = GetTime() + delay
+ schedule.func = func
+ schedule.name = name
+ if select('#', ...) ~= 0 then
+ schedule.args = { ... }
+ end
+
+ if heap.lastIndex then
+ heap.lastIndex = heap.lastIndex + 1
+ else
+ heap.lastIndex = 1
+ end
+ heap[heap.lastIndex] = schedule
+ HeapBubbleUp(heap.lastIndex)
+ if not frame:IsShown() then
+ frame:Show()
+ end
+end
+
+function Dongle:ScheduleRepeatingTimer(name, func, delay, ...)
+ Dongle:ScheduleTimer(name, func, delay, ...)
+ timers[name].repeating = delay
+end
+
+function Dongle:IsTimerScheduled(name)
+ argcheck(self, 1, "table")
+ argcheck(name, 2, "string")
+ local schedule = timers[name]
+ if schedule then
+ return true, schedule.timeToFire - GetTime()
+ else
+ return false
+ end
+end
+
+function Dongle:CancelTimer(name)
+ argcheck(self, 1, "table")
+ argcheck(name, 2, "string")
+ local schedule = timers[name]
+ if not schedule then return end
+ schedule.cancelled = true
+ timers[name] = nil
+end
+
+--[[-------------------------------------------------------------------------
+ Debug and Print utility functions
+---------------------------------------------------------------------------]]
+
+function Dongle:EnableDebug(level, frame)
+ local reg = lookup[self]
+ assert(3, reg, string.format(L["MUST_CALLFROM_REGISTERED"], "EnableDebug"))
+ argcheck(level, 2, "number", "nil")
+ argcheck(frame, 3, "table", "nil")
+
+ assert(3, type(frame) == "nil" or type(frame.AddMessage)
== "function", L["ADDMESSAGE_REQUIRED"])
+ reg.debugFrame = frame or ChatFrame1
+ reg.debugLevel = level
+end
+
+function Dongle:IsDebugEnabled()
+ local reg = lookup[self]
+ assert(3, reg, string.format(L["MUST_CALLFROM_REGISTERED"], "EnableDebug"))
+
+ return reg.debugLevel, reg.debugFrame
+end
+
+local function argsToStrings(a1, ...)
+ if select("#", ...) > 0 then
+ return tostring(a1), argsToStrings(...)
+ else
+ return tostring(a1)
+ end
+end
+
+local function printHelp(obj, method, header, frame, msg, ...)
+ local reg = lookup[obj]
+ assert(4, reg, string.format(L["MUST_CALLFROM_REGISTERED"], method))
+
+ local name = reg.name
+
+ if header then
+ msg = "|cFF33FF99"..name.."|r: "..tostring(msg)
+ end
+
+ if select("#", ...) > 0 then
+ msg = string.join(", ", msg, argsToStrings(...))
+ end
+
+ frame:AddMessage(msg)
+end
+
+local function printFHelp(obj, method, header, frame, msg, ...)
+ local reg = lookup[obj]
+ assert(4, reg, string.format(L["MUST_CALLFROM_REGISTERED"], method))
+
+ local name = reg.name
+ local success,txt
+
+ if header then
+ msg = "|cFF33FF99%s|r: " .. msg
+ success,txt = pcall(string.format, msg, name, ...)
+ else
+ success,txt = pcall(string.format, msg, ...)
+ end
+
+ if success then
+ frame:AddMessage(txt)
+ else
+ error(string.gsub(txt, "'%?'", string.format("'%s'", method)), 3)
+ end
+end
+
+function Dongle:Print(msg, ...)
+ local reg = lookup[self]
+ assert(1, reg, string.format(L["MUST_CALLFROM_REGISTERED"], "Print"))
+ argcheck(msg, 2, "number", "string", "boolean", "table", "function", "thread", "userdata")
+ return printHelp(self, "Print", true, DEFAULT_CHAT_FRAME, msg, ...)
+end
+
+function Dongle:PrintF(msg, ...)
+ local reg = lookup[self]
+ assert(1, reg, string.format(L["MUST_CALLFROM_REGISTERED"], "PrintF"))
+ argcheck(msg, 2, "number", "string", "boolean", "table", "function", "thread", "userdata")
+ return printFHelp(self, "PrintF", true, DEFAULT_CHAT_FRAME, msg, ...)
+end
+
+function Dongle:Echo(msg, ...)
+ local reg = lookup[self]
+ assert(1, reg, string.format(L["MUST_CALLFROM_REGISTERED"], "Echo"))
+ argcheck(msg, 2, "number", "string", "boolean", "table", "function", "thread", "userdata")
+ return printHelp(self, "Echo", false, DEFAULT_CHAT_FRAME, msg, ...)
+end
+
+function Dongle:EchoF(msg, ...)
+ local reg = lookup[self]
+ assert(1, reg, string.format(L["MUST_CALLFROM_REGISTERED"], "EchoF"))
+ argcheck(msg, 2, "number", "string", "boolean", "table", "function", "thread", "userdata")
+ return printFHelp(self, "EchoF", false, DEFAULT_CHAT_FRAME, msg, ...)
+end
+
+function Dongle:Debug(level, ...)
+ local reg = lookup[self]
+ assert(3, reg, string.format(L["MUST_CALLFROM_REGISTERED"], "Debug"))
+ argcheck(level, 2, "number")
+
+ if reg.debugLevel and level <= reg.debugLevel then
+ printHelp(self, "Debug", true, reg.debugFrame, ...)
+ end
+end
+
+function Dongle:DebugF(level, ...)
+ local reg = lookup[self]
+ assert(3, reg, string.format(L["MUST_CALLFROM_REGISTERED"], "DebugF"))
+ argcheck(level, 2, "number")
+
+ if reg.debugLevel and level <= reg.debugLevel then
+ printFHelp(self, "DebugF", true, reg.debugFrame, ...)
+ end
+end
+
+--[[-------------------------------------------------------------------------
+ Database System
+---------------------------------------------------------------------------]]
+
+local dbMethods = {
+ "RegisterDefaults", "SetProfile", "GetProfiles", "DeleteProfile", "CopyProfile",
+ "GetCurrentProfile", "ResetProfile", "ResetDB",
+ "RegisterNamespace",
+}
+
+local function copyTable(src)
+ local dest = {}
+ for k,v in pairs(src) do
+ if type(k) == "table" then
+ k = copyTable(k)
+ end
+ if type(v) == "table" then
+ v = copyTable(v)
+ end
+ dest[k] = v
+ end
+ return dest
+end
+
+local function copyDefaults(dest, src, force)
+ for k,v in pairs(src) do
+ if k == "*" then
+ if type(v) == "table" then
+ -- Values are tables, need some magic here
+ local mt = {
+ __cache = {},
+ __index = function(t,k)
+ local mt = getmetatable(dest)
+ local cache = rawget(mt, "__cache")
+ local tbl = rawget(cache, k)
+ if not tbl then
+ local parent = t
+ local parentkey = k
+ tbl = copyTable(v)
+ rawset(cache, k, tbl)
+ local mt = getmetatable(tbl)
+ if not mt then
+ mt = {}
+ setmetatable(tbl, mt)
+ end
+ local newindex = function(t,k,v)
+ rawset(parent, parentkey, t)
+ rawset(t, k, v)
+ end
+ rawset(mt, "__newindex", newindex)
+ end
+ return tbl
+ end,
+ }
+ setmetatable(dest, mt)
+ -- Now need to set the metatable on any child tables
+ for dkey,dval in pairs(dest) do
+ copyDefaults(dval, v)
+ end
+ else
+ -- Values are not tables, so this is just a simple return
+ local mt = {__index = function() return v end}
+ setmetatable(dest, mt)
+ end
+ elseif type(v) == "table" then
+ if not dest[k] then dest[k] = {} end
+ copyDefaults(dest[k], v, force)
+ else
+ if (dest[k] == nil) or force then
+ dest[k] = v
+ end
+ end
+ end
+end
+
+local function removeDefaults(db, defaults)
+ if not db then return end
+ for k,v in pairs(defaults) do
+ if k == "*" and type(v) == "table" then
+ -- check for any defaults that have been changed
+ local mt = getmetatable(db)
+ local cache = rawget(mt, "__cache")
+
+ for cacheKey,cacheValue in pairs(cache) do
+ removeDefaults(cacheValue, v)
+ if next(cacheValue) ~= nil then
+ -- Something's changed
+ rawset(db, cacheKey, cacheValue)
+ end
+ end
+ -- Now loop through all the actual k,v pairs and remove
+ for key,value in pairs(db) do
+ removeDefaults(value, v)
+ end
+ elseif type(v) == "table" and db[k] then
+ removeDefaults(db[k], v)
+ if not next(db[k]) then
+ db[k] = nil
+ end
+ else
+ if db[k] == defaults[k] then
+ db[k] = nil
+ end
+ end
+ end
+end
+
+local function initSection(db, section, svstore, key, defaults)
+ local sv = rawget(db, "sv")
+
+ local tableCreated
+ if not sv[svstore] then sv[svstore] = {} end
+ if not sv[svstore][key] then
+ sv[svstore][key] = {}
+ tableCreated = true
+ end
+
+ local tbl = sv[svstore][key]
+
+ if defaults then
+ copyDefaults(tbl, defaults)
+ end
+ rawset(db, section, tbl)
+
+ return tableCreated, tbl
+end
+
+local dbmt = {
+ __index = function(t, section)
+ local keys = rawget(t, "keys")
+ local key = keys[section]
+ if key then
+ local defaultTbl = rawget(t, "defaults")
+ local defaults = defaultTbl and defaultTbl[section]
+
+ if section == "profile" then
+ local new = initSection(t, section, "profiles", key, defaults)
+ if new then
+ Dongle:TriggerMessage("DONGLE_PROFILE_CREATED", t,
rawget(t, "parent"), rawget(t, "sv_name"), key)
+ end
+ elseif section == "profiles" then
+ local sv = rawget(t, "sv")
+ if not sv.profiles then sv.profiles = {} end
+ rawset(t, "profiles", sv.profiles)
+ elseif section == "global" then
+ local sv = rawget(t, "sv")
+ if not sv.global then sv.global = {} end
+ if defaults then
+ copyDefaults(sv.global, defaults)
+ end
+ rawset(t, section, sv.global)
+ else
+ initSection(t, section, section, key, defaults)
+ end
+ end
+
+ return rawget(t, section)
+ end
+}
+
+local function initdb(parent, name, defaults, defaultProfile, olddb)
+ -- This allows us to use an arbitrary table as base instead of saved
variable name
+ local sv
+ if type(name) == "string" then
+ sv = getglobal(name)
+ if not sv then
+ sv = {}
+ setglobal(name, sv)
+ end
+ elseif type(name) == "table" then
+ sv = name
+ end
+
+ -- Generate the database keys for each section
+ local char = string.format("%s - %s", UnitName("player"), GetRealmName())
+ local realm = GetRealmName()
+ local class = select(2, UnitClass("player"))
+ local race = select(2, UnitRace("player"))
+ local faction = UnitFactionGroup("player")
+ local factionrealm = string.format("%s - %s", faction, realm)
+
+ -- Make a container for profile keys
+ if not sv.profileKeys then sv.profileKeys = {} end
+
+ -- Try to get the profile selected from the char db
+ local profileKey = sv.profileKeys[char] or defaultProfile or char
+ sv.profileKeys[char] = profileKey
+
+ local keyTbl= {
+ ["char"] = char,
+ ["realm"] = realm,
+ ["class"] = class,
+ ["race"] = race,
+ ["faction"] = faction,
+ ["factionrealm"] = factionrealm,
+ ["global"] = true,
+ ["profile"] = profileKey,
+ ["profiles"] = true, -- Don't create until we need
+ }
+
+ -- If we've been passed an old database, clear it out
+ if olddb then
+ for k,v in pairs(olddb) do olddb[k] = nil end
+ end
+
+ -- Give this database the metatable so it initializes dynamically
+ local db = setmetatable(olddb or {}, dbmt)
+
+ -- Copy methods locally
+ for idx,method in pairs(dbMethods) do
+ db[method] = Dongle[method]
+ end
+
+ -- Set some properties in the object we're returning
+ db.profiles = sv.profiles
+ db.keys = keyTbl
+ db.sv = sv
+ db.sv_name = name
+ db.defaults = defaults
+ db.parent = parent
+
+ databases[db] = true
+
+ return db
+end
+
+function Dongle:InitializeDB(name, defaults, defaultProfile)
+ local reg = lookup[self]
+ assert(3, reg, string.format(L["MUST_CALLFROM_REGISTERED"], "InitializeDB"))
+ argcheck(name, 2, "string", "table")
+ argcheck(defaults, 3, "table", "nil")
+ argcheck(defaultProfile, 4, "string", "nil")
+
+ return initdb(self, name, defaults, defaultProfile)
+end
+
+-- This function operates on a Dongle DB object
+function Dongle.RegisterDefaults(db, defaults)
+ assert(3, databases[db], string.format(L["MUST_CALLFROM_DBOBJECT"], "RegisterDefaults"))
+ assert(3, db.defaults == nil, L["REPLACE_DEFAUTS"])
+ argcheck(defaults, 2, "table")
+
+ for section,key in pairs(db.keys) do
+ if defaults[section] and rawget(db, section) then
+ copyDefaults(db[section], defaults[section])
+ end
+ end
+
+ db.defaults = defaults
+end
+
+function Dongle:ClearDBDefaults()
+ for db in pairs(databases) do
+ local defaults = db.defaults
+ local sv = db.sv
+
+ if db and defaults then
+ for section,key in pairs(db.keys) do
+ if defaults[section] and rawget(db, section) then
+ removeDefaults(db[section], defaults[section])
+ end
+ end
+
+ for section,key in pairs(db.keys) do
+ local tbl = rawget(db, section)
+ if tbl and not next(tbl) then
+ if sv[section] then
+ if type(key) == "string" then
+ sv[section][key] = nil
+ else
+ sv[section] = nil
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+function Dongle.SetProfile(db, name)
+ assert(3, databases[db], string.format(L["MUST_CALLFROM_DBOBJECT"], "SetProfile"))
+ argcheck(name, 2, "string")
+
+ local old = db.profile
+ local defaults = db.defaults and db.defaults.profile
+
+ if defaults then
+ -- Remove the defaults from the old profile
+ removeDefaults(old, defaults)
+ end
+
+ db.profile = nil
+ db.keys["profile"] = name
+ db.sv.profileKeys[db.keys.char] = name
+
+ Dongle:TriggerMessage("DONGLE_PROFILE_CHANGED", db, db.parent,
db.sv_name, db.keys.profile)
+end
+
+function Dongle.GetProfiles(db, tbl)
+ assert(3, databases[db], string.format(L["MUST_CALLFROM_DBOBJECT"], "GetProfiles"))
+ argcheck(t, 2, "table", "nil")
+
+ -- Clear the container table
+ if tbl then
+ for k,v in pairs(tbl) do tbl[k] = nil end
+ else
+ tbl = {}
+ end
+
+ local i = 0
+ for profileKey in pairs(db.profiles) do
+ i = i + 1
+ tbl[i] = profileKey
+ end
+
+ -- Add the current profile, if it hasn't been created yet
+ if rawget(db, "profile") == nil then
+ i = i + 1
+ tbl[i] = db.keys.profile
+ end
+
+ return tbl, i
+end
+
+function Dongle.GetCurrentProfile(db)
+ assert(3, databases[db], string.format(L["MUST_CALLFROM_DBOBJECT"], "GetCurrentProfile"))
+ return db.keys.profile
+end
+
+function Dongle.DeleteProfile(db, name)
+ assert(3, databases[db], string.format(L["MUST_CALLFROM_DBOBJECT"], "DeleteProfile"))
+ argcheck(name, 2, "string")
+
+ if db.keys.profile == name then
+ error(L["CANNOT_DELETE_ACTIVE_PROFILE"], 2)
+ end
+
+ assert(type(db.sv.profiles[name]) == "table", L["DELETE_NONEXISTANT_PROFILE"])
+
+ db.sv.profiles[name] = nil
+ Dongle:TriggerMessage("DONGLE_PROFILE_DELETED", db, db.parent,
db.sv_name, name)
+end
+
+function Dongle.CopyProfile(db, name)
+ assert(3, databases[db], string.format(L["MUST_CALLFROM_DBOBJECT"], "CopyProfile"))
+ argcheck(name, 2, "string")
+
+ assert(3, db.keys.profile ~= name, L["SAME_SOURCE_DEST"])
+ assert(3, type(db.sv.profiles[name]) == "table",
string.format(L["PROFILE_DOES_NOT_EXIST"], name))
+
+ local profile = db.profile
+ local source = db.sv.profiles[name]
+
+ copyDefaults(profile, source, true)
+ Dongle:TriggerMessage("DONGLE_PROFILE_COPIED", db, db.parent,
db.sv_name, name, db.keys.profile)
+end
+
+function Dongle.ResetProfile(db)
+ assert(3, databases[db], string.format(L["MUST_CALLFROM_DBOBJECT"], "ResetProfile"))
+
+ local profile = db.profile
+
+ for k,v in pairs(profile) do
+ profile[k] = nil
+ end
+
+ local defaults = db.defaults and db.defaults.profile
+ if defaults then
+ copyDefaults(profile, defaults)
+ end
+ Dongle:TriggerMessage("DONGLE_PROFILE_RESET", db, db.parent,
db.sv_name, db.keys.profile)
+end
+
+
+function Dongle.ResetDB(db, defaultProfile)
+ assert(3, databases[db], string.format(L["MUST_CALLFROM_DBOBJECT"], "ResetDB"))
+ argcheck(defaultProfile, 2, "nil", "string")
+
+ local sv = db.sv
+ for k,v in pairs(sv) do
+ sv[k] = nil
+ end
+
+ local parent = db.parent
+
+ initdb(parent, db.sv_name, db.defaults, defaultProfile, db)
+ Dongle:TriggerMessage("DONGLE_DATABASE_RESET", db, parent,
db.sv_name, db.keys.profile)
+ Dongle:TriggerMessage("DONGLE_PROFILE_CHANGED", db, db.parent,
db.sv_name, db.keys.profile)
+ return db
+end
+
+function Dongle.RegisterNamespace(db, name, defaults)
+ assert(3, databases[db], string.format(L["MUST_CALLFROM_DBOBJECT"], "RegisterNamespace"))
+ argcheck(name, 2, "string")
+ argcheck(defaults, 3, "nil", "table")
+
+ local sv = db.sv
+ if not sv.namespaces then sv.namespaces = {} end
+ if not sv.namespaces[name] then
+ sv.namespaces[name] = {}
+ end
+
+ local newDB = initdb(db, sv.namespaces[name], defaults, db.keys.profile)
+ -- Remove the :SetProfile method from newDB
+ newDB.SetProfile = nil
+
+ if not db.children then db.children = {} end
+ table.insert(db.children, newDB)
+ return newDB
+end
+
+--[[-------------------------------------------------------------------------
+ Slash Command System
+---------------------------------------------------------------------------]]
+
+local slashCmdMethods = {
+ "InjectDBCommands",
+ "RegisterSlashHandler",
+ "PrintUsage",
+}
+
+local function OnSlashCommand(cmd, cmd_line)
+ if cmd.patterns then
+ for idx,tbl in pairs(cmd.patterns) do
+ local pattern = tbl.pattern
+ if string.match(cmd_line, pattern) then
+ local handler = tbl.handler
+ if type(tbl.handler) == "string" then
+ local obj
+ -- Look in the command object before we look at the parent object
+ if cmd[handler] then obj = cmd end
+ if cmd.parent[handler] then obj = cmd.parent end
+ if obj then
+ obj[handler](obj, string.match(cmd_line, pattern))
+ end
+ else
+ handler(string.match(cmd_line, pattern))
+ end
+ return
+ end
+ end
+ end
+ cmd:PrintUsage()
+end
+
+function Dongle:InitializeSlashCommand(desc, name, ...)
+ local reg = lookup[self]
+ assert(3, reg, string.format(L["MUST_CALLFROM_REGISTERED"], "InitializeSlashCommand"))
+ argcheck(desc, 2, "string")
+ argcheck(name, 3, "string")
+ argcheck(select(1, ...), 4, "string")
+ for i = 2,select("#", ...) do
+ argcheck(select(i, ...), i+2, "string")
+ end
+
+ local cmd = {}
+ cmd.desc = desc
+ cmd.name = name
+ cmd.parent = self
+ cmd.slashes = { ... }
+ for idx,method in pairs(slashCmdMethods) do
+ cmd[method] = Dongle[method]
+ end
+
+ local genv = getfenv(0)
+
+ for i = 1,select("#", ...) do
+ genv["SLASH_"..name..tostring(i)] = "/"..select(i, ...)
+ end
+
+ genv.SlashCmdList[name] = function(...) OnSlashCommand(cmd, ...) end
+
+ commands[cmd] = true
+
+ return cmd
+end
+
+function Dongle.RegisterSlashHandler(cmd, desc, pattern, handler)
+ assert(3, commands[cmd], string.format(L["MUST_CALLFROM_SLASH"], "RegisterSlashHandler"))
+
+ argcheck(desc, 2, "string")
+ argcheck(pattern, 3, "string")
+ argcheck(handler, 4, "function", "string")
+
+ if not cmd.patterns then
+ cmd.patterns = {}
+ end
+
+ table.insert(cmd.patterns, {
+ ["desc"] = desc,
+ ["handler"] = handler,
+ ["pattern"] = pattern,
+ })
+end
+
+function Dongle.PrintUsage(cmd)
+ assert(3, commands[cmd], string.format(L["MUST_CALLFROM_SLASH"], "PrintUsage"))
+ local parent = cmd.parent
+
+ parent:Echo(cmd.desc.."\n".."/"..table.concat(cmd.slashes, ", /")..":\n")
+ if cmd.patterns then
+ for idx,tbl in ipairs(cmd.patterns) do
+ parent:Echo(" - " .. tbl.desc)
+ end
+ end
+end
+
+local dbcommands = {
+ ["copy"] = {
+ L["DBSLASH_PROFILE_COPY_DESC"],
+ L["DBSLASH_PROFILE_COPY_PATTERN"],
+ "CopyProfile",
+ },
+ ["delete"] = {
+ L["DBSLASH_PROFILE_DELETE_DESC"],
+ L["DBSLASH_PROFILE_DELETE_PATTERN"],
+ "DeleteProfile",
+ },
+ ["list"] = {
+ L["DBSLASH_PROFILE_LIST_DESC"],
+ L["DBSLASH_PROFILE_LIST_PATTERN"],
+ },
+ ["reset"] = {
+ L["DBSLASH_PROFILE_RESET_DESC"],
+ L["DBSLASH_PROFILE_RESET_PATTERN"],
+ "ResetProfile",
+ },
+ ["set"] = {
+ L["DBSLASH_PROFILE_SET_DESC"],
+ L["DBSLASH_PROFILE_SET_PATTERN"],
+ "SetProfile",
+ },
+}
+
+function Dongle.InjectDBCommands(cmd, db, ...)
+ assert(3, commands[cmd], string.format(L["MUST_CALLFROM_SLASH"], "InjectDBCommands"))
+ assert(3, databases[db], string.format(L["BAD_ARGUMENT_DB"], 2, "InjectDBCommands"))
+ local argc = select("#", ...)
+ assert(3, argc > 0, L["INJECTDB_USAGE"])
+
+ for i=1,argc do
+ local cmdname = string.lower(select(i, ...))
+ local entry = dbcommands[cmdname]
+ assert(entry, L["INJECTDB_USAGE"])
+ local func = entry[3]
+
+ local handler
+ if cmdname == "list" then
+ handler = function(...)
+ local profiles = db:GetProfiles()
+ db.parent:Print(L["DBSLASH_PROFILE_LIST_OUT"] .. "\n" ..
strjoin("\n", unpack(profiles)))
+ end
+ else
+ handler = function(...) db[entry[3]](db, ...) end
+ end
+
+ cmd:RegisterSlashHandler(entry[1], entry[2], handler)
+ end
+end
+
+--[[-------------------------------------------------------------------------
+ Internal Message/Event Handlers
+---------------------------------------------------------------------------]]
+
+local function PLAYER_LOGOUT(event)
+ Dongle:ClearDBDefaults()
+ for k,v in pairs(registry) do
+ local obj = v.obj
+ if type(obj["Disable"]) == "function" then
+ safecall(obj["Disable"], obj)
+ end
+ end
+end
+
+local PLAYER_LOGIN
+do
+ local lockPlayerLogin = false
+
+ function PLAYER_LOGIN()
+ if lockPlayerLogin then return end
+
+ lockPlayerLogin = true
+
+ local obj = table.remove(loadorder, 1)
+ while obj do
+ if type(obj.Enable) == "function" then
+ safecall(obj.Enable, obj)
+ end
+ obj = table.remove(loadorder, 1)
+ end
+
+ lockPlayerLogin = false
+ end
+end
+
+local function ADDON_LOADED(event, ...)
+ local obj = table.remove(loadqueue, 1)
+ while obj do
+ table.insert(loadorder, obj)
+
+ if type(obj.Initialize) == "function" then
+ safecall(obj.Initialize, obj)
+ end
+
+ obj = table.remove(loadqueue, 1)
+ end
+
+ if IsLoggedIn() then
+ PLAYER_LOGIN()
+ end
+end
+
+local function DONGLE_PROFILE_CHANGED(msg, db, parent, sv_name, profileKey)
+ local children = db.children
+ if children then
+ for i,namespace in ipairs(children) do
+ local old = namespace.profile
+ local defaults = namespace.defaults and namespace.defaults.profile
+
+ if defaults then
+ -- Remove the defaults from the old profile
+ removeDefaults(old, defaults)
+ end
+
+ namespace.profile = nil
+ namespace.keys["profile"] = profileKey
+ end
+ end
+end
+
+--[[-------------------------------------------------------------------------
+ DongleStub required functions and registration
+---------------------------------------------------------------------------]]
+
+function Dongle:GetVersion() return major,minor end
+
+local function Activate(self, old)
+ if old then
+ registry = old.registry or registry
+ lookup = old.lookup or lookup
+ loadqueue = old.loadqueue or loadqueue
+ loadorder = old.loadorder or loadorder
+ events = old.events or events
+ databases = old.databases or databases
+ commands = old.commands or commands
+ messages = old.messages or messages
+ frame = old.frame or CreateFrame("Frame")
+ timers = old.timers or timers
+ heap = old.heap or heap
+ else
+ frame = CreateFrame("Frame")
+ local reg = {obj = self, name = "Dongle"}
+ registry[major] = reg
+ lookup[self] = reg
+ lookup[major] = reg
+ end
+
+ self.registry = registry
+ self.lookup = lookup
+ self.loadqueue = loadqueue
+ self.loadorder = loadorder
+ self.events = events
+ self.databases = databases
+ self.commands = commands
+ self.messages = messages
+ self.frame = frame
+ self.timers = timers
+ self.heap = heap
+
+ frame:SetScript("OnEvent", OnEvent)
+ frame:SetScript("OnUpdate", OnUpdate)
+
+ -- Lets ensure the lookup table has our entry
+ -- This fixes an issue with upgrades
+ lookup[self] = lookup[major]
+
+ -- Register for events using Dongle itself
+ self:RegisterEvent("ADDON_LOADED", ADDON_LOADED)
+ self:RegisterEvent("PLAYER_LOGIN", PLAYER_LOGIN)
+ self:RegisterEvent("PLAYER_LOGOUT", PLAYER_LOGOUT)
+ self:RegisterMessage("DONGLE_PROFILE_CHANGED", DONGLE_PROFILE_CHANGED)
+
+ -- Convert all the modules handles
+ for name,obj in pairs(registry) do
+ for k,v in ipairs(methods) do
+ obj[k] = self[v]
+ end
+ end
+
+ -- Convert all database methods
+ for db in pairs(databases) do
+ for idx,method in ipairs(dbMethods) do
+ db[method] = self[method]
+ end
+ end
+
+ -- Convert all slash command methods
+ for cmd in pairs(commands) do
+ for idx,method in ipairs(slashCmdMethods) do
+ cmd[method] = self[method]
+ end
+ end
+end
+
+Dongle = DongleStub:Register(Dongle, Activate)
Added: tags/Dongle-1.1-r649/Dongle.toc
==============================================================================
--- (empty file)
+++ tags/Dongle-1.1-r649/Dongle.toc Mon Nov 12 12:07:06 2007
@@ -0,0 +1,9 @@
+## Interface: 20003
+## Title: Dongle
+## Version: Dongle-1.0-RC1
+## Author: Dongle Development Team
+## Notes: Minimal addon framework
+## LoadOnDemand: 1
+
+DongleStub.lua
+Dongle.lua
Added: tags/Dongle-1.1-r649/DongleUnitTests/DongleUnitTests.toc
==============================================================================
--- (empty file)
+++ tags/Dongle-1.1-r649/DongleUnitTests/DongleUnitTests.toc Mon Nov 12
12:07:06 2007
@@ -0,0 +1,17 @@
+## Interface: 20003
+## Title: DongleUnitTests
+## Author: Dongle Development Team
+## Notes: Unit tests for Dongle
+## OptionalDeps: Dongle
+
+UnitTests.lua
+Tests\01DongleStub.lua
+Tests\02DongleCore.lua
+Tests\03DongleModules.lua
+Tests\04DongleMessage.lua
+Tests\05DonglePrint.lua
+Tests\06DongleDB.lua
+Tests\07DongleSlash.lua
+Tests\08DongleError.lua
+Tests\09DongleTimer.lua
+Tests\99Completion.lua
\ No newline at end of file
Added: tags/Dongle-1.1-r649/DongleUnitTests/MONACO.TTF
==============================================================================
Binary file. No diff available.
Added: tags/Dongle-1.1-r649/DongleUnitTests/Tests/01DongleStub.lua
==============================================================================
--- (empty file)
+++ tags/Dongle-1.1-r649/DongleUnitTests/Tests/01DongleStub.lua Mon Nov
12 12:07:06 2007
@@ -0,0 +1,138 @@
+local test = UnitTest:New("01DongleStub")
+
+function test:donglestub_register()
+ local lib = {}
+ function lib:GetVersion()
+ return "AlphaLib", 1
+ end
+
+ assert_fails(function() DongleStub("AlphaLib") end, "Cannot find a
library with name 'AlphaLib'")
+ DongleStub:Register(lib)
+ assert(DongleStub("AlphaLib") == lib)
+
+ local lib = {}
+ assert_fails(function() DongleStub:Register(lib) end, "Attempt to
register a library with DongleStub that does not have a 'GetVersion' method.")
+ function lib:GetVersion()
+ return 1
+ end
+ assert_fails(function() DongleStub:Register(lib) end, "Attempt to
register a library with DongleStub that does not have a proper major version.")
+ function lib:GetVersion()
+ return "MajorVersion"
+ end
+ assert_fails(function() DongleStub:Register(lib) end, "Attempt to
register a library with DongleStub that does not have a proper minor version.")
+end
+
+function test:donglestub_newversion()
+ local lib = {}
+ function lib:GetVersion()
+ return "BetaLib",1
+ end
+
+ assert(DongleStub:IsNewerVersion(lib:GetVersion()))
+ lib = DongleStub:Register(lib)
+ assert(DongleStub("BetaLib") == lib)
+ assert(select(2,DongleStub("BetaLib"):GetVersion()) == 1)
+
+ local lib2 = {}
+ function lib2:GetVersion()
+ return "BetaLib",0
+ end
+
+ assert(not DongleStub:IsNewerVersion(lib2:GetVersion()))
+ lib2 = DongleStub:Register(lib2)
+ assert(DongleStub("BetaLib") == lib)
+ assert(select(2,DongleStub("BetaLib"):GetVersion()) == 1)
+
+ local lib3 = {}
+ function lib3:GetVersion()
+ return "BetaLib",2
+ end
+
+ assert(DongleStub:IsNewerVersion(lib3:GetVersion()))
+ lib3 = DongleStub:Register(lib3)
+ assert(DongleStub("BetaLib") == lib3)
+ assert(select(2,DongleStub("BetaLib"):GetVersion()) == 2)
+end
+
+function test:donglestub_activate()
+ local lib = {}
+ function lib:GetVersion()
+ return "GammaLib", 1
+ end
+
+ local function activate(new, old)
+ assert(new == lib)
+ assert(old == nil)
+ lib.activate = true
+ end
+
+ assert(DongleStub:IsNewerVersion(lib:GetVersion()))
+ lib = DongleStub:Register(lib, activate)
+
+ local lib2 = {}
+ function lib2:GetVersion()
+ return "GammaLib", 2
+ end
+
+ local function activate2(new, old)
+ assert(new == lib2)
+ assert(old == lib)
+ lib2.activate = true
+ end
+
+ assert(DongleStub:IsNewerVersion(lib2:GetVersion()))
+ lib2 = DongleStub:Register(lib2, activate2)
+
+ local lib3 = {}
+ function lib3:GetVersion()
+ return "GammaLib", 3
+ end
+
+ local function activate3(new, old)
+ assert(new == lib3)
+ assert(old == lib2)
+ lib3.activate = true
+ end
+
+ assert(DongleStub:IsNewerVersion(lib3:GetVersion()))
+ lib3 = DongleStub:Register(lib3, activate3)
+ assert(lib.activate)
+ assert(lib2.activate)
+ assert(lib3.activate)
+end
+
+function test:donglestub_deactivate()
+ local lib = {}
+ local lib2 = {}
+
+ function lib:GetVersion()
+ return "DeltaLib", 1
+ end
+
+ local olddeact
+ local function deactivate(old, new)
+ assert(old == lib)
+ assert(new == lib2)
+ olddeact = true
+ end
+
+ lib = DongleStub:Register(lib, activate, deactivate)
+
+ function lib2:GetVersion()
+ return "DeltaLib", 2
+ end
+
+ local newdeact
+ local function deactivate2(new, old)
+ assert(new == lib2)
+ assert(old == lib)
+ newdeact = true
+ end
+
+ assert(DongleStub:IsNewerVersion(lib2:GetVersion()))
+ lib2 = DongleStub:Register(lib2, activate2, deactivate2)
+ assert(olddeact == true)
+ assert(newdeact == nil)
+end
+
+test:Run()
\ No newline at end of file
Added: tags/Dongle-1.1-r649/DongleUnitTests/Tests/02DongleCore.lua
==============================================================================
--- (empty file)
+++ tags/Dongle-1.1-r649/DongleUnitTests/Tests/02DongleCore.lua Mon Nov
12 12:07:06 2007
@@ -0,0 +1,82 @@
+local test = UnitTest:New("02DongleCore")
+local Dongle = DongleStub("Dongle-1.0")
+
+function test:dongle_new()
+ assert_fails(function() Dongle:New(1) end, argerror(2))
+ assert_fails(function() Dongle:New(nil, 1) end, argerror(2))
+ local obj,name = Dongle:New("Alpha")
+ assert(type(obj) == "table")
+ assert(name == "Alpha")
+
+ assert_fails(function() Dongle:New("Alpha") end, "A Dongle with the
name 'Alpha' is already registered.")
+
+ local tbl = {}
+ local obj,name = Dongle:New("Beta",tbl)
+ assert(obj == tbl)
+ assert(name == "Beta")
+end
+
+function test:dongle_init_load_order()
+ local zeta = Dongle:New("Zeta")
+ local eta = Dongle:New("Eta")
+
+ local zetaalpha = zeta:NewModule("Zeta-Alpha")
+ local etaalpha = eta:NewModule("Eta-Alpha")
+
+ local order = {}
+ local function init(self)
+ table.insert(order, self)
+ end
+
+ zeta.Initialize = init
+ eta.Initialize = init
+ zetaalpha.Initialize = init
+ etaalpha.Initialize = init
+
+ local OnEvent = Dongle.frame:GetScript("OnEvent")
+
+ OnEvent(Dongle.frame, "ADDON_LOADED")
+ assert(order[1] == zeta)
+ assert(order[2] == eta)
+ assert(order[3] == zetaalpha)
+ assert(order[4] == etaalpha)
+end
+
+function test:dongle_enable_load_order()
+ local theta = Dongle:New("Theta")
+ local iota = Dongle:New("Iota")
+
+ local thetaalpha= theta:NewModule("ThetaAlpha")
+ local iotaalpha = iota:NewModule("IotaAlpha")
+
+ local order = {}
+ local function enable(self)
+ table.insert(order, self)
+ end
+
+ theta.Enable = enable
+ iota.Enable = enable
+ thetaalpha.Enable = enable
+ iotaalpha.Enable = enable
+
+ local OnEvent = Dongle.frame:GetScript("OnEvent")
+
+ OnEvent(Dongle.frame, "ADDON_LOADED")
+ OnEvent(Dongle.frame, "PLAYER_LOGIN")
+ assert(order[1] == theta)
+ assert(order[2] == iota)
+ assert(order[3] == thetaalpha)
+ assert(order[4] == iotaalpha)
+end
+
+function test:dongle_special_events()
+ local j = Dongle:New("special_events")
+ local err = "You cannot register for the '%s' event. Use the '%s'
method instead."
+
+ assert_fails(function() j:RegisterEvent("PLAYER_LOGIN") end,
+ string.format(err, "PLAYER_LOGIN", "Enable"))
+ assert_fails(function() j:RegisterEvent("PLAYER_LOGOUT") end,
+ string.format(err, "PLAYER_LOGOUT", "Disable"))
+end
+
+test:Run()
\ No newline at end of file
Added: tags/Dongle-1.1-r649/DongleUnitTests/Tests/03DongleModules.lua
==============================================================================
--- (empty file)
+++ tags/Dongle-1.1-r649/DongleUnitTests/Tests/03DongleModules.lua Mon
Nov 12 12:07:06 2007
@@ -0,0 +1,52 @@
+local test = UnitTest:New("03DongleModules")
+local Dongle = DongleStub("Dongle-1.0")
+
+function test:dongle_new_module()
+ assert_fails(function() Dongle.NewModule({}) end, "You must
call 'NewModule' from a registered Dongle.")
+ assert_fails(function() Dongle:NewModule(1) end, argerror(2))
+ assert_fails(function() Dongle:NewModule(nil, 1) end, argerror(2))
+ local obj,name = Dongle:New("Gamma")
+ local obj,name = obj:NewModule("Gamma-Alpha")
+ assert(type(obj) == "table")
+ assert(name == "Gamma-Alpha")
+end
+
+function test:dongle_has_module()
+ assert_fails(function() Dongle.HasModule({}) end, "You must
call 'HasModule' from a registered Dongle.")
+ assert_fails(function() Dongle:HasModule(1) end, argerror(2))
+ local obj,name = Dongle:New("Delta")
+ Dongle:New("Delta-Gamma")
+ assert(not obj:HasModule("Delta-Alpha"))
+
+ local module,modulename = obj:NewModule("Delta-Alpha")
+ assert(obj:HasModule("Delta-Alpha"))
+ assert(not obj:HasModule("Delta-Beta"))
+ assert(not obj:HasModule("Delta-Gamma"))
+end
+
+function test:dongle_iterate_modules()
+ assert_fails(function() Dongle.IterateModules({}) end, "You must
call 'IterateModules' from a registered Dongle.")
+ assert(type(Dongle:IterateModules()) == "function")
+ local obj,name = Dongle:New("Epsilon")
+ local i = 0
+ for k in obj:IterateModules() do
+ i = i + 1
+ end
+ assert(i == 0)
+ local epsilongamma = obj:NewModule("Epsilon-Gamma")
+ local epsilondelta = obj:NewModule("Epsilon-Delta")
+ local modtbl = {}
+ for name,module in obj:IterateModules() do
+ modtbl[name] = module
+ end
+ local count = 0
+ for name,module in obj:IterateModules() do
+ count = count + 1
+ end
+
+ assert(modtbl["Epsilon-Delta"] == epsilondelta)
+ assert(modtbl["Epsilon-Gamma"] == epsilongamma)
+ assert(count == 2)
+end
+
+test:Run()
\ No newline at end of file
Added: tags/Dongle-1.1-r649/DongleUnitTests/Tests/04DongleMessage.lua
==============================================================================
--- (empty file)
+++ tags/Dongle-1.1-r649/DongleUnitTests/Tests/04DongleMessage.lua Mon
Nov 12 12:07:06 2007
@@ -0,0 +1,77 @@
+local test = UnitTest:New("04DongleMessage")
+local Dongle = DongleStub("Dongle-1.0")
+
+function test:dongle_trigger_message()
+ assert_fails(function() Dongle:TriggerMessage(1) end, argerror(2))
+ local kappa = Dongle:New("Kappa")
+ local lambda = Dongle:New("Lambda")
+
+ local kappaalpha = kappa:NewModule("Kappa-Alpha")
+ local lambdaalpha = lambda:NewModule("Lambda-Alpha")
+
+ local triggered = {}
+ local function onevent(self, event)
+ triggered[self] = true
+ end
+
+ kappa:RegisterMessage("DONGLE_TEST_MESSAGE")
+ kappa.DONGLE_TEST_MESSAGE = onevent
+ lambdaalpha:RegisterMessage("DONGLE_TEST_MESSAGE")
+ lambdaalpha.DONGLE_TEST_MESSAGE = onevent
+
+ Dongle:TriggerMessage("DONGLE_TEST_MESSAGE")
+ assert(triggered[kappa])
+ assert(not triggered[lambda])
+ assert(not triggered[kappaalpha])
+ assert(triggered[lambdaalpha])
+end
+
+function test:dongle_register_message()
+ assert_fails(function() Dongle:RegisterMessage(1) end, argerror(2))
+ assert_fails(function() Dongle:RegisterMessage("hello", 1) end, argerror(3))
+ local mu = Dongle:New("Mu")
+ mu:RegisterMessage("DONGLE_TEST_MESSAGE")
+end
+
+function test:dongle_unregister_message()
+ local nu = Dongle:New("Nu")
+ assert_fails(function() Dongle:UnregisterMessage(1) end, argerror(2))
+ nu:RegisterMessage("DONGLE_TEST_MESSAGE")
+ nu:UnregisterMessage("DONGLE_TEST_MESSAGE")
+end
+
+function test:dongle_ismessageregistered()
+ local dongle = Dongle:New("MessageRegistered")
+ assert_fails(function() Dongle:IsMessageRegistered(1) end, argerror(2))
+ assert_fails(function() Dongle:IsMessageRegistered(nil) end, argerror(2))
+ dongle:RegisterMessage("DONGLE_TEST_MESSAGE")
+ assert(dongle:IsMessageRegistered("DONGLE_TEST_MESSAGE"))
+ dongle:UnregisterMessage("DONGLE_TEST_MESSAGE")
+ assert(not dongle:IsMessageRegistered("DONGLE_TEST_MESSAGE"))
+end
+
+function test:dongle_unregisterallevents()
+ local xi = Dongle:New("Xi")
+ xi:RegisterMessage("DONGLE_TEST1")
+ xi:RegisterMessage("DONGLE_TEST2")
+ local used = {}
+
+ local function event(self, event)
+ used[event] = true
+ end
+
+ xi.DONGLE_TEST1 = event
+ xi.DONGLE_TEST2 = event
+ xi.DONGLE_TEST3 = event
+
+ xi:UnregisterAllMessages()
+ xi:RegisterMessage("DONGLE_TEST3")
+ Dongle:TriggerMessage("DONGLE_TEST1")
+ Dongle:TriggerMessage("DONGLE_TEST2")
+ Dongle:TriggerMessage("DONGLE_TEST3")
+ assert(not used.DONGLE_TEST1)
+ assert(not used.DONGLE_TEST2)
+ assert(used.DONGLE_TEST3)
+end
+
+test:Run()
\ No newline at end of file
Added: tags/Dongle-1.1-r649/DongleUnitTests/Tests/05DonglePrint.lua
==============================================================================
--- (empty file)
+++ tags/Dongle-1.1-r649/DongleUnitTests/Tests/05DonglePrint.lua Mon
Nov 12 12:07:06 2007
@@ -0,0 +1,82 @@
+local test = UnitTest:New("05DonglePrint")
+local Dongle = DongleStub("Dongle-1.0")
+
+function test:dongle_enable_debug()
+ assert_fails(function() Dongle.EnableDebug({}) end, "You must
call 'EnableDebug' from a registered Dongle.")
+ local pi = Dongle:New("Pi")
+ assert_fails(function() Dongle:EnableDebug(true) end, argerror(2))
+end
+
+function test:dongle_print()
+ assert_fails(function() Dongle.Print({}) end, "You must call 'Print'
from a registered Dongle.")
+ assert_fails(function() Dongle.PrintF({}) end, "You must
call 'PrintF' from a registered Dongle.")
+ local rho = Dongle:New("Rho")
+
+ local cf = rawget(getmetatable(getfenv(0)).__index, "ChatFrame1")
+ cf.old = cf.AddMessage
+ local last
+ cf.AddMessage = function(self, msg, ...)
+ last = msg
+ --cf.old(cf, msg, ...)
+ end
+
+ rho:Print("This is a test print")
+ assert(last == "|cFF33FF99Rho|r: This is a test print")
+ rho:Print("This is a test print", "It has many args")
+ assert(last == "|cFF33FF99Rho|r: This is a test print, It has many args")
+ assert_fails(function() rho:PrintF("invalid format %d", "test") end, argerror(3), "'PrintF'")
+ assert_fails(function() rho:PrintF("invalid format %d") end, argerror(3), "'PrintF'")
+
+ cf.AddMessage = nil
+end
+
+function test:dongle_echo()
+ assert_fails(function() Dongle.Echo({}) end, "You must call 'Echo'
from a registered Dongle.")
+ assert_fails(function() Dongle.EchoF({}) end, "You must call 'EchoF'
from a registered Dongle.")
+ local rho = Dongle:New("EchoTestRho")
+
+ local cf = rawget(getmetatable(getfenv(0)).__index, "ChatFrame1")
+ cf.old = cf.AddMessage
+ local last
+ cf.AddMessage = function(self, msg, ...)
+ last = msg
+ --cf.old(cf, msg, ...)
+ end
+
+ rho:Echo("This is a test echo")
+ assert(last == "This is a test echo")
+ rho:Echo("This is a test echo", "It has many args")
+ assert(last == "This is a test echo, It has many args")
+ assert_fails(function() rho:EchoF("invalid format %d", "test") end, argerror(2), "'EchoF'")
+ assert_fails(function() rho:EchoF("invalid format %d") end, argerror(2), "'EchoF'")
+
+ cf.AddMessage = nil
+end
+
+function test:dongle_debug()
+ assert_fails(function() Dongle.Debug({}) end, "You must call 'Debug'
from a registered Dongle.")
+ local sigma = Dongle:New("Sigma")
+ assert_fails(function() sigma:Debug("Test") end, argerror(2))
+ assert_fails(function() sigma:DebugF("invalid format %d", "test")
end, argerror(2))
+
+ local cf = rawget(getmetatable(getfenv(0)).__index, "ChatFrame1")
+ cf.old = cf.AddMessage
+ local last
+ cf.AddMessage = function(self, msg, ...)
+ last = msg
+ --cf.old(cf, msg, ...)
+ end
+
+ sigma:Debug(1, "This is a test debug")
+ assert(last == nil)
+ sigma:EnableDebug(1)
+ sigma:Debug(2, "This should not be visible")
+ assert(last == nil)
+ sigma:Debug(1, "This should go through")
+ assert(last == "|cFF33FF99Sigma|r: This should go through")
+ sigma:Debug(0, "This is a higher debug")
+ assert(last == "|cFF33FF99Sigma|r: This is a higher debug")
+ cf.AddMessage = nil
+end
+
+test:Run()
\ No newline at end of file
Added: tags/Dongle-1.1-r649/DongleUnitTests/Tests/06DongleDB.lua
==============================================================================
--- (empty file)
+++ tags/Dongle-1.1-r649/DongleUnitTests/Tests/06DongleDB.lua Mon Nov
12 12:07:06 2007
@@ -0,0 +1,343 @@
+local test = UnitTest:New("06DongleDB")
+local Dongle = DongleStub("Dongle-1.0")
+
+function test:dongle_initialize_db()
+ assert_fails(function() Dongle.InitializeDB({}) end, "You must
call 'InitializeDB' from a registered Dongle.")
+
+ local tau = Dongle:New("Tau")
+ assert_fails(function() tau:InitializeDB(1) end, argerror(2))
+ assert_fails(function() tau:InitializeDB("test", 1) end, argerror(3))
+ assert_fails(function() tau:InitializeDB("test", nil, 1) end, argerror(4))
+
+ local db = tau:InitializeDB("TauDB")
+ assert(type(db) == "table")
+ assert(rawget(db, "faction") == nil)
+ assert(rawget(db, "realm") == nil)
+ assert(rawget(db, "class") == nil)
+ assert(rawget(db, "global") == nil)
+ assert(rawget(db, "profile") == nil)
+
+ assert(db:GetCurrentProfile() == ("%s
- %s"):format(UnitName("player"), GetRealmName()))
+
+ local sv = {}
+ local db = tau:InitializeDB(sv)
+ assert(type(db) == "table")
+ assert(db.sv_name == sv)
+end
+
+function test:dongle_register_db_defaults()
+ assert_fails(function() Dongle.RegisterDefaults({}) end, "You must
call 'RegisterDefaults' from a Dongle database object.")
+
+ local upsilon = Dongle:New("Upsilon")
+ local db = upsilon:InitializeDB("UpsilonDB")
+
+ assert_fails(function() db:RegisterDefaults(1) end, argerror(2))
+
+ local sv = UpsilonDB
+ local defaults = {
+ char = {
+ Alpha = true,
+ Eta = {
+ Iota = true
+ },
+ },
+ faction = {
+ Beta = true,
+ },
+ realm = {
+ Gamma = true,
+ },
+ class = {
+ Delta = true,
+ },
+ global = {
+ Epsilon = true,
+ },
+ profile = {
+ Zeta = true,
+ },
+ }
+
+ db:RegisterDefaults(defaults)
+ assert(db.char.Alpha == true)
+ assert(db.faction.Beta == true)
+ assert(db.realm.Gamma == true)
+ assert(db.class.Delta == true)
+ assert(db.global.Epsilon == true)
+ assert(db.profile.Zeta == true)
+ assert(db.char.Eta.Iota == true)
+
+ local upsilon = Dongle:New("Upsilon2")
+ local db = upsilon:InitializeDB("UpsilonDB2", nil, "Some Profile")
+ assert(db.keys.profile == "Some Profile")
+end
+
+function test:dongle_clear_db_defaults()
+ local phi = Dongle:New("Phi")
+ local chi = Dongle:New("Chi")
+
+ local defaults = {
+ profile = {
+ Alpha = true,
+ Beta = {
+ Gamma = true,
+ },
+ }
+ }
+
+ local phidb = phi:InitializeDB("PhiDB", defaults)
+ local chidb = chi:InitializeDB("ChiDB", defaults)
+
+ phidb.profile.Alpha = false
+ chidb.profile.Beta.Gamma = false
+
+ Dongle:ClearDBDefaults()
+ assert(phidb.profile.Alpha == false)
+ assert(not phidb.profile.Beta)
+ assert(chidb.profile.Beta.Gamma == false)
+ assert(not chidb.profile.Alpha)
+end
+
+function test:dongle_set_profile()
+ assert_fails(function() Dongle.SetProfile("test") end, "You must
call 'SetProfile' from a Dongle database object.")
+ local psi = Dongle:New("Psi")
+ local db = psi:InitializeDB("PsiDB", {profile = {Alpha = true}})
+
+ assert_fails(function() db:SetProfile(1) end, argerror(2))
+
+ local regKey = string.format("%s - %s", UnitName("player"), GetRealmName())
+ assert(db.keys.profile == regKey)
+ local old = db.profile
+
+ db:SetProfile("Test Profile")
+ assert(db.keys.profile == "Test Profile")
+ assert(old ~= db.profile)
+ assert(db.profile.Alpha == true)
+end
+
+function test:dongle_delete_profile()
+ assert_fails(function() Dongle.DeleteProfile("test") end, "You must
call 'DeleteProfile' from a Dongle database object.")
+ local omega = Dongle:New("Omega")
+ local db = omega:InitializeDB("OmegaDB")
+
+ assert_fails(function() db:DeleteProfile(1) end, argerror(2))
+
+ omega:RegisterMessage("DONGLE_PROFILE_DELETED")
+ function omega:DONGLE_PROFILE_DELETED()
+ omega.alpha = true
+ end
+
+ local regKey = string.format("%s - %s", UnitName("player"), GetRealmName())
+ assert(db.keys.profile == regKey)
+ db:SetProfile("Test Profile")
+ assert_fails(function() db:DeleteProfile("Test Profile") end, "You
cannot delete your active profile. Change profiles, then attempt to delete.")
+
+ assert(not omega.alpha)
+ db:DeleteProfile(regKey)
+ assert(omega.alpha)
+ assert(not OmegaDB.profiles[regKey])
+end
+
+function test:dongle_copy_profile()
+ assert_fails(function() Dongle.CopyProfile("test") end, "You must
call 'CopyProfile' from a Dongle database object.")
+ local alice = Dongle:New("Alice")
+ local db = alice:InitializeDB("AliceDB")
+
+ assert_fails(function() db:CopyProfile(1) end, argerror(2))
+
+ alice:RegisterMessage("DONGLE_PROFILE_COPIED")
+ function alice:DONGLE_PROFILE_COPIED()
+ alice.alpha = true
+ end
+
+ db.profile.Alpha = true
+ db.profile.Beta = {Gamma = true}
+
+ local regKey = string.format("%s - %s", UnitName("player"), GetRealmName())
+ assert(db.keys.profile == regKey)
+ db:SetProfile("Test Profile")
+ assert_fails(function() db:CopyProfile("Test Profile")
end, "Source/Destination profile cannot be the same profile")
+ db:CopyProfile(regKey)
+ assert(db.profile.Alpha == true)
+ assert(db.profile.Beta.Gamma == true)
+ assert(alice.alpha == true)
+end
+
+function test:dongle_reset_profile()
+ assert_fails(function() Dongle.ResetProfile() end, "You must
call 'ResetProfile' from a Dongle database object.")
+ local bob = Dongle:New("Bob")
+
+ bob:RegisterMessage("DONGLE_PROFILE_RESET")
+ function bob:DONGLE_PROFILE_RESET()
+ bob.alpha = true
+ end
+
+ local db = bob:InitializeDB("BobDB")
+
+ db.profile.Alpha = true
+ db.profile.Beta = {Gamma = true}
+
+ local regKey = string.format("%s - %s", UnitName("player"), GetRealmName())
+ assert(db.keys.profile == regKey)
+
+ db:ResetProfile()
+
+ assert(db.profile.Alpha == nil)
+ assert(db.profile.Beta == nil)
+ assert(bob.alpha == true)
+end
+
+function test:dongle_reset_db()
+ assert_fails(function() Dongle.ResetDB() end, "You must
call 'ResetDB' from a Dongle database object.")
+ local carol = Dongle:New("carol")
+
+ carol:RegisterMessage("DONGLE_DATABASE_RESET")
+ carol:RegisterMessage("DONGLE_PROFILE_CHANGED")
+ carol:RegisterMessage("DONGLE_PROFILE_CREATED")
+
+ function carol:DONGLE_DATABASE_RESET()
+ carol.alpha = true
+ end
+ function carol:DONGLE_PROFILE_CHANGED()
+ carol.beta = true
+ end
+ function carol:DONGLE_PROFILE_CREATED()
+ carol.gamma = true
+ end
+
+ local db = carol:InitializeDB("carolDB")
+ db.profile.Alpha = true
+ db.profile.Beta = {Gamma = true}
+
+ local regKey = string.format("%s - %s", UnitName("player"), GetRealmName())
+ assert(db.keys.profile == regKey)
+
+ db = db:ResetDB("SomeProfile")
+
+ assert(db.profile.Alpha == nil)
+ assert(db.profile.Beta == nil)
+ assert(carol.alpha == true)
+ assert(carol.beta == true)
+ assert(carol.gamma == true)
+ assert(db.keys.profile == "SomeProfile")
+end
+
+function test:dongle_db_retain_values()
+ local joan = Dongle:New("joan")
+ local defaults = {
+ profile = {
+ alpha = {
+ beta = false
+ },
+ gamma = false,
+ }
+ }
+
+ local db = joan:InitializeDB("joanDB", defaults)
+ db.profile.alpha.beta = true
+ db.profile.epsilon = true
+
+ -- Simulate logout/login
+ Dongle:ClearDBDefaults()
+
+ local rivers = Dongle:New("rivers")
+ db = rivers:InitializeDB("joanDB", defaults)
+
+ assert(db.profile.alpha.beta == true)
+ assert(db.profile.epsilon == true)
+ assert(db.profile.gamma == false)
+end
+
+function test:dongle_db_sv_globals()
+ local alpha = Dongle:New("alpha")
+ local db = alpha:InitializeDB("alphaDB")
+
+ betaDB = {}
+ local bdb = betaDB
+ local db2 = alpha:InitializeDB("betaDB")
+
+ assert(db.sv == alphaDB)
+ assert(db2.sv == betaDB)
+ assert(betaDB == bdb)
+end
+
+function test:dongle_db_list_profiles()
+ local dianne = Dongle:New("dianne")
+ local db = dianne:InitializeDB("dianneDB",nil,"Initial Profile")
+ assert(db.profile)
+ db:SetProfile("SomeProfile")
+ assert(db.profile)
+ db:SetProfile("SomeOtherProfile")
+ assert(db.profile)
+ local profiles = {["Initial Profile"] = 1, ["SomeProfile"] = 1,
["SomeOtherProfile"] = 1}
+ local p,n = db:GetProfiles()
+
+ for k,v in pairs(p) do
+ assert(profiles[v] == 1)
+ profiles[v] = nil
+ end
+ assert(next(profiles) == nil)
+ assert(#p == n)
+end
+
+function test:dongle_dynamic_db()
+ local dyn = Dongle:New("dynamictable")
+ dyn.db = dyn:InitializeDB("DYNDB")
+
+ for k,v in pairs(dyn.db.keys) do
+ assert(not rawget(dyn.db, k))
+ end
+end
+
+function test:dongle_db_namespaces()
+ local master = Dongle:New("masterDongle")
+ master.db = master:InitializeDB("MasterDB", nil, "Test Profile")
+
+ local child = Dongle:New("childDongle")
+ child.db = master.db:RegisterNamespace("myNamespace")
+
+ local key = "Test Profile"
+ assert(master.db.keys.profile == key)
+ assert(child.db.keys.profile == key)
+end
+
+
+function test:dongle_namespace_setprofile()
+ local master = Dongle:New("nstestprofilemaster")
+ master.db = master:InitializeDB("MasterDB")
+
+ local child = master:NewModule("nstestprofilechild")
+ child.db = master.db:RegisterNamespace("TestProfileNS")
+
+ assert(master.db.keys.profile == child.db.keys.profile)
+ master.db:SetProfile("TestProfileNS2")
+ assert(master.db.keys.profile == child.db.keys.profile)
+end
+
+function test:dongle_magic_tables()
+ local addon = Dongle:New("magic_tables")
+ local defaults = {
+ profile = {
+ subtable = {
+ ["*"] = {
+ alpha = 1,
+ beta = 2,
+ },
+ },
+ },
+ }
+
+ local db = addon:InitializeDB("magic_tablesDB", defaults)
+ assert(type(db.profile) == "table")
+ assert(type(db.profile.subtable) == "table")
+ assert(db.profile.subtable[1].alpha == 1)
+ assert(db.profile.subtable[1].beta == 2)
+
+ db.profile.subtable[1].beta = 3
+ Dongle:ClearDBDefaults()
+
+ assert(db.profile.subtable[1].alpha == nil)
+ assert(db.profile.subtable[1].beta == 3)
+end
+
+test:Run()
\ No newline at end of file
Added: tags/Dongle-1.1-r649/DongleUnitTests/Tests/07DongleSlash.lua
==============================================================================
--- (empty file)
+++ tags/Dongle-1.1-r649/DongleUnitTests/Tests/07DongleSlash.lua Mon
Nov 12 12:07:06 2007
@@ -0,0 +1,75 @@
+local test = UnitTest:New("07DongleSlash")
+local Dongle = DongleStub("Dongle-1.0")
+
+function test:dongle_initialize_slash()
+ assert_fails(function() Dongle.InitializeSlashCommand({},"beta","beta
help") end, "You must call 'InitializeSlashCommand' from a registered Dongle.")
+
+ local beta = Dongle:New("beta")
+ assert_fails(function() beta:InitializeSlashCommand() end, argerror(2))
+ assert_fails(function() beta:InitializeSlashCommand(1) end, argerror(2))
+ assert_fails(function() beta:InitializeSlashCommand("beta help") end, argerror(3))
+ assert_fails(function() beta:InitializeSlashCommand("beta help", 1)
end, argerror(3))
+ assert_fails(function() beta:InitializeSlashCommand("beta
help", "BETA") end, argerror(4))
+ assert_fails(function() beta:InitializeSlashCommand("beta
help", "BETA", 1) end, argerror(4))
+
+ local cmd = beta:InitializeSlashCommand("beta help", "BETA", "beta")
+ assert(type(cmd) == "table")
+end
+
+function test:dongle_register_slash_handler()
+ assert_fails(function() Dongle.RegisterSlashHandler() end, "You must
call 'RegisterSlashHandler' from a Dongle slash command object.")
+ local gamma = Dongle:New("gamma")
+ local cmd = gamma:InitializeSlashCommand("gamma help", "GAMMA", "gamma")
+
+ assert_fails(function() cmd:RegisterSlashHandler() end, argerror(2))
+ assert_fails(function() cmd:RegisterSlashHandler(1) end, argerror(2))
+ assert_fails(function() cmd:RegisterSlashHandler("gamma help") end, argerror(3))
+ assert_fails(function() cmd:RegisterSlashHandler("gamma help", 1)
end, argerror(3))
+ assert_fails(function() cmd:RegisterSlashHandler("gamma
help", "gamma") end, argerror(4))
+ assert_fails(function() cmd:RegisterSlashHandler("gamma
help", "gamma", 1) end, argerror(4))
+
+ cmd:RegisterSlashHandler("cmd2 help", "cmd2 pattern", "GammaFunc")
+ cmd:RegisterSlashHandler("cmd3 help", "cmd3 pattern", function() end)
+end
+
+function test:dongle_call_handler()
+ local delta = Dongle:New("delta")
+ local cmd = delta:InitializeSlashCommand("delta help", "DELTA", "delta")
+
+ local obj
+ cmd:RegisterSlashHandler("cmd1 help", "cmd1", function() obj = delta end)
+ assert(not obj)
+ _G.SlashCmdList.DELTA("cmd1")
+ assert(obj == delta)
+
+ obj = nil
+ cmd:RegisterSlashHandler("cmd2 help", "cmd2", "cmd2")
+ function delta:cmd2() obj = self end
+ assert(not obj)
+ _G.SlashCmdList.DELTA("cmd2")
+ assert(obj == delta)
+end
+
+function test:dongle_call_handler_parse()
+ local epsilon = Dongle:New("epsilon")
+ local cmd = epsilon:InitializeSlashCommand("epsilon help", "EPSILON", "epsilon")
+
+ local obj, int
+ cmd:RegisterSlashHandler("cmd1 help", "cmd1 (%d+)", function(i) int =
i end)
+ assert(not int)
+ assert(not obj)
+ _G.SlashCmdList.EPSILON("cmd1")
+ assert(not int)
+ assert(not obj)
+ _G.SlashCmdList.EPSILON("cmd1 blarg")
+ assert(not int)
+ assert(not obj)
+ _G.SlashCmdList.EPSILON("cmd1 12345")
+ assert(int == "12345")
+end
+
+function test:dongle_print_usage()
+ assert_fails(function() Dongle.PrintUsage() end, "You must
call 'PrintUsage' from a Dongle slash command object.")
+end
+
+test:Run()
Added: tags/Dongle-1.1-r649/DongleUnitTests/Tests/08DongleError.lua
==============================================================================
--- (empty file)
+++ tags/Dongle-1.1-r649/DongleUnitTests/Tests/08DongleError.lua Mon
Nov 12 12:07:06 2007
@@ -0,0 +1,55 @@
+local test = UnitTest:New("08DongleError")
+local Dongle = DongleStub("Dongle-1.0")
+
+local L = {
+ ["BAD_ARGUMENT"] = "bad argument #%d to '%s' (%s expected, got %s)",
+}
+
+-- This function is copied from Dongle.lua, and must be kept up to date
+local function argcheck(value, num, ...)
+ if type(num) ~= "number" then
+ error(L["BAD_ARGUMENT"]:format(2, "argcheck", "number", type(num)), 1)
+ end
+
+ for i=1,select("#", ...) do
+ if type(value) == select(i, ...) then return end
+ end
+
+ local types = strjoin(", ", ...)
+ local name = string.match(debugstack(2,2,0), ": in function [`<](.-)['>]")
+ error(L["BAD_ARGUMENT"]:format(num, name, types, type(value)), 3)
+end
+
+local function assert(level,condition,message)
+ if not condition then
+ error(message,level)
+ end
+end
+
+local Library = {}
+
+function Library:API_Function(arg1)
+ argcheck(arg1, 2, "number")
+end
+
+function Library:API_Fail(arg1)
+ assert(3, reg, "This call to 'API_Fail' is expected to fail.")
+end
+
+local function argcheck_help()
+ Library:API_Function()
+end
+
+local function assert_help()
+ Library:API_Fail()
+end
+
+function test:dongle_argcheck_error()
+ assert_fails(argcheck_help, "08DongleError.lua:40: bad argument #2 to 'API_Function'")
+end
+
+function test:dongle_assert_error()
+ assert_fails(assert_help, "08DongleError.lua:44", "This call
to 'API_Fail' is expected to fail.")
+end
+
+test:Run()
\ No newline at end of file
Added: tags/Dongle-1.1-r649/DongleUnitTests/Tests/09DongleTimer.lua
==============================================================================
--- (empty file)
+++ tags/Dongle-1.1-r649/DongleUnitTests/Tests/09DongleTimer.lua Mon
Nov 12 12:07:06 2007
@@ -0,0 +1,39 @@
+local test = UnitTest:New("09DongleTimer")
+local Dongle = DongleStub("Dongle-1.0")
+
+local function TimerFunc(name, scheduleTime)
+ Dongle:PrintF("Timer: %s, TimeToTrigger: %f", name, GetTime() - scheduleTime)
+end
+
+local function TimeRemainingClose(dongle, name, seconds)
+ local scheduled, remaining = dongle:IsTimerScheduled(name)
+ if not remaining then return false end
+ return math.abs(remaining - seconds) < 0.01
+end
+
+function test:dongle_schedule_timer_multiple()
+ local ob = Dongle:New("Omicron-Alpha")
+ ob:ScheduleTimer("1", TimerFunc, 1, GetTime())
+ ob:ScheduleTimer("6", TimerFunc, 6, GetTime())
+ ob:ScheduleRepeatingTimer("r2", TimerFunc, 2, GetTime())
+ ob:ScheduleTimer("5", TimerFunc, 5, GetTime())
+ ob:ScheduleTimer("10", TimerFunc, 10, GetTime())
+ ob:ScheduleTimer("3", TimerFunc, 3, GetTime())
+ ob:ScheduleTimer("4", TimerFunc, 4, GetTime())
+ ob:ScheduleTimer("7", TimerFunc, 7, GetTime())
+ ob:ScheduleTimer("8", TimerFunc, 8, GetTime())
+ ob:ScheduleTimer("9", TimerFunc, 9, GetTime())
+ ob:CancelTimer("5")
+ assert(not ob:IsTimerScheduled("5"))
+ assert(ob:IsTimerScheduled("1") and TimeRemainingClose(ob, "1", 1))
+ assert(ob:IsTimerScheduled("r2") and TimeRemainingClose(ob, "r2", 2))
+ assert(ob:IsTimerScheduled("3") and TimeRemainingClose(ob, "3", 3))
+ assert(ob:IsTimerScheduled("4") and TimeRemainingClose(ob, "4", 4))
+ assert(ob:IsTimerScheduled("6") and TimeRemainingClose(ob, "6", 6))
+ assert(ob:IsTimerScheduled("7") and TimeRemainingClose(ob, "7", 7))
+ assert(ob:IsTimerScheduled("8") and TimeRemainingClose(ob, "8", 8))
+ assert(ob:IsTimerScheduled("9") and TimeRemainingClose(ob, "9", 9))
+ assert(ob:IsTimerScheduled("10") and TimeRemainingClose(ob, "10", 10))
+end
+
+test:Run()
Added: tags/Dongle-1.1-r649/DongleUnitTests/Tests/99Completion.lua
==============================================================================
--- (empty file)
+++ tags/Dongle-1.1-r649/DongleUnitTests/Tests/99Completion.lua Mon Nov
12 12:07:06 2007
@@ -0,0 +1,23 @@
+local test = UnitTest:New("99Completion")
+
+local tests = {
+ "01DongleStub",
+ "02DongleCore",
+ "03DongleModules",
+ "04DongleMessage",
+ "05DonglePrint",
+ "06DongleDB",
+ "07DongleSlash",
+ "08DongleError",
+ "09DongleTimer",
+ "99Completion",
+}
+
+for k,v in pairs(tests) do
+ test[v] = function(self)
+ assert(__unitTests[v] == true)
+ end
+end
+
+test:Run()
+
Added: tags/Dongle-1.1-r649/DongleUnitTests/UnitTests.lua
==============================================================================
--- (empty file)
+++ tags/Dongle-1.1-r649/DongleUnitTests/UnitTests.lua Mon Nov 12
12:07:06 2007
@@ -0,0 +1,123 @@
+UnitTest = {}
+
+function assert_fails(func, ...)
+ local done,err = pcall(func)
+ for i=1,select("#", ...) do
+ local msg = select(i, ...)
+ assert(not done and string.find(err, msg), "\n|cffffff00Did not find
fails match: |r\n" .. msg .. "\n|cffffff00In error:|r \n" ..
tostring(err) .. "\n|cffffff00Stack traceback:|r\n".. tostring(debugstack()))
+ end
+ assert(not done, "Function did not fail")
+end
+
+function argerror(arg)
+ return string.format("bad argument #%d", arg)
+end
+
+local function xerr(msg)
+ return msg .. "\n" .. debugstack()
+end
+
+local function cleanError(err)
+ err = err:gsub(".*(|c%x+Did not find fails match:)","%1")
+ err = err:gsub("[^\n]*\\([^\\]+%.lua:%d+:)","%1")
+ return err
+end
+
+local frame = CreateFrame("ScrollingMessageFrame", "UnitTestFrame", UIParent)
+frame:SetHeight(400)
+frame:SetWidth(600)
+frame:SetPoint("CENTER", 0, 0)
+local backdrop =
+{
+ bgFile = "Interface/Tooltips/UI-Tooltip-Background",
+ tile = false,
+ tileSize = 6,
+ edgeSize = 18,
+ insets = {
+ left = -4,
+ right = -4,
+ top = -4,
+ bottom = -4
+ }
+}
+frame:SetBackdrop(backdrop)
+frame:SetBackdropColor(0.3, 0.3, 0.3)
+
+frame:SetFont("Interface\\AddOns\\DongleUnitTests\\MONACO.TTF", 14)
+frame:SetJustifyH("LEFT")
+frame:SetFadeDuration(10)
+frame:SetTimeVisible(180)
+frame:SetMaxLines(9999)
+frame:SetScript("OnMouseWheel", function (self, delta)
+ if delta > 0 then self:ScrollUp()
+ elseif delta < 0 then
+ if IsShiftKeyDown() then self:ScrollToBottom()
+ else self:ScrollDown() end
+ end
+end)
+frame:EnableMouseWheel(1)
+local fails = {}
+frame:SetScript("OnHyperlinkClick",function(self, link, text, button)
+
+ ItemRefTooltip:ClearLines()
+ ItemRefTooltip:SetOwner(UIParent,"ANCHOR_PRESERVE")
+
+ local failID, testName = link:match("fail:(%d+):([%a_]+)")
+ failID = tonumber(failID)
+ local errString = cleanError(fails[failID])
+
+ ItemRefTooltip:AddLine(testName,1,.2,.2)
+
+ for line in errString:gmatch("([^\n]*)") do
+ ItemRefTooltip:AddLine(line,1,1,1)
+ end
+
+ ItemRefTooltip:Show()
+end)
+
+
+local print = function(msg)
+ UnitTestFrame:AddMessage(msg)
+end
+
+local __unitTests = {}
+
+function UnitTest:New(it, name)
+ if type(it) == "string" then
+ name = it
+ it = nil
+ end
+
+ it = it or {}
+ setmetatable(it, self)
+ self.__index = self
+ __unitTests[name] = true
+ return it
+end
+
+function UnitTest:Run(...)
+ local function run_test(t, name)
+ local genv = getfenv(0)
+ local penv = setmetatable({["__unitTests"] = __unitTests}, {__index=genv})
+ setfenv(t, penv)
+ setfenv(0, penv)
+ local status, err = xpcall(t, xerr)
+ setfenv(0, genv)
+
+ if status then
+ print(("%-39s |cFF11FF11pass|r"):format("[" .. name .. "]"))
+ else
+ local failID = #fails + 1
+ fails[failID] = err
+ print(("%-38s |cFFFF1111|Hfail:%d:%s|h[FAIL]|h|r"):format("[" ..
name .. "]", failID, name))
+ end
+
+ for k,v in pairs(penv) do
+ --print(string.format("%-39s |cFFFFFF11Global leak: %s|r", "", k))
+ end
+ end
+
+ for k, v in pairs(self) do
+ run_test(v, k)
+ end
+end
Added: tags/Dongle-1.1-r649/changelog.txt
==============================================================================
--- (empty file)
+++ tags/Dongle-1.1-r649/changelog.txt Mon Nov 12 12:07:06 2007
@@ -0,0 +1,3210 @@
+------------------------------------------------------------------------
+r649 | jnwhiteh | 2007-11-12 20:06:06 +0000 (Mon, 12 Nov 2007) | 2 lines
+
+* Updated build script to pull correct DongleUnitTests
+
+------------------------------------------------------------------------
+r648 | jnwhiteh | 2007-11-12 20:05:42 +0000 (Mon, 12 Nov 2007) | 2 lines
+
+* Tagging Dongle-1.0-r1146
+
+------------------------------------------------------------------------
+r647 | jnwhiteh | 2007-11-12 20:05:11 +0000 (Mon, 12 Nov 2007) | 2 lines
+
+* Patching the fixes for GetProfile and RegisterNamespace() applied to Dongle-1.10
+
+------------------------------------------------------------------------
+r646 | jnwhiteh | 2007-11-12 20:04:14 +0000 (Mon, 12 Nov 2007) | 2 lines
+
+* Updated a bad argcheck
+
+------------------------------------------------------------------------
+r645 | jnwhiteh | 2007-11-12 20:03:13 +0000 (Mon, 12 Nov 2007) | 2 lines
+
+* Update to Build.lua to export the right unit tests
+
+------------------------------------------------------------------------
+r644 | jnwhiteh | 2007-11-12 19:51:33 +0000 (Mon, 12 Nov 2007) | 2 lines
+
+* Renaming DongleUnitTests-1.1 for consistency
+
+------------------------------------------------------------------------
+r643 | jnwhiteh | 2007-11-12 19:46:37 +0000 (Mon, 12 Nov 2007) | 2 lines
+
+Dongle-1.0: Patch for :GetProfiles() issue reported in issue #29
+
+------------------------------------------------------------------------
+r642 | shadowed.wow | 2007-11-10 21:25:42 +0000 (Sat, 10 Nov 2007) | 1 line
+
+* Fixed dependency display bug
+------------------------------------------------------------------------
+r641 | shadowed.wow | 2007-11-01 06:27:55 +0000 (Thu, 01 Nov 2007) | 1 line
+
+* Importing OptionHouseLib-r638 library
+------------------------------------------------------------------------
+r640 | shadowed.wow | 2007-11-01 06:27:39 +0000 (Thu, 01 Nov 2007) | 1 line
+
+* Importing OptionHouse-r638 addon
+------------------------------------------------------------------------
+r639 | shadowed.wow | 2007-11-01 06:27:16 +0000 (Thu, 01 Nov 2007) | 1 line
+
+* Creating directory for OptionHouse-r638
+------------------------------------------------------------------------
+r638 | shadowed.wow | 2007-11-01 00:02:16 +0000 (Thu, 01 Nov 2007) | 1 line
+
+* Fixed a bug with OnShow not verifying that theres actually a OptionHouseDB
+------------------------------------------------------------------------
+r637 | shadowed.wow | 2007-10-26 20:18:19 +0100 (Fri, 26 Oct 2007) | 1 line
+
+* Importing OptionHouseLib-r634 library
+------------------------------------------------------------------------
+r636 | shadowed.wow | 2007-10-26 20:18:09 +0100 (Fri, 26 Oct 2007) | 1 line
+
+* Importing OptionHouse-r634 addon
+------------------------------------------------------------------------
+r635 | shadowed.wow | 2007-10-26 20:17:51 +0100 (Fri, 26 Oct 2007) | 1 line
+
+* Creating directory for OptionHouse-r634
+------------------------------------------------------------------------
+r634 | shadowed.wow | 2007-10-26 20:08:26 +0100 (Fri, 26 Oct 2007) | 1 line
+
+* Okay, NOW it's backwards compatible, also includes a safe-fail
incase sortID manages to become nil when adding it to the categories list
+------------------------------------------------------------------------
+r633 | shadowed.wow | 2007-10-26 20:03:24 +0100 (Fri, 26 Oct 2007) | 5 lines
+
+* Fixed position not being saved correctly
+* Sorting is now supported. Addons are sorted by A-Z regardless of
order loaded, categories and sub categories are also sorted by A-Z,
unless a sort id is passed.
+* API CHANGE, OHObj:RegisterCategory(name, handler/func, func,
noCache, sortID), OHObj:RegisterSubCategory(parentCat, name,
handler/func, func, noCache, sortID)
+
+These are backwards compatabile so the major hasn't been bumped.
+------------------------------------------------------------------------
+r632 | jnwhiteh | 2007-10-20 17:28:39 +0100 (Sat, 20 Oct 2007) | 2 lines
+
+* Tagging Dongle-1.1-r630 *NEEDS TESTING*
+
+------------------------------------------------------------------------
+r631 | jnwhiteh | 2007-10-20 17:28:02 +0100 (Sat, 20 Oct 2007) | 2 lines
+
+* Tagging Dongle-1.0-r1129. *NEEDS TESTING*
+
+------------------------------------------------------------------------
+r630 | jnwhiteh | 2007-10-20 17:22:46 +0100 (Sat, 20 Oct 2007) | 3 lines
+
+* Due to timing issues with the IsLoggedIn() API, the loading process
for Dongle has been revamped. As a result addons should upgrade to the
latest version possible in order to help us test.
+* An addon's :Enable() method could end up being called before
PLAYER_LOGIN, in particular during the first ADDON_LOADED after the
IsLoggedIn() return changes. No adjustements should be necessary, the
behavior is consistent with current Dongle.
+
+------------------------------------------------------------------------
+r629 | jnwhiteh | 2007-10-20 17:22:24 +0100 (Sat, 20 Oct 2007) | 3 lines
+
+* Due to timing issues with the IsLoggedIn() API, the loading process
for Dongle has been revamped. As a result addons should upgrade to the
latest version possible in order to help us test.
+* An addon's :Enable() method could end up being called before
PLAYER_LOGIN, in particular during the first ADDON_LOADED after the
IsLoggedIn() return changes. No adjustements should be necessary, the
behavior is consistent with current Dongle.
+
+------------------------------------------------------------------------
+r628 | shadowed.wow | 2007-10-16 06:06:43 +0100 (Tue, 16 Oct 2007) | 2 lines
+
+* We refer to OptionHouse as "OptionHouse" not "Option House"
basically every where except for the combat entered message
+* Enforced not being able to open OptionHouse in combat through
OH:Open and OH:OpenTab instead of only when you enter combat, may
revert this later.
+------------------------------------------------------------------------
+r627 | shadowed.wow | 2007-10-05 18:53:41 +0100 (Fri, 05 Oct 2007) | 1 line
+
+* Added moving back and the lock/unlock option
+------------------------------------------------------------------------
+r626 | shadowed.wow | 2007-09-30 21:43:42 +0100 (Sun, 30 Sep 2007) | 2 lines
+
+* Fixed OptionHouse:OpenTab(#) not letting you open the management or
performance tab until OptionHouse had been opened once
+* Fixed positioning of dependencies, if the addon has more then 3
dependencies they shouldn't start overlapping in the management tab
+------------------------------------------------------------------------
+r625 | shadowed.wow | 2007-09-26 03:31:32 +0100 (Wed, 26 Sep 2007) | 2 lines
+
+* It looks like Blizzard fixed doublewide UIPanelLayout-area being
broken so uncommented it
+* If OptionHouse is opened from the game menu, closing OptionHouse
will pull the game menu back up like it does for other game menu panels
+------------------------------------------------------------------------
+r624 | shadowed.wow | 2007-09-25 21:58:04 +0100 (Tue, 25 Sep 2007) | 1 line
+
+* Updated toc to 20200
+------------------------------------------------------------------------
+r623 | shadowed.wow | 2007-09-22 19:47:55 +0100 (Sat, 22 Sep 2007) | 1 line
+
+* Removing OptionHouseFrames as it causes conflict issues and due to
the frame level and such changes you need to be sure you're getting the
right frame
+------------------------------------------------------------------------
+r622 | shadowed.wow | 2007-09-21 09:19:21 +0100 (Fri, 21 Sep 2007) | 1 line
+
+* Importing OptionHouseLib-r619 library
+------------------------------------------------------------------------
+r621 | shadowed.wow | 2007-09-21 09:19:15 +0100 (Fri, 21 Sep 2007) | 1 line
+
+* Importing OptionHouse-r619 addon
+------------------------------------------------------------------------
+r620 | shadowed.wow | 2007-09-21 09:19:04 +0100 (Fri, 21 Sep 2007) | 1 line
+
+* Creating directory for OptionHouse-r619
+------------------------------------------------------------------------
+r619 | shadowed.wow | 2007-09-21 09:18:03 +0100 (Fri, 21 Sep 2007) | 2 lines
+
+* Removed the temp DongleStub -> LibStub code, this will be the
version that goes out Tuesday with the World of Warcraft 2.2 patch
being released
+* MAKE SURE YOU UPDATE ALL OF YOUR ADDONS TO USE THIS VERSION, Any
non-LibStub version will not show up in the configuration list
+------------------------------------------------------------------------
+r618 | shadowed.wow | 2007-09-10 04:44:53 +0100 (Mon, 10 Sep 2007) | 1 line
+
+* Importing OptionHouseLib-r615 library
+------------------------------------------------------------------------
+r617 | shadowed.wow | 2007-09-10 04:44:45 +0100 (Mon, 10 Sep 2007) | 1 line
+
+* Importing OptionHouse-r615 addon
+------------------------------------------------------------------------
+r616 | shadowed.wow | 2007-09-10 04:44:34 +0100 (Mon, 10 Sep 2007) | 1 line
+
+* Creating directory for OptionHouse-r615
+------------------------------------------------------------------------
+r615 | shadowed.wow | 2007-09-08 22:01:32 +0100 (Sat, 08 Sep 2007) | 1 line
+
+* Fixed an upgrade path issue
+------------------------------------------------------------------------
+r614 | jnwhiteh | 2007-09-06 00:32:55 +0100 (Thu, 06 Sep 2007) | 2 lines
+
+* Tagging Dongle-1.0-r1013
+
+------------------------------------------------------------------------
+r613 | jnwhiteh | 2007-09-06 00:31:19 +0100 (Thu, 06 Sep 2007) | 2 lines
+
+* Tagging Dongle-1.1-RC#
+
+------------------------------------------------------------------------
+r612 | jnwhiteh | 2007-09-06 00:30:00 +0100 (Thu, 06 Sep 2007) | 2 lines
+
+* Fixed a typo in DongleDB:GetCurrentProfile()
+
+------------------------------------------------------------------------
+r611 | jnwhiteh | 2007-09-06 00:29:20 +0100 (Thu, 06 Sep 2007) | 2 lines
+
+* Fixed an issue in GetCurrentProfile()
+
+------------------------------------------------------------------------
+r610 | jnwhiteh | 2007-09-06 00:17:00 +0100 (Thu, 06 Sep 2007) | 2 lines
+
+* Tagging Dongle-1.1-RC2. If no issues are found, will be released as Dongle-1.1.
+
+------------------------------------------------------------------------
+r609 | jnwhiteh | 2007-09-06 00:13:50 +0100 (Thu, 06 Sep 2007) | 2 lines
+
+* Bugfix to Dongle-1.1 when upgrading
+
+------------------------------------------------------------------------
+r608 | shadowed.wow | 2007-09-05 09:00:03 +0100 (Wed, 05 Sep 2007) | 1 line
+
+* Updated build script to work with LibStub
+------------------------------------------------------------------------
+r607 | shadowed.wow | 2007-09-05 08:58:50 +0100 (Wed, 05 Sep 2007) | 1 line
+
+* Importing OptionHouseLib-r604 library
+------------------------------------------------------------------------
+r606 | shadowed.wow | 2007-09-05 08:58:43 +0100 (Wed, 05 Sep 2007) | 1 line
+
+* Importing OptionHouse-r604 addon
+------------------------------------------------------------------------
+r605 | shadowed.wow | 2007-09-05 08:58:33 +0100 (Wed, 05 Sep 2007) | 1 line
+
+* Creating directory for OptionHouse-r604
+------------------------------------------------------------------------
+r604 | shadowed.wow | 2007-09-05 08:35:49 +0100 (Wed, 05 Sep 2007) | 1 line
+
+* Fixed categories not trimming strings to long for the buttons
+------------------------------------------------------------------------
+r603 | mikko.majuri | 2007-09-03 14:46:46 +0100 (Mon, 03 Sep 2007) | 1 line
+
+OH_PerfMon.lua and OH_AddOns.lua bumped to OptionHouse-1.1
+------------------------------------------------------------------------
+r602 | shadowed.wow | 2007-09-03 07:33:46 +0100 (Mon, 03 Sep 2007) | 3 lines
+
+* OptionHouse now uses LibStub, some temp code has been added to merge
any addons added into the OptionHouse-1.0
+* MAJOR HAS BEEN BUMPED, Any LibStub version will now be referred to
as OptionHouse-1.1.
+* Added LibStub as an optional dependency
+------------------------------------------------------------------------
+r601 | joshborke | 2007-09-01 13:26:03 +0100 (Sat, 01 Sep 2007) | 1 line
+
+OptionHouse: fixed typo
+------------------------------------------------------------------------
+r600 | shadowed.wow | 2007-08-31 22:23:22 +0100 (Fri, 31 Aug 2007) | 4 lines
+
+* Fixed some code comments
+* Removed an unneeded return
+* Removed orderID usage, not used anymore
+* Changed private API RegisterFrame to error if you pass an invalid type
+------------------------------------------------------------------------
+r599 | shadowed.wow | 2007-08-30 18:47:10 +0100 (Thu, 30 Aug 2007) | 3 lines
+
+* Fixed configuration not being parented to OH
+* Changed updateConfigList to also open the panel if you pass true as
the first argument
+* Changed OptionHouse:Open(addon, parentCat, subCat) to simply call
updateConfigList to open the frames, this should cause less issues and
work perfectly now
+------------------------------------------------------------------------
+r598 | jnwhiteh | 2007-08-30 05:09:18 +0100 (Thu, 30 Aug 2007) | 2 lines
+
+* Fix when accessing profileKeys, which exists in sv instead of db
+
+------------------------------------------------------------------------
+r597 | shadowed.wow | 2007-08-29 23:27:47 +0100 (Wed, 29 Aug 2007) | 1 line
+
+* Removed reset filters button, it seems rather pointless and just
wastes space
+------------------------------------------------------------------------
+r596 | shadowed.wow | 2007-08-29 02:45:11 +0100 (Wed, 29 Aug 2007) | 1 line
+
+* Importing OptionHouseLib-r593 library
+------------------------------------------------------------------------
+r595 | shadowed.wow | 2007-08-29 02:45:04 +0100 (Wed, 29 Aug 2007) | 1 line
+
+* Importing OptionHouse-r593 addon
+------------------------------------------------------------------------
+r594 | shadowed.wow | 2007-08-29 02:44:52 +0100 (Wed, 29 Aug 2007) | 1 line
+
+* Creating directory for OptionHouse-r593
+------------------------------------------------------------------------
+r593 | shadowed.wow | 2007-08-29 02:13:30 +0100 (Wed, 29 Aug 2007) | 1 line
+
+* Fixed OptionHouse:Open not opening categories with sub categories
+------------------------------------------------------------------------
+r592 | tekkub | 2007-08-29 00:58:54 +0100 (Wed, 29 Aug 2007) | 1 line
+
+OptionHouse - Shoving everything up to DIALOG strata
+------------------------------------------------------------------------
+r591 | shadowed.wow | 2007-08-25 05:22:20 +0100 (Sat, 25 Aug 2007) | 1 line
+
+* OptionHouse:Open() actually works now, promise
+------------------------------------------------------------------------
+r590 | shadowed.wow | 2007-08-24 22:16:08 +0100 (Fri, 24 Aug 2007) | 1 line
+
+* Trying out a fix for category text trimming so it doesn't overflow
+------------------------------------------------------------------------
+r589 | shadowed.wow | 2007-08-24 05:33:19 +0100 (Fri, 24 Aug 2007) | 2 lines
+
+* Fixed a few scroll functions not being actual functions and instead
anonymous ones
+* Added OptionHouseFrames[type] for usage when you can't/don't want to
create a new instance of OptionHouse just to call :GetFrame()
+------------------------------------------------------------------------
+r588 | shadowed.wow | 2007-08-23 00:04:56 +0100 (Thu, 23 Aug 2007) | 1 line
+
+* Formatting addon.name into the argcheck was kind of
pointless...because the argcheck is only called if addon.name is nil,
corrected to use the function name instead
+------------------------------------------------------------------------
+r587 | shadowed.wow | 2007-08-20 21:35:47 +0100 (Mon, 20 Aug 2007) | 1 line
+
+* Removed the code for loading LoD deps as the game does it by default
+------------------------------------------------------------------------
+r586 | shadowed.wow | 2007-08-20 21:29:32 +0100 (Mon, 20 Aug 2007) | 3 lines
+
+* Added a small flag so the performance/acp list is populated then the
frames shown, to make it easier to detect that the data is usable
+* Removed an old localization thats no longer in used
+* Clarified private api comment
+------------------------------------------------------------------------
+r585 | shadowed.wow | 2007-08-19 00:44:28 +0100 (Sun, 19 Aug 2007) | 1 line
+
+* Importing OptionHouseLib-r582 library
+------------------------------------------------------------------------
+r584 | shadowed.wow | 2007-08-19 00:44:20 +0100 (Sun, 19 Aug 2007) | 1 line
+
+* Importing OptionHouse-r582 addon
+------------------------------------------------------------------------
+r583 | shadowed.wow | 2007-08-19 00:44:09 +0100 (Sun, 19 Aug 2007) | 1 line
+
+* Creating directory for OptionHouse-r582
+------------------------------------------------------------------------
+r582 | shadowed.wow | 2007-08-18 17:46:17 +0100 (Sat, 18 Aug 2007) | 1 line
+
+* Fixed an error if an addon has a dependency listed thats not included
+------------------------------------------------------------------------
+r581 | shadowed.wow | 2007-08-18 05:16:36 +0100 (Sat, 18 Aug 2007) | 5 lines
+
+* /oh <addon> will now work for opening the page with the passed addon
+* Fixed OptionHouse:Open and all of the OptionHouse:Register*
functions that were still using the old frame names
+* Dependency filtering works now, the dependencies are colored by
status (Green means LoD, Orange means not LoD and was disabled and so
on), works the same as modules. Click on a dependency to filter by it,
click on it again to reset
+* Fixed sub category count not being reduced correctly when removing a category
+* Fixed all the remaining bugs with OptionHouse:RemoveCategory and
OptionHouse:RemoveSubCategory, you can now remove everything cleanly
and it'll correctly duplicate the behaviors as if it was never
registered in the first place, if you remove all of the addons
categories/sub categories the addon wont be listed anymore until you
add another category
+------------------------------------------------------------------------
+r580 | shadowed.wow | 2007-08-18 00:05:05 +0100 (Sat, 18 Aug 2007) |
11 lines
+
+* Removed modules, didn't work so well
+* All addons dependencies are now listed, you can filter by them by
clicking same with the old modules to only show other addons that are
dependent on it
+* Cleaned up dependency checking code to use the new table we have
+* Removed dependencies from tooltip since it's listed on the main window
+* Removed addonName from rows, easier to use it as addon since we
don't require a numeric id
+* Added reset filter button, ReloadUI was shifted one spot to the left
+* Clarified UNKNOWN_TAB and CATEGORY_ALREADYREG error, removed TOTAL_CATEGORIES
+* Formatting change to some code for consistency
+* Moved SetID/SetScript to when the tab is created, no sense in
calling it all the time
+* Fixed removeCategoryListing so it'll actually work when removing
multiple rows
+* Changed removeSubCategoryListing to use the same table.remove method
as everything else
+------------------------------------------------------------------------
+r579 | shadowed.wow | 2007-08-17 09:07:48 +0100 (Fri, 17 Aug 2007) | 3 lines
+
+* Removed FRAME_DRAGGING localization text, unneeded
+* Removed data.frame.time = GetTime() code, should have been removed
in r460
+* Moved the slider "border" graphic to scroll.barUpTexture and
scroll.barDownTexture so we can customize positioning
+------------------------------------------------------------------------
+r578 | shadowed.wow | 2007-08-17 06:52:02 +0100 (Fri, 17 Aug 2007) | 4 lines
+
+* Changed title strip code slightly
+* Reverted module to using folder name not title
+* Fixed "Show all addons" not working
+* Modules -> Module
+------------------------------------------------------------------------
+r577 | shadowed.wow | 2007-08-16 22:56:47 +0100 (Thu, 16 Aug 2007) | 2 lines
+
+* Fixed a bug when enabling all children of an addon
+* Fixed a bug when asking for confirmation for the above
+------------------------------------------------------------------------
+r576 | shadowed.wow | 2007-08-16 18:01:47 +0100 (Thu, 16 Aug 2007) | 1 line
+
+* Importing OptionHouseLib-r573 library
+------------------------------------------------------------------------
+r575 | shadowed.wow | 2007-08-16 18:01:16 +0100 (Thu, 16 Aug 2007) | 1 line
+
+* Importing OptionHouse-r573 addon
+------------------------------------------------------------------------
+r574 | shadowed.wow | 2007-08-16 18:00:34 +0100 (Thu, 16 Aug 2007) | 1 line
+
+* Creating directory for OptionHouse-r573
+------------------------------------------------------------------------
+r573 | shadowed.wow | 2007-08-16 04:11:44 +0100 (Thu, 16 Aug 2007) | 1 line
+
+* Oops, small bug that was causing the buttons for performance to not show
+------------------------------------------------------------------------
+r572 | shadowed.wow | 2007-08-16 04:08:29 +0100 (Thu, 16 Aug 2007) | 4 lines
+
+* Everything actually works now
+* Fixed performance alignment
+* Fixed cpu/memory per a second spiking for a second when the frames
first shown
+* Tweaked positioning of elements in the performance column
+------------------------------------------------------------------------
+r571 | shadowed.wow | 2007-08-16 00:21:56 +0100 (Thu, 16 Aug 2007) | 1 line
+
+* Oops, was formatting wrong variable in for MiR
+------------------------------------------------------------------------
+r570 | shadowed.wow | 2007-08-16 00:01:31 +0100 (Thu, 16 Aug 2007) | 2 lines
+
+* Fixed a bug that was causing Mac's to crash due to an invalid max value
+* Changed Memory/sec -> Mem/sec
+------------------------------------------------------------------------
+r569 | JoshBorke | 2007-08-15 23:47:57 +0100 (Wed, 15 Aug 2007) | 1 line
+
+OptionHouse/OH_PerfMon.lua: fixed typo
+------------------------------------------------------------------------
+r568 | shadowed.wow | 2007-08-15 22:58:50 +0100 (Wed, 15 Aug 2007) | 7 lines
+
+* Removed the frame name variables that didn't get cleaned up
+* Fixed a global variable in OH_PerfMon.lua
+* Fixed some bad variables names in OH_AddOns.lua and OH_PerfMon.lua
+* Improved addon table creation for OH_AddOns.lua the entire addons
table is only populated once and then individual addons are updated
when needed
+* Added status for Load on Demand addons that are already loaded
+* Added parent addon detection.
+For example LightHeaded, LightHeaded_A20_Data, LightHeaded_A40_Data.
A20_Data and A40_Data are children of LightHeaded you can only show
addons that are children of LightHeaded by clicking on
the "LightHeaded" text in the parent column, you can also sort by
parent just like name and status
+------------------------------------------------------------------------
+r567 | shadowed.wow | 2007-08-15 15:00:10 +0100 (Wed, 15 Aug 2007) | 1 line
+
+* Fixed results of a search being shown at the bottom
+------------------------------------------------------------------------
+r566 | JoshBorke | 2007-08-15 12:42:37 +0100 (Wed, 15 Aug 2007) | 1 line
+
+OptionHouse: fixed leaked global
+------------------------------------------------------------------------
+r565 | shadowed.wow | 2007-08-15 06:34:13 +0100 (Wed, 15 Aug 2007) | 1 line
+
+* Added in total memory and total CPU onto the sort bar things,
positioning is messed up, I'll pretend I don't know about it and hope
someone else (Josh) fixes it
+------------------------------------------------------------------------
+r564 | shadowed.wow | 2007-08-15 04:23:33 +0100 (Wed, 15 Aug 2007) | 1 line
+
+* Now I remember why we needed that "or 1" part
+------------------------------------------------------------------------
+r563 | shadowed.wow | 2007-08-15 03:58:51 +0100 (Wed, 15 Aug 2007) | 1 line
+
+* Importing OptionHouseLib-r560 library
+------------------------------------------------------------------------
+r562 | shadowed.wow | 2007-08-15 03:58:43 +0100 (Wed, 15 Aug 2007) | 1 line
+
+* Importing OptionHouse-r560 addon
+------------------------------------------------------------------------
+r561 | shadowed.wow | 2007-08-15 03:58:32 +0100 (Wed, 15 Aug 2007) | 1 line
+
+* Creating directory for OptionHouse-r560
+------------------------------------------------------------------------
+r560 | shadowed.wow | 2007-08-15 01:34:58 +0100 (Wed, 15 Aug 2007) | 1 line
+
+* Fixed performance monitor
+------------------------------------------------------------------------
+r559 | shadowed.wow | 2007-08-14 19:02:30 +0100 (Tue, 14 Aug 2007) | 3 lines
+
+* All frames are now unnamed (yay!)
+* Moved all scroll frames to the new system
+* New private APIs, OptionHouse:CreateScroll(parentFrame,
displayedNum, updateFunc) and OptionHouse:UpdateScroll(scrollFrame, totalRows)
+------------------------------------------------------------------------
+r558 | shadowed.wow | 2007-08-14 07:37:41 +0100 (Tue, 14 Aug 2007) | 1 line
+
+* Would cry if I lost the SF at this point
+------------------------------------------------------------------------
+r557 | shadowed.wow | 2007-08-14 04:53:17 +0100 (Tue, 14 Aug 2007) | 1 line
+
+* Everything previous commit is actually true now
+------------------------------------------------------------------------
+r556 | shadowed.wow | 2007-08-14 00:37:30 +0100 (Tue, 14 Aug 2007) | 3 lines
+
+* Fixed most of the inconsistencies for code formatting
+* Added a new feature that will enable all the children of an addon,
for example if you enable BigWigs you'll be asked if you want to enable
all of the BigWigs_* modules, like dependencies you can set this to
always ask, always enable, never enable
+* In theory all this stuff works fine, in practice OH is now horribly broken
+------------------------------------------------------------------------
+r555 | shadowed.wow | 2007-08-13 22:36:32 +0100 (Mon, 13 Aug 2007) | 2 lines
+
+* Using "Disable All" will keep OptionHouse enabled, you can still
disable it manually through the addon control panel
+* If a load on demand addon has load on demand dependencies then the
dependencies are automatically loaded then the addon
+------------------------------------------------------------------------
+r554 | shadowed.wow | 2007-08-13 15:58:47 +0100 (Mon, 13 Aug 2007) | 3 lines
+
+* Fixed highlight texture not resizing width
+* Tabs wont show the highlight texture when selected now
+* Tabs font color is white when selected and goldish when unselected (HIGHLIGHT_FONT_COLOR/NORMAL_FONT_COLOR)
+------------------------------------------------------------------------
+r553 | shadowed.wow | 2007-08-13 07:35:44 +0100 (Mon, 13 Aug 2007) | 1 line
+
+* Tabs now use our own system and are have been moved to being unnamed
+------------------------------------------------------------------------
+r552 | shadowed.wow | 2007-08-13 06:23:34 +0100 (Mon, 13 Aug 2007) | 2 lines
+
+* All of the frames except for tabs, FSF and main OptionHouse are unnamed
+* New API OptionHouse:GetFrame() accepts main, addon, manage, perf
these should be used in place of directly referencing a frame
+------------------------------------------------------------------------
+r551 | tekkub | 2007-08-13 01:57:44 +0100 (Mon, 13 Aug 2007) | 1 line
+
+OptionHouse - Seems "doublewide" is bugged, workaround until slouken
implements a fix
+------------------------------------------------------------------------
+r550 | shadowed.wow | 2007-08-12 21:45:00 +0100 (Sun, 12 Aug 2007) | 3 lines
+
+* Fixed OptionHouse not working correctly as an UI frame meaning no
more overlapping errors
+* Because OptionHouse is now a UI frame the ability to move it has
been removed
+* If an addon has dependencies that aren't load on demand, the "Load"
button wont show up and the text will be in orange
+------------------------------------------------------------------------
+r549 | shadowed.wow | 2007-08-11 23:47:37 +0100 (Sat, 11 Aug 2007) | 1 line
+
+* Importing OptionHouseLib-r546 library
+------------------------------------------------------------------------
+r548 | shadowed.wow | 2007-08-11 23:47:17 +0100 (Sat, 11 Aug 2007) | 1 line
+
+* Importing OptionHouse-r546 addon
+------------------------------------------------------------------------
+r547 | shadowed.wow | 2007-08-11 23:46:55 +0100 (Sat, 11 Aug 2007) | 1 line
+
+* Creating directory for OptionHouse-r546
+------------------------------------------------------------------------
+r546 | shadowed.wow | 2007-08-11 04:32:07 +0100 (Sat, 11 Aug 2007) | 1 line
+
+* Everything I said previous commit log is actually true now
+------------------------------------------------------------------------
+r545 | shadowed.wow | 2007-08-10 22:06:32 +0100 (Fri, 10 Aug 2007) | 4 lines
+
+* Changed createRows to only create the test font string when it
doesn't exist already
+* updateManageList is called in createManageList, it was pointless to
have to call them seperately
+* Removed all of the remaining globals, only ones remaining are the
main frames, scroll frames and tabs
+* Code cleanup
+------------------------------------------------------------------------
+r544 | shadowed.wow | 2007-08-10 07:32:38 +0100 (Fri, 10 Aug 2007) | 1 line
+
+Ninja fix, close button works, clad will never know
+------------------------------------------------------------------------
+r543 | shadowed.wow | 2007-08-10 07:04:06 +0100 (Fri, 10 Aug 2007) | 1 line
+
+* Importing OptionHouseLib-r540 library
+------------------------------------------------------------------------
+r542 | shadowed.wow | 2007-08-10 07:03:58 +0100 (Fri, 10 Aug 2007) | 1 line
+
+* Importing OptionHouse-r540 addon
+------------------------------------------------------------------------
+r541 | shadowed.wow | 2007-08-10 07:03:48 +0100 (Fri, 10 Aug 2007) | 1 line
+
+* Creating directory for OptionHouse-r540
+------------------------------------------------------------------------
+r540 | shadowed.wow | 2007-08-10 07:01:42 +0100 (Fri, 10 Aug 2007) | 7 lines
+
+* Removed texture names for the frame textures
+* Removed filter button names for addon configuration
+* Removed SetTexture call when frames initialized
+* Enable dependencies window will only show if the dependencies aren't
already enabled
+* Added number of dependencies being enabled
+* Changed the tooltip for the configuration to show if author OR
version exists instead of both
+* Fixed the registered OptionHouse version not being converted
+------------------------------------------------------------------------
+r539 | shadowed.wow | 2007-08-09 20:20:17 +0100 (Thu, 09 Aug 2007) | 1 line
+
+* Fixed the resort flag not being nilled after the sort
+------------------------------------------------------------------------
+r538 | shadowed.wow | 2007-08-09 03:14:26 +0100 (Thu, 09 Aug 2007) | 3 lines
+
+* All the features actually work now
+* Notes will correctly show up
+* Mod name in the tooltip is colored white to stand out more and look better
+------------------------------------------------------------------------
+r537 | shadowed.wow | 2007-08-08 22:54:36 +0100 (Wed, 08 Aug 2007) | 3 lines
+
+* Rows are used as needed, meaning you can change the text size and
see the results without a UI reload
+* When enabling an addon, if it has any dependencies they'll be
enabled you can change this to always enable, never enable or ask
through configuration
+* Some small code tweaks
+------------------------------------------------------------------------
+r536 | tekkub | 2007-08-07 08:55:19 +0100 (Tue, 07 Aug 2007) | 1 line
+
+OptionHouse - Fixed panel options and sorting for reals, shadowed
can't do anything right
+------------------------------------------------------------------------
+r535 | shadowed.wow | 2007-08-06 23:07:25 +0100 (Mon, 06 Aug 2007) | 1 line
+
+* Fixed title sorting not calling string.lower
+------------------------------------------------------------------------
+r534 | shadowed.wow | 2007-08-06 23:03:17 +0100 (Mon, 06 Aug 2007) | 2 lines
+
+* Changed OH to use the same window mode as AuctionHouse frame meaning
it'll close other frames when opened
+* Added mod notes to ACP tooltip
+------------------------------------------------------------------------
+r533 | shadowed.wow | 2007-08-02 20:31:06 +0100 (Thu, 02 Aug 2007) | 1 line
+
+* Importing OptionHouseLib-r530 library
+------------------------------------------------------------------------
+r532 | shadowed.wow | 2007-08-02 20:30:28 +0100 (Thu, 02 Aug 2007) | 1 line
+
+* Importing OptionHouse-r530 addon
+------------------------------------------------------------------------
+r531 | shadowed.wow | 2007-08-02 20:29:39 +0100 (Thu, 02 Aug 2007) | 1 line
+
+* Creating directory for OptionHouse-r530
+------------------------------------------------------------------------
+r530 | shadowed.wow | 2007-08-02 04:33:31 +0100 (Thu, 02 Aug 2007) | 1 line
+
+* Fixed a bug that was causing the addons saved and the actual frame
from being updated when called in response to a tab being clicked
+------------------------------------------------------------------------
+r529 | shadowed.wow | 2007-07-23 16:28:32 +0100 (Mon, 23 Jul 2007) | 1 line
+
+* Importing OptionHouseLib-r526 library
+------------------------------------------------------------------------
+r528 | shadowed.wow | 2007-07-23 16:28:25 +0100 (Mon, 23 Jul 2007) | 1 line
+
+* Importing OptionHouse-r526 addon
+------------------------------------------------------------------------
+r527 | shadowed.wow | 2007-07-23 16:28:16 +0100 (Mon, 23 Jul 2007) | 1 line
+
+* Creating directory for OptionHouse-r526
+------------------------------------------------------------------------
+r526 | JoshBorke | 2007-07-19 03:49:19 +0100 (Thu, 19 Jul 2007) | 4 lines
+
+OptionHouse:
+- dtw
+- don't StartMoving if frame isn't movable
+- fix RemoveSubCategory
+------------------------------------------------------------------------
+r525 | shadowed.wow | 2007-07-19 01:33:25 +0100 (Thu, 19 Jul 2007) | 1 line
+
+* Fixed locking/unlocking the frame not actually doing anything
+------------------------------------------------------------------------
+r524 | shadowed.wow | 2007-07-11 01:42:08 +0100 (Wed, 11 Jul 2007) | 1 line
+
+* Importing OptionHouseLib-r521 library
+------------------------------------------------------------------------
+r523 | shadowed.wow | 2007-07-11 01:42:02 +0100 (Wed, 11 Jul 2007) | 1 line
+
+* Importing OptionHouse-r521 addon
+------------------------------------------------------------------------
+r522 | shadowed.wow | 2007-07-11 01:41:52 +0100 (Wed, 11 Jul 2007) | 1 line
+
+* Creating directory for OptionHouse-r521
+------------------------------------------------------------------------
+r521 | shadowed.wow | 2007-07-11 01:40:27 +0100 (Wed, 11 Jul 2007) | 2 lines
+
+* Fixed Build.lua
+* Fixed sorting not doing a string.lower
+------------------------------------------------------------------------
+r520 | shadowed.wow | 2007-07-10 08:58:11 +0100 (Tue, 10 Jul 2007) | 2 lines
+
+* All font options will work now, the configuration should be fully usable
+* Moving works, if you have standalone it'll save the positioning you
can right click to reset it to the standard one, you can drag it using
the title bar where "Option House" text is located
+------------------------------------------------------------------------
+r519 | shadowed.wow | 2007-07-10 04:10:24 +0100 (Tue, 10 Jul 2007) | 3 lines
+
+* Fixed a couple of bugs in the configuration, they'll actually show
and position correctly now
+* Fixed tab registering/unregistering, so it actually works now
+* Fixed a couple of sorting bugs in filters, it'll only do addons
still due to other bugs that need to be worked out
+------------------------------------------------------------------------
+r518 | shadowed.wow | 2007-07-10 01:25:07 +0100 (Tue, 10 Jul 2007) | 5 lines
+
+* Code clean up, fixed some functions using func( foo, bar ) instead
of func(foo, bar)
+* Added removeCategoryListing and removeSubCategoryListing so we don't
have to re-create the entire list on a remove
+* Added sorting back in, addon listings will be sorted by a-z order,
categories and sub categories sorted in the order they were added
+* Changed the logic in openConfigFrame, no need to check data.frame
when it can be done once and throw an error if none is found
+* Fixed a couple of errors in configuration
+------------------------------------------------------------------------
+r517 | tekkub | 2007-07-10 01:14:11 +0100 (Tue, 10 Jul 2007) | 1 line
+
+OptionHouse - Why not sort the perf tab by title instead of name, for
consistency with the addon tab and the charselect addon panel
+------------------------------------------------------------------------
+r516 | shadowed.wow | 2007-07-10 00:46:31 +0100 (Tue, 10 Jul 2007) | 3 lines
+
+* Fixed the MiR and CiR values, will do new - old now instead of
abs(old - new) meaning you'll see negative values if memory or CPU
usage dropped
+* UI Should be fixed and will show up now, also fixed positioning
errors (hopefully)
+* Added an option to lock the OptionHouse window, haven't actually
implemented the code to do this just the configuration
+------------------------------------------------------------------------
+r515 | shadowed.wow | 2007-07-07 03:04:08 +0100 (Sat, 07 Jul 2007) | 3 lines
+
+Added some quick checks in so if you don't pass a handler or a
function it'll error on the RegisterCategory/Subcategory
+Changed tab order to Management -> Performance
+Fixed an error in OH_Configuration.lua, it still doesn't work the
frame isn't being shown, not really sure why right now
+------------------------------------------------------------------------
+r514 | shadowed.wow | 2007-07-06 20:16:18 +0100 (Fri, 06 Jul 2007) | 3 lines
+
+* Added OptionHouse:UnregisterTab(text) so we can remove the tabs when
people disable/enable them
+* Changed the "security" checking to only accept tabs with the text
Management or Performance, to make life easier
+* Added in all of the base code + configuration to OptionHouse, it
should unregister/register tabs just fine but the font size doesn't
work yet
+------------------------------------------------------------------------
+r513 | shadowed.wow | 2007-07-06 16:55:14 +0100 (Fri, 06 Jul 2007) | 1 line
+
+Adding base files for configs
+------------------------------------------------------------------------
+r512 | shadowed.wow | 2007-07-05 06:20:43 +0100 (Thu, 05 Jul 2007) | 1 line
+
+* Fixed a couple of bugs where OptionHouse wouldn't update the filter
listing if you loaded an addon with either OH hidden or you're using
management or performance tab instead
+------------------------------------------------------------------------
+r511 | shadowed.wow | 2007-07-04 22:33:45 +0100 (Wed, 04 Jul 2007) | 1 line
+
+* Improved the filter display code, will no longer create a table per
every row every time you expand/collapse or search on something
+------------------------------------------------------------------------
+r510 | jnwhiteh | 2007-07-04 18:47:01 +0100 (Wed, 04 Jul 2007) | 4 lines
+
+* Added preliminary win32 support. This affects:
+ - copy instead of cp
+ - using the win32 path separator instead of unix
+
+------------------------------------------------------------------------
+r509 | shadowed.wow | 2007-07-04 18:38:34 +0100 (Wed, 04 Jul 2007) | 1 line
+
+* Importing OptionHouseLib-r506 library
+------------------------------------------------------------------------
+r508 | shadowed.wow | 2007-07-04 18:38:28 +0100 (Wed, 04 Jul 2007) | 1 line
+
+* Importing OptionHouse-r506 addon
+------------------------------------------------------------------------
+r507 | shadowed.wow | 2007-07-04 18:38:20 +0100 (Wed, 04 Jul 2007) | 1 line
+
+* Creating directory for OptionHouse-r506
+------------------------------------------------------------------------
+r506 | shadowed.wow | 2007-07-04 05:23:23 +0100 (Wed, 04 Jul 2007) | 1 line
+
+Moved to a more reliable method of preventing people from registering
tabs with OptionHouse.
+------------------------------------------------------------------------
+r505 | jnwhiteh | 2007-07-03 20:22:50 +0100 (Tue, 03 Jul 2007) | 1 line
+
+* Importing OptionHouseLib-r502 library
+------------------------------------------------------------------------
+r504 | jnwhiteh | 2007-07-03 20:22:43 +0100 (Tue, 03 Jul 2007) | 1 line
+
+* Importing OptionHouse-r502 addon
+------------------------------------------------------------------------
+r503 | jnwhiteh | 2007-07-03 20:22:38 +0100 (Tue, 03 Jul 2007) | 1 line
+
+* Creating directory for OptionHouse-r502
+------------------------------------------------------------------------
+r502 | jnwhiteh | 2007-07-03 20:20:24 +0100 (Tue, 03 Jul 2007) | 2 lines
+
+* Ensure we do a file-level copy of the graphic
+
+------------------------------------------------------------------------
+r501 | shadowed.wow | 2007-07-03 20:20:17 +0100 (Tue, 03 Jul 2007) | 1 line
+
+Fixed KiB/s and MiB/s used for CPU, it shouldn't be anything since
it's seconds increased CPU time used.
+------------------------------------------------------------------------
+r500 | jnwhiteh | 2007-07-03 19:57:04 +0100 (Tue, 03 Jul 2007) | 2 lines
+
+* Verbiage fix for the library import
+
+------------------------------------------------------------------------
+r499 | jnwhiteh | 2007-07-03 19:56:41 +0100 (Tue, 03 Jul 2007) | 1 line
+
+* Importing OptionHouseLib-r496 addon
+------------------------------------------------------------------------
+r498 | jnwhiteh | 2007-07-03 19:56:37 +0100 (Tue, 03 Jul 2007) | 1 line
+
+* Importing OptionHouse-r496 addon
+------------------------------------------------------------------------
+r497 | jnwhiteh | 2007-07-03 19:56:31 +0100 (Tue, 03 Jul 2007) | 1 line
+
+* Creating directory for OptionHouse-r496
+------------------------------------------------------------------------
+r496 | jnwhiteh | 2007-07-03 19:55:27 +0100 (Tue, 03 Jul 2007) | 2 lines
+
+* Change the build process to include the full OptionHouse.lua file
+
+------------------------------------------------------------------------
+r495 | jnwhiteh | 2007-07-03 19:53:25 +0100 (Tue, 03 Jul 2007) | 2 lines
+
+* Fix an issue where the build script would not build the library properly
+
+------------------------------------------------------------------------
+r494 | jnwhiteh | 2007-07-03 19:51:47 +0100 (Tue, 03 Jul 2007) | 2 lines
+
+* Removing bad tag
+
+------------------------------------------------------------------------
+r493 | jnwhiteh | 2007-07-03 19:51:19 +0100 (Tue, 03 Jul 2007) | 2 lines
+
+* Removing bad tag
+
+------------------------------------------------------------------------
+r492 | jnwhiteh | 2007-07-03 19:47:13 +0100 (Tue, 03 Jul 2007) | 2 lines
+
+* Fix build script to generate proper import commands
+
+------------------------------------------------------------------------
+r491 | jnwhiteh | 2007-07-03 19:46:50 +0100 (Tue, 03 Jul 2007) | 1 line
+
+* Importing OptionHouseLib-r489 addon
+------------------------------------------------------------------------
+r490 | jnwhiteh | 2007-07-03 19:46:43 +0100 (Tue, 03 Jul 2007) | 1 line
+
+* Importing OptionHouse-r489 addon
+------------------------------------------------------------------------
+r489 | jnwhiteh | 2007-07-03 19:44:05 +0100 (Tue, 03 Jul 2007) | 1 line
+
+* Creating directory for OptionHouse-r488
+------------------------------------------------------------------------
+r488 | jnwhiteh | 2007-07-03 19:40:46 +0100 (Tue, 03 Jul 2007) | 2 lines
+
+* Removing old tag
+
+------------------------------------------------------------------------
+r487 | jnwhiteh | 2007-07-03 19:40:36 +0100 (Tue, 03 Jul 2007) | 2 lines
+
+* Removing old tag
+
+------------------------------------------------------------------------
+r486 | jnwhiteh | 2007-07-03 19:39:39 +0100 (Tue, 03 Jul 2007) | 3 lines
+
+* Adding a simple untested build script
+* Attempt to fix the issues with issecurevariable()
+
+------------------------------------------------------------------------
+r485 | jnwhiteh | 2007-07-03 19:11:50 +0100 (Tue, 03 Jul 2007) | 2 lines
+
+* Tagging OptionHouseLib from trunk
+
+------------------------------------------------------------------------
+r484 | jnwhiteh | 2007-07-03 19:11:37 +0100 (Tue, 03 Jul 2007) | 2 lines
+
+* Creating directory for OHLib-Beta-r480
+
+------------------------------------------------------------------------
+r483 | shadowed.wow | 2007-07-03 18:30:39 +0100 (Tue, 03 Jul 2007) | 1 line
+
+Public OptionHouse beta
+------------------------------------------------------------------------
+r482 | jnwhiteh | 2007-07-03 14:27:28 +0100 (Tue, 03 Jul 2007) | 5 lines
+
+* Never, ever, ever just copy DongleStub into a file. We don't work
that way.
+* Added DongleStub.lua from branches/Dongle-1.1 to OptionHouse
+* Added DongleStub.lua to the .toc file
+* Version numbers should be meaningful, the revision number in
the .toc is useless.. use the major version number.
+
+------------------------------------------------------------------------
+r481 | shadowed.wow | 2007-07-03 04:31:11 +0100 (Tue, 03 Jul 2007) | 1 line
+
+Not including DongleStub was probably bad.
+------------------------------------------------------------------------
+r480 | shadowed.wow | 2007-07-03 03:56:46 +0100 (Tue, 03 Jul 2007) | 1 line
+
+Cleaned up TOC data
+------------------------------------------------------------------------
+r479 | shadowed.wow | 2007-07-03 03:47:56 +0100 (Tue, 03 Jul 2007) | 1 line
+
+Fixed OptionHouse:OpenTab(id) not working, FOR REAL this time, also
fixed a typo in the error message when you try to request an unknown tab
+------------------------------------------------------------------------
+r478 | shadowed.wow | 2007-07-03 01:24:31 +0100 (Tue, 03 Jul 2007) | 3 lines
+
+Removed usage of arg1 in OH_PerfMon.lua
+Fixed a bug in OptionHouse:OpenTab(id) that was calling tabOnClick(id)
THEN createOHFrame() instead of createOHFrame() first.
+Clarified some code comments
+------------------------------------------------------------------------
+r477 | shadowed.wow | 2007-07-02 22:59:08 +0100 (Mon, 02 Jul 2007) | 1 line
+
+Fixed a bug in enable/disable all that was preventing the check boxes
from checking or unchecking.
+------------------------------------------------------------------------
+r476 | shadowed.wow | 2007-07-01 20:13:51 +0100 (Sun, 01 Jul 2007) | 1 line
+
+Fixed OptionHouse not updating correctly when a new revision is found
+------------------------------------------------------------------------
+r475 | shadowed.wow | 2007-07-01 04:06:39 +0100 (Sun, 01 Jul 2007) | 1 line
+
+Fixed the couple of remaining cases where frames didn't get hidden in
the addons tab.
+------------------------------------------------------------------------
+r474 | shadowed.wow | 2007-07-01 00:09:50 +0100 (Sun, 01 Jul 2007) | 1 line
+
+Changed sub categories tooltip to only display it if the category
itself has any sub categories and not just the addon.
+------------------------------------------------------------------------
+r473 | shadowed.wow | 2007-06-27 22:04:11 +0100 (Wed, 27 Jun 2007) | 1 line
+
+Added some quick validation to OptionHouse:OpenTab() so you can't open
one that doesn't exist.
+------------------------------------------------------------------------
+r472 | shadowed.wow | 2007-06-27 04:35:01 +0100 (Wed, 27 Jun 2007) | 4 lines
+
+Fixed sorting in management frame to actually work, also fixed sorting
going by colors not the actual title itself.
+Fixed tooltips in management
+Fixed the addon panels not showing and throwing an error
+Added OptionHouse:GetAddOnData back
+------------------------------------------------------------------------
+r471 | JoshBorke | 2007-06-27 04:14:12 +0100 (Wed, 27 Jun 2007) | 2 lines
+
+OptionHouse:
+- attempted fix for tainting stuff
+------------------------------------------------------------------------
+r470 | JoshBorke | 2007-06-26 04:54:11 +0100 (Tue, 26 Jun 2007) | 6 lines
+
+OptionHouse:
+- fix bugs introduced by Shadowed's recent changes
+- issecurevariable checks RegisterTab instead of self now
+- revert new syntax for CreateTab until shadowed fixes it better
+- check for existence of addon in OH_AddOns
+- delete trailing white spaces
+------------------------------------------------------------------------
+r469 | shadowed.wow | 2007-06-25 23:40:50 +0100 (Mon, 25 Jun 2007) | 2 lines
+
+Cleaned up code in OptionHouse.lua
+Moved the addon list in management to when you search, new addon
loaded, enabled/disabled or loaded something instead of whenever you
resort, scroll and basically anything.
+------------------------------------------------------------------------
+r468 | shadowed.wow | 2007-06-25 03:39:06 +0100 (Mon, 25 Jun 2007) | 1 line
+
+Testing validation stuff
+------------------------------------------------------------------------
+r467 | shadowed.wow | 2007-06-25 03:30:14 +0100 (Mon, 25 Jun 2007) | 1 line
+
+Added issecurevariable checking so only OptionHouse modules can
register tabs, create search inputs or get addon data.
+------------------------------------------------------------------------
+r466 | jnwhiteh | 2007-06-23 20:17:46 +0100 (Sat, 23 Jun 2007) | 2 lines
+
+* Property update on DongleStub
+
+------------------------------------------------------------------------
+r465 | jnwhiteh | 2007-06-23 20:16:29 +0100 (Sat, 23 Jun 2007) | 2 lines
+
+* Are keywords case-sensitive?
+
+------------------------------------------------------------------------
+r464 | jnwhiteh | 2007-06-23 20:16:07 +0100 (Sat, 23 Jun 2007) | 2 lines
+
+* Updated keywords to include Revision and Id (in theory)
+
+------------------------------------------------------------------------
+r463 | jnwhiteh | 2007-06-23 20:14:27 +0100 (Sat, 23 Jun 2007) | 2 lines
+
+* Added $id$ keyword
+
+------------------------------------------------------------------------
+r462 | JoshBorke | 2007-06-23 18:55:05 +0100 (Sat, 23 Jun 2007) | 2 lines
+
+OptionHouse:
+- sort addons ascending by name by default
+------------------------------------------------------------------------
+r461 | JoshBorke | 2007-06-21 23:05:20 +0100 (Thu, 21 Jun 2007) | 1 line
+
+OptionHouse: no longer have lines with extraneous whitespace
+------------------------------------------------------------------------
+r460 | shadowed.wow | 2007-06-21 22:44:09 +0100 (Thu, 21 Jun 2007) | 5 lines
+
+Josh is whiny, moved expanded categories too a separate function
called on expand/search
+Fixed a couple of callback issues due to code changes
+Added OptionHouse title too the top bar
+Frame level changed to MEDIUM for OH and HIGH for addon registered
pages, need to play around with it still
+Probably did some other things, but if I didn't remember them not
really important
+------------------------------------------------------------------------
+r459 | shadowed.wow | 2007-06-21 08:16:50 +0100 (Thu, 21 Jun 2007) | 5 lines
+
+Fixed addons tab, everything will work correctly now.
+Changed Joshs formatting, he sucks
+Changed the name for performance/management too title and not addon name
+Did some other stuff, probably not importent
+NTS: Add validation
+------------------------------------------------------------------------
+r458 | JoshBorke | 2007-06-21 03:00:37 +0100 (Thu, 21 Jun 2007) | 4 lines
+
+OptionHouse:
+- added Status to Addons
+- fixed the tabs to show properly
+- addon option handlers aren't being called
+------------------------------------------------------------------------
+r457 | shadowed.wow | 2007-06-21 01:54:06 +0100 (Thu, 21 Jun 2007) | 1 line
+
+Fixes before heading home
+------------------------------------------------------------------------
+r456 | shadowed.wow | 2007-06-21 00:27:38 +0100 (Thu, 21 Jun 2007) | 5 lines
+
+Fuck trying to manage what data I want using numbers, changed all of
the expandedCategories info to stored by keys for sanity.
+Changed the expanding code to store the data array instead of setting
4-5 variables to the button
+OptionHouse:Open("addon", "cat", "subCat") should be back and actually
working now
+Cleaned up the configuration showing code so it can be used in areas
besides when a button is clicked
+Added a tooltip to the buttons on configuration, will show
title/version/author on the configuration buttons, and will also show
sub categories count when mousing over a category.
+------------------------------------------------------------------------
+r455 | shadowed.wow | 2007-06-20 21:15:08 +0100 (Wed, 20 Jun 2007) | 1 line
+
+Renamed tabs, AddOn Configuration -> Addons, AddOn Management ->
Management, AddOn Performance -> Performance.
+------------------------------------------------------------------------
+r454 | shadowed.wow | 2007-06-20 20:12:14 +0100 (Wed, 20 Jun 2007) | 1 line
+
+Split OH off to modules, untested but it's the basic idea code-wise of
what they'll look like, making sure the APIs are actually private needs
to be done still (cause clad fails).
+------------------------------------------------------------------------
+r453 | shadowed.wow | 2007-06-20 01:44:49 +0100 (Wed, 20 Jun 2007) | 1 line
+
+Added argument passing to the registered functions, note that they
will pass "" instead of nil for sub categories if none is there for now
due to lazyness
+------------------------------------------------------------------------
+r452 | shadowed.wow | 2007-06-20 01:14:22 +0100 (Wed, 20 Jun 2007) | 1 line
+
+Added category/sub category passing to the registered functions,
probably broken but Josh is a whiner.
+------------------------------------------------------------------------
+r451 | shadowed.wow | 2007-06-19 06:09:31 +0100 (Tue, 19 Jun 2007) | 1 line
+
+Icon will be used if standalone is found, added new files for the
basic stuff, cladhaire fails at issecurevariable.
+------------------------------------------------------------------------
+r450 | shadowed.wow | 2007-06-18 19:12:17 +0100 (Mon, 18 Jun 2007) | 3 lines
+
+Stupid Mikma breaking stuff.
+
+Fixed #959 and #983 errors
+------------------------------------------------------------------------
+r449 | shadowed.wow | 2007-06-18 18:49:57 +0100 (Mon, 18 Jun 2007) | 1 line
+
+Changed to upvalue (Josh fails)
+------------------------------------------------------------------------
+r448 | shadowed.wow | 2007-06-18 18:41:05 +0100 (Mon, 18 Jun 2007) | 1 line
+
+expandedCategories changed too OptionHouseOptionsFrame.expanded,
re-used instead of re-created every time in updateConfigList().
+------------------------------------------------------------------------
+r447 | shadowed.wow | 2007-06-18 18:28:03 +0100 (Mon, 18 Jun 2007) | 1 line
+
+Cleaned up more of the code formatting, split off category sorting to
a separate function thats only ran when OptionHouseOptionFrame is
created, or when a new addon is registered.
+------------------------------------------------------------------------
+r446 | shadowed.wow | 2007-06-18 01:33:14 +0100 (Mon, 18 Jun 2007) | 1 line
+
+Title will use the one from GetAddOnInfo if nothing is registered with
OH when displaying tooltip info, also the tooltip will add the data as
it comes meaning it can show title/version even without author, or
title/author/dependencies with no version found.
+------------------------------------------------------------------------
+r445 | shadowed.wow | 2007-06-18 00:45:37 +0100 (Mon, 18 Jun 2007) | 3 lines
+
+Added OHObject:RemoveCategory( "name" ) and
OHObject:RemoveSubCategory( "parentCat", "name" ) for addons that use
profiles, eg ItemRack type of things.
+Fixed a couple of assert validation types of errors in the Register* functions.
+Fixed sorting on the category panel
+------------------------------------------------------------------------
+r444 | shadowed.wow | 2007-06-17 20:36:26 +0100 (Sun, 17 Jun 2007) | 2 lines
+
+Fixed numbers not being a valid type when passing version in RegisterAddOn
+OH was positioning frames incorrectly, they'll actually move when OH
is moved now.
+------------------------------------------------------------------------
+r443 | shadowed.wow | 2007-06-17 05:10:03 +0100 (Sun, 17 Jun 2007) | 5 lines
+
+Fixed performance sorting using mir instead of cir for cir sorting.
+Fixed a search being done on the category when only one category and
no sub categories exist
+Fixed dependencies not showing (you need to return apparently)
+Added : after Option House in ENTERED_COMBAT, forgot to.
+Cleaned up some of the loops for sorting creation
+------------------------------------------------------------------------
+r442 | jnwhiteh | 2007-06-17 04:30:34 +0100 (Sun, 17 Jun 2007) | 2 lines
+
+* Removing the local copy of DongleStub.lua
+
+------------------------------------------------------------------------
+r441 | shadowed.wow | 2007-06-17 03:15:36 +0100 (Sun, 17 Jun 2007) | 1 line
+
+Removed the portrait and replaced it with the characters since embeds
can't use TGAs because authors are more bitchy then users
+------------------------------------------------------------------------
+r440 | shadowed.wow | 2007-06-17 01:02:06 +0100 (Sun, 17 Jun 2007) | 3 lines
+
+Added sorting to the management frame, can sort by status or name,
fixed a couple of reasons not displaying, cleaned up the color code too.
+The reason text will move to the position "Load" is if it's not a LoD addon.
+Added dependencies to the tooltip on addon management
+------------------------------------------------------------------------
+r439 | tekkub | 2007-06-16 19:36:41 +0100 (Sat, 16 Jun 2007) | 1 line
+
+Moving OptionHouse to trunk
+------------------------------------------------------------------------
+r438 | shadowed.wow | 2007-06-16 07:00:20 +0100 (Sat, 16 Jun 2007) | 3 lines
+
+Fixed size validation, positioning will work now it was off by around
105 y, OH will now force the OptionHouseOptionsFrame to be the parent
of configuration frames
+Fixed OH not getting any data from addons that are registered with it
in the management page
+Management page is broken since it doesn't fully implement all the
reasons (Damn Tekkub)
+------------------------------------------------------------------------
+r437 | shadowed.wow | 2007-06-16 02:11:06 +0100 (Sat, 16 Jun 2007) | 1 line
+
+Fixed size tests, height was being changed if it was > 305 instead of
630, and width was being changed if it was > 630 instead of 305.
+------------------------------------------------------------------------
+r436 | shadowed.wow | 2007-06-16 00:22:33 +0100 (Sat, 16 Jun 2007) | 1 line
+
+Changed this -> self, anything thats broken is Tekkubs fault.
+------------------------------------------------------------------------
+r435 | shadowed.wow | 2007-06-16 00:10:53 +0100 (Sat, 16 Jun 2007) | 1 line
+
+Bumped major to OptionHouse-1.0, pray and hope we never need to change
the API.
+------------------------------------------------------------------------
+r434 | shadowed.wow | 2007-06-16 00:01:53 +0100 (Sat, 16 Jun 2007) | 1 line
+
+Fixed major number, OptionHouse-Alpha0.1 now
+------------------------------------------------------------------------
+r433 | shadowed.wow | 2007-06-15 23:56:27 +0100 (Fri, 15 Jun 2007) | 1 line
+
+Fixed the open configuration panel not hiding when switching tabs
+------------------------------------------------------------------------
+r432 | tekkub | 2007-06-15 23:52:45 +0100 (Fri, 15 Jun 2007) | 1 line
+
+OptionHouse - KB --> KiB, MB --> MiB
+------------------------------------------------------------------------
+r431 | shadowed.wow | 2007-06-15 23:23:49 +0100 (Fri, 15 Jun 2007) | 3 lines
+
+Added OptionHouse:OpenTab( 1-3 ) (1 config/2 manage/3 perf)
+/oh will accept arguments, meaning you can do /oh SSPVP to open the
SSPVP category, or /oh Panda to open the Panda category.
+Removed the tabOnClick calls in createOHFrame moved them to
OptionHouse:Open() and OptionHouse:OpenTab()
+------------------------------------------------------------------------
+r430 | shadowed.wow | 2007-06-15 23:06:09 +0100 (Fri, 15 Jun 2007) | 1 line
+
+In theory, you can now do OptionHouse:Open( [addon][, category][,
subcategory] ) to specify what configuration is shown at the start.
+------------------------------------------------------------------------
+r429 | shadowed.wow | 2007-06-15 22:42:29 +0100 (Fri, 15 Jun 2007) | 1 line
+
+Changed major to OptionHouse-Alpha0.1
+------------------------------------------------------------------------
+r428 | shadowed.wow | 2007-06-15 21:28:26 +0100 (Fri, 15 Jun 2007) | 1 line
+
+Not needed anymore
+------------------------------------------------------------------------
+r427 | shadowed.wow | 2007-06-15 21:28:07 +0100 (Fri, 15 Jun 2007) | 2 lines
+
+Fixed enable check box for ms.whiny mc whine pants
+Fixed a couple lines of code and changed the formatting used for some
of them.
+------------------------------------------------------------------------
+r426 | shadowed.wow | 2007-06-15 02:53:24 +0100 (Fri, 15 Jun 2007) | 1 line
+
+Auto-frame positioning will only happen if GetPoint() returns nil,
also changed the frame size setting too only happen if it's wider then
630 or higher then 305, or if the current width and/or height are 0.
+------------------------------------------------------------------------
+r425 | shadowed.wow | 2007-06-15 02:09:33 +0100 (Fri, 15 Jun 2007) | 3 lines
+
+Fixed the addon configuration page, made it sort the addons by alpha,
the category listing will reset when you change panels too.
+Added in default positioning (TOPLEFT, 190, -103) and height/width (630/305)
+Cleaned up the configuration code and fixed a few bugs in the search
+------------------------------------------------------------------------
+r424 | shadowed.wow | 2007-06-14 23:53:48 +0100 (Thu, 14 Jun 2007) | 2 lines
+
+Performance/management pages will work, management will register
ADDON_LOADED now too, you can mouseover addons in management to view
the full title/version/author, will make it support the OH title also
if it exists.
+Options broken, will deal with later
+------------------------------------------------------------------------
+r423 | shadowed.wow | 2007-06-14 09:14:12 +0100 (Thu, 14 Jun 2007) | 4 lines
+
+Renamed OptionHouse.lua-bk to lazy too right click and choose which
editor to open it in.
+
+Pulled OptionHouse.lua into an embed and also cleaned up all the
code/functions/naming, still a couple of things need to be done like
adding a tooltip for the management page, and actually test everything
but the actual code is all implemented, normalized and ready to go.
+Category will reset when you change tabs and is also sorted in alpha order
+------------------------------------------------------------------------
+r422 | shadowed.wow | 2007-06-14 03:44:25 +0100 (Thu, 14 Jun 2007) | 2 lines
+
+Moved the actual OH code to OptionHouse.lua-bk for grabbing code to
move to the "final" code base.
+Figuring out how I managed to fuck up $Revision$
+------------------------------------------------------------------------
+r421 | shadowed.wow | 2007-06-12 04:40:57 +0100 (Tue, 12 Jun 2007) | 2 lines
+
+Added searching, will filter by addon/category/subcategory on the
configuration panel and name on the management/performance page. Used
hack method for management page due to Tekkubs crazy-ass code.
+Fixed an error when a frame is added with OH being shown.
+------------------------------------------------------------------------
+r420 | shadowed.wow | 2007-06-09 05:03:16 +0100 (Sat, 09 Jun 2007) | 1 line
+
+Changed positioning of performance stuff slightly
+------------------------------------------------------------------------
+r419 | shadowed.wow | 2007-06-08 23:07:18 +0100 (Fri, 08 Jun 2007) | 3 lines
+
+Removed the usage of AddonPage.lua and DongleFrames.lua as they were
only used for examples (and lord cladhaire is whiny).
+Added CPU per second (position needs checking)
+Fixed unloaded addons showing
+------------------------------------------------------------------------
+r418 | tekkub | 2007-06-08 20:48:00 +0100 (Fri, 08 Jun 2007) | 1 line
+
+OptionHouse - Another round of getglobal/blah:GetName() removals...
next up: removing frame names that aren't needed (stop cluttering the
global namespace with frame names!)
+------------------------------------------------------------------------
+r417 | tekkub | 2007-06-07 21:32:41 +0100 (Thu, 07 Jun 2007) | 3 lines
+
+OptionHouse
+- Fixed tab selection (again :P)
+- Removed some unneeded calls to getglobal and frame:GetName()
+------------------------------------------------------------------------
+r416 | tekkub | 2007-06-07 21:18:41 +0100 (Thu, 07 Jun 2007) | 1 line
+
+OptionHouse - Fixed parenting of the sample config frames so they hide
on tab changes
+------------------------------------------------------------------------
+r415 | shadowed.wow | 2007-06-07 20:29:21 +0100 (Thu, 07 Jun 2007) | 2 lines
+
+Added memory per second to the performance tab, also made it update
once a second while the frame is open for CPU/Memory/MiR updating.
+You can now sort all of the columns due to lord cladhaires request.
+------------------------------------------------------------------------
+r414 | shadowed.wow | 2007-06-07 09:06:58 +0100 (Thu, 07 Jun 2007) | 3 lines
+
+Category selection will work completely now including when an addon
only has one category and no subcategories registered
+Added in the performance page, will sort by highest memory when CPU
profiling is disabled, and highest memory + CPU when it's on
+Changed the metadata grabbing for management and performance to also
check the list of registered addons for getting author and version data
+------------------------------------------------------------------------
+r413 | shadowed.wow | 2007-06-07 07:27:05 +0100 (Thu, 07 Jun 2007) | 3 lines
+
+Switched category selection back too text detection not ids since it's
easier to detect whats open/closed
+Improved the Filter_UpdateList code, it'll actually work now with
setting a function and/or handler
+Added noCache argument to RegisterSubCategory and RegisterCategory for
lord Thrae, when you pass the noCache flag it wont save the frame and
will call the function and/or handler everytime.
+------------------------------------------------------------------------
+r412 | tekkub | 2007-06-07 01:57:41 +0100 (Thu, 07 Jun 2007) | 1 line
+
+OptionHouse - Nudging scroll bar a tad to close gaps
+------------------------------------------------------------------------
+r411 | tekkub | 2007-06-07 01:43:19 +0100 (Thu, 07 Jun 2007) | 1 line
+
+OptionHouse - Oh look, I found the background texture for scroll
bars... why doesn't FSF use this?
+------------------------------------------------------------------------
+r410 | tekkub | 2007-06-07 01:05:31 +0100 (Thu, 07 Jun 2007) | 1 line
+
+OptionHouse - Added ESC menu button
+------------------------------------------------------------------------
+r409 | tekkub | 2007-06-06 20:22:02 +0100 (Wed, 06 Jun 2007) | 1 line
+
+OptionHouse - It might be fake, but it scrolls!
+------------------------------------------------------------------------
+r408 | tekkub | 2007-06-06 09:12:48 +0100 (Wed, 06 Jun 2007) | 1 line
+
+OptionHouse - Reworked title fontstrings to prevent wrapping/overflow,
but still use as much space as is available
+------------------------------------------------------------------------
+r407 | tekkub | 2007-06-06 07:08:40 +0100 (Wed, 06 Jun 2007) | 1 line
+
+OptionHouse - Let's not clutter up the global namespace with frames
+------------------------------------------------------------------------
+r406 | tekkub | 2007-06-06 05:32:00 +0100 (Wed, 06 Jun 2007) | 1 line
+
+OptionHouse - Enable/disable all buttons added
+------------------------------------------------------------------------
+r405 | tekkub | 2007-06-06 04:47:18 +0100 (Wed, 06 Jun 2007) | 4 lines
+
+OptionHouse
+- Color addon name for some cases (LoD, Disabled, Error)
+- Checkbox now enable/disables
+- Added reloadui button
+------------------------------------------------------------------------
+r404 | tekkub | 2007-06-06 04:06:07 +0100 (Wed, 06 Jun 2007) | 1 line
+
+OptionHouse - Management tab now shows real data, but doesn't scroll
or enable/disable yet
+------------------------------------------------------------------------
+r403 | tekkub | 2007-06-06 02:39:29 +0100 (Wed, 06 Jun 2007) | 1 line
+
+OptionHouse - Oh look, the tabs actually do something now.
+------------------------------------------------------------------------
+r402 | tekkub | 2007-06-05 20:18:09 +0100 (Tue, 05 Jun 2007) | 1 line
+
+OptionHouse - Only register sample addons on first load
+------------------------------------------------------------------------
+r401 | tekkub | 2007-06-05 20:11:46 +0100 (Tue, 05 Jun 2007) | 1 line
+
+OptionHouse - More tab stuff, why were we calling
getglobal(frame:GetName()... when we know the frame's name is a constant?
+------------------------------------------------------------------------
+r400 | tekkub | 2007-06-05 19:27:32 +0100 (Tue, 05 Jun 2007) | 1 line
+
+OptionHouse - Fixing tab selection on first open
+------------------------------------------------------------------------
+r399 | jnwhiteh | 2007-06-05 11:49:43 +0100 (Tue, 05 Jun 2007) | 3 lines
+
+* Moved Dongle-1.1 from trunk to branches
+* Moved Dongle-2.0 from branches to trunk
+
+------------------------------------------------------------------------
+r398 | shadowed.wow | 2007-06-05 08:05:22 +0100 (Tue, 05 Jun 2007) | 3 lines
+
+Added in OptionHouse:RegisterAddOn, addonObj:RegisterCategory,
addonObj:RegisterSubCategory. RegisterAddOn will return an addonObj
that can be used for the category and sub category registering,
currently the filters page will support this but they don't actually
call the frames functions yet, have to work out a solution to figure
out what function/handler to call.
+
+Moved DongleFrames/AddonPage to load before OptionHouse, also modified
AddonPage to use the Register* functions as an example.
+------------------------------------------------------------------------
+r397 | jnwhiteh | 2007-06-04 22:15:16 +0100 (Mon, 04 Jun 2007) | 2 lines
+
+* Updating major revision in trunk
+
+------------------------------------------------------------------------
+r396 | jnwhiteh | 2007-06-04 22:14:33 +0100 (Mon, 04 Jun 2007) | 2 lines
+
+* Updated major revision string
+
+------------------------------------------------------------------------
+r395 | jnwhiteh | 2007-06-04 02:46:06 +0100 (Mon, 04 Jun 2007) | 2 lines
+
+* Tagging 1.1-RC1
+
+------------------------------------------------------------------------
+r394 | jnwhiteh | 2007-06-04 02:44:57 +0100 (Mon, 04 Jun 2007) | 2 lines
+
+* Creating a directory for 1.1 Release Candidates
+
+------------------------------------------------------------------------
+r393 | shadowed.wow | 2007-05-31 18:52:44 +0100 (Thu, 31 May 2007) | 1 line
+
+Silly Tekkub, "OptionHouseFrame" not "OptionsHouseFrame"
+------------------------------------------------------------------------
+r392 | tekkub | 2007-05-31 07:37:45 +0100 (Thu, 31 May 2007) | 1 line
+
+OptionHouse - ESC is a good thing
+------------------------------------------------------------------------
+r391 | tekkub | 2007-05-31 03:02:33 +0100 (Thu, 31 May 2007) | 1 line
+
+Renaming OptionsHouse >> OptionHouse, part 2
+------------------------------------------------------------------------
+r390 | tekkub | 2007-05-31 03:01:19 +0100 (Thu, 31 May 2007) | 1 line
+
+Renaming OptionsHouse >> OptionHouse, part 1
+------------------------------------------------------------------------
+r389 | tekkub | 2007-05-31 02:58:53 +0100 (Thu, 31 May 2007) | 1 line
+
+OptionHouse - Adding sample config frame generator
+------------------------------------------------------------------------
+r388 | jnwhiteh | 2007-05-30 12:16:38 +0100 (Wed, 30 May 2007) | 2 lines
+
+* Comment out a bad line, so we don't error for right now.
+
+------------------------------------------------------------------------
+r387 | jnwhiteh | 2007-05-30 11:58:30 +0100 (Wed, 30 May 2007) | 2 lines
+
+* Added Mikk's portrait texture
+
+------------------------------------------------------------------------
+r386 | shadowed.wow | 2007-05-30 07:00:50 +0100 (Wed, 30 May 2007) | 3 lines
+
+Modifying buttons in LUA sucks.
+
+Changed text positioning so it's aligned to the left, text is moved
over to the right by 8px for categories, and 20px for sub-categories,
also moved some code around.
+------------------------------------------------------------------------
+r385 | shadowed.wow | 2007-05-30 06:50:14 +0100 (Wed, 30 May 2007) | 1 line
+
+Changed left-sided-quest-thing-that-we-need-a-name-for to use IDs
instead of text.
+------------------------------------------------------------------------
+r384 | shadowed.wow | 2007-05-30 03:01:02 +0100 (Wed, 30 May 2007) | 1 line
+
+Reverted sub-category count showing up next to name, fixed a couple of
positionings, and also removed local oh = frame because clad is silly.
+------------------------------------------------------------------------
+r383 | shadowed.wow | 2007-05-30 02:45:37 +0100 (Wed, 30 May 2007) | 1 line
+
+Added number of sub categories if any next to the categories name.
+------------------------------------------------------------------------
+r382 | shadowed.wow | 2007-05-30 02:27:57 +0100 (Wed, 30 May 2007) | 1 line
+
+Added scroll frame support, go to SSPVP -> Join for an example of the
scroll frame.
+------------------------------------------------------------------------
+r381 | shadowed.wow | 2007-05-30 01:02:15 +0100 (Wed, 30 May 2007) | 4 lines
+
+Changed local name to "OptionsHouseFrame" for consistency with all the
object naming.
+Added filters in, hack example code, because they work like the AH
filters you can have as many categories as you want per an addon, but
only one sub-category.
+Added a quick example table of an addon just to make the example
actually work.
+Moved frame to a local of OptionsHouse.lua instead of
makeOptionsFrame, since the filter and tab stuff needs the frame object.
+------------------------------------------------------------------------
+r380 | jnwhiteh | 2007-05-29 23:39:15 +0100 (Tue, 29 May 2007) | 2 lines
+
+* I'm lazy, use the player portait texture until I can bribe Mikk
+
+------------------------------------------------------------------------
+r379 | jnwhiteh | 2007-05-29 23:34:43 +0100 (Tue, 29 May 2007) | 4 lines
+
+* Frame is now draggable and clamped to screen
+* Only the title bar is draggable, may be off by a few pixels, feel
free to adjust
+* Added slash command /oh for dev, cause I'm lazy
+
+------------------------------------------------------------------------
+r378 | jnwhiteh | 2007-05-29 23:09:50 +0100 (Tue, 29 May 2007) | 2 lines
+
+* Frame will only be shown when you use the /opthouse slash command
+
+------------------------------------------------------------------------
+r377 | shadowed.wow | 2007-05-29 04:29:29 +0100 (Tue, 29 May 2007) | 4 lines
+
+Fixed tabs so they'll actually resize too the text.
+Also moved the tabs name from "OptionsHouseTabX"
to "OptionsHouseFrameTabX" because the old naming was causing issues
when using the PanelTemplates_* functions, tabs should function like
they do on the auction house UI now.
+
+Renamed the "Enable/Disable Addon" tab to "Addon Management" to be
more consistant with the other ones, and because it makes more sense.
+------------------------------------------------------------------------
+r376 | jnwhiteh | 2007-05-29 03:26:44 +0100 (Tue, 29 May 2007) | 2 lines
+
+* Added .toc and .lua for initial OptionsHouse work
+
+------------------------------------------------------------------------
+r375 | jnwhiteh | 2007-05-29 03:25:40 +0100 (Tue, 29 May 2007) | 2 lines
+
+* Branch for OH work
+
+------------------------------------------------------------------------
+r374 | jnwhiteh | 2007-05-23 01:47:24 +0100 (Wed, 23 May 2007) | 2 lines
+
+* .toc update for 2.1.0
+
+------------------------------------------------------------------------
+r373 | jnwhiteh | 2007-05-23 01:46:28 +0100 (Wed, 23 May 2007) | 2 lines
+
+* .toc update for 2.1.0
+
+------------------------------------------------------------------------
+r372 | jnwhiteh | 2007-05-22 23:07:00 +0100 (Tue, 22 May 2007) | 2 lines
+
+* Tagging Dongle-1.0-r871
+
+------------------------------------------------------------------------
+r371 | jnwhiteh | 2007-05-22 23:03:50 +0100 (Tue, 22 May 2007) | 2 lines
+
+* Index profileKeys correctly, since its in the sv instead of the db
+
+------------------------------------------------------------------------
+r370 | jnwhiteh | 2007-05-22 23:01:12 +0100 (Tue, 22 May 2007) | 2 lines
+
+* Fixing an issue where profile selections will not persist across sessions
+
+------------------------------------------------------------------------
+r369 | jnwhiteh | 2007-05-22 22:56:36 +0100 (Tue, 22 May 2007) | 2 lines
+
+* Fix an issue where profile selections aren't persisting across sessions
+
+------------------------------------------------------------------------
+r368 | tekkub | 2007-05-22 03:37:00 +0100 (Tue, 22 May 2007) | 1 line
+
+Rename the tag subdirs, adding one for 1.0-RC's
+------------------------------------------------------------------------
+r367 | jnwhiteh | 2007-05-21 23:15:51 +0100 (Mon, 21 May 2007) | 2 lines
+
+* Initial conversion of Dongle-2.0 to using the lunit test framework
+
+------------------------------------------------------------------------
+r366 | jnwhiteh | 2007-05-21 22:46:01 +0100 (Mon, 21 May 2007) | 2 lines
+
+* Renaming the initial Dongle-1.0 tag to be consistent with the rest
of the releases.
+
+------------------------------------------------------------------------
+r365 | tekkub | 2007-05-21 22:39:51 +0100 (Mon, 21 May 2007) | 1 line
+
+Moving Alphas and Betas to subdirectories
+------------------------------------------------------------------------
+r364 | jnwhiteh | 2007-05-20 19:54:24 +0100 (Sun, 20 May 2007) | 2 lines
+
+* Tagging Dongle-1.0-r863 to fix upgrade issues.
+
+------------------------------------------------------------------------
+r363 | jnwhiteh | 2007-05-20 19:52:10 +0100 (Sun, 20 May 2007) | 2 lines
+
+* Stop using methods that are in Dongle-2.0. Thanks.
+
+------------------------------------------------------------------------
+r362 | jnwhiteh | 2007-05-20 19:50:56 +0100 (Sun, 20 May 2007) | 2 lines
+
+* Stab me in the face, please.
+
+------------------------------------------------------------------------
+r361 | jnwhiteh | 2007-05-20 19:46:02 +0100 (Sun, 20 May 2007) | 2 lines
+
+* Tagging 1.0 fix for all the issues reported to-date.
+
+------------------------------------------------------------------------
+r360 | jnwhiteh | 2007-05-20 19:44:28 +0100 (Sun, 20 May 2007) | 2 lines
+
+* Nuke any old deactivate functions as we upgrade, to avoid issues
+
+------------------------------------------------------------------------
+r359 | jnwhiteh | 2007-05-20 19:42:50 +0100 (Sun, 20 May 2007) | 2 lines
+
+* Removing stale version
+
+------------------------------------------------------------------------
+r358 | jnwhiteh | 2007-05-20 19:42:38 +0100 (Sun, 20 May 2007) | 2 lines
+
+* Removing stale version
+
+------------------------------------------------------------------------
+r357 | jnwhiteh | 2007-05-20 18:23:13 +0100 (Sun, 20 May 2007) | 2 lines
+
+Cleanup
+
+------------------------------------------------------------------------
+r356 | jnwhiteh | 2007-05-20 18:23:03 +0100 (Sun, 20 May 2007) | 2 lines
+
+Cleanup
+
+------------------------------------------------------------------------
+r355 | jnwhiteh | 2007-05-20 18:22:02 +0100 (Sun, 20 May 2007) | 2 lines
+
+Tagging Dongle-1.0-r853
+
+------------------------------------------------------------------------
+r354 | jnwhiteh | 2007-05-20 18:17:31 +0100 (Sun, 20 May 2007) | 2 lines
+
+* Tagging r853 to branches for testing
+
+------------------------------------------------------------------------
+r353 | jnwhiteh | 2007-05-20 18:15:20 +0100 (Sun, 20 May 2007) | 2 lines
+
+* Move the lookup table check before the registrations
+
+------------------------------------------------------------------------
+r352 | jnwhiteh | 2007-05-20 18:10:25 +0100 (Sun, 20 May 2007) | 2 lines
+
+Tagging for haste test
+
+------------------------------------------------------------------------
+r351 | jnwhiteh | 2007-05-20 18:07:53 +0100 (Sun, 20 May 2007) | 2 lines
+
+* Ensure that the Dongle instance is always in the lookup table.
+
+------------------------------------------------------------------------
+r350 | jnwhiteh | 2007-05-20 15:15:58 +0100 (Sun, 20 May 2007) | 2 lines
+
+* Tagging Dongle-1.0-r849 for release
+
+------------------------------------------------------------------------
+r349 | jnwhiteh | 2007-05-20 15:13:08 +0100 (Sun, 20 May 2007) | 2 lines
+
+* Updated the activate function to resolve the activation issue we
have seen
+
+------------------------------------------------------------------------
+r348 | jnwhiteh | 2007-05-16 03:27:26 +0100 (Wed, 16 May 2007) | 5 lines
+
+* Added shortcut for debugstack
+* Added a lua based definition of strjoin
+* Added a global argcheck() to the build environment, for testing purposes
+* Tested to ensure that errors are properly thrown by argcheck()
+
+------------------------------------------------------------------------
+r347 | jnwhiteh | 2007-05-15 01:19:58 +0100 (Tue, 15 May 2007) | 2 lines
+
+* Reverting rev num hack, since 1.1 hasn't been released yet
+
+------------------------------------------------------------------------
+r346 | jnwhiteh | 2007-05-15 01:18:12 +0100 (Tue, 15 May 2007) | 3 lines
+
+* Attempt to fix the triple-upgrade issue, in Dongle-1.0 branch.
+* Added code to increment the revision number + 500, to ensure things
load properly due to a versioning issue.
+
+------------------------------------------------------------------------
+r345 | jnwhiteh | 2007-05-15 00:59:26 +0100 (Tue, 15 May 2007) | 3 lines
+
+* Artificially inflate the revision number by 500, to ensure we load
in the right order.
+* Attempt to fix the triple upgrade bug by removing all of that logic
from Activate, and removing the Deactivate function
+
+------------------------------------------------------------------------
+r344 | jnwhiteh | 2007-05-12 17:06:29 +0100 (Sat, 12 May 2007) | 2 lines
+
+Premature tag
+
+------------------------------------------------------------------------
+r343 | jnwhiteh | 2007-05-12 16:54:47 +0100 (Sat, 12 May 2007) | 2 lines
+
+Tagging Dongle-1.1-r342
+
+------------------------------------------------------------------------
+r342 | jnwhiteh | 2007-05-12 16:47:33 +0100 (Sat, 12 May 2007) | 2 lines
+
+* Removing old code that leaked a global
+
+------------------------------------------------------------------------
+r341 | jnwhiteh | 2007-05-12 16:28:13 +0100 (Sat, 12 May 2007) | 2 lines
+
+* Fixing a bug in the Dongle upgrade process. This fix only exists in
Dongle-1.1 and beyond
+
+------------------------------------------------------------------------
+r340 | jnwhiteh | 2007-05-02 04:06:06 +0100 (Wed, 02 May 2007) | 2 lines
+
+Altered output of unit tests slightly, so its clear what file they
correpsond to
+
+------------------------------------------------------------------------
+r339 | jnwhiteh | 2007-05-02 04:04:15 +0100 (Wed, 02 May 2007) | 2 lines
+
+Fixed an issue with root level detection on unix machines
+
+------------------------------------------------------------------------
+r338 | jnwhiteh | 2007-05-02 03:59:57 +0100 (Wed, 02 May 2007) | 1 line
+
+Initial import of 2.0 development branch
+------------------------------------------------------------------------
+r337 | jnwhiteh | 2007-05-02 03:58:48 +0100 (Wed, 02 May 2007) | 1 line
+
+Creating 2.0 branch for development
+------------------------------------------------------------------------
+r336 | evlogimenos | 2007-04-29 18:56:01 +0100 (Sun, 29 Apr 2007) | 1 line
+
+Add DongleTimer.
+------------------------------------------------------------------------
+r335 | evlogimenos | 2007-04-29 18:55:54 +0100 (Sun, 29 Apr 2007) | 1 line
+
+Add unit test for DongleTimer.
+------------------------------------------------------------------------
+r334 | evlogimenos | 2007-04-29 18:54:51 +0100 (Sun, 29 Apr 2007) | 2 lines
+
+Branch DongleUnitTests-1.0 to match Dongle-1.0
+
+------------------------------------------------------------------------
+r333 | evlogimenos | 2007-04-29 18:53:40 +0100 (Sun, 29 Apr 2007) | 2 lines
+
+Branch Dongle-1.0
+
+------------------------------------------------------------------------
+r332 | evlogimenos | 2007-04-29 18:52:17 +0100 (Sun, 29 Apr 2007) | 2 lines
+
+Delete premature branch.
+
+------------------------------------------------------------------------
+r331 | evlogimenos | 2007-04-29 18:41:39 +0100 (Sun, 29 Apr 2007) | 1 line
+
+Update the test to match the error string returned.
+------------------------------------------------------------------------
+r330 | evlogimenos | 2007-04-29 17:04:36 +0100 (Sun, 29 Apr 2007) | 1 line
+
+Make tab into a space inside the error text.
+------------------------------------------------------------------------
+r329 | evlogimenos | 2007-04-29 16:59:12 +0100 (Sun, 29 Apr 2007) | 1 line
+
+Add 08DongleError to the mix as well.
+------------------------------------------------------------------------
+r328 | evlogimenos | 2007-04-29 16:58:45 +0100 (Sun, 29 Apr 2007) | 1 line
+
+Change expected error message to match the actual one returned.
+------------------------------------------------------------------------
+r327 | evlogimenos | 2007-04-29 16:58:13 +0100 (Sun, 29 Apr 2007) | 1 line
+
+Change text to have only 1 space after the full stop.
+------------------------------------------------------------------------
+r326 | evlogimenos | 2007-04-29 15:41:12 +0100 (Sun, 29 Apr 2007) | 1 line
+
+Convert spaces to tabs.
+------------------------------------------------------------------------
+r325 | jnwhiteh | 2007-04-28 02:48:43 +0100 (Sat, 28 Apr 2007) | 2 lines
+
+Tagged Dongle-1.0-r324
+
+------------------------------------------------------------------------
+r324 | jnwhiteh | 2007-04-28 02:45:47 +0100 (Sat, 28 Apr 2007) | 1 line
+
+* Added a DongleDBObject:GetCurrentProfile() function which returns
the current profile key.
+------------------------------------------------------------------------
+r323 | jnwhiteh | 2007-04-28 02:45:15 +0100 (Sat, 28 Apr 2007) | 2 lines
+
+* Added a DongleDBObject:GetCurrentProfile() function, which returns
the current profile key
+
+------------------------------------------------------------------------
+r322 | jnwhiteh | 2007-04-25 02:35:54 +0100 (Wed, 25 Apr 2007) | 1 line
+
+* Updated the build script to use remote repository when running the
build process. Damn svk.
+------------------------------------------------------------------------
+r321 | jnwhiteh | 2007-04-25 02:34:34 +0100 (Wed, 25 Apr 2007) | 2 lines
+
+* Tagged Dongle-1.0-r320
+
+------------------------------------------------------------------------
+r320 | jnwhiteh | 2007-04-25 02:13:47 +0100 (Wed, 25 Apr 2007) | 1 line
+
+* Added a test for the :HasModule nil index issue.
+------------------------------------------------------------------------
+r319 | jnwhiteh | 2007-04-25 02:10:13 +0100 (Wed, 25 Apr 2007) | 1 line
+
+* Fixed an issue where :HasModule() would error when called on a
Dongle with no modules
+------------------------------------------------------------------------
+r318 | jnwhiteh | 2007-04-20 04:02:15 +0100 (Fri, 20 Apr 2007) | 2 lines
+
+* Updated database tests to include testing of the ["*"] key.
+
+------------------------------------------------------------------------
+r317 | jnwhiteh | 2007-04-20 04:01:56 +0100 (Fri, 20 Apr 2007) | 2 lines
+
+* Fixed a few issues with the magic ["*"] database key, where defaults
were not being set, or removed properly
+
+------------------------------------------------------------------------
+r316 | jnwhiteh | 2007-04-18 23:43:15 +0100 (Wed, 18 Apr 2007) | 2 lines
+
+Tagging Dongle-1.0-r315 to fix an issue with ClearDBDefaults()
+
+------------------------------------------------------------------------
+r315 | jnwhiteh | 2007-04-18 23:35:03 +0100 (Wed, 18 Apr 2007) | 2 lines
+
+* Fix to ClearDBDefaults() to prevent any errors at logout
+
+------------------------------------------------------------------------
+r314 | jnwhiteh | 2007-04-18 07:22:21 +0100 (Wed, 18 Apr 2007) | 2 lines
+
+Tagging Dongle-1.0-r313. Non critical, but fixes a bug in DongleStub
logging mechanism.
+
+------------------------------------------------------------------------
+r313 | jnwhiteh | 2007-04-18 07:20:27 +0100 (Wed, 18 Apr 2007) | 2 lines
+
+* Fixed an issue in DongleStub where the logs would show the incorrect
deactivate minor version
+
+------------------------------------------------------------------------
+r312 | jnwhiteh | 2007-04-18 07:13:10 +0100 (Wed, 18 Apr 2007) | 2 lines
+
+* Tagging Dongle-1.0-r311
+
+------------------------------------------------------------------------
+r311 | jnwhiteh | 2007-04-18 07:06:22 +0100 (Wed, 18 Apr 2007) | 3 lines
+
+* Ensure that if sv.profiles doesn't exist when a database is
initialized, that its created when its accessed through db.profiles
+* Bugfix to resolve an issue with Clique on a fresh install
+
+------------------------------------------------------------------------
+r310 | jnwhiteh | 2007-04-15 21:44:53 +0100 (Sun, 15 Apr 2007) | 3 lines
+
+* Tagged Dongle-1.0-r309
+* Minor improvement to argcheck()
+
+------------------------------------------------------------------------
+r309 | jnwhiteh | 2007-04-15 21:43:27 +0100 (Sun, 15 Apr 2007) | 2 lines
+
+* Fixed line numbering issues in the error tests
+
+------------------------------------------------------------------------
+r308 | jnwhiteh | 2007-04-15 18:38:23 +0100 (Sun, 15 Apr 2007) | 2 lines
+
+* Updated argcheck in unit test.
+
+------------------------------------------------------------------------
+r307 | jnwhiteh | 2007-04-15 18:32:31 +0100 (Sun, 15 Apr 2007) | 2 lines
+
+* Resolved an error in argcheck, and changed the assertion to avoid
running string.format() when there's no argument error
+
+------------------------------------------------------------------------
+r306 | jnwhiteh | 2007-04-13 02:35:40 +0100 (Fri, 13 Apr 2007) | 2 lines
+
+Copying Dongle-1.0 to branches for support development
+
+------------------------------------------------------------------------
+r305 | jnwhiteh | 2007-04-13 02:34:31 +0100 (Fri, 13 Apr 2007) | 2 lines
+
+Tagging Dongle-1.0 release
+
+------------------------------------------------------------------------
+r304 | jnwhiteh | 2007-04-13 02:26:24 +0100 (Fri, 13 Apr 2007) | 2 lines
+
+* Updated unit tests
+
+------------------------------------------------------------------------
+r303 | jnwhiteh | 2007-04-11 22:46:56 +0100 (Wed, 11 Apr 2007) | 3 lines
+
+* Ensure we don't run any :Enable() code before PLAYER_ENTERING_WORLD.
+* Fixed a bug introduced with my LoD revamp.
+
+------------------------------------------------------------------------
+r302 | jnwhiteh | 2007-04-11 22:08:06 +0100 (Wed, 11 Apr 2007) | 3 lines
+
+* Changed default profile key to "CharName - ServerName" in order to
be more readable in other locales
+* Changed the class specific profile key to be the second return from
UnitClass(), so its localised.
+
+------------------------------------------------------------------------
+r301 | jnwhiteh | 2007-04-10 02:17:49 +0100 (Tue, 10 Apr 2007) | 2 lines
+
+* Dongle is now load on demand. This shouldn't make a difference, but
may be more convenient for development.
+
+------------------------------------------------------------------------
+r300 | jnwhiteh | 2007-04-10 02:17:01 +0100 (Tue, 10 Apr 2007) | 3 lines
+
+* Altered the ADDON_LOADED handler. If Dongle is loaded _after_
PLAYER_ENTERING_WORLD, we check for IsLoggedIn() or ChatFrame1.defaultLanguage.
+* Anything in the loadqueue is initialized, then when the queue is
empty, if we're past P_E_W, all addons in the loadorder queue are :Enabled().
+
+------------------------------------------------------------------------
+r299 | jnwhiteh | 2007-04-10 01:18:32 +0100 (Tue, 10 Apr 2007) | 2 lines
+
+* Added code to ADDON_LOADED handler to detect if Dongle is loading
after PLAYER_ENTERING_WORLD.
+
+------------------------------------------------------------------------
+r298 | jnwhiteh | 2007-04-09 01:41:33 +0100 (Mon, 09 Apr 2007) | 2 lines
+
+* Updates for DongleDB changes, and stray PrintF changes.
+
+------------------------------------------------------------------------
+r297 | jnwhiteh | 2007-04-09 01:41:13 +0100 (Mon, 09 Apr 2007) | 3 lines
+
+* :InitializeDB() now tables a table as the first argument, as well as
a global name
+* Namespaces no longer have the .SetProfile() method.
+
+------------------------------------------------------------------------
+r296 | jnwhiteh | 2007-04-07 00:19:30 +0100 (Sat, 07 Apr 2007) | 2 lines
+
+* Fixed an issue with printFHelp from the Echo/EchoF change.
+
+------------------------------------------------------------------------
+r295 | jnwhiteh | 2007-04-06 18:09:40 +0100 (Fri, 06 Apr 2007) | 2 lines
+
+Tagging Dongle-1.0-RC3
+
+------------------------------------------------------------------------
+r294 | jnwhiteh | 2007-04-06 18:07:33 +0100 (Fri, 06 Apr 2007) | 2 lines
+
+* Updated unit tests for Dongle-1.0-RC3
+
+------------------------------------------------------------------------
+r293 | jnwhiteh | 2007-04-06 18:06:38 +0100 (Fri, 06 Apr 2007) | 2 lines
+
+* Changed major version to Dongle-1.0-RC3
+
+------------------------------------------------------------------------
+r292 | jnwhiteh | 2007-04-06 18:05:34 +0100 (Fri, 06 Apr 2007) | 2 lines
+
+* Remove DongleUtils.lua from the build process.
+
+------------------------------------------------------------------------
+r291 | jnwhiteh | 2007-04-06 18:04:04 +0100 (Fri, 06 Apr 2007) | 3 lines
+
+* Added a logging mechanism to DongleStub that allows us to debug
library issues.
+* All registration/activation entries are logged in DongleStub.log.
+
+------------------------------------------------------------------------
+r290 | jnwhiteh | 2007-04-06 15:27:29 +0100 (Fri, 06 Apr 2007) | 2 lines
+
+* Added unit tests to cover the new assertions added to DongleStub:Register()
+
+------------------------------------------------------------------------
+r289 | jnwhiteh | 2007-04-06 15:26:45 +0100 (Fri, 06 Apr 2007) | 4 lines
+
+* Change to major version of DongleStub to "DongleStub"
+* Added code to :IsNewVersion() to compensate for DongleStub versions
with different major versions
+* This should prevent any errors from DongleStub-BetaX and DongleStub
from occuring.
+
+------------------------------------------------------------------------
+r288 | jnwhiteh | 2007-04-06 14:10:06 +0100 (Fri, 06 Apr 2007) | 2 lines
+
+* Updated build script to export DUT into the tagged directory
+
+------------------------------------------------------------------------
+r287 | jnwhiteh | 2007-04-06 13:45:54 +0100 (Fri, 06 Apr 2007) | 2 lines
+
+Tagging Dongle-1.0-RC2
+
+------------------------------------------------------------------------
+r286 | jnwhiteh | 2007-04-06 13:42:02 +0100 (Fri, 06 Apr 2007) | 2 lines
+
+* Update unit tests to use the correct major version. This _really_
needs to be automated.
+
+------------------------------------------------------------------------
+r285 | jnwhiteh | 2007-04-06 13:36:58 +0100 (Fri, 06 Apr 2007) | 2 lines
+
+* Update of major versions to Dongle-1.0-RC2
+
+------------------------------------------------------------------------
+r284 | jnwhiteh | 2007-04-06 13:35:55 +0100 (Fri, 06 Apr 2007) | 2 lines
+
+Bad tag
+
+------------------------------------------------------------------------
+r283 | jnwhiteh | 2007-04-06 13:35:25 +0100 (Fri, 06 Apr 2007) | 2 lines
+
+* Tagging Dongle-1.0-RC2 release. Dongle will be frozen on Sunday at
the latest, so please report any issues as soon as possible.
+
+------------------------------------------------------------------------
+r282 | jnwhiteh | 2007-04-06 13:34:30 +0100 (Fri, 06 Apr 2007) | 2 lines
+
+* Updated DongleUtils to not look for a specific version of
DongleStub. That should not be necessary any more.
+
+------------------------------------------------------------------------
+r281 | jnwhiteh | 2007-04-06 05:11:26 +0100 (Fri, 06 Apr 2007) | 2 lines
+
+* Tagged Dongle-1.0-RC1
+
+------------------------------------------------------------------------
+r280 | jnwhiteh | 2007-04-06 05:09:23 +0100 (Fri, 06 Apr 2007) | 2 lines
+
+* Updated major version to Dongle-1.0-RC1
+
+------------------------------------------------------------------------
+r279 | jnwhiteh | 2007-04-06 05:07:52 +0100 (Fri, 06 Apr 2007) | 2 lines
+
+* Updated unit tests to find the issues exposed in last iteration
+
+------------------------------------------------------------------------
+r278 | jnwhiteh | 2007-04-06 05:07:26 +0100 (Fri, 06 Apr 2007) | 3 lines
+
+* Fixed error reporting in Print/Debug/etc.
+* Resolved an issue with Debug() not passing arguments properly
+
+------------------------------------------------------------------------
+r277 | jnwhiteh | 2007-04-06 04:42:54 +0100 (Fri, 06 Apr 2007) | 3 lines
+
+* Fixed an issue with print handlers due to an extra local I just added.
+* Removed header print from first line of slash command usage message
+
+------------------------------------------------------------------------
+r276 | jnwhiteh | 2007-04-06 03:45:25 +0100 (Fri, 06 Apr 2007) | 2 lines
+
+* Updated unit tests to include Echo/EchoF and to properly test both
sets of error messages.
+
+------------------------------------------------------------------------
+r275 | jnwhiteh | 2007-04-06 03:41:21 +0100 (Fri, 06 Apr 2007) | 2 lines
+
+* Actually implemented the logic for "Echo" and "EchoF"
+
+------------------------------------------------------------------------
+r274 | jnwhiteh | 2007-04-06 03:37:30 +0100 (Fri, 06 Apr 2007) | 2 lines
+
+* Added DongleObject:Echo() and DongleObject:EchoF() which doesn't
include the addon header to the message
+
+------------------------------------------------------------------------
+r273 | jnwhiteh | 2007-04-06 03:25:26 +0100 (Fri, 06 Apr 2007) | 1 line
+
+Deleting wiki page ModuleAPI.
+------------------------------------------------------------------------
+r272 | jnwhiteh | 2007-04-06 03:25:15 +0100 (Fri, 06 Apr 2007) | 1 line
+
+Deleting wiki page DatabaseAPI.
+------------------------------------------------------------------------
+r271 | jnwhiteh | 2007-04-06 03:25:03 +0100 (Fri, 06 Apr 2007) | 1 line
+
+Deleting wiki page CoreAPI.
+------------------------------------------------------------------------
+r270 | jnwhiteh | 2007-04-06 03:24:54 +0100 (Fri, 06 Apr 2007) | 1 line
+
+Deleting wiki page PrintAPI.
+------------------------------------------------------------------------
+r269 | jnwhiteh | 2007-04-06 03:24:39 +0100 (Fri, 06 Apr 2007) | 1 line
+
+Deleting wiki page SlashCommandAPI.
+------------------------------------------------------------------------
+r268 | jnwhiteh | 2007-04-06 03:24:32 +0100 (Fri, 06 Apr 2007) | 1 line
+
+Deleting wiki page EventsAPI.
+------------------------------------------------------------------------
+r267 | jnwhiteh | 2007-04-03 01:51:37 +0100 (Tue, 03 Apr 2007) | 2 lines
+
+* Removed DongleObject checks, since they can be used in a normal table.
+
+------------------------------------------------------------------------
+r266 | jnwhiteh | 2007-04-03 01:51:00 +0100 (Tue, 03 Apr 2007) | 2 lines
+
+* DongleMessage does not require a Dongle object anymore, so
non-Dongle objects can register for our custom messages.
+
+------------------------------------------------------------------------
+r265 | Tekkub | 2007-03-21 17:34:38 +0000 (Wed, 21 Mar 2007) | 1 line
+
+Tagging Dongle-Beta1-r264
+------------------------------------------------------------------------
+r264 | Tekkub | 2007-03-21 17:31:38 +0000 (Wed, 21 Mar 2007) | 1 line
+
+Applying patch, resolves #22
+------------------------------------------------------------------------
+r263 | jnwhiteh | 2007-03-20 02:32:02 +0000 (Tue, 20 Mar 2007) | 2 lines
+
+Tagging Beta1-r262
+
+------------------------------------------------------------------------
+r262 | jnwhiteh | 2007-03-20 02:31:02 +0000 (Tue, 20 Mar 2007) | 2 lines
+
+* Changed database code to allow for ["*"] definitions in the defaults.
+
+------------------------------------------------------------------------
+r261 | jnwhiteh | 2007-03-18 04:21:26 +0000 (Sun, 18 Mar 2007) | 2 lines
+
+A number of fixes, clarifications, and feature additions.
+
+------------------------------------------------------------------------
+r260 | jnwhiteh | 2007-03-18 04:06:59 +0000 (Sun, 18 Mar 2007) | 2 lines
+
+* Added the code for /slash profile list, as a basic example of what
we can do.
+
+------------------------------------------------------------------------
+r259 | jnwhiteh | 2007-03-18 03:43:01 +0000 (Sun, 18 Mar 2007) | 2 lines
+
+* Minor changes to unit testing.
+
+------------------------------------------------------------------------
+r258 | jnwhiteh | 2007-03-18 03:42:27 +0000 (Sun, 18 Mar 2007) | 2 lines
+
+* Initial coding of SlashCmdObject:InjectDBCommands().
+
+------------------------------------------------------------------------
+r257 | jnwhiteh | 2007-03-18 03:31:19 +0000 (Sun, 18 Mar 2007) | 3 lines
+
+* Changed slash command system to use arrays, so the usage lines can
be printed in the order they are registered.
+* Closes issues 16
+
+------------------------------------------------------------------------
+r256 | jnwhiteh | 2007-03-18 03:25:10 +0000 (Sun, 18 Mar 2007) | 3 lines
+
+* Removed extra assert.
+* Closes issue 14
+
+------------------------------------------------------------------------
+r255 | jnwhiteh | 2007-03-18 03:23:50 +0000 (Sun, 18 Mar 2007) | 3 lines
+
+* Ensure RegisterNamespace gets added to each DB object.
+* Fixed a number of bugs in RegisterNamespace, due to unit testing.
+
+------------------------------------------------------------------------
+r254 | jnwhiteh | 2007-03-13 22:47:37 +0000 (Tue, 13 Mar 2007) | 2 lines
+
+Tagging initial Beta-1 release (Dongle-Beta1-r252)
+
+------------------------------------------------------------------------
+r253 | jnwhiteh | 2007-03-13 22:43:54 +0000 (Tue, 13 Mar 2007) | 2 lines
+
+Updated unit testing to test for namespaces, and other new
functionality changes.
+
+------------------------------------------------------------------------
+r252 | jnwhiteh | 2007-03-13 22:13:21 +0000 (Tue, 13 Mar 2007) | 2 lines
+
+* Addons can no longer register for PLAYER_LOGIN or PLAYER_LOGOUT. An
error message is displayed if they attempt to register for these events.
+
+------------------------------------------------------------------------
+r251 | jnwhiteh | 2007-03-01 00:36:54 +0000 (Thu, 01 Mar 2007) | 7 lines
+
+* Renamed 04DongleEvents.lua to 04DongleMessage.lua in the .toc so it
loads properly
+* Added a naming argument to UnitTest:New() that requires a name, so
we can track which tests have been run, and which have not. If you add
a test file, you need to add that to 99Completion.lua.
+* Removed all ferror functions, and replaced them with a global
argerror function.
+* Added a unit test for IsMessageRegistered()
+* Added a 08DongleError.lua file, which tests the argcheck and assert
custom functions, to ensure they throw their errors at the correct level.
+* Changed the unit test harness to use xpcall() so we can get a full
internal stack trace.
+
+------------------------------------------------------------------------
+r250 | jnwhiteh | 2007-03-01 00:34:33 +0000 (Thu, 01 Mar 2007) | 28 lines
+
+* Updated copyright notice in license
+* Added DongleObj:IsEventRegistered()
+* Added DongleObj:IsMessageRegistered()
+* Moved all error messages into a small localisation table
+* Moved DB local function declarations to the start of the DB section
for declaration purpose
+* Altered the database to lazy evaluate all sections of the database.
This means that any database section (.profile, .char, .faction) will
not be initialized (including defaults) until accessed
+* Removed db.profileKey, you can access this value via
db.char.profileKey and db.keys.profile
+* Added table db.keys which lists all section keys
+* Removed all local db .key references.
+* Altered slash command system to check cmd[handler] before it checks
parent[handler] to allow definition of methods within the slash command
table itself.
+* Added a message handler for DONGLE_PROFILE_CHANGED
+* Incremented major version to Dongle-Beta1
+* Added preliminary support for namespaces, which needs to be fully
converted and tested.
+DongleDBObject:RegisterNamespace(name[, defaults])
+Args:
+ * name (string) - An internal name for this namespace
+ * defaults (table) - A table expressing defaults for this namespace
+Returns:
+ * db (DongleDBObject) - The new database object.
+
+A namespace is a full fledged database with all rights and privileges,
but has the following nuances:
+Behavior:
+* A namespace is created without a global variable, under the
sv.namespaces[name] portion of the parent saved variable. This means
you can have multiple modules that have full fledged database objects
without needing more than one global variable.
+* When a parent database (namespaces are children) changes its profile
(i.e. when DONGLE_PROFILE_CHANGED fires), each child will be
automatically updated (they will fire their own DONGLE_PROFILE_CHANGED messages).
+* These namespace objects do not fire a true "sv_name" in the event,
nore do they fire a Dongle object as the parent. Instead they will
fire the "parent" database object, and the sv object as the sv_name.
+
+All namespace features are untagged, and the API may change, consider
that feature extremely experimental.
+
+------------------------------------------------------------------------
+r249 | jnwhiteh | 2007-01-31 22:33:21 +0000 (Wed, 31 Jan 2007) | 2 lines
+
+Fix to DongleStub to ensure the local Dongle is re-bound
+
+------------------------------------------------------------------------
+r248 | tekkub | 2007-01-20 19:16:00 +0000 (Sat, 20 Jan 2007) | 1 line
+
+Dongle - Changed Print/PrintF args and argchecks to match how clad had
intended to do it, before he went crazy and did it all wrong like.
+------------------------------------------------------------------------
+r247 | tekkub | 2007-01-20 03:35:54 +0000 (Sat, 20 Jan 2007) | 1 line
+
+Committing in Clad's changes to Dongle, with some bugfixes. Unit
tests still need to be done.
+------------------------------------------------------------------------
+r246 | tekkub | 2007-01-17 11:08:47 +0000 (Wed, 17 Jan 2007) | 1 line
+
+Dongle - Added IsDebugEnabled, returns the dongle's debug level, or
nil if debug is disabled.
+------------------------------------------------------------------------
+r245 | evlogimenos | 2007-01-16 11:48:51 +0000 (Tue, 16 Jan 2007) | 1 line
+
+Streamline Activate()'s implementation a bit.
+------------------------------------------------------------------------
+r244 | evlogimenos | 2007-01-16 11:47:45 +0000 (Tue, 16 Jan 2007) | 1 line
+
+Bump TOC interface version.
+------------------------------------------------------------------------
+r243 | evlogimenos | 2007-01-14 21:03:43 +0000 (Sun, 14 Jan 2007) | 1 line
+
+Update comment to match the code.
+------------------------------------------------------------------------
+r242 | tekkub | 2007-01-13 19:02:45 +0000 (Sat, 13 Jan 2007) | 1 line
+
+Tagging Dongle-Beta0-r240
+------------------------------------------------------------------------
+r241 | tekkub | 2007-01-12 14:56:24 +0000 (Fri, 12 Jan 2007) | 1 line
+
+Un-featuring wiki pages, they're in the project description now
+------------------------------------------------------------------------
+r240 | tekkub | 2007-01-12 05:57:29 +0000 (Fri, 12 Jan 2007) | 2 lines
+
+- Set "-Beta0" major versions on all the Utils libs
+- Converted metro to do delayed messages instead of events
+------------------------------------------------------------------------
+r239 | evlogimenos | 2007-01-11 15:24:28 +0000 (Thu, 11 Jan 2007) | 2 lines
+
+Made some lookups in UnregisterEvent local (similar to UnregisterMessage).
+
+------------------------------------------------------------------------
+r238 | tekkub | 2007-01-11 14:58:11 +0000 (Thu, 11 Jan 2007) | 1 line
+
+Tagging Dongle-Beta0-r237
+------------------------------------------------------------------------
+r237 | tekkub | 2007-01-11 14:54:27 +0000 (Thu, 11 Jan 2007) | 1 line
+
+Removed more unneeded code (file-scope locals don't need to be nilled
out, GC will catch them correctly)
+------------------------------------------------------------------------
+r236 | tekkub | 2007-01-11 13:54:47 +0000 (Thu, 11 Jan 2007) | 1 line
+
+Removing some unneeded code from DongleUtils, probably more of this to come
+------------------------------------------------------------------------
+r235 | jnwhiteh | 2007-01-11 13:09:40 +0000 (Thu, 11 Jan 2007) | 2 lines
+
+Made some lookups in UnregisterMessage local
+
+------------------------------------------------------------------------
+r234 | jnwhiteh | 2007-01-11 13:05:37 +0000 (Thu, 11 Jan 2007) | 2 lines
+
+Renamed the original Beta0 to Dongle-Beta0-r232 for tag purposes
+
+------------------------------------------------------------------------
+r233 | tekkub | 2007-01-11 10:04:31 +0000 (Thu, 11 Jan 2007) | 1 line
+
+Adding minor version to Beta0, clad can change it if he wants
something different
+------------------------------------------------------------------------
+r232 | tekkub | 2007-01-11 09:06:04 +0000 (Thu, 11 Jan 2007) | 1 line
+
+Updating DongleUtils to use the new stub API
+------------------------------------------------------------------------
+r231 | evlogimenos | 2007-01-11 08:17:05 +0000 (Thu, 11 Jan 2007) | 1 line
+
+Simplify ModuleIterator function. Stop sorting the modules table since
it is unnecessary.
+------------------------------------------------------------------------
+r230 | jnwhiteh | 2007-01-11 03:54:11 +0000 (Thu, 11 Jan 2007) | 2 lines
+
+Tagged Beta0
+
+------------------------------------------------------------------------
+r229 | jnwhiteh | 2007-01-11 03:53:22 +0000 (Thu, 11 Jan 2007) | 2 lines
+
+Updated toc file for 2.0.3
+
+------------------------------------------------------------------------
+r228 | jnwhiteh | 2007-01-11 03:23:07 +0000 (Thu, 11 Jan 2007) | 2 lines
+
+Fixed issues with upgrading the library
+
+------------------------------------------------------------------------
+r227 | jnwhiteh | 2007-01-11 02:50:07 +0000 (Thu, 11 Jan 2007) | 3 lines
+
+Update version messages in Dongle
+Updated DongleUtils to check for the proper version of DongleStub
+
+------------------------------------------------------------------------
+r226 | jnwhiteh | 2007-01-11 02:48:49 +0000 (Thu, 11 Jan 2007) | 2 lines
+
+Removing so I can make a quick fix to DongleUtils
+
+------------------------------------------------------------------------
+r225 | jnwhiteh | 2007-01-11 02:42:13 +0000 (Thu, 11 Jan 2007) | 2 lines
+
+Tagging Beta0 Release. No compat changes without a major version bump pls.
+
+------------------------------------------------------------------------
+r224 | jnwhiteh | 2007-01-11 02:07:23 +0000 (Thu, 11 Jan 2007) | 2 lines
+
+Made a few functions local, to help with privacy just a little bit
+
+------------------------------------------------------------------------
+r223 | jnwhiteh | 2007-01-09 22:33:48 +0000 (Tue, 09 Jan 2007) | 2 lines
+
+Renamed DongleEvents properly
+
+------------------------------------------------------------------------
+r222 | jnwhiteh | 2007-01-09 01:11:24 +0000 (Tue, 09 Jan 2007) | 2 lines
+
+Updated tests for DongleStub to reflect tehe API changes
+
+------------------------------------------------------------------------
+r221 | jnwhiteh | 2007-01-09 01:10:11 +0000 (Tue, 09 Jan 2007) | 3 lines
+
+Updated DongleStub to latest version, with a major of
DongleStub-Beta0, so we can check for its existance
+*** IMPORTANT *** Calls to DongleStub:Register(lib) should put the
return back into lib, to rebind the local if necessary. DongleStub
will ALWAYS return the old table, if it exists, cleaned and copied
+
+------------------------------------------------------------------------
+r220 | jnwhiteh | 2007-01-08 03:02:16 +0000 (Mon, 08 Jan 2007) | 2 lines
+
+Updated unit tests to use the Message system instead of the event
system, where necessary
+
+------------------------------------------------------------------------
+r219 | jnwhiteh | 2007-01-08 03:01:43 +0000 (Mon, 08 Jan 2007) | 2 lines
+
+Added the message system in its first form, and converted all
handlers/triggers over to it
+
+------------------------------------------------------------------------
+r218 | jnwhiteh | 2007-01-08 02:28:26 +0000 (Mon, 08 Jan 2007) | 2 lines
+
+Do an svn update before building, to make sure we have the latest logs
+
+------------------------------------------------------------------------
+r217 | jnwhiteh | 2007-01-08 02:24:16 +0000 (Mon, 08 Jan 2007) | 2 lines
+
+Altered build script to dump filenames with commit messages
+
+------------------------------------------------------------------------
+r216 | jnwhiteh | 2007-01-08 02:15:07 +0000 (Mon, 08 Jan 2007) | 2 lines
+
+DongleUnitTests: Updated tests to pull down a local copy of Dongle,
since it is no longer global
+
+------------------------------------------------------------------------
+r215 | jnwhiteh | 2007-01-08 02:10:23 +0000 (Mon, 08 Jan 2007) | 3 lines
+
+Changed major version number to Dongle-Beta0
+Make the declaration of Dongle local
+
+------------------------------------------------------------------------
+r214 | jnwhiteh | 2007-01-08 02:08:12 +0000 (Mon, 08 Jan 2007) | 2 lines
+
+Updated Activate/Deactivate functions for new DongleStub
+
+------------------------------------------------------------------------
+r213 | jnwhiteh | 2007-01-08 02:07:46 +0000 (Mon, 08 Jan 2007) | 2 lines
+
+Updated all stray filenames to fix test errors.
+
+------------------------------------------------------------------------
+r212 | jnwhiteh | 2007-01-08 01:57:14 +0000 (Mon, 08 Jan 2007) | 2 lines
+
+Fixed a number of issues in DongleStub to resolve unit tests
+
+------------------------------------------------------------------------
+r211 | jnwhiteh | 2007-01-08 01:56:37 +0000 (Mon, 08 Jan 2007) | 2 lines
+
+DongleUnitTests: Added tests for DongleStub
+
+------------------------------------------------------------------------
+r210 | jnwhiteh | 2007-01-08 00:43:54 +0000 (Mon, 08 Jan 2007) | 2 lines
+
+DongleUnitTests: Moved all files up, and created a file for DongleStub tests
+
+------------------------------------------------------------------------
+r209 | jnwhiteh | 2007-01-08 00:30:21 +0000 (Mon, 08 Jan 2007) | 6 lines
+
+Donglestub:
+Change deactivate and activate to arguments to register
+Altered the way the code is written to be more in line with Iriels'
original stub
+If the activate function returns true, then the old instance will not
be touched
+Upgrade order is Deactivate, Activate, nil/copy. Not sure if this is right.
+
+------------------------------------------------------------------------
+r208 | evlogimenos | 2007-01-07 21:57:41 +0000 (Sun, 07 Jan 2007) | 1 line
+
+Add slash command objects upgrade code.
+------------------------------------------------------------------------
+r207 | evlogimenos | 2007-01-07 21:57:03 +0000 (Sun, 07 Jan 2007) | 1 line
+
+Add checks for slash command methods to make sure they are called on
slash command objects.
+------------------------------------------------------------------------
+r206 | evlogimenos | 2007-01-07 21:54:52 +0000 (Sun, 07 Jan 2007) | 1 line
+
+Add negative tests for calling slash command object methods on non
slash command objects.
+------------------------------------------------------------------------
+r205 | jnwhiteh | 2007-01-07 19:48:33 +0000 (Sun, 07 Jan 2007) | 4 lines
+
+Removed AdminEvents, we will no longer have hidden special
methods "CombatUnlock" and "CombatLockdown"
+Added a PLAYER_LOGOUT method to Dongle to handle database clears, and calling :Disable()
+Removed event registrations for PRE and PRD
+
+------------------------------------------------------------------------
+r204 | jnwhiteh | 2007-01-05 22:43:12 +0000 (Fri, 05 Jan 2007) | 9 lines
+
+Changed some of the system to store an old list of the instances so
they can be updated as new versions are introduced. This is something
we probably need to be doing anyway
+Added a ReplaceInstance function from Iriel's stub which copies the
new methods into the old objects
+Cleaned up lib:Register() and made it a bit more in-line with the
original spec. Now stores all old instances in a list, so we can
iterate them later.
+Process remains new:Activate() then old:Deactivate() then the method copy.
+Expected signatures for Activate and Deactivate have changed:
+new:Activate(self, oldInstance, oldList)
+oldInstance:Deactivate(self, oldList, newInstance)
+
+
+------------------------------------------------------------------------
+r203 | jnwhiteh | 2007-01-05 22:42:20 +0000 (Fri, 05 Jan 2007) | 8 lines
+
+Incremented version to Dongle-Beta1. This is a preliminary
version,and won't be tagged for a week or so.
+Removed TriggerEvent
+Added RegisterMessage, UnregisterMessage, UnregisterAllMessages,
TriggerMessage (named temporarily, we can change)
+Made Dongle.OnEvent a local function instead
+Added safecall()'s to OnEvent
+Implemented the new message functions
+
+
+------------------------------------------------------------------------
+r202 | jnwhiteh | 2007-01-05 22:37:09 +0000 (Fri, 05 Jan 2007) | 2 lines
+
+Branching trunk for changes in preparation for Beta release
+
+------------------------------------------------------------------------
+r201 | evlogimenos | 2007-01-04 01:07:53 +0000 (Thu, 04 Jan 2007) | 1 line
+
+Fix slash handler to not pass the an object as a first argument if the
registered handler was passed a function and not a string.
+------------------------------------------------------------------------
+r200 | jnwhiteh | 2007-01-03 23:55:17 +0000 (Wed, 03 Jan 2007) | 2 lines
+
+Added a unit test for cyclic events, to test the new event queue
+
+------------------------------------------------------------------------
+r199 | evlogimenos | 2007-01-03 23:30:39 +0000 (Wed, 03 Jan 2007) | 1 line
+
+Update test to test handlers passed as strings and stand alone functions.
+------------------------------------------------------------------------
+r198 | jnwhiteh | 2007-01-03 23:13:17 +0000 (Wed, 03 Jan 2007) | 2 lines
+
+Initial commit of an event queue to handle cyclic events
+
+------------------------------------------------------------------------
+r197 | evlogimenos | 2007-01-03 22:44:45 +0000 (Wed, 03 Jan 2007) | 1 line
+
+Updates to documentation I forgot to commit.
+------------------------------------------------------------------------
+r196 | jnwhiteh | 2007-01-02 22:03:20 +0000 (Tue, 02 Jan 2007) | 2 lines
+
+* Added svn2log.py so we can build better changelogs. It will use
python on your system if you have it, otherwise it will dump the
standard changelog.
+
+------------------------------------------------------------------------
+r195 | jnwhiteh | 2007-01-02 20:05:19 +0000 (Tue, 02 Jan 2007) | 2 lines
+
+Tagged 0.5.1-Alpha as an urgent bugfix for issues present in all
versions < r194
+
+------------------------------------------------------------------------
+r194 | jnwhiteh | 2007-01-02 20:04:17 +0000 (Tue, 02 Jan 2007) | 2 lines
+
+* Fixed a typo in the bugfix.
+
+------------------------------------------------------------------------
+r193 | jnwhiteh | 2007-01-02 20:02:52 +0000 (Tue, 02 Jan 2007) | 3 lines
+
+* Update to build script to check for leaked globals
+* Urgent bugfix to Dongle.lua which fixed sporadic event issues
+
+------------------------------------------------------------------------
+r192 | jnwhiteh | 2007-01-01 22:24:50 +0000 (Mon, 01 Jan 2007) | 2 lines
+
+Spank me with a spoon, please
+
+------------------------------------------------------------------------
+r191 | jnwhiteh | 2007-01-01 22:23:54 +0000 (Mon, 01 Jan 2007) | 2 lines
+
+Bad build. BAD CLADHAIRE!
+
+------------------------------------------------------------------------
+r190 | jnwhiteh | 2007-01-01 21:44:27 +0000 (Mon, 01 Jan 2007) | 2 lines
+
+Tagging 0.5.0-Alpha
+
+------------------------------------------------------------------------
+r189 | jnwhiteh | 2007-01-01 21:42:58 +0000 (Mon, 01 Jan 2007) | 2 lines
+
+DongleUnitTests: Updated to reflect the changes to the database event
system, etc.
+
+------------------------------------------------------------------------
+r188 | jnwhiteh | 2007-01-01 21:42:39 +0000 (Mon, 01 Jan 2007) | 3 lines
+
+* Fire DONGLE_PROFILE_CHANGED on ResetDB()
+* Sequence is DATABASE_RESET, PROFILE_CREATED, and PROFILE_CHANGED.
+
+------------------------------------------------------------------------
+r187 | tardmrr | 2007-01-01 18:24:00 +0000 (Mon, 01 Jan 2007) | 1 line
+
+-DONGLE_PROFILE_CREATED will always fire after DONGLE_DATABASE_RESET.
+------------------------------------------------------------------------
+r186 | jnwhiteh | 2007-01-01 18:14:55 +0000 (Mon, 01 Jan 2007) | 4 lines
+
+* Moved InitializeDB() work into local initdb() function. This is used
for both InitailizeDB and the ResetDB functionality
+* Change DONGLE_PROFILE and DONGLE_DATABASE events to be consistent,
they now fire the same arguments
+ * DONGLE_PROFILE_CHANGED, dbObject, addonObject, svName, profileKey
+
+------------------------------------------------------------------------
+r185 | tardmrr | 2007-01-01 17:13:01 +0000 (Mon, 01 Jan 2007) | 1 line
+
+- Fixed event args to DONGLE_PROFILE_CREATED
+------------------------------------------------------------------------
+r184 | tardmrr | 2007-01-01 17:07:08 +0000 (Mon, 01 Jan 2007) | 2 lines
+
+- Added DONGLE_PROFILE_CREATED
+- Changed TriggerEvent calls to call directly from Dongle instead of
from the active object (or the active object's parent)
+------------------------------------------------------------------------
+r183 | jnwhiteh | 2007-01-01 09:09:59 +0000 (Mon, 01 Jan 2007) | 2 lines
+
+* Changed copyDefaults to test for nil, rather than "not dest[k]"
+
+------------------------------------------------------------------------
+r182 | jnwhiteh | 2006-12-31 19:34:38 +0000 (Sun, 31 Dec 2006) | 2 lines
+
+DongleUnitTests: Added Slash commands to .toc
+
+------------------------------------------------------------------------
+r181 | jnwhiteh | 2006-12-31 19:31:46 +0000 (Sun, 31 Dec 2006) | 3 lines
+
+DongleUnitTests:
+* Updates tests for IterateModules to reflect the change in API
+
+------------------------------------------------------------------------
+r180 | jnwhiteh | 2006-12-31 19:25:45 +0000 (Sun, 31 Dec 2006) | 2 lines
+
+* Removed old files from unit testing
+
+------------------------------------------------------------------------
+r179 | jnwhiteh | 2006-12-31 19:24:18 +0000 (Sun, 31 Dec 2006) | 3 lines
+
+* Updated Dongle.lua to use the new versioning string.
+* Reworked the IterateModules() function to return name,module
+
+------------------------------------------------------------------------
+r178 | jnwhiteh | 2006-12-31 19:23:32 +0000 (Sun, 31 Dec 2006) | 2 lines
+
+* Updated DongleUitls.lua to use the correct minor version string
+
+------------------------------------------------------------------------
+r177 | jnwhiteh | 2006-12-31 19:23:11 +0000 (Sun, 31 Dec 2006) | 2 lines
+
+* Updated build script to properly handle the new DongleStub license
+
+------------------------------------------------------------------------
+r176 | jnwhiteh | 2006-12-30 17:18:18 +0000 (Sat, 30 Dec 2006) | 2 lines
+
+* Made the minor version assignments consistent and cleaner
+
+------------------------------------------------------------------------
+r175 | jnwhiteh | 2006-12-30 17:14:44 +0000 (Sat, 30 Dec 2006) | 2 lines
+
+Premature commit
+
+------------------------------------------------------------------------
+r174 | jnwhiteh | 2006-12-30 17:13:28 +0000 (Sat, 30 Dec 2006) | 2 lines
+
+Tagging 0.4.2-Alpha release to include DongleStub changes
+
+------------------------------------------------------------------------
+r173 | jnwhiteh | 2006-12-30 04:40:00 +0000 (Sat, 30 Dec 2006) | 3 lines
+
+* Updated DongleStub with a unrestricted license, for public use.
+* Added svn keyword revisioning to the DongleStub system
+
+------------------------------------------------------------------------
+r172 | evlogimenos | 2006-12-29 04:10:23 +0000 (Fri, 29 Dec 2006) | 3 lines
+
+Release bugfix for slash command usage string generation.
+
+
+------------------------------------------------------------------------
+r171 | evlogimenos | 2006-12-29 04:09:20 +0000 (Fri, 29 Dec 2006) | 2 lines
+
+Blarg... I messed up the release numbers again :-)
+
+------------------------------------------------------------------------
+r170 | evlogimenos | 2006-12-29 04:08:21 +0000 (Fri, 29 Dec 2006) | 2 lines
+
+Release bugfix for slash command usage string generation.
+
+------------------------------------------------------------------------
+r169 | evlogimenos | 2006-12-29 04:06:43 +0000 (Fri, 29 Dec 2006) | 1 line
+
+Fix usage string generation to give out all the possible slash command
prefixes for each command.
+--------------------------------------------------------
==============================================================================
Diff truncated at 200k characters