//# 2 errors, 532 messages
//#
/*
    //#IRCProcessor.java:1:1: class: com.dmdirc.parser.irc.IRCProcessor
    //#IRCProcessor.java:1:1: method: com.dmdirc.parser.irc.IRCProcessor.com.dmdirc.parser.irc.IRCProcessor__static_init
 * 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.parser.irc;

import com.dmdirc.parser.irc.callbacks.CallbackManager;

/**
 * IRCProcessor.
 * Superclass for all IRCProcessor types.
 *
 * @author Shane Mc Cormack
 */
public abstract class IRCProcessor {
	/** Reference to the IRCParser that owns this IRCProcessor. */
	protected IRCParser myParser;
	
	/** Reference to the Processing in charge of this IRCProcessor. */
	protected ProcessingManager myManager;

	// Some functions from the main parser are useful, and having to use myParser.functionName
	// is annoying, so we also implement them here (calling them again using myParser)
	/**
	 * Create a new instance of the IRCProcessor Object.
	 *
	 * @param parser IRCParser That owns this IRCProcessor
	 * @param manager ProcessingManager that is in charge of this IRCProcessor
	 */
	protected IRCProcessor(final IRCParser parser, final ProcessingManager manager) {
    //#IRCProcessor.java:48: method: void com.dmdirc.parser.irc.IRCProcessor.com.dmdirc.parser.irc.IRCProcessor(IRCParser, ProcessingManager)
    //#input(void com.dmdirc.parser.irc.IRCProcessor(IRCParser, ProcessingManager)): manager
    //#input(void com.dmdirc.parser.irc.IRCProcessor(IRCParser, ProcessingManager)): parser
    //#input(void com.dmdirc.parser.irc.IRCProcessor(IRCParser, ProcessingManager)): this
    //#output(void com.dmdirc.parser.irc.IRCProcessor(IRCParser, ProcessingManager)): this.myManager
    //#output(void com.dmdirc.parser.irc.IRCProcessor(IRCParser, ProcessingManager)): this.myParser
    //#post(void com.dmdirc.parser.irc.IRCProcessor(IRCParser, ProcessingManager)): this.myManager == manager
    //#post(void com.dmdirc.parser.irc.IRCProcessor(IRCParser, ProcessingManager)): init'ed(this.myManager)
    //#post(void com.dmdirc.parser.irc.IRCProcessor(IRCParser, ProcessingManager)): this.myParser == parser
    //#post(void com.dmdirc.parser.irc.IRCProcessor(IRCParser, ProcessingManager)): init'ed(this.myParser)
		this.myParser = parser;
		this.myManager = manager;
	}
    //#IRCProcessor.java:51: end of method: void com.dmdirc.parser.irc.IRCProcessor.com.dmdirc.parser.irc.IRCProcessor(IRCParser, ProcessingManager)

	/**
	 * Callback to all objects implementing the IErrorInfo Interface.
	 *
	 * @see com.dmdirc.parser.irc.callbacks.interfaces.IErrorInfo
	 * @param errorInfo ParserError object representing the error.
	 * @return true if a method was called, false otherwise
	 */
	protected final boolean callErrorInfo(final ParserError errorInfo) {
		return myParser.callErrorInfo(errorInfo);
    //#IRCProcessor.java:61: method: bool com.dmdirc.parser.irc.IRCProcessor.callErrorInfo(ParserError)
    //#input(bool callErrorInfo(ParserError)): "Callback not found: "._tainted
    //#input(bool callErrorInfo(ParserError)): "OnErrorInfo"._tainted
    //#input(bool callErrorInfo(ParserError)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(bool callErrorInfo(ParserError)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(bool callErrorInfo(ParserError)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callErrorInfo(Lcom/dmdirc/parser/irc/ParserError;)Z
    //#input(bool callErrorInfo(ParserError)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(bool callErrorInfo(ParserError)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(bool callErrorInfo(ParserError)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(bool callErrorInfo(ParserError)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callErrorInfo(ParserError)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callErrorInfo(ParserError)): errorInfo
    //#input(bool callErrorInfo(ParserError)): this
    //#input(bool callErrorInfo(ParserError)): this.myParser
    //#input(bool callErrorInfo(ParserError)): this.myParser.__Tag
    //#input(bool callErrorInfo(ParserError)): this.myParser.myCallbackManager
    //#input(bool callErrorInfo(ParserError)): this.myParser.myCallbackManager.callbackHash
    //#output(bool callErrorInfo(ParserError)): return_value
    //#pre[3] (bool callErrorInfo(ParserError)): this.myParser != null
    //#pre[4] (bool callErrorInfo(ParserError)): this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[5] (bool callErrorInfo(ParserError)): this.myParser.myCallbackManager != null
    //#pre[6] (bool callErrorInfo(ParserError)): this.myParser.myCallbackManager.callbackHash != null
    //#post(bool callErrorInfo(ParserError)): init'ed(return_value)
    //#unanalyzed(bool callErrorInfo(ParserError)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool callErrorInfo(ParserError)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(bool callErrorInfo(ParserError)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool callErrorInfo(ParserError)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool callErrorInfo(ParserError)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool callErrorInfo(ParserError)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(bool callErrorInfo(ParserError)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(bool callErrorInfo(ParserError)): Effects-of-calling:call
    //#IRCProcessor.java:61: end of method: bool com.dmdirc.parser.irc.IRCProcessor.callErrorInfo(ParserError)
	}
	
