/*
Eteria IRC Client, an RFC 1459 compliant client program written in Java.
Copyright (C) 2000-2001 Javier Kohen <jkohen at tough.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package ar.com.jkohen.irc;
import java.awt.Color;
import java.text.ParseException;
public class MircMessage extends Message
{
public static final char BOLD = '\u0002'; // ^B
public static final char COLOR = '\u0003'; // ^C
public static final char BELL = '\u0007'; // ^G
public static final char RESET = '\u000F'; // ^O
public static final char ITALIC = '\u0014'; // ^T
public static final char REVERSE = '\u0016'; // ^V
public static final char UNDERLINE = '\u001F'; // ^_
public MircMessage(String msg) throws ParseException
{
super(msg);
// attrDecodeParameters();
}
public MircMessage(String command, String [] parameters)
{
this("", command, parameters);
}
public MircMessage(String prefix, String command, String [] parameters)
{
super(prefix, command, parameters);
// attrDecodeParameters();
}
public String [] getParameters()
{
String [] a = new String [parameters.length];
for (int i = 0; i < parameters.length; i++)
a[i] = filterMircAttributes(parameters[i]);
return(a);
}
/* Blamelessly cut-and-pasted from XChat, then ported to Java.
*/
public static String filterMircAttributes(String text)
{
int nc = 0;
int i = 0, j = 0;
boolean color = false;
int len = text.length();
char new_str[] = new char [len];
while (len > 0)
{
char ch = text.charAt(i);
if ((color && Character.isDigit(ch) && nc < 2) || (color && ch == ',' && nc < 3))
{
nc++;
if (ch == ',')
nc = 0;
}
else
{
if (color)
color = false;
switch (ch)
{
case MircMessage.COLOR:
color = true;
nc = 0;
break;
case MircMessage.BOLD:
case MircMessage.RESET:
case MircMessage.UNDERLINE:
case MircMessage.ITALIC:
case MircMessage.REVERSE:
case MircMessage.BELL:
break;
default:
new_str[j] = ch;
j++;
}
}
i++;
len--;
}
return String.valueOf(new_str, 0, j);
}
/**
* Replaces all control codes found in src by their corresponding escaped codes.
*/
public static String attrEncode(String src)
{
StringBuffer buf = new StringBuffer();
char [] ref = src.toCharArray();
for (int i = 0; i < ref.length; i++)
{
buf.append(attrEncode(ref[i]));
}
return buf.toString();
}
public static String attrEncode(char c)
{
char subst;
switch (c)
{
case BOLD:
subst = 'B';
break;
case COLOR:
subst = 'C';
break;
case BELL:
subst = 'A';
break;
case RESET:
subst = 'O';
break;
case ITALIC:
subst = 'I';
break;
case REVERSE:
subst = 'R';
break;
case UNDERLINE:
subst = 'U';
break;
default:
return String.valueOf(c);
}
return ("%" + subst);
}
/**
* Replaces all escaped codes found in src by their corresponding control codes.
*/
public static String attrDecode(String src)
{
if (src == null)
return(null);
StringBuffer buf = new StringBuffer();
char [] ref = src.toCharArray();
int i = -1;
while (++i < ref.length)
{
// If it's not an escape character or it's the last character, append it as it is.
if ('%' != ref[i] || i == ref.length - 1)
{
buf.append(ref[i]);
continue;
}
char subst;
i++; // Advance to the next character and try to decode it.
switch (ref[i])
{
case 'B':
subst = BOLD;
break;
case 'C':
subst = COLOR;
break;
case 'A':
subst = BELL;
break;
case 'O':
subst = RESET;
break;
case 'I':
subst = ITALIC;
break;
case 'R':
subst = REVERSE;
break;
case 'U':
subst = UNDERLINE;
break;
case '%':
subst = '%'; // If double % appears, only one must be sent.
break;
default:
buf.append('%'); // The escape character must remain if it isn't part of an escaped code.
subst = ref[i];
break;
}
buf.append(subst);
}
return buf.toString();
}
/**
* Helper method that passes all parameters through attrDecode.
*/
private void attrDecodeParameters()
{
for (int i = 0; i < parameters.length; i++)
parameters[i] = attrDecode(parameters[i]);
}
}