📄 downloadsharecontent.cs
字号:
namespace Imps.Client.Core
{
using Imps.Base.Sipc;
using Imps.Client;
using Imps.Client.Base;
using Imps.Client.Core.P2P.FileTransportor;
using Imps.Client.Core.P2P.ICE;
using Imps.Client.Utils;
using Imps.Utils;
using System;
using System.IO;
using System.Net;
using System.Threading;
public class DownLoadShareContent : ShareContent
{
private Contact _from;
public DownLoadShareContent(Dialog dialog, Contact from, string id, ShareContent.OtherSideOption option) : base(new Guid(id), null, dialog.Owner)
{
base.CurrentDialog = dialog;
this.From = from;
base.OtherSideSharedContentOption = option;
base.Transmittype = ShareContentTransmitType.Relay;
}
public DownLoadShareContent(Dialog dialog, Contact from, string remoteUri, string fileName, int size, ShareContentTransmitType transmittype) : base(null, dialog.Owner)
{
base.CurrentDialog = dialog;
this._from = from;
base.DownLoadUrl = remoteUri;
base.Transmittype = transmittype;
base.FileName = fileName;
base.FileSize = size;
base.FilePath = Path.Combine("", base.FileName);
}
public DownLoadShareContent(Dialog dialog, Contact from, string id, P2PSessionFinder finder, AllEndPoints _myEndPoints, ShareContent.OtherSideOption option, Peer remotePeer) : base(new Guid(id), null, dialog.Owner)
{
base.CurrentDialog = dialog;
this.From = from;
base.P2pFinder = finder;
base.MyEndPoints = _myEndPoints;
base.OtherSideSharedContentOption = option;
base.Transmittype = ShareContentTransmitType.P2P;
base.RemotePeer = remotePeer;
ThreadPool.QueueUserWorkItem(new WaitCallback(this.AsyncFindP2PSession));
}
private void AsyncFindP2PSession(object context)
{
base.PunchingResult = base.P2pFinder.SendPunchingRequests(base.OtherSideSharedContentOption);
bool flag = ShareContentType.TCP == (Configuration.FixedClientSetting.ShareContentType & ShareContentType.TCP);
if ((base.TcpP2PSocket != null) && flag)
{
base.PunchingResult = new TcpConnectingResult(base.P2pFinder.LocalPeer, base.P2pFinder.RemotePeer, base.TcpP2PSocket);
}
base.P2pTransport = AbstractFileTransportor.CreateReceiver(base.PunchingResult, base.TransportingFile);
}
internal void AsyncSendAcceptInfo()
{
SipRequest msg = base.CurrentDialog.InnerCreateSipRequest("IN", base.CurrentDialog.CallId, base.CurrentDialog.NextCSeq);
msg.Message.AddHeader(new SipcToHeader(base.CurrentDialog.To));
StringWriter tw = new StringWriter();
XmlHelper.CreateXmlWriterForSipMessage(tw, null, delegate (XmlWriter writer, object context) {
writer.WriteAttributeString("action", "accept");
writer.WriteStartElement("file");
writer.WriteAttributeString("url", base.DownLoadUrl);
if (((base.OtherSideSharedContentOption != null) && (base.OtherSideSharedContentOption.SupportP2PV2 || base.OtherSideSharedContentOption.SupportRelayV2)) && ((base.Transmittype == ShareContentTransmitType.P2P) || (base.Transmittype == ShareContentTransmitType.Relay)))
{
writer.WriteAttributeString("id", base.Id);
if (base.LastTimeCompleteSize != 0)
{
writer.WriteAttributeString("completesize", base.LastTimeCompleteSize.ToString());
}
}
writer.WriteEndElement();
}, "share-content");
msg.FinalResponseReceived += new EventHandler<SipResponseReceivedEventArgs>(this, (IntPtr) this.<AsyncSendAcceptInfo>b__1);
msg.SendMessageFailed += new EventHandler<FailedEventArgs>(this, (IntPtr) this.<AsyncSendAcceptInfo>b__2);
msg.WaitResponseTimeout += delegate {
ClientLogger.WriteGeneral("Download File " + base.FilePath + " Error:", "AsyncSendAcceptInfo Message WaitResponseTimeout");
this.CancelShareContent();
};
msg.Message.Body = tw.ToString();
base.SendSipMessage(msg);
}
internal override void AsyncStartP2P()
{
base.TransportingFile = new TransportingFile(base.FilePath, base.FileSize, base.FileName, base.LastTimeCompleteSize, base.First100MMd5, base.RemotePeer);
base.P2pTransport.TargetFile = base.TransportingFile;
base.P2pTransport.Start();
base.Start = true;
ClientLogger.WriteGeneral(string.Format("--P2P传送开始,下载{0} 从 {1}--", base.FileName, base.RemotePeer.Sid));
}
private void CalculatePosition(ref long start, ref long end)
{
start = end;
if ((start != 0) && (start != base.LastTimeCompleteSize))
{
start++;
}
if (base.IsOnce)
{
end = Convert.ToInt32((long) (base.FileSize - 1));
}
else if ((start + base.EveryBlockSize) >= base.FileSize)
{
end = Convert.ToInt32(base.FileSize) - 1;
}
else
{
end = (start + base.EveryBlockSize) - 1;
}
}
public override void CancelShareContent()
{
base.CancelShareContent();
lock (this)
{
if ((!base.IsCancel && !base.Complete) && !base.IsFailed)
{
base.IsCancel = true;
base.RaiseShareContentCancel();
if (((base.Transmittype == ShareContentTransmitType.Relay) || (base.Transmittype == ShareContentTransmitType.P2P)) && !base.CurrentDialog.CloseByBye)
{
base.AsyncSendCancelInfo();
}
this.Close();
}
}
}
internal void CloseP2PTransport()
{
if (base.P2pTransport != null)
{
base.P2pTransport.Stop();
}
base.P2pTransport = null;
}
private void DeleteExistFile()
{
if (File.Exists(base.FilePath))
{
try
{
File.Delete(base.FilePath);
}
catch
{
}
}
}
private void DownLoad()
{
if (base.Transmittype == ShareContentTransmitType.P2P)
{
this.AsyncStartP2P();
}
else
{
this.DeleteExistFile();
ThreadPool.QueueUserWorkItem(new WaitCallback(this.DownloadFileInThread), null);
if (base.Transmittype == ShareContentTransmitType.Relay)
{
ClientLogger.WriteGeneral(string.Format("--Relay传送开始,下载{0} 从 {1}--", base.FileName, base.RemotePeer.Sid));
}
}
}
public void DownloadFile()
{
if (base.Transmittype == ShareContentTransmitType.Block)
{
this.DownLoad();
}
else
{
this.AsyncSendAcceptInfo();
}
}
private void DownloadFileInThread(object context)
{
try
{
string text2;
base.Start = true;
long start = 0;
long end = 0;
int num3 = 0;
int num4 = 0;
DateTime now = DateTime.Now;
int statusCode = 200;
DateTime time2 = DateTime.Now;
string text = string.Empty;
if (!string.IsNullOrEmpty(base.DownLoadUrl) && (base.DownLoadUrl.LastIndexOf('?') > 0))
{
text2 = base.DownLoadUrl + "&";
}
else
{
text2 = base.DownLoadUrl + "?";
}
Peer remotePeer = new Peer(base.CurrentDialog.Participants[0].Contact.Uri.Sid);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -