//
// 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 MessageQueueSend 
	{
		static void Main(string [] args)
		{
			string message = "Witaj!!!";
			if(args.Length > 0)
				message = args[0];
			// Utworzenie nowego egzemplarza klasy.
			MessageQueueSend myNewQueue = new MessageQueueSend();
			// Wysłanie wiadomości do kolejki.
			myNewQueue.SendMessage(message);
			return;
		}
		//**************************************************
		// Wysyłanie wiadomości do kolejki.
		//**************************************************
  		public void SendMessage(string message)
		{
			string queueName = ".\\myQueue";
			if(MessageQueue.Exists(queueName))
			{
				// Połączenie z kolejką na komputerze lokalnym.
				MessageQueue myQueue = new MessageQueue(queueName);
				// Ustawienie formatera w celu wskazanie, że wiadomość zawiera polecenie.
				myQueue.Formatter = new XmlMessageFormatter(new string[]{"System.String"});
				// Wysłanie wiadomości do kolejki.
				if (myQueue.Transactional == true)
				{
					Console.WriteLine("Wysyłanie wiadomości tranzakcyjnej");
					myQueue.Send(message, new MessageQueueTransaction());
				}
				else
				{
					Console.WriteLine("Wysyłania wiadomości");
					myQueue.Send(message);
				}
			}
			else
			{
				Console.WriteLine("{0} nie istnieje.", queueName);
				MessageQueue [] mqa = MessageQueue.GetPublicQueues();
				foreach(MessageQueue m in mqa)
				{
					Console.WriteLine("Publiczna: {0}", m.QueueName);
				}
				mqa = MessageQueue.GetPrivateQueuesByMachine(".");
				foreach(MessageQueue m in mqa)
				{
					Console.WriteLine("Prywatna: {0}", m.QueueName);
				}
			}
			return;
		}
	}
}