//# 0 errors, 597 messages
//#
/*
    //#Logger.java:1:1: class: com.dmdirc.logger.Logger
 * Copyright (c) 2006-2009 Chris Smith, Shane Mc Cormack, Gregory Holmes
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package com.dmdirc.logger;

/**
 * Logger class for the application.
 */
public final class Logger {

    /** The manager to use to report errors. */
    protected static final ErrorManager manager = ErrorManager.getErrorManager();
    //#Logger.java:31: method: com.dmdirc.logger.Logger.com.dmdirc.logger.Logger__static_init
    //#input(com.dmdirc.logger.Logger__static_init): com/dmdirc/logger/ErrorManager.me
    //#output(com.dmdirc.logger.Logger__static_init): __Descendant_Table[com/dmdirc/logger/Logger]
    //#output(com.dmdirc.logger.Logger__static_init): manager
    //#post(com.dmdirc.logger.Logger__static_init): __Descendant_Table[com/dmdirc/logger/Logger] == &__Dispatch_Table
    //#post(com.dmdirc.logger.Logger__static_init): manager == &com.dmdirc.logger.ErrorManager__static_init.new ErrorManager(ErrorManager__static_init#1)
    //#unanalyzed(com.dmdirc.logger.Logger__static_init): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#Logger.java:31: end of method: com.dmdirc.logger.Logger.com.dmdirc.logger.Logger__static_init
       
    /** Prevent instantiation of a new instance of Logger. */
    private Logger() {
    //#Logger.java:34: method: void com.dmdirc.logger.Logger.com.dmdirc.logger.Logger()
        //Ignore
    }
    //#Logger.java:36: end of method: void com.dmdirc.logger.Logger.com.dmdirc.logger.Logger()
    
