/****************************************************************************
* 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);
}
}