usr/src/lib/libslp/javalib/com/sun/slp/SLPHeaderV2.java
author Mark J. Nelson <Mark.J.Nelson@Sun.COM>
Wed, 06 Aug 2008 16:29:39 -0600
changeset 7298 b69e27387f74
parent 3517 79d66aa80b8b
permissions -rw-r--r--
6733918 Teamware has retired, please welcome your new manager, Mercurial 4758439 some files use "current date" sccs keywords 6560843 asm sources should not rely on .file "%M%" for naming STT_FILE symbols 6560958 Solaris:: perl modules should not use SCCS keywords in version information 6729074 webrev doesn't deal well with remote ssh hg parents
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
7298
b69e27387f74 6733918 Teamware has retired, please welcome your new manager, Mercurial
Mark J. Nelson <Mark.J.Nelson@Sun.COM>
parents: 3517
diff changeset
     5
 * Common Development and Distribution License (the "License").
b69e27387f74 6733918 Teamware has retired, please welcome your new manager, Mercurial
Mark J. Nelson <Mark.J.Nelson@Sun.COM>
parents: 3517
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
 * Copyright (c) 2001 by Sun Microsystems, Inc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
//  SLPHeaderV2.java:   Base class for Service Location Messages
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
//  Author:           James Kempf
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
//  Created On:       Thu Oct  9 08:50:31 1997
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
//  Last Modified By: James Kempf
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
//  Last Modified On: Wed Jan  6 15:24:26 1999
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
//  Update Count:     472
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
//
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
package com.sun.slp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
import java.util.*;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
import java.net.*;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
import java.io.*;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
/**
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 * The SLPHeaderV2 class serves as the header class for all SLPv2 messages.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
 * It contains instance variables for SLP message header contents,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
 * and implements the SLPHeaderV2 interface.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
 * @author James Kempf
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
class SLPHeaderV2 extends SrvLocHeader implements Cloneable {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
    // Support for options.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
    private int optOff = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
    Hashtable optTable = new Hashtable();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
    // Maximum message size (24 bits).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
    private final static int MAX_MESSAGE_LENGTH = 0xffffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
    // Location of flag byte.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
    static final int FLAG_BYTE = 4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
    // Various header flags.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
    protected static final int NOFLAG   = 0x00;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
    static final int           OVERFLOW = 0x80;  // needed by Transact.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
    protected static final int FRESH    = 0x40;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
    protected static final int MCAST    = 0x20;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
    // Header sizes. Note that this doesn't include the language tag,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
    //  which is variable.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
    protected static final int REST_HEADER_BYTES = 12;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
    protected static final int HEADER_BYTES =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
	VERSION_FUNCTION_BYTES + REST_HEADER_BYTES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
    // Maximum protected scopes allowed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
    protected static final int MAX_PROTECTED_SCOPES = 255;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
    // Registered option classes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
    protected static Hashtable optClasses = new Hashtable();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
    // Manditory option range.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
    protected static int MANDATORY_OPTION_LOW = 0x4000;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
    protected static int MANDATORY_OPTION_HIGH = 0x7fff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
    // Sizes of option id and extension fields (in bytes).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
    protected static int OPT_ID_SIZE = 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
    protected static int OPT_OFF_SIZE = 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
    // Interfaces for options to use.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
    interface OptionParser {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	// Parse the option from the data stream. We include the header also,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	//  in case it is needed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	abstract SLPOption parse(SLPHeaderV2 hdr, DataInputStream dsr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	    throws ServiceLocationException, IOException;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
    interface SLPOption {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	// Externalize the option to the byte array stream. We include the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	//  header also, in case it is needed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	abstract void externalize(SLPHeaderV2 hdr, ByteArrayOutputStream baos)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	    throws ServiceLocationException;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
    // Register an option parsing class.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
    static void registerOptionClass(int id, Class optClass) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	Integer key = new Integer(id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	// We should probably check if it implements SLPOption.OptionParser,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	//  but...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	optClasses.put(key, optClass);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
    // Header instance variables.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
    // For the incoming message side.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
    SLPHeaderV2() {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	super();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	version = Defaults.version;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
    // Initialize the new SLPHeaderV2 from the input stream. Version and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
    //  function code have already been removed from the stream.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
    void parseHeader(int functionCode, DataInputStream dis)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	throws ServiceLocationException, IOException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	this.functionCode = functionCode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
	nbytes += 2;  // for version and function code...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	// Get length.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	length = getInt24(dis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	// Get flags.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	byte[] b = new byte[2];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	dis.readFully(b, 0, 2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	nbytes += 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	byte flags   = (byte) ((char)b[0] & 0xFF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	overflow = ((flags & OVERFLOW) != NOFLAG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	fresh = ((flags & FRESH) != NOFLAG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	mcast = ((flags & MCAST) != NOFLAG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	// We could check for null on reserved part of flags field, but
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	//  in the spirit of "be liberal in what you receive" we don't.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	// Get option offset.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	optOff = getInt24(dis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	// Check option offset for sanity.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	if (optOff > length) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
		new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
				"option_error",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
				new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
		    new Integer(optOff), new Integer(length)});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	// Get transaction id.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	xid = (short)getInt(dis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	// Get language code.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	StringBuffer buf = new StringBuffer();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	getString(buf, dis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	locale = SLPConfig.langTagToLocale(buf.toString());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	// Everything went OK coming in, so set the error code.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	errCode = ServiceLocationException.OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
    // By default, the header parses the client side message. A server
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
    //  side subclass must replace this. We do this so that the amount of code
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
    //  in the client is minimized, since this class must be in both.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
    SrvLocMsg parseMsg(DataInputStream dis)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	throws ServiceLocationException,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	       IOException,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	       IllegalArgumentException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
	SrvLocMsg rply = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
	// Get the error code, if not SAAdvert.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
	if (functionCode != SrvLocHeader.SAAdvert) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	    errCode = (short)getInt(dis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
	// Switch and convert according to function code.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
	switch (functionCode) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	case SrvLocHeader.SrvRply:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
	    rply = new CSrvMsg(this, dis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
	case SrvLocHeader.AttrRply:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	    rply = new CAttrMsg(this, dis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
	    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
	case SrvLocHeader.SrvTypeRply:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
	    rply = new CSrvTypeMsg(this, dis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
	    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	case SrvLocHeader.DAAdvert:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	    rply = new CDAAdvert(this, dis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
	case SrvLocHeader.SrvAck:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
	    // We act as a SrvAck.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
	    rply = this;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
	    iNumReplies = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
	    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	case SrvLocHeader.SAAdvert:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
	    rply = new CSAAdvert(this, dis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
	    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
		new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
				"function_code_error",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
				new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
		    new Integer(functionCode)});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
	// Check for size overflow.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
	if (nbytes > length) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
	    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
		new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
				"length_overflow",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
				new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
		    new Integer(nbytes), new Integer(length)});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	return rply;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
    // Construct a header for output. Used by the client side code to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
    //  construct an initial request and the server side code to construct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
    //  a reply.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
    SLPHeaderV2(int functionCode, boolean fresh, Locale locale)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	// Check for proper function code and nonnull locale.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
	Assert.slpassert(((functionCode <= SAAdvert) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
	    (functionCode >= SrvReq)),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
		      "function_code_error",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
		      new Object[] {new Integer(functionCode)});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
	Assert.slpassert((locale != null),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
		      "null_locale_error",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
		      new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
	this.version = Defaults.version;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	this.functionCode = functionCode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
	this.locale = locale;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
	this.xid = getUniqueXID();  // client can change it later if they want.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	this.fresh = fresh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
	// If there's not enough for the error code (if any), then signal
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	//  an error. The assumption here is that the message is going
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	//  via UDP or multicast.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	byte[] ltag =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	    getStringBytes(SLPConfig.localeToLangTag(locale), Defaults.UTF8);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	int headerLen = ltag.length + HEADER_BYTES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	int payLen =  packetLength - headerLen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	if (payLen < SHORT_SIZE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
	    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
		new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
				ServiceLocationException.BUFFER_OVERFLOW,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
				"buffer_overflow",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
				new Object[] {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
		    new Integer(headerLen + SHORT_SIZE),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
			new Integer(packetLength)});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
    // Externalize the message by converting it to bytes and writing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
    //  it to the output stream.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
    public void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
	externalize(ByteArrayOutputStream baos, boolean mcast, boolean isTCP)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	// Convert the locale to a tag. We need the length.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
	byte[] ltagBytes =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
	    getStringBytes(SLPConfig.localeToLangTag(locale), Defaults.UTF8);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
	int ltagLen = ltagBytes.length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
	// Set the multicast flag.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	this.mcast = mcast;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	// We need to get stuff into another stream first, so we can correctly
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
	//  calculate the length.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	ByteArrayOutputStream bbaos = new ByteArrayOutputStream();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	// Need to put in the error code. There will only be an error code
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
	//  if error codes are applicable for this message type. Note
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
	//  that room for the error code was reserved in the initial
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
	//  calculation of the header, so there should always be room
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	//  for it, even if the packet overflowed otherwise.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
	if (functionCode == SrvLocHeader.SrvAck ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
	    functionCode == SrvLocHeader.SrvTypeRply ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
	    functionCode == SrvLocHeader.SrvRply ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
	    functionCode == SrvLocHeader.AttrRply ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
	    functionCode == SrvLocHeader.DAAdvert) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
	    putInt(errCode, bbaos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
	// Put in the previous responders, if there are any. Note that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
	//  there may be only when the error code is not put out.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
	//  We check against the packet size during parsing so that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
	//  we don't overflow the packet and throw a special exception
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
	//  if an overflow happens. We only put out the previous
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
	//  responders list if the request is going by multicast, but
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
	//  we need to put out an empty vector for unicast requests.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
	int prevResLen =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
	    packetLength - (payload.length + HEADER_BYTES + ltagLen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
	Vector resp = previousResponders;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
	if (resp != null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
	    resp = (mcast ? resp:new Vector());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
	    parsePreviousRespondersOut(resp, bbaos, prevResLen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
	// If the error code is OK, then insert the rest of the message
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
	//  and parse the options. If there was an error,
3517
79d66aa80b8b 6363303 numerous source files misspell "relevant"
mp204432
parents: 0
diff changeset
   386
	//  this step is skipped because the data isn't relevant.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
	if (errCode == ServiceLocationException.OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
	    bbaos.write(payload, 0, payload.length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
	    // Externalize any options.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
	    optOff = externalizeOptions(bbaos, ltagLen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
	byte[] payloadBytes = bbaos.toByteArray();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
	// Set the length here to the actual length of the packet.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
	length = HEADER_BYTES + ltagLen + payloadBytes.length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
	// If we exceed the 24 bit length size, we are hosed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
	if (length > MAX_MESSAGE_LENGTH) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
	    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
		new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
				ServiceLocationException.PARSE_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
				"max_msg_size_exceeded",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
				new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
	// Truncate if necessary. We will always have room for a header
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
	//  and error code because we check when creating the object.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
	//  Note that no URL block will be truncated because the spec
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	//  says it can't be.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
	if (!isTCP && (length > packetLength)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	    overflow = true;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
	    length = packetLength;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
	    byte[] newBytes = new byte[packetLength];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
	    System.arraycopy(payloadBytes, 0, newBytes, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
			     length - (HEADER_BYTES + ltagLen));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
	    payloadBytes = newBytes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
	//
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
	// Write out the header.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
	//
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
	// Write version and function code.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
	baos.write((byte) (0xFF & version));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
	baos.write((byte) (0xFF & functionCode));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
	// Put length in.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
	putInt24(length, baos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
	// Put in flags.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
	byte flags = (byte)NOFLAG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
	if (overflow) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
	    flags = (byte)(flags | OVERFLOW);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
	    flags = (byte)(flags & ~OVERFLOW);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
	if (fresh) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
	    flags = (byte)((flags | FRESH) & 0xFF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
	    flags = (byte)((flags & ~FRESH) & 0xFF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
	if (mcast) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
	    flags = (byte)((flags | MCAST) & 0xFF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
	    flags = (byte)((flags & ~MCAST) & 0xFF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
	// Write out flags.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
	baos.write((byte) (0xFF & flags));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
	baos.write((byte)0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
	putInt24(optOff, baos);  // write option offset,  if any.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
	putInt(xid, baos);  // write xid.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
	putInt(ltagLen, baos);  // write lang size.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
	baos.write(ltagBytes, 0, ltagBytes.length);  // write lang tag.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
	//
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
	// Write the body.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
	//
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
	baos.write(payloadBytes, 0, payloadBytes.length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
    // Option handling.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
    // Parse any options.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
    void parseOptions(DataInputStream dsr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
	throws ServiceLocationException,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
	       IOException,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
	       IllegalArgumentException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
	// If no options return.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
	if (optOff == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
	    return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
	int optNext = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
	// Parse any options in the data stream.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
	    // Parse extension id.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
	    int optId = getInt(dsr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
	    // Parse extension offset.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
	    optNext = getInt(dsr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
	    // Lookup an option parser.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
	    Integer key = new Integer(optId);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
	    Class optClass = (Class)optClasses.get(key);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
	    // May be an exception if class is null.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
	    if (optClass == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
		// In mandatory range. Throw an exception.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
		if ((optId >= MANDATORY_OPTION_LOW) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
		    (optId <= MANDATORY_OPTION_HIGH)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
		    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
			new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
				ServiceLocationException.OPTION_NOT_SUPPORTED,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
				"v2_unsup_option",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
				new Object[] {key});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
		// Skip the rest of the option.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
		int skipStart = length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
		if (optNext != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
		    skipStart = optNext;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
		dsr.skipBytes(skipStart - nbytes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
	    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
		try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
		    // Parse the option.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
		    OptionParser optParser =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
			(OptionParser)optClass.newInstance();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
		    SLPOption opt = optParser.parse(this, dsr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
		    // Insert option into option table.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
		    optTable.put(key, opt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
		} catch (InstantiationException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
		    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
			new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
				ServiceLocationException.INTERNAL_SYSTEM_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
				"v2_option_inst",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
				new Object[] {key, ex});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
		} catch (IllegalAccessException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
		    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
			new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
				ServiceLocationException.INTERNAL_SYSTEM_ERROR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
				"v2_option_sec",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
				new Object[] {key, ex});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
	} while (optNext != 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
    // Externalize any options.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
    private int externalizeOptions(ByteArrayOutputStream baos, int langTagLen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
	// Calculate offset to options, if any.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
	int toOpt  = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
	if (optTable.size() <= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
	    return toOpt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
	toOpt = HEADER_BYTES + langTagLen + baos.size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
	// For all options in the table, parse them out.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
	Enumeration en = optTable.keys();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
	int nextOpt = toOpt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
	while (en.hasMoreElements()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
	    Integer id = (Integer)en.nextElement();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
	    SLPOption opt = (SLPOption)optTable.get(id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
	    ByteArrayOutputStream obaos = new ByteArrayOutputStream();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
	    // Linearize option object.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
	    opt.externalize(this, obaos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
	    // Calculate offset to next options.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
	    nextOpt += obaos.size() + OPT_ID_SIZE + OPT_OFF_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
	    // Plop it into the output stream.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
	    putInt(id.intValue(), baos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
	    // Check whether there are more options first. If so, then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
	    //  the next offset is zero.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
	    if (en.hasMoreElements()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
		putInt(nextOpt, baos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
	    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
		putInt(0, baos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
	    byte[] bytes = obaos.toByteArray();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
	    baos.write(bytes, 0, bytes.length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
	return toOpt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
    // Parse the previous responder list out, being sure to truncate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
    //  so the list is syntactically correct if there is an overflow.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
    //  This duplicates the comma separated list code to a certain
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
    //  extent.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
    private void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
	parsePreviousRespondersOut(Vector resp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
				   ByteArrayOutputStream baos,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
				   int available)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
	ByteArrayOutputStream bbaos = new ByteArrayOutputStream();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
	int i, n = resp.size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
	for (i = 0; i < n; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
	    String address = (String)resp.elementAt(i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
	    // Add comma if necessary.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
	    if (i > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
		address = "," + address;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
	    // Convert to UTF8 bytes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
	    byte[] bytes = getStringBytes(address, Defaults.UTF8);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
	    // Write bytes to stream if there's room.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
	    if (bytes.length <= available) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
		bbaos.write(bytes, 0, bytes.length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
		available = available - bytes.length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
	    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
		// Throw exception, upper layers need to break off multicast.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
		//  This exception should *never* be surfaced.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
		    new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
			ServiceLocationException.PREVIOUS_RESPONDER_OVERFLOW,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
			"v2_prev_resp_overflow",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
			new Object[] {});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
	// Now write to the real stream.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
	byte[] out = bbaos.toByteArray();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
	putInt(out.length, baos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
	baos.write(out, 0, out.length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
	nbytes += out.length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
    //  Utilities for parsing service URL's and attribute lists, with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
    //  authentication information.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
    // Parse in a service URL including lifetime if necessary.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
    ServiceURL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
	parseServiceURLIn(DataInputStream dis,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
			  Hashtable authTable,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
			  short err)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
	throws ServiceLocationException, IOException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
	// Ignore reserved byte.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
	byte[] b = new byte[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
	dis.readFully(b, 0, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
	nbytes += 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
	// Get URL lifetime.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
	int lifetime = getInt(dis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
	// Get URL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
	StringBuffer buf = new StringBuffer();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
	byte[] rawBytes = getString(buf, dis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
	// Get auth block, if any.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
	Hashtable auth = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
	// Get number of auth blocks.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
	b = new byte[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
	dis.readFully(b, 0, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
	nbytes += 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
	byte nauths = (byte)(b[0] & 0xFF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
	if (nauths > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
	    ByteArrayOutputStream abaos = new ByteArrayOutputStream();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
	    putInteger(rawBytes.length, abaos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
	    Object[] message = new Object[2];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
	    message[0] = abaos.toByteArray();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
	    message[1] = rawBytes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
	    auth = getCheckedAuthBlockList(message, nauths, dis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
	    lifetime = AuthBlock.getShortestLifetime(auth);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
	String ssurl = buf.toString();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
	ServiceURL url = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
	try {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
	    url = new ServiceURL(ssurl, lifetime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
	} catch (IllegalArgumentException ex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
	    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
		new ServiceLocationException(err,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
					     "malformed_url",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
					     new Object[] {ex.getMessage()});
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
	if (auth != null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
	    // Put it in the auth block for this URL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
	    authTable.put(url, auth);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
	return url;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
    // Parse out a service URL, create authentication blocks if necessary.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
    //  Return true if the URL was output. Check that we don't overflow
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
    //  packet size in the middle.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
    boolean
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
	parseServiceURLOut(ServiceURL surl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
			   boolean urlAuth,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
			   Hashtable auth,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
			   ByteArrayOutputStream baos,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
			   boolean checkOverflow)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
	// We need to keep track of size, so we don't overflow packet length.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
	ByteArrayOutputStream bbaos = new ByteArrayOutputStream();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
	int mbytes = nbytes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
	// Convert the URL to bytes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
	byte[] bytes =  getStringBytes(surl.toString(), Defaults.UTF8);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
	// Parse out reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
	bbaos.write((byte)(0xFF & 0));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
	nbytes += 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
	// Parse out the lifetime.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
	putInt(surl.getLifetime(), bbaos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
	byte bs = (byte)0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
	// Process auth block list if required.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
	if (urlAuth) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
	    // Create an auth block if necessary.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
	    if (auth == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
		ByteArrayOutputStream abaos = new ByteArrayOutputStream();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
		putInteger(bytes.length, abaos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
		Object[] message = new Object[2];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
		message[0] = abaos.toByteArray();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
		message[1] = bytes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
		auth = getCheckedAuthBlockList(message, surl.getLifetime());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
	    bs = (byte) auth.size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
	    Object[] bytesArray = AuthBlock.getContents(auth);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
	    bytes = (byte[]) bytesArray[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
	// Put out the URL bytes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
	putInt(bytes.length, bbaos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
	bbaos.write(bytes, 0, bytes.length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
	nbytes += bytes.length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
	// Write auth block size.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
	bbaos.write((byte)(0xFF & bs));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
	nbytes += 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
	// If there are auth blocks required, put them out now.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
	if (bs > (byte)0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
	    AuthBlock.externalizeAll(this, auth, bbaos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
	// If we can, write it out.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
	bytes = bbaos.toByteArray();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
	if (!checkOverflow || nbytes <= packetLength) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
	    baos.write(bytes, 0, bytes.length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
	    return true; // nbytes already set...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
	    nbytes = mbytes; // truncate...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
	    return false;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
    // Parse in a potentially authenticated attribute list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
    Hashtable
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
	parseAuthenticatedAttributeVectorIn(Vector attrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
					    DataInputStream dis,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
					    boolean allowMultiValuedBooleans)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
	throws ServiceLocationException, IOException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
	// First, parse in the attribute vector.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
	byte[] rawBytes =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
	    parseAttributeVectorIn(attrs, dis, allowMultiValuedBooleans);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
	ByteArrayOutputStream abaos = new ByteArrayOutputStream();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
	putInteger(rawBytes.length, abaos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
	Object[] message = new Object[2];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
	message[0] = abaos.toByteArray();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
	message[1] = rawBytes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
	// Get the attribute list signature, if necessary.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
	return parseSignatureIn(message, dis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
    // Parse in a list of attributes into attrs, returing raw bytes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
    //  ServiceLocationAttribute objects. Clients take care of auth blocks.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
    byte[]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
	parseAttributeVectorIn(Vector attrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
			       DataInputStream dis,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
			       boolean allowMultiValuedBooleans)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
	throws ServiceLocationException, IOException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
	StringBuffer buf = new StringBuffer();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
	byte[] rawBytes  = getString(buf, dis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
	// Parse the list into ServiceLocationAttribute objects.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
	Vector attrForms = parseCommaSeparatedListIn(buf.toString(), false);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
	int i, n = attrForms.size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
	for (i = 0; i < n; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
	    String attrForm =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
		(String)attrForms.elementAt(i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
	    attrs.addElement(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
		new ServiceLocationAttribute(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
			attrForm, allowMultiValuedBooleans));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
	return rawBytes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
    // Parse out a vector of ServiceLocationAttributes. Includes escaping
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
    //  characters.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
    byte[]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
	parseAttributeVectorOut(Vector v,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
				int lifetime,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
				boolean attrAuth,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
				Hashtable auth,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
				ByteArrayOutputStream baos,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
				boolean writeAuthCount)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
	byte[] bytes = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
	int nBlocks = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
	// Convert attribute vector to comma separated list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   946
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
	if (!attrAuth || auth == null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
	    Vector strings = new Vector();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
	    Enumeration en = v.elements();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
	    // Convert the attributes to strings, escaping characters to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
	    //  escape.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   953
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   954
	    while (en.hasMoreElements()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   955
		ServiceLocationAttribute attr =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
		    (ServiceLocationAttribute)en.nextElement();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
		strings.addElement(attr.externalize());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   959
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   960
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
	    // Create the comma separated list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   964
	    String clist = vectorToCommaSeparatedList(strings);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
	    bytes = getStringBytes(clist, Defaults.UTF8);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
	    if (attrAuth) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
		ByteArrayOutputStream abaos = new ByteArrayOutputStream();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
		putInteger(bytes.length, abaos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   970
		Object[] message = new Object[2];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   971
		message[0] = abaos.toByteArray();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
		message[1] = bytes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
		auth = getCheckedAuthBlockList(message, lifetime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   974
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   975
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
	    Object[] bytesArray = AuthBlock.getContents(auth);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   977
	    bytes = (byte[]) bytesArray[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   978
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   979
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   980
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   981
	// Get number of blocks if authentication.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   982
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   983
	if (auth != null) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   984
	    nBlocks = auth.size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   985
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   986
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   987
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   988
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   989
	// Write out the bytes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   990
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   991
	putInt(bytes.length, baos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   992
	baos.write(bytes, 0, bytes.length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   993
	nbytes += bytes.length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   994
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   995
	// Write out number of auth blocks.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   996
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   997
	if (writeAuthCount) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   998
	    baos.write((byte)(nBlocks & 0xFF));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   999
	    nbytes += 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1000
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1001
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1002
	// Write out the attribute authentication blocks.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1003
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1004
	if (attrAuth && nBlocks > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1005
	    AuthBlock.externalizeAll(this, auth, baos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1006
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1007
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1008
	return bytes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1009
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1010
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1011
    // Get an auth block list, checking first for security.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1012
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1013
    Hashtable getCheckedAuthBlockList(Object[] message, int lifetime)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1014
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1015
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1016
	if (!SLPConfig.getSLPConfig().getHasSecurity()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
	    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
		new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
				ServiceLocationException.AUTHENTICATION_ABSENT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
				"auth_classes_missing",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
				new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
	return AuthBlock.makeAuthBlocks(message, lifetime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
    // Get an SLPAuthBlockList, checking first if security is enabled.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
    Hashtable getCheckedAuthBlockList(Object[] message,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
				      byte nauth,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
				      DataInputStream dis)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
	throws ServiceLocationException, IOException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
	if (!SLPConfig.getSLPConfig().getHasSecurity()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
	    throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
		new ServiceLocationException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
				ServiceLocationException.AUTHENTICATION_ABSENT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
				"auth_classes_missing",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
				new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1042
	return AuthBlock.makeAuthBlocks(this, message, dis, nauth);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1044
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
    // Parse in an attribute signature.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
    Hashtable parseSignatureIn(Object[] message, DataInputStream dis)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
	throws ServiceLocationException, IOException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
	Hashtable auth = null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
	byte[] b = new byte[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
	dis.readFully(b, 0, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
	nbytes += 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
	byte nauths = (byte)(b[0] & 0xFF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
	if (nauths > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
	    auth = getCheckedAuthBlockList(message, nauths, dis);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
	return auth;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
    // Utility functions to help with verification of data.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
    //
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
    // Escape tags, check for strings. Trim trailing, leading whitespace,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
    //  since it is ignored for matching purposes and tags are only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
    //  used for matching.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
    void escapeTags(Vector t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
	int i, n = t.size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
	for (i = 0; i < n; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
	    Object o = t.elementAt(i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
	    if (o instanceof String) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
		// Escape tag.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
		String tag =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
		    ServiceLocationAttribute.escapeAttributeString((String)o,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
								   false);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
		t.setElementAt(tag.trim(), i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
	    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
		throw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
		    new IllegalArgumentException(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
		SLPConfig.getSLPConfig().formatMessage("nonstring_tag",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
						       new Object[0]));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
    // Unescape tags. Trim trailing and leading whitespace since it is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
    //  ignored for matching purposes and tags are only used for matching.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
    void unescapeTags(Vector t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
	int i, n = t.size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
	for (i = 0; i < n; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
	    String tag = (String)t.elementAt(i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
	    tag =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
		ServiceLocationAttribute.unescapeAttributeString(tag, false);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
	    t.setElementAt(tag.trim(), i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
    // Escape vector of scope strings.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
    static void escapeScopeStrings(Vector scopes)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
	int i, n = scopes.size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
	Vector ret = new Vector();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
	for (i = 0; i < n; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
	    String scope = (String)scopes.elementAt(i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
	    scopes.setElementAt(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
		ServiceLocationAttribute.escapeAttributeString(scope, false),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
		i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
    // Unescape vector of scope strings.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
    static void unescapeScopeStrings(Vector scopes)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
	int i, n = scopes.size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
	Vector ret = new Vector();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
	for (i = 0; i < n; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1146
	    String scope = (String)scopes.elementAt(i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1147
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
	    scopes.setElementAt(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
		ServiceLocationAttribute.unescapeAttributeString(scope, false),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
		i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
    // Error if somebody tries to do this client side.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1156
    SDAAdvert
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1157
	getDAAdvert(short xid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1158
		    long timestamp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1159
		    ServiceURL url,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1160
		    Vector scopes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1161
		    Vector attrs)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
	throws ServiceLocationException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
	Assert.slpassert(false,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
		      "v2_daadvert_client_side",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
		      new Object[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
	return null;  // never get here...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1171
    // Reimplement clone() to get the header size right.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
    public Object clone()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
	throws CloneNotSupportedException {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
	SLPHeaderV2 hdr = (SLPHeaderV2)super.clone();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
	byte[] langBytes = getStringBytes(locale.toString(),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
					  Defaults.UTF8);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
	hdr.nbytes = HEADER_BYTES + langBytes.length + 2;  // for error code...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
	return hdr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
}