    /**
     * Called when a user correctable error occurs.
     *
     * @param level Severity of the error
     * @param message Brief error description
     */
    public static void userError(final ErrorLevel level, final String message) {
        manager.addError(level, message);
    //#Logger.java:45: method: void com.dmdirc.logger.Logger.userError(ErrorLevel, String)
    //#input(void userError(ErrorLevel, String)): "&#09;"._tainted
    //#input(void userError(ErrorLevel, String)): "-"._tainted
    //#input(void userError(ErrorLevel, String)): ".log"._tainted
    //#input(void userError(ErrorLevel, String)): ": "._tainted
    //#input(void userError(ErrorLevel, String)): "A fatal error has occurred: "._tainted
    //#input(void userError(ErrorLevel, String)): "An error has occurred: "._tainted
    //#input(void userError(ErrorLevel, String)): "Date:"._tainted
    //#input(void userError(ErrorLevel, String)): "Description: "._tainted
    //#input(void userError(ErrorLevel, String)): "ID must be a positive integer: "._tainted
    //#input(void userError(ErrorLevel, String)): "Level: "._tainted
    //#input(void userError(ErrorLevel, String)): "errors"._tainted
    //#input(void userError(ErrorLevel, String)): manager.errorListeners
    //#input(void userError(ErrorLevel, String)): manager.errors
    //#input(void userError(ErrorLevel, String)): manager.logReports
    //#input(void userError(ErrorLevel, String)): manager.nextErrorID
    //#input(void userError(ErrorLevel, String)): manager.reportQueue
    //#input(void userError(ErrorLevel, String)): manager.reportThread
    //#input(void userError(ErrorLevel, String)): manager.sendReports
    //#input(void userError(ErrorLevel, String)): com.dmdirc.logger.ErrorReportStatus__static_init.new ErrorReportStatus(ErrorReportStatus__static_init#1).terminal
    //#input(void userError(ErrorLevel, String)): com.dmdirc.logger.ErrorReportStatus__static_init.new ErrorReportStatus(ErrorReportStatus__static_init#5).terminal
    //#input(void userError(ErrorLevel, String)): com.dmdirc.logger.ErrorReportStatus__static_init.new ErrorReportStatus(ErrorReportStatus__static_init#6).terminal
    //#input(void userError(ErrorLevel, String)): com.dmdirc.ui.FatalErrorDialog$4__static_init.new int[](FatalErrorDialog$4__static_init#1).length
    //#input(void userError(ErrorLevel, String)): com.dmdirc.ui.FatalErrorDialog$4__static_init.new int[](FatalErrorDialog$4__static_init#1)[0..4_294_967_295]
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ErrorFixedStatus.INVALID
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ErrorFixedStatus.KNOWN
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ErrorFixedStatus.UNKNOWN
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ErrorFixedStatus.UNREPORTED
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ErrorLevel.FATAL
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ErrorListener.__Descendant_Table[com/dmdirc/logger/ErrorListener]
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ErrorListener.__Descendant_Table[com/dmdirc/ui/FatalErrorDialog]
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ErrorListener.__Descendant_Table[others]
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ErrorListener.__Dispatch_Table.errorAdded(Lcom/dmdirc/logger/ProgramError;)V
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ErrorListener.__Dispatch_Table.errorStatusChanged(Lcom/dmdirc/logger/ProgramError;)V
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ErrorListener.__Dispatch_Table.isReady()Z
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ErrorManager.java.lang.System.err
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ErrorManager.me
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ErrorReportStatus.ERROR
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ErrorReportStatus.NOT_APPLICABLE
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ErrorReportStatus.QUEUED
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ErrorReportStatus.WAITING
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ProgramError.__Descendant_Table[com/dmdirc/logger/ProgramError]
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ProgramError.__Descendant_Table[others]
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ProgramError.errorDir
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ProgramError.java.lang.System.err
    //#input(void userError(ErrorLevel, String)): com/dmdirc/logger/ProgramError.writingSem
    //#input(void userError(ErrorLevel, String)): com/dmdirc/ui/FatalErrorDialog$4.$SwitchMap$com$dmdirc$logger$ErrorReportStatus
    //#input(void userError(ErrorLevel, String)): com/dmdirc/ui/FatalErrorDialog.__Dispatch_Table.errorAdded(Lcom/dmdirc/logger/ProgramError;)V
    //#input(void userError(ErrorLevel, String)): com/dmdirc/ui/FatalErrorDialog.__Dispatch_Table.errorStatusChanged(Lcom/dmdirc/logger/ProgramError;)V
    //#input(void userError(ErrorLevel, String)): com/dmdirc/ui/FatalErrorDialog.__Dispatch_Table.isReady()Z
    //#input(void userError(ErrorLevel, String)): level
    //#input(void userError(ErrorLevel, String)): level._tainted
    //#input(void userError(ErrorLevel, String)): manager
    //#input(void userError(ErrorLevel, String)): message
    //#input(void userError(ErrorLevel, String)): message._tainted
    //#output(void userError(ErrorLevel, String)): manager.reportThread
    //#output(void userError(ErrorLevel, String)): com/dmdirc/logger/ProgramError.errorDir
    //#output(void userError(ErrorLevel, String)): new ErrorReportingThread(sendError#1) num objects
    //#output(void userError(ErrorLevel, String)): new ErrorReportingThread(sendError#1).__Tag
    //#output(void userError(ErrorLevel, String)): new ErrorReportingThread(sendError#1).queue
    //#output(void userError(ErrorLevel, String)): new File(getErrorFile#1) num objects
    //#new obj(void userError(ErrorLevel, String)): new ErrorReportingThread(sendError#1)
    //#new obj(void userError(ErrorLevel, String)): new File(getErrorFile#1)
    //#pre[5] (void userError(ErrorLevel, String)): init'ed(manager.logReports)
    //#pre[6] (void userError(ErrorLevel, String)): manager.nextErrorID != null
    //#pre[9] (void userError(ErrorLevel, String)): level != null
    //#pre[11] (void userError(ErrorLevel, String)): message != null
    //#pre[7] (void userError(ErrorLevel, String)): (soft) init'ed(manager.sendReports)
    //#pre[8] (void userError(ErrorLevel, String)): (soft) init'ed(com.dmdirc.ui.FatalErrorDialog$4__static_init.new int[](FatalErrorDialog$4__static_init#1)[0..4_294_967_295])
    //#pre[13] (void userError(ErrorLevel, String)): (soft) init'ed(manager.reportThread)
    //#pre[14] (void userError(ErrorLevel, String)): (soft) init'ed(com/dmdirc/logger/ProgramError.errorDir)
    //#post(void userError(ErrorLevel, String)): com/dmdirc/logger/ProgramError.errorDir == One-of{old com/dmdirc/logger/ProgramError.errorDir, &new File(getErrorFile#1)}
    //#post(void userError(ErrorLevel, String)): init'ed(com/dmdirc/logger/ProgramError.errorDir)
    //#post(void userError(ErrorLevel, String)): manager.reportThread == old manager.reportThread
    //#post(void userError(ErrorLevel, String)): init'ed(manager.reportThread)
    //#post(void userError(ErrorLevel, String)): new ErrorReportingThread(sendError#1) num objects == 0
    //#post(void userError(ErrorLevel, String)): init'ed(new ErrorReportingThread(sendError#1).__Tag)
    //#post(void userError(ErrorLevel, String)): init'ed(new ErrorReportingThread(sendError#1).queue)
    //#post(void userError(ErrorLevel, String)): new File(getErrorFile#1) num objects <= 1
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:getErrorManager
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.util.concurrent.atomic.AtomicLong:getAndIncrement
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.util.Date
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.util.Arrays:copyOf
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.util.Date:clone
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:com.dmdirc.logger.ErrorReportStatus:equals
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:fireErrorStatusChanged
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.lang.Object:notifyAll
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.util.concurrent.BlockingQueue:add
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.lang.Thread:isAlive
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.lang.Thread
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:com.dmdirc.logger.ErrorReportingThread:setDaemon
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.lang.Thread:start
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.awt.GraphicsEnvironment:isHeadless
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.io.PrintStream:println
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:javax.swing.SwingUtilities:invokeLater
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.util.concurrent.Semaphore
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.util.concurrent.Semaphore:acquireUninterruptibly
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.lang.Object:wait
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:isReady
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:errorAdded
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:com.dmdirc.logger.ErrorFixedStatus:equals
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:com.dmdirc.Main:getConfigDir
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.io.File
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.io.File:mkdirs
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.util.Date:getTime
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.io.File:renameTo
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.io.File:createNewFile
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.io.FileOutputStream
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.util.concurrent.Semaphore:release
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.io.IOException:printStackTrace
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.io.OutputStream
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.io.PrintWriter
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.io.PrintWriter:println
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.io.PrintWriter:close
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:com.dmdirc.logger.ErrorReportStatus:ordinal
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:javax.swing.JButton:setText
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:javax.swing.JButton:setEnabled
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:equals
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:getReportStatus
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:errorStatusChanged
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.lang.Object:getClass
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void userError(ErrorLevel, String)): Effects-of-calling:java.util.Arrays:equals
    }
    //#Logger.java:46: end of method: void com.dmdirc.logger.Logger.userError(ErrorLevel, String)
    
    /**
     * Called when a user correctable error occurs.
     *
     * @param level Severity of the error
     * @param message Brief error description
     * @param details Verbose description of the error
     */
    public static void userError(final ErrorLevel level, final String message,
            final String details) {
        manager.addError(level, message, new String[]{details}, false);
    //#Logger.java:57: method: void com.dmdirc.logger.Logger.userError(ErrorLevel, String, String)
    //#input(void userError(ErrorLevel, String, String)): "&#09;"._tainted
    //#input(void userError(ErrorLevel, String, String)): "-"._tainted
    //#input(void userError(ErrorLevel, String, String)): ".log"._tainted
    //#input(void userError(ErrorLevel, String, String)): ": "._tainted
    //#input(void userError(ErrorLevel, String, String)): "A fatal error has occurred: "._tainted
    //#input(void userError(ErrorLevel, String, String)): "An error has occurred: "._tainted
    //#input(void userError(ErrorLevel, String, String)): "Date:"._tainted
    //#input(void userError(ErrorLevel, String, String)): "Description: "._tainted
    //#input(void userError(ErrorLevel, String, String)): "ID must be a positive integer: "._tainted
    //#input(void userError(ErrorLevel, String, String)): "Level: "._tainted
    //#input(void userError(ErrorLevel, String, String)): "errors"._tainted
    //#input(void userError(ErrorLevel, String, String)): manager.errorListeners
    //#input(void userError(ErrorLevel, String, String)): manager.errors
    //#input(void userError(ErrorLevel, String, String)): manager.logReports
    //#input(void userError(ErrorLevel, String, String)): manager.nextErrorID
    //#input(void userError(ErrorLevel, String, String)): manager.reportQueue
    //#input(void userError(ErrorLevel, String, String)): manager.reportThread
    //#input(void userError(ErrorLevel, String, String)): manager.sendReports
    //#input(void userError(ErrorLevel, String, String)): com.dmdirc.logger.ErrorReportStatus__static_init.new ErrorReportStatus(ErrorReportStatus__static_init#1).terminal
    //#input(void userError(ErrorLevel, String, String)): com.dmdirc.logger.ErrorReportStatus__static_init.new ErrorReportStatus(ErrorReportStatus__static_init#5).terminal
    //#input(void userError(ErrorLevel, String, String)): com.dmdirc.logger.ErrorReportStatus__static_init.new ErrorReportStatus(ErrorReportStatus__static_init#6).terminal
    //#input(void userError(ErrorLevel, String, String)): com.dmdirc.ui.FatalErrorDialog$4__static_init.new int[](FatalErrorDialog$4__static_init#1).length
    //#input(void userError(ErrorLevel, String, String)): com.dmdirc.ui.FatalErrorDialog$4__static_init.new int[](FatalErrorDialog$4__static_init#1)[0..4_294_967_295]
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ErrorFixedStatus.INVALID
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ErrorFixedStatus.KNOWN
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ErrorFixedStatus.UNKNOWN
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ErrorFixedStatus.UNREPORTED
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ErrorLevel.FATAL
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ErrorListener.__Descendant_Table[com/dmdirc/logger/ErrorListener]
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ErrorListener.__Descendant_Table[com/dmdirc/ui/FatalErrorDialog]
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ErrorListener.__Descendant_Table[others]
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ErrorListener.__Dispatch_Table.errorAdded(Lcom/dmdirc/logger/ProgramError;)V
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ErrorListener.__Dispatch_Table.errorStatusChanged(Lcom/dmdirc/logger/ProgramError;)V
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ErrorListener.__Dispatch_Table.isReady()Z
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ErrorManager.java.lang.System.err
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ErrorManager.me
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ErrorReportStatus.ERROR
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ErrorReportStatus.NOT_APPLICABLE
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ErrorReportStatus.QUEUED
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ErrorReportStatus.WAITING
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ProgramError.__Descendant_Table[com/dmdirc/logger/ProgramError]
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ProgramError.__Descendant_Table[others]
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ProgramError.errorDir
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ProgramError.java.lang.System.err
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ProgramError.writingSem
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/ui/FatalErrorDialog$4.$SwitchMap$com$dmdirc$logger$ErrorReportStatus
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/ui/FatalErrorDialog.__Dispatch_Table.errorAdded(Lcom/dmdirc/logger/ProgramError;)V
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/ui/FatalErrorDialog.__Dispatch_Table.errorStatusChanged(Lcom/dmdirc/logger/ProgramError;)V
    //#input(void userError(ErrorLevel, String, String)): com/dmdirc/ui/FatalErrorDialog.__Dispatch_Table.isReady()Z
    //#input(void userError(ErrorLevel, String, String)): details
    //#input(void userError(ErrorLevel, String, String)): level
    //#input(void userError(ErrorLevel, String, String)): level._tainted
    //#input(void userError(ErrorLevel, String, String)): manager
    //#input(void userError(ErrorLevel, String, String)): message
    //#input(void userError(ErrorLevel, String, String)): message._tainted
    //#output(void userError(ErrorLevel, String, String)): manager.reportThread
    //#output(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ProgramError.errorDir
    //#output(void userError(ErrorLevel, String, String)): new ErrorReportingThread(sendError#1) num objects
    //#output(void userError(ErrorLevel, String, String)): new ErrorReportingThread(sendError#1).__Tag
    //#output(void userError(ErrorLevel, String, String)): new ErrorReportingThread(sendError#1).queue
    //#output(void userError(ErrorLevel, String, String)): new File(getErrorFile#1) num objects
    //#new obj(void userError(ErrorLevel, String, String)): new ErrorReportingThread(sendError#1)
    //#new obj(void userError(ErrorLevel, String, String)): new File(getErrorFile#1)
    //#pre[5] (void userError(ErrorLevel, String, String)): init'ed(manager.logReports)
    //#pre[6] (void userError(ErrorLevel, String, String)): manager.nextErrorID != null
    //#pre[10] (void userError(ErrorLevel, String, String)): level != null
    //#pre[12] (void userError(ErrorLevel, String, String)): message != null
    //#pre[7] (void userError(ErrorLevel, String, String)): (soft) init'ed(manager.sendReports)
    //#pre[8] (void userError(ErrorLevel, String, String)): (soft) init'ed(com.dmdirc.ui.FatalErrorDialog$4__static_init.new int[](FatalErrorDialog$4__static_init#1)[0..4_294_967_295])
    //#pre[14] (void userError(ErrorLevel, String, String)): (soft) init'ed(manager.reportThread)
    //#pre[15] (void userError(ErrorLevel, String, String)): (soft) init'ed(com/dmdirc/logger/ProgramError.errorDir)
    //#post(void userError(ErrorLevel, String, String)): com/dmdirc/logger/ProgramError.errorDir == One-of{old com/dmdirc/logger/ProgramError.errorDir, &new File(getErrorFile#1)}
    //#post(void userError(ErrorLevel, String, String)): init'ed(com/dmdirc/logger/ProgramError.errorDir)
    //#post(void userError(ErrorLevel, String, String)): manager.reportThread == old manager.reportThread
    //#post(void userError(ErrorLevel, String, String)): init'ed(manager.reportThread)
    //#post(void userError(ErrorLevel, String, String)): new ErrorReportingThread(sendError#1) num objects == 0
    //#post(void userError(ErrorLevel, String, String)): init'ed(new ErrorReportingThread(sendError#1).__Tag)
    //#post(void userError(ErrorLevel, String, String)): init'ed(new ErrorReportingThread(sendError#1).queue)
    //#post(void userError(ErrorLevel, String, String)): new File(getErrorFile#1) num objects <= 1
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:getErrorManager
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.util.concurrent.atomic.AtomicLong:getAndIncrement
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.util.Date
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.util.Arrays:copyOf
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.util.Date:clone
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:com.dmdirc.logger.ErrorReportStatus:equals
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:fireErrorStatusChanged
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.lang.Object:notifyAll
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.util.concurrent.BlockingQueue:add
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.lang.Thread:isAlive
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.lang.Thread
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:com.dmdirc.logger.ErrorReportingThread:setDaemon
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.lang.Thread:start
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.awt.GraphicsEnvironment:isHeadless
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.io.PrintStream:println
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:javax.swing.SwingUtilities:invokeLater
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.util.concurrent.Semaphore
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.util.concurrent.Semaphore:acquireUninterruptibly
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.lang.Object:wait
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:isReady
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:errorAdded
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:com.dmdirc.logger.ErrorFixedStatus:equals
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:com.dmdirc.Main:getConfigDir
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.io.File
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.io.File:mkdirs
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.util.Date:getTime
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.io.File:renameTo
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.io.File:createNewFile
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.io.FileOutputStream
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.util.concurrent.Semaphore:release
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.io.IOException:printStackTrace
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.io.OutputStream
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.io.PrintWriter
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.io.PrintWriter:println
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.io.PrintWriter:close
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:com.dmdirc.logger.ErrorReportStatus:ordinal
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:javax.swing.JButton:setText
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:javax.swing.JButton:setEnabled
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:equals
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:getReportStatus
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:errorStatusChanged
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.lang.Object:getClass
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void userError(ErrorLevel, String, String)): Effects-of-calling:java.util.Arrays:equals
    }
    //#Logger.java:58: end of method: void com.dmdirc.logger.Logger.userError(ErrorLevel, String, String)
    
    /**
     * Called when a user correctable error occurs.
     *
     * @param level Severity of the error
     * @param message Brief error description
     * @param exception Throwable cause for the error
     */
    public static void userError(final ErrorLevel level,
            final String message, final Throwable exception) {
        manager.addError(level, message, exception, false);
    //#Logger.java:69: method: void com.dmdirc.logger.Logger.userError(ErrorLevel, String, Throwable)
    //#input(void userError(ErrorLevel, String, Throwable)): "&#09;"._tainted
    //#input(void userError(ErrorLevel, String, Throwable)): "&#10;Which caused: "._tainted
    //#input(void userError(ErrorLevel, String, Throwable)): "-"._tainted
    //#input(void userError(ErrorLevel, String, Throwable)): ".log"._tainted
    //#input(void userError(ErrorLevel, String, Throwable)): ": "._tainted
    //#input(void userError(ErrorLevel, String, Throwable)): "A fatal error has occurred: "._tainted
    //#input(void userError(ErrorLevel, String, Throwable)): "An error has occurred: "._tainted
    //#input(void userError(ErrorLevel, String, Throwable)): "Date:"._tainted
    //#input(void userError(ErrorLevel, String, Throwable)): "Description: "._tainted
    //#input(void userError(ErrorLevel, String, Throwable)): "ID must be a positive integer: "._tainted
    //#input(void userError(ErrorLevel, String, Throwable)): "Level: "._tainted
    //#input(void userError(ErrorLevel, String, Throwable)): "errors"._tainted
    //#input(void userError(ErrorLevel, String, Throwable)): com.dmdirc.logger.ErrorManager__static_init.new Class[](ErrorManager__static_init#2).length
    //#input(void userError(ErrorLevel, String, Throwable)): com.dmdirc.logger.ErrorManager__static_init.new Class[](ErrorManager__static_init#2)[0..4_294_967_295]
    //#input(void userError(ErrorLevel, String, Throwable)): manager.errorListeners
    //#input(void userError(ErrorLevel, String, Throwable)): manager.errors
    //#input(void userError(ErrorLevel, String, Throwable)): manager.logReports
    //#input(void userError(ErrorLevel, String, Throwable)): manager.nextErrorID
    //#input(void userError(ErrorLevel, String, Throwable)): manager.reportQueue
    //#input(void userError(ErrorLevel, String, Throwable)): manager.reportThread
    //#input(void userError(ErrorLevel, String, Throwable)): manager.sendReports
    //#input(void userError(ErrorLevel, String, Throwable)): com.dmdirc.logger.ErrorReportStatus__static_init.new ErrorReportStatus(ErrorReportStatus__static_init#1).terminal
    //#input(void userError(ErrorLevel, String, Throwable)): com.dmdirc.logger.ErrorReportStatus__static_init.new ErrorReportStatus(ErrorReportStatus__static_init#5).terminal
    //#input(void userError(ErrorLevel, String, Throwable)): com.dmdirc.logger.ErrorReportStatus__static_init.new ErrorReportStatus(ErrorReportStatus__static_init#6).terminal
    //#input(void userError(ErrorLevel, String, Throwable)): com.dmdirc.ui.FatalErrorDialog$4__static_init.new int[](FatalErrorDialog$4__static_init#1).length
    //#input(void userError(ErrorLevel, String, Throwable)): com.dmdirc.ui.FatalErrorDialog$4__static_init.new int[](FatalErrorDialog$4__static_init#1)[0..4_294_967_295]
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorFixedStatus.INVALID
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorFixedStatus.KNOWN
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorFixedStatus.UNKNOWN
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorFixedStatus.UNREPORTED
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorLevel.FATAL
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorListener.__Descendant_Table[com/dmdirc/logger/ErrorListener]
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorListener.__Descendant_Table[com/dmdirc/ui/FatalErrorDialog]
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorListener.__Descendant_Table[others]
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorListener.__Dispatch_Table.errorAdded(Lcom/dmdirc/logger/ProgramError;)V
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorListener.__Dispatch_Table.errorStatusChanged(Lcom/dmdirc/logger/ProgramError;)V
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorListener.__Dispatch_Table.isReady()Z
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorManager.BANNED_EXCEPTIONS
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorManager.java.lang.System.err
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorManager.me
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorReportStatus.ERROR
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorReportStatus.NOT_APPLICABLE
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorReportStatus.QUEUED
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorReportStatus.WAITING
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ProgramError.__Descendant_Table[com/dmdirc/logger/ProgramError]
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ProgramError.__Descendant_Table[others]
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ProgramError.errorDir
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ProgramError.java.lang.System.err
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ProgramError.writingSem
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/ui/FatalErrorDialog$4.$SwitchMap$com$dmdirc$logger$ErrorReportStatus
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/ui/FatalErrorDialog.__Dispatch_Table.errorAdded(Lcom/dmdirc/logger/ProgramError;)V
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/ui/FatalErrorDialog.__Dispatch_Table.errorStatusChanged(Lcom/dmdirc/logger/ProgramError;)V
    //#input(void userError(ErrorLevel, String, Throwable)): com/dmdirc/ui/FatalErrorDialog.__Dispatch_Table.isReady()Z
    //#input(void userError(ErrorLevel, String, Throwable)): exception
    //#input(void userError(ErrorLevel, String, Throwable)): exception._tainted
    //#input(void userError(ErrorLevel, String, Throwable)): level
    //#input(void userError(ErrorLevel, String, Throwable)): level._tainted
    //#input(void userError(ErrorLevel, String, Throwable)): manager
    //#input(void userError(ErrorLevel, String, Throwable)): message
    //#input(void userError(ErrorLevel, String, Throwable)): message._tainted
    //#output(void userError(ErrorLevel, String, Throwable)): manager.reportThread
    //#output(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ProgramError.errorDir
    //#output(void userError(ErrorLevel, String, Throwable)): new ErrorReportingThread(sendError#1) num objects
    //#output(void userError(ErrorLevel, String, Throwable)): new ErrorReportingThread(sendError#1).__Tag
    //#output(void userError(ErrorLevel, String, Throwable)): new ErrorReportingThread(sendError#1).queue
    //#output(void userError(ErrorLevel, String, Throwable)): new File(getErrorFile#1) num objects
    //#new obj(void userError(ErrorLevel, String, Throwable)): new ErrorReportingThread(sendError#1)
    //#new obj(void userError(ErrorLevel, String, Throwable)): new File(getErrorFile#1)
    //#pre[6] (void userError(ErrorLevel, String, Throwable)): init'ed(manager.logReports)
    //#pre[7] (void userError(ErrorLevel, String, Throwable)): manager.nextErrorID != null
    //#pre[12] (void userError(ErrorLevel, String, Throwable)): level != null
    //#pre[14] (void userError(ErrorLevel, String, Throwable)): message != null
    //#pre[2] (void userError(ErrorLevel, String, Throwable)): (soft) com.dmdirc.logger.ErrorManager__static_init.new Class[](ErrorManager__static_init#2)[0..4_294_967_295] != null
    //#pre[8] (void userError(ErrorLevel, String, Throwable)): (soft) init'ed(manager.sendReports)
    //#pre[9] (void userError(ErrorLevel, String, Throwable)): (soft) init'ed(com.dmdirc.ui.FatalErrorDialog$4__static_init.new int[](FatalErrorDialog$4__static_init#1)[0..4_294_967_295])
    //#pre[16] (void userError(ErrorLevel, String, Throwable)): (soft) init'ed(manager.reportThread)
    //#pre[17] (void userError(ErrorLevel, String, Throwable)): (soft) init'ed(com/dmdirc/logger/ProgramError.errorDir)
    //#post(void userError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ProgramError.errorDir == One-of{old com/dmdirc/logger/ProgramError.errorDir, &new File(getErrorFile#1)}
    //#post(void userError(ErrorLevel, String, Throwable)): init'ed(com/dmdirc/logger/ProgramError.errorDir)
    //#post(void userError(ErrorLevel, String, Throwable)): manager.reportThread == old manager.reportThread
    //#post(void userError(ErrorLevel, String, Throwable)): init'ed(manager.reportThread)
    //#post(void userError(ErrorLevel, String, Throwable)): new ErrorReportingThread(sendError#1) num objects == 0
    //#post(void userError(ErrorLevel, String, Throwable)): init'ed(new ErrorReportingThread(sendError#1).__Tag)
    //#post(void userError(ErrorLevel, String, Throwable)): init'ed(new ErrorReportingThread(sendError#1).queue)
    //#post(void userError(ErrorLevel, String, Throwable)): new File(getErrorFile#1) num objects <= 1
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:getErrorManager
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.concurrent.atomic.AtomicLong:getAndIncrement
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.Date
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.Arrays:copyOf
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.Date:clone
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:com.dmdirc.logger.ErrorReportStatus:equals
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:fireErrorStatusChanged
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Object:notifyAll
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.concurrent.BlockingQueue:add
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Thread:isAlive
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Thread
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:com.dmdirc.logger.ErrorReportingThread:setDaemon
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Thread:start
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.awt.GraphicsEnvironment:isHeadless
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.PrintStream:println
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:javax.swing.SwingUtilities:invokeLater
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.concurrent.Semaphore
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.concurrent.Semaphore:acquireUninterruptibly
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Object:wait
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:addError
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:isReady
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:errorAdded
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:com.dmdirc.logger.ErrorFixedStatus:equals
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:com.dmdirc.Main:getConfigDir
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.File
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.File:mkdirs
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.Date:getTime
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.File:renameTo
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.File:createNewFile
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.FileOutputStream
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.concurrent.Semaphore:release
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.IOException:printStackTrace
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.OutputStream
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.PrintWriter
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.PrintWriter:println
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.PrintWriter:close
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Throwable:getStackTrace
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Throwable:toString
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.StackTraceElement:toString
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Throwable:getCause
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:getTrace
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Object:getClass
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:com.dmdirc.logger.ErrorReportStatus:ordinal
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:javax.swing.JButton:setText
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:javax.swing.JButton:setEnabled
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:equals
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:getReportStatus
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:errorStatusChanged
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void userError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.Arrays:equals
    }
    //#Logger.java:70: end of method: void com.dmdirc.logger.Logger.userError(ErrorLevel, String, Throwable)
    
    /**
     * Called when a non user correctable error occurs, the error will be
     * logged and optionally sent to the developers.
     *
     * @param level Severity of the error
     * @param message Brief error description
     * @param exception Cause of error
     */
    public static void appError(final ErrorLevel level,
            final String message, final Throwable exception) {
        manager.addError(level, message, exception, true);
    //#Logger.java:82: method: void com.dmdirc.logger.Logger.appError(ErrorLevel, String, Throwable)
    //#input(void appError(ErrorLevel, String, Throwable)): "&#09;"._tainted
    //#input(void appError(ErrorLevel, String, Throwable)): "&#10;Which caused: "._tainted
    //#input(void appError(ErrorLevel, String, Throwable)): "-"._tainted
    //#input(void appError(ErrorLevel, String, Throwable)): ".log"._tainted
    //#input(void appError(ErrorLevel, String, Throwable)): ": "._tainted
    //#input(void appError(ErrorLevel, String, Throwable)): "A fatal error has occurred: "._tainted
    //#input(void appError(ErrorLevel, String, Throwable)): "An error has occurred: "._tainted
    //#input(void appError(ErrorLevel, String, Throwable)): "Date:"._tainted
    //#input(void appError(ErrorLevel, String, Throwable)): "Description: "._tainted
    //#input(void appError(ErrorLevel, String, Throwable)): "ID must be a positive integer: "._tainted
    //#input(void appError(ErrorLevel, String, Throwable)): "Level: "._tainted
    //#input(void appError(ErrorLevel, String, Throwable)): "errors"._tainted
    //#input(void appError(ErrorLevel, String, Throwable)): com.dmdirc.logger.ErrorManager__static_init.new Class[](ErrorManager__static_init#2).length
    //#input(void appError(ErrorLevel, String, Throwable)): com.dmdirc.logger.ErrorManager__static_init.new Class[](ErrorManager__static_init#2)[0..4_294_967_295]
    //#input(void appError(ErrorLevel, String, Throwable)): manager.errorListeners
    //#input(void appError(ErrorLevel, String, Throwable)): manager.errors
    //#input(void appError(ErrorLevel, String, Throwable)): manager.logReports
    //#input(void appError(ErrorLevel, String, Throwable)): manager.nextErrorID
    //#input(void appError(ErrorLevel, String, Throwable)): manager.reportQueue
    //#input(void appError(ErrorLevel, String, Throwable)): manager.reportThread
    //#input(void appError(ErrorLevel, String, Throwable)): manager.sendReports
    //#input(void appError(ErrorLevel, String, Throwable)): com.dmdirc.logger.ErrorReportStatus__static_init.new ErrorReportStatus(ErrorReportStatus__static_init#1).terminal
    //#input(void appError(ErrorLevel, String, Throwable)): com.dmdirc.logger.ErrorReportStatus__static_init.new ErrorReportStatus(ErrorReportStatus__static_init#5).terminal
    //#input(void appError(ErrorLevel, String, Throwable)): com.dmdirc.logger.ErrorReportStatus__static_init.new ErrorReportStatus(ErrorReportStatus__static_init#6).terminal
    //#input(void appError(ErrorLevel, String, Throwable)): com.dmdirc.ui.FatalErrorDialog$4__static_init.new int[](FatalErrorDialog$4__static_init#1).length
    //#input(void appError(ErrorLevel, String, Throwable)): com.dmdirc.ui.FatalErrorDialog$4__static_init.new int[](FatalErrorDialog$4__static_init#1)[0..4_294_967_295]
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorFixedStatus.INVALID
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorFixedStatus.KNOWN
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorFixedStatus.UNKNOWN
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorFixedStatus.UNREPORTED
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorLevel.FATAL
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorListener.__Descendant_Table[com/dmdirc/logger/ErrorListener]
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorListener.__Descendant_Table[com/dmdirc/ui/FatalErrorDialog]
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorListener.__Descendant_Table[others]
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorListener.__Dispatch_Table.errorAdded(Lcom/dmdirc/logger/ProgramError;)V
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorListener.__Dispatch_Table.errorStatusChanged(Lcom/dmdirc/logger/ProgramError;)V
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorListener.__Dispatch_Table.isReady()Z
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorManager.BANNED_EXCEPTIONS
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorManager.java.lang.System.err
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorManager.me
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorReportStatus.ERROR
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorReportStatus.NOT_APPLICABLE
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorReportStatus.QUEUED
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ErrorReportStatus.WAITING
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ProgramError.__Descendant_Table[com/dmdirc/logger/ProgramError]
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ProgramError.__Descendant_Table[others]
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ProgramError.errorDir
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ProgramError.java.lang.System.err
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ProgramError.writingSem
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/ui/FatalErrorDialog$4.$SwitchMap$com$dmdirc$logger$ErrorReportStatus
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/ui/FatalErrorDialog.__Dispatch_Table.errorAdded(Lcom/dmdirc/logger/ProgramError;)V
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/ui/FatalErrorDialog.__Dispatch_Table.errorStatusChanged(Lcom/dmdirc/logger/ProgramError;)V
    //#input(void appError(ErrorLevel, String, Throwable)): com/dmdirc/ui/FatalErrorDialog.__Dispatch_Table.isReady()Z
    //#input(void appError(ErrorLevel, String, Throwable)): exception
    //#input(void appError(ErrorLevel, String, Throwable)): exception._tainted
    //#input(void appError(ErrorLevel, String, Throwable)): level
    //#input(void appError(ErrorLevel, String, Throwable)): level._tainted
    //#input(void appError(ErrorLevel, String, Throwable)): manager
    //#input(void appError(ErrorLevel, String, Throwable)): message
    //#input(void appError(ErrorLevel, String, Throwable)): message._tainted
    //#output(void appError(ErrorLevel, String, Throwable)): manager.reportThread
    //#output(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ProgramError.errorDir
    //#output(void appError(ErrorLevel, String, Throwable)): new ErrorReportingThread(sendError#1) num objects
    //#output(void appError(ErrorLevel, String, Throwable)): new ErrorReportingThread(sendError#1).__Tag
    //#output(void appError(ErrorLevel, String, Throwable)): new ErrorReportingThread(sendError#1).queue
    //#output(void appError(ErrorLevel, String, Throwable)): new File(getErrorFile#1) num objects
    //#new obj(void appError(ErrorLevel, String, Throwable)): new ErrorReportingThread(sendError#1)
    //#new obj(void appError(ErrorLevel, String, Throwable)): new File(getErrorFile#1)
    //#pre[6] (void appError(ErrorLevel, String, Throwable)): init'ed(manager.logReports)
    //#pre[7] (void appError(ErrorLevel, String, Throwable)): manager.nextErrorID != null
    //#pre[12] (void appError(ErrorLevel, String, Throwable)): level != null
    //#pre[14] (void appError(ErrorLevel, String, Throwable)): message != null
    //#pre[2] (void appError(ErrorLevel, String, Throwable)): (soft) com.dmdirc.logger.ErrorManager__static_init.new Class[](ErrorManager__static_init#2)[0..4_294_967_295] != null
    //#pre[8] (void appError(ErrorLevel, String, Throwable)): (soft) init'ed(manager.sendReports)
    //#pre[9] (void appError(ErrorLevel, String, Throwable)): (soft) init'ed(com.dmdirc.ui.FatalErrorDialog$4__static_init.new int[](FatalErrorDialog$4__static_init#1)[0..4_294_967_295])
    //#pre[16] (void appError(ErrorLevel, String, Throwable)): (soft) init'ed(manager.reportThread)
    //#pre[17] (void appError(ErrorLevel, String, Throwable)): (soft) init'ed(com/dmdirc/logger/ProgramError.errorDir)
    //#post(void appError(ErrorLevel, String, Throwable)): com/dmdirc/logger/ProgramError.errorDir == One-of{old com/dmdirc/logger/ProgramError.errorDir, &new File(getErrorFile#1)}
    //#post(void appError(ErrorLevel, String, Throwable)): init'ed(com/dmdirc/logger/ProgramError.errorDir)
    //#post(void appError(ErrorLevel, String, Throwable)): manager.reportThread == One-of{old manager.reportThread, &new ErrorReportingThread(sendError#1)}
    //#post(void appError(ErrorLevel, String, Throwable)): init'ed(manager.reportThread)
    //#post(void appError(ErrorLevel, String, Throwable)): new ErrorReportingThread(sendError#1) num objects <= 1
    //#post(void appError(ErrorLevel, String, Throwable)): init'ed(new ErrorReportingThread(sendError#1).__Tag)
    //#post(void appError(ErrorLevel, String, Throwable)): init'ed(new ErrorReportingThread(sendError#1).queue)
    //#post(void appError(ErrorLevel, String, Throwable)): new File(getErrorFile#1) num objects <= 1
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:getErrorManager
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.concurrent.atomic.AtomicLong:getAndIncrement
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.Date
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.Arrays:copyOf
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.Date:clone
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:com.dmdirc.logger.ErrorReportStatus:equals
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:fireErrorStatusChanged
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Object:notifyAll
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.concurrent.BlockingQueue:add
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Thread:isAlive
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Thread
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:com.dmdirc.logger.ErrorReportingThread:setDaemon
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Thread:start
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.awt.GraphicsEnvironment:isHeadless
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.PrintStream:println
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:javax.swing.SwingUtilities:invokeLater
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.concurrent.Semaphore
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.concurrent.Semaphore:acquireUninterruptibly
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Object:wait
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:addError
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:isReady
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:errorAdded
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:com.dmdirc.logger.ErrorFixedStatus:equals
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:com.dmdirc.Main:getConfigDir
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.File
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.File:mkdirs
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.Date:getTime
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.File:renameTo
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.File:createNewFile
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.FileOutputStream
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.concurrent.Semaphore:release
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.IOException:printStackTrace
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.OutputStream
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.PrintWriter
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.PrintWriter:println
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.io.PrintWriter:close
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Throwable:getStackTrace
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Throwable:toString
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.StackTraceElement:toString
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Throwable:getCause
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:getTrace
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Object:getClass
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:com.dmdirc.logger.ErrorReportStatus:ordinal
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:javax.swing.JButton:setText
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:javax.swing.JButton:setEnabled
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:equals
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:getReportStatus
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:errorStatusChanged
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void appError(ErrorLevel, String, Throwable)): Effects-of-calling:java.util.Arrays:equals
    }
    //#Logger.java:83: end of method: void com.dmdirc.logger.Logger.appError(ErrorLevel, String, Throwable)
    
    /**
     * Asserts that the specified value is true. If not, an AssertionError
     * exception is thrown.
     * 
     * @param value The value to be tested
     */
    public static void assertTrue(final boolean value) {
        if (!value) {
    //#Logger.java:92: method: void com.dmdirc.logger.Logger.assertTrue(bool)
    //#input(void assertTrue(bool)): value
    //#pre[1] (void assertTrue(bool)): value == 1
            throw new AssertionError();
        }
    }
    //#Logger.java:95: end of method: void com.dmdirc.logger.Logger.assertTrue(bool)
    
}
    //#Logger.java:: end of class: com.dmdirc.logger.Logger
