private async void OnBlockSendReceived( BlockSendArgs blockSendArgs ) { try { using (_stateHelper.GetFuncWrapper()) { string fromDestination = blockSendArgs.Destination; if (_dropDestinations.Contains(fromDestination)) return; if (!SamHelper.IsDestinationStringValid(fromDestination)) return; DestinationInfo destinationInfo; using (await _destinationDbLockSem.GetDisposable().ConfigureAwait(false)) { if ( !_destinationDb.ContainsKey( blockSendArgs.Destination ) ) return; destinationInfo = _destinationDb[blockSendArgs.Destination]; } InMessageInfo inMessageInfo; using (await destinationInfo.InMessagesDbLockSem.GetDisposable().ConfigureAwait(false)) { if ( !destinationInfo.InMessagesDb.ContainsKey( blockSendArgs.MessageId ) ) return; inMessageInfo = destinationInfo.InMessagesDb[ blockSendArgs.MessageId ]; } if ( inMessageInfo.Status == InMessageStatus.AllBlocksReceived ) return; if (inMessageInfo.BlockCount > 1) { await SendBlockConfirmation( fromDestination, blockSendArgs.MessageId, blockSendArgs.BlockId ).ConfigureAwait(false); } if ( await inMessageInfo.ReceiveBlock( blockSendArgs.BlockId, blockSendArgs.BlockData ).ConfigureAwait(false) ) { var allData = new List<byte>( (int) inMessageInfo.MessageSize ); foreach ( byte[] blockData in inMessageInfo.ReceivedData ) { allData.AddRange(blockData); } var dataArray = allData.ToArray(); if ( inMessageInfo.MessageHash.SequenceEqual( GetMessageHash( blockSendArgs.MessageId, inMessageInfo.ReplyToMessageId, inMessageInfo.MessageKind, dataArray ) ) ) { ReliableMessageReceived.OnNext( new ReliableMessageReceivedArgs() { Destination = fromDestination, Data = allData.ToArray(), MessageId = blockSendArgs.MessageId, ReplyToMessageId = inMessageInfo.ReplyToMessageId, MessageKind = inMessageInfo.MessageKind } ); } await inMessageInfo.FlushBlocks().ConfigureAwait(false); } } } catch (OperationCanceledException) { } catch (WrongDisposableObjectStateException) { } catch (Exception exc) { _log.Error( "OnBlockSendReceived" + " unexpected error '{0}'", exc.ToString() ); } }
private async void OnBlockSendReceived( BlockSendArgs blockSendArgs ) { try { using (_stateHelper.GetFuncWrapper()) { string fromDestination = blockSendArgs.Destination; if (_dropDestinations.Contains(fromDestination)) { return; } if (!SamHelper.IsDestinationStringValid(fromDestination)) { return; } DestinationInfo destinationInfo; using (await _destinationDbLockSem.GetDisposable().ConfigureAwait(false)) { if ( !_destinationDb.ContainsKey( blockSendArgs.Destination ) ) { return; } destinationInfo = _destinationDb[blockSendArgs.Destination]; } InMessageInfo inMessageInfo; using (await destinationInfo.InMessagesDbLockSem.GetDisposable().ConfigureAwait(false)) { if ( !destinationInfo.InMessagesDb.ContainsKey( blockSendArgs.MessageId ) ) { return; } inMessageInfo = destinationInfo.InMessagesDb[ blockSendArgs.MessageId ]; } if ( inMessageInfo.Status == InMessageStatus.AllBlocksReceived ) { return; } if (inMessageInfo.BlockCount > 1) { await SendBlockConfirmation( fromDestination, blockSendArgs.MessageId, blockSendArgs.BlockId ).ConfigureAwait(false); } if ( await inMessageInfo.ReceiveBlock( blockSendArgs.BlockId, blockSendArgs.BlockData ).ConfigureAwait(false) ) { var allData = new List <byte>( (int)inMessageInfo.MessageSize ); foreach ( byte[] blockData in inMessageInfo.ReceivedData ) { allData.AddRange(blockData); } var dataArray = allData.ToArray(); if ( inMessageInfo.MessageHash.SequenceEqual( GetMessageHash( blockSendArgs.MessageId, inMessageInfo.ReplyToMessageId, inMessageInfo.MessageKind, dataArray ) ) ) { ReliableMessageReceived.OnNext( new ReliableMessageReceivedArgs() { Destination = fromDestination, Data = allData.ToArray(), MessageId = blockSendArgs.MessageId, ReplyToMessageId = inMessageInfo.ReplyToMessageId, MessageKind = inMessageInfo.MessageKind } ); } await inMessageInfo.FlushBlocks().ConfigureAwait(false); } } } catch (OperationCanceledException) { } catch (WrongDisposableObjectStateException) { } catch (Exception exc) { _log.Error( "OnBlockSendReceived" + " unexpected error '{0}'", exc.ToString() ); } }