xref: /illumos-gate/usr/src/lib/libslp/javalib/com/sun/slp/SLPServerHeaderV2.java (revision 9a70fc3be3b1e966bf78825cdb8d509963a6f0a1)
1  /*
2   * CDDL HEADER START
3   *
4   * The contents of this file are subject to the terms of the
5   * Common Development and Distribution License (the "License").
6   * You may not use this file except in compliance with the License.
7   *
8   * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9   * or http://www.opensolaris.org/os/licensing.
10   * See the License for the specific language governing permissions
11   * and limitations under the License.
12   *
13   * When distributing Covered Code, include this CDDL HEADER in each
14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15   * If applicable, add the following below this CDDL HEADER, with the
16   * fields enclosed by brackets "[]" replaced with your own identifying
17   * information: Portions Copyright [yyyy] [name of copyright owner]
18   *
19   * CDDL HEADER END
20   */
21  /*
22   * Copyright 2001-2002 Sun Microsystems, Inc.  All rights reserved.
23   * Use is subject to license terms.
24   *
25   */
26  
27  //  SLPServerHeaderV2.java: SLPv2 Header Class for Server Side
28  //  Author:           James Kempf
29  //  Created On:       Wed Sep 16 08:44:31 1998
30  //  Last Modified By: James Kempf
31  //  Last Modified On: Mon Jan  4 15:26:33 1999
32  //  Update Count:     30
33  //
34  
35  package com.sun.slp;
36  
37  import java.util.*;
38  
39  import java.net.*;
40  import java.io.*;
41  import java.security.*;
42  
43  /**
44   * The SLPServerHeaderV2 class serves as the header class for all server side
45   * SLPv2 messages.
46   *
47   * @author James Kempf
48   */
49  
50  class SLPServerHeaderV2 extends SLPHeaderV2  implements Cloneable {
51  
52      // Function code for message reply.
53  
54      int replyFunctionCode = SrvLocHeader.SrvAck;
55  
56      // For SrvLocHeader.newInstance().
57  
SLPServerHeaderV2()58      SLPServerHeaderV2() {
59  	super();
60  
61      }
62  
63      // Construct a header for output. Used by the client side code to
64      //  construct an initial request and the server side code to construct
65      //  a reply.
66  
SLPServerHeaderV2(int functionCode, boolean fresh, Locale locale)67      SLPServerHeaderV2(int functionCode, boolean fresh, Locale locale)
68  	throws ServiceLocationException {
69  	super(functionCode, fresh, locale);
70  
71      }
72  
73      // Assign reply code based on function code type, then use superclass
74      //  method to parse header.
75  
parseHeader(int functionCode, DataInputStream dis)76      void parseHeader(int functionCode, DataInputStream dis)
77  	throws ServiceLocationException, IOException {
78  
79  	// We ignore the error case here.
80  
81  	switch (functionCode) {
82  
83  	case SrvLocHeader.SrvReq:
84  	    replyFunctionCode = SrvLocHeader.SrvRply;
85  	    break;
86  
87  	case SrvLocHeader.AttrRqst:
88  	    replyFunctionCode = SrvLocHeader.AttrRply;
89  	    break;
90  
91  	case SrvLocHeader.SrvTypeRqst:
92  	    replyFunctionCode = SrvLocHeader.SrvTypeRply;
93  	    break;
94  
95  	case SrvLocHeader.SrvReg: case SrvLocHeader.SrvDereg:
96  	    replyFunctionCode = SrvLocHeader.SrvAck;
97  	    break;
98  
99  	    // If we get an error during creating of the DAAdvert to
100  	    //  reply, we need to continue and reply with DAAdvert.
101  	    //  This is only true for a unicast DAAdvert, though.
102  
103  	case SrvLocHeader.DAAdvert:
104  	    replyFunctionCode = SrvLocHeader.DAAdvert;
105  	    break;
106  
107  	    // We ignore the header error code for SAAdvert because
108  	    //  it is always multicast.
109  
110  	}
111  
112  	// We are now set up to handle any errors that may come flying out
113  	//  of here.
114  
115  	super.parseHeader(functionCode, dis);
116  
117      }
118  
119      // Replace the superclass method with a method that parses the server
120      //  side.
121  
parseMsg(DataInputStream dis)122      SrvLocMsg parseMsg(DataInputStream dis)
123  	throws ServiceLocationException,
124  	       IOException,
125  	       IllegalArgumentException {
126  
127  	SrvLocMsg msg = null;
128  
129  	// DAAdvert needs to get it's error code parsed here because
130  	//  error codes are always handled in parseMsg() and it is
131  	//  the only server side message that has one.
132  
133  	if (functionCode == SrvLocHeader.DAAdvert) {
134  	    errCode = (short)getInt(dis);
135  
136  	}
137  
138  	// Switch and convert according to function code.
139  
140  	switch (functionCode) {
141  
142  	case SrvLocHeader.SrvReg:
143  	    msg = new SSrvReg(this, dis);
144  	    break;
145  
146  	case SrvLocHeader.SrvDereg:
147  	    msg = new SSrvDereg(this, dis);
148  	    break;
149  
150  	case SrvLocHeader.SrvReq:
151  	    msg = new SSrvMsg(this, dis);
152  	    break;
153  
154  	case SrvLocHeader.AttrRqst:
155  	    msg = new SAttrMsg(this, dis);
156  	    break;
157  
158  	case SrvLocHeader.SrvAck:
159  
160  	    // We function as our own message.
161  
162  	    msg = this;
163  	    iNumReplies = 1;
164  	    break;
165  
166  	case SrvLocHeader.SrvTypeRqst:
167  	    msg = new SSrvTypeMsg(this, dis);
168  	    break;
169  
170  	case SrvLocHeader.DAAdvert:
171  	    msg = new CDAAdvert(this, dis);
172  	    break;
173  
174  	case SrvLocHeader.SAAdvert:
175  	    msg = new CSAAdvert(this, dis);
176  	    break;
177  
178  	default:
179  	    throw
180  		new ServiceLocationException(
181  				ServiceLocationException.PARSE_ERROR,
182  				"function_code_error",
183  				new Object[] {
184  		    new Integer(functionCode)});
185  
186  	}
187  
188  	// Check for size overflow.
189  
190  	if (nbytes > length) {
191  	    throw
192  		new ServiceLocationException(
193  				ServiceLocationException.PARSE_ERROR,
194  				"length_overflow",
195  				new Object[] {
196  		    new Integer(nbytes), new Integer(length)});
197  
198  	}
199  
200  	return msg;
201  
202      }
203  
204      // Create an error reply using the reply code. Calculate the
205      //  error code using the exception.
206  
makeErrorReply(Exception ex)207      SrvLocMsg makeErrorReply(Exception ex) {
208  
209  	SrvLocHeader hdr = null;
210  
211  	// Clone the header to make sure that everything else is the same.
212  	//  We don't want to use the same header because it may be tested
213  	//  elsewhere.
214  
215  	try {
216  	    hdr = (SrvLocHeader)this.clone();
217  
218  	} catch (CloneNotSupportedException exx) {
219  
220  	    // We support it, so no-op.
221  
222  	}
223  
224  	// Re-initialize flags but not multicast, since we need to filter on it
225  
226  	hdr.fresh = false;
227  	hdr.overflow = false;
228  	hdr.functionCode = replyFunctionCode;
229  
230  	// We should *not* be getting a null exception down this path!
231  
232  	Assert.slpassert(ex != null,
233  		      "null_parameter",
234  		      new Object[] {ex});
235  
236  	if (ex instanceof ServiceLocationException) {
237  
238  	    hdr.errCode = ((ServiceLocationException)ex).getErrorCode();
239  
240  	    if (!ServiceLocationException.validWireErrorCode(hdr.errCode)) {
241  		hdr.errCode = ServiceLocationException.INTERNAL_ERROR;
242  
243  	    }
244  
245  	} else if (ex instanceof IllegalArgumentException ||
246  		   ex instanceof IOException) {
247  	    hdr.errCode = ServiceLocationException.PARSE_ERROR;
248  
249  	} else {
250  	    hdr.errCode = ServiceLocationException.INTERNAL_ERROR;
251  
252  	}
253  
254  	// Construct header description.
255  
256  	constructDescription("SrvLocMsg", "");
257  
258  	return hdr;
259      }
260  
261      // Return a reply header with flags properly set.
262  
makeReplyHeader()263      SLPServerHeaderV2 makeReplyHeader() {
264  
265  	SLPServerHeaderV2 hdr = null;
266  
267  	try {
268  	    hdr = (SLPServerHeaderV2)this.clone();
269  
270  	} catch (CloneNotSupportedException ex) {
271  
272  	    // No-op, since we support it.
273  
274  	}
275  
276  	hdr.functionCode = replyFunctionCode;
277  	hdr.length = 0;
278  	hdr.previousResponders = null;
279  	hdr.scopes = null;
280  	hdr.overflow = false;
281  	hdr.fresh = false;
282  	hdr.mcast = false;
283  	hdr.nbytes = 0;
284  
285  	return hdr;
286      }
287  
288      // Return display string.
289  
toString()290      public String toString() {
291  	return
292  	    getMsgType() + ":version=``" + version + "''\n" +
293  	    "       functionCode=``" + functionCode + "''\n" +
294  	    "       length=``" + length + "''" + "''\n" +
295  	    "       overflow=``" + overflow + "''\n" +
296  	    "       mcast = ``" + mcast + "''\n" +
297  	    "       fresh=``" + fresh + "''\n" +
298  	    "       locale = ``" + locale + "''\n" +
299  	    "       xid=``0x" + Integer.toHexString(xid) + "''\n" +
300  	    "       errCode=``" + errCode + "''\n" +
301  	    "       previousResponders=``" + previousResponders + "''\n" +
302  	    "       scopes=``" + scopes + "''\n" +
303  	    getMsgDescription();
304      }
305  
306      //
307      // Parsing Utilities.
308      //
309  
310      // Parse in the scope list.
311  
parseScopesIn(DataInputStream dis)312      void parseScopesIn(DataInputStream dis)
313  	throws ServiceLocationException, IOException {
314  
315  	StringBuffer buf = new StringBuffer();
316  
317  	getString(buf, dis);
318  
319  	scopes = parseCommaSeparatedListIn(buf.toString(), true);
320  
321  	// Unescape scope strings.
322  
323  	unescapeScopeStrings(scopes);
324  
325  	// Validate.
326  
327  	DATable.validateScopes(scopes, locale);
328  
329      }
330  
parsePreviousRespondersIn(DataInputStream dis)331      void parsePreviousRespondersIn(DataInputStream dis)
332  	throws ServiceLocationException, IOException {
333  
334  	StringBuffer buf = new StringBuffer();
335  
336  	getString(buf, dis);
337  
338  	previousResponders =
339  	    parseCommaSeparatedListIn(buf.toString(), true);
340  
341      }
342  
343      // Return an SLPv2 DAAdvert.
344  
345      SDAAdvert
getDAAdvert(short xid, long timestamp, ServiceURL url, Vector scopes, Vector attrs)346  	getDAAdvert(short xid,
347  		    long timestamp,
348  		    ServiceURL url,
349  		    Vector scopes,
350  		    Vector attrs)
351  	throws ServiceLocationException {
352  
353  	// If scopes vector is null, then return all scopes for this
354  	//  DA.
355  
356  	if (scopes.size() <= 0) {
357  	    scopes = SLPConfig.getSLPConfig().getSAConfiguredScopes();
358  
359  	}
360  
361  	return new SDAAdvert(this, xid, timestamp, url, scopes, attrs);
362  
363      }
364  
365  }
366