diff options
Diffstat (limited to 'src/de/podfetcher')
6 files changed, 64 insertions, 104 deletions
diff --git a/src/de/podfetcher/feed/Feed.java b/src/de/podfetcher/feed/Feed.java index e200fbaad..05ae4bcda 100644 --- a/src/de/podfetcher/feed/Feed.java +++ b/src/de/podfetcher/feed/Feed.java @@ -20,11 +20,12 @@ public class Feed extends FeedFile{ public Feed() { + super(); items = new ArrayList<FeedItem>(); } public Feed(String url) { - super(); + this(); this.download_url = url; } diff --git a/src/de/podfetcher/syndication/handler/FeedHandler.java b/src/de/podfetcher/syndication/handler/FeedHandler.java index 46fe4399c..70cf5196b 100644 --- a/src/de/podfetcher/syndication/handler/FeedHandler.java +++ b/src/de/podfetcher/syndication/handler/FeedHandler.java @@ -12,19 +12,7 @@ import org.xml.sax.SAXException; import de.podfetcher.feed.Feed; public class FeedHandler { - public final static String CHANNEL = "channel"; - public final static String ITEM = "item"; - public final static String TITLE = "title"; - public final static String LINK = "link"; - public final static String DESCR = "description"; - public final static String PUBDATE = "pubDate"; - public final static String ENCLOSURE = "enclosure"; - public final static String IMAGE = "image"; - public final static String URL = "url"; - public final static String ENC_URL = "url"; - public final static String ENC_LEN = "length"; - public final static String ENC_TYPE = "type"; public Feed parseFeed(Feed feed) { TypeGetter tg = new TypeGetter(); @@ -42,6 +30,6 @@ public class FeedHandler { e.printStackTrace(); } - return handler.feed; + return handler.state.feed; } } diff --git a/src/de/podfetcher/syndication/handler/HandlerState.java b/src/de/podfetcher/syndication/handler/HandlerState.java index 830f13687..159f646f5 100644 --- a/src/de/podfetcher/syndication/handler/HandlerState.java +++ b/src/de/podfetcher/syndication/handler/HandlerState.java @@ -17,8 +17,8 @@ public class HandlerState { /** Namespaces that have been defined so far. */ protected HashMap<String, Namespace> namespaces; - public HandlerState() { - feed = new Feed(); + public HandlerState(Feed feed) { + this.feed = feed; tagstack = new Stack<String>(); namespaces = new HashMap<String, Namespace>(); } diff --git a/src/de/podfetcher/syndication/handler/RSSHandler.java b/src/de/podfetcher/syndication/handler/RSSHandler.java index e50fa8db2..f750b0a92 100644 --- a/src/de/podfetcher/syndication/handler/RSSHandler.java +++ b/src/de/podfetcher/syndication/handler/RSSHandler.java @@ -27,28 +27,49 @@ public class RSSHandler extends SyndHandler { public final static String ENCLOSURE = "enclosure"; public final static String IMAGE = "image"; public final static String URL = "url"; - + public final static String ENC_URL = "url"; public final static String ENC_LEN = "length"; public final static String ENC_TYPE = "type"; - - public ArrayList<FeedItem> items; - public FeedItem currentItem; - public StringBuilder strBuilder; - public Feed feed; - public String active_root_element; // channel or item or image - public String active_sub_element; // Not channel or item - public RSSHandler(Feed f) { - super(); - this.feed = f; + + public RSSHandler(Feed feed) { + super(feed); } @Override public void characters(char[] ch, int start, int length) throws SAXException { - if (active_sub_element != null) { - strBuilder.append(ch, start, length); + if (state.tagstack.size() >= 2) { + String content = new String(ch, start, length); + String top = state.tagstack.pop(); + String second = state.tagstack.peek(); + state.tagstack.push(top); + if (top.equals(TITLE)) { + if (second.equals(ITEM)) { + state.currentItem.setTitle(content); + } else if (second.equals(CHANNEL)) { + state.feed.setTitle(content); + } else if (second.equals(IMAGE)) { + state.feed.getImage().setTitle(IMAGE); + } + } else if (top.equals(DESCR)) { + if (second.equals(CHANNEL)) { + state.feed.setDescription(content); + } else if (second.equals(ITEM)) { + state.feed.setDescription(content); + } + } else if (top.equals(LINK)) { + if (second.equals(CHANNEL)) { + state.feed.setLink(content); + } else if (second.equals(ITEM)) { + state.currentItem.setLink(content); + } + } else if (top.equals(PUBDATE) && second.equals(ITEM)) { + state.currentItem.setPubDate(content); + } else if (top.equals(URL) && second.equals(IMAGE)) { + state.feed.getImage().setDownload_url(content); + } } } @@ -56,76 +77,30 @@ public class RSSHandler extends SyndHandler { public void endElement(String uri, String localName, String qName) throws SAXException { if (localName.equals(ITEM)) { - currentItem.setFeed(feed); - items.add(currentItem); - } else if (localName.equals(TITLE)) { - if (active_root_element.equals(CHANNEL)) { - feed.setTitle(strBuilder.toString()); - } else if(active_root_element.equals(ITEM)) { - currentItem.setTitle(strBuilder.toString()); - } else if(active_root_element.equals(IMAGE)) { - feed.getImage().setTitle(strBuilder.toString()); - } - } else if (localName.equals(DESCR)) { - if (active_root_element.equals(CHANNEL)) { - feed.setDescription(strBuilder.toString()); - } else { - currentItem.setDescription(strBuilder.toString()); - } - } else if (localName.equals(LINK)) { - if (active_root_element.equals(CHANNEL)) { - feed.setLink(strBuilder.toString()); - } else if(active_root_element.equals(ITEM)){ - currentItem.setLink(strBuilder.toString()); - } - } else if (localName.equals(PUBDATE)) { - if (active_root_element.equals(ITEM)) { - currentItem.setPubDate(strBuilder.toString()); - } - } else if (localName.equals(URL)) { - if(active_root_element.equals(IMAGE)) { - feed.getImage().setDownload_url(strBuilder.toString()); - } - } else if(localName.equals(IMAGE)) { - active_root_element = CHANNEL; + state.currentItem = null; } - active_sub_element = null; - strBuilder = new StringBuilder(); + super.endElement(uri, localName, qName); } - @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - if (localName.equals(CHANNEL)) { - if(feed == null) { - feed = new Feed(); - } - active_root_element = localName; - } else if (localName.equals(ITEM)) { - currentItem = new FeedItem(); - active_root_element = localName; - } else if (localName.equals(TITLE)) { - active_sub_element = localName; - } else if (localName.equals(DESCR)) { - active_sub_element = localName; - } else if (localName.equals(LINK)) { - active_sub_element = localName; - } else if (localName.equals(PUBDATE)) { - active_sub_element = localName; + + if (localName.equals(ITEM)) { + state.currentItem = new FeedItem(); + state.feed.getItems().add(state.currentItem); + state.currentItem.setFeed(state.feed); + } else if (localName.equals(ENCLOSURE)) { - currentItem.setMedia(new FeedMedia(currentItem, - attributes.getValue(ENC_URL), - Long.parseLong(attributes.getValue(ENC_LEN)), - attributes.getValue(ENC_TYPE))); - } else if(localName.equals(IMAGE)) { - feed.setImage(new FeedImage()); - active_root_element = localName; - } else if(localName.equals(URL)) { - active_sub_element = qName; + state.currentItem + .setMedia(new FeedMedia(state.currentItem, attributes + .getValue(ENC_URL), Long.parseLong(attributes + .getValue(ENC_LEN)), attributes.getValue(ENC_TYPE))); + } else if (localName.equals(IMAGE)) { + state.feed.setImage(new FeedImage()); } + super.startElement(uri, localName, qName, attributes); } - } diff --git a/src/de/podfetcher/syndication/handler/SyndHandler.java b/src/de/podfetcher/syndication/handler/SyndHandler.java index 4e7652dad..9cf5fb710 100644 --- a/src/de/podfetcher/syndication/handler/SyndHandler.java +++ b/src/de/podfetcher/syndication/handler/SyndHandler.java @@ -4,14 +4,20 @@ import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; +import android.util.Log; + +import de.podfetcher.feed.Feed; import de.podfetcher.syndication.namespace.Namespace; import de.podfetcher.syndication.namespace.atom.NSAtom; /** Superclass for all SAX Handlers which process Syndication formats */ public abstract class SyndHandler extends DefaultHandler{ + private static final String TAG = "SyndHandler"; protected HandlerState state; - + public SyndHandler(Feed feed) { + state = new HandlerState(feed); + } @Override public void startElement(String uri, String localName, String qName, @@ -45,24 +51,13 @@ public abstract class SyndHandler extends DefaultHandler{ @Override public void startPrefixMapping(String prefix, String uri) throws SAXException { + Log.d(TAG, "Found Prefix Mapping with prefix " + prefix + " and uri " + uri); // Find the right namespace if (prefix.equals(NSAtom.NSTAG) || uri.equals(NSAtom.NSURI)) { state.namespaces.put(prefix, new NSAtom()); } } - - - @Override - public void endDocument() throws SAXException { - super.endDocument(); - } - - @Override - public void startDocument() throws SAXException { - state = new HandlerState(); - } - public HandlerState getState() { return state; } diff --git a/src/de/podfetcher/syndication/handler/TypeGetter.java b/src/de/podfetcher/syndication/handler/TypeGetter.java index 9dab56af8..9ab9dc70a 100644 --- a/src/de/podfetcher/syndication/handler/TypeGetter.java +++ b/src/de/podfetcher/syndication/handler/TypeGetter.java @@ -14,7 +14,7 @@ import android.util.Log; import de.podfetcher.feed.Feed; -/** Gets the type of a specific feed. */ +/** Gets the type of a specific feed by reading the root element. */ public class TypeGetter { private static final String TAG = "TypeGetter"; @@ -33,6 +33,7 @@ public class TypeGetter { XmlPullParser xpp = factory.newPullParser(); xpp.setInput(createReader(feed)); int eventType = xpp.getEventType(); + while (eventType != XmlPullParser.END_DOCUMENT) { if (eventType == XmlPullParser.START_TAG) { String tag = xpp.getName(); |