X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fde%2Fj32%2Fjpim%2Fconduit%2FFritzAddressbookImporter.java;fp=src%2Fmain%2Fjava%2Fde%2Fj32%2Fjpim%2Fconduit%2FFritzAddressbookImporter.java;h=c24f86acac849d25f6b69a181ed532fc4095c467;hb=4c31953ffe274db62393de67740de5df70b06d33;hp=0000000000000000000000000000000000000000;hpb=5ac05364dc652686046f01849b810da6ffef1192;p=jpim.git diff --git a/src/main/java/de/j32/jpim/conduit/FritzAddressbookImporter.java b/src/main/java/de/j32/jpim/conduit/FritzAddressbookImporter.java new file mode 100644 index 0000000..c24f86a --- /dev/null +++ b/src/main/java/de/j32/jpim/conduit/FritzAddressbookImporter.java @@ -0,0 +1,76 @@ +package de.j32.jpim.conduit; + +import java.io.IOException; +import java.io.InputStream; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.xml.sax.SAXException; + +import de.j32.jpim.data.Entry; +import de.j32.jpim.data.EntryConsumer; +import de.j32.util.XmlUtil; + +public class FritzAddressbookImporter implements Importer +{ + Document xml_; + + /** + * Importer reading Addressbook from Fritzbox XML file + * + * @param is InputStream providing the XML data. After successful + * construction, the class takes responsibility for closing the + * stream. + * @throws SAXException + * @throws IOException + */ + public FritzAddressbookImporter(InputStream is) throws SAXException, IOException + { + // It does not make sens to try / finally here, at least conceptually: + // Since the base-class constructor might throw we would never get a + // chance to // properly close is. Thus I deem it safer to only take + // responsibility for is when the constructor does NOT throw and place + // the try finally into the callers code. + xml_ = XmlUtil.parse(is); + is.close(); + } + + @Override + public void sendTo(EntryConsumer consumer) + { + for (Element node : XmlUtil.iterate(xml_.getElementsByTagName("contact"), Element.class)) { + + // subnodes: category (unused, always 0) person/realName + // person/imageURL telephony/number (@prio, @type, @vanity) + // services/email mod_time + Entry entry = new Entry(); + + try { + entry.name(node.getElementsByTagName("realName").item(0).getTextContent()); + + for (Element phone : XmlUtil.iterate(node.getElementsByTagName("number"), + Element.class)) { + entry.attribute("phone", phone.getAttribute("type"), phone.getTextContent()); + } + + try { + entry.attribute("email", "", node.getElementsByTagName("email").item(0) + .getTextContent()); + } + catch (NullPointerException e) {} // ignore missing optional + // email + } + catch (NullPointerException e) { + // Ignore incomplete entries + entry = null; + } + + if (entry != null) consumer.consume(entry); + } + } + + @Override + public void close() throws IOException + {} + +}