mirror of
https://github.com/vanitasvitae/Smack.git
synced 2024-11-22 20:12:07 +01:00
Support for reading properties.
git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@1788 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
parent
443e8e9a7a
commit
087d031b3d
1 changed files with 88 additions and 10 deletions
|
@ -54,9 +54,13 @@ package org.jivesoftware.smack;
|
||||||
|
|
||||||
import org.xmlpull.v1.*;
|
import org.xmlpull.v1.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
|
||||||
import org.jivesoftware.smack.packet.*;
|
import org.jivesoftware.smack.packet.*;
|
||||||
import org.jivesoftware.smack.packet.Error;
|
import org.jivesoftware.smack.packet.Error;
|
||||||
import org.jivesoftware.smack.filter.PacketFilter;
|
import org.jivesoftware.smack.filter.PacketFilter;
|
||||||
|
import org.jivesoftware.smack.util.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Listens for XML traffic from the XMPP server, and parses it into packet objects.
|
* Listens for XML traffic from the XMPP server, and parses it into packet objects.
|
||||||
|
@ -67,6 +71,9 @@ import org.jivesoftware.smack.filter.PacketFilter;
|
||||||
*/
|
*/
|
||||||
public class PacketReader {
|
public class PacketReader {
|
||||||
|
|
||||||
|
private static final String PROPERTIES_NAMESPACE =
|
||||||
|
"http://www.jivesoftware.com/xmlns/xmpp/properties";
|
||||||
|
|
||||||
private Thread readerThread;
|
private Thread readerThread;
|
||||||
private Thread listenerThread;
|
private Thread listenerThread;
|
||||||
|
|
||||||
|
@ -199,9 +206,6 @@ public class PacketReader {
|
||||||
else if (parser.getName().equals("stream")) {
|
else if (parser.getName().equals("stream")) {
|
||||||
// Ensure the correct jabber:client namespace is being used.
|
// Ensure the correct jabber:client namespace is being used.
|
||||||
if ("jabber:client".equals(parser.getNamespace(null))) {
|
if ("jabber:client".equals(parser.getNamespace(null))) {
|
||||||
// Check to see if the server supports SASL. We don't actually
|
|
||||||
// do anything with this information at the moment.
|
|
||||||
boolean supportsSASL = parser.getNamespace("sasl") != null;
|
|
||||||
// Get the connection id.
|
// Get the connection id.
|
||||||
for (int i=0; i<parser.getAttributeCount(); i++) {
|
for (int i=0; i<parser.getAttributeCount(); i++) {
|
||||||
if (parser.getAttributeName(i).equals("id")) {
|
if (parser.getAttributeName(i).equals("id")) {
|
||||||
|
@ -272,6 +276,7 @@ public class PacketReader {
|
||||||
String from = parser.getAttributeValue("", "from");
|
String from = parser.getAttributeValue("", "from");
|
||||||
IQ.Type type = IQ.Type.fromString(parser.getAttributeValue("", "type"));
|
IQ.Type type = IQ.Type.fromString(parser.getAttributeValue("", "type"));
|
||||||
Error error = null;
|
Error error = null;
|
||||||
|
Map properties = null;
|
||||||
|
|
||||||
boolean done = false;
|
boolean done = false;
|
||||||
while (!done) {
|
while (!done) {
|
||||||
|
@ -283,9 +288,14 @@ public class PacketReader {
|
||||||
iqPacket = parseAuthentication(parser);
|
iqPacket = parseAuthentication(parser);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (parser.getName().equals("error")) {
|
else if (parser.getName().equals("error")) {
|
||||||
error = parseError(parser);
|
error = parseError(parser);
|
||||||
}
|
}
|
||||||
|
else if (parser.getName().equals("x") &&
|
||||||
|
parser.getNamespace().equals(PROPERTIES_NAMESPACE))
|
||||||
|
{
|
||||||
|
properties = parseProperties(parser);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (eventType == parser.END_TAG) {
|
else if (eventType == parser.END_TAG) {
|
||||||
if (parser.getName().equals("iq")) {
|
if (parser.getName().equals("iq")) {
|
||||||
|
@ -302,6 +312,13 @@ public class PacketReader {
|
||||||
iqPacket.setFrom(from);
|
iqPacket.setFrom(from);
|
||||||
iqPacket.setType(type);
|
iqPacket.setType(type);
|
||||||
iqPacket.setError(error);
|
iqPacket.setError(error);
|
||||||
|
// Set packet properties.
|
||||||
|
if (properties != null) {
|
||||||
|
for (Iterator i=properties.keySet().iterator(); i.hasNext(); ) {
|
||||||
|
String name = (String)i.next();
|
||||||
|
iqPacket.setProperty(name, properties.get(name));
|
||||||
|
}
|
||||||
|
}
|
||||||
// Return the packet.
|
// Return the packet.
|
||||||
return iqPacket;
|
return iqPacket;
|
||||||
}
|
}
|
||||||
|
@ -371,6 +388,7 @@ public class PacketReader {
|
||||||
String subject = null;
|
String subject = null;
|
||||||
String body = null;
|
String body = null;
|
||||||
String thread = null;
|
String thread = null;
|
||||||
|
Map properties = null;
|
||||||
while (!done) {
|
while (!done) {
|
||||||
int eventType = parser.next();
|
int eventType = parser.next();
|
||||||
if (eventType == parser.START_TAG) {
|
if (eventType == parser.START_TAG) {
|
||||||
|
@ -389,6 +407,11 @@ public class PacketReader {
|
||||||
thread = parser.nextText();
|
thread = parser.nextText();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (parser.getName().equals("x") &&
|
||||||
|
parser.getNamespace().equals(PROPERTIES_NAMESPACE))
|
||||||
|
{
|
||||||
|
properties = parseProperties(parser);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (eventType == parser.END_TAG) {
|
else if (eventType == parser.END_TAG) {
|
||||||
if (parser.getName().equals("message")) {
|
if (parser.getName().equals("message")) {
|
||||||
|
@ -399,6 +422,13 @@ public class PacketReader {
|
||||||
message.setSubject(subject);
|
message.setSubject(subject);
|
||||||
message.setBody(body);
|
message.setBody(body);
|
||||||
message.setThread(thread);
|
message.setThread(thread);
|
||||||
|
// Set packet properties.
|
||||||
|
if (properties != null) {
|
||||||
|
for (Iterator i=properties.keySet().iterator(); i.hasNext(); ) {
|
||||||
|
String name = (String)i.next();
|
||||||
|
message.setProperty(name, properties.get(name));
|
||||||
|
}
|
||||||
|
}
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -442,6 +472,16 @@ public class PacketReader {
|
||||||
else if (parser.getName().equals("show")) {
|
else if (parser.getName().equals("show")) {
|
||||||
presence.setMode(Presence.Mode.fromString(parser.nextText()));
|
presence.setMode(Presence.Mode.fromString(parser.nextText()));
|
||||||
}
|
}
|
||||||
|
else if (parser.getName().equals("x") &&
|
||||||
|
parser.getNamespace().equals(PROPERTIES_NAMESPACE))
|
||||||
|
{
|
||||||
|
Map properties = parseProperties(parser);
|
||||||
|
// Set packet properties.
|
||||||
|
for (Iterator i=properties.keySet().iterator(); i.hasNext(); ) {
|
||||||
|
String name = (String)i.next();
|
||||||
|
presence.setProperty(name, properties.get(name));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (eventType == parser.END_TAG) {
|
else if (eventType == parser.END_TAG) {
|
||||||
if (parser.getName().equals("presence")) {
|
if (parser.getName().equals("presence")) {
|
||||||
|
@ -460,18 +500,56 @@ public class PacketReader {
|
||||||
* of the same class.
|
* of the same class.
|
||||||
*
|
*
|
||||||
* @param parser the XML parser, positioned at the start of a properties sub-packet.
|
* @param parser the XML parser, positioned at the start of a properties sub-packet.
|
||||||
* @param packet the packet being parsed.
|
* @return a map of the properties.
|
||||||
* @throws Exception if an error occurs while parsing the properties.
|
* @throws Exception if an error occurs while parsing the properties.
|
||||||
*/
|
*/
|
||||||
private static void parseProperties(XmlPullParser parser, Packet packet) throws Exception {
|
private static Map parseProperties(XmlPullParser parser) throws Exception {
|
||||||
boolean done = false;
|
Map properties = new HashMap();
|
||||||
while (!done) {
|
while (true) {
|
||||||
int eventType = parser.next();
|
int eventType = parser.next();
|
||||||
|
System.out.println("Start: " + parser.getName());
|
||||||
if (eventType == parser.START_TAG) {
|
if (eventType == parser.START_TAG) {
|
||||||
|
String name = parser.nextText();
|
||||||
|
parser.next();
|
||||||
|
String type = parser.getAttributeValue("", "type");
|
||||||
|
String valueText = parser.nextText();
|
||||||
|
Object value = null;
|
||||||
|
if ("integer".equals(type)) {
|
||||||
|
value = new Integer(valueText);
|
||||||
|
}
|
||||||
|
else if ("long".equals(type)) {
|
||||||
|
value = new Long(valueText);
|
||||||
|
}
|
||||||
|
else if ("float".equals(type)) {
|
||||||
|
value = new Float(valueText);
|
||||||
|
}
|
||||||
|
else if ("double".equals(type)) {
|
||||||
|
value = new Double(valueText);
|
||||||
|
}
|
||||||
|
else if ("boolean".equals(type)) {
|
||||||
|
value = new Boolean(valueText);
|
||||||
|
}
|
||||||
|
else if ("java-object".equals(type)) {
|
||||||
|
try {
|
||||||
|
byte [] bytes = StringUtils.decodeBase64(valueText).getBytes("ISO-8859-1");
|
||||||
|
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes));
|
||||||
|
value = in.readObject();
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (name != null && value != null) {
|
||||||
|
properties.put(name, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (eventType == parser.END_TAG) {
|
||||||
|
if (parser.getName().equals("x")) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return properties;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue