📄 jaimlib.java
字号:
package jaimlib;
import java.util.*;
import java.net.*;
import java.io.*;
/* Copyright, 2001 Jason Dominiczak.
*
* This file is part of JIM - The Java Instant Messenger.
* eMailer 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, or (at your option)
* any later version.
* JIM 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 eMailer; see the file COPYING. If not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*/
public class Jaimlib {
private java.net.Socket aimSocket;
public java.io.PrintWriter outStream;
public int localSequenceNumber = 13402;
public int remoteSequenceNumber;
public java.io.DataInputStream inStream;
public aimplugin.AimPlugin callback;
/**
* Jaimlib constructor comment.
*/
public Jaimlib() {
super();
}
/**
* Insert the method's description here.
* Creation date: (10/29/2001 9:21:56 PM)
* @param server java.lang.String
* @param port int
*/
public void connectServer(String server, int port, String Password, String Username) {
PrintWriter out = null;
//BufferedReader in = null;
BufferedReader in = null;
try {
aimSocket = new Socket(server, port);
outStream = new PrintWriter(new BufferedWriter(new OutputStreamWriter(aimSocket.getOutputStream())), true);
aimSocket.setTcpNoDelay(true);
//inStream = new BufferedReader(new InputStreamReader(aimSocket.getInputStream()));
inStream = new DataInputStream(aimSocket.getInputStream());
startInputThread();
//in = new DataInputStream(aimSocket.getInputStream());
//char line = new char();
//out.println("FLAPON\r\n\r\n");
//while ((line = in.readChar()) != null)
// System.out.println("> " + line.toString());
outStream.write("FLAPON\r\n\r\n");
outStream.flush();
try {
Thread.sleep(500);
} catch (java.lang.InterruptedException e) {
System.err.println(e.toString());
}
char[] header = new char[6];
header[0] = '*'; // byte 0, length 1, magic 42
header[1] = 01; // byte 1, length 1, frame type (defined above SFLAP_FRAME_*
header[2] = 13401 / 256; // byte 2, length 2, sequence number, network byte order
header[3] = (char) 13401 % 256;
header[4] = (char) ((8 + Username.length()) / 256); // byte 4, length 2, length, network byte order
header[5] = (char) ((8 + Username.length()) % 256);
outStream.print(header);
char[] signon = new char[8];
signon[0] = '\0'; // byte 0, length 4, flap version (1)
signon[1] = '\0';
signon[2] = '\0';
signon[3] = '\001';
signon[4] = '\0'; // byte 4, length 2, tlv tag (1)
signon[5] = '\001';
signon[6] = (char) (Username.length() / 256);
// byte 6, length 2, username length, network byte order
signon[7] = (char) (Username.length() % 256);
outStream.print(signon);
outStream.print(Username);
outStream.flush();
try {
Thread.sleep(500);
} catch (java.lang.InterruptedException e) {
System.err.println(e.toString());
}
//doStuff();
//sendPacket("toc_signon login.oscar.aol.com 5190 superhuman06 0x3f0f15432e01 english \"libfiretalk v 1.0\"");
sendPacket("toc_signon login.oscar.aol.com 5190 " + normalize(Username) + " " + hashPassword(Password) + " english \"libfiretalk v 1.0\"");
try {
Thread.sleep(2000);
} catch (java.lang.InterruptedException e) {
System.err.println(e.toString());
}
//sendPacket("toc_add_buddy superhuman06");
//sendPacket("toc_add_buddy dmbman06");
sendPacket("toc_init_done");
} catch (UnknownHostException e) {
System.err.println("Don't know about host: taranis.");
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for" + "the connection to: taranis.");
System.exit(1);
}
/*
out.println("FLAPON\r\n\r\n");
String line;
while ((line = in.readLine()) != null)
System.out.println("> " + line);
*/
}
/**
* Insert the method's description here.
* Creation date: (11/1/2001 3:31:59 PM)
* @return char[]
*/
public char[] createHeader(int len) {
char[] header2 = new char[6];
int len1a = len/256;
int len1b = len%256;
int sequence1a = localSequenceNumber/256;
int sequence1b = localSequenceNumber%256;
header2[0] = '*'; // byte 0, length 1, magic 42
header2[1] = 02; // byte 1, length 1, frame type (defined above SFLAP_FRAME_*
//header2[2] = i / 256;
// byte 2, length 2, sequence number, network byte order
//header2[3] = (char) 13402 % 256;
//header2[4] = len / 256; // byte 4, length 2, length, network byte order
header2[2] = (char) sequence1a;
header2[3] = (char) sequence1b;
header2[4] = (char) len1a;
header2[5] = (char) len1b;
//header2[5] = (char) len % 256;
localSequenceNumber++;
return header2;
}
/**
* Insert the method's description here.
* Creation date: (11/1/2001 6:31:10 PM)
* @param data java.lang.String
*/
public void handlePacket(byte[] buffer) {
if(buffer.equals(null))
{
}
String inString = new String(buffer);
StringTokenizer inToken = new StringTokenizer(inString, ":");
String command = inToken.nextToken();
if (command.equals("IM_IN")) {
String from = normalize(inToken.nextToken());
String auto = inToken.nextToken();
String mesg = inToken.nextToken();
while (inToken.hasMoreTokens()) {
mesg = mesg + ":" + inToken.nextToken();
}
//mesg = ebnet.snLookup(from,2)+"\0"+mesg;
callback.callbackRecievedMessage(from, mesg, 0);
//ebnet.send("MESG",mesg.getBytes());
return;
}
if (command.equals("UPDATE_BUDDY")) {
String name = normalize(inToken.nextToken());
boolean stat = false;
if (inToken.nextToken().equals("T")) {
callback.callbackBuddyOn(name);
} else {
callback.callbackBuddyOff(name);
}
//callback.localJim.addBuddyToTree(name, callback);
//ebnet.updateStat(name,"IM",stat);
return;
}
if (command.equals("CONFIG")) {
String PreSend = "toc_add_buddy ";
while (inToken.hasMoreTokens()) {
String tempStr = inToken.nextToken();
StringTokenizer configToken = new StringTokenizer(tempStr, "\n");
while (configToken.hasMoreTokens()) {
String TempStr2 = configToken.nextToken();
StringTokenizer buddyToken = new StringTokenizer(TempStr2, " ",true);
String TempStr3 = buddyToken.nextToken();
if (TempStr3.equals("b")) {
String snString = new String();
while (buddyToken.hasMoreTokens()) {
snString += new String(buddyToken.nextToken());
}
PreSend += new String(normalize(snString) + " ");
}
}
}
//System.out.println(PreSend);
sendPacket(PreSend);
}
if (command.equals("NICK")) {
}
if (command.equals("ERROR")) {
String error = inToken.nextToken();
if (error.equals("901")) {
callback.callbackError(901);
//ebnet.send("ERRR",(" not currently available").getBytes());
return;
}
if (error.equals("903")) {
callback.callbackError(903);
//ebnet.send("ERRR",("Message dropped, sending too fast").getBytes());
return;
}
if (error.equals("960")) {
//ebnet.send("ERRR",("Sending messages too fast to "+inToken.nextToken()).getBytes());
callback.callbackError(960);
return;
}
if (error.equals("961")) {
//ebnet.send("ERRR",(inToken.nextToken() +" sent you too big a message").getBytes());
callback.callbackError(961);
return;
}
if (error.equals("962")) {
//ebnet.send("ERRR",(inToken.nextToken() +" sent you a message too fast").getBytes());
callback.callbackError(962);
return;
}
if (error.equals("983")) {
//ebnet.send("ERRR",(inToken.nextToken() +" sent you a message too fast").getBytes());
logoff();
callback.callbackError(983);
return;
}
if (error.equals("980")) {
//ebnet.send("ERRR",(inToken.nextToken() +" sent you a message too fast").getBytes());
logoff();
callback.callbackError(980);
return;
}
if (error.equals("Signon err")) {
//ebnet.send("ERRR",("AIM Signon failure: "+inToken.nextToken()).getBytes());
//signoff("5");
callback.callbackError(1);
} else {
callback.callbackError((new Integer(error)).intValue());
}
return;
}
}
/**
* Insert the method's description here.
* Creation date: (10/31/2001 8:14:53 PM)
* @return char[]
* @param Password java.lang.String
*/
public String hashPassword(String Password) {
String roast = "Tic/Toc";
String out = "";
String in = Password;
String out2 = "0x";
for (int i = 0; i < in.length(); i++) {
out = java.lang.Long.toHexString(in.charAt(i) ^ roast.charAt(i % 7));
if (out.length() < 2) {out2 = out2 + "0";}
out2 = out2 + out;
}
return out2;
}
/**
* Insert the method's description here.
* Creation date: (11/2/2001 3:32:07 PM)
* @param data char[]
*/
public boolean isStartOfPacket(char[] data) {
if (data[0] == '*') {
if (data[1] == 01) {
return true;
} else
if (data[1] == 02) {
return true;
} else
if (data[1] == 03) {
return true;
} else
if (data[1] == 04) {
return true;
} else
if (data[1] == 05) {
return true;
} else {
return false;
}
}
return false;
}
/**
* Insert the method's description here.
* Creation date: (11/2/2001 3:32:07 PM)
* @param data char[]
*/
public boolean isStartOfPacket(char char1, char char2) {
if (char1 == '*') {
if (char2 == 01) {
return true;
} else
if (char2 == 02) {
return true;
} else
if (char2 == 03) {
return true;
} else
if (char2 == 04) {
return true;
} else
if (char2 == 05) {
return true;
} else {
return false;
}
}
return false;
}
/**
* Insert the method's description here.
* Creation date: (11/24/2001 10:17:05 PM)
*/
public void logoff() {
try {
outStream.close();
inStream.close();
aimSocket.close();
}
catch (IOException e) {System.out.println(e);}
}
/**
* Insert the method's description here.
* Creation date: (11/2/2001 5:44:36 PM)
* @param username java.lang.String
*/
public String normalize(String in) {
String out = "";
in = in.toLowerCase();
/*
char[] arr = in.toCharArray();
for (int i=0;i<arr.length;i++) {
if (arr[i] != ' ')
out = out + "" + arr[i];
}
*/
StringTokenizer sTok = new StringTokenizer(in, " ", false);
while(sTok.hasMoreTokens())
{
out += sTok.nextToken();
}
return out;
}
/**
* Insert the method's description here.
* Creation date: (11/1/2001 3:31:23 PM)
* @param data java.lang.String
*/
public void sendPacket(String data) {
int len = data.length() + 1;//1 extra needed for null char ending
//char[] dataarray = char[len];
if(len>2042)
{
callback.callbackError(666);
return;
}
CharArrayWriter caw = new CharArrayWriter();
try {
caw.write(createHeader(len));
caw.write(data);
caw.write((char) 00);
outStream.print(caw.toCharArray());
outStream.flush();
} catch (IOException e) {
}
}
/**
* Insert the method's description here.
* Creation date: (11/1/2001 6:04:12 PM)
* @param in java.io.BufferedReader
*/
public void startInputThread() {
Runnable r = new Runnable() {
public void run() {
byte[] data;
while (true) {
try {
int length;
inStream.skip(4);
length = inStream.readShort();
data = new byte[length];
inStream.readFully(data);
handlePacket(data);
} catch (IOException e) {
return;
}
}
}
};
Thread newThread = new Thread(r, "Timer");
newThread.start();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -