From a2d9a04ccaa2e67d442e16caec1f40379b266548 Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Wed, 18 Jun 2008 12:34:17 +0000 Subject: [PATCH] fixes #1835 svn changeset:4916/svn branch:trunk --- .../gwt/client/ApplicationConnection.java | 32 ++++++++----------- .../gwt/server/CommunicationManager.java | 29 +++++++++++------ 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java b/src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java index 1ff668caa8..fa1d61c224 100755 --- a/src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java @@ -48,9 +48,9 @@ public class ApplicationConnection { private static final String ERROR_CLASSNAME_EXT = "-error"; - public static final String VAR_RECORD_SEPARATOR = escapeString("\u001e"); + public static final String VAR_RECORD_SEPARATOR = "\u001e"; - public static final String VAR_FIELD_SEPARATOR = escapeString("\u001f"); + public static final String VAR_FIELD_SEPARATOR = "\u001f"; private final HashMap resourcesMap = new HashMap(); @@ -131,7 +131,7 @@ public class ApplicationConnection { // TODO remove hard coded id name view = new IView(cnf.getRootPanelId()); - makeUidlRequest("repaintAll=1"); + makeUidlRequest("", true); applicationRunning = true; } @@ -229,15 +229,18 @@ public class ApplicationConnection { return (activeRequests > 0); } - private void makeUidlRequest(String requestData) { + private void makeUidlRequest(String requestData, boolean repaintAll) { startRequest(); console.log("Making UIDL Request with params: " + requestData); - final String uri = getAppUri() + "UIDL" + configuration.getPathInfo(); + String uri = getAppUri() + "UIDL" + configuration.getPathInfo(); + if (repaintAll) { + uri += "?repaintAll=1"; + } final RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, uri); - rb.setHeader("Content-Type", - "application/x-www-form-urlencoded; charset=utf-8"); - // rb.setHeader("Content-Type", "text/plain;charset=utf-8"); + // rb.setHeader("Content-Type", + // "application/x-www-form-urlencoded; charset=utf-8"); + rb.setHeader("Content-Type", "text/plain;charset=utf-8"); try { rb.sendRequest(requestData, new RequestCallback() { public void onError(Request request, Throwable exception) { @@ -620,7 +623,6 @@ public class ApplicationConnection { private void buildAndSendVariableBurst(Vector pendingVariables) { final StringBuffer req = new StringBuffer(); - req.append("changes="); for (int i = 0; i < pendingVariables.size(); i++) { if (i > 0) { if (i % 2 == 0) { @@ -633,18 +635,12 @@ public class ApplicationConnection { } pendingVariables.clear(); - makeUidlRequest(req.toString()); + makeUidlRequest(req.toString(), false); } - private static native String escapeString(String value) - /*-{ - return encodeURIComponent(value); - }-*/; - public void updateVariable(String paintableId, String variableName, String newValue, boolean immediate) { - addVariableToQueue(paintableId, variableName, escapeString(newValue), - immediate, 's'); + addVariableToQueue(paintableId, variableName, newValue, immediate, 's'); } public void updateVariable(String paintableId, String variableName, @@ -684,7 +680,7 @@ public class ApplicationConnection { if (i > 0) { buf.append(","); } - buf.append(escapeString(values[i].toString())); + buf.append(values[i].toString()); } addVariableToQueue(paintableId, variableName, buf.toString(), immediate, 'a'); diff --git a/src/com/itmill/toolkit/terminal/gwt/server/CommunicationManager.java b/src/com/itmill/toolkit/terminal/gwt/server/CommunicationManager.java index f1433b3d43..86bbb39d2a 100644 --- a/src/com/itmill/toolkit/terminal/gwt/server/CommunicationManager.java +++ b/src/com/itmill/toolkit/terminal/gwt/server/CommunicationManager.java @@ -31,6 +31,7 @@ import java.util.Map; import java.util.Set; import javax.servlet.ServletException; +import javax.servlet.ServletInputStream; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -47,7 +48,6 @@ import com.itmill.toolkit.terminal.URIHandler; import com.itmill.toolkit.terminal.UploadStream; import com.itmill.toolkit.terminal.VariableOwner; import com.itmill.toolkit.terminal.Paintable.RepaintRequestEvent; -import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; import com.itmill.toolkit.ui.Component; import com.itmill.toolkit.ui.Upload; import com.itmill.toolkit.ui.Window; @@ -71,9 +71,11 @@ public class CommunicationManager implements Paintable.RepaintRequestListener { private static final int VAR_TYPE = 3; private static final int VAR_VALUE = 0; - private static final String VAR_RECORD_SEPARATOR = ApplicationConnection.VAR_RECORD_SEPARATOR; + private static final String VAR_RECORD_SEPARATOR = "\u001e"; - private static final String VAR_FIELD_SEPARATOR = ApplicationConnection.VAR_FIELD_SEPARATOR; + private static final String VAR_FIELD_SEPARATOR = "\u001f"; + + private static final int MAX_BUFFER_SIZE = 64 * 1024; private final ArrayList dirtyPaintabletSet = new ArrayList(); @@ -503,17 +505,24 @@ public class CommunicationManager implements Paintable.RepaintRequestListener { * @param request * @param application2 * @return true if successful, false if there was an inconsistency + * @throws IOException */ private boolean handleVariables(HttpServletRequest request, - Application application2) { + Application application2) throws IOException { boolean success = true; - final Map params = new HashMap(request.getParameterMap()); - final String changes = (String) ((params.get("changes") instanceof String[]) ? ((String[]) params - .get("changes"))[0] - : params.get("changes")); - params.remove("changes"); - if (changes != null && changes.length() > 0) { + if (request.getContentLength() > 0) { + + byte[] buffer = new byte[request.getContentLength()]; + ServletInputStream inputStream = request.getInputStream(); + int totalBytesRead = 0; + int bytesRead; + while ((bytesRead = inputStream.read(buffer, totalBytesRead, + MAX_BUFFER_SIZE)) != -1) { + totalBytesRead += bytesRead; + } + + String changes = new String(buffer, "utf-8"); // extract variables to two dim string array final String[] tmp = changes.split(VAR_RECORD_SEPARATOR); final String[][] variableRecords = new String[tmp.length][4]; -- 2.39.5