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 // SDAAdvert.java: Server Side DAAdvert Message. 28 // Author: James Kempf 29 // Created On: Tue Feb 10 15:00:39 1998 30 // Last Modified By: James Kempf 31 // Last Modified On: Tue Nov 17 12:12:18 1998 32 // Update Count: 82 33 // 34 35 package com.sun.slp; 36 37 import java.util.*; 38 import java.io.*; 39 40 41 /** 42 * The SDAAdvert class models the SLP DAAdvert message. 43 * 44 * @author James Kempf 45 */ 46 47 class SDAAdvert extends SrvLocMsgImpl { 48 49 SDAAdvert(SrvLocHeader hdr, 50 short xid, 51 long timestamp, 52 ServiceURL url, 53 Vector scopes, 54 Vector attrs) 55 throws ServiceLocationException { 56 57 // Note that we don't need a server side header here because 58 // we will not be parsing anything in. 59 60 try { 61 this.hdr = (SrvLocHeader)hdr.clone(); 62 63 } catch (CloneNotSupportedException ex) { 64 65 // We know it's supported. 66 67 } 68 69 this.hdr.xid = xid; 70 this.hdr.functionCode = SrvLocHeader.DAAdvert; 71 this.hdr.mcast = false; 72 this.hdr.previousResponders = null; // we don't want this around. 73 this.hdr.errCode = ServiceLocationException.OK; 74 this.hdr.overflow = false; 75 this.hdr.length = 0; 76 this.hdr.fresh = false; 77 78 this.initialize(timestamp, url, scopes, attrs); 79 80 } 81 82 83 // Initialize the message. 84 85 void 86 initialize(long timestamp, 87 ServiceURL url, 88 Vector scopes, 89 Vector attrs) 90 throws ServiceLocationException { 91 92 SLPServerHeaderV2 hdr = (SLPServerHeaderV2)this.hdr; 93 hdr.scopes = (Vector)scopes.clone(); 94 95 ServiceType serviceType = url.getServiceType(); 96 97 if (!serviceType.equals(Defaults.DA_SERVICE_TYPE)) { 98 throw 99 new ServiceLocationException( 100 ServiceLocationException.PARSE_ERROR, 101 "sdaadv_nondaurl", 102 new Object[] {serviceType}); 103 104 } 105 106 if (timestamp < 0) { 107 throw 108 new ServiceLocationException( 109 ServiceLocationException.PARSE_ERROR, 110 "sdaadv_neg", 111 new Object[0]); 112 } 113 114 // Validate scope list. 115 116 DATable.validateScopes(scopes, hdr.locale); 117 hdr.scopes = (Vector)scopes; 118 119 // Escape scope strings. 120 121 hdr.escapeScopeStrings(scopes); 122 123 // Parse out the payload. 124 125 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 126 127 String surl = url.toString(); 128 129 // Parse out the timestamp 130 131 putInt32(hdr, timestamp, baos); 132 byte[] timestampBytes = baos.toByteArray(); 133 134 // Parse out the URL. 135 136 byte[] urlBytes = hdr.putString(surl, baos); 137 138 // Parse out the scope list. 139 140 byte[] scopeBytes = 141 hdr.parseCommaSeparatedListOut(scopes, baos); 142 143 // Parse out the attributes. 144 145 byte[] attrBytes = hdr.parseAttributeVectorOut(attrs, 146 url.getLifetime(), 147 false, 148 null, 149 baos, 150 false); 151 152 // Parse out SPI list 153 String spisString = ""; 154 // First get DA SPIs from DA SPIs property 155 LinkedList spiList = AuthBlock.getSPIList("sun.net.slp.SPIs"); 156 if (spiList != null && !spiList.isEmpty()) { 157 158 StringBuffer spiBuf = new StringBuffer(); 159 spiBuf.append(spiList.getFirst().toString()); 160 161 for (int i = 1; i < spiList.size(); i++) { 162 spiBuf.append(','); 163 spiBuf.append(spiList.get(i).toString()); 164 } 165 spisString = spiBuf.toString(); 166 } 167 168 byte[] spiBytes = hdr.putString(spisString, baos); 169 170 // Parse out auth block, if necessary. 171 172 Hashtable auth = null; 173 174 if (SLPConfig.getSLPConfig().getHasSecurity()) { 175 Object[] message = new Object[9]; 176 177 // None of the strings have leading length fields, so add them here 178 message[0] = timestampBytes; 179 180 ByteArrayOutputStream abaos = new ByteArrayOutputStream(); 181 hdr.putInteger(urlBytes.length, abaos); 182 message[1] = abaos.toByteArray(); 183 message[2] = urlBytes; 184 185 abaos = new ByteArrayOutputStream(); 186 hdr.putInteger(attrBytes.length, abaos); 187 message[3] = abaos.toByteArray(); 188 message[4] = attrBytes; 189 190 abaos = new ByteArrayOutputStream(); 191 hdr.putInteger(scopeBytes.length, abaos); 192 message[5] = abaos.toByteArray(); 193 message[6] = scopeBytes; 194 195 abaos = new ByteArrayOutputStream(); 196 hdr.putInteger(spiBytes.length, abaos); 197 message[7] = abaos.toByteArray(); 198 message[8] = spiBytes; 199 200 auth = 201 hdr.getCheckedAuthBlockList(message, 202 SLPConfig.getSLPConfig().getAdvertHeartbeatTime()); 203 204 // Parse out auth blocks. 205 baos.write((byte)(auth.size() & 0xFF)); // auth block count 206 hdr.nbytes += 1; 207 AuthBlock.externalizeAll(hdr, auth, baos); 208 209 } else { 210 211 baos.write((byte)0); 212 213 } 214 215 // Save bytes. 216 217 hdr.payload = baos.toByteArray(); 218 219 hdr.constructDescription("DAAdvert", 220 " timestamp="+timestamp+"\n"+ 221 " URL="+url+"\n"+ 222 " attrs="+attrs+"\n"+ 223 " SPIs="+spisString+"\n"+ 224 " auth block="+AuthBlock.desc(auth) + 225 "\n"); 226 } 227 228 // Put out the lower 32 bits of the timestamp. 229 230 static private void 231 putInt32(SrvLocHeader hdr, long i, ByteArrayOutputStream baos) { 232 baos.write((byte) ((i >> 24) & 0xFF)); 233 baos.write((byte) ((i >> 16) & 0xFF)); 234 baos.write((byte) ((i >> 8) & 0xFF)); 235 baos.write((byte) (i & 0XFF)); 236 237 hdr.nbytes += 4; 238 } 239 240 } 241