//
// Copyright (c) 2002
// Ronald Kevin Burton
//
// Z poniższym kodem nie jest związana żadna gwarancja poprawności działania.
// Program został dołączony do książki ".NET CLR. Księga eksperta" w celu
// ilustracji koncepcji i zasad przedstawionych w tej książce. Program może być 
// używany na własne ryzyko.
//
// Przyznaje się prawo do użycia lub kopiowania tego oprogramowania do dowolnego celu
// bez konieczności ponoszenia żadnych opłat pod warunkiem, że powyższe uwagi zostaną 
// zachowane we wszystkich kopiach. Przyznaje się także prawo do modyfikacji kodu
// i dystrybucji zmodyfikowanego kodu pod warunkiem zachowania powyższych uwag
// oraz dołączenia informacji mówiącej o modyfikacji kodu.
//
//
using System;
using System.Messaging;

namespace FrameworkLibraries
{
	public class MessageQueueReceive 
	{

		static void Main(string [] args)
		{
			// Utworzenie nowego egzemplarza klasy.
			MessageQueueReceive q = new MessageQueueReceive();
			// Odbiór wiadomości z kolejki.
			q.ReceiveMessage();
			return;
		}

		//**************************************************
		// Odbiera wiadomość zawierającą zamówienie.
		//**************************************************
		public void ReceiveMessage()
		{
			// Połączenie z kolejką na komputerze lokalnym.
			MessageQueue myQueue = new MessageQueue(".\\myQueue");

			// Ustawienie formatera w celu wskazania, że wiadomość zawiera polecenie.
			myQueue.Formatter = new XmlMessageFormatter(new string[]{"System.String"});
         
			try
			{
				// Odbiór i formatowanie wiadomości. 
				// Odczekanie 5 sekund na nadejście wiadomości.
				Message myMessage =   myQueue.Receive(new TimeSpan(0,0,5)); 
				string messageText = (string)myMessage.Body;
				// Wyświetlenie informacji o wiadomości.
				Console.WriteLine("Wiadomość odebrana: " + messageText);
			}
			catch (MessageQueueException e)
			{
				// Postępowanie w przypadku braku wiadomości w kolejce.
				if (e.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
				{
					Console.WriteLine("W kolejce nie ma żadnych wiadomości.");
				}         

				// Obsługa innych źródeł wyjątku MessageQueueException.
			}
         
			// Obsługa niewłaściwego formatu szeregowania.
			catch (InvalidOperationException e)
			{
				Console.WriteLine(e.Message);
			}
         
			// Przechwycenie innych wyjątków w razie potrzeby.

			return;
		}
	}
}