diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/HttpAPI.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/HttpAPI.cs index 06efc208..ece039cf 100644 --- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/HttpAPI.cs +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/HttpAPI.cs @@ -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 callback, int page, int pageSize = 10); - public delegate void SearchRomListAPI(Action callback, string searchKey, int page, int pageSize = 10); - - public void GetNesRomList(Action callback, int page, int pageSize = 10) + public delegate void GetRomListAPI(Action callback, int page, int pageSize = 10); + public delegate void SearchRomListAPI(Action callback, string searchKey, int page, int pageSize = 10); + + public void GetNesRomList(Action callback, int page, int pageSize = 10) { App.StartCoroutine(GetNesRomListFlow(page, pageSize, callback)); } - public void SearchNesRomList(Action callback, string searchKey, int page, int pageSize = 10) + public void SearchNesRomList(Action 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 callback) + private IEnumerator SearchNesRomListFlow(string searchKey, int page, int pageSize, Action 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(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 callback) + private IEnumerator GetNesRomListFlow(int page, int pageSize, Action 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(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(); diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/RomLib/RomLib.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/RomLib/RomLib.cs index 8db25e0c..20f31484 100644 --- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/RomLib/RomLib.cs +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/RomLib/RomLib.cs @@ -6,161 +6,181 @@ using System.IO; using static AxibugEmuOnline.Client.HttpAPI; namespace AxibugEmuOnline.Client -{ - public class RomLib - { - /// Rom请求,一页的大小 - private const int PAGE_SIZE = 10; - - /// 请求指令 - private HashSet FetchPageCmd = new HashSet(); - private RomFile[] nesRomFetchList; - private Dictionary nesRomFileIdMapper = new Dictionary(); - private Dictionary nesRomFileNameMapper = new Dictionary(); - 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; - } - - - - /// 清除所有下载的Rom文件 - public void ClearRomFile() - { - var path = $"{App.PersistentDataPath}/RemoteRoms/{m_platform}"; - if (Directory.Exists(path)) Directory.Delete(path, true); - } - - /// 移除一个已下载的Rom - public void RemoveOneRomFile(RomFile romFile) - { - if (romFile.RomReady) - File.Delete(romFile.LocalFilePath); - } - - /// - /// 获得所有Rom文件 - /// - /// - public void FetchRomCount(Action 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 + { + /// Rom请求,一页的大小 + private const int PAGE_SIZE = 10; + + /// 请求指令 + private HashSet FetchPageCmd = new HashSet(); + private RomFile[] nesRomFetchList; + private Dictionary nesRomFileIdMapper = new Dictionary(); + private Dictionary nesRomFileNameMapper = new Dictionary(); + 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; + } + + + + /// 清除所有下载的Rom文件 + public void ClearRomFile() + { + var path = $"{App.PersistentDataPath}/RemoteRoms/{m_platform}"; + if (Directory.Exists(path)) Directory.Delete(path, true); + } + + /// 移除一个已下载的Rom + public void RemoveOneRomFile(RomFile romFile) + { + if (romFile.RomReady) + File.Delete(romFile.LocalFilePath); + } + + /// + /// 获得所有Rom文件 + /// + /// + public void FetchRomCount(Action 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; + } + } }