forked from sin365/AxibugEmuOnline
修复一些拉取rom列表的bug
This commit is contained in:
parent
194150b911
commit
3bbb347e84
@ -1,4 +1,4 @@
|
||||
using AxibugEmuOnline.Client.ClientCore;
|
||||
using AxibugEmuOnline.Client.ClientCore;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
@ -12,21 +12,20 @@ namespace AxibugEmuOnline.Client
|
||||
public string WebHost = "http://emu.axibug.com";
|
||||
public string WebSiteApi => WebHost + "/api";
|
||||
|
||||
public delegate void GetRomListAPI(Action<Resp_GameList> callback, int page, int pageSize = 10);
|
||||
public delegate void SearchRomListAPI(Action<Resp_GameList> callback, string searchKey, int page, int pageSize = 10);
|
||||
|
||||
public void GetNesRomList(Action<Resp_GameList> callback, int page, int pageSize = 10)
|
||||
public delegate void GetRomListAPI(Action<int, Resp_GameList> callback, int page, int pageSize = 10);
|
||||
public delegate void SearchRomListAPI(Action<int, Resp_GameList> callback, string searchKey, int page, int pageSize = 10);
|
||||
|
||||
public void GetNesRomList(Action<int, Resp_GameList> callback, int page, int pageSize = 10)
|
||||
{
|
||||
App.StartCoroutine(GetNesRomListFlow(page, pageSize, callback));
|
||||
}
|
||||
|
||||
public void SearchNesRomList(Action<Resp_GameList> callback, string searchKey, int page, int pageSize = 10)
|
||||
public void SearchNesRomList(Action<int, Resp_GameList> callback, string searchKey, int page, int pageSize = 10)
|
||||
{
|
||||
App.StartCoroutine(SearchNesRomListFlow(searchKey, page, pageSize, callback));
|
||||
}
|
||||
private IEnumerator SearchNesRomListFlow(string searchKey, int page, int pageSize, Action<Resp_GameList> callback)
|
||||
private IEnumerator SearchNesRomListFlow(string searchKey, int page, int pageSize, Action<int, Resp_GameList> callback)
|
||||
{
|
||||
|
||||
if (!string.IsNullOrEmpty(searchKey))
|
||||
{
|
||||
string oldsearch = searchKey;
|
||||
@ -48,19 +47,19 @@ namespace AxibugEmuOnline.Client
|
||||
yield return request.SendWebRequest;
|
||||
if (!request.downloadHandler.isDone)
|
||||
{
|
||||
callback.Invoke(null);
|
||||
callback.Invoke(page, null);
|
||||
yield break;
|
||||
}
|
||||
|
||||
if (!request.downloadHandler.bHadErr)
|
||||
{
|
||||
var resp = JsonUtility.FromJson<Resp_GameList>(request.downloadHandler.text);
|
||||
callback.Invoke(resp);
|
||||
callback.Invoke(page, resp);
|
||||
yield break;
|
||||
}
|
||||
|
||||
App.log.Error(request.downloadHandler.ErrInfo);
|
||||
callback.Invoke(null);
|
||||
callback.Invoke(page, null);
|
||||
|
||||
/*
|
||||
UnityWebRequest request = UnityWebRequest.Get($"{WebSiteApi}/NesRomList?Page={page}&PageSize={pageSize}&SearchKey={searchKey}");
|
||||
@ -73,7 +72,7 @@ namespace AxibugEmuOnline.Client
|
||||
}*/
|
||||
|
||||
}
|
||||
private IEnumerator GetNesRomListFlow(int page, int pageSize, Action<Resp_GameList> callback)
|
||||
private IEnumerator GetNesRomListFlow(int page, int pageSize, Action<int, Resp_GameList> callback)
|
||||
{
|
||||
string url = $"{WebSiteApi}/NesRomList?Page={page}&PageSize={pageSize}";
|
||||
App.log.Info($"GetRomList=>{url}");
|
||||
@ -81,7 +80,7 @@ namespace AxibugEmuOnline.Client
|
||||
yield return request.SendWebRequest;
|
||||
if (!request.downloadHandler.isDone)
|
||||
{
|
||||
callback.Invoke(null);
|
||||
callback.Invoke(page, null);
|
||||
yield break;
|
||||
}
|
||||
|
||||
@ -89,12 +88,12 @@ namespace AxibugEmuOnline.Client
|
||||
if (!request.downloadHandler.bHadErr)
|
||||
{
|
||||
var resp = JsonUtility.FromJson<Resp_GameList>(request.downloadHandler.text);
|
||||
callback.Invoke(resp);
|
||||
callback.Invoke(page, resp);
|
||||
yield break;
|
||||
}
|
||||
|
||||
App.log.Error(request.downloadHandler.ErrInfo);
|
||||
callback.Invoke(null);
|
||||
callback.Invoke(page, null);
|
||||
/*
|
||||
UnityWebRequest request = UnityWebRequest.Get($"{WebSiteApi}/NesRomList?Page={page}&PageSize={pageSize}");
|
||||
yield return request.SendWebRequest();
|
||||
|
@ -6,161 +6,181 @@ using System.IO;
|
||||
using static AxibugEmuOnline.Client.HttpAPI;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
{
|
||||
public class RomLib
|
||||
{
|
||||
/// <summary> Rom请求,一页的大小 </summary>
|
||||
private const int PAGE_SIZE = 10;
|
||||
|
||||
/// <summary> 请求指令 </summary>
|
||||
private HashSet<int> FetchPageCmd = new HashSet<int>();
|
||||
private RomFile[] nesRomFetchList;
|
||||
private Dictionary<int, RomFile> nesRomFileIdMapper = new Dictionary<int, RomFile>();
|
||||
private Dictionary<string, RomFile> nesRomFileNameMapper = new Dictionary<string, RomFile>();
|
||||
private HttpAPI.GetRomListAPI m_romGetFunc;
|
||||
private HttpAPI.SearchRomListAPI m_romSearchFunc;
|
||||
private EnumSupportEmuPlatform m_platform;
|
||||
private string lastSearchKey;
|
||||
|
||||
public RomLib(EnumSupportEmuPlatform platform)
|
||||
{
|
||||
m_platform = platform;
|
||||
switch (platform)
|
||||
{
|
||||
case EnumSupportEmuPlatform.NES:
|
||||
m_romGetFunc = App.httpAPI.GetNesRomList;
|
||||
m_romSearchFunc = App.httpAPI.SearchNesRomList;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public RomFile GetExistRom(string fileName)
|
||||
{
|
||||
var res = RomFile.CreateExistRom(m_platform, fileName);
|
||||
|
||||
nesRomFileNameMapper[res.FileName] = res;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
public RomFile GetRomFile(string romFileName)
|
||||
{
|
||||
RomFile romFile;
|
||||
nesRomFileNameMapper.TryGetValue(romFileName, out romFile);
|
||||
return romFile;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary> 清除所有下载的Rom文件 </summary>
|
||||
public void ClearRomFile()
|
||||
{
|
||||
var path = $"{App.PersistentDataPath}/RemoteRoms/{m_platform}";
|
||||
if (Directory.Exists(path)) Directory.Delete(path, true);
|
||||
}
|
||||
|
||||
/// <summary> 移除一个已下载的Rom </summary>
|
||||
public void RemoveOneRomFile(RomFile romFile)
|
||||
{
|
||||
if (romFile.RomReady)
|
||||
File.Delete(romFile.LocalFilePath);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获得所有Rom文件
|
||||
/// </summary>
|
||||
/// <param name="callback"></param>
|
||||
public void FetchRomCount(Action<RomFile[]> callback, string searchKey = null)
|
||||
{
|
||||
lastSearchKey = searchKey;
|
||||
if (string.IsNullOrWhiteSpace(searchKey))
|
||||
{
|
||||
m_romGetFunc((romList) =>
|
||||
{
|
||||
//TODO 请求失败对于romList为空时的处理
|
||||
|
||||
FetchPageCmd.Clear();
|
||||
nesRomFileIdMapper.Clear();
|
||||
nesRomFileNameMapper.Clear();
|
||||
nesRomFetchList = new RomFile[romList.resultAllCount];
|
||||
for (int i = 0; i < nesRomFetchList.Length; i++)
|
||||
{
|
||||
//以后考虑用对象池实例化RomFile
|
||||
nesRomFetchList[i] = new RomFile(m_platform, i, i / PAGE_SIZE);
|
||||
}
|
||||
SaveRomInfoFromWeb(romList);
|
||||
|
||||
callback.Invoke(nesRomFetchList);
|
||||
}, 0, PAGE_SIZE);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_romSearchFunc((romList) =>
|
||||
{
|
||||
//TODO 请求失败对于romList为空时的处理
|
||||
|
||||
FetchPageCmd.Clear();
|
||||
nesRomFileIdMapper.Clear();
|
||||
nesRomFileNameMapper.Clear();
|
||||
nesRomFetchList = new RomFile[romList.resultAllCount];
|
||||
for (int i = 0; i < nesRomFetchList.Length; i++)
|
||||
{
|
||||
//以后考虑用对象池实例化RomFile
|
||||
nesRomFetchList[i] = new RomFile(m_platform, i, i / PAGE_SIZE);
|
||||
}
|
||||
SaveRomInfoFromWeb(romList);
|
||||
|
||||
callback.Invoke(nesRomFetchList);
|
||||
}, searchKey, 0, PAGE_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
public void BeginFetchRomInfo(RomFile romFile)
|
||||
{
|
||||
if (romFile.InfoReady) return;
|
||||
|
||||
FetchPageCmd.Add(romFile.Page);
|
||||
}
|
||||
|
||||
public void ExecuteFetchRomInfo()
|
||||
{
|
||||
if (FetchPageCmd.Count == 0) return;
|
||||
|
||||
foreach (var pageNo in FetchPageCmd)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(lastSearchKey))
|
||||
{
|
||||
m_romSearchFunc(SaveRomInfoFromWeb, lastSearchKey, pageNo, PAGE_SIZE);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_romGetFunc(SaveRomInfoFromWeb, pageNo, PAGE_SIZE);
|
||||
}
|
||||
}
|
||||
FetchPageCmd.Clear();
|
||||
}
|
||||
|
||||
private void SaveRomInfoFromWeb(Resp_GameList resp)
|
||||
{
|
||||
for (int i = 0; i < resp.gameList.Count; i++)
|
||||
{
|
||||
var webData = resp.gameList[i];
|
||||
RomFile targetRomFile = nesRomFetchList[webData.orderid];
|
||||
|
||||
targetRomFile.SetWebData(webData);
|
||||
nesRomFileIdMapper[webData.id] = nesRomFetchList[webData.orderid];
|
||||
nesRomFileNameMapper[targetRomFile.FileName] = targetRomFile;
|
||||
}
|
||||
}
|
||||
|
||||
public static string CalcHash(byte[] data)
|
||||
{
|
||||
return Helper.FileMD5Hash(data);
|
||||
}
|
||||
|
||||
public void AddRomFile(RomFile rom)
|
||||
{
|
||||
nesRomFileNameMapper[rom.FileName] = rom;
|
||||
}
|
||||
}
|
||||
{
|
||||
public class RomLib
|
||||
{
|
||||
/// <summary> Rom请求,一页的大小 </summary>
|
||||
private const int PAGE_SIZE = 10;
|
||||
|
||||
/// <summary> 请求指令 </summary>
|
||||
private HashSet<int> FetchPageCmd = new HashSet<int>();
|
||||
private RomFile[] nesRomFetchList;
|
||||
private Dictionary<int, RomFile> nesRomFileIdMapper = new Dictionary<int, RomFile>();
|
||||
private Dictionary<string, RomFile> nesRomFileNameMapper = new Dictionary<string, RomFile>();
|
||||
private HttpAPI.GetRomListAPI m_romGetFunc;
|
||||
private HttpAPI.SearchRomListAPI m_romSearchFunc;
|
||||
private EnumSupportEmuPlatform m_platform;
|
||||
private string lastSearchKey;
|
||||
|
||||
public RomLib(EnumSupportEmuPlatform platform)
|
||||
{
|
||||
m_platform = platform;
|
||||
switch (platform)
|
||||
{
|
||||
case EnumSupportEmuPlatform.NES:
|
||||
m_romGetFunc = App.httpAPI.GetNesRomList;
|
||||
m_romSearchFunc = App.httpAPI.SearchNesRomList;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public RomFile GetExistRom(string fileName)
|
||||
{
|
||||
var res = RomFile.CreateExistRom(m_platform, fileName);
|
||||
|
||||
nesRomFileNameMapper[res.FileName] = res;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
public RomFile GetRomFile(string romFileName)
|
||||
{
|
||||
RomFile romFile;
|
||||
nesRomFileNameMapper.TryGetValue(romFileName, out romFile);
|
||||
return romFile;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary> 清除所有下载的Rom文件 </summary>
|
||||
public void ClearRomFile()
|
||||
{
|
||||
var path = $"{App.PersistentDataPath}/RemoteRoms/{m_platform}";
|
||||
if (Directory.Exists(path)) Directory.Delete(path, true);
|
||||
}
|
||||
|
||||
/// <summary> 移除一个已下载的Rom </summary>
|
||||
public void RemoveOneRomFile(RomFile romFile)
|
||||
{
|
||||
if (romFile.RomReady)
|
||||
File.Delete(romFile.LocalFilePath);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获得所有Rom文件
|
||||
/// </summary>
|
||||
/// <param name="callback"></param>
|
||||
public void FetchRomCount(Action<RomFile[]> callback, string searchKey = null)
|
||||
{
|
||||
lastSearchKey = searchKey;
|
||||
if (string.IsNullOrWhiteSpace(searchKey))
|
||||
{
|
||||
m_romGetFunc((page, romList) =>
|
||||
{
|
||||
FetchPageCmd.Clear();
|
||||
nesRomFileIdMapper.Clear();
|
||||
nesRomFileNameMapper.Clear();
|
||||
|
||||
if (romList != null)
|
||||
nesRomFetchList = new RomFile[romList.resultAllCount];
|
||||
else
|
||||
nesRomFetchList = new RomFile[0];
|
||||
|
||||
for (int i = 0; i < nesRomFetchList.Length; i++)
|
||||
{
|
||||
//以后考虑用对象池实例化RomFile
|
||||
nesRomFetchList[i] = new RomFile(m_platform, i, i / PAGE_SIZE);
|
||||
}
|
||||
SaveRomInfoFromWeb(romList);
|
||||
|
||||
callback.Invoke(nesRomFetchList);
|
||||
}, 0, PAGE_SIZE);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_romSearchFunc((page, romList) =>
|
||||
{
|
||||
FetchPageCmd.Clear();
|
||||
nesRomFileIdMapper.Clear();
|
||||
nesRomFileNameMapper.Clear();
|
||||
|
||||
if (romList != null)
|
||||
nesRomFetchList = new RomFile[romList.resultAllCount];
|
||||
else
|
||||
nesRomFetchList = new RomFile[0];
|
||||
|
||||
for (int i = 0; i < nesRomFetchList.Length; i++)
|
||||
{
|
||||
//以后考虑用对象池实例化RomFile
|
||||
nesRomFetchList[i] = new RomFile(m_platform, i, i / PAGE_SIZE);
|
||||
}
|
||||
SaveRomInfoFromWeb(romList);
|
||||
|
||||
callback.Invoke(nesRomFetchList);
|
||||
}, searchKey, 0, PAGE_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
bool m_needFetch = false;
|
||||
public void BeginFetchRomInfo(RomFile romFile)
|
||||
{
|
||||
if (romFile.InfoReady) return;
|
||||
|
||||
if (FetchPageCmd.Add(romFile.Page))
|
||||
m_needFetch = true;
|
||||
}
|
||||
|
||||
public void ExecuteFetchRomInfo()
|
||||
{
|
||||
if (FetchPageCmd.Count == 0) return;
|
||||
if (!m_needFetch) return;
|
||||
|
||||
foreach (var pageNo in FetchPageCmd)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(lastSearchKey))
|
||||
{
|
||||
m_romSearchFunc((page, resp) =>
|
||||
{
|
||||
FetchPageCmd.Remove(page);
|
||||
SaveRomInfoFromWeb(resp);
|
||||
}, lastSearchKey, pageNo, PAGE_SIZE);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_romGetFunc((page, resp) =>
|
||||
{
|
||||
FetchPageCmd.Remove(page);
|
||||
SaveRomInfoFromWeb(resp);
|
||||
}, pageNo, PAGE_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
m_needFetch = false;
|
||||
}
|
||||
|
||||
private void SaveRomInfoFromWeb(Resp_GameList resp)
|
||||
{
|
||||
if (resp == null) return;
|
||||
|
||||
for (int i = 0; i < resp.gameList.Count; i++)
|
||||
{
|
||||
var webData = resp.gameList[i];
|
||||
RomFile targetRomFile = nesRomFetchList[webData.orderid];
|
||||
|
||||
targetRomFile.SetWebData(webData);
|
||||
nesRomFileIdMapper[webData.id] = nesRomFetchList[webData.orderid];
|
||||
nesRomFileNameMapper[targetRomFile.FileName] = targetRomFile;
|
||||
}
|
||||
}
|
||||
|
||||
public static string CalcHash(byte[] data)
|
||||
{
|
||||
return Helper.FileMD5Hash(data);
|
||||
}
|
||||
|
||||
public void AddRomFile(RomFile rom)
|
||||
{
|
||||
nesRomFileNameMapper[rom.FileName] = rom;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user