001/**
002 *
003 * Copyright the original author or authors
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 *     http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.jivesoftware.smackx.bytestreams.ibb;
018
019import org.jivesoftware.smack.SmackException.NotConnectedException;
020import org.jivesoftware.smack.XMPPConnection;
021import org.jivesoftware.smack.packet.IQ;
022import org.jivesoftware.smackx.bytestreams.BytestreamRequest;
023import org.jivesoftware.smackx.bytestreams.ibb.packet.Open;
024
025/**
026 * InBandBytestreamRequest class handles incoming In-Band Bytestream requests.
027 * 
028 * @author Henning Staib
029 */
030public class InBandBytestreamRequest implements BytestreamRequest {
031
032    /* the bytestream initialization request */
033    private final Open byteStreamRequest;
034
035    /*
036     * In-Band Bytestream manager containing the XMPP connection and helper
037     * methods
038     */
039    private final InBandBytestreamManager manager;
040
041    protected InBandBytestreamRequest(InBandBytestreamManager manager,
042                    Open byteStreamRequest) {
043        this.manager = manager;
044        this.byteStreamRequest = byteStreamRequest;
045    }
046
047    /**
048     * Returns the sender of the In-Band Bytestream open request.
049     * 
050     * @return the sender of the In-Band Bytestream open request
051     */
052    public String getFrom() {
053        return this.byteStreamRequest.getFrom();
054    }
055
056    /**
057     * Returns the session ID of the In-Band Bytestream open request.
058     * 
059     * @return the session ID of the In-Band Bytestream open request
060     */
061    public String getSessionID() {
062        return this.byteStreamRequest.getSessionID();
063    }
064
065    /**
066     * Accepts the In-Band Bytestream open request and returns the session to
067     * send/receive data.
068     * 
069     * @return the session to send/receive data
070     * @throws NotConnectedException 
071     */
072    public InBandBytestreamSession accept() throws NotConnectedException {
073        XMPPConnection connection = this.manager.getConnection();
074
075        // create In-Band Bytestream session and store it
076        InBandBytestreamSession ibbSession = new InBandBytestreamSession(connection,
077                        this.byteStreamRequest, this.byteStreamRequest.getFrom());
078        this.manager.getSessions().put(this.byteStreamRequest.getSessionID(), ibbSession);
079
080        // acknowledge request
081        IQ resultIQ = IQ.createResultIQ(this.byteStreamRequest);
082        connection.sendPacket(resultIQ);
083
084        return ibbSession;
085    }
086
087    /**
088     * Rejects the In-Band Bytestream request by sending a reject error to the
089     * initiator.
090     * @throws NotConnectedException 
091     */
092    public void reject() throws NotConnectedException {
093        this.manager.replyRejectPacket(this.byteStreamRequest);
094    }
095
096}