Add existing source + chat invite handling

This commit is contained in:
Frankie B 2024-05-09 23:19:29 +01:00
commit a1dff2cb8d
No known key found for this signature in database
58 changed files with 5822 additions and 0 deletions

View file

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE attributes PUBLIC "-//NetBeans//DTD DefaultAttributes 1.0//EN" "http://www.netbeans.org/dtds/attributes-1_0.dtd">
<attributes version="1.0">
<fileobject name="JaimStateException.java">
<attr name="class_dependency_com.wilko.jaim.JaimException" stringvalue="JaimStateException"/>
</fileobject>
<fileobject name="SignOnTocResponse.java">
<attr name="class_dependency_com.wilko.jaim.TocResponse" stringvalue="SignOnTocResponse"/>
<attr name="class_dependency_com.wilko.jaim.TocResponseHandler" stringvalue="SignOnTocResponse"/>
</fileobject>
<fileobject name="TocEvilCommand.java">
<attr name="class_dependency_com.wilko.jaim.TocCommand" stringvalue="TocEvilCommand"/>
</fileobject>
<fileobject name="JaimTimeoutException.java">
<attr name="class_dependency_com.wilko.jaim.JaimException" stringvalue="JaimTimeoutException"/>
</fileobject>
<fileobject name="ConnectionLostTocResponse.java">
<attr name="class_dependency_com.wilko.jaim.TocResponse" stringvalue="ConnectionLostTocResponse"/>
</fileobject>
<fileobject name="TocSetIdleCommand.java">
<attr name="class_dependency_com.wilko.jaim.TocCommand" stringvalue="TocSetIdleCommand"/>
</fileobject>
<fileobject name="NickTocResponse.java">
<attr name="class_dependency_com.wilko.jaim.TocResponse" stringvalue="NickTocResponse"/>
<attr name="class_dependency_com.wilko.jaim.TocResponseHandler" stringvalue="NickTocResponse"/>
</fileobject>
<fileobject name="TocGetInfoCommand.java">
<attr name="class_dependency_com.wilko.jaim.TocCommand" stringvalue="TocGetInfoCommand"/>
</fileobject>
<fileobject name="JaimException.java">
<attr name="EA-OpenIDE-Connection" serialvalue="aced0005737200146a6176612e7574696c2e4c696e6b65644c6973740c29535d4a608822030000787077040000000078"/>
</fileobject>
<fileobject name="TocResponseHandler.java">
<attr name="EA-OpenIDE-Connection" serialvalue="aced0005737200146a6176612e7574696c2e4c696e6b65644c6973740c29535d4a60882203000078707704000000087372002a6f72672e6f70656e6964652e6c6f61646572732e436f6e6e656374696f6e537570706f72742450616972055f8af6f04a3bd80200024c00047479706574002b4c6f72672f6f70656e6964652f636f6f6b6965732f436f6e6e656374696f6e436f6f6b696524547970653b4c000576616c75657400124c6a6176612f6c616e672f4f626a6563743b78707372002e6f72672e6e65746265616e732e6d6f64756c65732e6a6176612e4a617661436f6e6e656374696f6e732454797065a83dd01001306d7402000149000666696c746572787000000050737200436f72672e6e65746265616e732e6d6f64756c65732e6a6176612e4a617661446174614f626a6563742450657273697374656e74436f6e6e656374696f6e48616e646c65ba16f1d2dd4c1cb60200014c000e646174614e6f646548616e646c6574001f4c6f72672f6f70656e6964652f6e6f6465732f4e6f64652448616e646c653b7870737200296f72672e6f70656e6964652e6c6f61646572732e446174614e6f6465244f626a65637448616e646c655bd0f82e01811d2e0200025a0005636c6f6e654c00036f626a7400244c6f72672f6f70656e6964652f66696c6573797374656d732f46696c654f626a6563743b787000737200326f72672e6f70656e6964652e66696c6573797374656d732e416273747261637446696c654f626a656374245265706c616365896fa1bce4b5219f0200024c000866696c654e616d657400124c6a6176612f6c616e672f537472696e673b4c000666734e616d6571007e000f78707400297372632f636f6d2f77696c6b6f2f6a61696d2f436f6e666967546f63526573706f6e73652e6a6176617400506f72672e6e65746265616e732e6d6f64756c65732e7663732e616476616e6365642e436f6d6d616e644c696e6556637346696c6553797374656d202f686f6d652f7061756c772f6a61696d2f6a61696d7371007e00027371007e0006000000507371007e00087371007e000b007371007e000e74002e7372632f636f6d2f77696c6b6f2f6a61696d2f4275646479557064617465546f63526573706f6e73652e6a61766171007e00127371007e00027371007e0006000000507371007e00087371007e000b007371007e000e740025636f6d2f77696c6b6f2f6a61696d2f436f6e666967546f63526573706f6e73652e6a6176617400546f72672e6e65746265616e732e6d6f64756c65732e7663732e616476616e6365642e436f6d6d616e644c696e6556637346696c6553797374656d202f686f6d652f7061756c772f6a61696d2f6a61696d2f7372637371007e00027371007e0006000000507371007e00087371007e000b007371007e000e74002a636f6d2f77696c6b6f2f6a61696d2f4275646479557064617465546f63526573706f6e73652e6a61766171007e001f7371007e00027371007e0006000000507371007e00087371007e000b007371007e000e740021636f6d2f77696c6b6f2f6a61696d2f494d546f63526573706f6e73652e6a61766171007e001f7371007e00027371007e0006000000507371007e00087371007e000b007371007e000e740023636f6d2f77696c6b6f2f6a61696d2f476f746f546f63526573706f6e73652e6a61766171007e001f7371007e00027371007e0006000000507371007e00087371007e000b007371007e000e740023636f6d2f77696c6b6f2f6a61696d2f4576696c546f63526573706f6e73652e6a61766171007e001f7371007e00027371007e0006000000507371007e00087371007e000b007371007e000e740024636f6d2f77696c6b6f2f6a61696d2f4572726f72546f63526573706f6e73652e6a61766171007e001f78"/>
</fileobject>
<fileobject name="TocResponse.java">
<attr name="EA-OpenIDE-Connection" serialvalue="aced0005737200146a6176612e7574696c2e4c696e6b65644c6973740c29535d4a60882203000078707704000000087372002a6f72672e6f70656e6964652e6c6f61646572732e436f6e6e656374696f6e537570706f72742450616972055f8af6f04a3bd80200024c00047479706574002b4c6f72672f6f70656e6964652f636f6f6b6965732f436f6e6e656374696f6e436f6f6b696524547970653b4c000576616c75657400124c6a6176612f6c616e672f4f626a6563743b78707372002e6f72672e6e65746265616e732e6d6f64756c65732e6a6176612e4a617661436f6e6e656374696f6e732454797065a83dd01001306d7402000149000666696c746572787000000050737200436f72672e6e65746265616e732e6d6f64756c65732e6a6176612e4a617661446174614f626a6563742450657273697374656e74436f6e6e656374696f6e48616e646c65ba16f1d2dd4c1cb60200014c000e646174614e6f646548616e646c6574001f4c6f72672f6f70656e6964652f6e6f6465732f4e6f64652448616e646c653b7870737200296f72672e6f70656e6964652e6c6f61646572732e446174614e6f6465244f626a65637448616e646c655bd0f82e01811d2e0200025a0005636c6f6e654c00036f626a7400244c6f72672f6f70656e6964652f66696c6573797374656d732f46696c654f626a6563743b787000737200326f72672e6f70656e6964652e66696c6573797374656d732e416273747261637446696c654f626a656374245265706c616365896fa1bce4b5219f0200024c000866696c654e616d657400124c6a6176612f6c616e672f537472696e673b4c000666734e616d6571007e000f7870740023636f6d2f77696c6b6f2f6a61696d2f4e69636b546f63526573706f6e73652e6a6176617400546f72672e6e65746265616e732e6d6f64756c65732e7663732e616476616e6365642e436f6d6d616e644c696e6556637346696c6553797374656d202f686f6d652f7061756c772f6a61696d2f6a61696d2f7372637371007e00027371007e0006000000507371007e00087371007e000b007371007e000e74002e7372632f636f6d2f77696c6b6f2f6a61696d2f4275646479557064617465546f63526573706f6e73652e6a6176617400506f72672e6e65746265616e732e6d6f64756c65732e7663732e616476616e6365642e436f6d6d616e644c696e6556637346696c6553797374656d202f686f6d652f7061756c772f6a61696d2f6a61696d7371007e00027371007e0006000000507371007e00087371007e000b007371007e000e740025636f6d2f77696c6b6f2f6a61696d2f436f6e666967546f63526573706f6e73652e6a61766171007e00127371007e00027371007e0006000000507371007e00087371007e000b007371007e000e74002a636f6d2f77696c6b6f2f6a61696d2f4275646479557064617465546f63526573706f6e73652e6a61766171007e00127371007e00027371007e0006000000507371007e00087371007e000b007371007e000e740021636f6d2f77696c6b6f2f6a61696d2f494d546f63526573706f6e73652e6a61766171007e00127371007e00027371007e0006000000507371007e00087371007e000b007371007e000e740023636f6d2f77696c6b6f2f6a61696d2f476f746f546f63526573706f6e73652e6a61766171007e00127371007e00027371007e0006000000507371007e00087371007e000b007371007e000e740023636f6d2f77696c6b6f2f6a61696d2f4576696c546f63526573706f6e73652e6a61766171007e00127371007e00027371007e0006000000507371007e00087371007e000b007371007e000e740024636f6d2f77696c6b6f2f6a61696d2f4572726f72546f63526573706f6e73652e6a61766171007e001278"/>
</fileobject>
<fileobject name="GenericTocResponse.java">
<attr name="class_dependency_com.wilko.jaim.TocResponse" stringvalue="GenericTocResponse"/>
<attr name="class_dependency_com.wilko.jaim.TocResponseHandler" stringvalue="GenericTocResponse"/>
</fileobject>
<fileobject name="JaimEventListener.java">
<attr name="EA-OpenIDE-Connection" serialvalue="aced0005737200146a6176612e7574696c2e4c696e6b65644c6973740c29535d4a60882203000078707704000000017372002a6f72672e6f70656e6964652e6c6f61646572732e436f6e6e656374696f6e537570706f72742450616972055f8af6f04a3bd80200024c00047479706574002b4c6f72672f6f70656e6964652f636f6f6b6965732f436f6e6e656374696f6e436f6f6b696524547970653b4c000576616c75657400124c6a6176612f6c616e672f4f626a6563743b78707372002e6f72672e6e65746265616e732e6d6f64756c65732e6a6176612e4a617661436f6e6e656374696f6e732454797065a83dd01001306d7402000149000666696c746572787000000050737200436f72672e6e65746265616e732e6d6f64756c65732e6a6176612e4a617661446174614f626a6563742450657273697374656e74436f6e6e656374696f6e48616e646c65ba16f1d2dd4c1cb60200014c000e646174614e6f646548616e646c6574001f4c6f72672f6f70656e6964652f6e6f6465732f4e6f64652448616e646c653b7870737200296f72672e6f70656e6964652e6c6f61646572732e446174614e6f6465244f626a65637448616e646c655bd0f82e01811d2e0200025a0005636c6f6e654c00036f626a7400244c6f72672f6f70656e6964652f66696c6573797374656d732f46696c654f626a6563743b787000737200326f72672e6f70656e6964652e66696c6573797374656d732e416273747261637446696c654f626a656374245265706c616365896fa1bce4b5219f0200024c000866696c654e616d657400124c6a6176612f6c616e672f537472696e673b4c000666734e616d6571007e000f7870740020636f6d2f77696c6b6f2f6a61696d746573742f4a61696d546573742e6a6176617400546f72672e6e65746265616e732e6d6f64756c65732e7663732e616476616e6365642e436f6d6d616e644c696e6556637346696c6553797374656d202f686f6d652f7061756c772f6a61696d2f6a61696d2f73726378"/>
</fileobject>
<fileobject name="TocCommand.java">
<attr name="EA-OpenIDE-Connection" serialvalue="aced0005737200146a6176612e7574696c2e4c696e6b65644c6973740c29535d4a60882203000078707704000000017372002a6f72672e6f70656e6964652e6c6f61646572732e436f6e6e656374696f6e537570706f72742450616972055f8af6f04a3bd80200024c00047479706574002b4c6f72672f6f70656e6964652f636f6f6b6965732f436f6e6e656374696f6e436f6f6b696524547970653b4c000576616c75657400124c6a6176612f6c616e672f4f626a6563743b78707372002e6f72672e6e65746265616e732e6d6f64756c65732e6a6176612e4a617661436f6e6e656374696f6e732454797065a83dd01001306d7402000149000666696c746572787000000050737200436f72672e6e65746265616e732e6d6f64756c65732e6a6176612e4a617661446174614f626a6563742450657273697374656e74436f6e6e656374696f6e48616e646c65ba16f1d2dd4c1cb60200014c000e646174614e6f646548616e646c6574001f4c6f72672f6f70656e6964652f6e6f6465732f4e6f64652448616e646c653b7870737200296f72672e6f70656e6964652e6c6f61646572732e446174614e6f6465244f626a65637448616e646c655bd0f82e01811d2e0200025a0005636c6f6e654c00036f626a7400244c6f72672f6f70656e6964652f66696c6573797374656d732f46696c654f626a6563743b787000737200326f72672e6f70656e6964652e66696c6573797374656d732e416273747261637446696c654f626a656374245265706c616365896fa1bce4b5219f0200024c000866696c654e616d657400124c6a6176612f6c616e672f537472696e673b4c000666734e616d6571007e000f7870740027636f6d2f77696c6b6f2f6a61696d2f546f63536574436f6e666967436f6d6d616e642e6a6176617400546f72672e6e65746265616e732e6d6f64756c65732e7663732e616476616e6365642e436f6d6d616e644c696e6556637346696c6553797374656d202f686f6d652f7061756c772f6a61696d2f6a61696d2f73726378"/>
</fileobject>
</attributes>

