SIP Servlet 示例之 Call Screen

Posted on Jul 23, 2006

Screening list: alice@server.test

呼叫流程:

sequenceDiagram Alice->>Server: INVITE Server-->>Alice: 603 DECLINE Bob->>Server: INVITE Server->>Foo: INVITE

Servlet 在 doRequest 方法中检查UA的URI是否在 Screening 列表中, 如果在, 返回 603 DECLINE 响应.

import java.io.IOException;
import java.util.*;
import javax.servlet.sip.*;
import javax.servlet.*;

public class CallScreen extends SipServlet {

	Collection m_screenings;

	SipFactory m_sipFactory;

	public void init() throws ServletException {
		m_screenings = new Vector();
		m_sipFactory = (SipFactory) getServletContext().getAttribute("javax.servlet.sip.SipFactory");

		Enumeration names = getInitParameterNames();
		if (names == null) {
			return;
		}
		while (names.hasMoreElements()) {
			String name = (String) names.nextElement();
			if (name.startsWith("screening-uri")) {
				String screeningURI = (String) getInitParameter(name);
				try {
					SipURI uri = (SipURI) m_sipFactory.createURI(screeningURI);
					m_screenings.add(uri);
				}
				catch (ServletException e) {
				}
			}
		}
	}

	public void doRequest(SipServletRequest req) throws IOException {
		SipURI from = (SipURI) req.getFrom().getURI();
		Iterator uris = m_screenings.iterator();
		while (uris.hasNext()) {
		SipURI uri = (SipURI) uris.next();
			if (uri.getHost().equals(from.getHost())) {
				SipServletResponse resp = req.createResponse(SipServletResponse.SC_DECLINE);
				try {
					resp.send();
				}
				catch (java.io.IOException e) {
				}
				return;
			}
		}
		log(req.toString());
		// ...
	}

	public void doResponse(SipServletResponse resp) throws IOException {
		log(resp.toString());
		// ...
	}

}