	/**
	 * Callback to all objects implementing the DebugInfo Callback.
	 *
	 * @see com.dmdirc.parser.irc.callbacks.interfaces.IDebugInfo
	 * @param level Debugging Level (DEBUG_INFO, ndSocket etc)
	 * @param data Debugging Information
	 * @param args Formatting String Options
	 * @return true if a method was called, false otherwise
	 */
	protected final boolean callDebugInfo(final int level, final String data, final Object... args) {
		return myParser.callDebugInfo(level, String.format(data, args));
    //#IRCProcessor.java:74: method: bool com.dmdirc.parser.irc.IRCProcessor.callDebugInfo(int, String, Object[])
    //#input(bool callDebugInfo(int, String, Object[])): "Callback not found: "._tainted
    //#input(bool callDebugInfo(int, String, Object[])): "OnDebugInfo"._tainted
    //#input(bool callDebugInfo(int, String, Object[])): args
    //#input(bool callDebugInfo(int, String, Object[])): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(bool callDebugInfo(int, String, Object[])): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(bool callDebugInfo(int, String, Object[])): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(bool callDebugInfo(int, String, Object[])): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(bool callDebugInfo(int, String, Object[])): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(bool callDebugInfo(int, String, Object[])): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(bool callDebugInfo(int, String, Object[])): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callDebugInfo(int, String, Object[])): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callDebugInfo(int, String, Object[])): data
    //#input(bool callDebugInfo(int, String, Object[])): level
    //#input(bool callDebugInfo(int, String, Object[])): this
    //#input(bool callDebugInfo(int, String, Object[])): this.myParser
    //#input(bool callDebugInfo(int, String, Object[])): this.myParser.__Tag
    //#input(bool callDebugInfo(int, String, Object[])): this.myParser.myCallbackManager
    //#input(bool callDebugInfo(int, String, Object[])): this.myParser.myCallbackManager.callbackHash
    //#output(bool callDebugInfo(int, String, Object[])): return_value
    //#pre[5] (bool callDebugInfo(int, String, Object[])): this.myParser != null
    //#pre[6] (bool callDebugInfo(int, String, Object[])): this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[7] (bool callDebugInfo(int, String, Object[])): this.myParser.myCallbackManager != null
    //#pre[8] (bool callDebugInfo(int, String, Object[])): this.myParser.myCallbackManager.callbackHash != null
    //#post(bool callDebugInfo(int, String, Object[])): init'ed(return_value)
    //#unanalyzed(bool callDebugInfo(int, String, Object[])): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool callDebugInfo(int, String, Object[])): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(bool callDebugInfo(int, String, Object[])): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool callDebugInfo(int, String, Object[])): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool callDebugInfo(int, String, Object[])): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool callDebugInfo(int, String, Object[])): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(bool callDebugInfo(int, String, Object[])): Effects-of-calling:java.util.Map:get
    //#unanalyzed(bool callDebugInfo(int, String, Object[])): Effects-of-calling:call
    //#unanalyzed(bool callDebugInfo(int, String, Object[])): Effects-of-calling:java.lang.Integer:valueOf
    //#IRCProcessor.java:74: end of method: bool com.dmdirc.parser.irc.IRCProcessor.callDebugInfo(int, String, Object[])
	}
	
