/*
* 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) 2001 by Sun Microsystems, Inc.
* All rights reserved.
*
*/
// SSAAdvert.java: Server Side SAAdvert Message.
// Author: James Kempf
// Created On: Tue Feb 10 15:00:39 1998
// Last Modified By: James Kempf
// Last Modified On: Tue Oct 27 10:57:38 1998
// Update Count: 60
//
package com.sun.slp;
import java.util.*;
import java.io.*;
/**
* The SSAAdvert class models the SLP SAAdvert message.
*
* @author James Kempf
*/
class SSAAdvert extends SrvLocMsgImpl {
// Construct a SAAdvert from the arguments. This is a server side
// for transmission to the client.
SSAAdvert(int version,
short xid,
Locale locale,
ServiceURL url,
Vector scopes,
Vector attrs)
throws ServiceLocationException {
// Construct header.
hdr = new SLPServerHeaderV2();
Assert.slpassert(hdr != null,
"version_number_error",
new Object[] {new Integer(version)});
hdr.functionCode = SrvLocHeader.SAAdvert;
hdr.xid = xid;
hdr.locale = locale;
this.initialize(url, scopes, attrs);
}
// Initialize the message.
void initialize(ServiceURL url, Vector scopes, Vector attrs)
throws ServiceLocationException {
SLPServerHeaderV2 hdr = (SLPServerHeaderV2)getHeader();
ServiceType serviceType = url.getServiceType();
if (!serviceType.equals(Defaults.SA_SERVICE_TYPE)) {
throw
new ServiceLocationException(
ServiceLocationException.PARSE_ERROR,
"ssaadv_nonsaurl",
new Object[] {serviceType});
}
// Validate scope list.
DATable.validateScopes(scopes, hdr.locale);
hdr.scopes = (Vector)scopes.clone();
// Escape scope strings.
hdr.escapeScopeStrings(scopes);
// Parse out the payload.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
String surl = url.toString();
// Parse out the URL.
byte[] urlBytes = hdr.putString(surl, baos);
// Parse out the scope list. We need to save the bytes for
// the authblock.
byte[] scopeBytes =
hdr.parseCommaSeparatedListOut(scopes, baos);
// Parse out the attribute list.
byte[] attrBytes = hdr.parseAttributeVectorOut(attrs,
url.getLifetime(),
false,
null,
baos,
false);
// Parse out auth blocks, if necessary.
Hashtable auth = null;
byte nBlocks = 0;
if (SLPConfig.getSLPConfig().getHasSecurity()) {
Object[] message = new Object[6];
// None of the strings have leading length fields, so add them here
ByteArrayOutputStream abaos = new ByteArrayOutputStream();
hdr.putInteger(urlBytes.length, abaos);
message[0] = abaos.toByteArray();
message[1] = urlBytes;
abaos = new ByteArrayOutputStream();
hdr.putInteger(attrBytes.length, abaos);
message[2] = abaos.toByteArray();
message[3] = attrBytes;
abaos = new ByteArrayOutputStream();
hdr.putInteger(scopeBytes.length, abaos);
message[4] = abaos.toByteArray();
message[5] = scopeBytes;
auth = hdr.getCheckedAuthBlockList(message,
url.getLifetime());
nBlocks = (byte) auth.size();
}
// Parse out number of blocks.
baos.write(nBlocks);
hdr.nbytes++;
// Parse out blocks, if any.
if (auth != null) {
AuthBlock.externalizeAll(hdr, auth, baos);
}
// Save bytes.
hdr.payload = baos.toByteArray();
// Construct description of outgoing packet for logging.
hdr.constructDescription("SAAdvert",
" URL=``" + url + "''\n" +
" attrs=``" + attrs + "''\n" +
" auth block="+AuthBlock.desc(auth) +
"\n");
}
}