FileDocCategorySizeDatePackage
ViewServer.javaAPI DocAndroid 1.5 API7707Wed May 06 22:42:00 BST 2009com.android.server

ViewServer

public class ViewServer extends Object implements Runnable
The ViewServer is local socket server that can be used to communicate with the views of the opened windows. Communication with the views is ensured by the {@link com.android.server.WindowManagerService} and is a cross-process operation. {@hide}

Fields Summary
public static final int
VIEW_SERVER_DEFAULT_PORT
The default port used to start view servers.
private static final String
LOG_TAG
private static final String
VALUE_PROTOCOL_VERSION
private static final String
VALUE_SERVER_VERSION
private static final String
COMMAND_PROTOCOL_VERSION
private static final String
COMMAND_SERVER_VERSION
private static final String
COMMAND_WINDOW_MANAGER_LIST
private ServerSocket
mServer
private Thread
mThread
private final WindowManagerService
mWindowManager
private final int
mPort
Constructors Summary
ViewServer(WindowManagerService windowManager)
Creates a new ViewServer associated with the specified window manager. The server uses the default port {@link #VIEW_SERVER_DEFAULT_PORT}. The server is not started by default.

param
windowManager The window manager used to communicate with the views.
see
#start()


                                               
      
        this(windowManager, VIEW_SERVER_DEFAULT_PORT);
    
ViewServer(WindowManagerService windowManager, int port)
Creates a new ViewServer associated with the specified window manager on the specified local port. The server is not started by default.

param
windowManager The window manager used to communicate with the views.
param
port The port for the server to listen to.
see
#start()

        mWindowManager = windowManager;
        mPort = port;
    
Methods Summary
booleanisRunning()
Indicates whether the server is currently running.

return
True if the server is running, false otherwise.
see
#start()
see
#stop()
see
WindowManagerService#isViewServerRunning()

        return mThread != null && mThread.isAlive();
    
public voidrun()
Main server loop.

        final ServerSocket server = mServer;

        while (Thread.currentThread() == mThread) {
            Socket client = null;
            // Any uncaught exception will crash the system process
            try {
                client = server.accept();

                BufferedReader in = null;
                try {
                    in = new BufferedReader(new InputStreamReader(client.getInputStream()), 1024);

                    final String request = in.readLine();

                    String command;
                    String parameters;

                    int index = request.indexOf(' ");
                    if (index == -1) {
                        command = request;
                        parameters = "";
                    } else {
                        command = request.substring(0, index);
                        parameters = request.substring(index + 1);
                    }

                    boolean result;
                    if (COMMAND_PROTOCOL_VERSION.equalsIgnoreCase(command)) {
                        result = writeValue(client, VALUE_PROTOCOL_VERSION);
                    } else if (COMMAND_SERVER_VERSION.equalsIgnoreCase(command)) {
                        result = writeValue(client, VALUE_SERVER_VERSION);
                    } else if (COMMAND_WINDOW_MANAGER_LIST.equalsIgnoreCase(command)) {
                        result = mWindowManager.viewServerListWindows(client);
                    } else {
                        result = mWindowManager.viewServerWindowCommand(client,
                                command, parameters);
                    }

                    if (!result) {
                        Log.w(LOG_TAG, "An error occured with the command: " + command);
                    }
                } finally {
                    if (in != null) {
                        in.close();
                    }
                }
            } catch (Exception e) {
                Log.w(LOG_TAG, "Connection error: ", e);
            } finally {
                if (client != null) {
                    try {
                        client.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
booleanstart()
Starts the server.

return
True if the server was successfully created, or false if it already exists.
throws
IOException If the server cannot be created.
see
#stop()
see
#isRunning()
see
WindowManagerService#startViewServer(int)

        if (mThread != null) {
            return false;
        }

        mServer = new ServerSocket(mPort, 1, InetAddress.getLocalHost());
        mThread = new Thread(this, "Remote View Server [port=" + mPort + "]");
        mThread.start();

        return true;
    
booleanstop()
Stops the server.

return
True if the server was stopped, false if an error occured or if the server wasn't started.
see
#start()
see
#isRunning()
see
WindowManagerService#stopViewServer()

        if (mThread != null) {
            mThread.interrupt();
            mThread = null;
            try {
                mServer.close();
                mServer = null;
                return true;
            } catch (IOException e) {
                Log.w(LOG_TAG, "Could not close the view server");
            }
        }
        return false;
    
private static booleanwriteValue(java.net.Socket client, java.lang.String value)

        boolean result;
        BufferedWriter out = null;
        try {
            OutputStream clientStream = client.getOutputStream();
            out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024);
            out.write(value);
            out.write("\n");
            out.flush();
            result = true;
        } catch (Exception e) {
            result = false;
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    result = false;
                }
            }
        }
        return result;