	/**
	 * Callback to all objects implementing the DebugInfo Callback.
	 *
	 * @see com.dmdirc.parser.irc.callbacks.interfaces.IDebugInfo
	 * @param level Debugging Level (DEBUG_INFO, ndSocket etc)
	 * @param data Debugging Information
	 * @return true if a method was called, false otherwise
	 */
	protected final boolean callDebugInfo(final int level, final String data) {
		return myParser.callDebugInfo(level, data);
    //#IRCProcessor.java:86: method: bool com.dmdirc.parser.irc.IRCProcessor.callDebugInfo(int, String)
    //#input(bool callDebugInfo(int, String)): "Callback not found: "._tainted
    //#input(bool callDebugInfo(int, String)): "OnDebugInfo"._tainted
    //#input(bool callDebugInfo(int, String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(bool callDebugInfo(int, String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(bool callDebugInfo(int, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(bool callDebugInfo(int, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(bool callDebugInfo(int, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(bool callDebugInfo(int, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(bool callDebugInfo(int, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callDebugInfo(int, String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callDebugInfo(int, String)): data
    //#input(bool callDebugInfo(int, String)): level
    //#input(bool callDebugInfo(int, String)): this
    //#input(bool callDebugInfo(int, String)): this.myParser
    //#input(bool callDebugInfo(int, String)): this.myParser.__Tag
    //#input(bool callDebugInfo(int, String)): this.myParser.myCallbackManager
    //#input(bool callDebugInfo(int, String)): this.myParser.myCallbackManager.callbackHash
    //#output(bool callDebugInfo(int, String)): return_value
    //#pre[4] (bool callDebugInfo(int, String)): this.myParser != null
    //#pre[5] (bool callDebugInfo(int, String)): this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[6] (bool callDebugInfo(int, String)): this.myParser.myCallbackManager != null
    //#pre[7] (bool callDebugInfo(int, String)): this.myParser.myCallbackManager.callbackHash != null
    //#post(bool callDebugInfo(int, String)): init'ed(return_value)
    //#unanalyzed(bool callDebugInfo(int, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool callDebugInfo(int, String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(bool callDebugInfo(int, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool callDebugInfo(int, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool callDebugInfo(int, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool callDebugInfo(int, String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(bool callDebugInfo(int, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(bool callDebugInfo(int, String)): Effects-of-calling:call
    //#unanalyzed(bool callDebugInfo(int, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#IRCProcessor.java:86: end of method: bool com.dmdirc.parser.irc.IRCProcessor.callDebugInfo(int, String)
	}
	
	/**
	 * Check if a channel name is valid .
	 *
	 * @param sChannelName Channel name to test
	 * @return true if name is valid on the current connection, false otherwise. (Always false before noMOTD/MOTDEnd)
	 */
	protected final boolean isValidChannelName(final String sChannelName) {
		return myParser.isValidChannelName(sChannelName);
    //#IRCProcessor.java:96: method: bool com.dmdirc.parser.irc.IRCProcessor.isValidChannelName(String)
    //#input(bool isValidChannelName(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(bool isValidChannelName(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(bool isValidChannelName(String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(bool isValidChannelName(String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(bool isValidChannelName(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(bool isValidChannelName(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(bool isValidChannelName(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getMyNickname()Ljava/lang/String;
    //#input(bool isValidChannelName(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.isValidChannelName(Ljava/lang/String;)Z
    //#input(bool isValidChannelName(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(bool isValidChannelName(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(bool isValidChannelName(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.equalsIgnoreCase(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(bool isValidChannelName(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(bool isValidChannelName(String)): sChannelName
    //#input(bool isValidChannelName(String)): this
    //#input(bool isValidChannelName(String)): this.myParser
    //#input(bool isValidChannelName(String)): this.myParser.__Tag
    //#input(bool isValidChannelName(String)): this.myParser.cMyself
    //#input(bool isValidChannelName(String)): this.myParser.cMyself.bIsFake
    //#input(bool isValidChannelName(String)): this.myParser.cMyself.sNickname
    //#input(bool isValidChannelName(String)): this.myParser.hChanPrefix
    //#input(bool isValidChannelName(String)): this.myParser.hChannelList
    //#input(bool isValidChannelName(String)): this.myParser.sThinkNickname
    //#input(bool isValidChannelName(String)): this.myParser.stringConverter
    //#input(bool isValidChannelName(String)): this.myParser.stringConverter.__Tag
    //#input(bool isValidChannelName(String)): this.myParser.stringConverter.lowercase
    //#input(bool isValidChannelName(String)): this.myParser.stringConverter.lowercase.length
    //#output(bool isValidChannelName(String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(bool isValidChannelName(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(bool isValidChannelName(String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(bool isValidChannelName(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(bool isValidChannelName(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(bool isValidChannelName(String)): new char[](IRCStringConverter#1) num objects
    //#output(bool isValidChannelName(String)): new char[](IRCStringConverter#1).length
    //#output(bool isValidChannelName(String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(bool isValidChannelName(String)): new char[](IRCStringConverter#2) num objects
    //#output(bool isValidChannelName(String)): new char[](IRCStringConverter#2).length
    //#output(bool isValidChannelName(String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(bool isValidChannelName(String)): return_value
    //#output(bool isValidChannelName(String)): this.myParser.stringConverter
    //#new obj(bool isValidChannelName(String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(bool isValidChannelName(String)): new char[](IRCStringConverter#1)
    //#new obj(bool isValidChannelName(String)): new char[](IRCStringConverter#2)
    //#pre[4] (bool isValidChannelName(String)): this.myParser != null
    //#pre[5] (bool isValidChannelName(String)): this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[1] (bool isValidChannelName(String)): (soft) init'ed(this.myParser.stringConverter)
    //#pre[6] (bool isValidChannelName(String)): (soft) this.myParser.cMyself != null
    //#pre[7] (bool isValidChannelName(String)): (soft) init'ed(this.myParser.cMyself.bIsFake)
    //#pre[8] (bool isValidChannelName(String)): (soft) init'ed(this.myParser.cMyself.sNickname)
    //#pre[9] (bool isValidChannelName(String)): (soft) this.myParser.hChanPrefix != null
    //#pre[10] (bool isValidChannelName(String)): (soft) this.myParser.hChannelList != null
    //#pre[12] (bool isValidChannelName(String)): (soft) init'ed(this.myParser.sThinkNickname)
    //#post(bool isValidChannelName(String)): init'ed(return_value)
    //#post(bool isValidChannelName(String)): init'ed(this.myParser.stringConverter)
    //#post(bool isValidChannelName(String)): new IRCStringConverter(getIRCStringConverter#1) num objects == 0
    //#post(bool isValidChannelName(String)): new char[](IRCStringConverter#1) num objects == 0
    //#post(bool isValidChannelName(String)): new char[](IRCStringConverter#2) num objects == 0
    //#post(bool isValidChannelName(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(bool isValidChannelName(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(bool isValidChannelName(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(bool isValidChannelName(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(bool isValidChannelName(String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(bool isValidChannelName(String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(bool isValidChannelName(String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(bool isValidChannelName(String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:java.lang.String
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:isFake
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:getNickname
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:java.util.Map:isEmpty
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:java.lang.String:equals
    //#IRCProcessor.java:96: end of method: bool com.dmdirc.parser.irc.IRCProcessor.isValidChannelName(String)
	}
	
