/** * $RCSfile: ,v $ * $Revision: $ * $Date: $ * * Copyright (C) 2004-2011 Jive Software. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.sparkplugin; import java.awt.Color; import java.awt.GridBagConstraints; import java.awt.Insets; import java.util.TimerTask; import javax.sip.message.Request; import javax.swing.UIManager; import net.java.sipmack.sip.Call; import net.java.sipmack.sip.SipRegisterStatus; import net.java.sipmack.sip.event.CallRejectedEvent; import net.java.sipmack.sip.event.CallStateEvent; import net.java.sipmack.sip.event.MessageEvent; import net.java.sipmack.sip.event.UnknownMessageEvent; import net.java.sipmack.softphone.SoftPhoneManager; import net.java.sipmack.softphone.VoiceMail; import net.java.sipmack.softphone.listeners.RegisterEvent; import net.java.sipmack.softphone.listeners.SoftPhoneListener; import org.jivesoftware.smack.ConnectionListener; import org.jivesoftware.smack.Roster; import org.jivesoftware.smack.RosterEntry; import org.jivesoftware.spark.SparkManager; import org.jivesoftware.spark.phone.PhoneManager; import org.jivesoftware.spark.plugin.Plugin; import org.jivesoftware.spark.plugin.phone.resource.PhoneRes; import org.jivesoftware.spark.util.SwingWorker; import org.jivesoftware.spark.util.TaskEngine; import org.jivesoftware.sparkplugin.preferences.SipCodecsPreference; import org.jivesoftware.sparkplugin.ui.ContactDialControl; import org.jivesoftware.sparkplugin.ui.RegistrationStatusPanel; import org.jivesoftware.sparkplugin.ui.TelephoneTextField; import org.jivesoftware.sparkplugin.ui.call.SoftPhoneTabHandler; /** * Title: Spark Phone * Description:JAIN-SIP Audio/Video phone application * * @author Thiago Rocha Camargo (thiago@jivesoftware.com) * <p/> * The <code>SoftPhonePlugin</code> class build and implements a Spark SIP * plugin * @version 1.0, 20/07/2006 */ public class SoftPhonePlugin implements Plugin, SoftPhoneListener { private SoftPhoneManager softPhone; private ContactDialControl dialControl; private RegistrationStatusPanel loadingPanel; private boolean isRegistered; /** * Called after Spark is loaded to initialize the new plugin. Load * Configuration from VCard and Instantiate a SoftPhoneManager */ public void initialize() { final SwingWorker initializeThread = new SwingWorker() { public Object construct() { PhoneManager.getInstance(); softPhone = SoftPhoneManager.getInstance(); return true; } public void finished() { if (softPhone.isPhoneEnabled()) { // Add TabHandler SparkManager.getChatManager().addSparkTabHandler(new SoftPhoneTabHandler()); initializeUI(); } SipCodecsPreference preference = new SipCodecsPreference(); SparkManager.getPreferenceManager().addPreference(preference); preference.load(); } }; initializeThread.start(); } private void initializeUI() { dialControl = new ContactDialControl(); dialControl.setVisible(false); // Add Dial control to main window SparkManager.getWorkspace().add(dialControl, new GridBagConstraints(0, 2, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(2, 4, 4, 4), 0, 0)); // Add Loading Panel loadingPanel = new RegistrationStatusPanel(); SparkManager.getWorkspace().add(loadingPanel, new GridBagConstraints(0, 3, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(2, 4, 4, 4), 0, 0)); loadingPanel.setVisible(false); softPhone.addSoftPhoneListener(this); SparkManager.getConnection().addConnectionListener(new ConnectionListener() { public void connectionClosed() { //softPhone.handleUnregisterRequest(); } public void connectionClosedOnError(Exception exception) { softPhone.handleUnregisterRequest(); } public void reconnectingIn(int i) { } public void reconnectionSuccessful() { // Wait a bit before registering TimerTask registerTask = new TimerTask() { public void run() { softPhone.register(); } }; TaskEngine.getInstance().schedule(registerTask, 15000); } public void reconnectionFailed(Exception exception) { } }); } /** * Called when Spark is shutting down to allow for persistence of * information or releasing of resources. Unregister from SIP Server */ public void shutdown() { if (softPhone.isPhoneEnabled()) { softPhone.getLogManager().commit(); softPhone.handleExitRequest(); SparkManager.getWorkspace().remove(loadingPanel); SparkManager.getWorkspace().remove(dialControl); } } /** * Return true if the Spark can shutdown on users request. * * @return true if Spark can shutdown on users request. */ public boolean canShutDown() { return true; } public void uninstall() { } /** * Fired when a message is received * * @param evt MessageEvent */ public void messageReceived(MessageEvent evt) { if (evt.getSource() instanceof Request) { Request request = (Request)evt.getSource(); if (request.getMethod().equals(Request.NOTIFY)) { VoiceMail vm = new VoiceMail(evt); dialControl.setVoiceMailLabel(vm.getUnread()); dialControl.setVoiceMailDescription("You have " + vm.getUnread() + " new voice mails."); } } } /** * Fired when an Unknow message is received * * @param evt UnknownMessageEvent */ public void receivedUnknownMessage(UnknownMessageEvent evt) { } /** * Fired when global status of SIP Registering changed * * @param evt RegisterEvent */ public void registerStatusChanged(RegisterEvent evt) { if (evt.getStatus() == SipRegisterStatus.Registered) { dialControl.setVisible(true); loadingPanel.setVisible(false); SparkManager.getWorkspace().getStatusBar().setDescriptiveText(softPhone.getSipAccount().getDisplayName()); if (!isRegistered) { loadVCards(); isRegistered = true; } } else if (evt.getStatus() == SipRegisterStatus.Unregistered) { dialControl.setVoiceMailLabel(""); dialControl.setVisible(false); loadingPanel.setVisible(false); SparkManager.getWorkspace().getStatusBar().setDescriptiveText(""); } else if (evt.getStatus() == SipRegisterStatus.Registering) { if (!loadingPanel.isVisible()) { dialControl.setVisible(false); loadingPanel.setVisible(true); loadingPanel.showRegistrationProgress(); } } else if (evt.getStatus() == SipRegisterStatus.RegistrationFailed) { loadingPanel.setVisible(true); dialControl.setVisible(false); loadingPanel.showRegistrationFailed(evt); } } /** * Perform some GUI Changes when call State Changes */ public void callStateChanged(CallStateEvent evt) { } /** * Handle invalid dialed numbers or NOT Found numbers * * @param evt the rejection Event */ public void callRejectedRemotely(CallRejectedEvent evt) { Call call = evt.getCall(); TelephoneTextField telephoneTextField = dialControl.getCallField(); telephoneTextField.setForeground((Color)UIManager.get("TextField.lightforeground")); telephoneTextField.setText(PhoneRes.getIString("phone.invalidnumber")+":" + call.getNumber()); } private void loadVCards() { // Load vCard information. final Roster roster = SparkManager.getConnection().getRoster(); for (RosterEntry entry : roster.getEntries()) { SparkManager.getVCardManager().getVCardFromMemory(entry.getUser()); } } }