Package org.eclipse.ecf.internal.provider.xmpp.filetransfer

Source Code of org.eclipse.ecf.internal.provider.xmpp.filetransfer.XMPPFileTransferRequestListener

/****************************************************************************
* Copyright (c) 2004 Composent, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*    Composent, Inc. - initial API and implementation
*****************************************************************************/

package org.eclipse.ecf.internal.provider.xmpp.filetransfer;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.IAdapterManager;
import org.eclipse.ecf.core.IContainer;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.IDFactory;
import org.eclipse.ecf.filetransfer.IFileTransferInfo;
import org.eclipse.ecf.filetransfer.IFileTransferListener;
import org.eclipse.ecf.filetransfer.IIncomingFileTransfer;
import org.eclipse.ecf.filetransfer.IIncomingFileTransferRequestListener;
import org.eclipse.ecf.filetransfer.IncomingFileTransferException;
import org.eclipse.ecf.filetransfer.events.IFileTransferEvent;
import org.eclipse.ecf.filetransfer.events.IFileTransferRequestEvent;
import org.eclipse.ecf.filetransfer.events.IIncomingFileTransferReceiveDoneEvent;
import org.eclipse.ecf.internal.provider.xmpp.XmppPlugin;
import org.eclipse.ecf.provider.xmpp.identity.XMPPID;
import org.jivesoftware.smackx.filetransfer.FileTransferListener;
import org.jivesoftware.smackx.filetransfer.FileTransferRequest;
import org.jivesoftware.smackx.filetransfer.IncomingFileTransfer;

public class XMPPFileTransferRequestListener implements FileTransferListener {

  protected IFileTransferListener transferListener;

  protected IIncomingFileTransferRequestListener requestListener;

  protected IncomingFileTransfer incoming = null;

  protected IContainer container = null;

  public XMPPFileTransferRequestListener(IContainer container,
      IIncomingFileTransferRequestListener listener) {
    this.container = container;
    this.requestListener = listener;
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * org.jivesoftware.smackx.filetransfer.FileTransferListener#fileTransferRequest
   * (org.jivesoftware.smackx.filetransfer.FileTransferRequest)
   */
  public void fileTransferRequest(final FileTransferRequest request) {
    requestListener
        .handleFileTransferRequest(new IFileTransferRequestEvent() {

          boolean requestAccepted = false;

          IFileTransferInfo fileTransferInfo = new IFileTransferInfo() {

            Map props = new HashMap();

            File f = new File(request.getFileName());

            public String getDescription() {
              return request.getDescription();
            }

            public File getFile() {
              return f;
            }

            public Map getProperties() {
              return props;
            }

            public Object getAdapter(Class adapter) {
              if (adapter == null)
                return null;
              if (adapter.isInstance(this))
                return this;
              final IAdapterManager adapterManager = XmppPlugin
                  .getDefault().getAdapterManager();
              return (adapterManager == null) ? null
                  : adapterManager.loadAdapter(this,
                      adapter.getName());
            }

            public long getFileSize() {
              return request.getFileSize();
            }

            public String getMimeType() {
              return request.getMimeType();
            }

            public String toString() {
              final StringBuffer buf = new StringBuffer(
                  "FileTransferInfo[");
              buf.append("file=").append(f);
              buf.append(";size=").append(getFileSize());
              buf.append(";description=" + getDescription());
              buf.append(";mimeType=").append(getMimeType())
                  .append("]");
              return buf.toString();
            }

          };

          public IIncomingFileTransfer accept(File localFileToSave)
              throws IncomingFileTransferException {

            try {
              final OutputStream outs = new FileOutputStream(
                  localFileToSave);
              return accept(outs, new IFileTransferListener() {
                public void handleTransferEvent(
                    IFileTransferEvent event) {
                  if (event instanceof IIncomingFileTransferReceiveDoneEvent) {
                    try {
                      outs.close();
                    } catch (final IOException e) {
                    }
                  }
                }
              });
            } catch (final FileNotFoundException e) {
              throw new IncomingFileTransferException(
                  "Exception opening file for writing", e);
            }
          }

          public IFileTransferInfo getFileTransferInfo() {
            return fileTransferInfo;
          }

          public ID getRequesterID() {
            return createIDFromName(request.getRequestor());
          }

          public void reject() {
            request.reject();
          }

          public boolean requestAccepted() {
            return requestAccepted;
          }

          public String toString() {
            final StringBuffer buf = new StringBuffer(
                "FileTransferRequestEvent[");
            buf.append("requester=").append(getRequesterID());
            buf.append(";requestAccepted=").append(
                requestAccepted());
            buf.append(";transferInfo=")
                .append(getFileTransferInfo()).append("]");
            return buf.toString();
          }

          public IIncomingFileTransfer accept(
              OutputStream outputStream,
              IFileTransferListener listener)
              throws IncomingFileTransferException {
            if (requestAccepted)
              throw new IncomingFileTransferException(
                  "Incoming request previously accepted");
            if (outputStream == null)
              throw new IncomingFileTransferException(
                  "outputStream cannot be null");
            incoming = request.accept();
            requestAccepted = true;
            try {
              return new XMPPIncomingFileTransfer(IDFactory
                  .getDefault().createStringID(
                      request.getStreamID()), request
                  .getFileName(), incoming.recieveFile(),
                  outputStream, request.getFileSize(),
                  listener);
            } catch (final Exception e) {
              throw new IncomingFileTransferException(
                  "Exception receiving file", e);
            }
          }
        });
  }

  private XMPPID createIDFromName(String uname) {
    try {
      return new XMPPID(container.getConnectNamespace(), uname);
    } catch (final Exception e) {
      return null;
    }
  }

  /**
   * @param listener2
   * @return <code>true if this has given request listener.
   */
  public boolean hasListener(IIncomingFileTransferRequestListener listener2) {
    return (listener2 == requestListener);
  }

}
TOP

Related Classes of org.eclipse.ecf.internal.provider.xmpp.filetransfer.XMPPFileTransferRequestListener

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.