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