SparkleShare/SharpSSH/Sftp.cs
2010-07-15 20:41:37 +01:00

220 lines
5.5 KiB
C#

using System;
using Tamir.SharpSsh.jsch;
using System.Collections;
/*
* Sftp.cs
*
* Copyright (c) 2006 Tamir Gal, http://www.tamirgal.com, All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the distribution.
*
* 3. The names of the authors may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
* *OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
**/
namespace Tamir.SharpSsh
{
public class Sftp : SshTransferProtocolBase
{
private MyProgressMonitor m_monitor;
private bool cancelled = false;
public Sftp(string sftpHost, string user, string password)
: base(sftpHost, user, password)
{
Init();
}
public Sftp(string sftpHost, string user)
: base(sftpHost, user)
{
Init();
}
private void Init()
{
m_monitor = new MyProgressMonitor(this);
}
protected override string ChannelType
{
get { return "sftp"; }
}
private ChannelSftp SftpChannel
{
get { return (ChannelSftp)m_channel; }
}
public override void Cancel()
{
cancelled = true;
}
//Get
public void Get(string fromFilePath)
{
Get(fromFilePath, ".");
}
public void Get(string[] fromFilePaths)
{
for (int i = 0; i < fromFilePaths.Length; i++)
{
Get(fromFilePaths[i]);
}
}
public void Get(string[] fromFilePaths, string toDirPath)
{
for (int i = 0; i < fromFilePaths.Length; i++)
{
Get(fromFilePaths[i], toDirPath);
}
}
public override void Get(string fromFilePath, string toFilePath)
{
cancelled=false;
SftpChannel.get(fromFilePath, toFilePath, m_monitor, ChannelSftp.OVERWRITE);
}
//Put
public void Put(string fromFilePath)
{
Put(fromFilePath, ".");
}
public void Put(string[] fromFilePaths)
{
for (int i = 0; i < fromFilePaths.Length; i++)
{
Put(fromFilePaths[i]);
}
}
public void Put(string[] fromFilePaths, string toDirPath)
{
for (int i = 0; i < fromFilePaths.Length; i++)
{
Put(fromFilePaths[i], toDirPath);
}
}
public override void Put(string fromFilePath, string toFilePath)
{
cancelled=false;
SftpChannel.put(fromFilePath, toFilePath, m_monitor, ChannelSftp.OVERWRITE);
}
//MkDir
public override void Mkdir(string directory)
{
SftpChannel.mkdir(directory);
}
//Ls
public ArrayList GetFileList(string path)
{
ArrayList list = new ArrayList();
foreach(Tamir.SharpSsh.jsch.ChannelSftp.LsEntry entry in SftpChannel.ls(path))
{
list.Add(entry.getFilename().ToString());
}
return list;
}
#region ProgressMonitor Implementation
private class MyProgressMonitor : SftpProgressMonitor
{
private long transferred = 0;
private long total = 0;
private int elapsed = -1;
private Sftp m_sftp;
private string src;
private string dest;
System.Timers.Timer timer;
public MyProgressMonitor(Sftp sftp)
{
m_sftp = sftp;
}
public override void init(int op, String src, String dest, long max)
{
this.src=src;
this.dest=dest;
this.elapsed = 0;
this.total = max;
timer = new System.Timers.Timer(1000);
timer.Start();
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
string note;
if (op.Equals(GET))
{
note = "Downloading " + System.IO.Path.GetFileName( src ) + "...";
}
else
{
note = "Uploading " + System.IO.Path.GetFileName( src ) + "...";
}
m_sftp.SendStartMessage(src, dest, (int)total, note);
}
public override bool count(long c)
{
this.transferred += c;
string note = ("Transfering... [Elapsed time: " + elapsed + "]");
m_sftp.SendProgressMessage(src, dest, (int)transferred, (int)total, note);
return !m_sftp.cancelled;
}
public override void end()
{
timer.Stop();
timer.Dispose();
string note = ("Done in " + elapsed + " seconds!");
m_sftp.SendEndMessage(src, dest, (int)transferred, (int)total, note);
transferred = 0;
total = 0;
elapsed = -1;
src=null;
dest=null;
}
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
this.elapsed++;
}
}
#endregion ProgressMonitor Implementation
}
}