	/**
	 * Get the ClientInfo object for a person.
	 *
	 * @param sWho Who can be any valid identifier for a client as long as it contains a nickname (?:)nick(?!ident)(?@host)
	 * @return ClientInfo Object for the client, or null
	 */
	protected final ClientInfo getClientInfo(final String sWho) {
		return myParser.getClientInfo(sWho);
    //#IRCProcessor.java:106: method: ClientInfo com.dmdirc.parser.irc.IRCProcessor.getClientInfo(String)
    //#IRCProcessor.java:106: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCParser.getClientInfo: (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCProcessor
    //#    method: ClientInfo getClientInfo(String)
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#    callee: ClientInfo com/dmdirc/parser/irc/IRCParser.getClientInfo(String)
    //#    callee assertion: (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#    callee file: IRCParser.java
    //#    callee precondition index: [10]
    //#    callee srcpos: 870
    //#    VN: this.myParser.stringConverter.lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
    //#input(ClientInfo getClientInfo(String)): com/dmdirc/parser/irc/ClientInfo.__Descendant_Table[com/dmdirc/parser/irc/ClientInfo]
    //#input(ClientInfo getClientInfo(String)): com/dmdirc/parser/irc/ClientInfo.__Descendant_Table[others]
    //#input(ClientInfo getClientInfo(String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(ClientInfo getClientInfo(String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(ClientInfo getClientInfo(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getClientInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ClientInfo;
    //#input(ClientInfo getClientInfo(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(ClientInfo getClientInfo(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(ClientInfo getClientInfo(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(ClientInfo getClientInfo(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(ClientInfo getClientInfo(String)): sWho
    //#input(ClientInfo getClientInfo(String)): sWho._tainted
    //#input(ClientInfo getClientInfo(String)): this
    //#input(ClientInfo getClientInfo(String)): this.myParser
    //#input(ClientInfo getClientInfo(String)): this.myParser.__Tag
    //#input(ClientInfo getClientInfo(String)): this.myParser.hClientList
    //#input(ClientInfo getClientInfo(String)): this.myParser.stringConverter
    //#input(ClientInfo getClientInfo(String)): this.myParser.stringConverter.__Tag
    //#input(ClientInfo getClientInfo(String)): this.myParser.stringConverter.lowercase
    //#input(ClientInfo getClientInfo(String)): this.myParser.stringConverter.lowercase.length
    //#input(ClientInfo getClientInfo(String)): this.myParser.stringConverter.lowercase[0..65_535]
    //#output(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#1) num objects
    //#output(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#1).length
    //#output(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#2) num objects
    //#output(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#2).length
    //#output(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(ClientInfo getClientInfo(String)): return_value
    //#output(ClientInfo getClientInfo(String)): this.myParser.stringConverter
    //#new obj(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#1)
    //#new obj(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#2)
    //#pre[1] (ClientInfo getClientInfo(String)): init'ed(this.myParser.stringConverter)
    //#pre[2] (ClientInfo getClientInfo(String)): sWho != null
    //#pre[5] (ClientInfo getClientInfo(String)): this.myParser != null
    //#pre[6] (ClientInfo getClientInfo(String)): this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[7] (ClientInfo getClientInfo(String)): this.myParser.hClientList != null
    //#pre[8] (ClientInfo getClientInfo(String)): (soft) this.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#pre[9] (ClientInfo getClientInfo(String)): (soft) this.myParser.stringConverter.lowercase != null
    //#pre[11] (ClientInfo getClientInfo(String)): (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#post(ClientInfo getClientInfo(String)): init'ed(return_value)
    //#post(ClientInfo getClientInfo(String)): this.myParser.stringConverter == One-of{old this.myParser.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(ClientInfo getClientInfo(String)): this.myParser.stringConverter != null
    //#post(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1).limit == 4
    //#post(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#1).length == 127
    //#post(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#2).length == 127
    //#post(ClientInfo getClientInfo(String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(ClientInfo getClientInfo(String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(ClientInfo getClientInfo(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(ClientInfo getClientInfo(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(ClientInfo getClientInfo(String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(ClientInfo getClientInfo(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(ClientInfo getClientInfo(String)): Effects-of-calling:java.lang.String
    //#unanalyzed(ClientInfo getClientInfo(String)): Effects-of-calling:parseHost
    //#unanalyzed(ClientInfo getClientInfo(String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(ClientInfo getClientInfo(String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(ClientInfo getClientInfo(String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(ClientInfo getClientInfo(String)): Effects-of-calling:java.lang.String:split
    //#IRCProcessor.java:106: end of method: ClientInfo com.dmdirc.parser.irc.IRCProcessor.getClientInfo(String)
	}
	
	/**
	 * Get the ChannelInfo object for a channel.
	 *
	 * @param sWhat This is the name of the channel.
	 * @return ChannelInfo Object for the channel, or null
	 */
	protected final ChannelInfo getChannelInfo(final String sWhat) {
		return myParser.getChannelInfo(sWhat);
    //#IRCProcessor.java:116: method: ChannelInfo com.dmdirc.parser.irc.IRCProcessor.getChannelInfo(String)
    //#IRCProcessor.java:116: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCParser.getChannelInfo: (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCProcessor
    //#    method: ChannelInfo getChannelInfo(String)
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#    callee: ChannelInfo com/dmdirc/parser/irc/IRCParser.getChannelInfo(String)
    //#    callee assertion: (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#    callee file: IRCParser.java
    //#    callee precondition index: [9]
    //#    callee srcpos: 894
    //#    VN: this.myParser.stringConverter.lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
    //#input(ChannelInfo getChannelInfo(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(ChannelInfo getChannelInfo(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(ChannelInfo getChannelInfo(String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(ChannelInfo getChannelInfo(String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(ChannelInfo getChannelInfo(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(ChannelInfo getChannelInfo(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(ChannelInfo getChannelInfo(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(ChannelInfo getChannelInfo(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(ChannelInfo getChannelInfo(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(ChannelInfo getChannelInfo(String)): sWhat
    //#input(ChannelInfo getChannelInfo(String)): this
    //#input(ChannelInfo getChannelInfo(String)): this.myParser
    //#input(ChannelInfo getChannelInfo(String)): this.myParser.__Tag
    //#input(ChannelInfo getChannelInfo(String)): this.myParser.hChannelList
    //#input(ChannelInfo getChannelInfo(String)): this.myParser.stringConverter
    //#input(ChannelInfo getChannelInfo(String)): this.myParser.stringConverter.__Tag
    //#input(ChannelInfo getChannelInfo(String)): this.myParser.stringConverter.lowercase
    //#input(ChannelInfo getChannelInfo(String)): this.myParser.stringConverter.lowercase.length
    //#input(ChannelInfo getChannelInfo(String)): this.myParser.stringConverter.lowercase[0..65_535]
    //#output(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#1) num objects
    //#output(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#1).length
    //#output(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#2) num objects
    //#output(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#2).length
    //#output(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(ChannelInfo getChannelInfo(String)): return_value
    //#output(ChannelInfo getChannelInfo(String)): this.myParser.stringConverter
    //#new obj(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#1)
    //#new obj(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#2)
    //#pre[1] (ChannelInfo getChannelInfo(String)): init'ed(this.myParser.stringConverter)
    //#pre[2] (ChannelInfo getChannelInfo(String)): sWhat != null
    //#pre[4] (ChannelInfo getChannelInfo(String)): this.myParser != null
    //#pre[5] (ChannelInfo getChannelInfo(String)): this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[6] (ChannelInfo getChannelInfo(String)): this.myParser.hChannelList != null
    //#pre[8] (ChannelInfo getChannelInfo(String)): (soft) this.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#pre[9] (ChannelInfo getChannelInfo(String)): (soft) this.myParser.stringConverter.lowercase != null
    //#pre[11] (ChannelInfo getChannelInfo(String)): (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#post(ChannelInfo getChannelInfo(String)): init'ed(return_value)
    //#post(ChannelInfo getChannelInfo(String)): this.myParser.stringConverter == One-of{old this.myParser.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(ChannelInfo getChannelInfo(String)): this.myParser.stringConverter != null
    //#post(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1).limit == 4
    //#post(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#1).length == 127
    //#post(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#2).length == 127
    //#post(ChannelInfo getChannelInfo(String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(ChannelInfo getChannelInfo(String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(ChannelInfo getChannelInfo(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(ChannelInfo getChannelInfo(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(ChannelInfo getChannelInfo(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(ChannelInfo getChannelInfo(String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(ChannelInfo getChannelInfo(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(ChannelInfo getChannelInfo(String)): Effects-of-calling:java.lang.String
    //#IRCProcessor.java:116: end of method: ChannelInfo com.dmdirc.parser.irc.IRCProcessor.getChannelInfo(String)
	}
	
