public AmoebaManager(string blocksPath, BufferManager bufferManager) { _blocksPath = blocksPath; _bufferManager = bufferManager; _clientManager = new ClientManager(_bufferManager); _serverManager = new ServerManager(_bufferManager); _cacheManager = new CacheManager(_blocksPath, _bufferManager); _connectionsManager = new ConnectionsManager(_clientManager, _serverManager, _cacheManager, _bufferManager); _downloadManager = new DownloadManager(_connectionsManager, _cacheManager, _bufferManager); _uploadManager = new UploadManager(_connectionsManager, _cacheManager, _bufferManager); _backgroundDownloadManager = new BackgroundDownloadManager(_connectionsManager, _cacheManager, _bufferManager); _backgroundUploadManager = new BackgroundUploadManager(_connectionsManager, _cacheManager, _bufferManager); _clientManager.CreateCapEvent = (object sender, string uri) => { return _createCapEvent?.Invoke(this, uri); }; _serverManager.AcceptCapEvent = (object sender, out string uri) => { uri = null; return _acceptCapEvent?.Invoke(this, out uri); }; _clientManager.CheckUriEvent = (object sender, string uri) => { return _checkUriEvent?.Invoke(this, uri) ?? true; }; _serverManager.CheckUriEvent = (object sender, string uri) => { return _checkUriEvent?.Invoke(this, uri) ?? true; }; }
public AmoebaManager(string bitmapPath, string cachePath, BufferManager bufferManager) { _bitmapPath = bitmapPath; _cachePath = cachePath; _bufferManager = bufferManager; _clientManager = new ClientManager(_bufferManager); _serverManager = new ServerManager(_bufferManager); _bitmapManager = new BitmapManager(_bitmapPath, _bufferManager); _cacheManager = new CacheManager(_cachePath, _bitmapManager, _bufferManager); _connectionsManager = new ConnectionsManager(_clientManager, _serverManager, _cacheManager, _bufferManager); _downloadManager = new DownloadManager(_connectionsManager, _cacheManager, _bufferManager); _uploadManager = new UploadManager(_connectionsManager, _cacheManager, _bufferManager); _backgroundDownloadManager = new BackgroundDownloadManager(_connectionsManager, _cacheManager, _bufferManager); _backgroundUploadManager = new BackgroundUploadManager(_connectionsManager, _cacheManager, _bufferManager); _clientManager.CreateCapEvent = (object sender, string uri) => { if (_createCapEvent != null) { return(_createCapEvent(this, uri)); } return(null); }; _serverManager.AcceptCapEvent = (object sender, out string uri) => { uri = null; if (_acceptCapEvent != null) { return(_acceptCapEvent(this, out uri)); } return(null); }; _clientManager.CheckUriEvent = (object sender, string uri) => { if (_checkUriEvent != null) { return(_checkUriEvent(this, uri)); } return(true); }; _serverManager.CheckUriEvent = (object sender, string uri) => { if (_checkUriEvent != null) { return(_checkUriEvent(this, uri)); } return(true); }; }
public AmoebaManager(string bitmapPath, string cachePath, BufferManager bufferManager) { _bitmapPath = bitmapPath; _cachePath = cachePath; _bufferManager = bufferManager; _clientManager = new ClientManager(_bufferManager); _serverManager = new ServerManager(_bufferManager); _bitmapManager = new BitmapManager(_bitmapPath, _bufferManager); _cacheManager = new CacheManager(_cachePath, _bitmapManager, _bufferManager); _connectionsManager = new ConnectionsManager(_clientManager, _serverManager, _cacheManager, _bufferManager); _downloadManager = new DownloadManager(_connectionsManager, _cacheManager, _bufferManager); _uploadManager = new UploadManager(_connectionsManager, _cacheManager, _bufferManager); _backgroundDownloadManager = new BackgroundDownloadManager(_connectionsManager, _cacheManager, _bufferManager); _backgroundUploadManager = new BackgroundUploadManager(_connectionsManager, _cacheManager, _bufferManager); _clientManager.CreateCapEvent = (object sender, string uri) => { if (_createCapEvent != null) { return _createCapEvent(this, uri); } return null; }; _serverManager.AcceptCapEvent = (object sender, out string uri) => { uri = null; if (_acceptCapEvent != null) { return _acceptCapEvent(this, out uri); } return null; }; _clientManager.CheckUriEvent = (object sender, string uri) => { if (_checkUriEvent != null) { return _checkUriEvent(this, uri); } return true; }; _serverManager.CheckUriEvent = (object sender, string uri) => { if (_checkUriEvent != null) { return _checkUriEvent(this, uri); } return true; }; }
private void DecodeManagerThread() { for (; ;) { Thread.Sleep(1000 * 3); if (this.State == ManagerState.Stop) { return; } BackgroundDownloadItem item = null; try { lock (this.ThisLock) { if (_settings.BackgroundDownloadItems.Count > 0) { item = _settings.BackgroundDownloadItems .Where(n => n.State == BackgroundDownloadState.Decoding) .OrderBy(n => (n.Rank != n.Seed.Rank) ? 0 : 1) .FirstOrDefault(); } } } catch (Exception) { return; } if (item == null) { continue; } try { if (item.Rank == 1) { if (!_cacheManager.Contains(item.Seed.Key)) { item.State = BackgroundDownloadState.Downloading; } else { item.State = BackgroundDownloadState.Decoding; if (item.Rank < item.Seed.Rank) { string fileName = null; bool largeFlag = false; try { using (FileStream stream = BackgroundDownloadManager.GetUniqueFileStream(Path.Combine(_workDirectory, "index"))) using (ProgressStream decodingProgressStream = new ProgressStream(stream, (object sender, long readSize, long writeSize, out bool isStop) => { isStop = (this.State == ManagerState.Stop || !_settings.BackgroundDownloadItems.Contains(item)); if (!isStop && (stream.Length > item.Seed.Length)) { isStop = true; largeFlag = true; } }, 1024 * 1024, true)) { fileName = stream.Name; _cacheManager.Decoding(decodingProgressStream, item.Seed.CompressionAlgorithm, item.Seed.CryptoAlgorithm, item.Seed.CryptoKey, new KeyCollection() { item.Seed.Key }); } } catch (StopIoException) { if (File.Exists(fileName)) { File.Delete(fileName); } if (largeFlag) { throw new Exception(); } continue; } catch (Exception) { if (File.Exists(fileName)) { File.Delete(fileName); } throw; } Index index; using (FileStream stream = new FileStream(fileName, FileMode.Open)) { index = Index.Import(stream, _bufferManager); } File.Delete(fileName); lock (this.ThisLock) { this.UncheckState(item.Index); item.Index = index; this.CheckState(item.Index); foreach (var group in item.Index.Groups) { foreach (var key in group.Keys) { _cacheManager.Lock(key); } } item.Indexes.Add(index); item.Rank++; item.State = BackgroundDownloadState.Downloading; } } else { bool largeFlag = false; object value = null; try { using (Stream stream = new BufferStream(_bufferManager)) using (ProgressStream decodingProgressStream = new ProgressStream(stream, (object sender, long readSize, long writeSize, out bool isStop) => { isStop = (this.State == ManagerState.Stop || !_settings.BackgroundDownloadItems.Contains(item)); if (!isStop && (stream.Length > item.Seed.Length)) { isStop = true; largeFlag = true; } }, 1024 * 1024, true)) { _cacheManager.Decoding(decodingProgressStream, item.Seed.CompressionAlgorithm, item.Seed.CryptoAlgorithm, item.Seed.CryptoKey, new KeyCollection() { item.Seed.Key }); if (stream.Length != item.Seed.Length) { throw new Exception(); } stream.Seek(0, SeekOrigin.Begin); if (item.Type == BackgroundItemType.Link) { value = Link.Import(stream, _bufferManager); } else if (item.Type == BackgroundItemType.Store) { value = Store.Import(stream, _bufferManager); } } } catch (StopIoException) { if (largeFlag) { throw new Exception(); } continue; } catch (Exception) { throw; } lock (this.ThisLock) { item.Value = value; if (item.Seed.Key != null) { _cacheManager.Unlock(item.Seed.Key); } foreach (var index in item.Indexes) { foreach (var group in index.Groups) { foreach (var key in group.Keys) { _cacheManager.Unlock(key); } } } item.Indexes.Clear(); item.State = BackgroundDownloadState.Completed; } } } } else { if (!item.Index.Groups.All(n => _existManager.GetCount(n) >= n.InformationLength)) { item.State = BackgroundDownloadState.Downloading; } else { List <Key> keys = new List <Key>(); try { foreach (var group in item.Index.Groups.ToArray()) { keys.AddRange(_cacheManager.ParityDecoding(group, (object state2) => { return(this.State == ManagerState.Stop || !_settings.BackgroundDownloadItems.Contains(item)); })); } } catch (StopException) { continue; } item.State = BackgroundDownloadState.Decoding; if (item.Rank < item.Seed.Rank) { string fileName = null; bool largeFlag = false; try { using (FileStream stream = BackgroundDownloadManager.GetUniqueFileStream(Path.Combine(_workDirectory, "index"))) using (ProgressStream decodingProgressStream = new ProgressStream(stream, (object sender, long readSize, long writeSize, out bool isStop) => { isStop = (this.State == ManagerState.Stop || !_settings.BackgroundDownloadItems.Contains(item)); if (!isStop && (stream.Length > item.Seed.Length)) { isStop = true; largeFlag = true; } }, 1024 * 1024, true)) { fileName = stream.Name; _cacheManager.Decoding(decodingProgressStream, item.Index.CompressionAlgorithm, item.Index.CryptoAlgorithm, item.Index.CryptoKey, new KeyCollection(keys)); } } catch (StopIoException) { if (File.Exists(fileName)) { File.Delete(fileName); } if (largeFlag) { throw new Exception(); } continue; } catch (Exception) { if (File.Exists(fileName)) { File.Delete(fileName); } throw; } Index index; using (FileStream stream = new FileStream(fileName, FileMode.Open)) { index = Index.Import(stream, _bufferManager); } File.Delete(fileName); lock (this.ThisLock) { this.UncheckState(item.Index); item.Index = index; this.CheckState(item.Index); foreach (var group in item.Index.Groups) { foreach (var key in group.Keys) { _cacheManager.Lock(key); } } item.Indexes.Add(index); item.Rank++; item.State = BackgroundDownloadState.Downloading; } } else { item.State = BackgroundDownloadState.Decoding; bool largeFlag = false; object value = null; try { using (Stream stream = new BufferStream(_bufferManager)) using (ProgressStream decodingProgressStream = new ProgressStream(stream, (object sender, long readSize, long writeSize, out bool isStop) => { isStop = (this.State == ManagerState.Stop || !_settings.BackgroundDownloadItems.Contains(item)); if (!isStop && (stream.Length > item.Seed.Length)) { isStop = true; largeFlag = true; } }, 1024 * 1024, true)) { _cacheManager.Decoding(decodingProgressStream, item.Index.CompressionAlgorithm, item.Index.CryptoAlgorithm, item.Index.CryptoKey, new KeyCollection(keys)); if (stream.Length != item.Seed.Length) { throw new Exception(); } stream.Seek(0, SeekOrigin.Begin); if (item.Type == BackgroundItemType.Link) { value = Link.Import(stream, _bufferManager); } else if (item.Type == BackgroundItemType.Store) { value = Store.Import(stream, _bufferManager); } } } catch (StopIoException) { if (largeFlag) { throw new Exception(); } continue; } catch (Exception) { throw; } lock (this.ThisLock) { item.Value = value; if (item.Seed.Key != null) { _cacheManager.Unlock(item.Seed.Key); } foreach (var index in item.Indexes) { foreach (var group in index.Groups) { foreach (var key in group.Keys) { _cacheManager.Unlock(key); } } } item.Indexes.Clear(); item.State = BackgroundDownloadState.Completed; } } } } } catch (Exception e) { if (_cacheManager.Contains(item.Seed.Key)) { ArraySegment <byte> buffer = new ArraySegment <byte>(); try { buffer = _cacheManager[item.Seed.Key]; } catch (Exception) { } finally { if (buffer.Array != null) { _bufferManager.ReturnBuffer(buffer.Array); } } } foreach (var index in item.Indexes) { foreach (var group in index.Groups) { foreach (var key in group.Keys) { if (this.State == ManagerState.Stop) { return; } if (!_cacheManager.Contains(key)) { continue; } ArraySegment <byte> buffer = new ArraySegment <byte>(); try { buffer = _cacheManager[key]; } catch (Exception) { } finally { if (buffer.Array != null) { _bufferManager.ReturnBuffer(buffer.Array); } } } } } item.State = BackgroundDownloadState.Error; Log.Error(e); } } }