From d37194788f48bc8739f30df08b3e8690c53e93ed Mon Sep 17 00:00:00 2001 From: Emil Ivov Date: Tue, 10 Jul 2007 12:32:11 +0000 Subject: [PATCH] Applied Mihai Balan's patches on html formatting and favicon avatars --- lib/felix.client.run.properties.rss | 114 +++++++++++++++ lib/installer-exclude/aclibico-2.1.jar | Bin 0 -> 32880 bytes .../impl/protocol/rss/ContactRssImpl.java | 132 +++++++++++++++++- ...rationSetBasicInstantMessagingRssImpl.java | 20 ++- .../impl/protocol/rss/RssFeedReader.java | 40 +++--- .../protocol/rss/rss.provider.manifest.mf | 4 +- 6 files changed, 277 insertions(+), 33 deletions(-) create mode 100644 lib/felix.client.run.properties.rss create mode 100644 lib/installer-exclude/aclibico-2.1.jar diff --git a/lib/felix.client.run.properties.rss b/lib/felix.client.run.properties.rss new file mode 100644 index 000000000..3827cd884 --- /dev/null +++ b/lib/felix.client.run.properties.rss @@ -0,0 +1,114 @@ +# +# Framework config properties. +# +org.osgi.framework.system.packages= org.osgi.framework; \ + javax.swing; \ + javax.swing.event; \ + javax.swing.table; \ + javax.swing.text; \ + javax.swing.text.html; \ + javax.accessibility; \ + javax.swing.plaf; \ + javax.swing.plaf.metal; \ + javax.swing.plaf.basic; \ + javax.imageio; \ + javax.swing.tree; \ + javax.swing.undo; \ + javax.swing.event; \ + javax.swing.border; \ + javax.swing.filechooser; \ + org.w3c.dom; \ + org.xml.sax; \ + javax.xml.parsers;\ + org.apache.xml.serialize; \ + javax.xml.transform; \ + javax.xml.transform.dom; \ + javax.xml.transform.stream; \ + sun.security.action; \ + sun.misc; \ + javax.net; \ + javax.net.ssl; \ + javax.naming; \ + javax.naming.directory; \ + javax.sound;\ + javax.sound.sampled; \ + org.jdesktop.jdic.tray; \ + org.jdesktop.jdic.desktop; \ + com.apple.eio; \ + org.xml.sax.helpers; + +felix.auto.start.10= reference:file:lib/bundle/org.apache.felix.servicebinder-0.8.0-SNAPSHOT.jar +#reference:file:lib/bundle/org.apache.felix.bundlerepository-0.8.0-SNAPSHOT.jar +#\ +# file:lib/bundle/shell.jar \ +# \ +# file:lib/bundle/servicebinder.jar \ +# file:lib/bundle/tablelayout.jar + +felix.auto.start.20= \ + reference:file:sc-bundles/util.jar + + +felix.auto.start.40= \ + reference:file:sc-bundles/configuration.jar \ + reference:file:sc-bundles/version.jar \ + reference:file:sc-bundles/version-impl.jar \ + reference:file:sc-bundles/splashscreen.jar \ + +felix.auto.start.50= \ + reference:file:sc-bundles/fileaccess.jar \ + reference:file:sc-bundles/browserlauncher.jar \ + reference:file:sc-bundles/protocol.jar \ + reference:file:sc-bundles/contactlist.jar \ + reference:file:sc-bundles/media.jar \ + reference:file:sc-bundles/protocol-icq.jar \ + reference:file:sc-bundles/smacklib.jar \ + reference:file:sc-bundles/protocol-jabber.jar \ + reference:file:sc-bundles/protocol-msn.jar \ + reference:file:sc-bundles/protocol-yahoo.jar \ + reference:file:sc-bundles/protocol-gibberish.jar \ + reference:file:sc-bundles/netaddr.jar \ + reference:file:sc-bundles/protocol-zeroconf.jar \ + reference:file:sc-bundles/meta-cl.jar + +felix.auto.start.60= \ + reference:file:sc-bundles/history.jar \ + reference:file:sc-bundles/msghistory.jar \ + reference:file:sc-bundles/callhistory.jar \ + reference:file:sc-bundles/audionotifier.jar + + + felix.auto.start.66= \ + reference:file:sc-bundles/swing-ui.jar \ + reference:file:sc-bundles/systray.jar + + felix.auto.start.67= \ + reference:file:sc-bundles/pluginmanager.jar \ + reference:file:sc-bundles/icqaccregwizz.jar \ + reference:file:sc-bundles/aimaccregwizz.jar \ + reference:file:sc-bundles/jabberaccregwizz.jar \ + reference:file:sc-bundles/msnaccregwizz.jar \ + reference:file:sc-bundles/yahooaccregwizz.jar \ + reference:file:sc-bundles/gibberishaccregwizz.jar \ + reference:file:sc-bundles/extendedcallhistorysearch.jar \ + reference:file:sc-bundles/zeroconfaccregwizz.jar \ + reference:file:sc-bundles/shutdown.jar + +# Uncomment the following lines if you want to run the architect viewer +# bundle. +#oscar.auto.start.100= \ +# file:lib/bundle/architectureviewer1.1.jar + +#Specify the directory where oscar should deploy its bundles + felix.cache.profiledir=sip-communicator.bin +#felix.cache.profiledir=${user.home}/.sip-communicator/profiledir + +felix.startlevel.framework=100 +felix.startlevel.bundle=100 +# +# Bundle config properties. +# +#org.osgi.service.http.port=8080 +#osgi.shell.telnet=on +#oscar.repository.url=file:/home/rickhall/projects/noscar/repository.xml +oscar.embedded.execution=false diff --git a/lib/installer-exclude/aclibico-2.1.jar b/lib/installer-exclude/aclibico-2.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..5f6b57673330568a092a2b78cc63eebb3708d7d6 GIT binary patch literal 32880 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.ico file on the server where the + * feed resides, either a default standard RSS icon is returned. * - * @return byte[] an image representing the contact. + * @return byte[] the binary representation of the best available image in + * the icon, or null in case the image is invalid or inexistent. */ public byte[] getImage() { - return null; + Image selectedIcon; + + //we use these to get the best possible icon in case our favicon is a + //multi-page icon. + int maxWidth = 0; + int maxColors = 0; + int crtDescriptor = -1; + + //used for ICO to PNG translation. Uses PNG as it's the "safest" choice. + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] result = null; + + URL feedLocation = getRssURL(); + + //TODO: Fix aclico log4j-related errors + + try + { + URL location = new URL(feedLocation.getProtocol() + "://" + + feedLocation.getHost() + "/favicon.ico"); + ICOFile favicon = new ICOFile(location); + + logger.trace("Icon has " + favicon.getImageCount() + " pages"); + + for (int i = 0; i < favicon.getDescriptors().size(); i++) + { + BitmapDescriptor bmpDesc = favicon.getDescriptor(i); + if ((maxWidth < bmpDesc.getWidth())) + { + maxWidth = bmpDesc.getWidth(); + maxColors = bmpDesc.getColorCount(); + crtDescriptor = i; + } + + if ((maxColors < bmpDesc.getColorCount())) + { + maxWidth = bmpDesc.getWidth(); + maxColors = bmpDesc.getColorCount(); + crtDescriptor = i; + } + } + + //if icons is either invalid or contains no data, return the default + // RSS icon. + if (crtDescriptor == -1) + { + return getDefaultRssIcon(); + } + + selectedIcon = favicon.getDescriptor(crtDescriptor).getImageRGB(); + + //decode ICO as a PNG and return the result + ImageIO.write((BufferedImage)selectedIcon, "PNG", output); + result = output.toByteArray(); + + logger.trace("Result has " + result.length + " bytes"); + logger.trace("Icon is " + maxWidth + " px X " + maxWidth + " px @ " + + maxColors + " colors"); + + output.close(); + return result; + } + catch (MalformedURLException murlex) + { + //this shouldn't happen. Ever. + logger.error("Malformed URL " + murlex, + murlex); + } + catch (IOException ioex) + { + logger.error("I/O Error on favicon retrieval. " + ioex, + ioex); + } + return getDefaultRssIcon(); + } + + /** + * Returns the default icon in case the feed has no favicon on the server. + * Uses the defaultIconPath to locate the default icon to be + * displayed. + * + * @return binary representation of the default icon + */ + private byte[] getDefaultRssIcon() + { + logger.trace("Loading default icon at " + defaultIconPath); + + InputStream is = ContactRssImpl.class.getClassLoader() + .getResourceAsStream(defaultIconPath); + + byte[] result = null; + + //if something happened and the resource isn't at the specified location + //(messed jar-s, wrong filename, etc.) just return now + if (is == null) + return result; + try + { + logger.trace("Icon is "+is.available() + " bytes long"); + result = new byte[is.available()]; + is.read(result); + } + catch (IOException ioex) + { + logger.error("Error loading default icon at" + defaultIconPath, + ioex); + } + return result; + } /** @@ -234,7 +356,7 @@ public void setPresenceStatus(PresenceStatus rssPresenceStatus) /** * Returns a reference to the protocol provider that created the contact. * - * @return a refererence to an instance of the ProtocolProviderService + * @return a reference to an instance of the ProtocolProviderService */ public ProtocolProviderService getProtocolProvider() { diff --git a/src/net/java/sip/communicator/impl/protocol/rss/OperationSetBasicInstantMessagingRssImpl.java b/src/net/java/sip/communicator/impl/protocol/rss/OperationSetBasicInstantMessagingRssImpl.java index 33be96bcb..2ffa56882 100644 --- a/src/net/java/sip/communicator/impl/protocol/rss/OperationSetBasicInstantMessagingRssImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/rss/OperationSetBasicInstantMessagingRssImpl.java @@ -16,6 +16,7 @@ * Instant messaging functionalites for the Rss protocol. * * @author Jean-Albert Vescovo + * @author Mihai Balan */ public class OperationSetBasicInstantMessagingRssImpl implements OperationSetBasicInstantMessaging, @@ -97,8 +98,10 @@ public void addMessageListener(MessageListener listener) public Message createMessage(byte[] content, String contentType, String contentEncoding, String subject) { - return new MessageRssImpl(new String(content), contentType - , contentEncoding, subject); + return new MessageRssImpl(new String(content), + contentType, + contentEncoding, + subject); } /** @@ -110,9 +113,10 @@ public Message createMessage(byte[] content, String contentType, */ public Message createMessage(String messageText) { - - return new MessageRssImpl(messageText, DEFAULT_MIME_TYPE - , DEFAULT_MIME_ENCODING, null); + return new MessageRssImpl(messageText, + "text/html", + DEFAULT_MIME_ENCODING, + null); } /** @@ -356,9 +360,9 @@ public boolean isOfflineMessagingSupported() { return false; } - + /** - * Determines wheter the protocol supports the supplied content type + * Determines whether the protocol supports the supplied content type * * @param contentType the type we want to check * @return true if the protocol supports it and @@ -368,6 +372,8 @@ public boolean isContentTypeSupported(String contentType) { if(contentType.equals(DEFAULT_MIME_TYPE)) return true; + else if(contentType.equals("text/html")) + return true; else return false; } diff --git a/src/net/java/sip/communicator/impl/protocol/rss/RssFeedReader.java b/src/net/java/sip/communicator/impl/protocol/rss/RssFeedReader.java index ac9cab819..a684c1f62 100644 --- a/src/net/java/sip/communicator/impl/protocol/rss/RssFeedReader.java +++ b/src/net/java/sip/communicator/impl/protocol/rss/RssFeedReader.java @@ -18,6 +18,7 @@ * The class used for using the Informa Library into the RSS protocol * * @author Jean-Albert Vescovo + * @author Mihai Balan */ public class RssFeedReader { @@ -65,7 +66,7 @@ public RssFeedReader(URL contactRssURL) { this.rssURL = contactRssURL; - /** @todo should retrieve this from a resource file.*/ + /* TODO should retrieve this from a resource file.*/ this.title = "No feed avalaible !"; } @@ -103,7 +104,8 @@ public void retrieveFlow() //chronological order items = (SyndEntry[]) (this.feed.getEntries() .toArray(new SyndEntry[0])); - sortItems(); + //sort items + Arrays.sort(items, syndEntryComparator); //if we don't understand the date format we don't want to handle //this feed @@ -145,10 +147,13 @@ public void retrieveFlow() */ public synchronized String feedToString(Date latestRetrievedItemDate) { + String newsAbstract = null; StringBuffer printedFeed = new StringBuffer(); + /* TODO move this in a resources file.*/ if (items.length == 0) - return "No items currently available for this feed !"; + return "No items currently available for this feed !
"; + //go through the items list in reverse order so that we could stop //as soon as we reach items that we've already shown to the user. @@ -157,37 +162,32 @@ public synchronized String feedToString(Date latestRetrievedItemDate) if (items[i].getPublishedDate() .compareTo(latestRetrievedItemDate) > 0) { - printedFeed.insert( - 0 - , "\nAt " + items[i].getPublishedDate() - + " - " + items[i].getTitle() - + "\nLink: " + items[i].getLink() + "\n\n"); + // Get the abstract of the news. + newsAbstract = items[i].getDescription().getValue(); + // Forge the news to be displayed. + printedFeed.insert(0, "At " + + items[i].getPublishedDate() + + "
"+ items[i].getTitle() + "" + + "
Link
"); } else { if (i == items.length - 1) { printedFeed - .append("\n\nNo new articles in your feed since" - + " last update."); + .append("No new articles in your feed since" + + " last update.
"); + } break; } } - printedFeed.append ("\n\nSend anything to refresh this feed..."); + printedFeed + .append ("Send anything to refresh this feed...
\n"); return printedFeed.toString(); } - /** - * Sorts the items retrieved from the rss contact/feed associated with this - * reader. The method uses a bubble sort algorithm. - */ - private void sortItems() - { - Arrays.sort(items, syndEntryComparator); - } - /** * Returns a Date that can be used to know the most recent item in a * retrieved feed. diff --git a/src/net/java/sip/communicator/impl/protocol/rss/rss.provider.manifest.mf b/src/net/java/sip/communicator/impl/protocol/rss/rss.provider.manifest.mf index 09b8d2ab0..f8d7ddd1e 100644 --- a/src/net/java/sip/communicator/impl/protocol/rss/rss.provider.manifest.mf +++ b/src/net/java/sip/communicator/impl/protocol/rss/rss.provider.manifest.mf @@ -12,5 +12,7 @@ Import-Package: org.osgi.framework, net.java.sip.communicator.service.configuration.event, net.java.sip.communicator.util, net.java.sip.communicator.service.protocol, - net.java.sip.communicator.service.protocol.event + net.java.sip.communicator.service.protocol.event, + org.apache.log4j, + javax.imageio