| /* |
| * 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; |
| } |
| |
| } |