1600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpackage gov.nist.javax.sip.parser.extensions;
2600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
3600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.header.*;
4600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.header.extensions.*;
5600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.parser.*;
6600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
7600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.text.ParseException;
8600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
9600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// Parser for Replaces Header (RFC3891)
10600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// Extension by pmusgrave
11600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
12600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// Replaces        = "Replaces" HCOLON callid *(SEMI replaces-param)
13600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// replaces-param  = to-tag / from-tag / early-flag / generic-param
14600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// to-tag          = "to-tag" EQUAL token
15600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// from-tag        = "from-tag" EQUAL token
16600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// early-flag      = "early-only"
17600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
18600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// TODO Should run a test case on early-only
19600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
20600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
21600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic class ReplacesParser extends ParametersParser {
22600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
23600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
24600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Creates new CallIDParser
25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param callID message to parse
26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public ReplacesParser(String callID) {
28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        super(callID);
29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Constructor
33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param lexer Lexer to set
34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected ReplacesParser(Lexer lexer) {
36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        super(lexer);
37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * parse the String message
41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return SIPHeader (CallID object)
42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws ParseException if the message does not respect the spec.
43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public SIPHeader parse() throws ParseException {
45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (debug)
46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            dbg_enter("parse");
47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        try {
48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            headerName(TokenTypes.REPLACES_TO);
49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            Replaces replaces = new Replaces();
51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            this.lexer.SPorHT();
52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            String callId = lexer.byteStringNoSemicolon();
53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            this.lexer.SPorHT();
54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            super.parse(replaces);
55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            replaces.setCallId(callId);
56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return replaces;
57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } finally {
58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            if (debug)
59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                dbg_leave("parse");
60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static void main(String args[]) throws ParseException {
64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        String to[] =
65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            {   "Replaces: 12345th5z8z\n",
66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                "Replaces: 12345th5z8z;to-tag=tozght6-45;from-tag=fromzght789-337-2\n",
67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            };
68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        for (int i = 0; i < to.length; i++) {
70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ReplacesParser tp = new ReplacesParser(to[i]);
71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            Replaces t = (Replaces) tp.parse();
72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            System.out.println("Parsing => " + to[i]);
73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            System.out.print("encoded = " + t.encode() + "==> ");
74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            System.out.println("callId " + t.getCallId() + " from-tag=" + t.getFromTag()
75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    + " to-tag=" + t.getToTag()) ;
76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang}
81