001 package com.valhalla.jbother.jabber.smack.provider;
002
003 import org.jivesoftware.smack.packet.IQ;
004 import org.jivesoftware.smack.packet.PacketExtension;
005 import org.jivesoftware.smack.provider.IQProvider;
006 import com.valhalla.jbother.jabber.smack.*;
007 import org.jivesoftware.smackx.packet.DataForm;
008 import org.jivesoftware.smackx.provider.*;
009
010 import org.xmlpull.v1.XmlPullParser;
011 import com.valhalla.jbother.jabber.smack.*;
012
013 import java.util.HashMap;
014
015 /**
016 * Created by luke on Apr 1, 2005 1:11:23 PM
017 */
018
019 /**
020 * provider class for parsing Search packages
021 */
022 public class SearchProvider implements IQProvider
023 {
024 private static String fId = "$Id$";
025
026 public static final String NAMESPACE = "jabber:iq:search";
027
028 public IQ parseIQ(XmlPullParser parser) throws Exception
029 {
030 Search search = new Search();
031
032 boolean done = false;
033 HashMap searchFields = new HashMap();
034
035 while(!done)
036 {
037 int eventType = parser.next();
038 String elementName = parser.getName();
039 String namespace = parser.getNamespace();
040
041 if (eventType == XmlPullParser.START_TAG)
042 {
043 if(elementName.equals("instructions")) {
044 search.setInstructions( parser.nextText() );
045 }
046 else if(elementName.equals("item")) {
047 search.addItem(parseItem(parser));
048 }
049 else if(elementName.equals("x") && namespace.equals("jabber:x:data")) {
050 DataFormProvider dataFormProvider = new DataFormProvider();
051 search.setSearchDataForm((DataForm)dataFormProvider.parseExtension(parser));
052 }
053 else
054 {
055 if( ! searchFields.containsKey(elementName)) {
056 searchFields.put(elementName,parser.nextText());
057 }
058 }
059 }
060 else if (eventType == XmlPullParser.END_TAG && elementName.equals("query")) {
061 done = true;
062 }
063 }
064 if(searchFields.size() > 0) {
065 search.setSearchFields(searchFields);
066 }
067 return search;
068 }
069
070 /**
071 * tries to parse <code><item></code> messages and return Saech.Item objects
072 * @param parser XmlPullParser providing the XML data
073 * @return @link{String.Item} object representing search result
074 */
075 private Search.Item parseItem(XmlPullParser parser) throws Exception
076 {
077 boolean done = false;
078 HashMap attributes = new HashMap();
079 Search.Item item = new Search.Item(parser.getAttributeValue("","jid"));
080 while (!done) {
081 int eventType = parser.next();
082 if (eventType == XmlPullParser.START_TAG) {
083 attributes.put(parser.getName(),parser.nextText());
084 }
085 else if (eventType == XmlPullParser.END_TAG) {
086 if (parser.getName().equals("item")) {
087 done = true;
088 }
089 }
090 }
091 item.setAttributes(attributes);
092 return item;
093 }
094 }