View file

@ -0,0 +1,88 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* Buddy.java
*
* Created on 4 May 2002, 12:05
*/
package com.wilko.jaim;
/** This is a buddy object that holds the buddy's name and other
* information about a buddy.
* @author Brett Humphreys
*/
public class Buddy {
/** Name of the buddy */
private String buddyName;
/** Permit value */
private boolean permit;
/** deny value */
private boolean deny;
/** Constructor that sets the buddy name
* @param name the name of this buddy.
*/
public Buddy ( String name )
{
buddyName = name;
}
/** Gets the buddy name
* @return buddy name
*/
public String getName()
{
return buddyName;
}
/** Sets the permit value
* @param permitVal what to set permit to
*/
public void setPermit( boolean permitVal )
{
permit = permitVal;
}
/** Gets the permit value
* @return permit value
*/
public boolean getPermit( )
{
return permit;
}
/** Sets the deny value
* @param denyVal what to set deny to
*/
public void setDeny( boolean denyVal )
{
deny = denyVal;
}
/** Gets the deny value
* @return deny value
*/
public boolean getDeny( )
{
return deny;
}
}

View file

@ -0,0 +1,210 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* BuddyUpdateTocResponse.java
*
* Created on 5 May 2002, 21:19
*/
package com.wilko.jaim;
import java.util.Date;
import java.util.StringTokenizer;
/** A BuddyUpdateTocResponse is delivered to a {@link JaimEventListener } when a buddy update is received from the TOC server
* @author paulw
* @version $Revision: 1.7 $
*/
public class BuddyUpdateTocResponse extends TocResponse implements TocResponseHandler {
private String buddyName;
private boolean online;
private int evil;
private int idleTime;
private boolean onAOL;
private boolean unconfirmed;
private boolean admin;
private boolean confirmed;
private Date signonTime;
private boolean away;
public static String RESPONSE_TYPE="UPDATE_BUDDY";
/** Creates new BuddyUpdateTocResponse */
public BuddyUpdateTocResponse() {
buddyName="";
online=false;
evil=0;
idleTime=0;
onAOL=false;
unconfirmed=false;
admin=false;
confirmed=false;
away=false;
}
/** The parseString method is used to populate the fields of this class from a Buddy Update string from the TOC server
* @param str The String containing the buddy update
*/
public TocResponse parseString(java.lang.String str) {
BuddyUpdateTocResponse tr=new BuddyUpdateTocResponse();
tr.doParse(str);
return(tr);
}
private void doParse(String str)
{
cmd=str;
StringTokenizer st=new StringTokenizer(str,":");
st.nextToken();
buddyName=st.nextToken();
String onlineStr=st.nextToken();
if (onlineStr.equals("T"))
{
online=true;
}
else
{
online=false;
}
evil=Integer.parseInt(st.nextToken());
long signon=Long.parseLong(st.nextToken());
signonTime=new Date(signon*1000);
idleTime=Integer.parseInt(st.nextToken());
String userclass=st.nextToken();
if (userclass.charAt(0) == 'A')
onAOL=true;
if (userclass.charAt(1) == 'A')
{
admin=true;
}
else
{
if (userclass.charAt(1)=='U')
{
unconfirmed=true;
}
else
{
if(userclass.charAt(1)=='O')
{
confirmed=true;
}
}
}
if (userclass.length()>2)
{
if (userclass.charAt(2)=='U')
{
away=true;
}
}
}
/** Get the away status of the buddy specified by this update
* @return true if the buddy is "away"
*/
public boolean isAway()
{
return(away);
}
/** Get the response type of this response. This method is used by the response dispatcher within JaimConnection
* @return The response type
*/
public String getResponseType() {
return RESPONSE_TYPE;
}
/** Obtain the buddy name from this update
* @return The buddy name
*/
public String getBuddy()
{
return(buddyName);
}
/** Obtain the online status of this buddy update
* @return true if the buddy is on line
*/
public boolean isOnline()
{
return(online);
}
/** Obtain the idle time of this buddy
* @return The idle time in seconds
*/
public int getIdleTime()
{
return(idleTime);
}
/** Obtain the "Evil" (Warning) level of this buddy
* @return The warning level as a percentage
*/
public int getEvil()
{
return(evil);
}
/** Is this buddy an "Administrator"
* @return true if an administrator
*/
public boolean isAdmin()
{
return(admin);
}
/** IS this buddy a "confirmed" user
* @return True if this buddy is confirmed
*/
public boolean isConfirmed()
{
return(confirmed);
}
/** Is this user an "Unconfirmed user"
* @return True if this user is unconfirmed
*/
public boolean isUnconfirmed()
{
return(unconfirmed);
}
/** Get the signon time of this buddy
* @return The date/time of signon
*/
public Date getSignonTime()
{
return(signonTime);
}
/** Returns true if this response handler can handle the specified response.
* @param Response - the response string from TOC. This is the part of the response before the first ':'
* @return true if the response can be handled
*/
public boolean canHandle(String Response) {
return(Response.equalsIgnoreCase(RESPONSE_TYPE));
}
}

View file

@ -0,0 +1,103 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* BuddyUpdateTocResponse.java
*
* Created on 5 May 2002, 21:19
*/
package com.wilko.jaim;
import java.util.Date;
import java.util.StringTokenizer;
/** A BuddyUpdateTocResponse is delivered to a {@link JaimEventListener } when a buddy update is received from the TOC server
* @author paulw
* @version $Revision: 1.7 $
*/
public class ChatInviteTocResponse extends TocResponse implements TocResponseHandler {
private String roomName;
private String roomID;
private String senderScreenname;
private String message;
public static String RESPONSE_TYPE="CHAT_INVITE";
/** Creates new BuddyUpdateTocResponse */
public ChatInviteTocResponse() {
roomName = "";
roomID = "";
senderScreenname = "";
message = "";
}
/** The parseString method is used to populate the fields of this class from a Buddy Update string from the TOC server
* @param str The String containing the buddy update
*/
public TocResponse parseString(String str) {
ChatInviteTocResponse tr = new ChatInviteTocResponse();
tr.doParse(str);
return(tr);
}
private void doParse(String str)
{
cmd=str;
StringTokenizer st=new StringTokenizer(str,":");
st.nextToken();
roomName = st.nextToken();
roomID = st.nextToken();
senderScreenname = st.nextToken();
message = st.nextToken();
}
/** Get the response type of this response. This method is used by the response dispatcher within JaimConnection
* @return The response type
*/
public String getResponseType() {
return RESPONSE_TYPE;
}
public String getRoomName() {
return roomName;
}
public String getRoomID() {
return roomID;
}
public String getSenderScreenname() {
return senderScreenname;
}
public String getMessage() {
return message;
}
/** Returns true if this response handler can handle the specified response.
* @param Response - the response string from TOC. This is the part of the response before the first ':'
* @return true if the response can be handled
*/
public boolean canHandle(String Response) {
return(Response.equalsIgnoreCase(RESPONSE_TYPE));
}
}

View file

@ -0,0 +1,194 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* ConfigTocResponse.java
* Created on 1, October 2002
*/
package com.wilko.jaim;
import java.util.*;
/** A ConfigTocResponse contains the config message received from
* the toc server.
*This response is handled by the JaimConnection class, but may also be used by client programs.
*Once this event has been received, information returned from {@link JaimConnection#getGroups} is valid
* @author Brett Humphreys, Paul Wilkinson
*/
public class ConfigTocResponse extends TocResponse implements TocResponseHandler {
public static String RESPONSE_TYPE="CONFIG";
/** The Vector of Group objects */
private Vector buddyList = new Vector();
/** The HashMap of known buddies */
private HashMap buddies;
/** The mode for this configuration */
private int mode;
/** Value for mode that indicates PERMIT ALL mode */
public static final int PERMIT_ALL=1;
/** Value for mode that indicates DENY ALL mode */
public static final int DENY_ALL=2;
/** Value for mode that indicates PERMIT SOME mode */
public static final int PERMIT_SOME=3;
/** Value for mode that indicates DENY SOME mode */
public static final int DENY_SOME=4;
/** Returns an Enumeration of groups. Each Entry is a {@link Group}
* Each group then has an Enumeration of buddies within that group See {@link Group#enumerateBuddies}.
* @return list of Group elements or an empty list if none are found.
*/
public Enumeration enumerateGroups()
{
return buddyList.elements();
}
/** Returns a Collection of groups. Each element is a {@link Group)
* @return the groups
*/
public Collection getGroups() {
java.util.Collection result = new Vector(buddyList);
return result;
}
/** Get the response type of this response. This method is used by the response dispatcher within JaimConnection
* @return The response type
*/
public String getResponseType() {
return RESPONSE_TYPE;
}
/** Parses the config string.
*/
public TocResponse parseString(String message)
{
ConfigTocResponse tr = new ConfigTocResponse();
tr.doParse(message);
return(tr);
}
private void doParse(String message)
{
cmd=message;
int colonIndex = message.indexOf(':');
//throw away the first word.
message = message.substring(colonIndex+1, message.length());
buddies = new HashMap();
StringTokenizer tok = new StringTokenizer(message,"\n");
String itemType;
String itemValue;
Group currentGroup=null;
Buddy tmpBuddy;
while( tok.hasMoreTokens() )
{
// Can't tokenize on both \n and space since there could be spaces
// in the name, so parsing by hand.
itemType = tok.nextToken();
int firstSpace = itemType.indexOf(' ');
itemValue = itemType.substring(firstSpace+1, itemType.length());
itemType = itemType.substring(0, firstSpace);
char type = itemType.charAt(0);
switch (type)
{
case 'g':
currentGroup = new Group(itemValue);
buddyList.add(currentGroup);
break;
case 'b':
tmpBuddy = getBuddy(itemValue);
//this shouldn't happen, but:
if(currentGroup==null)
{
currentGroup = new Group("<unknown>");
buddyList.add(currentGroup);
}
currentGroup.addBuddy(tmpBuddy);
break;
case 'p':
tmpBuddy = getBuddy(itemValue);
tmpBuddy.setPermit(true);
break;
case 'm':
setMode(Integer.valueOf(itemValue).intValue());
break;
case 'd':
tmpBuddy = getBuddy(itemValue);
tmpBuddy.setDeny(true);
break;
}
}
}
/** Return an existing Buddy with the specified name or return a new buddy if the name is not known
* The buddy is added to the buddies hash if it is a new buddy
* @param The name of the buddy we are looking for
* @return The buddy object
*/
private Buddy getBuddy(String buddyName)
{
Buddy retBuddy = (Buddy)buddies.get(buddyName);
if (retBuddy== null)
{
retBuddy=new Buddy(buddyName);
buddies.put(buddyName,retBuddy);
}
return(retBuddy);
}
/** Sets the mode for this configuration
* @param modeVal the string value of the mode (1-4)
*/
public void setMode( int modeVal )
{
mode = modeVal;
}
/** Gets the mode for this configuration
* @return mode for the configuration
*/
public int getMode( )
{
return mode;
}
/** Returns true if this response handler can handle the specified response.
* @param Response - the response string from TOC. This is the part of the response before the first ':'
* @return true if the response can be handled
*/
public boolean canHandle(String Response) {
return(Response.equalsIgnoreCase(RESPONSE_TYPE));
}
}

View file

@ -0,0 +1,50 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* ConnectionLostTocResponse.java
*
* Created on November 2, 2002, 2:52 PM
*/
package com.wilko.jaim;
/**
* This is a "pseudo" TOC response - it is delivered to JaimLib clients to indicate that the connection to the server has been lost.
* @author wilko
* @version: $revision: $
*/
public class ConnectionLostTocResponse extends TocResponse {
public static final String RESPONSE_TYPE="CONNECTIONLOST";
/** Creates a new instance of LoginCompleteTocResponse */
public ConnectionLostTocResponse() {
}
public String getResponseType() {
return (RESPONSE_TYPE);
}
public String toString()
{
return (RESPONSE_TYPE);
}
}

View file

@ -0,0 +1,145 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* ErrorTocResponse.java
*
* Created on 4 May 2002, 14:52
*/
package com.wilko.jaim;
import java.util.MissingResourceException;
/** This TOC response is sent to a {@link JaimEventListener } when an error message is received from the TOC server
*
* @author paulw
* @version $Revision: 1.7 $
*/
public class ErrorTocResponse extends TocResponse implements TocResponseHandler {
int errorCode;
String errorText;
public static final String RESPONSE_TYPE="ERROR";
/** Creates new ErrorTocResponse */
public ErrorTocResponse() {
errorCode=0;
errorText="";
}
/** Parse the error response string sent by the TOC server
* @param str The error response string
*/
public TocResponse parseString(String str)
{
ErrorTocResponse tr=new ErrorTocResponse();
tr.doParse(str);
return(tr);
}
private void doParse(String str)
{
cmd=str;
int colonPos=str.indexOf(':');
if (colonPos!=-1)
{
str=str.substring(colonPos+1);
colonPos=str.indexOf(':');
if (colonPos!=-1)
{
errorCode=Integer.parseInt(str.substring(0,colonPos));
errorText=str.substring(colonPos+1);
}
else
{
errorCode=Integer.parseInt(str);
}
}
}
/** Obtain the error code for this response
* @return The error code
*/
public int getErrorCode()
{
return(errorCode);
}
/** Get the error text (if any) associated with this error response
* @return The error text
*/
public String getErrorText()
{
return(errorText);
}
/** Obtain the error message that corresponds to this error.
* @return The error text with any applicable error argument text inserted
*/
public String getErrorDescription() {
try {
StringBuffer desc=new StringBuffer(java.util.ResourceBundle.getBundle("com/wilko/jaim/TocErrorDescriptions").getString(Integer.toString(errorCode)));
String sDesc=desc.toString();
int argpos=sDesc.indexOf("%s");
if (argpos != -1) {
desc.replace(argpos,argpos+1,errorText);
}
return(desc.toString());
}
catch (MissingResourceException e) {
return("Unable to locate error description:"+e.toString());
}
}
/** Obtain the error message that corresponds to the specified error code
* @param code The error code
* @return The error text
*/
static public String getErrorDescription(int code)
{
try
{
return(java.util.ResourceBundle.getBundle("com/wilko/jaim/TocErrorDescriptions").getString(Integer.toString(code)));
}
catch (MissingResourceException e)
{
return("Unable to locate error description:"+e.toString());
}
}
public String getResponseType() {
return RESPONSE_TYPE;
}
/** Returns true if this response handler can handle the specified response.
* @param Response - the response string from TOC. This is the part of the response before the first ':'
* @return true if the response can be handled
*/
public boolean canHandle(String Response) {
return(Response.equalsIgnoreCase(RESPONSE_TYPE));
}
}

View file

@ -0,0 +1,117 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* EvilTocResponse.java
*
* Created on 6 May 2002, 16:49
*/
package com.wilko.jaim;
import java.util.StringTokenizer;
/** An EvilTocResponse is delivered to a {@link JaimEventListener } when the signed on buddy is "eviled" or warned
* @author paulw
* @version $Revision: 1.6 $
*/
public class EvilTocResponse extends TocResponse implements TocResponseHandler {
private boolean anonymousEvil;
private int evilAmount;
private String evilBy;
public static final String RESPONSE_TYPE="EVILED";
/** Creates new EvilTocResponse */
public EvilTocResponse() {
anonymousEvil=true;
evilBy="";
evilAmount=0;
}
/** Parse the evil message from the TOC server
* @param str The evil message
*/
public TocResponse parseString(java.lang.String str) {
EvilTocResponse tr=new EvilTocResponse();
tr.doParse(str);
return(tr);
}
private void doParse(String str)
{
StringTokenizer st=new StringTokenizer(str,":");
st.nextToken(); // skip over "EVILED"
evilAmount=Integer.parseInt(st.nextToken());
if (st.hasMoreTokens())
{
evilBy=st.nextToken();
anonymousEvil=false;
}
else
{
anonymousEvil=true;
}
}
/** Get the evil amount from this response. This is the current evil or warning level for the authenticated buddy, not the increment specified by the last warning
* @return The cumulative evil or warning level
*/
public int getEvilAmount()
{
return(evilAmount);
}
/** Obtain the name of the buddy that issued the warning.
* @return The buddy name that issued the warning
* @see #isAnonymous
*/
public String getEvilBy()
{
return(evilBy);
}
/** Obtain the anonymous status of this warning
* @return true if this warning was issued anonymously
*/
public boolean isAnonymous()
{
return(anonymousEvil);
}
/** Used by the response dispatcher
* @return The response type
*/
public String getResponseType() {
return RESPONSE_TYPE;
}
/** Returns true if this response handler can handle the specified response.
* @param Response - the response string from TOC. This is the part of the response before the first ':'
* @return true if the response can be handled
*/
public boolean canHandle(String Response) {
return(Response.equalsIgnoreCase(RESPONSE_TYPE));
}
}

View file

@ -0,0 +1,76 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* FlapDataFrame.java
*
* Created on 3 May 2002, 14:54
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $Revision: 1.3 $
*/
public class FLAPDataFrame extends FLAPFrame {
private int frameLen;
/** Creates new FlapDataFrame */
public FLAPDataFrame() {
frame[1]=FLAP_FRAME_DATA;
frameLen=1;
frame[FLAP_DATA_OFFSET]=0;
}
public FLAPDataFrame(byte frameData[])
{
frame[1]=FLAP_FRAME_DATA;
frameLen=1;
frame[FLAP_DATA_OFFSET]=0;
setFrameData(frameData);
}
public int getFLAPFrameType() {
return(FLAPFrame.FLAP_FRAME_DATA);
}
public void addString(String s)
{
frameLen--; // Backspace over '0'
for (int i=0;i<s.length();i++)
{
frame[FLAP_DATA_OFFSET+frameLen++]=(byte)s.charAt(i);
}
frame[FLAP_DATA_OFFSET+frameLen++]=0;
setLength(frameLen);
}
public byte[] getContent()
{
byte[] retarray = new byte[getLength()];
System.arraycopy(frame,FLAPFrame.FLAP_DATA_OFFSET,retarray,0,getLength());
return(retarray);
}
}

View file

@ -0,0 +1,51 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* FlapErrorFrame.java
*
* Created on 3 May 2002, 14:54
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $Revision: 1.3 $
*/
public class FLAPErrorFrame extends FLAPFrame {
/** Creates new FLAPErrorFrame */
public FLAPErrorFrame() {
frame[1]=FLAP_FRAME_ERROR;
}
public FLAPErrorFrame(byte frameData[])
{
frame[1]=FLAP_FRAME_ERROR;
setFrameData(frameData);
}
public int getFLAPFrameType() {
return FLAPFrame.FLAP_FRAME_ERROR;
}
}

View file

@ -0,0 +1,119 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* FLAPFrame.java
*
* Created on 3 May 2002, 14:51
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $Revision: 1.4 $
*/
public abstract class FLAPFrame {
public static final int FLAP_FRAME_SIGNON=1;
public static final int FLAP_FRAME_DATA=2;
public static final int FLAP_FRAME_ERROR=3;
public static final int FLAP_FRAME_SIGNOFF=4;
public static final int FLAP_FRAME_KEEP_ALIVE=5;
public static final int FLAP_DATA_OFFSET=6;
protected byte[] frame;
protected int fLen;
/** Creates new FLAPFrame */
public FLAPFrame() {
initialise();
}
protected void setFrameData(byte b[])
{
frame=new byte[b.length];
fLen=b.length;
System.arraycopy(b,0,frame,0,b.length);
}
protected void initialise()
{
frame = new byte[8192];
frame[0]=(byte)'*';
frame[1]=0;
frame[2]=0;
frame[3]=0;
frame[4]=0;
frame[5]=0;
fLen=6;
}
public void setSequence(int sequence)
{
frame[2]=(byte)((sequence/256)&0xff);
frame[3]=(byte)(sequence&0xff);
}
public int getSequence()
{
return((frame[2]&0xff)*256+(frame[3]&0xff));
}
public int getLength()
{
return((frame[4]&0xff)*256+(frame[5]&0xff));
}
public void setLength(int length)
{
frame[4]=(byte)(length/256);
frame[5]=(byte)(length&0xff);
fLen=length+FLAP_DATA_OFFSET;
}
public byte[] getFrameData()
{
byte[] b=new byte[fLen];
System.arraycopy(frame,0,b,0,fLen);
return(b);
}
public String toString()
{
StringBuffer temp=new StringBuffer();
for (int i=0;i<fLen;i++)
{
int k=frame[i]&0xff;
if (k<16)
{
temp.append("0"+Integer.toHexString(k)+" ");
}
else
{
temp.append(Integer.toHexString(k)+" ");
}
}
return(temp.toString());
}
public abstract int getFLAPFrameType();
}

View file

@ -0,0 +1,51 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* FLAPFrameException.java
*
* Created on 3 May 2002, 15:05
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $Revision: 1.3 $
*/
public class FLAPFrameException extends java.lang.Exception {
/**
* Creates new <code>FLAPFrameException</code> without detail message.
*/
public FLAPFrameException() {
}
/**
* Constructs an <code>FLAPFrameException</code> with the specified detail message.
* @param msg the detail message.
*/
public FLAPFrameException(String msg) {
super(msg);
}
}

View file

@ -0,0 +1,69 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* FLAPFrameFactory.java
*
* Created on 3 May 2002, 15:04
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $Revision: 1.3 $
*/
public abstract class FLAPFrameFactory {
/** Creates new FLAPFrameFactory */
public FLAPFrameFactory() {
}
public static FLAPFrame createFLAPFrame(byte[] frameData) throws FLAPFrameException {
FLAPFrame f=null;
if (frameData[0]!='*')
{
throw new FLAPFrameException("Frame does not start with '*'");
}
switch (frameData[1])
{
case FLAPFrame.FLAP_FRAME_SIGNON:
f=new FLAPSignonFrame(frameData);
break;
case FLAPFrame.FLAP_FRAME_DATA:
f=new FLAPDataFrame(frameData);
break;
case FLAPFrame.FLAP_FRAME_ERROR:
f=new FLAPErrorFrame(frameData);
break;
case FLAPFrame.FLAP_FRAME_SIGNOFF:
f=new FLAPSignoffFrame(frameData);
break;
case FLAPFrame.FLAP_FRAME_KEEP_ALIVE:
f=new FLAPKeepAliveFrame(frameData);
break;
default:
throw new FLAPFrameException("Illegal FLAP Frame type: "+Integer.toString(frameData[1]));
}
return(f);
}
}

