package org.mobicents.sip.phone.views; import java.util.Hashtable; import net.java.sip.communicator.impl.protocol.sip.ProtocolProviderServiceSipImpl; import net.java.sip.communicator.impl.protocol.sip.SipActivator; import net.java.sip.communicator.impl.protocol.sip.SipStackSharing; import net.java.sip.communicator.service.protocol.Call; import net.java.sip.communicator.service.protocol.CallParticipant; import net.java.sip.communicator.service.protocol.CallState; import net.java.sip.communicator.service.protocol.OperationFailedException; import net.java.sip.communicator.service.protocol.OperationSetBasicTelephony; import net.java.sip.communicator.service.protocol.ProtocolProviderService; import net.java.sip.communicator.service.protocol.RegistrationState; import net.java.sip.communicator.service.protocol.event.CallChangeEvent; import net.java.sip.communicator.service.protocol.event.CallChangeListener; import net.java.sip.communicator.service.protocol.event.CallParticipantEvent; import net.java.sip.communicator.service.protocol.event.RegistrationStateChangeEvent; import net.java.sip.communicator.service.protocol.event.RegistrationStateChangeListener; import net.java.sip.communicator.util.Logger; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.RowData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Scale; import org.eclipse.swt.widgets.Text; public class PhoneControls extends Composite{ private static final Logger logger = Logger.getLogger(PhoneControls.class); private SipPhoneView sipPhoneView; public PhoneControls(Composite parent, int style) { super(parent, style); Composite group = new Composite(parent, SWT.NONE); //group.setText("Call control"); GridLayout grid = new GridLayout(2, false); group.setLayout(grid); GridData cellWidthGridHint = new GridData(); cellWidthGridHint.grabExcessHorizontalSpace = true; cellWidthGridHint.minimumWidth = 180; new Label(group, SWT.NONE).setText("Server"); final Text server = new Text(group, SWT.BORDER); server.setText("127.0.0.1"); server.setLayoutData(cellWidthGridHint); new Label(group, SWT.NONE).setText("Server Port"); final Text port = new Text(group, SWT.BORDER); port.setText("5080"); port.setLayoutData(cellWidthGridHint); new Label(group, SWT.NONE).setText("Local SIP Port"); final Text sipPort = new Text(group, SWT.BORDER); sipPort.setText("5060"); sipPort.setLayoutData(cellWidthGridHint); new Label(group, SWT.NONE).setText("Dial URI"); final Text uri = new Text(group, SWT.BORDER); uri.setText("sip:server@127.0.0.1:5080"); uri.setLayoutData(cellWidthGridHint); final Button registerButton = new Button(group, SWT.NONE); //registerButton.setLayoutData(new RowData(100, 50)); // Eclipse crashes wow final Button callButton = new Button(group, SWT.NONE); final Label callState = new Label(group, SWT.NONE); callState.setText("Not registered"); callButton.setEnabled(false); //callButton.setLayoutData(new RowData(100, 50)); registerButton.setText("Register "); // Register button behaviour registerButton.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { SipCommunicatorOSGIBootstrap sipCommunicator = sipPhoneView.getSipCommunicator(); ProtocolProviderService service = sipCommunicator.getProtocolProviderService(); if(event.widget == registerButton) { try { // If we are already registered at the server, pressing this button again // must unregister us if(service != null && service.isRegistered()) { service.unregister(); } else { // Otherwsie proceed with regular registration Hashtable props = SipCommunicatorOSGIBootstrap.createSipAccountProperties("user", "display", "pass", server.getText(), port.getText(), server.getText(), port.getText()); // Reset the service if(service != null) { service.shutdown(); service = null; System.gc(); } // If successful do new initialization if(service == null) { SipActivator.getConfigurationService(). setProperty(SipStackSharing.PREFERRED_CLEAR_PORT_PROPERTY_NAME, sipPort.getText()); sipCommunicator.setUp(props); service = sipCommunicator.getProtocolProviderService(); } service.addRegistrationStateChangeListener( new RegistrationStateChangeListener() { @Override public void registrationStateChanged(final RegistrationStateChangeEvent evt) { getDisplay().asyncExec(new Runnable() { public void run() { callState.setText(evt.getNewState().getStateName()); if(evt.getNewState().equals(RegistrationState.REGISTERED)) { callButton.setEnabled(true); registerButton.setText("Unregister"); } else if(evt.getNewState().equals(RegistrationState.UNREGISTERED)){ registerButton.setText("Register"); callButton.setEnabled(false); } } }); } }); service.register(new SecurityAuthorityImpl("pass".toCharArray())); } } catch (OperationFailedException e) { logger.error(e); } } } }); // Call button behaviour callButton.setText("Call"); callButton.addListener(SWT.Selection, new Listener() { CallParticipant remoteSide; @Override public void handleEvent(Event event) { try { OperationSetBasicTelephony telephony = (OperationSetBasicTelephony) sipPhoneView.getSipCommunicator().getProtocolProviderService().getOperationSet( OperationSetBasicTelephony.class); if(remoteSide != null) { telephony.hangupCallParticipant(remoteSide); } else { String address = uri.getText(); Call sipCall = telephony.createCall(address); sipCall.addCallChangeListener(new CallChangeListener() { @Override public void callParticipantAdded( final CallParticipantEvent evt) { } @Override public void callParticipantRemoved( final CallParticipantEvent evt) { } @Override public void callStateChanged(final CallChangeEvent evt) { getDisplay().asyncExec(new Runnable() { @Override public void run() { logger.info("callStateChanged"); Object obj = evt.getNewValue(); if(obj instanceof CallState) { CallState cs = (CallState) obj; if(!cs.equals(CallState.CALL_ENDED)) { logger.info("Establishing a call"); remoteSide = evt.getSourceCall().getCallParticipants().next(); sipPhoneView.getKeypad().setRemoteSide(remoteSide); callButton.setText("End"); } else { logger.info("Ending call"); callButton.setText("Call"); remoteSide = null; sipPhoneView.getKeypad().setRemoteSide(null); } callState.setText(cs.getStateString()); } } }); } }); } } catch (Exception e) { logger.error(e); } } }); } public SipPhoneView getSipPhoneView() { return sipPhoneView; } public void setSipPhoneView(SipPhoneView sipPhoneView) { this.sipPhoneView = sipPhoneView; } }