/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 1999 by Sun Microsystems, Inc.
* All rights reserved.
*
*/
// SDAAdvert.java: Server Side DAAdvert Message.
// Author: James Kempf
// Created On: Tue Feb 10 15:00:39 1998
// Last Modified By: James Kempf
// Last Modified On: Tue Nov 17 12:12:18 1998
// Update Count: 82
//
package com.sun.slp;
import java.util.*;
import java.io.*;
/**
* The SDAAdvert class models the SLP DAAdvert message.
*
* @author James Kempf
*/
class SDAAdvert extends SrvLocMsgImpl {
SDAAdvert(SrvLocHeader hdr,
short xid,
long timestamp,
ServiceURL url,
Vector scopes,
Vector attrs)
throws ServiceLocationException {
// Note that we don't need a server side header here because
// we will not be parsing anything in.
try {
this.hdr = (SrvLocHeader)hdr.clone();
} catch (CloneNotSupportedException ex) {
// We know it's supported.
}
this.hdr.xid = xid;
this.hdr.functionCode = SrvLocHeader.DAAdvert;
this.hdr.mcast = false;
this.hdr.previousResponders = null; // we don't want this around.
this.hdr.errCode = ServiceLocationException.OK;
this.hdr.overflow = false;
this.hdr.length = 0;
this.hdr.fresh = false;
this.initialize(timestamp, url, scopes, attrs);
}
// Initialize the message.
void
initialize(long timestamp,
ServiceURL url,
Vector scopes,
Vector attrs)
throws ServiceLocationException {
SLPServerHeaderV2 hdr = (SLPServerHeaderV2)this.hdr;
hdr.scopes = (Vector)scopes.clone();
ServiceType serviceType = url.getServiceType();
if (!serviceType.equals(Defaults.DA_SERVICE_TYPE)) {
throw
new ServiceLocationException(
ServiceLocationException.PARSE_ERROR,
"sdaadv_nondaurl",
new Object[] {serviceType});
}
if (timestamp < 0) {
throw
new ServiceLocationException(
ServiceLocationException.PARSE_ERROR,
"sdaadv_neg",
new Object[0]);
}
// Validate scope list.
DATable.validateScopes(scopes, hdr.locale);
hdr.scopes = (Vector)scopes;
// Escape scope strings.
hdr.escapeScopeStrings(scopes);
// Parse out the payload.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
String surl = url.toString();
// Parse out the timestamp
putInt32(hdr, timestamp, baos);
byte[] timestampBytes = baos.toByteArray();
// Parse out the URL.
byte[] urlBytes = hdr.putString(surl, baos);
// Parse out the scope list.
byte[] scopeBytes =
hdr.parseCommaSeparatedListOut(scopes, baos);
// Parse out the attributes.
byte[] attrBytes = hdr.parseAttributeVectorOut(attrs,
url.getLifetime(),
false,
null,
baos,
false);
// Parse out SPI list
String spisString = "";
// First get DA SPIs from DA SPIs property
LinkedList spiList = AuthBlock.getSPIList("sun.net.slp.SPIs");
if (spiList != null && !spiList.isEmpty()) {
StringBuffer spiBuf = new StringBuffer();
spiBuf.append(spiList.getFirst().toString());
for (int i = 1; i < spiList.size(); i++) {
spiBuf.append(',');
spiBuf.append(spiList.get(i).toString());
}
spisString = spiBuf.toString();
}
byte[] spiBytes = hdr.putString(spisString, baos);
// Parse out auth block, if necessary.
Hashtable auth = null;
if (SLPConfig.getSLPConfig().getHasSecurity()) {
Object[] message = new Object[9];
// None of the strings have leading length fields, so add them here
message[0] = timestampBytes;
ByteArrayOutputStream abaos = new ByteArrayOutputStream();
hdr.putInteger(urlBytes.length, abaos);
message[1] = abaos.toByteArray();
message[2] = urlBytes;
abaos = new ByteArrayOutputStream();
hdr.putInteger(attrBytes.length, abaos);
message[3] = abaos.toByteArray();
message[4] = attrBytes;
abaos = new ByteArrayOutputStream();
hdr.putInteger(scopeBytes.length, abaos);
message[5] = abaos.toByteArray();
message[6] = scopeBytes;
abaos = new ByteArrayOutputStream();
hdr.putInteger(spiBytes.length, abaos);
message[7] = abaos.toByteArray();
message[8] = spiBytes;
auth =
hdr.getCheckedAuthBlockList(message,
SLPConfig.getSLPConfig().getAdvertHeartbeatTime());
// Parse out auth blocks.
baos.write((byte)(auth.size() & 0xFF)); // auth block count
hdr.nbytes += 1;
AuthBlock.externalizeAll(hdr, auth, baos);
} else {
baos.write((byte)0);
}
// Save bytes.
hdr.payload = baos.toByteArray();
hdr.constructDescription("DAAdvert",
" timestamp="+timestamp+"\n"+
" URL="+url+"\n"+
" attrs="+attrs+"\n"+
" SPIs="+spisString+"\n"+
" auth block="+AuthBlock.desc(auth) +
"\n");
}
// Put out the lower 32 bits of the timestamp.
static private void
putInt32(SrvLocHeader hdr, long i, ByteArrayOutputStream baos) {
baos.write((byte) ((i >> 24) & 0xFF));
baos.write((byte) ((i >> 16) & 0xFF));
baos.write((byte) ((i >> 8) & 0xFF));
baos.write((byte) (i & 0XFF));
hdr.nbytes += 4;
}
}