|
@@ -0,0 +1,154 @@
|
|
|
+using fis.Helpers;
|
|
|
+using fis.Win.Dev.Managers.modules.storage;
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.IO;
|
|
|
+using System.Linq;
|
|
|
+using System.Text;
|
|
|
+using System.Threading.Tasks;
|
|
|
+
|
|
|
+namespace fis.Win.Dev.Managers.Modules.Ultra3D
|
|
|
+{
|
|
|
+ internal class Ultra3DFileWorkItem :IDisposable
|
|
|
+ {
|
|
|
+ public string FileUri { get; set; }
|
|
|
+
|
|
|
+ public string FileID { get; set; }
|
|
|
+
|
|
|
+ public string FileName { get; set; }
|
|
|
+
|
|
|
+ public byte[] FileBytes { get; set; }
|
|
|
+
|
|
|
+ public FileAccessStatus FileAccessStatus { get; set; }
|
|
|
+
|
|
|
+ private Ultra3DStorage ultra3DStorage;
|
|
|
+
|
|
|
+ public Ultra3DFileWorkItem(Ultra3DStorage ultraStorage,string fileUri,string fileId)
|
|
|
+ {
|
|
|
+ FileUri = fileUri;
|
|
|
+ FileID = fileId;
|
|
|
+ var fileInfo = GetVidNameFromUrl(fileUri);
|
|
|
+ ultra3DStorage = ultraStorage;
|
|
|
+ FileName = $"{fileId}{fileInfo.Item2}";
|
|
|
+ var filePath = Path.Combine(ultra3DStorage.StoragePath, FileName);
|
|
|
+ if (File.Exists(filePath))
|
|
|
+ {
|
|
|
+ FileAccessStatus = FileAccessStatus.CachedInDiskOnly;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ FileAccessStatus = FileAccessStatus.ReadyToDownload;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public async Task<byte[]> ReadFromDisk()
|
|
|
+ {
|
|
|
+ FileAccessStatus = FileAccessStatus.ReadingCachedFile;
|
|
|
+ FileBytes = await ultra3DStorage.ReadCacheFile(FileName);
|
|
|
+ FileAccessStatus = FileAccessStatus.ReadCacheedFileInMemory;
|
|
|
+ return FileBytes;
|
|
|
+ }
|
|
|
+
|
|
|
+ public async Task<byte[]> ReadFromNetwork()
|
|
|
+ {
|
|
|
+ FileAccessStatus = FileAccessStatus.Downloading;
|
|
|
+ var bytes = await HttpHelper.httpClient.GetByteArrayAsync(FileUri);
|
|
|
+ FileAccessStatus = FileAccessStatus.CachedInMemoryOnly;
|
|
|
+ return bytes;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public async Task<byte[]> CacheFromNetwork()
|
|
|
+ {
|
|
|
+ FileAccessStatus = FileAccessStatus.Downloading;
|
|
|
+ FileBytes = await HttpHelper.httpClient.GetByteArrayAsync(FileUri);
|
|
|
+ FileAccessStatus = FileAccessStatus.CachedInMemoryOnly;
|
|
|
+ return FileBytes;
|
|
|
+ }
|
|
|
+
|
|
|
+ public async void CacheToDisk()
|
|
|
+ {
|
|
|
+ await ultra3DStorage.WriteCacehFile(FileBytes, FileName);
|
|
|
+ FileAccessStatus = FileAccessStatus.CachedInMemoryAndDisk;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Tuple<string,string> GetVidNameFromUrl(string url)
|
|
|
+ {
|
|
|
+ var fragments = url.Split('/');
|
|
|
+ var lastFragment = fragments.Last();
|
|
|
+ var fileInfo = lastFragment.Split('.');
|
|
|
+ var name = fileInfo.First();
|
|
|
+ var ext = fileInfo.Last();
|
|
|
+ return new Tuple<string, string>(name, ext);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void Dispose()
|
|
|
+ {
|
|
|
+ throw new NotImplementedException();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ internal enum FileAccessStatus
|
|
|
+ {
|
|
|
+ ReadyToDownload,
|
|
|
+ Downloading,
|
|
|
+ CachedInMemoryOnly,
|
|
|
+ CachedInMemoryAndDisk,
|
|
|
+
|
|
|
+ ///AlreadyCached
|
|
|
+ CachedInDiskOnly,
|
|
|
+ ReadingCachedFile,
|
|
|
+ ReadCacheedFileInMemory
|
|
|
+ }
|
|
|
+
|
|
|
+ internal class Ultr3dUnionWorkItems
|
|
|
+ {
|
|
|
+ public string FileId { get; set; }
|
|
|
+
|
|
|
+ public Ultra3DFileWorkItem SurfaceWorkItem { get; set; }
|
|
|
+
|
|
|
+ public Ultra3DFileWorkItem MdFileWorkItem { get; set; }
|
|
|
+
|
|
|
+ public EventHandler<string> SurfaceFileCanbeAccess;
|
|
|
+
|
|
|
+ public EventHandler<string> ModelFileCanbeAccess;
|
|
|
+
|
|
|
+ public async Task StartAccessFiles()
|
|
|
+ {
|
|
|
+ //访问表面数据
|
|
|
+ if (SurfaceWorkItem.FileAccessStatus == FileAccessStatus.ReadyToDownload)
|
|
|
+ {
|
|
|
+ await SurfaceWorkItem.CacheFromNetwork();
|
|
|
+ SurfaceFileCanbeAccess?.Invoke(this,FileId);
|
|
|
+ SurfaceWorkItem.CacheToDisk();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (SurfaceWorkItem.FileAccessStatus == FileAccessStatus.CachedInDiskOnly)
|
|
|
+ {
|
|
|
+ await SurfaceWorkItem.ReadFromDisk();
|
|
|
+ SurfaceFileCanbeAccess?.Invoke(this, FileId);
|
|
|
+ }
|
|
|
+ //访问模型数据
|
|
|
+
|
|
|
+ if (SurfaceWorkItem.FileAccessStatus == FileAccessStatus.ReadyToDownload)
|
|
|
+ {
|
|
|
+ await MdFileWorkItem.CacheFromNetwork();
|
|
|
+ ModelFileCanbeAccess?.Invoke(this, FileId);
|
|
|
+ MdFileWorkItem.CacheToDisk();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (SurfaceWorkItem.FileAccessStatus == FileAccessStatus.CachedInDiskOnly)
|
|
|
+ {
|
|
|
+ await MdFileWorkItem.ReadFromDisk();
|
|
|
+ ModelFileCanbeAccess?.Invoke(this, FileId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public Ultr3dUnionWorkItems(string fileId, Ultra3DFileWorkItem surface, Ultra3DFileWorkItem model)
|
|
|
+ {
|
|
|
+ FileId = fileId;
|
|
|
+ SurfaceWorkItem=surface;
|
|
|
+ MdFileWorkItem = model;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|