View file

@ -0,0 +1,76 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* FLAPInputFrame.java
*
* Created on 3 May 2002, 15:52
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $Revision: 1.3 $
*/
public class FLAPInputFrame extends FLAPFrame {
/** Creates new FLAPInputFrame */
private int frameLen;
public FLAPInputFrame() {
frameLen=0;
super.initialise();
}
public void addFrameData(byte b)
{
frame[frameLen++]=b;
}
public byte[] getFrameData()
{
byte[] b=new byte[frameLen];
System.arraycopy(frame,0,b,0,frameLen);
return(b);
}
public void resetInputFrame()
{
frameLen=0;
}
public boolean completeFrameRead()
{
if (frameLen > 5)
{
if (frameLen-6 == getLength())
{
return(true);
}
}
return(false);
}
public int getFLAPFrameType() {
return(-1);
}
}

View file

@ -0,0 +1,56 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* FLAPKeepAliveFrame.java
*
* Created on 3 May 2002, 14:54
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $Revision: 1.4 $
*/
public class FLAPKeepAliveFrame extends FLAPFrame {
/** Creates new FLAPKeepAliveFrame */
public FLAPKeepAliveFrame() {
this.initialise();
}
public FLAPKeepAliveFrame(byte frameData[])
{
initialise();
setFrameData(frameData);
}
protected void initialise()
{
super.initialise();
frame[1]=FLAP_FRAME_KEEP_ALIVE;
}
public int getFLAPFrameType() {
return (FLAPFrame.FLAP_FRAME_KEEP_ALIVE);
}
}

View file

@ -0,0 +1,52 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* FLAPSignoffFrame.java
*
* Created on 3 May 2002, 14:54
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $Revision: 1.3 $
*/
public class FLAPSignoffFrame extends FLAPFrame {
/** Creates new FlapSignonFrame */
public FLAPSignoffFrame() {
frame[1]=FLAP_FRAME_SIGNOFF;
}
public FLAPSignoffFrame(byte frameData[])
{
frame[1]=FLAP_FRAME_SIGNOFF;
setFrameData(frameData);
}
public int getFLAPFrameType() {
return(FLAPFrame.FLAP_FRAME_SIGNOFF);
}
}

View file

@ -0,0 +1,90 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* FlapSignonFrame.java
*
* Created on 3 May 2002, 14:54
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $Revision: 1.3 $
*/
public class FLAPSignonFrame extends FLAPFrame {
/** Creates new FlapSignonFrame */
public FLAPSignonFrame() {
frame[1]=FLAP_FRAME_SIGNON;
}
public FLAPSignonFrame(byte frameData[])
{
frame[1]=FLAP_FRAME_SIGNON;
setFrameData(frameData);
}
public int getFLAPVersion()
{
return(((frame[6]&0xff)*16777216)+((frame[7]&0xff)*65536)+((frame[8]&0xff)*256)+(frame[9]&0xff));
}
public void setFLAPVersion(int version)
{
for (int i=3;i>=0;i--)
{
frame[6+i]=(byte)(version&0xff);
version=version>>8;
}
}
public void setTLVTag(int tag)
{
for (int i=1;i>=0;i--)
{
frame[10+i]=(byte)(tag&0xff);
tag=tag>>8;
}
}
public void setUserName(String name)
{
int len=0;
for (int i=0;i<name.length();i++)
{
char c = name.charAt(i);
if (c != ' ')
{
frame[FLAP_DATA_OFFSET+8+len++]=(byte)c;
}
}
setLength(8+len);
frame[FLAP_DATA_OFFSET+6]=(byte)(len/256);
frame[FLAP_DATA_OFFSET+7]=(byte)(len&0xff);
}
public int getFLAPFrameType() {
return(FLAPFrame.FLAP_FRAME_SIGNON);
}
}

View file

@ -0,0 +1,85 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* GenericTocCommand.java
*
* Created on 4 May 2002, 12:07
*/
package com.wilko.jaim;
/** A GenericTocResponse is used internally in the Response parsing and processing logic of {@link JaimConnection}
* @author paulw
* @version $Revision: 1.5 $
*/
public class GenericTocResponse extends TocResponse implements TocResponseHandler {
/** Creates new GenericTocCommand */
public GenericTocResponse() {
this.cmd="";
}
/** Parse an incoming string
* @param str The response string to be parsed
*/
public TocResponse parseString(String str)
{
GenericTocResponse tr=new GenericTocResponse();
tr.doParse(str);
return tr;
}
private void doParse(String str)
{
cmd=str;
}
/** Get a byte array that contains the response
* @return The response as an array of bytes
*/
public byte[] getBytes() {
return(cmd.getBytes());
}
/** Convert this response to a string
* @return The response as a string
*/
public String toString()
{
return(cmd);
}
/** Used in the response dispatching process
* @return The respnse type
*/
public String getResponseType()
{
return("UNKNOWN");
}
/** Returns true if this response handler can handle the specified response.
* @param Response - the response string from TOC. This is the part of the response before the first ':'
* @return true if the response can be handled
*/
public boolean canHandle(String Response) {
return(true);
}
}

View file

@ -0,0 +1,106 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* TocIMResponse.java
*
* Created on 4 May 2002, 14:38
*/
package com.wilko.jaim;
/** This response is delivered to a {@link JaimEventListener } when a GOTO response is received from TOC
* @author paulw
* @version $Revision: 1.3 $
*/
public class GotoTocResponse extends TocResponse implements TocResponseHandler {
String windowName;
boolean autoResponse;
String URL;
public static final String RESPONSE_TYPE="GOTO_URL";
/** Creates new GotoTocResponse */
public GotoTocResponse() {
windowName="";
URL="";
}
/** Obtain the suggested window name for this URL
* @return The window name
*/
public String getWindowName()
{
return(windowName);
}
/** Obtain the URL
* @return The URL
*/
public String getURL()
{
return(URL);
}
/** Parse an incoming response string
* @param str The string to be parsed
*/
public TocResponse parseString(java.lang.String str) {
GotoTocResponse tr=new GotoTocResponse();
tr.doParse(str);
return(tr);
}
private void doParse(String str)
{
cmd=str;
int colonPos=str.indexOf(':');
if (colonPos!=-1)
{
str=str.substring(colonPos+1);
colonPos=str.indexOf(':');
if (colonPos != -1)
{
windowName=str.substring(0,colonPos);
URL=str.substring(colonPos+1);
}
}
}
/** Obtain the response type for response dispatching purposes
* @return The response type
*/
public String getResponseType() {
return(RESPONSE_TYPE);
}
/** Returns true if this response handler can handle the specified response.
* @param Response - the response string from TOC. This is the part of the response before the first ':'
* @return true if the response can be handled
*/
public boolean canHandle(String Response) {
return (Response.equalsIgnoreCase(RESPONSE_TYPE));
}
}

View file

@ -0,0 +1,100 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* Group.java
*
* Created on 4 May 2002, 12:05
*/
package com.wilko.jaim;
import java.util.Vector;
import java.util.List;
import java.util.Enumeration;
/** This is a logical user group. It holds a set of users.
* @author Brett Humphreys
*/
public class Group {
/** Vector of buddies for this group */
private Vector buddies = new Vector();
/** Name of this group */
private String groupName;
/** This constructor sets the name of the group
* @param name the group name
*/
public Group( String name ) {
groupName = name;
}
/** This method adds a buddy to the end of the group
* @param buddy The buddy object to associate with this group
*/
public void addBuddy(Buddy buddy) {
buddies.add(buddy);
}
/** This method adds a buddy to the specified location in the group
* If the specified location is beyond the end of the group, then the buddy is added to the end of the group
* @param buddy The buddy object to associate with this group
* @param pos the position to add the buddy
*/
public void addBuddy(Buddy buddy,int pos) {
if (pos > buddies.size()) {
buddies.add(buddy);
}
else {
buddies.add(pos,buddy);
}
}
/** This method gets the group name
* @return the group name
*/
public String getName() {
return groupName;
}
/** This method returns the buddies in this group
* @return an Enumeration of {@link Buddy} objects
*/
public Enumeration enumerateBuddies() {
return buddies.elements();
}
/** This method returns the number of buddies in this group
* @return buddy count
*/
public int getBuddyCount() {
return(buddies.size());
}
/** This method returns the buddies in this group
* @return a Collection of {@link Buddy} objects
*/
public java.util.Collection getBuddies() {
java.util.Collection cReturn = new java.util.Vector(buddies);
return cReturn;
}
}

View file

@ -0,0 +1,122 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* TocIMResponse.java
*
* Created on 4 May 2002, 14:38
*/
package com.wilko.jaim;
/** This response is delivered to a {@link JaimEventListener } when an instant message is received
* @author paulw
* @version $Revision: 1.6 $
*/
public class IMTocResponse extends TocResponse implements TocResponseHandler {
String from;
boolean autoResponse;
String msg;
public static final String RESPONSE_TYPE="IM_IN";
/** Creates new TocIMResponse */
public IMTocResponse() {
from="";
msg="";
autoResponse=false;
}
/** Obtain the name of the buddy who sent this instant message
* @return The senders name
*/
public String getFrom()
{
return(from);
}
/** Obtain the message
* @return The message
* @see Utils#stripHTML
*/
public String getMsg()
{
return(msg);
}
/** Is this response an automatically generated response?
* @return true if this is an automatically generated response
*/
public boolean getAutoResponse()
{
return(autoResponse);
}
/** Parse an incoming IM response string
* @param str The string to be parsed
*/
public TocResponse parseString(java.lang.String str) {
IMTocResponse tr=new IMTocResponse();
tr.doParse(str);
return(tr);
}
private void doParse(String str)
{
cmd=str;
int colonPos=str.indexOf(':');
if (colonPos!=-1)
{
str=str.substring(colonPos+1);
colonPos=str.indexOf(':');
if (colonPos != -1)
{
from=str.substring(0,colonPos);
str=str.substring(colonPos+1);
colonPos=str.indexOf(':');
if (str.charAt(0) == 'T')
{
autoResponse=true;
}
if (colonPos != -1)
{
msg=str.substring(colonPos+1);
}
}
}
}
/** Obtain the response type for response dispatching purposes
* @return The response type
*/
public String getResponseType() {
return(RESPONSE_TYPE);
}
/** Returns true if this response handler can handle the specified response.
* @param Response - the response string from TOC. This is the part of the response before the first ':'
* @return true if the response can be handled
*/
public boolean canHandle(String Response) {
return (Response.equalsIgnoreCase(RESPONSE_TYPE));
}
}

View file

