vampire-like/Assets/GameFramework/Scripts/Runtime/Download/WWWDownloadAgentHelper.cs

247 lines
8.9 KiB
C#

//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
#if !UNITY_2018_3_OR_NEWER
using GameFramework;
using GameFramework.Download;
using System;
using System.Collections.Generic;
using UnityEngine;
namespace UnityGameFramework.Runtime
{
/// <summary>
/// WWW 下载代理辅助器。
/// </summary>
public class WWWDownloadAgentHelper : DownloadAgentHelperBase, IDisposable
{
private WWW m_WWW = null;
private int m_LastDownloadedSize = 0;
private bool m_Disposed = false;
private EventHandler<DownloadAgentHelperUpdateBytesEventArgs> m_DownloadAgentHelperUpdateBytesEventHandler = null;
private EventHandler<DownloadAgentHelperUpdateLengthEventArgs> m_DownloadAgentHelperUpdateLengthEventHandler = null;
private EventHandler<DownloadAgentHelperCompleteEventArgs> m_DownloadAgentHelperCompleteEventHandler = null;
private EventHandler<DownloadAgentHelperErrorEventArgs> m_DownloadAgentHelperErrorEventHandler = null;
/// <summary>
/// 下载代理辅助器更新数据流事件。
/// </summary>
public override event EventHandler<DownloadAgentHelperUpdateBytesEventArgs> DownloadAgentHelperUpdateBytes
{
add
{
m_DownloadAgentHelperUpdateBytesEventHandler += value;
}
remove
{
m_DownloadAgentHelperUpdateBytesEventHandler -= value;
}
}
/// <summary>
/// 下载代理辅助器更新数据大小事件。
/// </summary>
public override event EventHandler<DownloadAgentHelperUpdateLengthEventArgs> DownloadAgentHelperUpdateLength
{
add
{
m_DownloadAgentHelperUpdateLengthEventHandler += value;
}
remove
{
m_DownloadAgentHelperUpdateLengthEventHandler -= value;
}
}
/// <summary>
/// 下载代理辅助器完成事件。
/// </summary>
public override event EventHandler<DownloadAgentHelperCompleteEventArgs> DownloadAgentHelperComplete
{
add
{
m_DownloadAgentHelperCompleteEventHandler += value;
}
remove
{
m_DownloadAgentHelperCompleteEventHandler -= value;
}
}
/// <summary>
/// 下载代理辅助器错误事件。
/// </summary>
public override event EventHandler<DownloadAgentHelperErrorEventArgs> DownloadAgentHelperError
{
add
{
m_DownloadAgentHelperErrorEventHandler += value;
}
remove
{
m_DownloadAgentHelperErrorEventHandler -= value;
}
}
/// <summary>
/// 通过下载代理辅助器下载指定地址的数据。
/// </summary>
/// <param name="downloadUri">下载地址。</param>
/// <param name="userData">用户自定义数据。</param>
public override void Download(string downloadUri, object userData)
{
if (m_DownloadAgentHelperUpdateBytesEventHandler == null || m_DownloadAgentHelperUpdateLengthEventHandler == null || m_DownloadAgentHelperCompleteEventHandler == null || m_DownloadAgentHelperErrorEventHandler == null)
{
Log.Fatal("Download agent helper handler is invalid.");
return;
}
m_WWW = new WWW(downloadUri);
}
/// <summary>
/// 通过下载代理辅助器下载指定地址的数据。
/// </summary>
/// <param name="downloadUri">下载地址。</param>
/// <param name="fromPosition">下载数据起始位置。</param>
/// <param name="userData">用户自定义数据。</param>
public override void Download(string downloadUri, long fromPosition, object userData)
{
if (m_DownloadAgentHelperUpdateBytesEventHandler == null || m_DownloadAgentHelperUpdateLengthEventHandler == null || m_DownloadAgentHelperCompleteEventHandler == null || m_DownloadAgentHelperErrorEventHandler == null)
{
Log.Fatal("Download agent helper handler is invalid.");
return;
}
Dictionary<string, string> header = new Dictionary<string, string>
{
{ "Range", Utility.Text.Format("bytes={0}-", fromPosition) }
};
m_WWW = new WWW(downloadUri, null, header);
}
/// <summary>
/// 通过下载代理辅助器下载指定地址的数据。
/// </summary>
/// <param name="downloadUri">下载地址。</param>
/// <param name="fromPosition">下载数据起始位置。</param>
/// <param name="toPosition">下载数据结束位置。</param>
/// <param name="userData">用户自定义数据。</param>
public override void Download(string downloadUri, long fromPosition, long toPosition, object userData)
{
if (m_DownloadAgentHelperUpdateBytesEventHandler == null || m_DownloadAgentHelperUpdateLengthEventHandler == null || m_DownloadAgentHelperCompleteEventHandler == null || m_DownloadAgentHelperErrorEventHandler == null)
{
Log.Fatal("Download agent helper handler is invalid.");
return;
}
Dictionary<string, string> header = new Dictionary<string, string>
{
{ "Range", Utility.Text.Format("bytes={0}-{1}", fromPosition, toPosition) }
};
m_WWW = new WWW(downloadUri, null, header);
}
/// <summary>
/// 重置下载代理辅助器。
/// </summary>
public override void Reset()
{
if (m_WWW != null)
{
m_WWW.Dispose();
m_WWW = null;
}
m_LastDownloadedSize = 0;
}
/// <summary>
/// 释放资源。
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// 释放资源。
/// </summary>
/// <param name="disposing">释放资源标记。</param>
protected virtual void Dispose(bool disposing)
{
if (m_Disposed)
{
return;
}
if (disposing)
{
if (m_WWW != null)
{
m_WWW.Dispose();
m_WWW = null;
}
}
m_Disposed = true;
}
private void Update()
{
if (m_WWW == null)
{
return;
}
int deltaLength = m_WWW.bytesDownloaded - m_LastDownloadedSize;
if (deltaLength > 0)
{
m_LastDownloadedSize = m_WWW.bytesDownloaded;
DownloadAgentHelperUpdateLengthEventArgs downloadAgentHelperUpdateLengthEventArgs = DownloadAgentHelperUpdateLengthEventArgs.Create(deltaLength);
m_DownloadAgentHelperUpdateLengthEventHandler(this, downloadAgentHelperUpdateLengthEventArgs);
ReferencePool.Release(downloadAgentHelperUpdateLengthEventArgs);
}
if (m_WWW == null)
{
return;
}
if (!m_WWW.isDone)
{
return;
}
if (!string.IsNullOrEmpty(m_WWW.error))
{
DownloadAgentHelperErrorEventArgs dodwnloadAgentHelperErrorEventArgs = DownloadAgentHelperErrorEventArgs.Create(m_WWW.error.StartsWith(RangeNotSatisfiableErrorCode.ToString(), StringComparison.Ordinal), m_WWW.error);
m_DownloadAgentHelperErrorEventHandler(this, dodwnloadAgentHelperErrorEventArgs);
ReferencePool.Release(dodwnloadAgentHelperErrorEventArgs);
}
else
{
byte[] bytes = m_WWW.bytes;
DownloadAgentHelperUpdateBytesEventArgs downloadAgentHelperUpdateBytesEventArgs = DownloadAgentHelperUpdateBytesEventArgs.Create(bytes, 0, bytes.Length);
m_DownloadAgentHelperUpdateBytesEventHandler(this, downloadAgentHelperUpdateBytesEventArgs);
ReferencePool.Release(downloadAgentHelperUpdateBytesEventArgs);
DownloadAgentHelperCompleteEventArgs downloadAgentHelperCompleteEventArgs = DownloadAgentHelperCompleteEventArgs.Create(bytes.LongLength);
m_DownloadAgentHelperCompleteEventHandler(this, downloadAgentHelperCompleteEventArgs);
ReferencePool.Release(downloadAgentHelperCompleteEventArgs);
}
}
}
}
#endif