From: <an...@us...> - 2007-07-01 14:56:28
|
Revision: 662 http://mp-plugins.svn.sourceforge.net/mp-plugins/?rev=662&view=rev Author: and-81 Date: 2007-07-01 07:56:20 -0700 (Sun, 01 Jul 2007) Log Message: ----------- Added Paths: ----------- trunk/plugins/TVServerMonitor/ trunk/plugins/TVServerMonitor/FullStatus.Designer.cs trunk/plugins/TVServerMonitor/FullStatus.cs trunk/plugins/TVServerMonitor/FullStatus.resx trunk/plugins/TVServerMonitor/Graphics/ trunk/plugins/TVServerMonitor/Graphics/Blue.png trunk/plugins/TVServerMonitor/Graphics/Error.png trunk/plugins/TVServerMonitor/Graphics/Green.png trunk/plugins/TVServerMonitor/Graphics/Red.png trunk/plugins/TVServerMonitor/Graphics/Yellow.png trunk/plugins/TVServerMonitor/Icon.ico trunk/plugins/TVServerMonitor/Program.cs trunk/plugins/TVServerMonitor/Properties/ trunk/plugins/TVServerMonitor/Properties/AssemblyInfo.cs trunk/plugins/TVServerMonitor/Properties/Resources.Designer.cs trunk/plugins/TVServerMonitor/Properties/Resources.resx trunk/plugins/TVServerMonitor/SetupForm.Designer.cs trunk/plugins/TVServerMonitor/SetupForm.cs trunk/plugins/TVServerMonitor/SetupForm.resx trunk/plugins/TVServerMonitor/TVServerMonitor.cs trunk/plugins/TVServerMonitor/TVServerMonitor.csproj trunk/plugins/TVServerMonitor/TvServerConnection.cs Added: trunk/plugins/TVServerMonitor/FullStatus.Designer.cs =================================================================== --- trunk/plugins/TVServerMonitor/FullStatus.Designer.cs (rev 0) +++ trunk/plugins/TVServerMonitor/FullStatus.Designer.cs 2007-07-01 14:56:20 UTC (rev 662) @@ -0,0 +1,137 @@ +namespace TVServerMonitor +{ + partial class FullStatus + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FullStatus)); + this.gridCards = new SourceGrid.Grid(); + this.buttonUpdate = new System.Windows.Forms.Button(); + this.labelTVCards = new System.Windows.Forms.Label(); + this.labelStreams = new System.Windows.Forms.Label(); + this.gridStreams = new SourceGrid.Grid(); + this.SuspendLayout(); + // + // gridCards + // + this.gridCards.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.gridCards.AutoStretchColumnsToFitWidth = true; + this.gridCards.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.gridCards.ColumnsCount = 5; + this.gridCards.FixedRows = 1; + this.gridCards.Location = new System.Drawing.Point(0, 24); + this.gridCards.Name = "gridCards"; + this.gridCards.OptimizeMode = SourceGrid.CellOptimizeMode.ForRows; + this.gridCards.SelectionMode = SourceGrid.GridSelectionMode.Row; + this.gridCards.Size = new System.Drawing.Size(592, 112); + this.gridCards.TabIndex = 0; + this.gridCards.TabStop = true; + this.gridCards.ToolTipText = ""; + // + // buttonUpdate + // + this.buttonUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonUpdate.Location = new System.Drawing.Point(512, 280); + this.buttonUpdate.Name = "buttonUpdate"; + this.buttonUpdate.Size = new System.Drawing.Size(72, 24); + this.buttonUpdate.TabIndex = 4; + this.buttonUpdate.Text = "&Update"; + this.buttonUpdate.UseVisualStyleBackColor = true; + this.buttonUpdate.Click += new System.EventHandler(this.buttonUpdate_Click); + // + // labelTVCards + // + this.labelTVCards.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.labelTVCards.Location = new System.Drawing.Point(0, 0); + this.labelTVCards.Name = "labelTVCards"; + this.labelTVCards.Size = new System.Drawing.Size(592, 24); + this.labelTVCards.TabIndex = 5; + this.labelTVCards.Text = "TV cards:"; + this.labelTVCards.TextAlign = System.Drawing.ContentAlignment.BottomLeft; + // + // labelStreams + // + this.labelStreams.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.labelStreams.Location = new System.Drawing.Point(0, 136); + this.labelStreams.Name = "labelStreams"; + this.labelStreams.Size = new System.Drawing.Size(592, 24); + this.labelStreams.TabIndex = 7; + this.labelStreams.Text = "TV stream clients:"; + this.labelStreams.TextAlign = System.Drawing.ContentAlignment.BottomLeft; + // + // gridStreams + // + this.gridStreams.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.gridStreams.AutoStretchColumnsToFitWidth = true; + this.gridStreams.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.gridStreams.ColumnsCount = 5; + this.gridStreams.FixedRows = 1; + this.gridStreams.Location = new System.Drawing.Point(0, 160); + this.gridStreams.Name = "gridStreams"; + this.gridStreams.OptimizeMode = SourceGrid.CellOptimizeMode.ForRows; + this.gridStreams.SelectionMode = SourceGrid.GridSelectionMode.Row; + this.gridStreams.Size = new System.Drawing.Size(592, 112); + this.gridStreams.TabIndex = 6; + this.gridStreams.TabStop = true; + this.gridStreams.ToolTipText = ""; + // + // FullStatus + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(592, 314); + this.Controls.Add(this.labelStreams); + this.Controls.Add(this.gridStreams); + this.Controls.Add(this.labelTVCards); + this.Controls.Add(this.buttonUpdate); + this.Controls.Add(this.gridCards); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(444, 260); + this.Name = "FullStatus"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "TV Server Monitor"; + this.Load += new System.EventHandler(this.FullStatus_Load); + this.ResumeLayout(false); + + } + + #endregion + + private SourceGrid.Grid gridCards; + private System.Windows.Forms.Button buttonUpdate; + private System.Windows.Forms.Label labelTVCards; + private System.Windows.Forms.Label labelStreams; + private SourceGrid.Grid gridStreams; + } +} \ No newline at end of file Added: trunk/plugins/TVServerMonitor/FullStatus.cs =================================================================== --- trunk/plugins/TVServerMonitor/FullStatus.cs (rev 0) +++ trunk/plugins/TVServerMonitor/FullStatus.cs 2007-07-01 14:56:20 UTC (rev 662) @@ -0,0 +1,143 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Threading; +using System.Windows.Forms; + +namespace TVServerMonitor +{ + + public partial class FullStatus : Form + { + + public FullStatus() + { + InitializeComponent(); + } + + private void FullStatus_Load(object sender, EventArgs e) + { + CreateGrids(); + UpdateGrids(); + } + + void CreateGrids() + { + gridCards.Columns.SetCount(5); + + gridCards.Columns[0].AutoSizeMode = SourceGrid.AutoSizeMode.None; + gridCards.Columns[0].Width = 24; + gridCards.Columns[1].AutoSizeMode = SourceGrid.AutoSizeMode.None; + gridCards.Columns[1].Width = 24; + gridCards.Columns[2].AutoSizeMode = SourceGrid.AutoSizeMode.EnableAutoSize; + gridCards.Columns[3].AutoSizeMode = SourceGrid.AutoSizeMode.EnableAutoSize; + gridCards.Columns[4].AutoSizeMode = SourceGrid.AutoSizeMode.EnableAutoSize | SourceGrid.AutoSizeMode.EnableStretch; + gridCards.AutoStretchColumnsToFitWidth = true; + + gridCards.Rows.Insert(0); + + SourceGrid.Cells.ColumnHeader headerCell; + + headerCell = new SourceGrid.Cells.ColumnHeader(""); + headerCell.RemoveController(headerCell.FindController(typeof(SourceGrid.Cells.Controllers.SortableHeader))); + gridCards[0, 0] = headerCell; + + gridCards[0, 1] = new SourceGrid.Cells.ColumnHeader("ID"); + gridCards[0, 2] = new SourceGrid.Cells.ColumnHeader("Name"); + gridCards[0, 3] = new SourceGrid.Cells.ColumnHeader("Status"); + gridCards[0, 4] = new SourceGrid.Cells.ColumnHeader("Details"); + gridCards.FixedRows = 1; + + + gridStreams.Columns.SetCount(5); + + gridStreams.Columns[0].AutoSizeMode = SourceGrid.AutoSizeMode.EnableAutoSize; + gridStreams.Columns[1].AutoSizeMode = SourceGrid.AutoSizeMode.EnableAutoSize; + gridStreams.Columns[2].AutoSizeMode = SourceGrid.AutoSizeMode.EnableAutoSize; + gridStreams.Columns[3].AutoSizeMode = SourceGrid.AutoSizeMode.EnableAutoSize; + gridStreams.Columns[4].AutoSizeMode = SourceGrid.AutoSizeMode.EnableAutoSize | SourceGrid.AutoSizeMode.EnableStretch; + gridStreams.AutoStretchColumnsToFitWidth = true; + + gridStreams.Rows.Insert(0); + + gridStreams[0, 0] = new SourceGrid.Cells.ColumnHeader("Stream"); + gridStreams[0, 1] = new SourceGrid.Cells.ColumnHeader("IP Address"); + gridStreams[0, 2] = new SourceGrid.Cells.ColumnHeader("Active"); + gridStreams[0, 3] = new SourceGrid.Cells.ColumnHeader("Connected Since"); + gridStreams[0, 4] = new SourceGrid.Cells.ColumnHeader("Description"); + gridStreams.FixedRows = 1; + + } + void UpdateGrids() + { + if (Program.TvServer == null) + return; + + if (gridCards.RowsCount > 1) + gridCards.Rows.RemoveRange(1, gridCards.RowsCount - 1); + + int row = 1; + string cardStatus; + string cardDetails; + foreach (int cardID in Program.TvServer.CardIDs) + { + Program.TvServer.GetCardStatus(cardID, out cardStatus, out cardDetails); + + if (cardStatus == "Disabled" && Program.IgnoreDisabled) + continue; + + gridCards.Rows.Insert(row); + gridCards[row, 0] = new SourceGrid.Cells.Image(); + gridCards[row, 0].Editor.EnableEdit = false; + switch (cardStatus) + { + case "Scanning": gridCards[row, 0].Value = Properties.Resources.Yellow; break; + case "Grabbing EPG": gridCards[row, 0].Value = Properties.Resources.Yellow; break; + case "Recording": gridCards[row, 0].Value = Properties.Resources.Red; break; + case "Timeshifting": gridCards[row, 0].Value = Properties.Resources.Green; break; + case "Idle": gridCards[row, 0].Value = Properties.Resources.Blue; break; + + default: gridCards[row, 0].Value = Properties.Resources.Error; break; + } + gridCards[row, 1] = new SourceGrid.Cells.Cell(cardID); + gridCards[row, 2] = new SourceGrid.Cells.Cell(Program.TvServer.Instance.CardName(cardID)); + gridCards[row, 3] = new SourceGrid.Cells.Cell(cardStatus); + gridCards[row, 4] = new SourceGrid.Cells.Cell(cardDetails); + + row++; + } + gridCards.AutoSizeCells(); + + if (gridStreams.RowsCount > 1) + gridStreams.Rows.RemoveRange(1, gridStreams.RowsCount - 1); + + List<TvLibrary.Streaming.RtspClient> streamingClients = Program.TvServer.StreamingClients; + + if (streamingClients.Count > 0) + { + for (int index = 0; index < streamingClients.Count; index++) + { + gridStreams.Rows.Insert(index + 1); + + gridStreams[index + 1, 0] = new SourceGrid.Cells.Cell(streamingClients[index].StreamName); + gridStreams[index + 1, 1] = new SourceGrid.Cells.Cell(streamingClients[index].IpAdress); + gridStreams[index + 1, 2] = new SourceGrid.Cells.Cell(streamingClients[index].IsActive); + gridStreams[index + 1, 3] = new SourceGrid.Cells.Cell(streamingClients[index].DateTimeStarted); + gridStreams[index + 1, 4] = new SourceGrid.Cells.Cell(streamingClients[index].Description); + } + } + + gridStreams.AutoSizeCells(); + } + + private void buttonUpdate_Click(object sender, EventArgs e) + { + UpdateGrids(); + } + + } + +} Added: trunk/plugins/TVServerMonitor/FullStatus.resx =================================================================== --- trunk/plugins/TVServerMonitor/FullStatus.resx (rev 0) +++ trunk/plugins/TVServerMonitor/FullStatus.resx 2007-07-01 14:56:20 UTC (rev 662) @@ -0,0 +1,277 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> + <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value> + 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 + nEE= +</value> + </data> +</root> \ No newline at end of file Added: trunk/plugins/TVServerMonitor/Graphics/Blue.png =================================================================== (Binary files differ) Property changes on: trunk/plugins/TVServerMonitor/Graphics/Blue.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/plugins/TVServerMonitor/Graphics/Error.png =================================================================== (Binary files differ) Property changes on: trunk/plugins/TVServerMonitor/Graphics/Error.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/plugins/TVServerMonitor/Graphics/Green.png =================================================================== (Binary files differ) Property changes on: trunk/plugins/TVServerMonitor/Graphics/Green.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/plugins/TVServerMonitor/Graphics/Red.png =================================================================== (Binary files differ) Property changes on: trunk/plugins/TVServerMonitor/Graphics/Red.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/plugins/TVServerMonitor/Graphics/Yellow.png =================================================================== (Binary files differ) Property changes on: trunk/plugins/TVServerMonitor/Graphics/Yellow.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/plugins/TVServerMonitor/Icon.ico =================================================================== (Binary files differ) Property changes on: trunk/plugins/TVServerMonitor/Icon.ico ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/plugins/TVServerMonitor/Program.cs =================================================================== --- trunk/plugins/TVServerMonitor/Program.cs (rev 0) +++ trunk/plugins/TVServerMonitor/Program.cs 2007-07-01 14:56:20 UTC (rev 662) @@ -0,0 +1,285 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Drawing; +using System.Text; +using System.Threading; +using System.Windows.Forms; +using System.Xml; + +using TvControl; + +namespace TVServerMonitor +{ + + static class Program + { + + #region Constants + + public static readonly string ConfigurationFile = "TVServerMonitor.xml"; + + #endregion Constants + + #region Variables + + static NotifyIcon _notifyIcon; + + static TvServerConnection _tvServerConnection; + static string _serverHost; + static bool _ignoreDisabled; + + static Thread _updateThread; + + #endregion Variables + + #region Properties + + internal static TvServerConnection TvServer + { + get { return _tvServerConnection; } + set { _tvServerConnection = value; } + } + + internal static string ServerHost + { + get { return _serverHost; } + set { _serverHost = value; } + } + + internal static bool IgnoreDisabled + { + get { return _ignoreDisabled; } + set { _ignoreDisabled = value; } + } + + #endregion Properties + + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + + LoadSettings(); + + Connect(); + + ContextMenu context = new ContextMenu(); + context.MenuItems.Add("Status", new EventHandler(ShowStatus)); + context.MenuItems.Add("Setup", new EventHandler(ShowSetup)); + context.MenuItems.Add("Quit", new EventHandler(Quit)); + + _notifyIcon = new NotifyIcon(); + _notifyIcon.ContextMenu = context; + _notifyIcon.DoubleClick += new EventHandler(NotifyIcon_DoubleClick); + + StartUpdateThread(); + _notifyIcon.Visible = true; + + Application.Run(); + + StopUpdateThread(); + _notifyIcon.Visible = false; + + _notifyIcon.Dispose(); + } + + #region Event Handlers + + static void NotifyIcon_DoubleClick(object sender, EventArgs e) + { + ShowStatus(null, null); + } + + static void ShowStatus(object sender, EventArgs e) + { + _notifyIcon.Visible = false; + StopUpdateThread(); + + FullStatus statusWindow = new FullStatus(); + statusWindow.ShowDialog(); + + StartUpdateThread(); + _notifyIcon.Visible = true; + } + + static void ShowSetup(object sender, EventArgs e) + { + _notifyIcon.Visible = false; + StopUpdateThread(); + + SetupForm setupForm = new SetupForm(); + setupForm.ShowDialog(); + + Connect(); + + StartUpdateThread(); + _notifyIcon.Visible = true; + } + + static void Quit(object sender, EventArgs e) + { + Application.Exit(); + } + + #endregion Event Handlers + + static void StartUpdateThread() + { + _updateThread = new Thread(new ThreadStart(UpdateThread)); + _updateThread.Start(); + } + static void StopUpdateThread() + { + if (_updateThread != null) + _updateThread.Abort(); + } + static void UpdateThread() + { + while (true) + { + UpdateIcon(); + Thread.Sleep(5000); + } + } + + static void UpdateIcon() + { + if (_tvServerConnection == null) + { + _notifyIcon.Icon = Icon.FromHandle(Properties.Resources.Error.GetHicon()); + _notifyIcon.Text = "TV Server - No connection"; + return; + } + + int highestStatus = 0; // 0 Disabled, 1 Idle, 2 Scanning/Grabbing, 3 Timeshifting, 4 Recording + string cardStatus; + string cardDetails; + + StringBuilder status = new StringBuilder(); + status.Append("TV Server"); + + foreach (int cardID in _tvServerConnection.CardIDs) + { + _tvServerConnection.GetCardStatus(cardID, out cardStatus, out cardDetails); + + switch (cardStatus) + { + case "Disabled": + if (_ignoreDisabled) + continue; + break; + + case "Idle": + if (highestStatus < 1) + highestStatus = 1; + break; + + case "Scanning": + case "Grabbing EPG": + if (highestStatus < 2) + highestStatus = 2; + break; + + case "Timeshifting": + if (highestStatus < 3) + highestStatus = 3; + break; + + case "Recording": + if (highestStatus < 4) + highestStatus = 4; + break; + } + + status.AppendFormat("\r\n{0} {1}", cardID, cardStatus); + } + + string statusString = status.ToString(); + if (statusString.Length >= 64) + statusString = statusString.Substring(0, 60) + "..."; + + _notifyIcon.Text = statusString; + + switch (highestStatus) + { + case 0: + _notifyIcon.Icon = Icon.FromHandle(Properties.Resources.Error.GetHicon()); + break; + + case 1: + _notifyIcon.Icon = Icon.FromHandle(Properties.Resources.Blue.GetHicon()); + break; + + case 2: + _notifyIcon.Icon = Icon.FromHandle(Properties.Resources.Yellow.GetHicon()); + break; + + case 3: + _notifyIcon.Icon = Icon.FromHandle(Properties.Resources.Green.GetHicon()); + break; + + case 4: + _notifyIcon.Icon = Icon.FromHandle(Properties.Resources.Red.GetHicon()); + break; + } + + } + + internal static void LoadSettings() + { + try + { + XmlDocument doc = new XmlDocument(); + doc.Load(ConfigurationFile); + + _serverHost = doc.DocumentElement.Attributes["ServerHost"].Value; + _ignoreDisabled = bool.Parse(doc.DocumentElement.Attributes["IgnoreDisabled"].Value); + } + catch (Exception) + { + _serverHost = "127.0.0.1"; + _ignoreDisabled = true; + } + } + internal static void SaveSettings() + { + try + { + XmlTextWriter writer = new XmlTextWriter(ConfigurationFile, System.Text.Encoding.UTF8); + writer.Formatting = Formatting.Indented; + writer.Indentation = 1; + writer.IndentChar = (char)9; + writer.WriteStartDocument(true); + writer.WriteStartElement("settings"); // <settings> + + writer.WriteAttributeString("ServerHost", _serverHost); + writer.WriteAttributeString("IgnoreDisabled", _ignoreDisabled.ToString()); + + writer.WriteEndElement(); // </settings> + writer.WriteEndDocument(); + writer.Close(); + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + } + } + + internal static void Connect() + { + try + { + _tvServerConnection = new TvServerConnection(_serverHost); + } + catch (Exception ex) + { + _tvServerConnection = null; + MessageBox.Show(ex.Message, "TV Server Monitor Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + } + +} Added: trunk/plugins/TVServerMonitor/Properties/AssemblyInfo.cs =================================================================== --- trunk/plugins/TVServerMonitor/Properties/AssemblyInfo.cs (rev 0) +++ trunk/plugins/TVServerMonitor/Properties/AssemblyInfo.cs 2007-07-01 14:56:20 UTC (rev 662) @@ -0,0 +1,71 @@ +using System; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security.Permissions; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("TV Server Monitor")] +[assembly: AssemblyDescription("Application for monitoring MediaPortal TV Server")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("and-81")] +[assembly: AssemblyProduct("MediaPortal TV Server")] +[assembly: AssemblyCopyright("Aaron Dinnage")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.3.0")] +[assembly: AssemblyFileVersionAttribute("1.0.3.0")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\<configuration>. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] + +[assembly: CLSCompliant(false)] + +//[assembly: SecurityPermission(SecurityAction.RequestMinimum, UnmanagedCode = true)] Added: trunk/plugins/TVServerMonitor/Properties/Resources.Designer.cs =================================================================== --- trunk/plugins/TVServerMonitor/Properties/Resources.Designer.cs (rev 0) +++ trunk/plugins/TVServerMonitor/Properties/Resources.Designer.cs 2007-07-01 14:56:20 UTC (rev 662) @@ -0,0 +1,98 @@ +//------------------------------------------------------------------------------ +// <auto-generated> +// This code was generated by a tool. +// Runtime Version:2.0.50727.42 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace TVServerMonitor.Properties { + using System; + + + /// <summary> + /// A strongly-typed resource class, for looking up localized strings, etc. + /// </summary> + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// <summary> + /// Returns the cached ResourceManager instance used by this class. + /// </summary> + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TVServerMonitor.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// <summary> + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// </summary> + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + internal static System.Drawing.Bitmap Blue { + get { + object obj = ResourceManager.GetObject("Blue", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap Error { + get { + object obj = ResourceManager.GetObject("Error", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap Green { + get { + object obj = ResourceManager.GetObject("Green", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap Red { + get { + object obj = ResourceManager.GetObject("Red", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap Yellow { + get { + object obj = ResourceManager.GetObject("Yellow", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} Added: trunk/plugins/TVServerMonitor/Properties/Resources.resx =================================================================== --- trunk/plugins/TVServerMonitor/Properties/Resources.resx (rev 0) +++ trunk/plugins/TVServerMonitor/Properties/Resources.resx 2007-07-01 14:56:20 UTC (rev 662) @@ -0,0 +1,136 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> + <data name="Red" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Graphics\Red.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="Yellow" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Graphics\Yellow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="Blue" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Graphics\Blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="Green" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Graphics\Green.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="Error" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\graphics\error.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> +</root> \ No newline at end of file Added: trunk/plugins/TVServerMonitor/SetupForm.Designer.cs =================================================================== --- trunk/plugins/TVServerMonitor/SetupForm.Designer.cs (rev 0) +++ trunk/plugins/TVServerMonitor/SetupForm.Designer.cs 2007-07-01 14:56:20 UTC (rev 662) @@ -0,0 +1,117 @@ +namespace TVServerMonitor +{ + partial class SetupForm + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SetupForm)); + this.textBoxHost = new System.Windows.Forms.TextBox(); + this.labelServer = new System.Windows.Forms.Label(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.checkBoxIgnoreDisabled = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // textBoxHost + // + this.textBoxHost.Location = new System.Drawing.Point(112, 8); + this.textBoxHost.Name = "textBoxHost"; + this.textBoxHost.Size = new System.Drawing.Size(112, 20); + this.textBoxHost.TabIndex = 5; + this.textBoxHost.Text = "localhost"; + // + // labelServer + // + this.labelServer.Location = new System.Drawing.Point(8, 8); + this.labelServer.Name = "labelServer"; + this.labelServer.Size = new System.Drawing.Size(104, 20); + this.labelServer.TabIndex = 4; + th... [truncated message content] |