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
-~----------~----~----~----~------~----~------~--~---

Reply via email to