root/usr/src/lib/libslp/javalib/com/sun/slp/SAttrMsg.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.
 *
 */

//  SAttrMsg.java:    Message class for SLP attribute request.
//  Author:           James Kempf
//  Created On:       Thu Oct  9 14:24:55 1997
//  Last Modified By: James Kempf
//  Last Modified On: Tue Oct 27 10:57:41 1998
//  Update Count:     131
//

package com.sun.slp;

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


/**
 * The SAttrMsg class models the SLP server side attribute message.
 * Subclasses for other versions can specialize the
 * initialize() and makeReply() methods.
 *
 * @author James Kempf
 */

class SAttrMsg extends SrvLocMsgImpl {

    ServiceURL URL = null;      // nonNull if a URL query.
    String serviceType = null;  // nonNull if a service type query.
    Vector tags = new Vector(); // Vector of String tags.
    String spi = "";          // requested SPI

    protected SAttrMsg() {}

    // Construct a SAttrMsg from the input stream. This will
    //  be an SLP attribute request.

    SAttrMsg(SrvLocHeader hdr, DataInputStream dis)
        throws ServiceLocationException, IOException {

        super(hdr, SrvLocHeader.AttrRqst);

        this.initialize(dis);

    }

    // Initialize the message object.

    void initialize(DataInputStream dis)
        throws ServiceLocationException, IOException {

        SLPServerHeaderV2 hdr = (SLPServerHeaderV2)getHeader();
        StringBuffer buf = new StringBuffer();

        // Parse in the previous responder's list.

        hdr.parsePreviousRespondersIn(dis);

        // Parse in the URL or service type.

        hdr.getString(buf, dis);

        String urlOrServiceType = buf.toString();

        // Decide whether this is a service type or service URL

        try {
            URL = new ServiceURL(urlOrServiceType, ServiceURL.LIFETIME_NONE);

            serviceType = null;

        } catch (IllegalArgumentException ex) {

            // Validate and remove IANA.

            ServiceType t = new ServiceType(urlOrServiceType);

            serviceType = t.toString();

            URL = null;
        }

        // Parse in the scopes.

        hdr.parseScopesIn(dis);

        // Parse in the attribute tags.

        hdr.getString(buf, dis);

        tags = hdr.parseCommaSeparatedListIn(buf.toString(), true);

        // Unescape tags.

        hdr.unescapeTags(tags);

        // Get the SPI

        hdr.getString(buf, dis);

        spi = buf.toString();

        // Construct the description.

        hdr.constructDescription("AttrRqst",
                                 "         " +
                                 (URL != null ?
                                        ("URL=``" + URL):
                                        ("service type=``" + serviceType)) +
                                 "''\n" +
                                 "         tags=``" + tags + "''\n" +
                                 "         spi=``" + spi + "''\n");
    }

    // Construct an SAttrMsg payload for reply to client. This will
    //  be an AttrRply message.

    SrvLocMsg makeReply(Vector attrs, Hashtable auth)
        throws ServiceLocationException {

        SLPServerHeaderV2 hdr =
            ((SLPServerHeaderV2)getHeader()).makeReplyHeader();

        hdr.iNumReplies = attrs.size();

        // Select AuthBlock with requested SPI
        if (auth != null) {
            AuthBlock selectedAuth = AuthBlock.getEquivalentAuth(spi, auth);
            auth = null;
            if (selectedAuth != null) {
                auth = new Hashtable();
                auth.put(spi, selectedAuth);
            }
        }

        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        hdr.parseAttributeVectorOut(attrs, 0, (auth != null),
                                    auth, baos, true);

        hdr.payload = baos.toByteArray();

        // Construct description.

        hdr.constructDescription("AttrRply",
                                 "        attributes=``" +
                                 attrs +
                                 "''\n" +
                                 "        auth block=" +
                                 AuthBlock.desc(auth) +
                                 "\n");

        return hdr;

    }

}