CSrvTypeMsg.java revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (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
*/
/*
* ident "%Z%%M% %I% %E% SMI"
*
* Copyright (c) 1999 by Sun Microsystems, Inc.
* All rights reserved.
*
*/
// SCCS Status: %W% %G%
// CSrvTypeMsg.java: Message class for SLP service type reply
// Author: James Kempf
// Created On: Thu Oct 9 16:15:36 1997
// Last Modified By: James Kempf
// Last Modified On: Tue Oct 27 10:57:38 1998
// Update Count: 80
//
package com.sun.slp;
import java.util.*;
import java.io.*;
/**
* The CSrvTypeMsg class models the SLP service type reply message.
*
* @version %R%.%L% %D%
* @author James Kempf
*/
class CSrvTypeMsg extends SrvLocMsgImpl {
// Names contain both the service type and naming authority.
Vector serviceTypes = new Vector(); // vector of Strings
// Only used for testing.
protected CSrvTypeMsg() { }
// Construct a CSrvTypeMsg from the byte input stream. This will be
// a SrvTypeRply.
CSrvTypeMsg(SLPHeaderV2 hdr, DataInputStream dis)
throws ServiceLocationException, IOException {
super(hdr, SrvLocHeader.SrvTypeRply);
// Don't parse the rest if there's an error.
if (hdr.errCode != ServiceLocationException.OK) {
return;
}
// Return if packet overflowed.
if (hdr.overflow) {
return;
}
StringBuffer buf = new StringBuffer();
hdr.getString(buf, dis);
serviceTypes =
hdr.parseCommaSeparatedListIn(buf.toString(), true);
// Validate service types.
int i, n = serviceTypes.size();
for (i = 0; i < n; i++) {
// Validate.
ServiceType type =
new ServiceType((String)serviceTypes.elementAt(i));
serviceTypes.setElementAt(type, i);
}
// Set the number of replies.
hdr.iNumReplies = serviceTypes.size();
}
// Construct a CSrvTypeMsg from the arguments. This will be
// a SrvTypeRqst for transmission to the server.
CSrvTypeMsg(Locale locale, String na, Vector scopes)
throws ServiceLocationException {
SLPHeaderV2 hdr =
new SLPHeaderV2(SrvLocHeader.SrvTypeRqst, false, locale);
this.hdr = hdr;
hdr.scopes = (Vector)scopes.clone();
// Convert names.
String namingAuthority = na.toLowerCase();
// Verify.
if (!namingAuthority.equals(Defaults.ALL_AUTHORITIES)) {
ServiceType.validateTypeComponent(namingAuthority);
}
// Check for IANA.
if (namingAuthority.equals(ServiceType.IANA)) {
throw
new ServiceLocationException(
ServiceLocationException.PARSE_ERROR,
"service_type_syntax",
new Object[] { namingAuthority });
}
// Set up previous responders.
hdr.previousResponders = new Vector();
// Make payload.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// Parse out the naming authority name.
parseNamingAuthorityOut(hdr, namingAuthority, baos);
// Escape scope strings.
hdr.escapeScopeStrings(scopes);
// Parse out the scope.
hdr.parseCommaSeparatedListOut(scopes, baos);
hdr.payload = baos.toByteArray();
}
// Parse out the naming authority.
protected void
parseNamingAuthorityOut(SLPHeaderV2 hdr,
String name,
ByteArrayOutputStream baos) {
// Write out the naming authority.
if (name.length() <= 0) {
hdr.putInt(0, baos);
} else if (name.equals(Defaults.ALL_AUTHORITIES)) {
hdr.putInt(0xFFFF, baos);
} else {
hdr.putString(name, baos);
}
}
}