1600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/*
2600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Conditions Of Use
3600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
4600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This software was developed by employees of the National Institute of
5600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Standards and Technology (NIST), an agency of the Federal Government.
6600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Pursuant to title 15 Untied States Code Section 105, works of NIST
7600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * employees are not subject to copyright protection in the United States
8600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * and are considered to be in the public domain.  As a result, a formal
9600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * license is not needed to use the software.
10600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
11600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This software is provided by NIST as a service and is expressly
12600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
13600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
14600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
15600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * AND DATA ACCURACY.  NIST does not warrant or make any representations
16600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * regarding the use of the software or the results thereof, including but
17600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * not limited to the correctness, accuracy, reliability or usefulness of
18600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * the software.
19600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
20600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Permission to use this software is contingent upon your acceptance
21600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * of the terms of this agreement
22600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
23600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * .
24600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */
26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/*******************************************************************************
27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Product of NIST/ITL Advanced Networking Technologies Division (ANTD).        *
28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *******************************************************************************/
29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpackage gov.nist.javax.sip.message;
30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.text.ParseException;
32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.header.*;
33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.LinkedList;
35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.List;
36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.header.*;
37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.message.*;
39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.address.*;
40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.parser.*;
41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/**
43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Message Factory implementation
44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @version 1.2 $Revision: 1.23 $ $Date: 2009/09/08 01:58:40 $
46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @since 1.1
47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @author M. Ranganathan <br/>
49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @author Olivier Deruelle <br/>
50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */
52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang@SuppressWarnings("unchecked")
53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic class MessageFactoryImpl implements MessageFactory, MessageFactoryExt {
54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private boolean testing = false;
56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private boolean strict  = true;
58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private static String defaultContentEncodingCharset = "UTF-8";
60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /*
63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * The UserAgent header to include for all requests created from this message factory.
64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private static UserAgentHeader userAgent;
66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /*
68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * The Server header to include
69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private static ServerHeader server;
71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setStrict(boolean strict) {
74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.strict = strict;
75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * This is for testing -- allows you to generate invalid requests
81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setTest(boolean flag) {
83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.testing = flag;
84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Creates a new instance of MessageFactoryImpl
88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public MessageFactoryImpl() {
90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Creates a new Request message of type specified by the method paramater,
94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * containing the URI of the Request, the mandatory headers of the message
95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * with a body in the form of a Java object and the body content type.
96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param requestURI -
98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new URI object of the requestURI value of this Message.
99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param method -
100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new string of the method value of this Message.
101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param callId -
102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new CallIdHeader object of the callId value of this
103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            Message.
104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param cSeq -
105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new CSeqHeader object of the cSeq value of this Message.
106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param from -
107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new FromHeader object of the from value of this Message.
108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param to -
109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new ToHeader object of the to value of this Message.
110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param via -
111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new List object of the ViaHeaders of this Message.
112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param content -
113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new Object of the body content value of this Message.
114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param contentType -
115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new ContentTypeHeader object of the content type value of
116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            this Message.
117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws ParseException
118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             which signals that an error has been reached unexpectedly
119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             while parsing the method or the body.
120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Request createRequest(javax.sip.address.URI requestURI,
122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            String method, CallIdHeader callId, CSeqHeader cSeq,
123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            FromHeader from, ToHeader to, List via,
124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            MaxForwardsHeader maxForwards, ContentTypeHeader contentType,
125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            Object content) throws ParseException {
126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (requestURI == null || method == null || callId == null
127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || cSeq == null || from == null || to == null || via == null
128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || maxForwards == null || content == null
129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || contentType == null)
130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new NullPointerException("Null parameters");
131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SIPRequest sipRequest = new SIPRequest();
133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setRequestURI(requestURI);
134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setMethod(method);
135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setCallId(callId);
136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setCSeq(cSeq);
137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setFrom(from);
138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setTo(to);
139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setVia(via);
140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setMaxForwards(maxForwards);
141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setContent(content, contentType);
142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if ( userAgent != null ) {
143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            sipRequest.setHeader(userAgent);
144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return sipRequest;
147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Creates a new Request message of type specified by the method paramater,
151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * containing the URI of the Request, the mandatory headers of the message
152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * with a body in the form of a byte array and body content type.
153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param requestURI -
155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new URI object of the requestURI value of this Message.
156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param method -
157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new string of the method value of this Message.
158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param callId -
159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new CallIdHeader object of the callId value of this
160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            Message.
161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param cSeq -
162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new CSeqHeader object of the cSeq value of this Message.
163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param from -
164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new FromHeader object of the from value of this Message.
165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param to -
166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new ToHeader object of the to value of this Message.
167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param via -
168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new List object of the ViaHeaders of this Message.
169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param content -
170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new byte array of the body content value of this Message.
171600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param contentType -
172600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new ContentTypeHeader object of the content type value of
173600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            this Message.
174600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws ParseException
175600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             which signals that an error has been reached unexpectedly
176600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             while parsing the method or the body.
177600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
178600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Request createRequest(URI requestURI, String method,
179600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            CallIdHeader callId, CSeqHeader cSeq, FromHeader from, ToHeader to,
180600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            List via, MaxForwardsHeader maxForwards, byte[] content,
181600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ContentTypeHeader contentType) throws ParseException {
182600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (requestURI == null || method == null || callId == null
183600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || cSeq == null || from == null || to == null || via == null
184600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || maxForwards == null || content == null
185600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || contentType == null)
186600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new ParseException(
187600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    "JAIN-SIP Exception, some parameters are missing"
188600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            + ", unable to create the request", 0);
189600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
190600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SIPRequest sipRequest = new SIPRequest();
191600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setRequestURI(requestURI);
192600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setMethod(method);
193600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setCallId(callId);
194600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setCSeq(cSeq);
195600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setFrom(from);
196600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setTo(to);
197600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setVia(via);
198600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setMaxForwards(maxForwards);
199600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setHeader((ContentType) contentType);
200600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setMessageContent(content);
201600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if ( userAgent != null ) {
202600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            sipRequest.setHeader(userAgent);
203600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
204600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return sipRequest;
205600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
206600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
207600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
208600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Creates a new Request message of type specified by the method paramater,
209600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * containing the URI of the Request, the mandatory headers of the message.
210600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * This new Request does not contain a body.
211600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
212600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param requestURI -
213600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new URI object of the requestURI value of this Message.
214600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param method -
215600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new string of the method value of this Message.
216600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param callId -
217600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new CallIdHeader object of the callId value of this
218600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            Message.
219600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param cSeq -
220600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new CSeqHeader object of the cSeq value of this Message.
221600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param from -
222600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new FromHeader object of the from value of this Message.
223600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param to -
224600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new ToHeader object of the to value of this Message.
225600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param via -
226600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new List object of the ViaHeaders of this Message.
227600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws ParseException
228600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             which signals that an error has been reached unexpectedly
229600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             while parsing the method.
230600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
231600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Request createRequest(URI requestURI, String method,
232600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            CallIdHeader callId, CSeqHeader cSeq, FromHeader from, ToHeader to,
233600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            List via, MaxForwardsHeader maxForwards) throws ParseException {
234600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (requestURI == null || method == null || callId == null
235600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || cSeq == null || from == null || to == null || via == null
236600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || maxForwards == null)
237600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new ParseException(
238600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    "JAIN-SIP Exception, some parameters are missing"
239600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            + ", unable to create the request", 0);
240600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
241600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SIPRequest sipRequest = new SIPRequest();
242600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setRequestURI(requestURI);
243600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setMethod(method);
244600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setCallId(callId);
245600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setCSeq(cSeq);
246600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setFrom(from);
247600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setTo(to);
248600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setVia(via);
249600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setMaxForwards(maxForwards);
250600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (userAgent != null) {
251600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            sipRequest.setHeader(userAgent);
252600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
253600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
254600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return sipRequest;
255600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
256600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
257600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    // Standard Response Creation methods
258600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
259600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
260600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Creates a new Response message of type specified by the statusCode
261600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * paramater, containing the mandatory headers of the message with a body in
262600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * the form of a Java object and the body content type.
263600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
264600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param statusCode -
265600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new integer of the statusCode value of this Message.
266600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param callId -
267600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new CallIdHeader object of the callId value of this
268600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            Message.
269600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param cSeq -
270600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new CSeqHeader object of the cSeq value of this Message.
271600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param from -
272600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new FromHeader object of the from value of this Message.
273600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param to -
274600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new ToHeader object of the to value of this Message.
275600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param via -
276600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new List object of the ViaHeaders of this Message.
277600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param content -
278600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new Object of the body content value of this Message.
279600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param contentType -
280600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new ContentTypeHeader object of the content type value of
281600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            this Message.
282600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws ParseException
283600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             which signals that an error has been reached unexpectedly
284600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             while parsing the statusCode or the body.
285600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
286600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Response createResponse(int statusCode, CallIdHeader callId,
287600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            CSeqHeader cSeq, FromHeader from, ToHeader to, List via,
288600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            MaxForwardsHeader maxForwards, Object content,
289600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ContentTypeHeader contentType) throws ParseException {
290600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (callId == null || cSeq == null || from == null || to == null
291600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || via == null || maxForwards == null || content == null
292600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || contentType == null)
293600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new NullPointerException(" unable to create the response");
294600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
295600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SIPResponse sipResponse = new SIPResponse();
296600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        StatusLine statusLine = new StatusLine();
297600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        statusLine.setStatusCode(statusCode);
298600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        String reasonPhrase = SIPResponse.getReasonPhrase(statusCode);
299600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        //if (reasonPhrase == null)
300600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        //  throw new ParseException(statusCode + " Unkown  ", 0);
301600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        statusLine.setReasonPhrase(reasonPhrase);
302600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setStatusLine(statusLine);
303600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setCallId(callId);
304600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setCSeq(cSeq);
305600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setFrom(from);
306600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setTo(to);
307600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setVia(via);
308600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setMaxForwards(maxForwards);
309600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setContent(content, contentType);
310600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (userAgent != null) {
311600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            sipResponse.setHeader(userAgent);
312600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
313600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return sipResponse;
314600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
315600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
316600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
317600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Creates a new Response message of type specified by the statusCode
318600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * paramater, containing the mandatory headers of the message with a body in
319600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * the form of a byte array and the body content type.
320600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
321600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param statusCode -
322600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new integer of the statusCode value of this Message.
323600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param callId -
324600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new CallIdHeader object of the callId value of this
325600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            Message.
326600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param cSeq -
327600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new CSeqHeader object of the cSeq value of this Message.
328600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param from -
329600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new FromHeader object of the from value of this Message.
330600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param to -
331600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new ToHeader object of the to value of this Message.
332600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param via -
333600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new List object of the ViaHeaders of this Message.
334600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param content -
335600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new byte array of the body content value of this Message.
336600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param contentType -
337600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new ContentTypeHeader object of the content type value of
338600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            this Message.
339600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws ParseException
340600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             which signals that an error has been reached unexpectedly
341600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             while parsing the statusCode or the body.
342600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
343600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Response createResponse(int statusCode, CallIdHeader callId,
344600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            CSeqHeader cSeq, FromHeader from, ToHeader to, List via,
345600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            MaxForwardsHeader maxForwards, byte[] content,
346600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ContentTypeHeader contentType) throws ParseException {
347600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (callId == null || cSeq == null || from == null || to == null
348600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || via == null || maxForwards == null || content == null
349600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || contentType == null)
350600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new NullPointerException("Null params ");
351600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
352600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SIPResponse sipResponse = new SIPResponse();
353600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setStatusCode(statusCode);
354600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setCallId(callId);
355600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setCSeq(cSeq);
356600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setFrom(from);
357600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setTo(to);
358600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setVia(via);
359600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setMaxForwards(maxForwards);
360600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setHeader((ContentType) contentType);
361600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setMessageContent(content);
362600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (userAgent != null) {
363600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            sipResponse.setHeader(userAgent);
364600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
365600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return sipResponse;
366600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
367600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
368600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
369600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Creates a new Response message of type specified by the statusCode
370600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * paramater, containing the mandatory headers of the message. This new
371600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Response does not contain a body.
372600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
373600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param statusCode -
374600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new integer of the statusCode value of this Message.
375600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param callId -
376600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new CallIdHeader object of the callId value of this
377600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            Message.
378600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param cSeq -
379600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new CSeqHeader object of the cSeq value of this Message.
380600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param from -
381600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new FromHeader object of the from value of this Message.
382600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param to -
383600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new ToHeader object of the to value of this Message.
384600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param via -
385600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new List object of the ViaHeaders of this Message.
386600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws ParseException
387600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             which signals that an error has been reached unexpectedly
388600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             while parsing the statusCode.
389600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
390600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Response createResponse(int statusCode, CallIdHeader callId,
391600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            CSeqHeader cSeq, FromHeader from, ToHeader to, List via,
392600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            MaxForwardsHeader maxForwards) throws ParseException {
393600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (callId == null || cSeq == null || from == null || to == null
394600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || via == null || maxForwards == null)
395600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new ParseException(
396600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    "JAIN-SIP Exception, some parameters are missing"
397600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            + ", unable to create the response", 0);
398600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
399600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SIPResponse sipResponse = new SIPResponse();
400600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setStatusCode(statusCode);
401600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setCallId(callId);
402600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setCSeq(cSeq);
403600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setFrom(from);
404600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setTo(to);
405600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setVia(via);
406600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setMaxForwards(maxForwards);
407600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (userAgent != null) {
408600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            sipResponse.setHeader(userAgent);
409600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
410600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return sipResponse;
411600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
412600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
413600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    // Response Creation methods based on a Request
414600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
415600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
416600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Creates a new Response message of type specified by the statusCode
417600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * paramater, based on a specific Request with a new body in the form of a
418600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Java object and the body content type.
419600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
420600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param statusCode -
421600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new integer of the statusCode value of this Message.
422600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param request -
423600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the received Reqest object upon which to base the Response.
424600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param content -
425600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new Object of the body content value of this Message.
426600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param contentType -
427600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new ContentTypeHeader object of the content type value of
428600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            this Message.
429600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws ParseException
430600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             which signals that an error has been reached unexpectedly
431600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             while parsing the statusCode or the body.
432600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
433600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Response createResponse(int statusCode, Request request,
434600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ContentTypeHeader contentType, Object content)
435600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throws ParseException {
436600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (request == null || content == null || contentType == null)
437600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new NullPointerException("null parameters");
438600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
439600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SIPRequest sipRequest = (SIPRequest) request;
440600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SIPResponse sipResponse = sipRequest.createResponse(statusCode);
441600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setContent(content, contentType);
442600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (server != null) {
443600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            sipResponse.setHeader(server);
444600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
445600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return sipResponse;
446600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
447600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
448600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
449600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Creates a new Response message of type specified by the statusCode
450600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * paramater, based on a specific Request with a new body in the form of a
451600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * byte array and the body content type.
452600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
453600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param statusCode -
454600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new integer of the statusCode value of this Message.
455600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param request -
456600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the received Reqest object upon which to base the Response.
457600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param content -
458600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new byte array of the body content value of this Message.
459600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param contentType -
460600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new ContentTypeHeader object of the content type value of
461600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            this Message.
462600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws ParseException
463600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             which signals that an error has been reached unexpectedly
464600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             while parsing the statusCode or the body.
465600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
466600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Response createResponse(int statusCode, Request request,
467600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ContentTypeHeader contentType, byte[] content)
468600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throws ParseException {
469600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (request == null || content == null || contentType == null)
470600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new NullPointerException("null Parameters");
471600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
472600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SIPRequest sipRequest = (SIPRequest) request;
473600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SIPResponse sipResponse = sipRequest.createResponse(statusCode);
474600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setHeader((ContentType) contentType);
475600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setMessageContent(content);
476600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (server != null) {
477600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            sipResponse.setHeader(server);
478600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
479600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return sipResponse;
480600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
481600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
482600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
483600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Creates a new Response message of type specified by the statusCode
484600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * paramater, based on a specific Request message. This new Response does
485600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * not contain a body.
486600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
487600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param statusCode -
488600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new integer of the statusCode value of this Message.
489600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param request -
490600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the received Reqest object upon which to base the Response.
491600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws ParseException
492600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             which signals that an error has been reached unexpectedly
493600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             while parsing the statusCode.
494600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
495600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Response createResponse(int statusCode, Request request)
496600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throws ParseException {
497600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (request == null)
498600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new NullPointerException("null parameters");
499600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
500600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        // if (LogWriter.needsLogging)
501600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        // LogWriter.logMessage("createResponse " + request);
502600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
503600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SIPRequest sipRequest = (SIPRequest) request;
504600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SIPResponse sipResponse = sipRequest.createResponse(statusCode);
505600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        // Remove the content from the message (Bug report from
506600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        // Antonis Karydas.
507600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.removeContent();
508600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.removeHeader(ContentTypeHeader.NAME);
509600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (server != null) {
510600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            sipResponse.setHeader(server);
511600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
512600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return sipResponse;
513600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
514600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
515600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
516600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Creates a new Request message of type specified by the method paramater,
517600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * containing the URI of the Request, the mandatory headers of the message
518600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * with a body in the form of a byte array and body content type.
519600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
520600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param requestURI -
521600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new URI object of the requestURI value of this Message.
522600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param method -
523600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new string of the method value of this Message.
524600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param callId -
525600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new CallIdHeader object of the callId value of this
526600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            Message.
527600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param cSeq -
528600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new CSeqHeader object of the cSeq value of this Message.
529600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param from -
530600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new FromHeader object of the from value of this Message.
531600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param to -
532600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new ToHeader object of the to value of this Message.
533600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param via -
534600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new List object of the ViaHeaders of this Message.
535600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param contentType -
536600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new ContentTypeHeader object of the content type value of
537600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            this Message.
538600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param content -
539600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new byte array of the body content value of this Message.
540600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws ParseException
541600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             which signals that an error has been reached unexpectedly
542600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             while parsing the method or the body.
543600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
544600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Request createRequest(javax.sip.address.URI requestURI,
545600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            String method, CallIdHeader callId, CSeqHeader cSeq,
546600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            FromHeader from, ToHeader to, List via,
547600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            MaxForwardsHeader maxForwards, ContentTypeHeader contentType,
548600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            byte[] content) throws ParseException {
549600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (requestURI == null || method == null || callId == null
550600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || cSeq == null || from == null || to == null || via == null
551600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || maxForwards == null || content == null
552600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || contentType == null)
553600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new NullPointerException("missing parameters");
554600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
555600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SIPRequest sipRequest = new SIPRequest();
556600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setRequestURI(requestURI);
557600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setMethod(method);
558600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setCallId(callId);
559600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setCSeq(cSeq);
560600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setFrom(from);
561600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setTo(to);
562600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setVia(via);
563600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setMaxForwards(maxForwards);
564600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipRequest.setContent(content, contentType);
565600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (userAgent != null) {
566600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            sipRequest.setHeader(userAgent);
567600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
568600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return sipRequest;
569600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
570600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
571600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
572600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Creates a new Response message of type specified by the statusCode
573600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * paramater, containing the mandatory headers of the message with a body in
574600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * the form of a Java object and the body content type.
575600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
576600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param statusCode
577600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new integer of the statusCode value of this Message.
578600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param callId
579600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new CallIdHeader object of the callId value of this
580600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            Message.
581600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param cSeq
582600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new CSeqHeader object of the cSeq value of this Message.
583600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param from
584600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new FromHeader object of the from value of this Message.
585600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param to
586600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new ToHeader object of the to value of this Message.
587600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param via
588600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new List object of the ViaHeaders of this Message.
589600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param contentType
590600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new ContentTypeHeader object of the content type value of
591600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            this Message.
592600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param content
593600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new Object of the body content value of this Message.
594600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws ParseException
595600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             which signals that an error has been reached unexpectedly
596600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             while parsing the statusCode or the body.
597600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
598600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Response createResponse(int statusCode, CallIdHeader callId,
599600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            CSeqHeader cSeq, FromHeader from, ToHeader to, List via,
600600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            MaxForwardsHeader maxForwards, ContentTypeHeader contentType,
601600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            Object content) throws ParseException {
602600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (callId == null || cSeq == null || from == null || to == null
603600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || via == null || maxForwards == null || content == null
604600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || contentType == null)
605600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new NullPointerException("missing parameters");
606600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SIPResponse sipResponse = new SIPResponse();
607600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        StatusLine statusLine = new StatusLine();
608600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        statusLine.setStatusCode(statusCode);
609600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        String reason = SIPResponse.getReasonPhrase(statusCode);
610600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (reason == null)
611600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new ParseException(statusCode + " Unknown", 0);
612600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        statusLine.setReasonPhrase(reason);
613600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setStatusLine(statusLine);
614600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setCallId(callId);
615600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setCSeq(cSeq);
616600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setFrom(from);
617600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setTo(to);
618600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setVia(via);
619600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setContent(content, contentType);
620600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if ( userAgent != null) {
621600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            sipResponse.setHeader(userAgent);
622600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
623600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return sipResponse;
624600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
625600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
626600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
627600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
628600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Creates a new Response message of type specified by the statusCode
629600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * paramater, containing the mandatory headers of the message with a body in
630600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * the form of a byte array and the body content type.
631600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
632600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param statusCode
633600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new integer of the statusCode value of this Message.
634600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param callId
635600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new CallIdHeader object of the callId value of this
636600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            Message.
637600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param cSeq
638600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new CSeqHeader object of the cSeq value of this Message.
639600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param from
640600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new FromHeader object of the from value of this Message.
641600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param to
642600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new ToHeader object of the to value of this Message.
643600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param via
644600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new List object of the ViaHeaders of this Message.
645600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param contentType
646600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new ContentTypeHeader object of the content type value of
647600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            this Message.
648600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param content
649600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the new byte array of the body content value of this Message.
650600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws ParseException
651600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             which signals that an error has been reached unexpectedly
652600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *             while parsing the statusCode or the body.
653600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
654600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Response createResponse(int statusCode, CallIdHeader callId,
655600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            CSeqHeader cSeq, FromHeader from, ToHeader to, List via,
656600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            MaxForwardsHeader maxForwards, ContentTypeHeader contentType,
657600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            byte[] content) throws ParseException {
658600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (callId == null || cSeq == null || from == null || to == null
659600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || via == null || maxForwards == null || content == null
660600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                || contentType == null)
661600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new NullPointerException("missing parameters");
662600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SIPResponse sipResponse = new SIPResponse();
663600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        StatusLine statusLine = new StatusLine();
664600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        statusLine.setStatusCode(statusCode);
665600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        String reason = SIPResponse.getReasonPhrase(statusCode);
666600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (reason == null)
667600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new ParseException(statusCode + " : Unknown", 0);
668600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        statusLine.setReasonPhrase(reason);
669600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setStatusLine(statusLine);
670600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setCallId(callId);
671600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setCSeq(cSeq);
672600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setFrom(from);
673600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setTo(to);
674600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setVia(via);
675600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipResponse.setContent(content, contentType);
676600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if ( userAgent != null) {
677600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            sipResponse.setHeader(userAgent);
678600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
679600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return sipResponse;
680600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
681600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
682600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
683600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Create a request from a string. Conveniance method for UACs that want to
684600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * create an outgoing request from a string. Only the headers of the request
685600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * should be included in the String that is supplied to this method.
686600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
687600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param requestString --
688600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            string from which to create the message null string returns an
689600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            empty message.
690600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
691600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public javax.sip.message.Request createRequest(String requestString)
692600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throws java.text.ParseException {
693600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (requestString == null || requestString.equals("")) {
694600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            SIPRequest retval = new SIPRequest();
695600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            retval.setNullRequest();
696600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return retval;
697600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
698600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
699600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        StringMsgParser smp = new StringMsgParser();
700600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        smp.setStrict(this.strict);
701600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
702600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        /*
703600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang         * This allows you to catch parse exceptions and create invalid messages
704600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang         * if you want.
705600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang         */
706600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        ParseExceptionListener parseExceptionListener = new ParseExceptionListener() {
707600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
708600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            public void handleException(ParseException ex,
709600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    SIPMessage sipMessage, Class headerClass,
710600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    String headerText, String messageText)
711600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    throws ParseException {
712600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                // Rethrow the error for the essential headers. Otherwise bad
713600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                // headers are simply
714600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                // recorded in the message.
715600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                if (testing) {
716600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    if (headerClass == From.class || headerClass == To.class
717600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            || headerClass == CallID.class
718600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            || headerClass == MaxForwards.class
719600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            || headerClass == Via.class
720600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            || headerClass == RequestLine.class
721600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            || headerClass == StatusLine.class
722600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            || headerClass == CSeq.class)
723600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        throw ex;
724600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
725600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    sipMessage.addUnparsed(headerText);
726600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                }
727600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
728600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            }
729600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
730600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        };
731600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
732600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (this.testing)
733600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            smp.setParseExceptionListener(parseExceptionListener);
734600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
735600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SIPMessage sipMessage = smp.parseSIPMessage(requestString);
736600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
737600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (!(sipMessage instanceof SIPRequest))
738600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new ParseException(requestString, 0);
739600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
740600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return (SIPRequest) sipMessage;
741600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
742600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
743600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
744600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Create a response from a string
745600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
746600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param responseString --
747600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            string from which to create the message null string returns an
748600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            empty message.
749600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
750600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
751600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Response createResponse(String responseString)
752600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throws java.text.ParseException {
753600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (responseString == null)
754600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return new SIPResponse();
755600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
756600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        StringMsgParser smp = new StringMsgParser();
757600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
758600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SIPMessage sipMessage = smp.parseSIPMessage(responseString);
759600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
760600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (!(sipMessage instanceof SIPResponse))
761600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new ParseException(responseString, 0);
762600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
763600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return (SIPResponse) sipMessage;
764600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
765600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
766600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
767600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set the common UserAgent header for all requests created from this message factory.
768600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * This header is applied to all Messages created from this Factory object except those
769600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * that take String for an argument and create Message from the given String.
770600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
771600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param userAgent -- the user agent header to set.
772600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
773600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @since 2.0
774600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
775600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
776600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setDefaultUserAgentHeader(UserAgentHeader userAgent) {
777600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        MessageFactoryImpl.userAgent = userAgent;
778600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
779600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
780600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
781600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set the common Server header for all responses created from this message factory.
782600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * This header is applied to all Messages created from this Factory object except those
783600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * that take String for an argument and create Message from the given String.
784600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
785600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param userAgent -- the user agent header to set.
786600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
787600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @since 2.0
788600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
789600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
790600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setDefaultServerHeader(ServerHeader server) {
791600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        MessageFactoryImpl.server = server;
792600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
793600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
794600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Get the default common UserAgentHeader.
795600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
796600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return the user agent header.
797600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
798600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @since 2.0
799600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
800600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static UserAgentHeader getDefaultUserAgentHeader() {
801600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return userAgent;
802600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
803600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
804600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
805600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
806600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Get the default common server header.
807600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
808600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return the server header.
809600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
810600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static ServerHeader getDefaultServerHeader() {
811600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return server;
812600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
813600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
814600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
815600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
816600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set default charset used for encoding String content.
817600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param charset
818600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
819600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public  void setDefaultContentEncodingCharset(String charset) throws NullPointerException,
820600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    IllegalArgumentException {
821600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (charset == null ) throw new NullPointerException ("Null argument!");
822600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        MessageFactoryImpl.defaultContentEncodingCharset = charset;
823600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
824600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
825600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
826600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static String getDefaultContentEncodingCharset() {
827600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return MessageFactoryImpl.defaultContentEncodingCharset;
828600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
829600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
830600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
831600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public MultipartMimeContent createMultipartMimeContent(ContentTypeHeader multipartMimeCth,
832600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            String[] contentType,
833600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            String[] contentSubtype,
834600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            String[] contentBody) {
835600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        String boundary = multipartMimeCth.getParameter("boundary");
836600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        MultipartMimeContentImpl retval = new MultipartMimeContentImpl(multipartMimeCth);
837600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        for (int i = 0 ;  i < contentType.length; i++ ) {
838600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ContentTypeHeader cth = new ContentType(contentType[i],contentSubtype[i]);
839600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ContentImpl contentImpl  = new ContentImpl(contentBody[i],boundary);
840600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            contentImpl.setContentTypeHeader(cth);
841600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            retval.add(contentImpl);
842600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
843600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return retval;
844600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
845600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
846600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
847600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
848600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
849600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang}
850