| /* |
| * Copyright (C) 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.googlecode.android_scripting.interpreter; |
| |
| import com.googlecode.android_scripting.Analytics; |
| import com.googlecode.android_scripting.AndroidProxy; |
| import com.googlecode.android_scripting.Log; |
| import com.googlecode.android_scripting.Process; |
| import com.googlecode.android_scripting.SimpleServer; |
| import com.googlecode.android_scripting.jsonrpc.RpcReceiverManagerFactory; |
| |
| import java.net.InetSocketAddress; |
| import java.net.SocketException; |
| import java.net.UnknownHostException; |
| |
| /** |
| * This is a skeletal implementation of an interpreter process. |
| * |
| * @author Damon Kohler (damonkohler@gmail.com) |
| */ |
| public class InterpreterProcess extends Process { |
| |
| private final AndroidProxy mProxy; |
| private final Interpreter mInterpreter; |
| private String mCommand; |
| |
| /** |
| * Creates a new {@link InterpreterProcess}. |
| * |
| * @param launchScript |
| * the absolute path to a script that should be launched with the interpreter |
| * @param port |
| * the port that the AndroidProxy is listening on |
| */ |
| public InterpreterProcess(Interpreter interpreter, AndroidProxy proxy) { |
| mProxy = proxy; |
| mInterpreter = interpreter; |
| |
| setBinary(interpreter.getBinary()); |
| setName(interpreter.getNiceName()); |
| setCommand(interpreter.getInteractiveCommand()); |
| addAllArguments(interpreter.getArguments()); |
| putAllEnvironmentVariables(System.getenv()); |
| putEnvironmentVariable("AP_HOST", getHost()); |
| putEnvironmentVariable("AP_PORT", Integer.toString(getPort())); |
| if (proxy.getSecret() != null) { |
| putEnvironmentVariable("AP_HANDSHAKE", getSecret()); |
| } |
| putAllEnvironmentVariables(interpreter.getEnvironmentVariables()); |
| } |
| |
| protected void setCommand(String command) { |
| mCommand = command; |
| } |
| |
| public Interpreter getInterpreter() { |
| return mInterpreter; |
| } |
| |
| public String getHost() { |
| String result = mProxy.getAddress().getHostName(); |
| if (result.equals("0.0.0.0")) { // Wildcard. |
| try { |
| return SimpleServer.getPublicInetAddress().getHostName(); |
| } catch (UnknownHostException e) { |
| Log.i("public address", e); |
| e.printStackTrace(); |
| } catch (SocketException e) { |
| Log.i("public address", e); |
| } |
| } |
| return result; |
| } |
| |
| public int getPort() { |
| return mProxy.getAddress().getPort(); |
| } |
| |
| public InetSocketAddress getAddress() { |
| return mProxy.getAddress(); |
| } |
| |
| public String getSecret() { |
| return mProxy.getSecret(); |
| } |
| |
| public RpcReceiverManagerFactory getRpcReceiverManagerFactory() { |
| return mProxy.getRpcReceiverManagerFactory(); |
| } |
| |
| @Override |
| public void start(final Runnable shutdownHook) { |
| Analytics.track(mInterpreter.getName()); |
| // NOTE(damonkohler): String.isEmpty() doesn't work on Cupcake. |
| if (!mCommand.equals("")) { |
| addArgument(mCommand); |
| } |
| super.start(shutdownHook); |
| } |
| |
| @Override |
| public void kill() { |
| super.kill(); |
| mProxy.shutdown(); |
| } |
| |
| @Override |
| public String getWorkingDirectory() { |
| return InterpreterConstants.SDCARD_SL4A_ROOT; |
| } |
| } |