@ -0,0 +1,926 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* JaimConnection.java
*
* Created on 4 May 2002, 08:38
*/
package com.wilko.jaim;
import java.net.*;
import java.text.DateFormat;
import java.io.*;
import java.util.*;
/** The JaimConnection object is the primary interface into the Jaim library.
* Programs should instantiate a JaimConnection (in most cases the simple constructor should be used).
* Once JaimConnection has been instantiated, call {@link #connect} followed by {@link #logIn}.
*
*
* @author paulw
* @version $Revision: 1.20 $
*/
public class JaimConnection implements java.lang.Runnable {
private Socket s;
private InputStream sin;
private OutputStream sout;
private boolean connected;
private boolean loggedIn;
private boolean loginComplete;
private boolean configValid;
private String host;
private int port;
private int clientSequence;
private int serverSequence;
private ReceiverThread rt;
private DeliveryThread dt;
private Vector eventListeners;
private HashMap watchedBuddies;
private HashMap buddies;
private HashMap groups;
private String nickName;
private long lastMessageSendTime;
private boolean debug;
private Thread myThread;
private Vector messageQueue;
private boolean exit;
private long lastKeepAlive;
// Number of send "points" - used to control send rate
private int sendPoints=10;
private static final int MAX_POINTS=10;
private static final int BLOCK_POINTS=5;
private static final int POINT_RECOVERY_TIME=2200; // Recover one point every 2.2 seconds
private static final int THRESHOLD_DELAY=5000; // Delay when we are threshold of being blocked
private static final int WAIT_TIME=61000; // Wait 61 secs for a keep alive
/** Creates new JaimConnection that connects to the default host and port.
* In most cases this constructor should be used.
*/
public JaimConnection() {
host="toc.oscar.aol.com";
port=9898;
startMe();
}
/** Creates a new Jaim Connection to the specified host/port.
* There are currently no reasons to call this constructor, however AOL may change the TOC host and port in the future
* @param host The hostname or IP address of the TOC server
* @param port The port number to connect to on the host
*/
public JaimConnection(String host,int port) {
this.host=host;
this.port=port;
startMe();
}
/** start the message dispatcher thread
*/
private void startMe() {
connected=false;
loggedIn=false;
eventListeners=new Vector();
loginComplete=false;
lastMessageSendTime=0;
watchedBuddies=new HashMap();
buddies=new HashMap();
groups=new HashMap();
debug=false;
exit=false;
rt=null;
configValid=false;
lastKeepAlive=System.currentTimeMillis();
TocResponseFactory.addResponseHandler(new BuddyUpdateTocResponse());
TocResponseFactory.addResponseHandler(new ErrorTocResponse());
TocResponseFactory.addResponseHandler(new EvilTocResponse());
TocResponseFactory.addResponseHandler(new IMTocResponse());
TocResponseFactory.addResponseHandler(new SignOnTocResponse());
TocResponseFactory.addResponseHandler(new NickTocResponse());
TocResponseFactory.addResponseHandler(new GotoTocResponse());
TocResponseFactory.addResponseHandler(new ConfigTocResponse());
TocResponseFactory.addResponseHandler(new ChatInviteTocResponse());
messageQueue=new Vector();
myThread = new Thread(this);
myThread.setDaemon(true);
myThread.start();
dt=new DeliveryThread();
dt.setDaemon(true);
dt.start();
}
/** Enable/Disable debugging messages to stdout
* @param debug true if debugging messages should be output
*/
public void setDebug(boolean debug) {
this.debug=debug;
}
/** Specify the intermessage delay time. <br>
* The {@link #sendIM } method will ensure that at least this amount of time has elapsed between messages
* @param msec The delay period in milliseconds
* @deprecated This function is no longer used - send throttling is automatic
*/
public void setInterMessageDelay(long msec) {
}
/** Get the intermessage delay time
* @return The intermessage delay time in milliseconds
* @deprecated This function is no longer used
*/
public long getInterMessageDelay() {
return(0);
}
/** Set the EventListener object. This object will be notified of incoming TOC events
* @param l The listener class to be notified
* @deprecated replaced by {@link #addEventListener}
*/
public void setEventListener(JaimEventListener l) throws TooManyListenersException {
eventListeners.add(l);
}
/** Add an EventListener object. This object will be notified of incoming TOC events
* @param l The listener class to be notified
*/
public void addEventListener(JaimEventListener l) {
eventListeners.add(l);
}
/** Remove an EventListener object. This object will no longer be notified of incoming TOC events
* @param l The listener class to be removed
*/
public void removeEventListener(JaimEventListener l) {
eventListeners.remove(l);
}
/** Initiate a connection to the TOC server
* @throws IOException If an underlying network communication fails
*/
public void connect() throws IOException {
s=new Socket(host,port);
s.setSoTimeout(500);
sin=s.getInputStream();
sout=s.getOutputStream();
sout.write("FLAPON\r\n\r\n".getBytes());
FLAPInputFrame inFrame = new FLAPInputFrame();
int i=-1;
while (!inFrame.completeFrameRead()) {
i=sin.read();
inFrame.addFrameData((byte)i);
}
try {
FLAPFrame f = FLAPFrameFactory.createFLAPFrame(inFrame.getFrameData());
FLAPSignonFrame sf = (FLAPSignonFrame)f;
if (debug) {
System.out.println("Starting sequence="+sf.getSequence());
System.out.println("FLAP version = "+sf.getFLAPVersion());
}
clientSequence=sf.getSequence();
serverSequence=sf.getSequence();
}
catch (FLAPFrameException e) {
throw new IOException("FLAPFrameException:"+e.toString());
}
if (rt!=null) {
rt.pleaseExit();
}
rt=new ReceiverThread(this);
rt.setInputStream(sin);
rt.setDaemon(true);
rt.start();
connected=true;
}
/** Disconnect from the TOC server
* @throws IOException if a network transport error occurs
*/
public void disconnect() throws IOException {
exit=true;
rt.pleaseExit();
try {
rt.join(700);
myThread.join(700);
}
catch (InterruptedException e) {
}
if (connected) {
if (loggedIn) {
logOut();
}
s.close();
connected=false;
}
}
/** Check if the TOC login process has completed
* @return true if the login process is complete
*/
public boolean isLoginComplete() {
return(loginComplete);
}
/** Log out from the TOC server
*/
public void logOut() {
loggedIn=false;
loginComplete=false;
configValid=false;
}
/** Get the formatted Nick Name for this connection. If no formatted nick name has been registered with the TOC server, then the username provided to the logIn call is returned
* @return The Nick Name associated with this connection
*/
public String getNickName() {
return(nickName);
}
/** login to the TOC server. {@link #connect() } method should be called first
* @param username The username to log in with
* @param password the password for the specified username
* @param waitTime time in milliseconds for successful login before declaring an error
* @throws IOException If a network error occurs
* @throws JaimException If a login failure occurs or login fails to complete before waittime expires
*/
public void logIn(String username,String password,int waitTime) throws JaimException, IOException {
if (connected) {
nickName=username;
String nuser=Utils.normalise(username);
FLAPSignonFrame sof = new FLAPSignonFrame();
sof.setSequence(clientSequence++);
sof.setFLAPVersion(1);
sof.setTLVTag(1);
sof.setUserName(nuser);
sout.write(sof.getFrameData());
TocSignonCommand soc=new TocSignonCommand(host,port,username,password);
sendTocCommand(soc);
for (int i=0;i<waitTime/100;i++) // Wait a max of waitTime * 100ms
{
if (loginComplete||!connected) // Have we logged in successfully
{
break; // If so then return
}
else {
try {
Thread.sleep(100); //Sleep for a tenth of a second
}
catch (InterruptedException e) {
}
}
}
if (loginComplete) {
loggedIn=true;
}
else {
throw new JaimTimeoutException("login failed-timeout waiting for valid response");
}
}
else
throw new JaimStateException("Not connected.");
}
private void sendTocCommand(TocCommand cmd) throws IOException {
FLAPDataFrame fr=new FLAPDataFrame();
fr.setSequence(nextSequence());
if (debug) {
System.out.println("Sending "+cmd.toString());
}
fr.addString(cmd.toString());
sout.write(fr.getFrameData());
}
private int nextSequence()
{
int seq=clientSequence++;
if (clientSequence>65535)
clientSequence=0;
return(seq);
}
private void sendKeepAlive() throws IOException {
FLAPKeepAliveFrame fr=new FLAPKeepAliveFrame();
fr.setSequence(nextSequence());
if (debug) {
System.out.println("Sending keepalive");
}
sout.write(fr.getFrameData());
}
/** The run method for the dispatcher thread
*/
public void run() {
while (true) {
if (messageQueue.size()>0) {
realDispatch((FLAPFrame)messageQueue.remove(0));
}
else {
if (System.currentTimeMillis()-lastKeepAlive>WAIT_TIME)
{
if (debug)
{
System.out.println("No keepalive received - sending");
}
try
{
sendKeepAlive();
lastKeepAlive=System.currentTimeMillis();
}
catch (IOException ioe)
{
connectionLost();
}
}
try {
synchronized(this) {
this.wait(WAIT_TIME);
}
}
catch (InterruptedException e) {
}
}
}
}
protected void Dispatch(FLAPFrame fr) {
messageQueue.addElement(fr);
synchronized(this) {
this.notify();
}
}
private void realDispatch(FLAPFrame fr) {
switch (fr.getFLAPFrameType()) {
case FLAPFrame.FLAP_FRAME_ERROR:
try {
disconnect();
}
catch (IOException e) {
}
break;
case FLAPFrame.FLAP_FRAME_DATA:
FLAPDataFrame df=(FLAPDataFrame)fr;
TocResponse tr = TocResponseFactory.createResponse(df.getContent());
HandleTocResponse(tr);
break;
case FLAPFrame.FLAP_FRAME_KEEP_ALIVE:
if (debug) {
System.out.println("Received keep alive frame "+DateFormat.getTimeInstance().format(new Date()));
}
lastKeepAlive=System.currentTimeMillis();
try
{
sendKeepAlive();
}
catch (IOException e)
{
connectionLost();
}
break;
case FLAPFrame.FLAP_FRAME_SIGNOFF:
connected=false;
loggedIn=false;
try {
s.close();
}
catch (IOException e) {
}
break;
default:
if (debug) {
System.out.println("Unknown type received: "+fr.getFLAPFrameType());
}
break;
}
}
protected void HandleTocResponse(TocResponse tr) {
if (debug) {
System.out.println("Toc Response received:"+tr.toString());
}
if (tr instanceof SignOnTocResponse) {
TocInitDoneCommand tid = new TocInitDoneCommand();
TocAddBuddyCommand tab = new TocAddBuddyCommand();
Iterator it=watchedBuddies.keySet().iterator();
while (it.hasNext()) {
tab.addBuddy((String)it.next());
}
try {
sendTocCommand(tab);
sendTocCommand(tid);
deliverEvent(new LoginCompleteTocResponse()); // nform clients that login processing is now complete
loginComplete=true;
}
catch (IOException e) {
}
}
else if (tr instanceof ConfigTocResponse) {
if (debug) {
System.out.println("Received ConfigTocResponse");
}
ConfigTocResponse ctr=(ConfigTocResponse)tr;
Enumeration e=ctr.enumerateGroups();
while (e.hasMoreElements()) {
Group g=(Group)e.nextElement();
groups.put(g.getName(),g);
Enumeration be=g.enumerateBuddies();
while (be.hasMoreElements()) {
Buddy b=(Buddy)be.nextElement();
if (!buddies.containsKey(b.getName())) {
buddies.put(b.getName(),b);
}
}
}
configValid=true;
}
deliverEvent(tr);
}
/** Deliver a TocResponse event to registered listeners
*@param tr The TocResponse to be delivered
*/
private void deliverEvent(TocResponse tr) {
dt.deliverMessage(tr);
}
public void joinChat(int exchange, String roomName) {
try {
TocChatJoinCommand joinCommand = new TocChatJoinCommand(exchange, roomName);
sendTocCommand(joinCommand);
} catch (IOException ignore) {}
}
public void joinChat(String roomName) {
joinChat(4, roomName);
}
/** Send an instant message
* @param recipient The nickname of the message recipient
* @param msg The message to send
* @throws IOException if a network error occurs
*/
public void sendIM(String recipient,String msg) throws IOException {
sendIM(recipient,msg,false);
}
/** Send an instant message
* @param recipient The nickname of the message recipient
* @param msg The message to send
* @param auto true if this is an automatic response (eg. away message)
* @throws IOException if a network error occurs
*/
public void sendIM(String recipient,String msg,boolean auto) throws IOException {
synchronized(this) {
if (sendPoints < MAX_POINTS) // If we have less than full points
{
long now=System.currentTimeMillis();
long difference=now-lastMessageSendTime;
sendPoints+=(int)(difference/POINT_RECOVERY_TIME); // 1 point is regained every 2 seconds
if (sendPoints >MAX_POINTS)
sendPoints=MAX_POINTS;
if (sendPoints <BLOCK_POINTS) // If we are in danger of being limited
{
try {
Thread.sleep(THRESHOLD_DELAY); // Wait until we get one point back
sendPoints++;
}
catch (InterruptedException ie) {
}
}
}
}
TocIMCommand im=new TocIMCommand(recipient,msg,auto);
sendTocCommand(im);
sendPoints--;
if (debug) {
System.out.println("Points="+sendPoints);
}
lastMessageSendTime=System.currentTimeMillis();
}
/** Add a buddy to a group. This information can be saved on the server by calling {@link #saveConfig}
* @param buddyName The normalised buddy name to add
* @param groupName The name of the group to add this buddy to
* @param pos the position in the group at which to add the buddy.
* @return The {@link Buddy} object that represents the specified buddy name.
*/
public Buddy addBuddy(String buddyName, String groupName, int pos) {
if (debug) {
System.out.println("Adding "+buddyName+" to group "+groupName+" at position "+pos);
}
Buddy buddy;
buddy=(Buddy)buddies.get(buddyName);
if (buddy==null) {
buddy=new Buddy(buddyName);
}
Group group=(Group)groups.get(groupName);
if (group==null) {
group=new Group(groupName);
groups.put(groupName,group);
}
if (pos>group.getBuddyCount()||pos==-1) {
group.addBuddy(buddy);
}
else {
group.addBuddy(buddy,pos);
}
return(buddy);
}
/** Add a buddy to a group. This information can be saved on the server by calling {@link #saveConfig}
* The buddy is added to the end of the group
* @param buddyName The normalised buddy name to add
* @param groupName The name of the group to add this buddy to
* @return The {@link Buddy} object that represents the specified buddy name.
*/
public Buddy addBuddy(String buddyName, String groupName) {
return(addBuddy(buddyName,groupName,-1));
}
/** Add a buddy to the watch list for this connection.
* This method must be called after {@link #connect()}
* It also appears that the login process will not complete unless at least one buddy is added to the watch list
* @param buddy The nickname to add to the watch list
* @throws JaimException if the method is called at the wrong time
* @see JaimEventListener
* @deprecated the {@link #watchBuddy} method should be used instead
*/
public void addBuddy(String buddy) throws JaimException {
watchBuddy(buddy);
}
/** Add a buddy to the watch list for this connection.
* This method must be called after {@link #connect()}
* It also appears that the login process will not complete unless at least one buddy is added to the watch list
* @param buddy The nickname to add to the watch list
* @throws JaimException if the method is called at the wrong time
* @see JaimEventListener
*/
public void watchBuddy(String buddy) throws JaimException {
if (loggedIn) {
try {
TocAddBuddyCommand tab = new TocAddBuddyCommand();
tab.addBuddy(buddy);
sendTocCommand(tab);
}
catch (IOException e) {
throw new JaimException(e.toString());
}
}
watchedBuddies.put(buddy,buddy);
}
/** Save group/buddy list configuration to the TOC server
* @throws IOException if a network error occurs
*/
public void saveConfig() throws IOException {
TocSetConfigCommand tsc=new TocSetConfigCommand();
Iterator it =groups.keySet().iterator();
while (it.hasNext()) {
Group g = (Group)groups.get(it.next());
tsc.addGroup(g);
}
sendTocCommand(tsc);
}
/** Return the set of groups that have been stored in the TOC server
* The information returned from this method is only valid if {@link #isConfigValid} returns true
* @return A Collection of {@link Group} Objects
*/
public Collection getGroups() {
return(groups.values());
}
/**
* Return a group, given its name
* @return A {@link Group} Object corresponding to the string name
*/
public Group getGroupBy(String name) {
Group result = (Group) groups.get(name);
return result;
}
/** Indicate whether configuration information has been received from the TOC server.
* If this method returns true then the information returned by {@link #getGroups} is valid
* @return true if configuration information has been received from the TOC server.
*/
public boolean isConfigValid() {
return(configValid);
}
/** Send a warning or "Evil" to another user. You must be involved in a communication with a user before you can warn them
* @param buddy The nickname of the buddy to warn
* @param anonymous true if the warning should be sent anonymously
* @throws IOException if a network error occurs
*/
public void sendEvil(String buddy,boolean anonymous) throws IOException {
TocEvilCommand ec=new TocEvilCommand(buddy,anonymous);
sendTocCommand(ec);
}
/** Set the information for the logged in user
* @param information The information for this user (May contain HTML)
* @throws IOException if a network error occurs
*/
public void setInfo(String information) throws IOException {
TocSetInfoCommand sic=new TocSetInfoCommand(information);
sendTocCommand(sic);
}
/** Get the information for the specified user
* @param username The screenname for whom info is requested (May contain HTML)
* @throws IOException if a network error occurs
*/
public void getInfo(String username) throws IOException {
TocGetInfoCommand gic=new TocGetInfoCommand(username);
sendTocCommand(gic);
}
/** Get an Input stream associated with a URL returned by the "GOTO_URL" toc response
*@param file The "file" returned by calling GotoTocResponse#getURL
*@return An InputStream connected to the specified URL
*@throws IOException if an IO error occurs
*@throws MalformedURLException if there is an error building the URL
*/
public InputStream getURL(String file) throws IOException, MalformedURLException {
URL URL;
URL=new URL("http",host,port,file);
return(URL.openStream());
}
/** Set the information for the logged in user
* @param awayMsg The away message for this user. May contain HTML. To cancel "away" status set the awayMsg to ""
* @throws IOException if a network error occurs
*/
public void setAway(String awayMsg) throws IOException {
TocSetAwayCommand sic=new TocSetAwayCommand(awayMsg);
sendTocCommand(sic);
}
/** Adds the specified buddy to your permit list.
* @param buddy The buddy to add to your block list. If this is an empty string, mode is changed to "permit none"
* @throws JaimException if a network error occurs
*/
public void addPermit(String buddy) throws JaimException {
if (loggedIn) {
try {
TocAddPermitCommand tap = new TocAddPermitCommand();
tap.addPermit(buddy);
sendTocCommand(tap);
}
catch (IOException e) {
throw new JaimException(e.toString());
}
}
}
/** Adds the specified buddy to your block list.
* @param buddy The buddy to add to your block list. If this is an empty string, mode is changed to "deny none"
* @throws JaimException if a network error occurs
*/
public void addBlock(String buddy) throws JaimException {
if (loggedIn) {
try {
TocAddDenyCommand tad = new TocAddDenyCommand();
tad.addDeny(buddy);
sendTocCommand(tad);
}
catch (IOException e) {
throw new JaimException(e.toString());
}
}
}
/** Called by receiver thread to indicate that the connection has been terminated by an IOException
*/
private void connectionLost() {
deliverEvent(new ConnectionLostTocResponse());
logOut();
connected=false;
}
/** Set the idle time for this user
* @param idleSecs The number of seconds the user has been idle for. Set to 0 to indicate current activity. The server will increment the idle time if non-zero
* @throws IOException if a network error occurs
*/
public void setIdle(int idleSecs) throws IOException {
TocSetIdleCommand sic=new TocSetIdleCommand(idleSecs);
sendTocCommand(sic);
}
/** Delete a buddy from the buddy watch list. The buddy should have been added with {@link #addBuddy } first.
* The buddy list can only be modified after {@link #connect } is called.
* @param buddy The buddy name to be deleted\
* @deprecated use {@link #unwatchBuddy } instead
*/
public void deleteBuddy(String buddy) {
unwatchBuddy(buddy);
}
/** Delete a buddy from the buddy watch list. The buddy should have been added with {@link #addBuddy } first.
* The buddy list can only be modified after {@link #connect } is called.
* @param buddy The buddy name to be deleted
*/
public void unwatchBuddy(String buddy) {
watchedBuddies.remove(buddy);
}
private class ReceiverThread extends Thread {
private InputStream sin;
private boolean exit;
private JaimConnection parent;
private ReceiverThread(JaimConnection parent) {
this.parent=parent;
exit=false;
}
private void setInputStream(InputStream in) {
sin=in;
}
public void run() {
if (debug) {
System.out.println("Receiver starting");
}
FLAPInputFrame inframe=new FLAPInputFrame();
try {
while (!exit) {
try {
int i;
while ( !inframe.completeFrameRead()) {
i=sin.read();
inframe.addFrameData((byte)i);
}
try {
FLAPFrame fr=FLAPFrameFactory.createFLAPFrame(inframe.getFrameData());
parent.Dispatch(fr);
}
catch (FLAPFrameException ffe) {
if (debug) {
ffe.printStackTrace();
}
}
if (inframe.completeFrameRead()) {
inframe.resetInputFrame();
}
}
catch (InterruptedIOException iie) {
// We expect these because we are performing reads with a timeout
}
}
}
catch (IOException e) {
connectionLost(); // Indicate that we have lost our connection
if (debug) {
e.printStackTrace();
}
}
}
private void pleaseExit() {
exit=true;
}
}
private class DeliveryThread extends Thread {
private Vector messages;
private boolean exit;
private DeliveryThread() {
messages=new Vector();
exit=false;
}
private void deliverMessage(TocResponse tr) {
synchronized(this) {
messages.add(tr);
this.notify();
}
}
public void run() {
if (debug) {
System.out.println("Delivery Thread starting");
}
while (!exit) {
if (messages.size()>0) {
TocResponse tr=(TocResponse)messages.remove(0);
doDelivery(tr);
}
else {
synchronized(this) {
try
{
this.wait();
}
catch (InterruptedException e)
{
}
}
}
}
}
private void doDelivery(TocResponse tr) {
for (int i=0;i<eventListeners.size();i++) {
JaimEventListener el=(JaimEventListener)eventListeners.elementAt(i);
el.receiveEvent(new JaimEvent(this,tr));
}
}
private void pleaseExit() {
exit=true;
}
}
}

