⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filereceiver.cs

📁 破解的飞信源代码
💻 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 + -