protected void ParseMessage(string line)
{
string prefix = null;
string lineAfterPrefix = null;
// Extract prefix from message line, if it contains one.
if (line[0] == ':')
{
var firstSpaceIndex = line.IndexOf(' ');
Debug.Assert(firstSpaceIndex != -1);
prefix = line.Substring(1, firstSpaceIndex - 1);
lineAfterPrefix = line.Substring(firstSpaceIndex + 1);
}
else
{
lineAfterPrefix = line;
}
// Extract command from message.
var spaceIndex = lineAfterPrefix.IndexOf(' ');
Debug.Assert(spaceIndex != -1);
var command = lineAfterPrefix.Substring(0, spaceIndex);
var paramsLine = lineAfterPrefix.Substring(command.Length + 1);
// Extract parameters from message.
// Each parameter is separated by single space, except last one, which may contain spaces if it
// is prefixed by colon.
var parameters = new string[maxParamsCount];
int paramStartIndex, paramEndIndex = -1;
var lineColonIndex = paramsLine.IndexOf(" :");
if (lineColonIndex == -1 && !paramsLine.StartsWith(":"))
lineColonIndex = paramsLine.Length;
for (var i = 0; i < parameters.Length; i++)
{
paramStartIndex = paramEndIndex + 1;
paramEndIndex = paramsLine.IndexOf(' ', paramStartIndex);
if (paramEndIndex == -1)
paramEndIndex = paramsLine.Length;
if (paramEndIndex > lineColonIndex)
{
paramStartIndex++;
paramEndIndex = paramsLine.Length;
}
parameters[i] = paramsLine.Substring(paramStartIndex, paramEndIndex - paramStartIndex);
if (paramEndIndex == paramsLine.Length)
break;
}
// Parse received IRC message.
var message = new IrcMessage(this, prefix, command, parameters);
var messageReceivedEventArgs = new IrcRawMessageEventArgs(message, line);
OnRawMessageReceived(messageReceivedEventArgs);
ReadMessage(message, line);
#if DEBUG
DebugUtilities.WriteIrcRawLine(this, ">>> " + messageReceivedEventArgs.RawContent);
#endif
}