View file

@ -0,0 +1,42 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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 com.wilko.jaim;
/** The JaimEvent object is delivered to all registered {@link JaimEventListener}
* @see JaimConnection#addEventListener
* @author paulw
* @version $revision: $
*/
public class JaimEvent extends java.util.EventObject {
private TocResponse tocResponse;
/** Creates new JaimEvent */
public JaimEvent(Object source, TocResponse tocResponse) {
super(source);
this.tocResponse=tocResponse;
}
public TocResponse getTocResponse()
{
return(tocResponse);
}
}

View file

@ -0,0 +1,40 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* JaimEventListener.java
*
* Created on 4 May 2002, 14:37
*/
package com.wilko.jaim;
/** A JaimEventListener receives JaimEvents from the JaimConnection class.
* A {@link JaimEvent} contains a {@link TocResponse} object.
* @author paulw
* @version $Revision: 1.3 $
*/
public interface JaimEventListener {
/** Receive an incoming {@link JaimEvent}
*@param ev - The incoming event
*/
public void receiveEvent(JaimEvent ev);
}

View file

@ -0,0 +1,51 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* JaimException.java
*
* Created on 5 May 2002, 21:04
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $Revision: 1.3 $
*/
public class JaimException extends java.lang.Exception {
/**
* Creates new <code>JaimException</code> without detail message.
*/
public JaimException() {
}
/**
* Constructs an <code>JaimException</code> with the specified detail message.
* @param msg the detail message.
*/
public JaimException(String msg) {
super(msg);
}
}

View file

@ -0,0 +1,44 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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 com.wilko.jaim;
/**
*
* @author paulw
* @version $version: $
*/
public class JaimStateException extends JaimException {
/**
* Creates new <code>JaimStateException</code> without detail message.
*/
public JaimStateException() {
}
/**
* Constructs an <code>JaimStateException</code> with the specified detail message.
* @param msg the detail message.
*/
public JaimStateException(String msg) {
super(msg);
}
}

View file

@ -0,0 +1,45 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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 com.wilko.jaim;
/**
*
* @author paulw
* @version $version: $
*/
public class JaimTimeoutException extends JaimException {
/**
* Creates new <code>JaimTimeoutException</code> without detail message.
*/
public JaimTimeoutException() {
}
/**
* Constructs an <code>JaimTimeoutException</code> with the specified detail message.
* @param msg the detail message.
*/
public JaimTimeoutException(String msg) {
super(msg);
}
}

View file

