Revision: 6304 Author: [email protected] Date: Tue Oct 6 09:29:34 2009 Log: Add support for getting the icon from the browser.
http://code.google.com/p/google-web-toolkit/source/detail?r=6304 Modified: /changes/jat/abstractui/dev/oophm/src/com/google/gwt/dev/shell/BrowserChannel.java /changes/jat/abstractui/dev/oophm/src/com/google/gwt/dev/shell/BrowserChannelClient.java /changes/jat/abstractui/dev/oophm/src/com/google/gwt/dev/shell/BrowserChannelServer.java /changes/jat/abstractui/dev/oophm/test/com/google/gwt/dev/shell/BrowserChannelTest.java ======================================= --- /changes/jat/abstractui/dev/oophm/src/com/google/gwt/dev/shell/BrowserChannel.java Mon Oct 5 15:54:05 2009 +++ /changes/jat/abstractui/dev/oophm/src/com/google/gwt/dev/shell/BrowserChannel.java Tue Oct 6 09:29:34 2009 @@ -153,7 +153,11 @@ SWITCH_TRANSPORT(11), - LOAD_MODULE(12); + LOAD_MODULE(12), + + REQUEST_ICON(13), + + USER_AGENT_ICON(14); private final int id; @@ -173,7 +177,7 @@ public interface RemoteObjectRef { /** - * Return the reference ID for this object. + * @return the reference ID for this object. */ int getRefid(); } @@ -1260,6 +1264,33 @@ public QuitMessage(BrowserChannel channel) { super(channel); } + + @Override + public void send() throws IOException { + send(getBrowserChannel()); + } + } + + /** + * A message asking the client to send an icon suitable for use in the UI. + * @see {...@link UserAgentIconMessage}. + */ + protected static class RequestIconMessage extends Message { + public static RequestIconMessage receive(BrowserChannel channel) + throws IOException { + return new RequestIconMessage(channel); + } + + public static void send(BrowserChannel channel) + throws IOException { + DataOutputStream stream = channel.getStreamToOtherSide(); + stream.writeByte(MessageType.REQUEST_ICON.getId()); + stream.flush(); + } + + public RequestIconMessage(BrowserChannel channel) { + super(channel); + } @Override public void send() throws IOException { @@ -1367,8 +1398,73 @@ } } - public static final int BROWSERCHANNEL_PROTOCOL_VERSION = 2; - + /** + * A message supplying an icon, which fits in 24x24 and in a standard image + * format such as PNG or GIF, suitable for use in the UI. + * @see {...@link RequestIconMessage}. + */ + protected static class UserAgentIconMessage extends Message { + public static UserAgentIconMessage receive(BrowserChannel channel) + throws IOException { + byte[] iconBytes = null; + DataInputStream stream = channel.getStreamFromOtherSide(); + int len = stream.readInt(); + if (len > 0) { + iconBytes = new byte[len]; + for (int i = 0; i < len; ++i) { + iconBytes[i] = stream.readByte(); + } + } + return new UserAgentIconMessage(channel, iconBytes); + } + + public static void send(BrowserChannel channel, byte[] iconBytes) + throws IOException { + DataOutputStream stream = channel.getStreamToOtherSide(); + stream.writeByte(MessageType.USER_AGENT_ICON.getId()); + if (iconBytes == null) { + stream.writeInt(0); + } else { + stream.writeInt(iconBytes.length); + for (byte b : iconBytes) { + stream.writeByte(b); + } + } + stream.flush(); + } + + private byte[] iconBytes; + + public UserAgentIconMessage(BrowserChannel channel, byte[] iconBytes) { + super(channel); + this.iconBytes = iconBytes; + } + + public byte[] getIconBytes() { + return iconBytes; + } + + @Override + public void send() throws IOException { + send(getBrowserChannel(), iconBytes); + } + } + + /** + * The current version of the protocol + */ + public static final int PROTOCOL_VERSION_CURRENT = 3; + + /** + * The oldest protocol version supported by this code. + */ + public static final int PROTOCOL_VERSION_OLDEST = 2; + + /** + * The protocol version that added the GetIcon message. + */ + public static final int PROTOCOL_VERSION_GET_ICON = 3; + public static final int SPECIAL_CLIENTMETHODS_OBJECT = 0; public static final int SPECIAL_SERVERMETHODS_OBJECT = 0; ======================================= --- /changes/jat/abstractui/dev/oophm/src/com/google/gwt/dev/shell/BrowserChannelClient.java Wed Sep 30 09:31:26 2009 +++ /changes/jat/abstractui/dev/oophm/src/com/google/gwt/dev/shell/BrowserChannelClient.java Tue Oct 6 09:29:34 2009 @@ -147,8 +147,8 @@ private boolean init() throws IOException, BrowserChannelException { logger.log(TreeLogger.DEBUG, "sending " + MessageType.CHECK_VERSIONS + " message"); - new CheckVersionsMessage(this, BROWSERCHANNEL_PROTOCOL_VERSION, - BROWSERCHANNEL_PROTOCOL_VERSION, versionString).send(); + new CheckVersionsMessage(this, PROTOCOL_VERSION_CURRENT, + PROTOCOL_VERSION_CURRENT, versionString).send(); MessageType type = Message.readMessageType(getStreamFromOtherSide()); switch (type) { case PROTOCOL_VERSION: ======================================= --- /changes/jat/abstractui/dev/oophm/src/com/google/gwt/dev/shell/BrowserChannelServer.java Mon Oct 5 15:54:05 2009 +++ /changes/jat/abstractui/dev/oophm/src/com/google/gwt/dev/shell/BrowserChannelServer.java Tue Oct 6 09:29:34 2009 @@ -20,6 +20,8 @@ import java.io.IOException; import java.net.Socket; +import java.util.HashMap; +import java.util.Map; import java.util.Set; /** @@ -56,6 +58,10 @@ public static final String JSO_CLASS = "com.google.gwt.core.client.JavaScriptObject"; + private static Map<String, byte[]> iconCache = new HashMap<String, byte[]>(); + + private static final Object cacheLock = new Object(); + private SessionHandler handler; private final ServerObjectsTable javaObjectsInBrowser = new ServerObjectsTable(); @@ -309,8 +315,6 @@ String url = null; String tabKey = null; String sessionKey = null; - // TODO(jat): add a way to get the user agent icon - byte[] userAgentIcon = null; switch (type) { case OLD_LOAD_MODULE: // v1 client @@ -333,8 +337,8 @@ int minVersion = hello.getMinVersion(); int maxVersion = hello.getMaxVersion(); String hostedHtmlVersion = hello.getHostedHtmlVersion(); - if (minVersion > BROWSERCHANNEL_PROTOCOL_VERSION - || maxVersion < BROWSERCHANNEL_PROTOCOL_VERSION) { + if (minVersion > PROTOCOL_VERSION_CURRENT + || maxVersion < PROTOCOL_VERSION_OLDEST) { connectError = "No supported protocol version in range " + minVersion + " - " + maxVersion; } else { @@ -345,13 +349,13 @@ return; } } + protocolVersion = Math.min(PROTOCOL_VERSION_CURRENT, maxVersion); if (connectError != null) { logger.log(TreeLogger.ERROR, "Connection error: " + connectError, null); new FatalErrorMessage(this, connectError).send(); return; } - protocolVersion = BROWSERCHANNEL_PROTOCOL_VERSION; new ProtocolVersionMessage(this, protocolVersion).send(); type = Message.readMessageType(getStreamFromOtherSide()); @@ -390,8 +394,25 @@ Thread.currentThread().setName( "Hosting " + moduleName + " for " + userAgent + " on " + url + " @ " + sessionKey); + byte[] iconBytes = null; + synchronized (cacheLock) { + if (iconCache.containsKey(userAgent)) { + iconBytes = iconCache.get(userAgent); + } else { + RequestIconMessage.send(this); + type = Message.readMessageType(getStreamFromOtherSide()); + if (type != MessageType.USER_AGENT_ICON) { + logger.log(TreeLogger.ERROR, "Unexpected message type " + type + + "; expecting UserAgentIcon"); + return; + } + UserAgentIconMessage uaIconMessage = UserAgentIconMessage.receive(this); + iconBytes = uaIconMessage.getIconBytes(); + iconCache.put(userAgent, iconBytes); + } + } logger = handler.loadModule(logger, this, moduleName, userAgent, url, - tabKey, sessionKey, userAgentIcon); + tabKey, sessionKey, iconBytes); try { // send LoadModule response ReturnMessage.send(this, false, new Value()); ======================================= --- /changes/jat/abstractui/dev/oophm/test/com/google/gwt/dev/shell/BrowserChannelTest.java Sat Sep 26 02:08:41 2009 +++ /changes/jat/abstractui/dev/oophm/test/com/google/gwt/dev/shell/BrowserChannelTest.java Tue Oct 6 09:29:34 2009 @@ -33,8 +33,10 @@ import com.google.gwt.dev.shell.BrowserChannel.OldLoadModuleMessage; import com.google.gwt.dev.shell.BrowserChannel.ProtocolVersionMessage; import com.google.gwt.dev.shell.BrowserChannel.QuitMessage; +import com.google.gwt.dev.shell.BrowserChannel.RequestIconMessage; import com.google.gwt.dev.shell.BrowserChannel.ReturnMessage; import com.google.gwt.dev.shell.BrowserChannel.SwitchTransportMessage; +import com.google.gwt.dev.shell.BrowserChannel.UserAgentIconMessage; import junit.framework.TestCase; @@ -361,6 +363,15 @@ assertEquals(ValueType.INT, valRecv.getType()); assertEquals(42, valRecv.getInt()); } + + public void testRequestIconMessage() throws IOException, + BrowserChannelException { + RequestIconMessage.send(channel); + MessageType type = channel.readMessageType(); + assertEquals(MessageType.REQUEST_ICON, type); + RequestIconMessage message = RequestIconMessage.receive(channel); + assertFalse(message.isAsynchronous()); + } public void testSwitchTransportMessage() throws IOException, BrowserChannelException { @@ -373,4 +384,34 @@ assertEquals(transport, message.getTransport()); assertEquals(transportArgs, message.getTransportArgs()); } -} + + public void testUserAgentIconMessage() throws IOException, + BrowserChannelException { + UserAgentIconMessage.send(channel, null); + MessageType type = channel.readMessageType(); + assertEquals(MessageType.USER_AGENT_ICON, type); + UserAgentIconMessage message = UserAgentIconMessage.receive(channel); + assertFalse(message.isAsynchronous()); + byte[] receivedBytes = message.getIconBytes(); + assertNull(receivedBytes); + + UserAgentIconMessage.send(channel, new byte[0]); + type = channel.readMessageType(); + assertEquals(MessageType.USER_AGENT_ICON, type); + message = UserAgentIconMessage.receive(channel); + assertFalse(message.isAsynchronous()); + assertNull(receivedBytes); + + byte[] bytes = new byte[] { 0, 1, 2, 3, 4 }; + UserAgentIconMessage.send(channel, bytes); + type = channel.readMessageType(); + assertEquals(MessageType.USER_AGENT_ICON, type); + message = UserAgentIconMessage.receive(channel); + assertFalse(message.isAsynchronous()); + assertNotNull(receivedBytes); + assertEquals(5, receivedBytes.length); + for (int i = 0; i < 5; ++i) { + assertEquals(i, receivedBytes[i]); + } + } +} --~--~---------~--~----~------------~-------~--~----~ http://groups.google.com/group/Google-Web-Toolkit-Contributors -~----------~----~----~----~------~----~------~--~---
