mirror of
https://github.com/Mibew/java.git
synced 2025-01-22 17:40:35 +03:00
webim-to-jabber transport application
git-svn-id: https://webim.svn.sourceforge.net/svnroot/webim/trunk@496 c66351dc-e62f-0410-b875-e3a5c0b9693f
This commit is contained in:
parent
ce538f961f
commit
fe9a5a606e
8
src/mibewjava/org.mibew.jabber/.classpath
Normal file
8
src/mibewjava/org.mibew.jabber/.classpath
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||||
|
<classpathentry kind="lib" path="libs/smack.jar"/>
|
||||||
|
<classpathentry kind="lib" path="libs/smackx.jar"/>
|
||||||
|
<classpathentry kind="output" path="bin"/>
|
||||||
|
</classpath>
|
17
src/mibewjava/org.mibew.jabber/.project
Normal file
17
src/mibewjava/org.mibew.jabber/.project
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>org.mibew.jabber</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
BIN
src/mibewjava/org.mibew.jabber/libs/smack.jar
Normal file
BIN
src/mibewjava/org.mibew.jabber/libs/smack.jar
Normal file
Binary file not shown.
BIN
src/mibewjava/org.mibew.jabber/libs/smackx-debug.jar
Normal file
BIN
src/mibewjava/org.mibew.jabber/libs/smackx-debug.jar
Normal file
Binary file not shown.
BIN
src/mibewjava/org.mibew.jabber/libs/smackx-jingle.jar
Normal file
BIN
src/mibewjava/org.mibew.jabber/libs/smackx-jingle.jar
Normal file
Binary file not shown.
BIN
src/mibewjava/org.mibew.jabber/libs/smackx.jar
Normal file
BIN
src/mibewjava/org.mibew.jabber/libs/smackx.jar
Normal file
Binary file not shown.
9
src/mibewjava/org.mibew.jabber/src/mibew-sample.ini
Normal file
9
src/mibewjava/org.mibew.jabber/src/mibew-sample.ini
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#
|
||||||
|
# Configuration file for Mibew-to-jabber gate
|
||||||
|
#
|
||||||
|
|
||||||
|
jabber.host=jabber.org
|
||||||
|
jabber.login=webim_notifier
|
||||||
|
jabber.password=123
|
||||||
|
|
||||||
|
jabber.admin=yourmail@jabber.org
|
@ -0,0 +1,150 @@
|
|||||||
|
package org.mibew.api;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.DataOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import javax.xml.parsers.SAXParser;
|
||||||
|
import javax.xml.parsers.SAXParserFactory;
|
||||||
|
|
||||||
|
import org.mibew.api.handlers.LoginHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author inspirer
|
||||||
|
*/
|
||||||
|
public class MibewConnection {
|
||||||
|
|
||||||
|
private static final int REQUEST_TIMEOUT = 5000;
|
||||||
|
|
||||||
|
private final String fUrl;
|
||||||
|
|
||||||
|
private final Map<String,String> fCookies;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param url Ex: http://yourserver.com/webim/
|
||||||
|
* @param login admin
|
||||||
|
* @param password operators password
|
||||||
|
*/
|
||||||
|
public MibewConnection(String url, String login, String password)
|
||||||
|
throws UnsupportedEncodingException, NoSuchAlgorithmException,
|
||||||
|
MalformedURLException {
|
||||||
|
this.fUrl = url;
|
||||||
|
this.fCookies = new HashMap<String,String>();
|
||||||
|
this.fCookies.put("webim_lite", URLEncoder.encode(login + "," + Utils.md5(Utils.md5(password)), "UTF-8"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Connects to the server and tries to login, returns true if successful.
|
||||||
|
*/
|
||||||
|
public boolean connect() throws ParserConfigurationException {
|
||||||
|
try {
|
||||||
|
MibewResponse response = request("operator/autologin.php", "");
|
||||||
|
SAXParser sp = SAXParserFactory.newInstance().newSAXParser();
|
||||||
|
LoginHandler handler = new LoginHandler();
|
||||||
|
sp.parse(new ByteArrayInputStream(response.getResponse()), handler);
|
||||||
|
String status = handler.getStatus();
|
||||||
|
return status.equals("OK");
|
||||||
|
} catch(Exception e) {
|
||||||
|
handleError(e.getMessage(), e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void disconnect() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request server.
|
||||||
|
* @param suburl ex: operator/update.php
|
||||||
|
* @param urlParameters post content
|
||||||
|
*/
|
||||||
|
public final synchronized MibewResponse request(String suburl, String urlParameters) throws IOException {
|
||||||
|
HttpURLConnection connection = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
connection = (HttpURLConnection) new URL(fUrl+suburl).openConnection();
|
||||||
|
connection.setConnectTimeout(REQUEST_TIMEOUT);
|
||||||
|
connection.setReadTimeout(REQUEST_TIMEOUT);
|
||||||
|
|
||||||
|
connection.setRequestMethod("POST");
|
||||||
|
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
|
||||||
|
connection.setRequestProperty("Content-Length", Integer.toString(urlParameters.getBytes().length));
|
||||||
|
if(fCookies.size() > 0) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for(Entry<String,String> cookie : fCookies.entrySet()) {
|
||||||
|
if(sb.length() > 0) {
|
||||||
|
sb.append("; ");
|
||||||
|
}
|
||||||
|
sb.append(cookie.getKey()+"="+cookie.getValue());
|
||||||
|
}
|
||||||
|
connection.addRequestProperty("Cookie", sb.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
connection.setUseCaches(false);
|
||||||
|
connection.setDoInput(true);
|
||||||
|
connection.setDoOutput(true);
|
||||||
|
|
||||||
|
// create request
|
||||||
|
DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
|
||||||
|
wr.writeBytes(urlParameters);
|
||||||
|
wr.flush();
|
||||||
|
wr.close();
|
||||||
|
|
||||||
|
// read response
|
||||||
|
InputStream is = connection.getInputStream();
|
||||||
|
int len = connection.getContentLength();
|
||||||
|
ByteArrayOutputStream buffer = new ByteArrayOutputStream(len < 256 ? 256 : len);
|
||||||
|
byte b[] = new byte[1024];
|
||||||
|
int size = 0;
|
||||||
|
while((size=is.read(b)) >= 0) {
|
||||||
|
buffer.write(b, 0, size);
|
||||||
|
}
|
||||||
|
is.close();
|
||||||
|
|
||||||
|
// load cookies
|
||||||
|
List<String> cookies = connection.getHeaderFields().get("Set-Cookie");
|
||||||
|
if(cookies != null) {
|
||||||
|
for(String cookie : cookies) {
|
||||||
|
Matcher matcher = COOKIESET.matcher(cookie);
|
||||||
|
if(matcher.find()) {
|
||||||
|
String name = matcher.group(1);
|
||||||
|
String value = matcher.group(2);
|
||||||
|
fCookies.put(name, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new MibewResponse(connection.getResponseCode(), buffer.toByteArray());
|
||||||
|
} catch (Exception e) {
|
||||||
|
if(e instanceof IOException) {
|
||||||
|
throw (IOException)e;
|
||||||
|
}
|
||||||
|
throw new IOException("cannot connect: " + e.getMessage());
|
||||||
|
} finally {
|
||||||
|
if (connection != null) {
|
||||||
|
connection.disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void handleError(String message, Exception ex) {
|
||||||
|
System.err.println(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Pattern COOKIESET = Pattern.compile("\\A(\\w+)=([^;]+);");
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
package org.mibew.api;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.Reader;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author inspirer
|
||||||
|
*/
|
||||||
|
public class MibewResponse {
|
||||||
|
|
||||||
|
public int code;
|
||||||
|
public byte[] response;
|
||||||
|
|
||||||
|
public MibewResponse(int code, byte[] response) {
|
||||||
|
this.code = code;
|
||||||
|
this.response = response;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCode() {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getResponse() {
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getResponseText() {
|
||||||
|
try {
|
||||||
|
Reader r = new InputStreamReader(new ByteArrayInputStream(response), "UTF-8");
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
char[] c = new char[1024];
|
||||||
|
int size = 0;
|
||||||
|
while((size = r.read(c)) != -1) {
|
||||||
|
sb.append(c, 0, size);
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
} catch(IOException ex) {
|
||||||
|
return "<exception is thrown: "+ex.toString()+">";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return
|
||||||
|
"Response code: " + code + "\n" +
|
||||||
|
"Text: " + getResponseText();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package org.mibew.api;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author inspirer
|
||||||
|
*/
|
||||||
|
public class MibewThread {
|
||||||
|
|
||||||
|
public final long fId;
|
||||||
|
public String fState;
|
||||||
|
public String fClientName = "";
|
||||||
|
public String fAgent = "";
|
||||||
|
public String fAddress = "";
|
||||||
|
public String fFirstMessage = "";
|
||||||
|
public boolean fCanOpen = false;
|
||||||
|
public boolean fCanView = false;
|
||||||
|
public boolean fCanBan = false;
|
||||||
|
public String fStateText;
|
||||||
|
|
||||||
|
public MibewThread(long id, String state) {
|
||||||
|
fId = id;
|
||||||
|
fState = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateFrom(MibewThread updated) {
|
||||||
|
if(fId != updated.fId) {
|
||||||
|
throw new IllegalArgumentException("different threads");
|
||||||
|
}
|
||||||
|
fState = updated.fState;
|
||||||
|
fClientName = updated.fClientName;
|
||||||
|
fAgent = updated.fAgent;
|
||||||
|
fAddress = updated.fAddress;
|
||||||
|
fFirstMessage = updated.fFirstMessage;
|
||||||
|
fCanOpen = updated.fCanOpen;
|
||||||
|
fCanView = updated.fCanView;
|
||||||
|
fCanBan = updated.fCanBan;
|
||||||
|
fStateText = updated.fStateText;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,85 @@
|
|||||||
|
package org.mibew.api;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.xml.parsers.SAXParser;
|
||||||
|
import javax.xml.parsers.SAXParserFactory;
|
||||||
|
|
||||||
|
import org.mibew.api.handlers.UpdateHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author inspirer
|
||||||
|
*/
|
||||||
|
public class MibewTracker {
|
||||||
|
|
||||||
|
private final MibewConnection fConnection;
|
||||||
|
private final MibewTrackerListener fListener;
|
||||||
|
private long fSince = 0;
|
||||||
|
private long fLastUpdate = 0;
|
||||||
|
|
||||||
|
private final Map<Long,MibewThread> fThreads;
|
||||||
|
|
||||||
|
public MibewTracker(MibewConnection conn, MibewTrackerListener listener) {
|
||||||
|
this.fConnection = conn;
|
||||||
|
this.fListener = listener;
|
||||||
|
this.fThreads = new HashMap<Long, MibewThread>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void track() throws InterruptedException {
|
||||||
|
for(int i = 0; i < 5; i++) {
|
||||||
|
try {
|
||||||
|
MibewResponse response = fConnection.request("operator/update.php", "since="+fSince);
|
||||||
|
SAXParser sp = SAXParserFactory.newInstance().newSAXParser();
|
||||||
|
UpdateHandler handler = new UpdateHandler();
|
||||||
|
sp.parse(new ByteArrayInputStream(response.getResponse()), handler);
|
||||||
|
handleResponse(response, handler);
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.err.println("update exception: " + e.getMessage());
|
||||||
|
}
|
||||||
|
Thread.sleep(1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleResponse(MibewResponse response, UpdateHandler handler) {
|
||||||
|
if(handler.getResponse() == UpdateHandler.UPD_ERROR) {
|
||||||
|
System.out.println("Update error: " + handler.getMessage());
|
||||||
|
} else if(handler.getResponse() == UpdateHandler.UPD_THREADS) {
|
||||||
|
System.out.println("Updated.... " + handler.getRevision());
|
||||||
|
fSince = handler.getRevision();
|
||||||
|
fLastUpdate = handler.getTime();
|
||||||
|
List<MibewThread> threads = handler.getThreads();
|
||||||
|
if(threads != null && threads.size() > 0) {
|
||||||
|
processUpdate(threads);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
System.out.println("Update error");
|
||||||
|
System.out.println(response.getResponseText());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processUpdate(List<MibewThread> updated) {
|
||||||
|
for(MibewThread mt : updated) {
|
||||||
|
MibewThread existing = fThreads.get(mt.fId);
|
||||||
|
boolean isClosed = mt.fState.equals("closed");
|
||||||
|
if(existing == null) {
|
||||||
|
if(!isClosed) {
|
||||||
|
fThreads.put(mt.fId, mt);
|
||||||
|
fListener.threadCreated(mt);
|
||||||
|
}
|
||||||
|
} else if(isClosed) {
|
||||||
|
fThreads.remove(mt.fId);
|
||||||
|
fListener.threadClosed(existing);
|
||||||
|
} else {
|
||||||
|
existing.updateFrom(mt);
|
||||||
|
fListener.threadChanged(existing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getLastUpdate() {
|
||||||
|
return fLastUpdate;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
package org.mibew.api;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author inspirer
|
||||||
|
*/
|
||||||
|
public abstract class MibewTrackerListener {
|
||||||
|
|
||||||
|
public void threadCreated(MibewThread thread) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void threadChanged(MibewThread thread) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void threadClosed(MibewThread thread) {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
31
src/mibewjava/org.mibew.jabber/src/org/mibew/api/Utils.java
Normal file
31
src/mibewjava/org.mibew.jabber/src/org/mibew/api/Utils.java
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package org.mibew.api;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author inspirer
|
||||||
|
*/
|
||||||
|
public class Utils {
|
||||||
|
|
||||||
|
private static final String HEX_DIGITS = "0123456789abcdef";
|
||||||
|
|
||||||
|
public static String md5(String string) throws NoSuchAlgorithmException, UnsupportedEncodingException {
|
||||||
|
return md5(string.getBytes("utf-8"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String md5(byte[] string) throws NoSuchAlgorithmException {
|
||||||
|
MessageDigest md = MessageDigest.getInstance( "MD5" );
|
||||||
|
md.update(string);
|
||||||
|
byte[] digest = md.digest();
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for ( byte b : digest ) {
|
||||||
|
sb.append(HEX_DIGITS.charAt((b&0xff)>>4));
|
||||||
|
sb.append(HEX_DIGITS.charAt(b&0xf));
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
package org.mibew.api.handlers;
|
||||||
|
|
||||||
|
import java.util.Stack;
|
||||||
|
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
import org.xml.sax.helpers.DefaultHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author inspirer
|
||||||
|
*/
|
||||||
|
public class LoginHandler extends DefaultHandler {
|
||||||
|
|
||||||
|
private Stack<String> fPath = new Stack<String>();
|
||||||
|
private String status = "";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startElement(String uri, String localName, String name,
|
||||||
|
Attributes attributes) throws SAXException {
|
||||||
|
fPath.push(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endElement(String uri, String localName, String name)
|
||||||
|
throws SAXException {
|
||||||
|
fPath.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void characters(char[] ch, int start, int length) throws SAXException {
|
||||||
|
String current = fPath.peek();
|
||||||
|
if(fPath.size() != 2 || !current.equals("status") || !fPath.get(0).equals("login")) {
|
||||||
|
throw new SAXException("unexpected characters");
|
||||||
|
}
|
||||||
|
status += new String(ch,start,length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,137 @@
|
|||||||
|
package org.mibew.api.handlers;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Stack;
|
||||||
|
|
||||||
|
import org.mibew.api.MibewThread;
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
import org.xml.sax.helpers.DefaultHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author inspirer
|
||||||
|
*/
|
||||||
|
public class UpdateHandler extends DefaultHandler {
|
||||||
|
|
||||||
|
public static final int UPD_ERROR = 1;
|
||||||
|
public static final int UPD_THREADS = 2;
|
||||||
|
|
||||||
|
private int fResponse = 0;
|
||||||
|
private String fMessage = "";
|
||||||
|
private long fRevision;
|
||||||
|
private long fTime;
|
||||||
|
private List<MibewThread> fUpdated;
|
||||||
|
|
||||||
|
private Stack<String> fPath = new Stack<String>();
|
||||||
|
private MibewThread fCurrentThread;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startElement(String uri, String localName, String name,
|
||||||
|
Attributes attributes) throws SAXException {
|
||||||
|
try {
|
||||||
|
if (fPath.size() == 0) {
|
||||||
|
if (name.equals("error")) {
|
||||||
|
fResponse = UPD_ERROR;
|
||||||
|
} else if (name.equals("threads")) {
|
||||||
|
fResponse = UPD_THREADS;
|
||||||
|
fTime = Long.parseLong(attributes.getValue("time"));
|
||||||
|
fRevision = Long.parseLong(attributes.getValue("revision"));
|
||||||
|
} else {
|
||||||
|
throw new SAXException("unknown root element: " + name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (fResponse == UPD_THREADS && fPath.size() == 1
|
||||||
|
&& name.equals("thread")) {
|
||||||
|
long id = Long.parseLong(attributes.getValue("id"));
|
||||||
|
String stateid = attributes.getValue("stateid");
|
||||||
|
fCurrentThread = new MibewThread(id, stateid);
|
||||||
|
|
||||||
|
if(!stateid.equals("closed")) {
|
||||||
|
fCurrentThread.fStateText = attributes.getValue("state");
|
||||||
|
fCurrentThread.fCanOpen = booleanAttribute(attributes.getValue("canopen"));
|
||||||
|
fCurrentThread.fCanView = booleanAttribute(attributes.getValue("canview"));
|
||||||
|
fCurrentThread.fCanBan = booleanAttribute(attributes.getValue("canban"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException ex) {
|
||||||
|
throw new SAXException(ex.getMessage());
|
||||||
|
}
|
||||||
|
fPath.push(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean booleanAttribute(String value) {
|
||||||
|
if(value != null && value.equals("true")) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endElement(String uri, String localName, String name)
|
||||||
|
throws SAXException {
|
||||||
|
fPath.pop();
|
||||||
|
if (fResponse == UPD_THREADS && fPath.size() == 1
|
||||||
|
&& name.equals("thread")) {
|
||||||
|
if(fUpdated == null) {
|
||||||
|
fUpdated = new ArrayList<MibewThread>();
|
||||||
|
}
|
||||||
|
fUpdated.add(fCurrentThread);
|
||||||
|
fCurrentThread = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void characters(char[] ch, int start, int length)
|
||||||
|
throws SAXException {
|
||||||
|
if (fResponse == UPD_ERROR) {
|
||||||
|
String current = fPath.peek();
|
||||||
|
if (fPath.size() != 2 || !current.equals("descr")) {
|
||||||
|
throw new SAXException("unexpected characters");
|
||||||
|
}
|
||||||
|
fMessage += new String(ch, start, length);
|
||||||
|
} else if (fResponse == UPD_THREADS) {
|
||||||
|
if(fCurrentThread == null || fPath.size() != 3) {
|
||||||
|
throw new SAXException("unknown characters");
|
||||||
|
}
|
||||||
|
|
||||||
|
String subvar = fPath.peek();
|
||||||
|
String value = new String(ch, start, length);
|
||||||
|
if("name".equals(subvar)) {
|
||||||
|
fCurrentThread.fClientName += value;
|
||||||
|
} else if("addr".equals(subvar)) {
|
||||||
|
fCurrentThread.fAddress += value;
|
||||||
|
} else if("message".equals(subvar)) {
|
||||||
|
fCurrentThread.fFirstMessage += value;
|
||||||
|
} else if("agent".equals(subvar)) {
|
||||||
|
fCurrentThread.fAgent += value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
|
||||||
|
} else {
|
||||||
|
throw new SAXException("unexpected characters: no root");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getResponse() {
|
||||||
|
return fResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMessage() {
|
||||||
|
return fMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getTime() {
|
||||||
|
return fTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getRevision() {
|
||||||
|
return fRevision;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<MibewThread> getThreads() {
|
||||||
|
return fUpdated;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,63 @@
|
|||||||
|
package org.mibew.jabber;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.Chat;
|
||||||
|
import org.jivesoftware.smack.MessageListener;
|
||||||
|
import org.jivesoftware.smack.XMPPConnection;
|
||||||
|
import org.jivesoftware.smack.XMPPException;
|
||||||
|
import org.jivesoftware.smack.packet.Message;
|
||||||
|
import org.mibew.api.MibewConnection;
|
||||||
|
import org.mibew.api.MibewThread;
|
||||||
|
import org.mibew.api.MibewTracker;
|
||||||
|
import org.mibew.api.MibewTrackerListener;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author inspirer
|
||||||
|
*/
|
||||||
|
public class Application {
|
||||||
|
|
||||||
|
public static void main(String[] args) throws NoSuchAlgorithmException, IOException, XMPPException, InterruptedException, ParserConfigurationException, SAXException {
|
||||||
|
System.out.println("Mibew Jabber transport application");
|
||||||
|
|
||||||
|
Parameters p = new Parameters(args);
|
||||||
|
if(!p.load()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
XMPPConnection connection = new XMPPConnection(p.fJabberServer);
|
||||||
|
connection.connect();
|
||||||
|
connection.login(p.fJabberLogin, p.fJabberPassword);
|
||||||
|
final Chat chat = connection.getChatManager().createChat(p.fJabberAdmin, new MessageListener() {
|
||||||
|
|
||||||
|
public void processMessage(Chat chat, Message message) {
|
||||||
|
System.out.println("Received message: " + message.getThread() + " " + message.getBody());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
MibewConnection conn = new MibewConnection("http://localhost:8080/webim/", "admin", "");
|
||||||
|
if(!conn.connect()) {
|
||||||
|
System.err.println("Wrong server, login or password.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
MibewTracker mt = new MibewTracker(conn, new MibewTrackerListener(){
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void threadCreated(MibewThread thread) {
|
||||||
|
try {
|
||||||
|
chat.sendMessage(thread.fId + ": " + thread.fAddress + " " + thread.fClientName);
|
||||||
|
} catch (XMPPException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
mt.track();
|
||||||
|
|
||||||
|
connection.disconnect();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
package org.mibew.jabber;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author inspirer
|
||||||
|
*/
|
||||||
|
public class Parameters {
|
||||||
|
|
||||||
|
private final String[] fArguments;
|
||||||
|
|
||||||
|
public String fJabberServer;
|
||||||
|
public String fJabberLogin;
|
||||||
|
public String fJabberPassword;
|
||||||
|
|
||||||
|
public String fJabberAdmin;
|
||||||
|
|
||||||
|
public Parameters(String[] args) {
|
||||||
|
this.fArguments = args;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getProperty(Properties p, String name) throws IOException {
|
||||||
|
String result = p.getProperty(name);
|
||||||
|
if(result == null || result.trim().length() == 0) {
|
||||||
|
throw new IOException("No '"+name+"' property");
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean load() {
|
||||||
|
try {
|
||||||
|
InputStream is = getClass().getClassLoader().getResourceAsStream("mibew.ini");
|
||||||
|
if(is != null) {
|
||||||
|
Properties p = new Properties();
|
||||||
|
p.load(is);
|
||||||
|
|
||||||
|
fJabberServer = getProperty(p, "jabber.host");
|
||||||
|
fJabberLogin = getProperty(p, "jabber.login");
|
||||||
|
fJabberPassword = getProperty(p, "jabber.password");
|
||||||
|
fJabberAdmin = getProperty(p, "jabber.admin");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.err.println(e.getMessage());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
System.err.println("Cannot find mibew.ini");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user