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()
                    );
            }
        }