/**
* $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.sipaccount;
import org.jivesoftware.sparkplugin.calllog.LogPacket;
import net.java.sipmack.common.Log;
import net.java.sipmack.sip.SipRegisterStatus;
import org.jivesoftware.smack.PacketCollector;
import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.PacketIDFilter;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.provider.IQProvider;
import org.jivesoftware.smack.provider.ProviderManager;
import org.jivesoftware.smackx.ServiceDiscoveryManager;
import org.jivesoftware.smackx.packet.DiscoverItems;
import org.xmlpull.v1.XmlPullParser;
import java.util.Iterator;
public class SipAccountPacket extends IQ {
private SipAccount sipAccount;
private String content = "";
private Type type = Type.registration;
public SipAccountPacket() {
}
public SipAccountPacket(Type type) {
this.type = type;
}
public enum Type {
registration, status
}
/**
* Element name of the packet extension.
*/
public static final String NAME = "sipark";
/**
* Element name of the packet extension.
*/
public static final String ELEMENT_NAME = "phone";
/**
* Namespace of the packet extension.
*/
public static final String NAMESPACE = "http://www.jivesoftware.com/protocol/sipark";
public String getChildElementXML() {
StringBuilder buf = new StringBuilder();
buf.append("<").append(ELEMENT_NAME).append(" xmlns='").append(
NAMESPACE).append("'>");
buf.append("<").append(this.type.name()).append(">");
buf.append(content);
buf.append("</").append(this.type.name()).append(">");
buf.append("</").append(ELEMENT_NAME).append(">");
return buf.toString();
}
/**
* An IQProvider for SparkVersion packets.
*
* @author Derek DeMoro
*/
public static class Provider implements IQProvider {
public Provider() {
super();
}
public IQ parseIQ(XmlPullParser parser) throws Exception {
SipAccountPacket packet = new SipAccountPacket();
SipAccount sip = new SipAccount();
String type = parser.getAttributeValue("", "type");
if ("unregistered".equals(type)) {
return packet;
}
boolean done = false;
while (!done) {
int eventType = parser.next();
if (eventType == XmlPullParser.START_TAG) {
if (parser.getName().equals("username")) {
sip.setSipUsername(parser.nextText());
}
else if (parser.getName().equals("authUsername")) {
sip.setAuthUsername(parser.nextText());
}
else if (parser.getName().equals("displayPhoneNum")) {
sip.setDisplayName(parser.nextText());
}
else if (parser.getName().equals("password")) {
sip.setPassword(parser.nextText());
}
else if (parser.getName().equals("server")) {
sip.setServer(parser.nextText());
}
else if (parser.getName().equals("voicemail")) {
sip.setVoiceMailNumber(parser.nextText());
}
else if (parser.getName().equals("stunServer")) {
sip.setStunServer(parser.nextText());
}
else if (parser.getName().equals("useStun")) {
sip.setUseStun(Boolean.parseBoolean(parser.nextText()));
}
else if (parser.getName().equals("stunPort")) {
sip.setStunPort(parser.nextText());
}
else if (parser.getName().equals("enabled")) {
sip.setEnabled(Boolean.parseBoolean(parser.nextText()));
}
else if (parser.getName().equals("outboundproxy")) {
sip.setOutboundproxy(parser.nextText());
}
else if (parser.getName().equals("promptCredentials")) {
sip.setPromptCredentials(Boolean.parseBoolean(parser.nextText()));
}
}
else if (eventType == XmlPullParser.END_TAG) {
if (parser.getName().equals(ELEMENT_NAME)) {
done = true;
}
}
}
packet.setSipAcccount(sip);
return packet;
}
}
/**
* Returns the SIP Setting for the user.
*
* @param connection the XMPPConnection to use.
* @return the information for about the latest Spark Client.
* @throws XMPPException thrown if an exception occurs while retrieving Sip Settings.
*/
public static SipAccountPacket getSipSettings(XMPPConnection connection) throws XMPPException {
SipAccountPacket sp = new SipAccountPacket();
sp.setTo("sipark." + connection.getServiceName());
sp.setType(IQ.Type.GET);
PacketCollector collector = connection.createPacketCollector(new PacketIDFilter(sp.getPacketID()));
connection.sendPacket(sp);
SipAccountPacket response = (SipAccountPacket)collector.nextResult(SmackConfiguration.getPacketReplyTimeout());
// Cancel the collector.
collector.cancel();
if (response == null) {
throw new XMPPException("No response from server.");
}
if (response.getError() != null) {
throw new XMPPException(response.getError());
}
return response;
}
/**
* Sends the current SIP registering status.
*
* @param connection the XMPPConnection to use.
* @param register the current registration status.
* @throws XMPPException thrown if an exception occurs.
*/
public static void setSipRegisterStatus(XMPPConnection connection, SipRegisterStatus register) throws XMPPException {
if(!connection.isConnected()){
return;
}
SipAccountPacket sp = new SipAccountPacket(SipAccountPacket.Type.status);
sp.setTo("sipark." + connection.getServiceName());
sp.setType(IQ.Type.SET);
sp.setContent(register.name());
PacketCollector collector = connection
.createPacketCollector(new PacketIDFilter(sp.getPacketID()));
connection.sendPacket(sp);
SipAccountPacket response = (SipAccountPacket)collector
.nextResult(SmackConfiguration.getPacketReplyTimeout());
// Cancel the collector.
collector.cancel();
if (response == null) {
throw new XMPPException("No response from server.");
}
if (response.getError() != null) {
throw new XMPPException(response.getError());
}
}
/**
* Does a service discovery on the server to see if a SIPpark Manager is
* enabled.
*
* @param con the XMPPConnection to use.
* @return true if SIPpark Manager is available.
*/
public static boolean isSoftPhonePluginInstalled(XMPPConnection con) {
if (!con.isConnected()) {
return false;
}
ServiceDiscoveryManager disco = ServiceDiscoveryManager
.getInstanceFor(con);
try {
DiscoverItems items = disco.discoverItems(con.getServiceName());
Iterator<DiscoverItems.Item> iter = items.getItems();
while (iter.hasNext()) {
DiscoverItems.Item item = iter.next();
if ("SIP Controller".equals(item.getName())) {
Log.debug("SIP Controller Found");
return true;
}
}
}
catch (XMPPException e) {
Log.error("isSparkPluginInstalled", e);
}
return false;
}
public SipAccount getSipAccount() {
return sipAccount;
}
public void setSipAcccount(SipAccount sipAccount) {
this.sipAccount = sipAccount;
}
public String getContent() {
return content;
}
public void setContent(String content) {
if (this.type == Type.status) {
this.content = content;
}
}
public static void main(String args[]) throws Exception {
ProviderManager.getInstance().addIQProvider(SipAccountPacket.ELEMENT_NAME, SipAccountPacket.NAMESPACE, new SipAccountPacket.Provider());
ProviderManager.getInstance().addIQProvider(LogPacket.ELEMENT_NAME, LogPacket.NAMESPACE, new LogPacket.Provider());
XMPPConnection.DEBUG_ENABLED = true;
final XMPPConnection con = new XMPPConnection("anteros");
con.connect();
con.login("demo", "demo");
SipAccountPacket.getSipSettings(con);
System.out.println("HELLO");
}
}