//
// 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.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;

namespace HelloWorldService
{
	public class HelloWorldServiceClass : System.ServiceProcess.ServiceBase
	{
		private System.Timers.Timer timer;
		private System.Diagnostics.PerformanceCounter performanceCounter;
		/// <summary> 
		/// Wymagana zmienna.
		/// </summary>
		private System.ComponentModel.Container components = null;

		public HelloWorldServiceClass()
		{
			// To wywołanie jest wymagane przez Windows.Forms Component Designer.
			InitializeComponent();

			// TODO: Dodanie kodu konstruktora po wywołaniu InitializeComponent
		}

		// Główny punkt wejścia dla procesu
		static void Main()
		{
			System.ServiceProcess.ServiceBase[] ServicesToRun;
	
			// W tym samym procesie może działać kilka usług użytkownika. Aby dodać
			// kolejną usługę do tego procesu, należy zmienić poniższy wiersz w celu
			// utworzenia drugiego obiektu usługi, na przykład:
			//
			//   ServicesToRun = New System.ServiceProcess.ServiceBase[] {new HelloWorldServiceClass(), new MySecondUserService()};
			//
			ServicesToRun = new System.ServiceProcess.ServiceBase[] { new HelloWorldServiceClass() };

			System.ServiceProcess.ServiceBase.Run(ServicesToRun);
		}

		/// <summary> 
		/// Metoda wymagana do obsługi Designera - nie należy modyfikować
		/// zawartości tej metody przy użyciu edytora kodu.
		/// </summary>
		private void InitializeComponent()
		{
			this.timer = new System.Timers.Timer();
			this.performanceCounter = new System.Diagnostics.PerformanceCounter();
			((System.ComponentModel.ISupportInitialize)(this.timer)).BeginInit();
			((System.ComponentModel.ISupportInitialize)(this.performanceCounter)).BeginInit();
			// 
			// timer
			// 
			this.timer.Elapsed += new System.Timers.ElapsedEventHandler(this.OnTimer);
			// 
			// performanceCounter
			// 
			this.performanceCounter.CategoryName = "Witaj świecie";
			this.performanceCounter.CounterName = "Liczba";
			this.performanceCounter.ReadOnly = false;
			// 
			// HelloWorldServiceClass
			// 
			this.ServiceName = "HelloWorldService";
			((System.ComponentModel.ISupportInitialize)(this.timer)).EndInit();
			((System.ComponentModel.ISupportInitialize)(this.performanceCounter)).EndInit();

		}

		/// <summary>
		/// Oczyszczenie używanych zasobów.
		/// </summary>
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}

		/// <summary>
		/// Uruchomienie wszystkich elementów, dzięki czemu usługa może rozpocząć pracę.
		/// </summary>
		protected override void OnStart(string[] args)
		{
			timer.Enabled = true;
		}
 
		/// <summary>
		/// Stop this service.
		/// </summary>
		protected override void OnStop()
		{
			timer.Enabled = false;
		}

		private void OnTimer(object sender, System.Timers.ElapsedEventArgs e)
		{
			performanceCounter.Increment();
		}
	}
}