	/**
	 * Get a reference to the CallbackManager.
	 *
	 * @return Reference to the CallbackManager
	 */
	protected final CallbackManager getCallbackManager() {
		return myParser.getCallbackManager();
    //#IRCProcessor.java:125: method: CallbackManager com.dmdirc.parser.irc.IRCProcessor.getCallbackManager()
    //#input(CallbackManager getCallbackManager()): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(CallbackManager getCallbackManager()): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(CallbackManager getCallbackManager()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getCallbackManager()Lcom/dmdirc/parser/irc/callbacks/CallbackManager;
    //#input(CallbackManager getCallbackManager()): this
    //#input(CallbackManager getCallbackManager()): this.myParser
    //#input(CallbackManager getCallbackManager()): this.myParser.__Tag
    //#input(CallbackManager getCallbackManager()): this.myParser.myCallbackManager
    //#output(CallbackManager getCallbackManager()): return_value
    //#pre[2] (CallbackManager getCallbackManager()): this.myParser != null
    //#pre[3] (CallbackManager getCallbackManager()): this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[4] (CallbackManager getCallbackManager()): init'ed(this.myParser.myCallbackManager)
    //#post(CallbackManager getCallbackManager()): return_value == this.myParser.myCallbackManager
    //#post(CallbackManager getCallbackManager()): init'ed(return_value)
    //#IRCProcessor.java:125: end of method: CallbackManager com.dmdirc.parser.irc.IRCProcessor.getCallbackManager()
	}
	
