mirror of
https://github.com/vanitasvitae/Smack.git
synced 2024-11-25 21:42:07 +01:00
Fixed packet extension parsing. Optimized IQ parsing.
git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@1929 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
parent
1b0a43b8a5
commit
1fce8b422b
1 changed files with 66 additions and 24 deletions
|
@ -360,7 +360,8 @@ class PacketReader {
|
||||||
iqPacket = ((IQProvider)provider).parseIQ(parser);
|
iqPacket = ((IQProvider)provider).parseIQ(parser);
|
||||||
}
|
}
|
||||||
else if (provider instanceof Class) {
|
else if (provider instanceof Class) {
|
||||||
iqPacket = parseIQWithIntrospection((Class)provider, parser);
|
iqPacket = (IQ)parseWithIntrospection(elementName,
|
||||||
|
(Class)provider, parser);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -492,30 +493,32 @@ class PacketReader {
|
||||||
return registration;
|
return registration;
|
||||||
}
|
}
|
||||||
|
|
||||||
private IQ parseIQWithIntrospection(Class iqClass, XmlPullParser parser) throws Exception {
|
private Object parseWithIntrospection(String elementName,
|
||||||
|
Class objectClass, XmlPullParser parser) throws Exception
|
||||||
|
{
|
||||||
boolean done = false;
|
boolean done = false;
|
||||||
IQ iq = (IQ)iqClass.newInstance();
|
Object object = objectClass.newInstance();
|
||||||
while (!done) {
|
while (!done) {
|
||||||
int eventType = parser.next();
|
int eventType = parser.next();
|
||||||
if (eventType == XmlPullParser.START_TAG) {
|
if (eventType == XmlPullParser.START_TAG) {
|
||||||
String name = parser.getName();
|
String name = parser.getName();
|
||||||
String stringValue = parser.nextText();
|
String stringValue = parser.nextText();
|
||||||
PropertyDescriptor descriptor = new PropertyDescriptor(name, iqClass);
|
PropertyDescriptor descriptor = new PropertyDescriptor(name, objectClass);
|
||||||
// Load the class type of the property.
|
// Load the class type of the property.
|
||||||
Class propertyType = descriptor.getPropertyType();
|
Class propertyType = descriptor.getPropertyType();
|
||||||
// Get the value of the property by converting it from a
|
// Get the value of the property by converting it from a
|
||||||
// String to the correct object type.
|
// String to the correct object type.
|
||||||
Object value = decode(propertyType, stringValue);
|
Object value = decode(propertyType, stringValue);
|
||||||
// Set the value of the bean.
|
// Set the value of the bean.
|
||||||
descriptor.getWriteMethod().invoke(iq, new Object[] { value });
|
descriptor.getWriteMethod().invoke(object, new Object[] { value });
|
||||||
}
|
}
|
||||||
else if (eventType == XmlPullParser.END_TAG) {
|
else if (eventType == XmlPullParser.END_TAG) {
|
||||||
if (parser.getName().equals("query")) {
|
if (parser.getName().equals(elementName)) {
|
||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return iq;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -623,18 +626,9 @@ class PacketReader {
|
||||||
{
|
{
|
||||||
properties = parseProperties(parser);
|
properties = parseProperties(parser);
|
||||||
}
|
}
|
||||||
// Otherwise, see if there is a registered provider for
|
// Otherwise, it must be a packet extension.
|
||||||
// this element name and namespace.
|
|
||||||
else {
|
else {
|
||||||
Object provider = ProviderManager.getExtensionProvider(elementName, namespace);
|
message.addExtension(parsePacketExtension(elementName, namespace, parser));
|
||||||
if (provider != null) {
|
|
||||||
if (provider instanceof PacketExtensionProvider) {
|
|
||||||
iqPacket = ((IQProvider)provider).parseIQ(parser);
|
|
||||||
}
|
|
||||||
else if (provider instanceof Class) {
|
|
||||||
iqPacket = parseIQWithIntrospection((Class)provider, parser);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (eventType == XmlPullParser.END_TAG) {
|
else if (eventType == XmlPullParser.END_TAG) {
|
||||||
|
@ -676,24 +670,26 @@ class PacketReader {
|
||||||
while (!done) {
|
while (!done) {
|
||||||
int eventType = parser.next();
|
int eventType = parser.next();
|
||||||
if (eventType == XmlPullParser.START_TAG) {
|
if (eventType == XmlPullParser.START_TAG) {
|
||||||
if (parser.getName().equals("status")) {
|
String elementName = parser.getName();
|
||||||
|
String namespace = parser.getNamespace();
|
||||||
|
if (elementName.equals("status")) {
|
||||||
presence.setStatus(parser.nextText());
|
presence.setStatus(parser.nextText());
|
||||||
}
|
}
|
||||||
else if (parser.getName().equals("priority")) {
|
else if (elementName.equals("priority")) {
|
||||||
try {
|
try {
|
||||||
int priority = Integer.parseInt(parser.nextText());
|
int priority = Integer.parseInt(parser.nextText());
|
||||||
presence.setPriority(priority);
|
presence.setPriority(priority);
|
||||||
}
|
}
|
||||||
catch (NumberFormatException nfe) { }
|
catch (NumberFormatException nfe) { }
|
||||||
}
|
}
|
||||||
else if (parser.getName().equals("show")) {
|
else if (elementName.equals("show")) {
|
||||||
presence.setMode(Presence.Mode.fromString(parser.nextText()));
|
presence.setMode(Presence.Mode.fromString(parser.nextText()));
|
||||||
}
|
}
|
||||||
else if (parser.getName().equals("error")) {
|
else if (elementName.equals("error")) {
|
||||||
presence.setError(parseError(parser));
|
presence.setError(parseError(parser));
|
||||||
}
|
}
|
||||||
else if (parser.getName().equals("properties") &&
|
else if (elementName.equals("properties") &&
|
||||||
parser.getNamespace().equals(PROPERTIES_NAMESPACE))
|
namespace.equals(PROPERTIES_NAMESPACE))
|
||||||
{
|
{
|
||||||
Map properties = parseProperties(parser);
|
Map properties = parseProperties(parser);
|
||||||
// Set packet properties.
|
// Set packet properties.
|
||||||
|
@ -702,6 +698,10 @@ class PacketReader {
|
||||||
presence.setProperty(name, properties.get(name));
|
presence.setProperty(name, properties.get(name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Otherwise, it must be a packet extension.
|
||||||
|
else {
|
||||||
|
presence.addExtension(parsePacketExtension(elementName, namespace, parser));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (eventType == XmlPullParser.END_TAG) {
|
else if (eventType == XmlPullParser.END_TAG) {
|
||||||
if (parser.getName().equals("presence")) {
|
if (parser.getName().equals("presence")) {
|
||||||
|
@ -712,6 +712,48 @@ class PacketReader {
|
||||||
return presence;
|
return presence;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses a packet extension sub-packet.
|
||||||
|
*
|
||||||
|
* @param elementName the XML element name of the packet extension.
|
||||||
|
* @param namespace the XML namespace of the packet extension.
|
||||||
|
* @param parser the XML parser, positioned at the starting element of the extension.
|
||||||
|
* @return a PacketExtension.
|
||||||
|
* @throws Exception if a parsing error occurs.
|
||||||
|
*/
|
||||||
|
private PacketExtension parsePacketExtension(String elementName, String namespace, XmlPullParser parser)
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
// See if a provider is registered to handle the extension.
|
||||||
|
Object provider = ProviderManager.getExtensionProvider(elementName, namespace);
|
||||||
|
if (provider != null) {
|
||||||
|
if (provider instanceof PacketExtensionProvider) {
|
||||||
|
return ((PacketExtensionProvider)provider).parseExtension(parser);
|
||||||
|
}
|
||||||
|
else if (provider instanceof Class) {
|
||||||
|
return (PacketExtension)parseWithIntrospection(
|
||||||
|
elementName, (Class)provider, parser);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// No providers registered, so use a default extension.
|
||||||
|
DefaultPacketExtension extension = new DefaultPacketExtension(elementName, namespace);
|
||||||
|
boolean done = false;
|
||||||
|
while (!done) {
|
||||||
|
int eventType = parser.next();
|
||||||
|
if (eventType == XmlPullParser.START_TAG) {
|
||||||
|
String name = parser.getName();
|
||||||
|
String value = parser.nextText();
|
||||||
|
extension.setValue(name, value);
|
||||||
|
}
|
||||||
|
else if (eventType == XmlPullParser.END_TAG) {
|
||||||
|
if (parser.getName().equals(elementName)) {
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return extension;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse a properties sub-packet. If any errors occur while de-serializing Java object
|
* Parse a properties sub-packet. If any errors occur while de-serializing Java object
|
||||||
* properties, an exception will be printed and not thrown since a thrown
|
* properties, an exception will be printed and not thrown since a thrown
|
||||||
|
|
Loading…
Reference in a new issue