1bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick/*
2bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick * Copyright (C) 2010 The Android Open Source Project
3bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick *
4bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick * Licensed under the Apache License, Version 2.0 (the "License");
5bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick * you may not use this file except in compliance with the License.
6bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick * You may obtain a copy of the License at
7bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick *
8bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick *      http://www.apache.org/licenses/LICENSE-2.0
9bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick *
10bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick * Unless required by applicable law or agreed to in writing, software
11bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick * distributed under the License is distributed on an "AS IS" BASIS,
12bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick * See the License for the specific language governing permissions and
14bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick * limitations under the License.
15bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick */
16bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick
17bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrickpackage com.android.rpc_performance;
18bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick
19bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrickimport android.app.Service;
20bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrickimport android.content.Intent;
21bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrickimport android.os.Binder;
22bbb8304e20da95f79b76df1a5b905503c8988457Dan Egnorimport android.os.Debug;
23bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrickimport android.os.IBinder;
24bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrickimport android.util.Log;
25bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrickimport android.net.LocalServerSocket;
26bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrickimport android.net.LocalSocket;
27bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick
28bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrickimport java.io.IOException;
29bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrickimport java.io.InputStream;
30bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrickimport java.io.OutputStream;
31bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick
32bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrickpublic class MiscService extends Service {
33bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick
34bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick    public static final String SOCKET_NAME = "play-misc-service";
35bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick    private static final String TAG = "MiscService";
36bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick
37bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick    private LocalServerSocket mServerSocket = null;
38bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick
39bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick    @Override public void onCreate() {
40bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick        Log.v(TAG, "onCreate");
41bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick        try {
42bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick            mServerSocket = new LocalServerSocket(SOCKET_NAME);
43bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick        } catch (IOException e) {
44bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick            Log.v(TAG, "in onCreate, making server socket: " + e);
45bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick            return;
46bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick        }
47bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick
48bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick        Thread t = new Thread() {
49bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                @Override public void run() {
50bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                    LocalSocket socket = null;
51bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                    while (true) {
52bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                        try {
53bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                            Log.v(TAG, "Waiting for connection...");
54bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                            socket = mServerSocket.accept();
55bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                            Log.v(TAG, "Got socket: " + socket);
56bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                            if (socket != null) {
57bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                                startEchoThread(socket);
58bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                            } else {
59bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                                return;  // socket shutdown?
60bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                            }
61bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                        } catch (IOException e) {
62bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                            Log.v(TAG, "in accept: " + e);
63bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                        }
64bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                    }
65bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                }
66bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick            };
67bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick        t.start();
68bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick    }
69bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick
70bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick    private void startEchoThread(final LocalSocket socket) {
71bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick        Thread t = new Thread() {
72bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                @Override public void run() {
73bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                    try {
74bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                        InputStream is = socket.getInputStream();
75bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                        OutputStream os = socket.getOutputStream();
76bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                        while (true) {
77bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                            int byteRead = is.read();
78bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                            if (byteRead < 0) {
79bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                                return;  // EOF.
80bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                            }
81bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                            os.write(byteRead);
82bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                        }
83bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                    } catch (IOException e) {
84bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                        Log.v(TAG, "in echo thread loop: " + e);
85bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                    }
86bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick                }
87bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick            };
88bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick        t.start();
89bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick    }
90bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick
91bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick    @Override public IBinder onBind(Intent intent) {
92bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick        Log.v(TAG, "onBind");
93bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick        return mBinder;
94bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick    }
95bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick
96bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick    private final IService.Stub mBinder = new IService.Stub() {
97bbb8304e20da95f79b76df1a5b905503c8988457Dan Egnor        public String pingString(String v) {
98bbb8304e20da95f79b76df1a5b905503c8988457Dan Egnor            return v;
99bbb8304e20da95f79b76df1a5b905503c8988457Dan Egnor        }
100bbb8304e20da95f79b76df1a5b905503c8988457Dan Egnor        public void pingVoid() {
101bbb8304e20da95f79b76df1a5b905503c8988457Dan Egnor        }
102bbb8304e20da95f79b76df1a5b905503c8988457Dan Egnor        public void startTracing(String name) {
103bbb8304e20da95f79b76df1a5b905503c8988457Dan Egnor            Debug.startMethodTracing(name);
104bbb8304e20da95f79b76df1a5b905503c8988457Dan Egnor        }
105bbb8304e20da95f79b76df1a5b905503c8988457Dan Egnor        public void stopTracing() {
106bbb8304e20da95f79b76df1a5b905503c8988457Dan Egnor            Debug.stopMethodTracing();
107bbb8304e20da95f79b76df1a5b905503c8988457Dan Egnor        }
108bbb8304e20da95f79b76df1a5b905503c8988457Dan Egnor    };
109bb4addaaf281db7cc7e666536b694e323e7bf19cBrad Fitzpatrick}
110