	/** 
	 * Send a line to the server and add proper line ending.
	 *
	 * @param line Line to send (\r\n termination is added automatically)
	 */
	protected final void sendString(final String line) {
		myParser.sendString(line);
    //#IRCProcessor.java:134: method: void com.dmdirc.parser.irc.IRCProcessor.sendString(String)
    //#input(void sendString(String)): " for mode "._tainted
    //#input(void sendString(String)): "Callback not found: "._tainted
    //#input(void sendString(String)): "Intercepted mode request for "._tainted
    //#input(void sendString(String)): "OnDataOut"._tainted
    //#input(void sendString(String)): "OnDebugInfo"._tainted
    //#input(void sendString(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void sendString(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void sendString(String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void sendString(String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void sendString(String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(void sendString(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void sendString(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void sendString(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void sendString(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void sendString(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void sendString(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void sendString(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void sendString(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void sendString(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void sendString(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void sendString(String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void sendString(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void sendString(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void sendString(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void sendString(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendString(String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendString(String)): line
    //#input(void sendString(String)): line._tainted
    //#input(void sendString(String)): this
    //#input(void sendString(String)): this.myParser
    //#input(void sendString(String)): this.myParser.__Tag
    //#input(void sendString(String)): this.myParser.cMyself
    //#input(void sendString(String)): this.myParser.currentSocketState
    //#input(void sendString(String)): this.myParser.hChanModesOther
    //#input(void sendString(String)): this.myParser.hChannelList
    //#input(void sendString(String)): this.myParser.myCallbackManager
    //#input(void sendString(String)): this.myParser.myCallbackManager.callbackHash
    //#input(void sendString(String)): this.myParser.out
    //#input(void sendString(String)): this.myParser.stringConverter
    //#input(void sendString(String)): this.myParser.stringConverter.__Tag
    //#input(void sendString(String)): this.myParser.stringConverter.lowercase
    //#input(void sendString(String)): this.myParser.stringConverter.lowercase.length
    //#output(void sendString(String)): java.lang.String:substring(...)._tainted
    //#output(void sendString(String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void sendString(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void sendString(String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void sendString(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void sendString(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void sendString(String)): new char[](IRCStringConverter#1) num objects
    //#output(void sendString(String)): new char[](IRCStringConverter#1).length
    //#output(void sendString(String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void sendString(String)): new char[](IRCStringConverter#2) num objects
    //#output(void sendString(String)): new char[](IRCStringConverter#2).length
    //#output(void sendString(String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void sendString(String)): this.myParser.cMyself.myAwayReason
    //#output(void sendString(String)): this.myParser.stringConverter
    //#new obj(void sendString(String)): java.lang.String:substring(...)
    //#new obj(void sendString(String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void sendString(String)): new char[](IRCStringConverter#1)
    //#new obj(void sendString(String)): new char[](IRCStringConverter#2)
    //#pre[6] (void sendString(String)): this.myParser != null
    //#pre[7] (void sendString(String)): this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[15] (void sendString(String)): init'ed(this.myParser.out)
    //#pre[4] (void sendString(String)): (soft) init'ed(this.myParser.stringConverter)
    //#pre[8] (void sendString(String)): (soft) this.myParser.cMyself != null
    //#pre[9] (void sendString(String)): (soft) init'ed(this.myParser.currentSocketState)
    //#pre[10] (void sendString(String)): (soft) this.myParser.hChanModesOther != null
    //#pre[11] (void sendString(String)): (soft) this.myParser.hChannelList != null
    //#pre[13] (void sendString(String)): (soft) this.myParser.myCallbackManager != null
    //#pre[14] (void sendString(String)): (soft) this.myParser.myCallbackManager.callbackHash != null
    //#post(void sendString(String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void sendString(String)): possibly_updated(this.myParser.cMyself.myAwayReason)
    //#post(void sendString(String)): this.myParser.stringConverter == One-of{old this.myParser.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void sendString(String)): init'ed(this.myParser.stringConverter)
    //#post(void sendString(String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void sendString(String)): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void sendString(String)): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void sendString(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void sendString(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void sendString(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void sendString(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void sendString(String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void sendString(String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void sendString(String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void sendString(String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void sendString(String)): Effects-of-calling:doSendString
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void sendString(String)): Effects-of-calling:call
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void sendString(String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void sendString(String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.System:currentTimeMillis
	}
    //#IRCProcessor.java:135: end of method: void com.dmdirc.parser.irc.IRCProcessor.sendString(String)
	
	/**
	 * Process a Line.
	 *
	 * @param sParam Type of line to process ("005", "PRIVMSG" etc)
	 * @param token IRCTokenised line to process
	 */
	public abstract void process(final String sParam, final String[] token);
	
	/**
	 * What does this IRCProcessor handle.
	 *
	 * @return String[] with the names of the tokens we handle.
	 */
	public abstract String[] handles();
	
	/** 
	 * Get the name for this Processor.
	 * @return the name of this processor
	 */
	public final String getName() {
		final Package thisPackage = this.getClass().getPackage();
    //#IRCProcessor.java:157: method: String com.dmdirc.parser.irc.IRCProcessor.getName()
    //#input(String getName()): this
    //#output(String getName()): java.lang.String:substring(...)._tainted
    //#output(String getName()): return_value
    //#new obj(String getName()): java.lang.String:substring(...)
    //#presumption(String getName()): java.lang.Class:getName(...)@162 != null
    //#presumption(String getName()): java.lang.Object:getClass(...)@157 != null
    //#presumption(String getName()): java.lang.Object:getClass(...)@162 != null
    //#presumption(String getName()): java.lang.Package:getName(...)@160 != null
    //#presumption(String getName()): java.lang.String:length(...)@160 <= 4_294_967_294
    //#post(String getName()): java.lang.String:substring(...)._tainted == 0
    //#post(String getName()): return_value == &java.lang.String:substring(...)
    //#test_vector(String getName()): java.lang.Class:getPackage(...)@157: Addr_Set{null}, Inverse{null}
		int packageLength = 0;
		if (thisPackage != null) {
			packageLength = thisPackage.getName().length() + 1;
		}
		return this.getClass().getName().substring(packageLength);
    //#IRCProcessor.java:162: end of method: String com.dmdirc.parser.irc.IRCProcessor.getName()
	}
	
	/** 
	 * Get the name for this Processor in lowercase.
	 * @return lower case name of this processor
	 */
	public final String getLowerName() {
		return this.getName().toLowerCase();
    //#IRCProcessor.java:170: method: String com.dmdirc.parser.irc.IRCProcessor.getLowerName()
    //#IRCProcessor.java:170: Warning: unused assignment in callee
    //#    Unused assignment to (java.lang.String:substring(...)._tainted) in getName
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCProcessor
    //#    method: String getLowerName()
    //#input(String getLowerName()): this
    //#output(String getLowerName()): return_value
    //#post(String getLowerName()): return_value != null
    //#unanalyzed(String getLowerName()): Effects-of-calling:java.lang.Object:getClass
    //#unanalyzed(String getLowerName()): Effects-of-calling:java.lang.Class:getPackage
    //#unanalyzed(String getLowerName()): Effects-of-calling:java.lang.Package:getName
    //#unanalyzed(String getLowerName()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(String getLowerName()): Effects-of-calling:java.lang.Class:getName
    //#unanalyzed(String getLowerName()): Effects-of-calling:java.lang.String:substring
    //#IRCProcessor.java:170: end of method: String com.dmdirc.parser.irc.IRCProcessor.getLowerName()
	}
	
	/** 
	 * Get the name for this Processor.
	 * @return the name of this processor
	 */
	public final String toString() { return this.getName(); }
    //#IRCProcessor.java:177: method: String com.dmdirc.parser.irc.IRCProcessor.toString()
    //#input(String toString()): this
    //#output(String toString()): java.lang.String:substring(...)._tainted
    //#output(String toString()): return_value
    //#new obj(String toString()): java.lang.String:substring(...)
    //#post(String toString()): java.lang.String:substring(...)._tainted == 0
    //#post(String toString()): return_value == &java.lang.String:substring(...)
    //#unanalyzed(String toString()): Effects-of-calling:java.lang.Object:getClass
    //#unanalyzed(String toString()): Effects-of-calling:java.lang.Class:getPackage
    //#unanalyzed(String toString()): Effects-of-calling:java.lang.Package:getName
    //#unanalyzed(String toString()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(String toString()): Effects-of-calling:java.lang.Class:getName
    //#unanalyzed(String toString()): Effects-of-calling:java.lang.String:substring
    //#IRCProcessor.java:177: end of method: String com.dmdirc.parser.irc.IRCProcessor.toString()
	
}
    //#output(com.dmdirc.parser.irc.IRCProcessor__static_init): __Descendant_Table[com/dmdirc/parser/irc/IRCProcessor]
    //#output(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#output(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.callDebugInfo(ILjava/lang/String;[Ljava/lang/Object;)Z
    //#output(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.callErrorInfo(Lcom/dmdirc/parser/irc/ParserError;)Z
    //#output(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.getCallbackManager()Lcom/dmdirc/parser/irc/callbacks/CallbackManager;
    //#output(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#output(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.getClientInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ClientInfo;
    //#output(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.getLowerName()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.getName()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.handles()[Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.isValidChannelName(Ljava/lang/String;)Z
    //#output(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.sendString(Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.toString()Ljava/lang/String;
    //#post(com.dmdirc.parser.irc.IRCProcessor__static_init): __Descendant_Table[com/dmdirc/parser/irc/IRCProcessor] == &__Dispatch_Table
    //#post(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z == &callDebugInfo
    //#post(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.callDebugInfo(ILjava/lang/String;[Ljava/lang/Object;)Z == &callDebugInfo
    //#post(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.callErrorInfo(Lcom/dmdirc/parser/irc/ParserError;)Z == &callErrorInfo
    //#post(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.getCallbackManager()Lcom/dmdirc/parser/irc/callbacks/CallbackManager; == &getCallbackManager
    //#post(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo; == &getChannelInfo
    //#post(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.getClientInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ClientInfo; == &getClientInfo
    //#post(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.getLowerName()Ljava/lang/String; == &getLowerName
    //#post(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.getName()Ljava/lang/String; == &getName
    //#post(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.handles()[Ljava/lang/String; == &handles
    //#post(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.isValidChannelName(Ljava/lang/String;)Z == &isValidChannelName
    //#post(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V == &process
    //#post(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.sendString(Ljava/lang/String;)V == &sendString
    //#post(com.dmdirc.parser.irc.IRCProcessor__static_init): __Dispatch_Table.toString()Ljava/lang/String; == &toString
    //#IRCProcessor.java:: end of method: com.dmdirc.parser.irc.IRCProcessor.com.dmdirc.parser.irc.IRCProcessor__static_init
    //#IRCProcessor.java:: end of class: com.dmdirc.parser.irc.IRCProcessor
