using System; using System.IO; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Xml; using System.Runtime.Serialization.Formatters.Binary; using MiniHttpd; namespace AquaparkMonitor { public partial class Aquamonit : Form { // server settings string sServerSettingsXML = "MiniHttpdSettings.xml"; //plik XML dla serwera HTTP int iServerPort = 3400; string sHostName = "aquapark_monitor"; // app settings string sSettingsAppFile = "settings.xml"; string sEsokDir = "C:\\esok_file\\"; //katalog pliku ESOK string sNTPServer = "pl.pool.ntp.org"; string sEsokFilename = "statystyka_esok.xml"; int iIntervalSek = 10; // czas odswierzania danych w monitoringu w sekundach int iTempDzie = 20; int iTempRek = 20; // serwer HttpWebServer server = new HttpWebServer(); BasicAuthenticator auth = new BasicAuthenticator(); string sRootPath = Path.GetDirectoryName(Application.ExecutablePath) + "\\server\\"; // Load App Start Settings private void LoadAppSettings() { XmlDocument doc; XmlElement docElement; try { doc = new XmlDocument(); doc.Load(sSettingsAppFile); docElement = doc.DocumentElement; } catch { return; } } // Load Server HTTP Settings private void LoadSettings() { XmlDocument doc; XmlElement docElement; try { doc = new XmlDocument(); doc.Load(sServerSettingsXML); docElement = doc.DocumentElement; } catch { return; } try { server.Port = int.Parse(docElement["Port"].InnerText); } catch { } try { server.HostName = docElement["HostName"].InnerText; } catch { } try { foreach (XmlElement user in docElement["Users"].ChildNodes) { auth.AddUserByHash(user["Name"].InnerText, user["Password"].InnerText); } } //catch { } finally { } } //zapis ustawien serwera do pliku void SaveSettings() { if (InvokeRequired) { Invoke(new MethodInvoker(SaveSettings)); return; } try { XmlDocument doc = new XmlDocument(); doc.AppendChild(doc.CreateElement("MiniHttpdSettings")); XmlElement element; XmlElement docElement = doc.DocumentElement; element = doc.CreateElement("Port"); docElement.AppendChild(element); element.InnerText = iServerPort.ToString(); element = doc.CreateElement("HostName"); docElement.AppendChild(element); element.InnerText = sHostName; element = doc.CreateElement("Users"); docElement.AppendChild(element); if (auth.Users != null) foreach (string username in auth.Users) { XmlElement user = doc.CreateElement("User"); XmlElement nameElement = doc.CreateElement("Name"); XmlElement passwordElement = doc.CreateElement("Password"); nameElement.InnerText = username; passwordElement.InnerText = auth.GetPasswordHash(username); user.AppendChild(nameElement); user.AppendChild(passwordElement); element.AppendChild(user); } doc.Save(sServerSettingsXML); } catch(Exception e) { Console.WriteLine("Error saving server settings:"); Console.WriteLine(e); } finally { } } public Aquamonit() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { } private void Form1_Load(object sender, EventArgs e) { server.Authenticator = auth; server.RequireAuthentication = true; server.Root = new DriveDirectory(sRootPath); server.RequestReceived += server_RequestReceived; //auth.AddUser("user", "user123"); //SaveSettings(); LoadSettings(); //start serwera try { server.Start(); } catch (Exception e2) { Console.Error.WriteLine(e2); } } void server_RequestReceived(object sender, RequestEventArgs e) { HttpRequest request = e.Request; switch (request.Method) { case "GET": //Otwieramy plik i podmieniamy pola break; case "POST": MemoryStream stream = request.PostData; stream.Position = 0; var sr = new StreamReader(stream); string data = sr.ReadToEnd(); // POST data // wykonujemy zapis danych do zmiennych string post_data = Uri.UnescapeDataString(data); string[] elements = post_data.Split('&'); //tworzymy tablice z elementami formularza // iterujemy po wszystkich elementach foreach (string ele in elements) { if (!string.IsNullOrEmpty(ele)) { //kazdy element rozdzielamy na dwa string[] in_el = ele.Split('='); switch (in_el[0]) { case "temp_dzie": break; case "temp_rek": break; case "interval": break; case "esok_dir": break; case "server_ntp": break; } } } // ... i wywolujemy zapis do pliku z ustawieniami //Console.WriteLine(Uri.UnescapeDataString(data)); break; } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { server.Stop(); } } }