/*
* 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.
*
*/
// CSrvMsg.java: Message class for SLP service reply.
// Author: James Kempf
// Created On: Thu Oct 9 15:09:32 1997
// Last Modified By: James Kempf
// Last Modified On: Tue Oct 27 11:01:45 1998
// Update Count: 127
//
package com.sun.slp;
import java.util.*;
import java.io.*;
/**
* The CSrvMsg class models the SLP client side service message.
*
* @author James Kempf
*/
class CSrvMsg extends SrvLocMsgImpl {
Vector serviceURLs = new Vector(); // vector of ServiceURL objects
Hashtable URLSignatures = new Hashtable(); // authentication block lists.
// Only used for testing.
protected CSrvMsg() { }
// Construct a CSrvMsg from the byte input stream. This is a SrvRply.
// error code is already parsed.
CSrvMsg(SLPHeaderV2 hdr, DataInputStream dis)
throws ServiceLocationException, IOException {
super(hdr, SrvLocHeader.SrvRply);
// Don't parse the rest if there's an error.
if (hdr.errCode != ServiceLocationException.OK) {
return;
}
// Note that we ignore the overflow flag here, because the spec
// disallows partial URL entries, and so we should be able
// to parse in the rest of the message even if there is overflow.
// This is different from other messages.
parseServiceURLsIn(hdr, dis);
}
// Parse in a vector of service URLs including lifetime.
protected void parseServiceURLsIn(SLPHeaderV2 hdr, DataInputStream dis)
throws ServiceLocationException, IOException {
// Get the number of service URL's.
int i, n = hdr.getInt(dis);
// Get the service URL's including lifetime.
for (i = 0; i < n; i++) {
ServiceURL surl =
hdr.parseServiceURLIn(dis, URLSignatures,
ServiceLocationException.PARSE_ERROR);
serviceURLs.addElement(surl);
// Verify the signature if any. Doing it here saves muss and
// fuss in the upper layers.
Hashtable auth = (Hashtable) URLSignatures.get(surl);
if (auth != null) {
AuthBlock.verifyAll(auth);
}
}
// Set the header number of replies received.
hdr.iNumReplies = serviceURLs.size();
}
// Construct a CSrvMsg from the arguments.
CSrvMsg(Locale locale,
ServiceType serviceType,
Vector scopes,
String query)
throws ServiceLocationException {
this.initialize(locale, serviceType, scopes, query);
}
// Initialize as a SLPv2 SrvRqst.
protected void
initialize(Locale locale,
ServiceType serviceType,
Vector scopes,
String query)
throws ServiceLocationException {
SLPHeaderV2 hdr = new SLPHeaderV2(SrvLocHeader.SrvReq, false, locale);
this.hdr = hdr;
hdr.scopes = (Vector)scopes.clone();
// Set up for previous responders.
hdr.previousResponders = new Vector();
// Create the payload for the message.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// Escape scope strings.
hdr.escapeScopeStrings(scopes);
// Retrieve the configured SPI, if any
String spi = "";
if (SLPConfig.getSLPConfig().getHasSecurity()) {
LinkedList spiList = AuthBlock.getSPIList("sun.net.slp.SPIs");
if (spiList != null && !spiList.isEmpty()) {
// There can be only one configured SPI for UAs
spi = (String) spiList.getFirst();
}
}
// Write out the service type.
hdr.putString(serviceType.toString(), baos);
// Write out scopes.
hdr.parseCommaSeparatedListOut(scopes, baos);
// Write out query.
hdr.putString(query, baos);
// Write out SPI
hdr.putString(spi, baos);
hdr.payload = baos.toByteArray();
}
//
// Property accessors
//
final Hashtable getURLSignature(ServiceURL URL) {
return (Hashtable)(URLSignatures.get(URL));
}
final void setURLSignature(ServiceURL URL, Hashtable sig)
throws IllegalArgumentException {
if (sig == null) {
URLSignatures.remove(URL);
} else {
URLSignatures.put(URL, sig);
}
}
}