using System; using System.IO; using System.Drawing; using System.Collections; using System.Threading; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.ServiceProcess; using System.Runtime.InteropServices; using System.Text; using System.Net; using System.Net.Sockets; using JCMLib; namespace FireflyConfig { /// /// Summary description for Form1. /// /// public enum ServiceStatus { Unintialized, Running, Stopped, Unknown } public class FireflyConfig : System.Windows.Forms.Form { private System.Threading.Thread UDPThread; private System.Drawing.Icon icnRunning; private System.Drawing.Icon icnStopped; private System.Drawing.Icon icnUnknown; private System.Windows.Forms.Timer timerRefresh; private System.ServiceProcess.ServiceController scFirefly; private ServiceStatus iState = ServiceStatus.Unintialized; private string strPort; private string strServerName; private string strMusicDir; private string strPassword; private bool ForceExit = false; private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label3; private System.Windows.Forms.Label label4; private System.Windows.Forms.GroupBox groupBox1; private System.Windows.Forms.TextBox textBoxPort; private System.Windows.Forms.TextBox textBoxServerName; private System.Windows.Forms.TextBox textBoxMusicDir; private System.Windows.Forms.Button buttonBrowseDir; private System.Windows.Forms.MenuItem menuItemStart; private System.Windows.Forms.MenuItem menuItemStop; private System.Windows.Forms.MenuItem menuItemConfigure; private System.Windows.Forms.ContextMenu trayMenu; private NotifyIconEx notifyIcon; private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog; private System.Windows.Forms.MenuItem menuItemExit; private System.Windows.Forms.Button buttonOK; private System.Windows.Forms.Button buttonCancel; private System.Windows.Forms.TextBox textBoxPassword; private System.Windows.Forms.CheckBox checkBoxPassword; private System.Windows.Forms.TabControl tabControl1; private System.Windows.Forms.TabPage ConfigPage; private System.Windows.Forms.TabPage LogPage; private System.Windows.Forms.TextBox logBox; private System.ComponentModel.IContainer components; protected override void WndProc(ref Message msg) { if(msg.Msg == 0x11) // WM_QUERYENDSESSION { ForceExit = true; } else if (msg.Msg == 0x400) // WM_USER { ForceExit = true; Close(); } else if(msg.Msg == 0x0401) // WM_USER + 1 (show config page) { Show(); } base.WndProc(ref msg); } public void ServiceStatusUpdate() { scFirefly.Refresh(); ServiceStatus iOldState = iState; switch(scFirefly.Status) { case System.ServiceProcess.ServiceControllerStatus.Stopped: iState = ServiceStatus.Stopped; break; case System.ServiceProcess.ServiceControllerStatus.Running: iState = ServiceStatus.Running; break; default: iState = ServiceStatus.Unknown; break; } if(iState != iOldState) { switch(iState) { case ServiceStatus.Stopped: menuItemStart.Enabled = true; menuItemStop.Enabled = false; notifyIcon.Icon = icnStopped; notifyIcon.Text = "Firefly Media Server is stopped"; notifyIcon.ShowBalloon("Firefly Server","Server is stopped",JCMLib.NotifyIconEx.NotifyInfoFlags.Info,5000); break; case ServiceStatus.Running: menuItemStart.Enabled = false; menuItemStop.Enabled = true; notifyIcon.Icon = icnRunning; notifyIcon.Text = "Firefly Media Server is running"; notifyIcon.ShowBalloon("Firefly Server","Server is running",JCMLib.NotifyIconEx.NotifyInfoFlags.Info,5000); break; case ServiceStatus.Unknown: menuItemStart.Enabled = false; menuItemStop.Enabled = false; notifyIcon.Icon = icnUnknown; notifyIcon.Text = "Cannot connect to Firefly Media Server"; notifyIcon.ShowBalloon("Firefly Server","Cannot contact media server",JCMLib.NotifyIconEx.NotifyInfoFlags.Warning,5000); break; } } } public FireflyConfig() { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // /* grab the icons */ System.IO.Stream st; System.Reflection.Assembly a = System.Reflection.Assembly.GetExecutingAssembly(); st = a.GetManifestResourceStream("FireflyConfig.ff_run.ico"); icnRunning = new System.Drawing.Icon(st); st = a.GetManifestResourceStream("FireflyConfig.ff_stop.ico"); icnStopped = new System.Drawing.Icon(st); st = a.GetManifestResourceStream("FireflyConfig.ff_unknown.ico"); icnUnknown = new System.Drawing.Icon(st); /* grab the service handle */ scFirefly = new System.ServiceProcess.ServiceController("Firefly Media Server"); /* set up the poller for service state */ timerRefresh = new System.Windows.Forms.Timer(); timerRefresh.Interval = 5000; timerRefresh.Enabled=true; timerRefresh.Start(); timerRefresh.Tick += new EventHandler(timerRefresh_Tick); this.Visible=false; logBox.AppendText("Configurator Started\r\n"); UDPThread = new Thread(new ThreadStart(UDPThreadFunction)); UDPThread.IsBackground=true; UDPThread.Start(); } public void UDPThreadFunction() { Socket sockUDP; System.Text.ASCIIEncoding encoding=new System.Text.ASCIIEncoding(); try { sockUDP = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp); IPAddress local = IPAddress.Parse("127.0.0.1"); IPEndPoint localIpEndPoint = new IPEndPoint(local,9999); sockUDP.Bind(localIpEndPoint); while(true) { Byte[] received = new Byte[4096]; IPEndPoint tmpIpEndPoint = new IPEndPoint(local,9999); EndPoint remoteEP = (tmpIpEndPoint); int bytesReceived = sockUDP.ReceiveFrom(received,ref remoteEP); if(bytesReceived != 0) { int size; int id; int intval; size = received[0] | (received[1] << 8) | (received[2] << 16) | (received[3] << 24); id = received[4] | (received[5] << 8) | (received[6] << 16) | (received[7] << 24); intval = received[8] | (received[9] << 8) | (received[10] << 16) | (received[11] << 24); string strval = encoding.GetString(received,12,bytesReceived < size ? bytesReceived - 12 : size - 12).Replace("\n","\r\n"); if(id == 0) { /* log message */ logBox.AppendText(String.Format("{0}{1}",intval == 0 ? "FATAL: " : "",strval)); if(intval == 0) { /* fatal error */ notifyIcon.ShowBalloon("Fatal Error",strval,JCMLib.NotifyIconEx.NotifyInfoFlags.Error,5000); } } else if(id == 1) { notifyIcon.ShowBalloon("Firefly Server","Starting music scan...\r\nThis may take some time.",JCMLib.NotifyIconEx.NotifyInfoFlags.Info,5000); } else if (id == 2) { notifyIcon.ShowBalloon("Firefly Server","Music scan complete",JCMLib.NotifyIconEx.NotifyInfoFlags.Info,5000); } } } } catch(ThreadAbortException) { /* should clean up gracefully here */ return; } finally { MessageBox.Show("Socket Error. Ignoring server events"); } } /// /// Clean up any resources being used. /// protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } protected void LoadIni() { string path = Environment.CurrentDirectory + "\\mt-daapd.conf"; IniFile ifConfig = new IniFile(path); strPort = ifConfig.IniReadValue("general","port"); strServerName = ifConfig.IniReadValue("general","servername"); strMusicDir = ifConfig.IniReadValue("general","mp3_dir"); strPassword = ifConfig.IniReadValue("general","password"); textBoxPort.Text = strPort; textBoxServerName.Text = strServerName; textBoxMusicDir.Text = strMusicDir; textBoxPassword.Text = strPassword; if((strPassword == "") || (strPassword == null)) { checkBoxPassword.Checked = false; textBoxPassword.Enabled = false; } else { checkBoxPassword.Checked = true; textBoxPassword.Enabled = true; } } public void timerRefresh_Tick(object sender, EventArgs eArgs) { if(sender == timerRefresh) { ServiceStatusUpdate(); } } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(FireflyConfig)); this.label1 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label(); this.label4 = new System.Windows.Forms.Label(); this.checkBoxPassword = new System.Windows.Forms.CheckBox(); this.groupBox1 = new System.Windows.Forms.GroupBox(); this.textBoxPassword = new System.Windows.Forms.TextBox(); this.textBoxPort = new System.Windows.Forms.TextBox(); this.textBoxServerName = new System.Windows.Forms.TextBox(); this.textBoxMusicDir = new System.Windows.Forms.TextBox(); this.buttonBrowseDir = new System.Windows.Forms.Button(); this.buttonOK = new System.Windows.Forms.Button(); this.buttonCancel = new System.Windows.Forms.Button(); this.trayMenu = new System.Windows.Forms.ContextMenu(); this.menuItemConfigure = new System.Windows.Forms.MenuItem(); this.menuItemStart = new System.Windows.Forms.MenuItem(); this.menuItemStop = new System.Windows.Forms.MenuItem(); this.menuItemExit = new System.Windows.Forms.MenuItem(); this.notifyIcon = new JCMLib.NotifyIconEx(); this.folderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog(); this.tabControl1 = new System.Windows.Forms.TabControl(); this.ConfigPage = new System.Windows.Forms.TabPage(); this.LogPage = new System.Windows.Forms.TabPage(); this.logBox = new System.Windows.Forms.TextBox(); this.groupBox1.SuspendLayout(); this.tabControl1.SuspendLayout(); this.ConfigPage.SuspendLayout(); this.LogPage.SuspendLayout(); this.SuspendLayout(); // // label1 // this.label1.Location = new System.Drawing.Point(8, 12); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(80, 16); this.label1.TabIndex = 0; this.label1.Text = "Port:"; // // label2 // this.label2.Location = new System.Drawing.Point(8, 76); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(88, 23); this.label2.TabIndex = 4; this.label2.Text = "Music Directory:"; // // label3 // this.label3.Location = new System.Drawing.Point(8, 44); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(80, 23); this.label3.TabIndex = 2; this.label3.Text = "Server Name:"; // // label4 // this.label4.Location = new System.Drawing.Point(16, 50); this.label4.Name = "label4"; this.label4.Size = new System.Drawing.Size(56, 16); this.label4.TabIndex = 1; this.label4.Text = "Password:"; // // checkBoxPassword // this.checkBoxPassword.Location = new System.Drawing.Point(16, 16); this.checkBoxPassword.Name = "checkBoxPassword"; this.checkBoxPassword.Size = new System.Drawing.Size(184, 24); this.checkBoxPassword.TabIndex = 0; this.checkBoxPassword.Text = "Use Music Library Password"; this.checkBoxPassword.CheckedChanged += new System.EventHandler(this.checkBoxPassword_CheckedChanged); // // groupBox1 // this.groupBox1.Controls.Add(this.textBoxPassword); this.groupBox1.Controls.Add(this.checkBoxPassword); this.groupBox1.Controls.Add(this.label4); this.groupBox1.Location = new System.Drawing.Point(9, 104); this.groupBox1.Name = "groupBox1"; this.groupBox1.Size = new System.Drawing.Size(247, 80); this.groupBox1.TabIndex = 7; this.groupBox1.TabStop = false; this.groupBox1.Text = "Passsword"; // // textBoxPassword // this.textBoxPassword.Location = new System.Drawing.Point(80, 48); this.textBoxPassword.Name = "textBoxPassword"; this.textBoxPassword.Size = new System.Drawing.Size(160, 20); this.textBoxPassword.TabIndex = 2; this.textBoxPassword.Text = ""; // // textBoxPort // this.textBoxPort.Location = new System.Drawing.Point(104, 8); this.textBoxPort.Name = "textBoxPort"; this.textBoxPort.Size = new System.Drawing.Size(48, 20); this.textBoxPort.TabIndex = 1; this.textBoxPort.Text = ""; // // textBoxServerName // this.textBoxServerName.Location = new System.Drawing.Point(104, 40); this.textBoxServerName.Name = "textBoxServerName"; this.textBoxServerName.Size = new System.Drawing.Size(152, 20); this.textBoxServerName.TabIndex = 3; this.textBoxServerName.Text = ""; // // textBoxMusicDir // this.textBoxMusicDir.Location = new System.Drawing.Point(104, 72); this.textBoxMusicDir.Name = "textBoxMusicDir"; this.textBoxMusicDir.Size = new System.Drawing.Size(120, 20); this.textBoxMusicDir.TabIndex = 5; this.textBoxMusicDir.Text = ""; // // buttonBrowseDir // this.buttonBrowseDir.Location = new System.Drawing.Point(232, 72); this.buttonBrowseDir.Name = "buttonBrowseDir"; this.buttonBrowseDir.Size = new System.Drawing.Size(24, 20); this.buttonBrowseDir.TabIndex = 6; this.buttonBrowseDir.Text = "..."; this.buttonBrowseDir.Click += new System.EventHandler(this.buttonBrowseDir_Click); // // buttonOK // this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; this.buttonOK.Location = new System.Drawing.Point(8, 240); this.buttonOK.Name = "buttonOK"; this.buttonOK.Size = new System.Drawing.Size(80, 24); this.buttonOK.TabIndex = 8; this.buttonOK.Text = "&Ok"; this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); // // buttonCancel // this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; this.buttonCancel.Location = new System.Drawing.Point(200, 240); this.buttonCancel.Name = "buttonCancel"; this.buttonCancel.Size = new System.Drawing.Size(80, 24); this.buttonCancel.TabIndex = 9; this.buttonCancel.Text = "&Cancel"; this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); // // trayMenu // this.trayMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuItemConfigure, this.menuItemStart, this.menuItemStop, this.menuItemExit}); // // menuItemConfigure // this.menuItemConfigure.DefaultItem = true; this.menuItemConfigure.Index = 0; this.menuItemConfigure.Text = "&Configure Firefly Media Server..."; this.menuItemConfigure.Click += new System.EventHandler(this.menuItemConfigure_Click); // // menuItemStart // this.menuItemStart.Enabled = false; this.menuItemStart.Index = 1; this.menuItemStart.Text = "S&tart Firefly Media Server"; this.menuItemStart.Click += new System.EventHandler(this.menuItemStart_Click); // // menuItemStop // this.menuItemStop.Enabled = false; this.menuItemStop.Index = 2; this.menuItemStop.Text = "&Stop Firefly Media Server"; this.menuItemStop.Click += new System.EventHandler(this.menuItemStop_Click); // // menuItemExit // this.menuItemExit.Index = 3; this.menuItemExit.Text = "E&xit"; this.menuItemExit.Click += new System.EventHandler(this.menuItemExit_Click); // // notifyIcon // this.notifyIcon.ContextMenu = this.trayMenu; this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon"))); this.notifyIcon.Text = "Firefly Media Server"; this.notifyIcon.Visible = true; this.notifyIcon.DoubleClick += new System.EventHandler(this.notifyIcon_DoubleClick); // // tabControl1 // this.tabControl1.Controls.Add(this.ConfigPage); this.tabControl1.Controls.Add(this.LogPage); this.tabControl1.ItemSize = new System.Drawing.Size(74, 18); this.tabControl1.Location = new System.Drawing.Point(8, 8); this.tabControl1.Name = "tabControl1"; this.tabControl1.SelectedIndex = 0; this.tabControl1.Size = new System.Drawing.Size(272, 224); this.tabControl1.TabIndex = 10; // // ConfigPage // this.ConfigPage.Controls.Add(this.label1); this.ConfigPage.Controls.Add(this.label2); this.ConfigPage.Controls.Add(this.label3); this.ConfigPage.Controls.Add(this.groupBox1); this.ConfigPage.Controls.Add(this.textBoxPort); this.ConfigPage.Controls.Add(this.textBoxServerName); this.ConfigPage.Controls.Add(this.textBoxMusicDir); this.ConfigPage.Controls.Add(this.buttonBrowseDir); this.ConfigPage.Location = new System.Drawing.Point(4, 22); this.ConfigPage.Name = "ConfigPage"; this.ConfigPage.Size = new System.Drawing.Size(264, 198); this.ConfigPage.TabIndex = 0; this.ConfigPage.Text = "Configuration"; // // LogPage // this.LogPage.Controls.Add(this.logBox); this.LogPage.Location = new System.Drawing.Point(4, 22); this.LogPage.Name = "LogPage"; this.LogPage.Size = new System.Drawing.Size(264, 198); this.LogPage.TabIndex = 1; this.LogPage.Text = "Log"; // // logBox // this.logBox.Location = new System.Drawing.Point(0, 0); this.logBox.Multiline = true; this.logBox.Name = "logBox"; this.logBox.ReadOnly = true; this.logBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; this.logBox.Size = new System.Drawing.Size(264, 200); this.logBox.TabIndex = 0; this.logBox.Text = ""; // // FireflyConfig // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(288, 270); this.ControlBox = false; this.Controls.Add(this.buttonCancel); this.Controls.Add(this.buttonOK); this.Controls.Add(this.tabControl1); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MaximizeBox = false; this.Name = "FireflyConfig"; this.ShowInTaskbar = false; this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; this.Text = "Firefly Config"; this.WindowState = System.Windows.Forms.FormWindowState.Minimized; this.Resize += new System.EventHandler(this.FireflyConfig_Resize); this.Closing += new System.ComponentModel.CancelEventHandler(this.FireflyConfig_Closing); this.Load += new System.EventHandler(this.FireflyConfig_Load); this.groupBox1.ResumeLayout(false); this.tabControl1.ResumeLayout(false); this.ConfigPage.ResumeLayout(false); this.LogPage.ResumeLayout(false); this.ResumeLayout(false); } #endregion /// /// The main entry point for the application. /// [STAThread] static void Main() { Application.Run(new FireflyConfig()); } private void notifyIcon_DoubleClick(object sender, System.EventArgs e) { LoadIni(); Show(); WindowState = FormWindowState.Normal; ShowInTaskbar = true; } private void FireflyConfig_Resize(object sender, System.EventArgs e) { if(FormWindowState.Minimized == WindowState) { Hide(); } } private void menuItemExit_Click(object sender, System.EventArgs e) { ForceExit = true; Close(); } private void FireflyConfig_Load(object sender, System.EventArgs e) { Hide(); } private void menuItemConfigure_Click(object sender, System.EventArgs e) { LoadIni(); Show(); WindowState = FormWindowState.Normal; ShowInTaskbar = true; } private void menuItemStart_Click(object sender, System.EventArgs e) { scFirefly.Start(); } private void menuItemStop_Click(object sender, System.EventArgs e) { scFirefly.Stop(); } private void checkBoxPassword_CheckedChanged(object sender, System.EventArgs e) { textBoxPassword.Enabled = checkBoxPassword.Checked; } private void buttonCancel_Click(object sender, System.EventArgs e) { Hide(); } private void buttonBrowseDir_Click(object sender, System.EventArgs e) { folderBrowserDialog.SelectedPath = textBoxMusicDir.Text; if(folderBrowserDialog.ShowDialog() == DialogResult.OK) { textBoxMusicDir.Text = folderBrowserDialog.SelectedPath; } } private void buttonOK_Click(object sender, System.EventArgs e) { System.Windows.Forms.DialogResult result; bool changed=false; string strNewPassword; strNewPassword = textBoxPassword.Text; if(checkBoxPassword.Checked == false) strNewPassword = ""; if(textBoxPort.Text != strPort) changed = true; if(textBoxServerName.Text != strServerName) changed = true; if(textBoxMusicDir.Text != strMusicDir) changed = true; if(strNewPassword != strPassword) changed = true; if(changed) { result = MessageBox.Show("Changing these values will require a restart of the Firefly Media Server. Are you sure you want to do this?", "Restart Confirmation",System.Windows.Forms.MessageBoxButtons.YesNoCancel); if(result == DialogResult.Yes) { /* write the values */ string path = Environment.CurrentDirectory + "\\mt-daapd.conf"; IniFile ifConfig = new IniFile(path); ifConfig.IniWriteValue("general","port",textBoxPort.Text); ifConfig.IniWriteValue("general","servername",textBoxServerName.Text); ifConfig.IniWriteValue("general","mp3_dir",textBoxMusicDir.Text); ifConfig.IniWriteValue("general","password",strNewPassword); try { timerRefresh.Enabled = false; notifyIcon.ShowBalloon("Firefly Server","Stopping Firefly Media Server",JCMLib.NotifyIconEx.NotifyInfoFlags.Info,5000); scFirefly.Stop(); scFirefly.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Stopped,new TimeSpan(0,0,30)); notifyIcon.ShowBalloon("Firefly Server","Starting Firefly Media Server",JCMLib.NotifyIconEx.NotifyInfoFlags.Info,5000); scFirefly.Start(); notifyIcon.ShowBalloon("Firefly Server","Started Firefly Media Server",JCMLib.NotifyIconEx.NotifyInfoFlags.Info,5000); timerRefresh.Enabled = true; } catch (Exception ex) { ex = ex; MessageBox.Show("Error restarting server"); }; Hide(); } else if(result == DialogResult.No) { Hide(); } } else { Hide(); } } private void FireflyConfig_Closing(object sender, System.ComponentModel.CancelEventArgs e) { if(!ForceExit) { e.Cancel = true; } else { e.Cancel=false; UDPThread.Abort(); Application.Exit(); } } } public class IniFile { public string path; [DllImport("kernel32")] private static extern long WritePrivateProfileString(string section, string key,string val,string filePath); [DllImport("kernel32")] private static extern int GetPrivateProfileString(string section, string key,string def, StringBuilder retVal, int size,string filePath); /// /// INIFile Constructor. /// /// public IniFile(string INIPath) { path = INIPath; } /// /// Write Data to the INI File /// /// /// Section name /// /// Key Name /// /// Value Name public void IniWriteValue(string Section,string Key,string Value) { WritePrivateProfileString(Section,Key,Value,this.path); } /// /// Read Data Value From the Ini File /// /// /// /// /// public string IniReadValue(string Section,string Key) { StringBuilder temp = new StringBuilder(4096); int i = GetPrivateProfileString(Section,Key,"",temp, 4096, this.path); return temp.ToString(); } } }