+ XNB Inspector shows now colored error hints

This commit is contained in:
SND\GinieDp_cp 2012-08-22 19:28:00 +00:00
parent e66216d524
commit b8290c61a4
4 changed files with 158 additions and 50 deletions

View File

@ -35,7 +35,7 @@
this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
this.textBox = new System.Windows.Forms.RichTextBox();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.menuStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
@ -88,25 +88,25 @@
this.openFileDialog.Filter = "XNB files |*.xnb";
this.openFileDialog.Title = "Choose XNB File";
//
// richTextBox1
// textBox
//
this.richTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.richTextBox1.Font = new System.Drawing.Font("Lucida Console", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.richTextBox1.Location = new System.Drawing.Point(0, 24);
this.richTextBox1.Name = "richTextBox1";
this.richTextBox1.ReadOnly = true;
this.richTextBox1.Size = new System.Drawing.Size(784, 316);
this.richTextBox1.TabIndex = 2;
this.richTextBox1.Text = "";
this.richTextBox1.WordWrap = false;
this.textBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.textBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.textBox.Font = new System.Drawing.Font("Lucida Console", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.textBox.Location = new System.Drawing.Point(0, 24);
this.textBox.Name = "textBox";
this.textBox.ReadOnly = true;
this.textBox.Size = new System.Drawing.Size(784, 316);
this.textBox.TabIndex = 2;
this.textBox.Text = "";
this.textBox.WordWrap = false;
//
// pictureBox1
//
this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.pictureBox1.BackColor = System.Drawing.Color.Transparent;
this.pictureBox1.Image = global::ANX.Tools.XNBInspector.Properties.Resources.ANX_Framework_Logo_220x58;
this.pictureBox1.Location = new System.Drawing.Point(552, 266);
this.pictureBox1.Location = new System.Drawing.Point(547, 265);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(220, 58);
this.pictureBox1.TabIndex = 3;
@ -120,7 +120,7 @@
this.AutoScroll = true;
this.ClientSize = new System.Drawing.Size(784, 362);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.richTextBox1);
this.Controls.Add(this.textBox);
this.Controls.Add(this.statusStrip1);
this.Controls.Add(this.menuStrip1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
@ -146,7 +146,7 @@
private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
private System.Windows.Forms.OpenFileDialog openFileDialog;
private System.Windows.Forms.RichTextBox richTextBox1;
private System.Windows.Forms.RichTextBox textBox;
private System.Windows.Forms.PictureBox pictureBox1;
}
}

View File

@ -10,7 +10,23 @@ using System.Windows.Forms;
namespace ANX.Tools.XNBInspector
{
public partial class InspectForm : Form
public enum Severity
{
None,
Success,
Warning,
Error
}
public interface IInspectLogger
{
void AppendFormat(Severity severity, string message, params object[] arg);
void Append(Severity severity, string message);
void AppendLine(Severity severity, string message);
void AppendLine();
}
public partial class InspectForm : Form, IInspectLogger
{
StringBuilder result = new StringBuilder();
@ -30,10 +46,11 @@ namespace ANX.Tools.XNBInspector
private void InspectFile(string filePath)
{
result.Clear();
textBox.Text = String.Empty;
using (Stream input = File.OpenRead(filePath))
{
richTextBox1.Text = InspectReader.TryInspectXNB(input);
InspectReader.TryInspectXNB(input, this);
}
}
@ -74,6 +91,65 @@ namespace ANX.Tools.XNBInspector
{
this.Text += " v" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
}
void AppendText(RichTextBox box, Color color, string text)
{
int start = box.TextLength;
box.AppendText(text);
int end = box.TextLength;
// Textbox may transform chars, so (end-start) != text.Length
box.Select(start, end - start);
{
box.SelectionColor = color;
// could set box.SelectionBackColor, box.SelectionFont too.
}
box.SelectionLength = 0; // clear
}
public void AppendFormat(Severity severity, string message, params object[] arg)
{
Append(severity, String.Format(message, arg));
}
public void Append(Severity severity, string message)
{
Color color = Color.Black;
switch (severity)
{
case Severity.Success:
color = Color.Green;
break;
case Severity.Warning:
color = Color.Orange;
break;
case Severity.Error:
color = Color.Red;
break;
case Severity.None:
default:
break;
}
int start = textBox.TextLength;
textBox.AppendText(message);
int end = textBox.TextLength;
textBox.Select(start, end - start);
{
textBox.SelectionColor = color;
}
textBox.SelectionLength = 0;
}
public void AppendLine(Severity severity, string message)
{
Append(severity, message + "\n");
}
public void AppendLine()
{
Append(Severity.None, "\n");
}
}
}

