/* * Copyright 2009 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.shell; import com.google.gwt.dev.shell.BrowserChannel.FreeMessage; import com.google.gwt.dev.shell.BrowserChannel.InvokeSpecialMessage; import com.google.gwt.dev.shell.BrowserChannel.ReturnMessage; import com.google.gwt.dev.shell.BrowserChannel.Value; import com.google.gwt.dev.shell.BrowserChannel.SessionHandler.SpecialDispatchId; import com.google.gwt.dev.shell.BrowserChannelClient.SessionHandlerClient; import java.io.IOException; /** * A class to encapsulate function invocations of objects on the server side. */ public class ServerMethods { /** * Tell the server that the client no longer has any references to the * specified Java object. * * @param ids IDs of objects to free * @return false if an error occurred */ static boolean freeJava(BrowserChannelClient channel, int ids[]) { if (!channel.isConnected()) { // ignoring freeJava after disconnect. return true; } try { new FreeMessage(channel, ids).send(); } catch (IOException e) { return false; } return true; } /** * Get the value of a property on an object. * * @param objectRef ID of object to fetch field on * @param dispatchId dispatch ID of field * @return the value of the property, undef if none (or on error) */ static Value getProperty(BrowserChannelClient channel, SessionHandlerClient handler, int objectRef, int dispatchId) { if (!channel.isConnected()) { // ignoring getProperty() after disconnect return new Value(); } Value args[] = new Value[2]; args[0] = new Value(); args[0].setInt(objectRef); args[1] = new Value(); args[1].setInt(dispatchId); synchronized (handler.getSynchronizationObject()) { try { new InvokeSpecialMessage(channel, SpecialDispatchId.GetProperty, args).send(); ReturnMessage returnMessage = channel.reactToMessagesWhileWaitingForReturn(handler); if (!returnMessage.isException()) { return returnMessage.getReturnValue(); } } catch (IOException e) { } catch (BrowserChannelException e) { } } return new Value(); } /** * Set the value of a property on an object. * * @param objectRef ID of object to fetch field on * @param dispatchId dispatch ID of field * @param value value to store in the property * @return false if an error occurred */ static boolean setProperty(BrowserChannelClient channel, SessionHandlerClient handler, int objectRef, int dispatchId, Value value) { Value args[] = new Value[3]; for (int i = 0; i < args.length; i++) { args[i] = new Value(); } args[0].setInt(objectRef); args[1].setInt(dispatchId); args[2] = value; synchronized (handler.getSynchronizationObject()) { try { new InvokeSpecialMessage(channel, SpecialDispatchId.SetProperty, args).send(); ReturnMessage returnMessage = channel.reactToMessagesWhileWaitingForReturn(handler); if (!returnMessage.isException()) { return true; } } catch (IOException e) { } catch (BrowserChannelException e) { } } // TODO: use the returned exception? return false; } }