xref: /illumos-gate/usr/src/lib/libslp/javalib/com/sun/slp/CSrvTypeMsg.java (revision 37e2cd25d56b334a2403f2540a0b0a1e6a40bcd1)
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 (c) 1999 by Sun Microsystems, Inc.
23  * All rights reserved.
24  *
25  */
26 
27 //  CSrvTypeMsg.java: Message class for SLP service type reply
28 //  Author:           James Kempf
29 //  Created On:       Thu Oct  9 16:15:36 1997
30 //  Last Modified By: James Kempf
31 //  Last Modified On: Tue Oct 27 10:57:38 1998
32 //  Update Count:     80
33 //
34 
35 package com.sun.slp;
36 
37 import java.util.*;
38 import java.io.*;
39 
40 
41 /**
42  * The CSrvTypeMsg class models the SLP service type reply message.
43  *
44  * @author James Kempf
45  */
46 
47 class CSrvTypeMsg extends SrvLocMsgImpl {
48 
49     // Names contain both the service type and naming authority.
50 
51     Vector serviceTypes = new Vector();  // vector of Strings
52 
53     // Only used for testing.
54 
55     protected CSrvTypeMsg() { }
56 
57     // Construct a CSrvTypeMsg from the byte input stream. This will be
58     //  a SrvTypeRply.
59 
60     CSrvTypeMsg(SLPHeaderV2 hdr, DataInputStream dis)
61 	throws ServiceLocationException, IOException {
62 	super(hdr, SrvLocHeader.SrvTypeRply);
63 
64 	// Don't parse the rest if there's an error.
65 
66 	if (hdr.errCode != ServiceLocationException.OK) {
67 	    return;
68 	}
69 
70 	// Return if packet overflowed.
71 
72 	if (hdr.overflow) {
73 	    return;
74 
75 	}
76 
77 	StringBuffer buf = new StringBuffer();
78 
79 	hdr.getString(buf, dis);
80 
81 	serviceTypes =
82 	    hdr.parseCommaSeparatedListIn(buf.toString(), true);
83 
84 	// Validate service types.
85 
86 	int i, n = serviceTypes.size();
87 
88 	for (i = 0; i < n; i++) {
89 
90 	    // Validate.
91 
92 	    ServiceType type =
93 		new ServiceType((String)serviceTypes.elementAt(i));
94 
95 	    serviceTypes.setElementAt(type, i);
96 
97 	}
98 
99 	// Set the number of replies.
100 
101 	hdr.iNumReplies = serviceTypes.size();
102 
103     }
104 
105     // Construct a CSrvTypeMsg from the arguments. This will be
106     //  a SrvTypeRqst for transmission to the server.
107 
108     CSrvTypeMsg(Locale locale, String na, Vector scopes)
109 	throws ServiceLocationException {
110 
111 	SLPHeaderV2 hdr =
112 	    new SLPHeaderV2(SrvLocHeader.SrvTypeRqst, false, locale);
113 	this.hdr = hdr;
114 	hdr.scopes = (Vector)scopes.clone();
115 
116 	// Convert names.
117 
118 	String namingAuthority = na.toLowerCase();
119 
120 	// Verify.
121 
122 	if (!namingAuthority.equals(Defaults.ALL_AUTHORITIES)) {
123 	    ServiceType.validateTypeComponent(namingAuthority);
124 
125 	}
126 
127 	// Check for IANA.
128 
129 	if (namingAuthority.equals(ServiceType.IANA)) {
130 	    throw
131 		new ServiceLocationException(
132 				ServiceLocationException.PARSE_ERROR,
133 				"service_type_syntax",
134 				new Object[] { namingAuthority });
135 	}
136 
137 	// Set up previous responders.
138 
139 	hdr.previousResponders = new Vector();
140 
141 	// Make payload.
142 
143 	ByteArrayOutputStream baos = new ByteArrayOutputStream();
144 
145 	// Parse out the naming authority name.
146 
147 	parseNamingAuthorityOut(hdr, namingAuthority, baos);
148 
149 	// Escape scope strings.
150 
151 	hdr.escapeScopeStrings(scopes);
152 
153 	// Parse out the scope.
154 
155 	hdr.parseCommaSeparatedListOut(scopes, baos);
156 
157 	hdr.payload = baos.toByteArray();
158 
159     }
160 
161     // Parse out the naming authority.
162 
163     protected void
164 	parseNamingAuthorityOut(SLPHeaderV2 hdr,
165 				String name,
166 				ByteArrayOutputStream baos) {
167 
168 	// Write out the naming authority.
169 
170 	if (name.length() <= 0) {
171 	    hdr.putInt(0, baos);
172 
173 	} else if (name.equals(Defaults.ALL_AUTHORITIES)) {
174 	    hdr.putInt(0xFFFF, baos);
175 
176 	} else {
177 	    hdr.putString(name, baos);
178 
179 	}
180 
181     }
182 
183 }
184