View File

@ -13,9 +13,8 @@ namespace ANX.Tools.XNBInspector
{
}
public static string TryInspectXNB(Stream input)
public static string TryInspectXNB(Stream input, IInspectLogger result)
{
StringBuilder result = new StringBuilder();
try
{
InspectXNB(input, result);
@ -23,13 +22,13 @@ namespace ANX.Tools.XNBInspector
catch (Exception e)
{
result.AppendLine();
result.AppendLine(e.Message);
result.AppendLine(e.StackTrace);
result.AppendLine(Severity.Error, e.Message);
result.AppendLine(Severity.Error, e.StackTrace);
}
return result.ToString();
}
public static void InspectXNB(Stream input, StringBuilder result)
public static void InspectXNB(Stream input, IInspectLogger result)
{
// read the XNB file information
//
@ -58,75 +57,108 @@ namespace ANX.Tools.XNBInspector
byte magicX = reader.ReadByte(); // X
byte magicN = reader.ReadByte(); // N
byte magicB = reader.ReadByte(); // B
byte[] magicBytes = new byte[] { magicX, magicN, magicB };
byte[] magicWants = new byte[] { 88, 78, 66 };
result.AppendFormat("Format identifier: {0}\n", (char)magicX);
result.AppendFormat("Format identifier: {0}\n", (char)magicN);
result.AppendFormat("Format identifier: {0}\n", (char)magicB);
for (int i = 0; i < magicBytes.Length; i++)
{
result.Append(Severity.None, "Format identifier: ");
if (magicBytes[i] != magicWants[i])
{
result.AppendFormat(Severity.Error, "{0} (should be {1}[{2}])", magicBytes[i], magicWants[i], (char)magicWants[i]);
}
else
{
result.AppendFormat(Severity.Success, "{0}[{1}]", magicWants[i], (char)magicWants[i]);
}
result.AppendLine();
}
byte targetPlattform = reader.ReadByte();
// w = Microsoft Windows
// m = Windows Phone 7
// x = Xbox 360
result.AppendFormat("Target platform : {0} ", (char)targetPlattform);
result.Append(Severity.None, "Target platform : ");
switch ((char)targetPlattform)
{
case 'w':
result.Append("(Microsoft Windows)");
result.AppendFormat(Severity.Success, "{0}[w] (Microsoft Windows)", targetPlattform);
break;
case 'm':
result.Append("(Windows Phone 7)");
result.AppendFormat(Severity.Success, "{0}[m] (Windows Phone 7)", targetPlattform);
break;
case 'x':
result.Append("(Xbox 360)");
result.AppendFormat(Severity.Success, "{0}[x] (Xbox 360)", targetPlattform);
break;
default:
result.Append("(Unknown)");
result.AppendFormat(Severity.Error, "{0} (Unknown or non XNA platform)", targetPlattform);
break;
}
result.AppendLine();
byte formatVersion = reader.ReadByte();
// 5 = XNA Game Studio 4.0
result.AppendFormat("Format version : {0} ", formatVersion);
result.Append(Severity.None, "Format version : ");
switch (formatVersion)
{
case 1:
result.Append(Severity.Success, "1 (XNA Game Studio 1.0)");
break;
case 2:
result.Append(Severity.Success, "2 (XNA Game Studio 2.0)");
break;
case 3:
result.Append(Severity.Success, "3 (XNA Game Studio 3.0)");
break;
case 4:
result.Append(Severity.Success, "4 (XNA Game Studio 3.1)");
break;
case 5:
result.Append("(XNA Game Studio 4.0)");
result.Append(Severity.Success, "5 (XNA Game Studio 4.0)");
break;
default:
result.Append("(Unknown)");
result.AppendFormat(Severity.Warning, "{0} (Unknown or non XNA content)", formatVersion);
break;
}
result.AppendLine();
byte flags = reader.ReadByte();
result.AppendFormat("Flags : 0x{0:X4}\n", flags);
result.AppendFormat(Severity.None, "Flags : 0x{0:X4}\n", flags);
if ((flags & 0x01) == 0x01)
{
// HiDef Profile
result.AppendLine(" - HiDef Profile");
result.AppendLine(Severity.None, " - HiDef Profile");
}
else
{
// Reach Profile
result.AppendLine(" - Reach Profile");
result.AppendLine(Severity.None, " - Reach Profile");
}
bool isCompressed = (flags & 0x80) != 0;
result.AppendFormat(" - Compressed {0}", isCompressed);
result.AppendFormat(Severity.None, " - Compressed {0}", isCompressed);
result.AppendLine();
int sizeOnDisk = reader.ReadInt32();
result.AppendFormat("Size on disk : {0,10} ({1,10} bytes)", ToHumanSize(sizeOnDisk), sizeOnDisk);
result.Append(Severity.None, "Size on disk : ");
if (sizeOnDisk != input.Length)
{
result.AppendFormat(Severity.Error, "{0} bytes [{1}]", sizeOnDisk, ToHumanSize(sizeOnDisk));
result.AppendFormat(Severity.Error, " (Should be {0} bytes [{1}])", input.Length, ToHumanSize(input.Length));
}
else
{
result.AppendFormat(Severity.Success, "{0} bytes [{1}]", sizeOnDisk, ToHumanSize(sizeOnDisk));
}
result.AppendLine();
long position = reader.BaseStream.Position;
int sizeOfdata = reader.ReadInt32();
reader.BaseStream.Seek(position, SeekOrigin.Begin);
if (isCompressed)
{
result.AppendFormat("Uncompressed : {0,10} ({1,10} bytes)", ToHumanSize(sizeOfdata), sizeOfdata);
long position = reader.BaseStream.Position;
int sizeOfdata = reader.ReadInt32();
reader.BaseStream.Seek(position, SeekOrigin.Begin);
result.AppendFormat(Severity.None, "Uncompressed : {0} bytes [{1}]", sizeOfdata, ToHumanSize(sizeOfdata));
result.AppendLine();
input = ANX.Framework.Content.Decompressor.DecompressStream(reader, input, sizeOnDisk);
@ -134,19 +166,19 @@ namespace ANX.Tools.XNBInspector
}
int numTypes = reader.Read7BitEncodedInt();
result.AppendFormat("Type readers : {0}", numTypes);
result.AppendFormat(Severity.None, "Type readers : {0}", numTypes);
result.AppendLine();
for (int i = 0; i < numTypes; i++)
{
string readerTypeName = reader.ReadString();
int readerVersionNumber = reader.ReadInt32();
result.AppendFormat(" - Version: {1} Type: {2}", i, readerVersionNumber, readerTypeName);
result.AppendFormat(Severity.None, " - Version: {1} Type: {2}", i, readerVersionNumber, readerTypeName);
result.AppendLine();
}
int numSharedResources = reader.Read7BitEncodedInt();
result.AppendFormat("Shared resources : {0}", numSharedResources);
result.AppendFormat(Severity.None, "Shared resources : {0}", numSharedResources);
result.AppendLine();
}

View File

@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.2.0.0")]
[assembly: AssemblyFileVersion("0.2.0.0")]
[assembly: AssemblyVersion("0.3.0.0")]
[assembly: AssemblyFileVersion("0.3.0.0")]