package com.safemobile.services; import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; import com.safemobile.interfaces.ITCPListener; import com.safemobile.interfaces.TCPEvent; import com.safemobile.lib.OperationCodes; import com.safemobile.lib.SM; import com.safemobile.lib.TCPmsg; public class TCPmsgParser implements Runnable { public boolean run = true; private TCPmsg _msg; private static final List _listeners = new ArrayList<>(); private Thread TCPmsgParserThread; public TCPmsgParser() { TCPmsgParserThread = new Thread(this, "TCPmsgParserThread"); TCPmsgParserThread.start(); // (2) Start the thread. } public synchronized void addTCPListener( ITCPListener l ) { _listeners.add( l ); } public synchronized void removeTCPListener( ITCPListener l ) { _listeners.remove( l ); } public synchronized void clearITCPListeners() { _listeners.clear(); } private synchronized void _fireLoginEvent() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onLoginReceived(event); } } private synchronized void _fireGPSEvent() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onGPSReceived(event); } } private synchronized void _fireSMSEvent() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onSMSReceived(event); } } private synchronized void _fireLastSMSEvent() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onLastSMSsReceived(event); } } private synchronized void _fireVehEvent() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onVehiclesReceived(event); } } private synchronized void _fireNewSMS() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onNewSMSReceived(event); } } private synchronized void _fireSMSconfirm() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onSMSAckReceived(event); } } private synchronized void _fireLastPos() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onLastPositionsReceived(event); } } private synchronized void _fireRadioEvent() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onRadioMsgReceived(event); } } private synchronized void _fireHistPos() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onHistoryPositionsReceived(event); } } private synchronized void _fireHistCount() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onHistoryPositionsCountReceived(event); } } private synchronized void _fireAlarmList() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onAlarmsReceived(event); } } private synchronized void _fireAlarmACK() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onAlarmAckReceived(event); } } private synchronized void _fireAlarmLive() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.alarmLiveReceived(event); } } private synchronized void _fireRecordList() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onRecordingsListReceived(event); } } private synchronized void _fireRecordPlay() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onRecordingPlayReceived(event); } } private synchronized void _firePOLLEvent() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onPollReceived(event); } } private synchronized void _fireConnectionReplyEvent() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onConnectionReplyReceived(event); } } private synchronized void _fireContactsReceivedEvent() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onContactsListReceived(event); } } private synchronized void _fireRecordingsReceivedEvent() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onRecordingsListReceived(event); } } private synchronized void _fireTextMessagesReceivedEvent() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onTextMessagesListReceived(event); } } private synchronized void _fireRecordingPlayReceivedEvent() { TCPEvent event = new TCPEvent( this, _msg ); for (ITCPListener listener : _listeners) { listener.onRecordingPlayReceived(event); } } public static synchronized void _fireTCPConnectionDownEvent(boolean previuosWasConnectionUp) { for (ITCPListener listener : _listeners) { listener.onTCPConnectionDown(previuosWasConnectionUp); } } public static synchronized void _fireTCPConnectionUpEvent(boolean previuosWasConnectionUp) { for (ITCPListener listener : _listeners) { listener.onTCPConnectionUp(previuosWasConnectionUp); } } public static synchronized void _fireonTCPConnectionStatusEvent(boolean isConnectionUp, boolean previuosWasConnectionUp) { for (ITCPListener listener : _listeners) { listener.onTCPConnectionStatusReceived(isConnectionUp, previuosWasConnectionUp); } } public static synchronized void _firePONGReceivedEvent() { for (ITCPListener listener : _listeners) { listener.onPONGReceived(); } } @Override public void run() { while(run) { sleep(1); if (TCPhandler.msgList == null) continue; if(!TCPhandler.msgList.isEmpty()) { try { _msg = TCPhandler.msgList.poll(); if(_msg == null) continue; if(!_msg.OK) continue; //parse the rest of the message; switch(_msg.opCode) { case 40: /* login */{ _fireLoginEvent(); break; } case 41: /* vehicle */ { _fireVehEvent(); break; } case 42: /* Text Message */{ _fireSMSEvent(); break; } case 43: /* Last text message */ { _fireLastSMSEvent(); break; } case OperationCodes.TM_ACK: case OperationCodes.TM_ACK_SD: { _fireSMSconfirm(); break; } case OperationCodes.RECEIVED_TM:{ _fireNewSMS(); break; } case 45: /* last position */ { _fireLastPos(); break; } case 131: /* gps */ { _fireGPSEvent(); break; } case 231: /* pool */ { _firePOLLEvent(); break; } case 50: /* radio */ { _fireRadioEvent(); break; } case 46:{ _fireHistPos(); break; } case 86:{ _fireHistCount(); break; } case 47: /* alert list */ { _fireAlarmList(); break; } case 48: /* alert ack */ { _fireAlarmACK(); break; } case 49:{ _fireRecordList(); break; } case 38:{ _fireRecordPlay(); break; } case 135: case 136: case 137: case 138: case 140:{ _fireAlarmLive(); break; } case OperationCodes.PONG: { //_firePONGReceivedEvent(); break; } case OperationCodes.CONNECTION_REP: { _fireConnectionReplyEvent(); break; } case OperationCodes.CONTACTS_REP: { sleep(15); _fireContactsReceivedEvent(); break; } case OperationCodes.TM_LIST_REP: { _fireTextMessagesReceivedEvent(); break; } case OperationCodes.RECORDINGS_LIST_REP: { _fireRecordingsReceivedEvent(); break; } case OperationCodes.RECORDING_REP: { _fireRecordingPlayReceivedEvent(); break; } default: break; } } catch(Exception ex) { try { if(TCPhandler.msgList.size() > 0) _msg = TCPhandler.msgList.remove(0); } catch(NoSuchElementException exe) { SM.Exception("TCP msg Parser", "NoSuchElementException"); } } } } SM.Debug("TCPmsgParser listen thread stoped."); } private void sleep(int miliseconds) { try { Thread.sleep(miliseconds); } catch (InterruptedException ignored) { } } public void clearMsgList() { TCPhandler.msgList.clear(); } public void Stop() { run = false; // stop thread if(TCPmsgParserThread != null) { Thread moribund = TCPmsgParserThread; TCPmsgParserThread = null; moribund.interrupt(); } SM.Debug("Stoping TCPmsgParser"); } }