blob: a0293c408644e56af8b1e39ef5fc3dec07761ea3 [file] [log] [blame]
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package com.mozilla.SUTAgentAndroid.service;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.List;
import com.mozilla.SUTAgentAndroid.R;
import com.mozilla.SUTAgentAndroid.SUTAgentAndroid;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
public class RunCmdThread extends Thread
{
private ServerSocket SvrSocket = null;
private Socket socket = null;
private Handler handler = null;
boolean bListening = true;
boolean bNetError = false;
List<CmdWorkerThread> theWorkers = new ArrayList<CmdWorkerThread>();
android.app.Service svc = null;
public RunCmdThread(ServerSocket socket, android.app.Service service, Handler handler)
{
super("RunCmdThread");
this.SvrSocket = socket;
this.svc = service;
this.handler = handler;
}
public void StopListening()
{
bListening = false;
}
public void run() {
try {
SvrSocket.setSoTimeout(5000);
while (bListening)
{
try
{
socket = SvrSocket.accept();
CmdWorkerThread theWorker = new CmdWorkerThread(this, socket);
theWorker.start();
theWorkers.add(theWorker);
}
catch (SocketTimeoutException toe)
{
continue;
}
catch (IOException e)
{
e.printStackTrace();
continue;
}
}
int nNumWorkers = theWorkers.size();
for (int lcv = 0; lcv < nNumWorkers; lcv++)
{
if (theWorkers.get(lcv).isAlive())
{
theWorkers.get(lcv).StopListening();
while(theWorkers.get(lcv).isAlive())
;
}
}
theWorkers.clear();
SvrSocket.close();
svc.stopSelf();
// SUTAgentAndroid.me.finish();
}
catch (IOException e)
{
e.printStackTrace();
}
return;
}
private String SendPing(String sIPAddr)
{
Process pProc;
String sRet = "";
String [] theArgs = new String [4];
boolean bStillRunning = true;
int nBytesOut = 0;
int nBytesErr = 0;
int nBytesRead = 0;
byte[] buffer = new byte[1024];
theArgs[0] = "ping";
theArgs[1] = "-c";
theArgs[2] = "3";
theArgs[3] = sIPAddr;
try
{
pProc = Runtime.getRuntime().exec(theArgs);
InputStream sutOut = pProc.getInputStream();
InputStream sutErr = pProc.getErrorStream();
while (bStillRunning)
{
try
{
if ((nBytesOut = sutOut.available()) > 0)
{
if (nBytesOut > buffer.length)
{
buffer = null;
System.gc();
buffer = new byte[nBytesOut];
}
nBytesRead = sutOut.read(buffer, 0, nBytesOut);
if (nBytesRead == -1)
bStillRunning = false;
else
{
String sRep = new String(buffer,0,nBytesRead).replace("\n", "\r\n");
sRet += sRep;
sRep = null;
}
}
if ((nBytesErr = sutErr.available()) > 0)
{
if (nBytesErr > buffer.length)
{
buffer = null;
System.gc();
buffer = new byte[nBytesErr];
}
nBytesRead = sutErr.read(buffer, 0, nBytesErr);
if (nBytesRead == -1)
bStillRunning = false;
else
{
String sRep = new String(buffer,0,nBytesRead).replace("\n", "\r\n");
sRet += sRep;
sRep = null;
}
}
bStillRunning = (IsProcRunning(pProc) || (sutOut.available() > 0) || (sutErr.available() > 0));
}
catch (IOException e)
{
e.printStackTrace();
}
if ((bStillRunning == true) && (nBytesErr == 0) && (nBytesOut == 0))
{
try {
sleep(2000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
pProc.destroy();
pProc = null;
}
catch (IOException e)
{
sRet = e.getMessage();
e.printStackTrace();
}
return (sRet);
}
private boolean IsProcRunning(Process pProc)
{
boolean bRet = false;
@SuppressWarnings("unused")
int nExitCode = 0;
try
{
nExitCode = pProc.exitValue();
}
catch (IllegalThreadStateException z)
{
bRet = true;
}
catch (Exception e)
{
e.printStackTrace();
}
return(bRet);
}
private void SendNotification(String tickerText, String expandedText)
{
NotificationManager notificationManager = (NotificationManager)svc.getSystemService(Context.NOTIFICATION_SERVICE);
// int icon = android.R.drawable.stat_notify_more;
// int icon = R.drawable.ic_stat_first;
// int icon = R.drawable.ic_stat_second;
// int icon = R.drawable.ic_stat_neterror;
int icon = R.drawable.ateamlogo;
long when = System.currentTimeMillis();
Context context = svc.getApplicationContext();
// Intent to launch an activity when the extended text is clicked
Intent intent2 = new Intent(svc, SUTAgentAndroid.class);
PendingIntent launchIntent = PendingIntent.getActivity(context, 0, intent2, 0);
Notification notification = new Notification.Builder(context)
.setSmallIcon(icon)
.setContentTitle(tickerText)
.setContentText(expandedText)
.setContentIntent(launchIntent)
.setWhen(when)
.build();
notification.flags |= (Notification.FLAG_INSISTENT | Notification.FLAG_AUTO_CANCEL);
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
notification.defaults |= Notification.DEFAULT_LIGHTS;
notificationManager.notify(1959, notification);
}
private void CancelNotification()
{
NotificationManager notificationManager = (NotificationManager)svc.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(1959);
}
class doCancelNotification implements Runnable
{
public void run()
{
CancelNotification();
}
};
class doSendNotification implements Runnable
{
private String sTitle = "";
private String sBText = "";
doSendNotification(String sTitle, String sBodyText)
{
this.sTitle = sTitle;
this.sBText = sBodyText;
}
public void run()
{
SendNotification(sTitle, sBText);
}
};
}