/*
GNU GENERAL PUBLIC LICENSE
Copyright (C) 2006 The Lobo Project
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
verion 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Contact info: lobochief@users.sourceforge.net
*/
package org.lobobrowser.primary.clientlets.download;
import java.io.InputStream;
import org.lobobrowser.clientlet.CancelClientletException;
import org.lobobrowser.clientlet.Clientlet;
import org.lobobrowser.clientlet.ClientletContext;
import org.lobobrowser.clientlet.ClientletException;
import org.lobobrowser.clientlet.ClientletResponse;
import org.lobobrowser.primary.gui.download.DownloadDialog;
import org.lobobrowser.request.SilentUserAgentContextImpl;
import org.lobobrowser.ua.UserAgentContext;
import org.lobobrowser.util.Strings;
import org.lobobrowser.util.Urls;
public final class DownloadClientlet implements Clientlet {
public void process(final ClientletContext context) throws ClientletException {
final ClientletResponse response = context.getResponse();
final java.net.URL url = response.getResponseURL();
if (url.getProtocol().equals("file") && "".equals(url.getHost())) {
final String shorterPath = Strings.truncate(Urls.getNoRefForm(url), 64);
context.getNavigatorFrame().alert("There are no extensions that can render\r\n" + shorterPath + ".");
throw new CancelClientletException("cancel");
}
if (!"GET".equals(response.getLastRequestMethod())) {
final String shorterPath = Strings.truncate(Urls.getNoRefForm(url), 64);
context.getNavigatorFrame().alert("Cannot download document that is not accessed with method GET:\r\n" + shorterPath + ".");
throw new CancelClientletException("cancel");
}
// Load a bit of content to determine transfer speed
int transferSpeed = -1;
final int contentLength = response.getContentLength();
if (contentLength > 0) {
try (final InputStream in = response.getInputStream()) {
final long baseTime = System.currentTimeMillis();
final long maxElapsed = 1000;
final byte[] buffer = new byte[4096];
int numRead;
int totalRead = 0;
while (((System.currentTimeMillis() - baseTime) < maxElapsed) && ((numRead = in.read(buffer)) != -1)) {
totalRead += numRead;
}
// Note: This calculation depends on content not being stored in cache.
// It works just because downloads are not stored in the cache.
final long elapsed = System.currentTimeMillis() - baseTime;
if (elapsed > 0) {
transferSpeed = (int) Math.round((double) totalRead / elapsed);
}
} catch (final java.io.IOException ioe) {
throw new ClientletException(ioe);
}
}
final UserAgentContext uaContext = new SilentUserAgentContextImpl(context.getNavigatorFrame());
final DownloadDialog dialog = new DownloadDialog(response, url, transferSpeed, uaContext);
dialog.setTitle("Download " + Urls.getNoRefForm(url));
dialog.pack();
dialog.setLocationByPlatform(true);
dialog.setVisible(true);
// Cancel current transfer
throw new CancelClientletException("download");
}
}