package tw.jwzhuang.ipcam.server; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.json.JSONException; import org.json.JSONObject; import tw.jwzhuang.ipcam.RecordService; import tw.jwzhuang.ipcam.server.SocketServer.WorkerRunnable; import android.app.Service; import android.content.Intent; import android.content.SharedPreferences; import android.os.Binder; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; import android.util.Base64; import android.util.Log; public class StreamServer extends Service { private final String TAG = this.getClass().getSimpleName(); private byte[] buffer = null; private int startId = -1; public int videoWidth = 320; public int videoHeight = 240; private int videoRate = 20; private SocketServer server = null; private HandlerThread mThread = null; private Handler mThreadHandler; private ServiceBinder mBinder = null; private RecordService activity = null; private List<WorkerRunnable> streamToWorkers = null; private SharedPreferences preferences = null; @Override public void onCreate() { super.onCreate(); mBinder = new ServiceBinder(); streamToWorkers = new ArrayList<WorkerRunnable>(); preferences = getSharedPreferences("code", MODE_PRIVATE); } @Override public int onStartCommand(Intent intent, int flags, int startId) { stopServerSocket(); startServerSocket(); if(startId != -1){ this.stopSelf(startId); } this.startId = startId; return super.onStartCommand(intent, START_STICKY, startId); } @Override public void onDestroy() { stopServerSocket(); super.onDestroy(); } public void exitStreamServer(){ stopSelf(startId); } public void setB(RecordService recordService) { this.activity = recordService; } public void setBuffer(byte[] bf){ this.buffer = bf; //add length at byte[0] , byte[1] for(int i=0; i< streamToWorkers.size(); i++){ WorkerRunnable worker = streamToWorkers.get(0); worker.sentMsg(buffer); } } public void setHeight(int h){ this.videoHeight = h; } public void setRate(int r){ this.videoRate = r; } public void setWidth(int w){ this.videoWidth = w; } private void startServerSocket(){ mThread = new HandlerThread("name"); mThread.start(); mThreadHandler=new Handler(mThread.getLooper()); mThreadHandler.post(server = new SocketServer(this)); } public void removeWorker(WorkerRunnable worker) { activity.startCacheBuf_StreamServer(-1); streamToWorkers.remove(worker); } private void stopServerSocket(){ for(int i = 0;i < streamToWorkers.size(); i++){ removeWorker(streamToWorkers.get(0)); } if(server != null){ try { server.closeServer(); server = null; } catch (IOException e) { Log.e(TAG, e.getMessage()); } } if (mThreadHandler != null) { mThreadHandler.removeCallbacksAndMessages(null); } if (mThread != null) { mThread.quit(); } activity = null; } @Override public IBinder onBind(Intent arg0) { stopServerSocket(); startServerSocket(); return mBinder; } public class ServiceBinder extends Binder { public StreamServer getService(){ return StreamServer.this; } } public boolean verifyUser(String pwd, WorkerRunnable worker) throws JSONException { JSONObject jobj = new JSONObject(); jobj.put("cmd", "login"); if(preferences.getString("randomcode", "*^(&%)&(%^*(").equals(pwd)){ jobj.put("state", 0); }else{ jobj.put("state", 1); } worker.sentMsg(jobj.toString()); return true; } public void sentVideoParams(WorkerRunnable worker) throws JSONException { JSONObject jobj = new JSONObject(); jobj.put("cmd", "getparams"); jobj.put("state", 0); jobj.put("sps", Base64.encodeToString(activity.getSPS(), Base64.DEFAULT)); jobj.put("pps", Base64.encodeToString(activity.getPPS(), Base64.DEFAULT)); jobj.put("rate", videoRate); worker.sentMsg(jobj.toString()); } public void sentVideoStream(boolean isSent, WorkerRunnable worker) throws JSONException, InterruptedException { JSONObject jobj = new JSONObject(); jobj.put("cmd", "getstream"); jobj.put("state", 0); worker.sentMsg(jobj.toString()); Thread.sleep(1000); streamToWorkers.add(worker); activity.startCacheBuf_StreamServer(1); } public void flashLight(){ activity.flashLight(); } }