@ -0,0 +1,50 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* LoginCompleteTocResponse.java
*
* Created on November 2, 2002, 2:52 PM
*/
package com.wilko.jaim;
/**
* This is a "pseudo" TOC response - it is delivered to JaimLib clients to indicate that login processing has been completed successfully.
* @author wilko
* @version: $revision: $
*/
public class LoginCompleteTocResponse extends TocResponse {
public static final String RESPONSE_TYPE="LOGINCOMPLETE";
/** Creates a new instance of LoginCompleteTocResponse */
public LoginCompleteTocResponse() {
}
public String getResponseType() {
return (RESPONSE_TYPE);
}
public String toString()
{
return (RESPONSE_TYPE);
}
}

View file

@ -0,0 +1,82 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* NickTocResponse.java
*
* Created on 6 May 2002, 17:21
*/
package com.wilko.jaim;
/**
* The NicTocResponse is used internally to manage the TOC signon process. It is not delivered to clients of {@link JaimConnection}
* @author paulw
* @version $Revision: 1.6 $
*/
public class NickTocResponse extends TocResponse implements TocResponseHandler {
private String nickName;
public static final String RESPONSE_TYPE="NICK";
/** Creates new NickTocResponse */
public NickTocResponse() {
nickName="";
}
public TocResponse parseString(java.lang.String str) {
NickTocResponse tr=new NickTocResponse();
tr.doParse(str);
return(tr);
}
private void doParse(String str)
{
int colonPos=str.indexOf(':');
if (colonPos != -1)
{
nickName=str.substring(colonPos+1);
}
}
public String getNickName()
{
return(nickName);
}
public String getResponseType() {
return RESPONSE_TYPE;
}
/** Returns true if this response handler can handle the specified response.
* @param Response - the response string from TOC. This is the part of the response before the first ':'
* @return true if the response can be handled
*/
public boolean canHandle(String Response) {
return(Response.equalsIgnoreCase(RESPONSE_TYPE));
}
}

View file

@ -0,0 +1,80 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* SignOnTocResponse.java
*
* Created on 4 May 2002, 13:29
*/
package com.wilko.jaim;
/**
* The SignOnTocResponse is used internally to manage the TOC signon process. It is not delivered to clients of {@link JaimConnection}
* @author paulw
* @version $Revision: 1.5 $
*/
public class SignOnTocResponse extends TocResponse implements TocResponseHandler {
String version;
public static final String RESPONSE_TYPE="SIGN_ON";
/** Creates new SignOnTocResponse */
public SignOnTocResponse() {
version="";
}
public String getResponseType() {
return(RESPONSE_TYPE);
}
protected String getVersion()
{
return(version);
}
public TocResponse parseString(String str)
{
SignOnTocResponse tr=new SignOnTocResponse();
tr.doParse(str);
return(tr);
}
private void doParse(String str)
{
cmd=str;
int colonpos=str.indexOf(':');
if (colonpos != -1)
{
version=str.substring(colonpos+1);
}
}
/** Returns true if this response handler can handle the specified response.
* @param Response - the response string from TOC. This is the part of the response before the first ':'
* @return true if the response can be handled
*/
public boolean canHandle(String Response) {
return(Response.equalsIgnoreCase(RESPONSE_TYPE));
}
}

View file

@ -0,0 +1,67 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* TocAddBuddyCommand.java
*
* Created on 4 May 2002, 13:57
*/
package com.wilko.jaim;
import java.util.Vector;
/**
*
* @author paulw
* @version $Revision: 1.3 $
*/
public class TocAddBuddyCommand extends TocCommand {
private static String CMD="toc_add_buddy";
Vector buddyList;
/** Creates new TocAddBuddyCommand */
public TocAddBuddyCommand() {
buddyList=new Vector();
}
public void addBuddy(String buddy)
{
buddyList.add(Utils.normalise(buddy));
}
public String toString()
{
StringBuffer output=new StringBuffer(CMD);
for (int i=0;i<buddyList.size();i++)
{
output.append(' ');
output.append((String)buddyList.elementAt(i));
}
return(output.toString());
}
public byte[] getBytes() {
return(toString().getBytes());
}
}

View file

@ -0,0 +1,67 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* TocAddDenyCommand.java
*
* Created on 4 May 2002, 13:57
*/
package com.wilko.jaim;
import java.util.Vector;
/**
*
* @author paulw
* @version $Revision: 1.3 $
*/
public class TocAddDenyCommand extends TocCommand {
private static String CMD="toc_add_deny";
Vector buddyList;
/** Creates new TocAddBuddyCommand */
public TocAddDenyCommand() {
buddyList=new Vector();
}
public void addDeny(String buddy)
{
buddyList.add(Utils.normalise(buddy));
}
public String toString()
{
StringBuffer output=new StringBuffer(CMD);
for (int i=0;i<buddyList.size();i++)
{
output.append(' ');
output.append((String)buddyList.elementAt(i));
}
return(output.toString());
}
public byte[] getBytes() {
return(toString().getBytes());
}
}

View file

@ -0,0 +1,67 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* TocAddPermitCommand.java
*
* Created on 11 Oct 2002, 15:20
*/
package com.wilko.jaim;
import java.util.Vector;
/**
*
* @author paulw
* @version $Revision: 1.1 $
*/
public class TocAddPermitCommand extends TocCommand {
private static String CMD="toc_add_permit";
Vector buddyList;
/** Creates new TocAddBuddyCommand */
public TocAddPermitCommand() {
buddyList=new Vector();
}
public void addPermit(String buddy)
{
buddyList.add(Utils.normalise(buddy));
}
public String toString()
{
StringBuffer output=new StringBuffer(CMD);
for (int i=0;i<buddyList.size();i++)
{
output.append(' ');
output.append((String)buddyList.elementAt(i));
}
return(output.toString());
}
public byte[] getBytes() {
return(toString().getBytes());
}
}

View file

@ -0,0 +1,53 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* TocIMCommand.java
*
* Created on 4 May 2002, 15:18
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $Revision: 1.4 $
*/
public class TocChatJoinCommand extends TocCommand {
private int exchange;
private String roomName;
/** Creates new TocIMCommand */
public TocChatJoinCommand(int exchange, String roomName) {
this.exchange=exchange;
this.roomName=roomName;
}
public String toString()
{
return ("toc_chat_join "+exchange+" "+roomName);
}
public byte[] getBytes() {
return(this.toString().getBytes());
}
}

View file

@ -0,0 +1,43 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* TocCommand.java
*
* Created on 4 May 2002, 11:19
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $Revision: 1.3 $
*/
public abstract class TocCommand {
/** Creates new TocCommand */
public TocCommand() {
}
abstract public byte[] getBytes();
abstract public String toString();
}

View file

@ -0,0 +1,28 @@
# AIM Errors
901=%s not currently available
902=Warning of %s not currently available
903=A message has been dropped, you are exceeding the server speed limit
# * Chat Errors *
950=Chat in %s is unavailable.
# * IM & Info Errors *
960=You are sending message too fast to $target
961=You missed an im from %s because it was too big.
962=You missed an im from %s because it was sent too fast.
# * Dir Errors *
970=Failure
971=Too many matches
972=Need more qualifiers
973=Dir service temporarily unavailable
974=Email lookup restricted
975=Keyword Ignored
976=No Keywords
977=Language not supported
978=Country not supported
979=Failure unknown %s
# * Auth errors *
980=Incorrect nickname or password.
981=The service is temporarily unavailable.
982=Your warning level is currently too high to sign on.
983=You have been connecting and disconnecting too frequently. Wait 10 minutes and try again. If you continue to try, you will need to wait even longer.
989=An unknown signon error has occurred %s
0=Invalid Error Code specified

View file

@ -0,0 +1,61 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* TocEvilCommand.java
*
* Created on 6 May 2002, 09:05
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $Revision: 1.3 $
*/
public class TocEvilCommand extends TocCommand {
private String buddy;
private boolean anonymous;
/** Creates new TocEvilCommand */
public TocEvilCommand(String buddy, boolean anonymous) {
this.buddy=Utils.normalise(buddy);
this.anonymous=anonymous;
}
public String toString()
{
String ret="toc_evil "+buddy;
if (anonymous)
{
ret=ret+" anon";
}
else
ret=ret+" norm";
return(ret);
}
public byte[] getBytes() {
return toString().getBytes();
}
}

View file

@ -0,0 +1,70 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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 com.wilko.jaim;
/**
*
* @author paulw
* @version $version: $
*/
public class TocGetInfoCommand extends TocCommand {
private String username;
private static String CMD="toc_get_info ";
/** Creates new TocGetInfoCommand
*@param username The screen name for whom information is requested
*
*/
public TocGetInfoCommand(String username) {
this.username=Utils.normalise(username);
}
public String toString()
{
return(CMD+username);
}
public byte[] getBytes() {
return(toString().getBytes());
}
}

View file

@ -0,0 +1,58 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* TocIMCommand.java
*
* Created on 4 May 2002, 15:18
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $Revision: 1.4 $
*/
public class TocIMCommand extends TocCommand {
private String recipient;
private String msg;
private String auto;
/** Creates new TocIMCommand */
public TocIMCommand(String recipient, String msg,boolean autoMessage) {
this.recipient=Utils.normalise(recipient);
this.msg=Utils.encodeText(msg);
if (autoMessage)
auto=" auto";
else
auto="";
}
public String toString()
{
return ("toc_send_im "+recipient+" "+msg+auto);
}
public byte[] getBytes() {
return(this.toString().getBytes());
}
}

View file

@ -0,0 +1,50 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* TocInitDoneCommand.java
*
* Created on 4 May 2002, 13:35
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $Revision: 1.4 $
*/
public class TocInitDoneCommand extends TocCommand {
private static final String CMD="toc_init_done";
/** Creates new TocInitDoneCommand */
public TocInitDoneCommand() {
}
public byte[] getBytes() {
return(CMD.getBytes());
}
public String toString()
{
return(CMD);
}
}

View file

@ -0,0 +1,49 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* TocCommand.java
*
* Created on 4 May 2002, 11:19
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $Revision: 1.5 $
*/
public abstract class TocResponse {
protected String cmd;
public TocResponse()
{
cmd="";
}
public String toString()
{
return(cmd);
}
public abstract String getResponseType();
}

View file

@ -0,0 +1,82 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* TocResponseFactory.java
*
* Created on 4 May 2002, 12:05
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $Revision: 1.5 $
*/
import java.util.Vector;
public abstract class TocResponseFactory {
static Vector responseHandlers = new Vector();
/** Creates new TocResponseFactory */
public TocResponseFactory() {
}
public static void addResponseHandler(TocResponseHandler h)
{
synchronized (responseHandlers)
{
responseHandlers.add(h);
}
}
static TocResponse createResponse(byte[] b)
{
TocResponse tr=null;
String strversion=new String(b);
int colonpos=strversion.indexOf(':');
if (colonpos != -1)
{
String firstWord=strversion.substring(0,colonpos);
int i=0;
synchronized (responseHandlers)
{
while ((i<responseHandlers.size())&&(tr==null))
{
TocResponseHandler h=(TocResponseHandler)responseHandlers.elementAt(i);
if (h.canHandle(firstWord))
{
tr=h.parseString(strversion);
}
i++;
}
}
}
if (tr==null)
{
GenericTocResponse gtr=new GenericTocResponse();
tr=gtr.parseString(strversion);
}
return(tr);
}
}

View file

@ -0,0 +1,44 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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 com.wilko.jaim;
/**
*
* @author paulw
* @version $revision: $
*/
public interface TocResponseHandler {
/** Returns true if this response handler can handle the specified response.
*@param Response - the response string from TOC. This is the part of the response before the first ':'
*@return true if the response can be handled
*/
public boolean canHandle(String Response);
/** Parse the provided response
*@param Response - the response from the TOC server. This is the full TOC response string
*@return - A TocResponse object that represents this response
*/
public TocResponse parseString(String Response);
}

View file

@ -0,0 +1,56 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* TocSetAwayCommand.java
*
* Created on July 17, 2002, 9:02 PM
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $version: $
*/
public class TocSetAwayCommand extends TocCommand {
private String awayMsg;
private static String CMD="toc_set_away ";
/** Creates new TocSetInfoCommand
* @param awayMsg The away message for this user. May contain HTML. To cancel "away" status set the awayMsg to ""
*/
public TocSetAwayCommand(String awayMsg) {
this.awayMsg=Utils.encodeText(awayMsg);
}
public String toString()
{
return(CMD+awayMsg);
}
public byte[] getBytes() {
return(toString().getBytes());
}
}

