package com.cari.voip.keyboard.soft.views; import java.util.Timer; import java.util.TimerTask; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.part.ViewPart; import com.cari.voip.keyboard.soft.Activator; import com.cari.voip.keyboard.soft.model.switchUsers.SwitchUsersSession; import com.cari.voip.keyboard.stack.CCKPConnection; import com.cari.voip.keyboard.stack.ConnectionListener; import com.cari.voip.keyboard.stack.events.Packet; import com.cari.voip.keyboard.stack.events.PacketFilter; import com.cari.voip.keyboard.stack.events.TrapEventListener; public class CallProgressView extends ViewPart { public static final String ID_VIEW = "com.cari.voip.keyboard.soft.views.CallProgressView"; private Table table; private Timer timer = new Timer(); private TimerTask ttask; private boolean isTimerRunning; final Object lock = new Object(); //private List revealListeners = null; private TrapEventListener progresslistener; private TrapEventListener answerlistener; private TrapEventListener hanguplistener; private ConnectionListener connectionListener; //private final int MaxItemsNum = 50; private boolean isRestarted; public CallProgressView(){ super(); isRestarted = false; isTimerRunning = false; this.ttask = new TimerTask(){ public void run(){ Activator.getDisplay().asyncExec(new Runnable() { public void run() { refreshTime(); } }); } }; this.hanguplistener = new TrapEventListener(){ public void processTrap(final Packet event){ //revealListeners.add(event); Activator.getDisplay().asyncExec(new Runnable() { public void run() { if(table != null && event != null){ String caller_id_number = (String) event.getProperty("caller_id_number"); String caller_id_name = (String) event.getProperty("caller_id_name"); String uuid = (String) event.getProperty("uuid"); if(caller_id_number != null && uuid != null){ synchronized(lock) { int rows = table.getItemCount(); int idx = -1; TableItem item; for(int i = 0; i< rows; i++){ item = table.getItem(i); if(item.getText(0).equals(uuid)){ idx = i; } } if(idx >=0){ table.remove(idx); } idx = table.getItemCount(); if(idx > 0){ table.setTopIndex(table.getItemCount()-1); } } } } } }); } }; this.answerlistener = new TrapEventListener(){ public void processTrap(final Packet event){ //revealListeners.add(event); Activator.getDisplay().asyncExec(new Runnable() { public void run() { if(table != null && event != null){ String caller_id_number = (String) event.getProperty("caller_id_number"); String caller_id_name = (String) event.getProperty("caller_id_name"); String uuid = (String) event.getProperty("uuid"); if(caller_id_number != null && uuid != null){ synchronized(lock) { int rows = table.getItemCount(); int idx = -1; TableItem item =null; for(int i = 0; i< rows; i++){ item = table.getItem(i); if(item.getText(0).equals(uuid)){ idx = i; } } if(idx >=0){ item = table.getItem(idx); item.setText(2, "ͨ��"); item.setText(3, "0"); } else{ TableItem row = new TableItem(table,SWT.NONE); row.setText(new String[]{uuid,caller_id_number,"ͨ��","0"}); } idx = table.getItemCount(); if(idx > 0){ table.setTopIndex(table.getItemCount()-1); if(!isTimerRunning){ isTimerRunning= true; //ttask.cancel(); timer.scheduleAtFixedRate(ttask, 1000, 1000); } } } } } } }); } }; this.progresslistener = new TrapEventListener(){ public void processTrap(final Packet event){ //revealListeners.add(event); Activator.getDisplay().asyncExec(new Runnable() { public void run() { if(table != null && event != null){ String caller_id_number = (String) event.getProperty("caller_id_number"); String caller_id_name = (String) event.getProperty("caller_id_name"); String uuid = (String) event.getProperty("uuid"); if(caller_id_number != null && uuid != null){ synchronized(lock) { int rows = table.getItemCount(); int idx = -1; TableItem item =null; for(int i = 0; i< rows; i++){ item = table.getItem(i); if(item.getText(0).equals(uuid)){ idx = i; } } if(idx >=0){ item = table.getItem(idx); item.setText(2, "����"); item.setText(3, "0"); } else{ TableItem row = new TableItem(table,SWT.NONE); row.setText(new String[]{uuid,caller_id_number,"����","0"}); } idx = table.getItemCount(); if(idx > 0){ table.setTopIndex(table.getItemCount()-1); if(!isTimerRunning){ isTimerRunning= true; //ttask.cancel(); timer.scheduleAtFixedRate(ttask, 1000, 1000); } } } } } } }); } }; this.connectionListener = new ConnectionListener(){ //connectionListener = new ConnectionListener(){ public void connectionClosed(){ Activator.getDisplay().asyncExec(new Runnable() { public void run() { restartApp(); } }); } public void connectionClosedOnError(Exception e){ Activator.getDisplay().asyncExec(new Runnable() { public void run() { restartApp(); } }); } public void socketConnectSuccessful(){ } public void authenticationSuccessful(){ } }; } @Override public void createPartControl(Composite parent) { createTableViewer(parent); attachListener(); } private void createTableViewer(Composite parent) { table = new Table(parent, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); //table.setLayoutData(new GridData(GridData.FILL_BOTH)); table.setHeaderVisible(true); table.setLinesVisible(true); TableColumn uuid = new TableColumn(this.table,SWT.NONE); uuid.setText(""); //colEventType.setWidth(this.table.getSize().x/4); TableColumn number = new TableColumn(this.table,SWT.NONE); number.setText(" ���� "); //colEventContent.setWidth(this.table.getSize().x/4); TableColumn name = new TableColumn(this.table,SWT.NONE); name.setText(" ״̬ "); //colEventDiscription.setWidth(this.table.getSize().x-colEventType.getWidth()-colEventContent.getWidth()-1); TableColumn time = new TableColumn(this.table,SWT.NONE); time.setText("ʱ�䣨�룩"); number.pack(); name.pack(); time.pack(); } protected void refreshTime() { int rows = -1; TableItem item = null; synchronized (lock) { if (this.isTimerRunning) { try { if (table != null && (rows = table.getItemCount()) > 0) { for (int i = 0; i < rows; i++) { item = table.getItem(i); int t = 0; String tm = item.getText(3); t = Integer.parseInt(tm); t++; item.setText(3, String.valueOf(t)); } } } catch (Exception e) { } } } } private void attachListener() { SwitchUsersSession session = Activator.getSwitchUsersSession(); if(session != null){ CCKPConnection connection = session.getConnection(); if(connection != null){ connection.addConnectionListener(this.connectionListener); connection.addTrapEventListeners(this.progresslistener, new PacketFilter(){ public boolean accept(Packet packet){ boolean ret = false; if(packet.getPacketType() == Packet.TYPE_TRAP_CALL_DISPATCHER_PROGRESS){ ret = true; } return ret; } }); connection.addTrapEventListeners(this.answerlistener, new PacketFilter(){ public boolean accept(Packet packet){ boolean ret = false; if(packet.getPacketType() == Packet.TYPE_TRAP_CALL_DISPATCHER_ANSWER){ ret = true; } return ret; } }); connection.addTrapEventListeners(this.hanguplistener, new PacketFilter(){ public boolean accept(Packet packet){ boolean ret = false; if(packet.getPacketType() == Packet.TYPE_TRAP_CALL_DISPATCHER_HANGUP){ ret = true; } return ret; } }); if(!connection.isConnect()){ restartApp(); } } } } private void detachListener() { SwitchUsersSession session = Activator.getSwitchUsersSession(); if(session != null){ CCKPConnection connection = session.getConnection(); if(connection != null){ connection.removeTrapEventListeners(progresslistener); connection.removeTrapEventListeners(answerlistener); connection.removeTrapEventListeners(hanguplistener); connection.removeConnectionListener(connectionListener); } } } protected void restartApp(){ if(isRestarted) return; isRestarted = true; try{ synchronized(lock) { if(this.timer != null){ this.timer.cancel(); this.isTimerRunning = false; } } this.getSite().getPage().getWorkbenchWindow().getWorkbench().restart(); }catch(Exception e){ } } @Override public void setFocus() { // TODO Auto-generated method stub if(this.table != null){ this.table.setFocus(); } } public void dispose() { synchronized(lock) { if(this.timer != null){ this.timer.cancel(); this.isTimerRunning = false; } } detachListener(); super.dispose(); } }