📄 filereceiver.cs
字号:
namespace Imps.Client.Core.P2P.FileTransportor
{
using Imps.Client.Core.P2P.ICE;
using NCindy;
using NCindy.Session.AIO;
using NCindy.Util.Logging;
using System;
public class FileReceiver : FileTransportorBase
{
private bool handShakeReceived;
private static readonly ILogger log = LogFactory.CreateLogger(MethodBase.GetCurrentMethod().ReflectedType);
private readonly object recvSyncRoot;
private readonly string shutdownToken;
public FileReceiver(ISession session, Peer remotePeer, TransportingFile file) : base(session, remotePeer, file)
{
this.recvSyncRoot = new object();
this.shutdownToken = "SHUTDOWN:" + Guid.NewGuid();
}
public FileReceiver(ISession session, Peer remotePeer, string localFilePath, long fileSize, long completedSize, string sourceFileName, string first100MMd5) : base(session, remotePeer, localFilePath, fileSize, sourceFileName, completedSize, first100MMd5)
{
this.recvSyncRoot = new object();
this.shutdownToken = "SHUTDOWN:" + Guid.NewGuid();
}
protected override void OnObjectReceived(object sender, SessionEventArgs e)
{
lock (this.recvSyncRoot)
{
IBuffer buffer = (IBuffer) e.Obj;
if (!this.handShakeReceived && (buffer.Limit == FileTransportorBase.HandshakeCmdLenght))
{
string initOffer = FileTransportorBase.Buffer2String(buffer);
if (initOffer.StartsWith("HANDSHAKE:"))
{
try
{
new Guid(initOffer.Substring("HANDSHAKE:".Length));
this.handShakeReceived = true;
base.SendACK(initOffer);
}
catch (FormatException exception)
{
if (log.IsWarnEnabled)
{
log.Warn("Received invalid handshake.", exception);
}
}
}
}
else if (base.fileInfo.CompletedSize == base.fileInfo.FileSize)
{
string text2 = FileTransportorBase.Buffer2String(buffer);
string text3 = this.shutdownToken + P2PManager.Instace.LocalPeer.PeerToken;
if ((text2 == text3) && (base.fileInfo.CompletedSize == base.fileInfo.FileSize))
{
base.FireTransportCompleted();
}
}
else
{
this.ProcessFileData(e);
}
}
}
private void ProcessFileData(SessionEventArgs e)
{
if (log.IsInfoEnabled)
{
log.Info("File receiver received an object.");
}
IBuffer buffer = null;
try
{
buffer = e.Obj as IBuffer;
if (buffer == null)
{
if (log.IsInfoEnabled)
{
log.Info("File receiver received an object, but it's not a data chunk.");
}
}
else
{
lock (base.fileInfo.InnerFileStream)
{
long offset = base.fileInfo.CompletedSize;
base.fileInfo.WriteToFile(offset, buffer.GetInnerByteArray(), buffer.Limit);
}
base.FireBlockTransported(base.fileInfo.CompletedSize);
if (base.fileInfo.CompletedSize == base.fileInfo.FileSize)
{
this.SendShutdown();
}
}
}
catch (Exception exception)
{
if (log.IsWarnEnabled)
{
log.Warn("Receiver OnObjectReceived failed.", exception);
}
}
finally
{
if (buffer != null)
{
buffer.Release();
}
}
}
private void SendShutdown()
{
if (log.IsInfoEnabled)
{
log.Info("Send shutdown.");
}
base.tranSession.Send(FileTransportorBase.String2Buffer(this.shutdownToken));
}
protected override void Start(object obj)
{
AsyncUDTSession session = (AsyncUDTSession) obj;
base.tranSession = session;
base.tranSession.ObjectReceived += new EventHandler<SessionEventArgs>(this, (IntPtr) this.OnObjectReceived);
FileDataCodec codec = new FileDataCodec();
base.tranSession.PacketDecoder = codec;
base.tranSession.PacketEncoder = codec;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -