1 /* 2 * Conditions Of Use 3 * 4 * This software was developed by employees of the National Institute of 5 * Standards and Technology (NIST), an agency of the Federal Government. 6 * Pursuant to title 15 Untied States Code Section 105, works of NIST 7 * employees are not subject to copyright protection in the United States 8 * and are considered to be in the public domain. As a result, a formal 9 * license is not needed to use the software. 10 * 11 * This software is provided by NIST as a service and is expressly 12 * provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED 13 * OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF 14 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT 15 * AND DATA ACCURACY. NIST does not warrant or make any representations 16 * regarding the use of the software or the results thereof, including but 17 * not limited to the correctness, accuracy, reliability or usefulness of 18 * the software. 19 * 20 * Permission to use this software is contingent upon your acceptance 21 * of the terms of this agreement 22 * 23 * . 24 * 25 */ 26 /******************************************* 27 * PRODUCT OF PT INOVACAO - EST DEPARTMENT * 28 *******************************************/ 29 30 package gov.nist.javax.sip.parser.ims; 31 32 import gov.nist.core.NameValue; 33 import gov.nist.javax.sip.header.SIPHeader; 34 import gov.nist.javax.sip.header.ims.PChargingFunctionAddresses; 35 import gov.nist.javax.sip.parser.Lexer; 36 import gov.nist.javax.sip.parser.ParametersParser; 37 import gov.nist.javax.sip.parser.TokenTypes; 38 39 import java.text.ParseException; 40 41 42 /** 43 * P-Charging-Function-Addresses header parser. 44 * 45 * <p>Sintax (RFC 3455):</p> 46 * <pre> 47 * P-Charging-Addr = "P-Charging-Function-Addresses" HCOLON 48 * charge-addr-params 49 * * (SEMI charge-addr-params) 50 * charge-addr-params = ccf / ecf / generic-param 51 * ccf = "ccf" EQUAL gen-value 52 * ecf = "ecf" EQUAL gen-value 53 * gen-value = token / host / quoted-string 54 * host = hostname / IPv4address / IPv6reference 55 * hostname = *( domainlabel "." ) toplabel [ "." ] 56 * domainlabel = alphanum / alphanum *( alphanum / "-" ) alphanum 57 * toplabel = ALPHA / ALPHA *( alphanum / "-" ) alphanum 58 * ipv6reference = "[" IPv6address "]" 59 * 60 * </pre> 61 * 62 * @author ALEXANDRE MIGUEL SILVA SANTOS 63 * @author aayush.bhatnagar: proposed change to allow duplicate ecf and ccf header parameters. 64 */ 65 66 public class PChargingFunctionAddressesParser 67 extends ParametersParser 68 implements TokenTypes { 69 70 PChargingFunctionAddressesParser(String charging)71 public PChargingFunctionAddressesParser(String charging) { 72 73 super(charging); 74 75 76 } 77 78 PChargingFunctionAddressesParser(Lexer lexer)79 protected PChargingFunctionAddressesParser(Lexer lexer) { 80 super(lexer); 81 82 } 83 84 85 parse()86 public SIPHeader parse() throws ParseException { 87 88 89 if (debug) 90 dbg_enter("parse"); 91 try { 92 headerName(TokenTypes.P_CHARGING_FUNCTION_ADDRESSES); 93 PChargingFunctionAddresses chargingFunctionAddresses = new PChargingFunctionAddresses(); 94 95 try { 96 while (lexer.lookAhead(0) != '\n') { 97 98 this.parseParameter(chargingFunctionAddresses); 99 this.lexer.SPorHT(); 100 char la = lexer.lookAhead(0); 101 if (la == '\n' || la == '\0') 102 break; 103 104 this.lexer.match(';'); 105 this.lexer.SPorHT(); 106 } 107 } catch (ParseException ex) { 108 throw ex; 109 } 110 111 112 super.parse(chargingFunctionAddresses); 113 return chargingFunctionAddresses; 114 } finally { 115 if (debug) 116 dbg_leave("parse"); 117 } 118 } 119 parseParameter(PChargingFunctionAddresses chargingFunctionAddresses)120 protected void parseParameter(PChargingFunctionAddresses chargingFunctionAddresses) throws ParseException { 121 122 if (debug) 123 dbg_enter("parseParameter"); 124 try { 125 126 NameValue nv = this.nameValue('='); 127 128 //chargingFunctionAddresses.setParameter(nv); 129 chargingFunctionAddresses.setMultiParameter(nv); 130 131 } finally { 132 if (debug) 133 dbg_leave("parseParameter"); 134 } 135 136 137 138 } 139 140 141 142 143 144 145 /** Test program */ 146 main(String args[])147 public static void main(String args[]) throws ParseException { 148 String r[] = { 149 "P-Charging-Function-Addresses: ccf=\"test str\"; ecf=token\n", 150 "P-Charging-Function-Addresses: ccf=192.1.1.1; ccf=192.1.1.2; ecf=192.1.1.3; ecf=192.1.1.4\n", 151 "P-Charging-Function-Addresses: ccf=[5555::b99:c88:d77:e66]; ccf=[5555::a55:b44:c33:d22]; " + 152 "ecf=[5555::1ff:2ee:3dd:4cc]; ecf=[5555::6aa:7bb:8cc:9dd]\n" 153 154 }; 155 156 157 for (int i = 0; i < r.length; i++ ) 158 { 159 160 PChargingFunctionAddressesParser parser = 161 new PChargingFunctionAddressesParser(r[i]); 162 163 System.out.println("original = " + r[i]); 164 165 PChargingFunctionAddresses chargAddr= (PChargingFunctionAddresses) parser.parse(); 166 System.out.println("encoded = " + chargAddr.encode()); 167 } 168 169 170 } 171 172 173 174 175 176 177 178 } 179