private async void OnGetMessageStatusReceived( GetMessageStatusArgs getMessageStatusArgs ) { try { using (_stateHelper.GetFuncWrapper()) { string fromDestination = getMessageStatusArgs.Destination; if (_dropDestinations.Contains(fromDestination)) { return; } if (!SamHelper.IsDestinationStringValid(fromDestination)) { return; } bool destinationDbContainsKey; using (await _destinationDbLockSem.GetDisposable().ConfigureAwait(false)) { destinationDbContainsKey = _destinationDb.ContainsKey( fromDestination ); } if ( !destinationDbContainsKey ) { await SendMessageStatus( fromDestination, getMessageStatusArgs.MessageId, MessageStatusArgs .MessageStatusCode .UnknownMessageId, 0 ).ConfigureAwait(false); return; } DestinationInfo destinationInfo; using (await _destinationDbLockSem.GetDisposable().ConfigureAwait(false)) { destinationInfo = _destinationDb[fromDestination]; } bool inMessagesDbContainsKey; using (await destinationInfo.InMessagesDbLockSem.GetDisposable().ConfigureAwait(false)) { inMessagesDbContainsKey = destinationInfo.InMessagesDb.ContainsKey( getMessageStatusArgs.MessageId ); } if ( !inMessagesDbContainsKey ) { await SendMessageStatus( fromDestination, getMessageStatusArgs.MessageId, MessageStatusArgs .MessageStatusCode .UnknownMessageId, 0 ).ConfigureAwait(false); return; } InMessageInfo inMessageInfo; using (await destinationInfo.InMessagesDbLockSem.GetDisposable().ConfigureAwait(false)) { inMessageInfo = destinationInfo.InMessagesDb[ getMessageStatusArgs.MessageId ]; } int blocksReceivedCount = inMessageInfo.BlocksReceived.Count(x => x); if ( inMessageInfo.Status == InMessageStatus.HandshakeReceived ) { await SendMessageStatus( fromDestination, getMessageStatusArgs.MessageId, MessageStatusArgs .MessageStatusCode .HandshakeOk, (uint) blocksReceivedCount ).ConfigureAwait(false); return; } if ( inMessageInfo.Status == InMessageStatus.AllBlocksReceived ) { await SendMessageStatus( fromDestination, getMessageStatusArgs.MessageId, MessageStatusArgs .MessageStatusCode .AllBlocksReceived, (uint) inMessageInfo.BlocksReceived.Length ).ConfigureAwait(false); } } } catch (OperationCanceledException) { } catch (WrongDisposableObjectStateException) { } catch (Exception exc) { _log.Error( "OnGetMessageStatusReceived" + " unexpected error '{0}'", exc.ToString() ); } }
private async void OnGetMessageStatusReceived( GetMessageStatusArgs getMessageStatusArgs ) { try { using (_stateHelper.GetFuncWrapper()) { string fromDestination = getMessageStatusArgs.Destination; if (_dropDestinations.Contains(fromDestination)) { return; } if (!SamHelper.IsDestinationStringValid(fromDestination)) { return; } bool destinationDbContainsKey; using (await _destinationDbLockSem.GetDisposable().ConfigureAwait(false)) { destinationDbContainsKey = _destinationDb.ContainsKey( fromDestination ); } if ( !destinationDbContainsKey ) { await SendMessageStatus( fromDestination, getMessageStatusArgs.MessageId, MessageStatusArgs .MessageStatusCode .UnknownMessageId, 0 ).ConfigureAwait(false); return; } DestinationInfo destinationInfo; using (await _destinationDbLockSem.GetDisposable().ConfigureAwait(false)) { destinationInfo = _destinationDb[fromDestination]; } bool inMessagesDbContainsKey; using (await destinationInfo.InMessagesDbLockSem.GetDisposable().ConfigureAwait(false)) { inMessagesDbContainsKey = destinationInfo.InMessagesDb.ContainsKey( getMessageStatusArgs.MessageId ); } if ( !inMessagesDbContainsKey ) { await SendMessageStatus( fromDestination, getMessageStatusArgs.MessageId, MessageStatusArgs .MessageStatusCode .UnknownMessageId, 0 ).ConfigureAwait(false); return; } InMessageInfo inMessageInfo; using (await destinationInfo.InMessagesDbLockSem.GetDisposable().ConfigureAwait(false)) { inMessageInfo = destinationInfo.InMessagesDb[ getMessageStatusArgs.MessageId ]; } int blocksReceivedCount = inMessageInfo.BlocksReceived.Count(x => x); if ( inMessageInfo.Status == InMessageStatus.HandshakeReceived ) { await SendMessageStatus( fromDestination, getMessageStatusArgs.MessageId, MessageStatusArgs .MessageStatusCode .HandshakeOk, (uint)blocksReceivedCount ).ConfigureAwait(false); return; } if ( inMessageInfo.Status == InMessageStatus.AllBlocksReceived ) { await SendMessageStatus( fromDestination, getMessageStatusArgs.MessageId, MessageStatusArgs .MessageStatusCode .AllBlocksReceived, (uint)inMessageInfo.BlocksReceived.Length ).ConfigureAwait(false); } } } catch (OperationCanceledException) { } catch (WrongDisposableObjectStateException) { } catch (Exception exc) { _log.Error( "OnGetMessageStatusReceived" + " unexpected error '{0}'", exc.ToString() ); } }