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