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) 2001 by Sun Microsystems, Inc. 23 * All rights reserved. 24 * 25 */ 26 27 // SSAAdvert.java: Server Side SAAdvert 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 Oct 27 10:57:38 1998 32 // Update Count: 60 33 // 34 35 package com.sun.slp; 36 37 import java.util.*; 38 import java.io.*; 39 40 41 /** 42 * The SSAAdvert class models the SLP SAAdvert message. 43 * 44 * @author James Kempf 45 */ 46 47 class SSAAdvert extends SrvLocMsgImpl { 48 49 // Construct a SAAdvert from the arguments. This is a server side 50 // for transmission to the client. 51 SSAAdvert(int version, short xid, Locale locale, ServiceURL url, Vector scopes, Vector attrs)52 SSAAdvert(int version, 53 short xid, 54 Locale locale, 55 ServiceURL url, 56 Vector scopes, 57 Vector attrs) 58 throws ServiceLocationException { 59 60 // Construct header. 61 62 hdr = new SLPServerHeaderV2(); 63 64 Assert.slpassert(hdr != null, 65 "version_number_error", 66 new Object[] {new Integer(version)}); 67 68 hdr.functionCode = SrvLocHeader.SAAdvert; 69 hdr.xid = xid; 70 hdr.locale = locale; 71 72 this.initialize(url, scopes, attrs); 73 } 74 75 // Initialize the message. 76 initialize(ServiceURL url, Vector scopes, Vector attrs)77 void initialize(ServiceURL url, Vector scopes, Vector attrs) 78 throws ServiceLocationException { 79 80 SLPServerHeaderV2 hdr = (SLPServerHeaderV2)getHeader(); 81 82 ServiceType serviceType = url.getServiceType(); 83 84 if (!serviceType.equals(Defaults.SA_SERVICE_TYPE)) { 85 throw 86 new ServiceLocationException( 87 ServiceLocationException.PARSE_ERROR, 88 "ssaadv_nonsaurl", 89 new Object[] {serviceType}); 90 91 } 92 93 // Validate scope list. 94 95 DATable.validateScopes(scopes, hdr.locale); 96 hdr.scopes = (Vector)scopes.clone(); 97 98 // Escape scope strings. 99 100 hdr.escapeScopeStrings(scopes); 101 102 // Parse out the payload. 103 104 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 105 106 String surl = url.toString(); 107 108 // Parse out the URL. 109 110 byte[] urlBytes = hdr.putString(surl, baos); 111 112 // Parse out the scope list. We need to save the bytes for 113 // the authblock. 114 115 byte[] scopeBytes = 116 hdr.parseCommaSeparatedListOut(scopes, baos); 117 118 // Parse out the attribute list. 119 120 byte[] attrBytes = hdr.parseAttributeVectorOut(attrs, 121 url.getLifetime(), 122 false, 123 null, 124 baos, 125 false); 126 127 // Parse out auth blocks, if necessary. 128 129 Hashtable auth = null; 130 byte nBlocks = 0; 131 132 if (SLPConfig.getSLPConfig().getHasSecurity()) { 133 Object[] message = new Object[6]; 134 135 // None of the strings have leading length fields, so add them here 136 ByteArrayOutputStream abaos = new ByteArrayOutputStream(); 137 hdr.putInteger(urlBytes.length, abaos); 138 message[0] = abaos.toByteArray(); 139 message[1] = urlBytes; 140 141 abaos = new ByteArrayOutputStream(); 142 hdr.putInteger(attrBytes.length, abaos); 143 message[2] = abaos.toByteArray(); 144 message[3] = attrBytes; 145 146 abaos = new ByteArrayOutputStream(); 147 hdr.putInteger(scopeBytes.length, abaos); 148 message[4] = abaos.toByteArray(); 149 message[5] = scopeBytes; 150 151 auth = hdr.getCheckedAuthBlockList(message, 152 url.getLifetime()); 153 nBlocks = (byte) auth.size(); 154 155 } 156 157 // Parse out number of blocks. 158 159 baos.write(nBlocks); 160 hdr.nbytes++; 161 162 // Parse out blocks, if any. 163 164 if (auth != null) { 165 AuthBlock.externalizeAll(hdr, auth, baos); 166 167 } 168 169 // Save bytes. 170 171 hdr.payload = baos.toByteArray(); 172 173 // Construct description of outgoing packet for logging. 174 175 hdr.constructDescription("SAAdvert", 176 " URL=``" + url + "''\n" + 177 " attrs=``" + attrs + "''\n" + 178 " auth block="+AuthBlock.desc(auth) + 179 "\n"); 180 181 } 182 } 183