root/usr/src/lib/libslp/javalib/com/sun/slp/CSrvReg.java
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 1999 by Sun Microsystems, Inc.
 * All rights reserved.
 *
 */

//  CSrvReg.java:    Service Registration, Client Side.
//  Author:           James Kempf
//  Created On:       Tue Feb 10 12:15:43 1998
//  Last Modified By: James Kempf
//  Last Modified On: Tue Oct 27 10:57:38 1998
//  Update Count:     49
//

package com.sun.slp;

import java.util.*;
import java.io.*;


/**
 * The CSrvReg class models the client side SLP service registration
 * message.
 *
 * @author James Kempf
 */

class CSrvReg extends SrvLocMsgImpl {

    ServiceURL URL;

    // Construct a CSrvReg from the arguments. This is the SrvReg for

    CSrvReg(boolean fresh,
            Locale locale,
            ServiceURL urlEntry,
            Vector scopes,
            Vector attrs,
            Hashtable URLSignatures,
            Hashtable attrSignatures)
        throws ServiceLocationException {

        this.URL = urlEntry;

        // We do heavy checking of attributes here so that any registrations
        //  are correct.

        Hashtable attrHash = new Hashtable();
        int i, n = attrs.size();

        // Verify each attribute, merging duplicates in the vector
        //  and throwing an error if any duplicates have mismatched types.

        Vector attrList = new Vector();

        for (i = 0; i < n; i++) {
            Object o = attrs.elementAt(i);

            if (!(o instanceof ServiceLocationAttribute)) {
                throw
                    new IllegalArgumentException(
                SLPConfig.getSLPConfig().formatMessage("not_an_attribute",
                                                       new Object[0]));
            }

            // Make a new copy of the attribute, so we can modify it.

            ServiceLocationAttribute attr = (ServiceLocationAttribute)o;

            ServiceLocationAttribute.mergeDuplicateAttributes(
                new ServiceLocationAttribute(attr.getId(), attr.getValues()),
                attrHash,
                attrList,
                false);
        }

        this.initialize(fresh,
                        locale,
                        urlEntry,
                        scopes,
                        attrList,
                        URLSignatures,
                        attrSignatures);

    }

    // Initialize the object. V1 will do it differently.

    void initialize(boolean fresh,
                    Locale locale,
                    ServiceURL urlEntry,
                    Vector scopes,
                    Vector attrs,
                    Hashtable URLSignatures,
                    Hashtable attrSignatures)
        throws ServiceLocationException {

        SLPConfig config = SLPConfig.getSLPConfig();
        SLPHeaderV2 hdr = new SLPHeaderV2(SrvLocHeader.SrvReg, fresh, locale);
        this.hdr = hdr;
        hdr.scopes = (Vector)scopes.clone();

        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        // Parse out the URL. Ignore overflow.

        hdr.parseServiceURLOut(urlEntry,
                               config.getHasSecurity(),
                               URLSignatures,
                               baos,
                               false);

        // Parse out service type. It may be different from the
        //  service URL.

        ServiceType serviceType = urlEntry.getServiceType();

        hdr.putString(serviceType.toString(), baos);

        // Escape scope strings.

        hdr.escapeScopeStrings(scopes);

        // Parse out the scope list.

        hdr.parseCommaSeparatedListOut(scopes, baos);

        // Parse out the attribute list.

        hdr.parseAttributeVectorOut(attrs,
                                    urlEntry.getLifetime(),
                                    config.getHasSecurity(),
                                    attrSignatures,
                                    baos,
                                    true);

        hdr.payload = baos.toByteArray();

    }

}