View file

@ -0,0 +1,74 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* TocSetConfigCommand.java
*
* Created on October 11, 2002, 9:08 AM
*/
package com.wilko.jaim;
import java.util.Enumeration;
/**
*
* @author paulw
*/
public class TocSetConfigCommand extends TocCommand {
private StringBuffer config;
private static String CMD="toc_set_config ";
/** Creates a new instance of TocSetConfigCommand */
public TocSetConfigCommand() {
config=new StringBuffer();
}
public void addGroup(Group g)
{
config.append("g "+g.getName()+"\n");
Enumeration buddies=g.enumerateBuddies();
while (buddies.hasMoreElements())
{
Buddy b = (Buddy)buddies.nextElement();
config.append("b "+b.getName()+"\n");
if (b.getPermit())
{
config.append("p "+b.getName()+"\n");
}
if (b.getDeny())
{
config.append("d "+b.getName()+"\n");
}
}
}
public String toString()
{
return(CMD+'"'+config.toString()+'"');
}
public byte[] getBytes() {
return(toString().getBytes());
}
}

View file

@ -0,0 +1,53 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* TocSetIdleCommand.java
*
* Created on July 17, 2002, 9:21 PM
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $version: $
*/
public class TocSetIdleCommand extends TocCommand {
private int idle;
private static final String CMD="toc_set_idle ";
/** Creates new TocSetIdleCommand
*@param idleSecs - the period for which the user has been idle
*/
public TocSetIdleCommand(int idleSecs) {
idle=idleSecs;
}
public String toString()
{
return(CMD+idle);
}
public byte[] getBytes() {
return(toString().getBytes());
}
}

View file

@ -0,0 +1,56 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* TocSetInfoCommand.java
*
* Created on July 17, 2002, 9:02 PM
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $version: $
*/
public class TocSetInfoCommand extends TocCommand {
private String information;
private static String CMD="toc_set_info ";
/** Creates new TocSetInfoCommand
*@param information The information about this user can be located. May contain HTML
*/
public TocSetInfoCommand(String information) {
this.information=Utils.encodeText(information);
}
public String toString()
{
return(CMD+information);
}
public byte[] getBytes() {
return(toString().getBytes());
}
}

View file

@ -0,0 +1,63 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* TocSignonCommand.java
*
* Created on 4 May 2002, 11:20
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $Revision: 1.3 $
*/
public class TocSignonCommand extends TocCommand {
private String server;
private String username;
private String password;
private int port;
private static final String AGENTNAME="jaim01";
/** Creates new TocSignonCommand */
public TocSignonCommand(String server, int port, String username, String password) {
this.server=server;
this.port=port;
this.username=Utils.normalise(username);
this.password=Utils.roast(password);
}
public byte[] getBytes() {
return toString().getBytes();
}
public String toString()
{
String temp="toc_signon login.oscar.aol.com 5159 "+username+" "+password+" english "+AGENTNAME;
return(temp);
}
public void parseString(java.lang.String str) {
}
}

View file

@ -0,0 +1,143 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* Utils.java
*
* Created on 3 May 2002, 17:19
*/
package com.wilko.jaim;
/**
*
* @author paulw
* @version $Revision: 1.4 $
*/
public class Utils {
private static final String roastKey="Tic/Toc";
private static final int roastLen=7;
/** convert a buddy name to normalised format - remove spaces and convert to lower case
* @param input The un-normalised buddy name
* @return the normalised buddy name
*/
public static String normalise(java.lang.String input) {
StringBuffer output=new StringBuffer();
String temp=input.toLowerCase();
for (int i=0;i<input.length();i++)
{
char c=temp.charAt(i);
if ((c>= '0' && c<='9')||(c>='a' && c<='z'))
{
output.append(c);
}
}
return(output.toString());
}
/** Roast a password using the AOL roasting protocol
* @param password The password to be roasted
* @return The roasted password
*/
public static String roast(java.lang.String password) {
char[] hexChars={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
StringBuffer temppw=new StringBuffer();
temppw.append("0x");
for (int i=0;i<password.length();i++)
{
int roastedByte=password.charAt(i)^roastKey.charAt(i%roastLen);
temppw.append(hexChars[(roastedByte>>4)&0x0f]);
temppw.append(hexChars[roastedByte&0x0f]);
}
return(temppw.toString());
}
/** This method performs a simple HTML strip on text. It looks for < characters and then skips input until a matching > is found.
* This may fail if the HTML tag contains an embedded '>'
* @param input The text to have HTML stripped
* @return The text stripped of html
*/
public static String stripHTML(java.lang.String input)
{
StringBuffer output=new StringBuffer();
boolean inHTML=false;
for (int i=0;i<input.length();i++)
{
char c=input.charAt(i);
if (c=='<')
{
inHTML=true;
}
else
{
if (c=='>') {
inHTML=false;
}
else
{
if (!inHTML)
{
output.append(c);
}
}
}
}
return(output.toString());
}
/** Encode a text message so that it is suitable for transmission using toc_send_im
*
* @param input The text to be encoded
* @return The encoded text
*/
public static String encodeText(String input)
{
StringBuffer output=new StringBuffer("\"");
for (int i=0;i<input.length();i++)
{
char c=input.charAt(i);
switch (c)
{
case '\"':
case '(':
case ')':
case '$':
case '\\':
case '{':
case '}':
case '[':
case ']':
output.append('\\');
break;
}
output.append(c);
}
output.append('\"');
return(output.toString());
}
}

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE attributes PUBLIC "-//NetBeans//DTD DefaultAttributes 1.0//EN" "http://www.netbeans.org/dtds/attributes-1_0.dtd">
<attributes version="1.0">
<fileobject name="JaimTest.java">
<attr name="NetBeansAttrArguments" serialvalue="aced0005757200135b4c6a6176612e6c616e672e537472696e673badd256e7e91d7b4702000078700000000274000e68657265666f7264737472656574740005676c656265"/>
</fileobject>
</attributes>

View file

@ -0,0 +1,243 @@
/*
* (C) 2002 Paul Wilkinson wilko@users.sourceforge.net
*
* 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
*
*/
/*
* JaimTest.java
*
* Created on 3 May 2002, 12:26
*/
package com.wilko.jaimtest;
import java.net.*;
import java.io.*;
import com.wilko.jaim.*;
import java.util.*;
/**
* @author paulw
* @version $Revision: 1.13 $
*/
public class JaimTest implements JaimEventListener {
JaimConnection c;
boolean quit = false;
/**
* Creates new JaimMain
*/
public JaimTest() {
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
if (args.length < 2) {
System.out.println("Usage: JaimTest <username> <password>");
} else {
JaimTest tester = new JaimTest();
tester.doIt(args[0], args[1]);
}
}
private void doIt(String username, String password) {
try {
c = new JaimConnection("toc.oscar.aol.com", 9898);
c.setDebug(true); // Send debugging to standard output
c.connect();
c.addEventListener(this);
c.watchBuddy("username"); // Must watch at least one buddy or you will not appear on buddy listings
c.logIn(username, password, 50000);
c.addBlock(""); // Set Deny None
c.setInfo("This buddy is using <a href=\"http://jaimlib.sourceforge.net\">Jaim</a>.");
c.setIdle(60); // Pretend we have been idle for a minute
c.setAway("I am away right now");
try {
Thread.sleep(10000); //Wait for 10 second
} catch (InterruptedException ie) {
}
c.setIdle(0); // Pretend we have been idle for a minute
c.setAway("");
while (!quit) {
try {
Thread.sleep(300000); //Wait for 5 minutes
} catch (InterruptedException ie) {
}
}
System.out.println("Disconnecting");
c.disconnect();
} catch (IOException e) {
e.printStackTrace();
} catch (JaimException je) {
je.printStackTrace();
}
}
/**
* Receive an event and process it according to its content
*
* @param event - The JaimEvent to be processed
*/
public void receiveEvent(JaimEvent event) {
TocResponse tr = event.getTocResponse();
String responseType = tr.getResponseType();
System.out.println("Type: " + responseType);
if (responseType.equalsIgnoreCase(BuddyUpdateTocResponse.RESPONSE_TYPE)) {
receiveBuddyUpdate((BuddyUpdateTocResponse) tr);
} else if (responseType.equalsIgnoreCase(IMTocResponse.RESPONSE_TYPE)) {
receiveIM((IMTocResponse) tr);
} else if (responseType.equalsIgnoreCase(EvilTocResponse.RESPONSE_TYPE)) {
receiveEvil((EvilTocResponse) tr);
} else if (responseType.equalsIgnoreCase(GotoTocResponse.RESPONSE_TYPE)) {
receiveGoto((GotoTocResponse) tr);
} else if (responseType.equalsIgnoreCase(ConfigTocResponse.RESPONSE_TYPE)) {
receiveConfig();
} else if (responseType.equalsIgnoreCase(ErrorTocResponse.RESPONSE_TYPE)) {
receiveError((ErrorTocResponse) tr);
} else if (responseType.equalsIgnoreCase(LoginCompleteTocResponse.RESPONSE_TYPE)) {
System.out.println("Login is complete");
} else if (responseType.equalsIgnoreCase(ConnectionLostTocResponse.RESPONSE_TYPE)) {
System.out.println("Connection lost!");
} else if (responseType.equalsIgnoreCase(ChatInviteTocResponse.RESPONSE_TYPE)) {
recieveChatInvite((ChatInviteTocResponse) tr);
} else {
System.out.println("Unknown TOC Response:" + tr);
}
}
private void receiveError(ErrorTocResponse et) {
System.out.println("Error: " + et.getErrorDescription());
}
private void receiveIM(IMTocResponse im) {
System.out.println(im.getFrom() + "->" + Utils.stripHTML(im.getMsg()));
try {
c.sendIM(im.getFrom(), "Hello " + im.getFrom(), false);
} catch (IOException e) {
}
}
private void receiveBuddyUpdate(BuddyUpdateTocResponse bu) {
System.out.println("Buddy update: " + bu.getBuddy());
if (bu.isOnline()) {
System.out.println("Online");
} else {
System.out.println("Offline");
}
if (bu.isAway()) {
System.out.println("Away");
}
System.out.println("evil: " + bu.getEvil());
System.out.println("Idle: " + bu.getIdleTime());
System.out.println("On since " + bu.getSignonTime().toString());
}
private void receiveEvil(EvilTocResponse er) {
if (er.isAnonymous()) {
System.out.println("We have been warned anonymously!");
} else {
System.out.println("We have been warned by " + er.getEvilBy());
try {
c.sendEvil(er.getEvilBy(), false); // Let's warn them back
c.addBlock(er.getEvilBy()); // And block them
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("New warning level is:" + er.getEvilAmount());
}
private void receiveGoto(GotoTocResponse gr) {
System.out.println("Attempting to access " + gr.getURL());
try {
InputStream is = c.getURL(gr.getURL());
if (is != null) {
InputStreamReader r = new InputStreamReader(is);
int chr = 0;
while (chr != -1) {
chr = r.read();
System.out.print((char) chr);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void recieveChatInvite(ChatInviteTocResponse inviteTocResponse) {
c.joinChat(inviteTocResponse.getRoomName());
}
private void receiveConfig() {
System.out.println("Config is now valid.");
try {
Iterator it = c.getGroups().iterator();
while (it.hasNext()) {
Group g = (Group) it.next();
System.out.println("Group: " + g.getName());
Enumeration e = g.enumerateBuddies();
while (e.hasMoreElements()) {
Buddy b = (Buddy) e.nextElement();
b.setDeny(false);
b.setPermit(false);
c.watchBuddy(b.getName());
if (b.getDeny()) {
c.addBlock(b.getName());
}
if (b.getPermit()) {
c.addPermit(b.getName());
}
}
}
c.saveConfig();
} catch (Exception je) {
je.printStackTrace();
}
}
}