GetIndependentAddressForQueue() static private method

static private GetIndependentAddressForQueue ( MessageQueue q ) : MsmqAddress,
q MessageQueue
return MsmqAddress,
        /// <summary>
        /// Removes all entries from the worker availability queue
        /// with the specified address.
        /// </summary>
        /// <param name="address">
        /// The address of the worker to remove from the availability list.
        /// </param>
        public void ClearAvailabilityForWorker(Address address)
        {
            var existing = storageQueue.GetAllMessages();

            foreach (var m in existing)
            {
                if (MsmqUtilities.GetIndependentAddressForQueue(m.ResponseQueue) == address)
                {
                    storageQueue.ReceiveById(m.Id, MessageQueueTransactionType.Automatic);
                }
            }
        }
        /// <summary>
        /// Pops the next available worker from the available worker queue
        /// and returns its address.
        /// </summary>
        public Address PopAvailableWorker()
        {
            try
            {
                var m = storageQueue.Receive(TimeSpan.Zero, MessageQueueTransactionType.Automatic);

                if (m == null)
                {
                    return(null);
                }

                return(MsmqUtilities.GetIndependentAddressForQueue(m.ResponseQueue));
            }
            catch (Exception)
            {
                return(null);
            }
        }
        /// <summary>
        /// Removes all entries from the worker availability queue
        /// with the specified address.
        /// </summary>
        /// <param name="address">
        /// The address of the worker to remove from the availability list.
        /// </param>
        public void ClearAvailabilityForWorker(Address address)
        {
            lock (lockObject)
            {
                var messages = storageQueue.GetAllMessages();

                foreach (var m in messages.Where(m => MsmqUtilities.GetIndependentAddressForQueue(m.ResponseQueue) == address))
                {
                    if (UnitOfWork.HasActiveTransaction())
                    {
                        storageQueue.ReceiveById(m.Id, UnitOfWork.Transaction);
                    }
                    else
                    {
                        storageQueue.ReceiveById(m.Id, MessageQueueTransactionType.Automatic);
                    }
                }
            }
        }
        /// <summary>
        /// Converts an MSMQ <see cref="Message"/> into an NServiceBus message.
        /// </summary>
        /// <param name="m">The MSMQ message to convert.</param>
        /// <returns>An NServiceBus message.</returns>
        public TransportMessage Convert(Message m)
        {
            var result = new TransportMessage
            {
                Id            = m.Id,
                CorrelationId =
                    (m.CorrelationId == "00000000-0000-0000-0000-000000000000\\0"
                                                                ? null
                                                                : m.CorrelationId),
                Recoverable      = m.Recoverable,
                TimeToBeReceived = m.TimeToBeReceived,
                TimeSent         = m.SentTime,
                ReturnAddress    = MsmqUtilities.GetIndependentAddressForQueue(m.ResponseQueue),
                MessageIntent    =
                    Enum.IsDefined(typeof(MessageIntentEnum), m.AppSpecific)
                                                                ? (MessageIntentEnum)m.AppSpecific
                                                                : MessageIntentEnum.Send
            };

            FillIdForCorrelationAndWindowsIdentity(result, m);

            if (string.IsNullOrEmpty(result.IdForCorrelation))
            {
                result.IdForCorrelation = result.Id;
            }

            if (m.Extension.Length > 0)
            {
                var stream = new MemoryStream(m.Extension);
                var o      = _headerSerializer.Deserialize(stream);
                result.Headers = o as List <HeaderInfo>;
            }
            else
            {
                result.Headers = new List <HeaderInfo>();
            }

            return(result);
        }
        public Address PopAvailableWorker()
        {
            if (!Monitor.TryEnter(lockObject))
            {
                return(null);
            }

            try
            {
                Message availableWorker;

                if (UnitOfWork.HasActiveTransaction())
                {
                    availableWorker = storageQueue.Receive(MaxTimeToWaitForAvailableWorker, UnitOfWork.Transaction);
                }
                else
                {
                    availableWorker = storageQueue.Receive(MaxTimeToWaitForAvailableWorker, MessageQueueTransactionType.Automatic);
                }

                if (availableWorker == null)
                {
                    return(null);
                }

                return(MsmqUtilities.GetIndependentAddressForQueue(availableWorker.ResponseQueue));
            }
            catch (Exception)
            {
                return(null);
            }
            finally
            {
                Monitor.Exit(lockObject);
            }
        }
        public TransportMessage Receive()
        {
            try
            {
                var m = myQueue.Receive(TimeSpan.FromSeconds(secondsToWait), GetTransactionTypeForReceive());
                if (m == null)
                {
                    return(null);
                }

                var result = new TransportMessage
                {
                    Id            = m.Id,
                    CorrelationId =
                        (m.CorrelationId == "00000000-0000-0000-0000-000000000000\\0"
                             ? null
                             : m.CorrelationId),
                    Recoverable      = m.Recoverable,
                    TimeToBeReceived = m.TimeToBeReceived,
                    TimeSent         = m.SentTime,
                    ReturnAddress    = MsmqUtilities.GetIndependentAddressForQueue(m.ResponseQueue),
                    MessageIntent    = Enum.IsDefined(typeof(MessageIntentEnum), m.AppSpecific) ? (MessageIntentEnum)m.AppSpecific : MessageIntentEnum.Send
                };

                m.BodyStream.Position = 0;
                result.Body           = new byte[m.BodyStream.Length];
                m.BodyStream.Read(result.Body, 0, result.Body.Length);

                result.Headers = new Dictionary <string, string>();
                if (m.Extension.Length > 0)
                {
                    var stream = new MemoryStream(m.Extension);
                    var o      = headerSerializer.Deserialize(stream);

                    foreach (var pair in o as List <HeaderInfo> )
                    {
                        if (pair.Key != null)
                        {
                            result.Headers.Add(pair.Key, pair.Value);
                        }
                    }
                }

                result.IdForCorrelation = GetIdForCorrelation(result.Headers);
                if (result.IdForCorrelation == null)
                {
                    result.IdForCorrelation = result.Id;
                }

                return(result);
            }
            catch (MessageQueueException mqe)
            {
                if (mqe.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
                {
                    return(null);
                }

                if (mqe.MessageQueueErrorCode == MessageQueueErrorCode.AccessDenied)
                {
                    Logger.Fatal(string.Format("Do not have permission to access queue [{0}]. Make sure that the current user [{1}] has permission to Send, Receive, and Peek  from this queue. NServiceBus will now exit.", myQueue.QueueName, WindowsIdentity.GetCurrent() != null ? WindowsIdentity.GetCurrent().Name : "unknown user"));
                    Thread.Sleep(10000); //long enough for someone to notice
                    Process.GetCurrentProcess().Kill();
                }

                throw;
            }
        }