From a96043bcd8574ff7b5cd4d99ce41b5aed5e37d04 Mon Sep 17 00:00:00 2001 From: Jonathan Pobst Date: Tue, 21 Nov 2006 20:13:51 +0000 Subject: [PATCH] 11-21-2006 Jonathan Pobst MoMA Initial Import svn path=/trunk/moma/; revision=68284 --- MainForm.Designer.cs | 429 ++++++++++++++++++ MainForm.cs | 307 +++++++++++++ MainForm.resx | 364 +++++++++++++++ MoMA.Analyzer/Analysis/BaseChecker.cs | 47 ++ MoMA.Analyzer/Analysis/CheckMonoTodo.cs | 28 ++ MoMA.Analyzer/Analysis/CheckPInvokes.cs | 31 ++ MoMA.Analyzer/AssemblyAnalyzer.cs | 278 ++++++++++++ MoMA.Analyzer/Method.cs | 122 +++++ MoMA.Analyzer/MethodExtractor.cs | 56 +++ MoMA.Analyzer/MoMA.Analyzer.csproj | 61 +++ MoMA.Analyzer/Properties/AssemblyInfo.cs | 35 ++ MoMA.Analyzer/Results/BaseError.cs | 21 + MoMA.Analyzer/Results/MissingMethodError.cs | 41 ++ MoMA.Analyzer/Results/MonoTodoError.cs | 43 ++ .../Results/NotImplementedExceptionError.cs | 40 ++ MoMA.Analyzer/Results/PInvokeError.cs | 44 ++ MoMA.csproj | 127 ++++++ MoMA.csproj.user | 5 + MoMA.sln | 32 ++ MoMA.suo | Bin 0 -> 79360 bytes MoMAExtractor/MoMAExtractor.csproj | 54 +++ MoMAExtractor/Program.cs | 92 ++++ MoMAExtractor/Properties/AssemblyInfo.cs | 33 ++ Program.cs | 20 + Properties/AssemblyInfo.cs | 33 ++ Properties/Resources.Designer.cs | 105 +++++ Properties/Resources.resx | 139 ++++++ Properties/Settings.Designer.cs | 36 ++ Properties/Settings.settings | 9 + Resources/button_ok.png | Bin 0 -> 769 bytes Resources/dialog-warning.png | Bin 0 -> 954 bytes Resources/list-add.png | Bin 0 -> 405 bytes Resources/list-remove.png | Bin 0 -> 292 bytes Resources/monkey.png | Bin 0 -> 20335 bytes Resources/monoback.png | Bin 0 -> 15878 bytes .../MoMAWebServices/MoMASubmit.disco | 6 + .../MoMAWebServices/MoMASubmit.wsdl | 65 +++ Web References/MoMAWebServices/Reference.cs | 150 ++++++ Web References/MoMAWebServices/Reference.map | 7 + WizardStep.cs | 14 + app.config | 15 + 41 files changed, 2889 insertions(+) create mode 100644 MainForm.Designer.cs create mode 100644 MainForm.cs create mode 100644 MainForm.resx create mode 100644 MoMA.Analyzer/Analysis/BaseChecker.cs create mode 100644 MoMA.Analyzer/Analysis/CheckMonoTodo.cs create mode 100644 MoMA.Analyzer/Analysis/CheckPInvokes.cs create mode 100644 MoMA.Analyzer/AssemblyAnalyzer.cs create mode 100644 MoMA.Analyzer/Method.cs create mode 100644 MoMA.Analyzer/MethodExtractor.cs create mode 100644 MoMA.Analyzer/MoMA.Analyzer.csproj create mode 100644 MoMA.Analyzer/Properties/AssemblyInfo.cs create mode 100644 MoMA.Analyzer/Results/BaseError.cs create mode 100644 MoMA.Analyzer/Results/MissingMethodError.cs create mode 100644 MoMA.Analyzer/Results/MonoTodoError.cs create mode 100644 MoMA.Analyzer/Results/NotImplementedExceptionError.cs create mode 100644 MoMA.Analyzer/Results/PInvokeError.cs create mode 100644 MoMA.csproj create mode 100644 MoMA.csproj.user create mode 100644 MoMA.sln create mode 100644 MoMA.suo create mode 100644 MoMAExtractor/MoMAExtractor.csproj create mode 100644 MoMAExtractor/Program.cs create mode 100644 MoMAExtractor/Properties/AssemblyInfo.cs create mode 100644 Program.cs create mode 100644 Properties/AssemblyInfo.cs create mode 100644 Properties/Resources.Designer.cs create mode 100644 Properties/Resources.resx create mode 100644 Properties/Settings.Designer.cs create mode 100644 Properties/Settings.settings create mode 100644 Resources/button_ok.png create mode 100644 Resources/dialog-warning.png create mode 100644 Resources/list-add.png create mode 100644 Resources/list-remove.png create mode 100644 Resources/monkey.png create mode 100644 Resources/monoback.png create mode 100644 Web References/MoMAWebServices/MoMASubmit.disco create mode 100644 Web References/MoMAWebServices/MoMASubmit.wsdl create mode 100644 Web References/MoMAWebServices/Reference.cs create mode 100644 Web References/MoMAWebServices/Reference.map create mode 100644 WizardStep.cs create mode 100644 app.config diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs new file mode 100644 index 0000000..ee93ded --- /dev/null +++ b/MainForm.Designer.cs @@ -0,0 +1,429 @@ +namespace MoMA +{ + partial class MainForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose (bool disposing) + { + if (disposing && (components != null)) { + components.Dispose (); + } + base.Dispose (disposing); + } + + #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.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager (typeof (MainForm)); + this.pictureBox1 = new System.Windows.Forms.PictureBox (); + this.NextButton = new System.Windows.Forms.Button (); + this.BackButton = new System.Windows.Forms.Button (); + this.label1 = new System.Windows.Forms.Label (); + this.StepLabel = new System.Windows.Forms.Label (); + this.IntroductionLabel = new System.Windows.Forms.Label (); + this.AssemblyLabel = new System.Windows.Forms.Label (); + this.AssemblyAddButton = new System.Windows.Forms.Button (); + this.AssemblyRemoveButton = new System.Windows.Forms.Button (); + this.AssemblyListView = new System.Windows.Forms.ListView (); + this.columnHeader1 = new System.Windows.Forms.ColumnHeader (); + this.MonoTodoResultsImage = new System.Windows.Forms.PictureBox (); + this.MonoTodoResultsLabel = new System.Windows.Forms.Label (); + this.AnalysisResultsLabel = new System.Windows.Forms.Label (); + this.NotImplementedResultsLabel = new System.Windows.Forms.Label (); + this.NotImplementedResultsImage = new System.Windows.Forms.PictureBox (); + this.PInvokesResultsLabel = new System.Windows.Forms.Label (); + this.PInvokesResultsImage = new System.Windows.Forms.PictureBox (); + this.AssemblyInstructions = new System.Windows.Forms.Label (); + this.MissingResultsLabel = new System.Windows.Forms.Label (); + this.MissingResultsImage = new System.Windows.Forms.PictureBox (); + this.ResultsText = new System.Windows.Forms.Label (); + this.ResultsDetailLink = new System.Windows.Forms.LinkLabel (); + this.ProjectLink = new System.Windows.Forms.LinkLabel (); + this.SubmitLabel = new System.Windows.Forms.Label (); + this.SubmitInstructions = new System.Windows.Forms.Label (); + this.ViewReportButton = new System.Windows.Forms.Button (); + this.SubmitReportButton = new System.Windows.Forms.Button (); + this.label2 = new System.Windows.Forms.Label (); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit (); + ((System.ComponentModel.ISupportInitialize)(this.MonoTodoResultsImage)).BeginInit (); + ((System.ComponentModel.ISupportInitialize)(this.NotImplementedResultsImage)).BeginInit (); + ((System.ComponentModel.ISupportInitialize)(this.PInvokesResultsImage)).BeginInit (); + ((System.ComponentModel.ISupportInitialize)(this.MissingResultsImage)).BeginInit (); + this.SuspendLayout (); + // + // pictureBox1 + // + this.pictureBox1.BackColor = System.Drawing.Color.Transparent; + this.pictureBox1.Image = global::MoMA.Properties.Resources.monkey; + this.pictureBox1.Location = new System.Drawing.Point (12, 12); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size (100, 119); + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // NextButton + // + this.NextButton.Location = new System.Drawing.Point (621, 429); + this.NextButton.Name = "NextButton"; + this.NextButton.Size = new System.Drawing.Size (86, 30); + this.NextButton.TabIndex = 1; + this.NextButton.Text = "Next"; + this.NextButton.UseVisualStyleBackColor = true; + this.NextButton.Click += new System.EventHandler (this.NextButton_Click); + // + // BackButton + // + this.BackButton.Enabled = false; + this.BackButton.Location = new System.Drawing.Point (529, 429); + this.BackButton.Name = "BackButton"; + this.BackButton.Size = new System.Drawing.Size (86, 30); + this.BackButton.TabIndex = 2; + this.BackButton.Text = "Back"; + this.BackButton.UseVisualStyleBackColor = true; + this.BackButton.Click += new System.EventHandler (this.BackButton_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.BackColor = System.Drawing.Color.Transparent; + this.label1.Font = new System.Drawing.Font ("Arial", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.Location = new System.Drawing.Point (135, 12); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size (340, 32); + this.label1.TabIndex = 3; + this.label1.Text = "Mono Migration Analyzer"; + // + // StepLabel + // + this.StepLabel.AutoSize = true; + this.StepLabel.Font = new System.Drawing.Font ("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.StepLabel.Location = new System.Drawing.Point (12, 414); + this.StepLabel.Name = "StepLabel"; + this.StepLabel.Size = new System.Drawing.Size (60, 14); + this.StepLabel.TabIndex = 4; + this.StepLabel.Text = "Step 1 of 4"; + // + // IntroductionLabel + // + this.IntroductionLabel.Font = new System.Drawing.Font ("Arial", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.IntroductionLabel.Location = new System.Drawing.Point (138, 130); + this.IntroductionLabel.Name = "IntroductionLabel"; + this.IntroductionLabel.Size = new System.Drawing.Size (530, 202); + this.IntroductionLabel.TabIndex = 5; + this.IntroductionLabel.Text = resources.GetString ("IntroductionLabel.Text"); + // + // AssemblyLabel + // + this.AssemblyLabel.Font = new System.Drawing.Font ("Arial", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.AssemblyLabel.Location = new System.Drawing.Point (170, 100); + this.AssemblyLabel.Name = "AssemblyLabel"; + this.AssemblyLabel.Size = new System.Drawing.Size (416, 20); + this.AssemblyLabel.TabIndex = 6; + this.AssemblyLabel.Text = "Choose the assemblies to analyze:"; + // + // AssemblyAddButton + // + this.AssemblyAddButton.Image = global::MoMA.Properties.Resources.list_add; + this.AssemblyAddButton.Location = new System.Drawing.Point (592, 123); + this.AssemblyAddButton.Name = "AssemblyAddButton"; + this.AssemblyAddButton.Size = new System.Drawing.Size (30, 30); + this.AssemblyAddButton.TabIndex = 8; + this.AssemblyAddButton.UseVisualStyleBackColor = true; + this.AssemblyAddButton.Click += new System.EventHandler (this.AssemblyAddButton_Click); + // + // AssemblyRemoveButton + // + this.AssemblyRemoveButton.Image = global::MoMA.Properties.Resources.list_remove; + this.AssemblyRemoveButton.Location = new System.Drawing.Point (592, 159); + this.AssemblyRemoveButton.Name = "AssemblyRemoveButton"; + this.AssemblyRemoveButton.Size = new System.Drawing.Size (30, 30); + this.AssemblyRemoveButton.TabIndex = 9; + this.AssemblyRemoveButton.UseVisualStyleBackColor = true; + this.AssemblyRemoveButton.Click += new System.EventHandler (this.AssemblyRemoveButton_Click); + // + // AssemblyListView + // + this.AssemblyListView.Columns.AddRange (new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1}); + this.AssemblyListView.FullRowSelect = true; + this.AssemblyListView.Location = new System.Drawing.Point (173, 123); + this.AssemblyListView.MultiSelect = false; + this.AssemblyListView.Name = "AssemblyListView"; + this.AssemblyListView.Size = new System.Drawing.Size (413, 145); + this.AssemblyListView.TabIndex = 10; + this.AssemblyListView.UseCompatibleStateImageBehavior = false; + this.AssemblyListView.View = System.Windows.Forms.View.Details; + // + // columnHeader1 + // + this.columnHeader1.Text = "Assembly"; + this.columnHeader1.Width = 409; + // + // MonoTodoResultsImage + // + this.MonoTodoResultsImage.Image = global::MoMA.Properties.Resources.button_ok; + this.MonoTodoResultsImage.Location = new System.Drawing.Point (193, 214); + this.MonoTodoResultsImage.Name = "MonoTodoResultsImage"; + this.MonoTodoResultsImage.Size = new System.Drawing.Size (22, 22); + this.MonoTodoResultsImage.TabIndex = 11; + this.MonoTodoResultsImage.TabStop = false; + // + // MonoTodoResultsLabel + // + this.MonoTodoResultsLabel.Font = new System.Drawing.Font ("Arial", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.MonoTodoResultsLabel.Location = new System.Drawing.Point (220, 216); + this.MonoTodoResultsLabel.Name = "MonoTodoResultsLabel"; + this.MonoTodoResultsLabel.Size = new System.Drawing.Size (310, 20); + this.MonoTodoResultsLabel.TabIndex = 12; + this.MonoTodoResultsLabel.Text = "Methods marked with [MonoTodo] called: 0"; + // + // AnalysisResultsLabel + // + this.AnalysisResultsLabel.Font = new System.Drawing.Font ("Arial", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.AnalysisResultsLabel.Location = new System.Drawing.Point (169, 100); + this.AnalysisResultsLabel.Name = "AnalysisResultsLabel"; + this.AnalysisResultsLabel.Size = new System.Drawing.Size (416, 20); + this.AnalysisResultsLabel.TabIndex = 14; + this.AnalysisResultsLabel.Text = "Analysis Summary:"; + // + // NotImplementedResultsLabel + // + this.NotImplementedResultsLabel.Font = new System.Drawing.Font ("Arial", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.NotImplementedResultsLabel.Location = new System.Drawing.Point (220, 188); + this.NotImplementedResultsLabel.Name = "NotImplementedResultsLabel"; + this.NotImplementedResultsLabel.Size = new System.Drawing.Size (395, 20); + this.NotImplementedResultsLabel.TabIndex = 16; + this.NotImplementedResultsLabel.Text = "Methods called that throw NotImplementedException: 0"; + // + // NotImplementedResultsImage + // + this.NotImplementedResultsImage.Image = global::MoMA.Properties.Resources.button_ok; + this.NotImplementedResultsImage.Location = new System.Drawing.Point (193, 186); + this.NotImplementedResultsImage.Name = "NotImplementedResultsImage"; + this.NotImplementedResultsImage.Size = new System.Drawing.Size (22, 22); + this.NotImplementedResultsImage.TabIndex = 15; + this.NotImplementedResultsImage.TabStop = false; + // + // PInvokesResultsLabel + // + this.PInvokesResultsLabel.Font = new System.Drawing.Font ("Arial", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.PInvokesResultsLabel.Location = new System.Drawing.Point (220, 160); + this.PInvokesResultsLabel.Name = "PInvokesResultsLabel"; + this.PInvokesResultsLabel.Size = new System.Drawing.Size (310, 20); + this.PInvokesResultsLabel.TabIndex = 19; + this.PInvokesResultsLabel.Text = "P/Invokes called: 0"; + // + // PInvokesResultsImage + // + this.PInvokesResultsImage.Image = global::MoMA.Properties.Resources.button_ok; + this.PInvokesResultsImage.Location = new System.Drawing.Point (193, 158); + this.PInvokesResultsImage.Name = "PInvokesResultsImage"; + this.PInvokesResultsImage.Size = new System.Drawing.Size (22, 22); + this.PInvokesResultsImage.TabIndex = 18; + this.PInvokesResultsImage.TabStop = false; + // + // AssemblyInstructions + // + this.AssemblyInstructions.Font = new System.Drawing.Font ("Arial", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.AssemblyInstructions.Location = new System.Drawing.Point (173, 278); + this.AssemblyInstructions.Name = "AssemblyInstructions"; + this.AssemblyInstructions.Size = new System.Drawing.Size (413, 54); + this.AssemblyInstructions.TabIndex = 21; + this.AssemblyInstructions.Text = "Select the main assembly (.exe or .dll) as well as any referenced user libraries " + + "(.dll). (Do not select assemblies that ship with .Net, like System.Xml or Syste" + + "m.Windows.Forms.)"; + // + // MissingResultsLabel + // + this.MissingResultsLabel.Font = new System.Drawing.Font ("Arial", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.MissingResultsLabel.Location = new System.Drawing.Point (220, 132); + this.MissingResultsLabel.Name = "MissingResultsLabel"; + this.MissingResultsLabel.Size = new System.Drawing.Size (310, 20); + this.MissingResultsLabel.TabIndex = 23; + this.MissingResultsLabel.Text = "Methods that still missing in Mono: 0"; + // + // MissingResultsImage + // + this.MissingResultsImage.Image = global::MoMA.Properties.Resources.button_ok; + this.MissingResultsImage.Location = new System.Drawing.Point (193, 130); + this.MissingResultsImage.Name = "MissingResultsImage"; + this.MissingResultsImage.Size = new System.Drawing.Size (22, 22); + this.MissingResultsImage.TabIndex = 22; + this.MissingResultsImage.TabStop = false; + // + // ResultsText + // + this.ResultsText.Font = new System.Drawing.Font ("Arial", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ResultsText.Location = new System.Drawing.Point (170, 278); + this.ResultsText.Name = "ResultsText"; + this.ResultsText.Size = new System.Drawing.Size (416, 54); + this.ResultsText.TabIndex = 24; + this.ResultsText.Text = "Congratulations! No potential issues were detected in your assemblies. The only" + + " thing left to do is to try running them on Mono and see what happens."; + // + // ResultsDetailLink + // + this.ResultsDetailLink.AutoSize = true; + this.ResultsDetailLink.Font = new System.Drawing.Font ("Arial", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ResultsDetailLink.Location = new System.Drawing.Point (471, 332); + this.ResultsDetailLink.Name = "ResultsDetailLink"; + this.ResultsDetailLink.Size = new System.Drawing.Size (115, 16); + this.ResultsDetailLink.TabIndex = 25; + this.ResultsDetailLink.TabStop = true; + this.ResultsDetailLink.Text = "View Detail Report"; + this.ResultsDetailLink.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler (this.ResultsDetailLink_LinkClicked); + // + // ProjectLink + // + this.ProjectLink.Font = new System.Drawing.Font ("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ProjectLink.Location = new System.Drawing.Point (210, 438); + this.ProjectLink.Name = "ProjectLink"; + this.ProjectLink.Size = new System.Drawing.Size (172, 14); + this.ProjectLink.TabIndex = 26; + this.ProjectLink.TabStop = true; + this.ProjectLink.Text = "http://www.mono-project.com"; + this.ProjectLink.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler (this.ProjectLink_LinkClicked); + // + // SubmitLabel + // + this.SubmitLabel.Font = new System.Drawing.Font ("Arial", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.SubmitLabel.Location = new System.Drawing.Point (173, 98); + this.SubmitLabel.Name = "SubmitLabel"; + this.SubmitLabel.Size = new System.Drawing.Size (416, 20); + this.SubmitLabel.TabIndex = 27; + this.SubmitLabel.Text = "Submit Results:"; + // + // SubmitInstructions + // + this.SubmitInstructions.Font = new System.Drawing.Font ("Arial", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.SubmitInstructions.Location = new System.Drawing.Point (173, 123); + this.SubmitInstructions.Name = "SubmitInstructions"; + this.SubmitInstructions.Size = new System.Drawing.Size (416, 183); + this.SubmitInstructions.TabIndex = 28; + this.SubmitInstructions.Text = resources.GetString ("SubmitInstructions.Text"); + // + // ViewReportButton + // + this.ViewReportButton.Location = new System.Drawing.Point (411, 325); + this.ViewReportButton.Name = "ViewReportButton"; + this.ViewReportButton.Size = new System.Drawing.Size (86, 30); + this.ViewReportButton.TabIndex = 29; + this.ViewReportButton.Text = "View Report"; + this.ViewReportButton.UseVisualStyleBackColor = true; + this.ViewReportButton.Click += new System.EventHandler (this.ViewReportButton_Click); + // + // SubmitReportButton + // + this.SubmitReportButton.Enabled = false; + this.SubmitReportButton.Location = new System.Drawing.Point (503, 325); + this.SubmitReportButton.Name = "SubmitReportButton"; + this.SubmitReportButton.Size = new System.Drawing.Size (86, 30); + this.SubmitReportButton.TabIndex = 30; + this.SubmitReportButton.Text = "Submit Report"; + this.SubmitReportButton.UseVisualStyleBackColor = true; + this.SubmitReportButton.Click += new System.EventHandler (this.SubmitReportButton_Click); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font ("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label2.Location = new System.Drawing.Point (12, 438); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size (63, 14); + this.label2.TabIndex = 32; + this.label2.Text = "Version 1.0"; + // + // MainForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF (6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.White; + this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject ("$this.BackgroundImage"))); + this.ClientSize = new System.Drawing.Size (719, 471); + this.Controls.Add (this.label2); + this.Controls.Add (this.SubmitReportButton); + this.Controls.Add (this.ViewReportButton); + this.Controls.Add (this.SubmitInstructions); + this.Controls.Add (this.SubmitLabel); + this.Controls.Add (this.ProjectLink); + this.Controls.Add (this.ResultsDetailLink); + this.Controls.Add (this.ResultsText); + this.Controls.Add (this.MissingResultsLabel); + this.Controls.Add (this.MissingResultsImage); + this.Controls.Add (this.label1); + this.Controls.Add (this.PInvokesResultsLabel); + this.Controls.Add (this.PInvokesResultsImage); + this.Controls.Add (this.NotImplementedResultsLabel); + this.Controls.Add (this.NotImplementedResultsImage); + this.Controls.Add (this.AnalysisResultsLabel); + this.Controls.Add (this.MonoTodoResultsLabel); + this.Controls.Add (this.MonoTodoResultsImage); + this.Controls.Add (this.AssemblyListView); + this.Controls.Add (this.AssemblyRemoveButton); + this.Controls.Add (this.AssemblyAddButton); + this.Controls.Add (this.AssemblyLabel); + this.Controls.Add (this.IntroductionLabel); + this.Controls.Add (this.StepLabel); + this.Controls.Add (this.BackButton); + this.Controls.Add (this.NextButton); + this.Controls.Add (this.pictureBox1); + this.Controls.Add (this.AssemblyInstructions); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "MainForm"; + this.Text = "MoMA: Mono Migration Analyzer"; + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit (); + ((System.ComponentModel.ISupportInitialize)(this.MonoTodoResultsImage)).EndInit (); + ((System.ComponentModel.ISupportInitialize)(this.NotImplementedResultsImage)).EndInit (); + ((System.ComponentModel.ISupportInitialize)(this.PInvokesResultsImage)).EndInit (); + ((System.ComponentModel.ISupportInitialize)(this.MissingResultsImage)).EndInit (); + this.ResumeLayout (false); + this.PerformLayout (); + + } + + #endregion + + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Button NextButton; + private System.Windows.Forms.Button BackButton; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label StepLabel; + private System.Windows.Forms.Label IntroductionLabel; + private System.Windows.Forms.Label AssemblyLabel; + private System.Windows.Forms.Button AssemblyAddButton; + private System.Windows.Forms.Button AssemblyRemoveButton; + private System.Windows.Forms.ListView AssemblyListView; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.PictureBox MonoTodoResultsImage; + private System.Windows.Forms.Label MonoTodoResultsLabel; + private System.Windows.Forms.Label AnalysisResultsLabel; + private System.Windows.Forms.Label NotImplementedResultsLabel; + private System.Windows.Forms.PictureBox NotImplementedResultsImage; + private System.Windows.Forms.Label PInvokesResultsLabel; + private System.Windows.Forms.PictureBox PInvokesResultsImage; + private System.Windows.Forms.Label AssemblyInstructions; + private System.Windows.Forms.Label MissingResultsLabel; + private System.Windows.Forms.PictureBox MissingResultsImage; + private System.Windows.Forms.Label ResultsText; + private System.Windows.Forms.LinkLabel ResultsDetailLink; + private System.Windows.Forms.LinkLabel ProjectLink; + private System.Windows.Forms.Label SubmitLabel; + private System.Windows.Forms.Label SubmitInstructions; + private System.Windows.Forms.Button ViewReportButton; + private System.Windows.Forms.Button SubmitReportButton; + private System.Windows.Forms.Label label2; + } +} \ No newline at end of file diff --git a/MainForm.cs b/MainForm.cs new file mode 100644 index 0000000..154ab93 --- /dev/null +++ b/MainForm.cs @@ -0,0 +1,307 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Collections; +using System.Web.UI; +using System.IO; +using MoMA.Analyzer; + +namespace MoMA +{ + public partial class MainForm : Form + { + private WizardStep current_step; + + public MainForm () + { + InitializeComponent (); + + ResetForm (); + SetupForm (WizardStep.Introduction); + } + + private void ResetForm () + { + IntroductionLabel.Visible = false; + + AssemblyAddButton.Visible = false; + AssemblyListView.Visible = false; + AssemblyRemoveButton.Visible = false; + AssemblyLabel.Visible = false; + AssemblyInstructions.Visible = false; + + AnalysisResultsLabel.Visible = false; + MonoTodoResultsImage.Visible = false; + MonoTodoResultsLabel.Visible = false; + NotImplementedResultsImage.Visible = false; + NotImplementedResultsLabel.Visible = false; + PInvokesResultsImage.Visible = false; + PInvokesResultsLabel.Visible = false; + MissingResultsImage.Visible = false; + MissingResultsLabel.Visible = false; + ResultsDetailLink.Visible = false; + ResultsText.Visible = false; + + SubmitInstructions.Visible = false; + SubmitLabel.Visible = false; + SubmitReportButton.Visible = false; + ViewReportButton.Visible = false; + } + + private void SetupForm (WizardStep step) + { + switch (step) { + case WizardStep.Introduction: + IntroductionLabel.Visible = true; + break; + case WizardStep.ChooseAssemblies: + AssemblyAddButton.Visible = true; + AssemblyListView.Visible = true; + AssemblyRemoveButton.Visible = true; + AssemblyLabel.Visible = true; + AssemblyInstructions.Visible = true; + break; + case WizardStep.ViewResults: + AnalysisResultsLabel.Visible = true; + MonoTodoResultsImage.Visible = true; + MonoTodoResultsLabel.Visible = true; + NotImplementedResultsImage.Visible = true; + NotImplementedResultsLabel.Visible = true; + PInvokesResultsImage.Visible = true; + PInvokesResultsLabel.Visible = true; + MissingResultsImage.Visible = true; + MissingResultsLabel.Visible = true; + ResultsText.Visible = true; + NextButton.Text = "Next"; + if (ResultsText.Text.StartsWith ("There")) + ResultsDetailLink.Visible = true; + break; + case WizardStep.SubmitResults: + SubmitInstructions.Visible = true; + SubmitLabel.Visible = true; + SubmitReportButton.Visible = true; + ViewReportButton.Visible = true; + NextButton.Text = "Close"; + break; + } + + StepLabel.Text = String.Format ("Step {0} of 4", (int)step); + current_step = step; + } + + private void NextButton_Click (object sender, EventArgs e) + { + switch (current_step) { + case WizardStep.Introduction: + ResetForm (); + SetupForm (WizardStep.ChooseAssemblies); + break; + case WizardStep.ChooseAssemblies: + if (AssemblyListView.Items.Count == 0) + { + MessageBox.Show ("Please choose at least one assembly to analyze."); + return; + } + AnalyzeAssemblies (); + ResetForm (); + SetupForm (WizardStep.ViewResults); + break; + case WizardStep.ViewResults: + ResetForm (); + SetupForm (WizardStep.SubmitResults); + break; + case WizardStep.SubmitResults: + Application.Exit (); + break; + } + + BackButton.Enabled = true; + } + + private void BackButton_Click (object sender, EventArgs e) + { + switch (current_step) { + case WizardStep.Introduction: + ResetForm (); + SetupForm (WizardStep.ChooseAssemblies); + break; + case WizardStep.ChooseAssemblies: + BackButton.Enabled = false; + ResetForm (); + SetupForm (WizardStep.Introduction); + break; + case WizardStep.ViewResults: + ResetForm (); + SetupForm (WizardStep.ChooseAssemblies); + break; + case WizardStep.SubmitResults: + ResetForm (); + SetupForm (WizardStep.ViewResults); + break; + } + } + + private void AssemblyAddButton_Click (object sender, EventArgs e) + { + OpenFileDialog ofd = new OpenFileDialog (); + ofd.Multiselect = true; + ofd.Filter = "Assemblies (*.exe, *.dll)|*.exe; *.dll|All Files (*.*)|*.*"; + + if (ofd.ShowDialog () == DialogResult.OK) { + foreach (string s in ofd.FileNames) { + ListViewItem lvi = new ListViewItem (System.IO.Path.GetFileName (s)); + lvi.Tag = s; + + AssemblyListView.Items.Add (lvi); + } + } + } + + private void AssemblyRemoveButton_Click (object sender, EventArgs e) + { + if (AssemblyListView.SelectedItems.Count > 0) + AssemblyListView.Items.Remove (AssemblyListView.SelectedItems[0]); + } + + private void AnalyzeAssemblies () + { + AssemblyAnalyzer aa = new AssemblyAnalyzer (); + + // Keep total counts for all assemblies for summary screen + int monotodocount = 0; + int notimplementedcount = 0; + int pinvokecount = 0; + int missingcount = 0; + + string todo_defs = Path.Combine (Path.GetDirectoryName (Application.ExecutablePath), "monotodo.txt"); + string nie_defs = Path.Combine (Path.GetDirectoryName (Application.ExecutablePath), "exception.txt"); + string missing_defs = Path.Combine (Path.GetDirectoryName (Application.ExecutablePath), "missing.txt"); + + // Load the definition files + aa.LoadDefinitions (todo_defs, nie_defs, missing_defs); + + // Scan user's assemblies for P/Invokes + foreach (ListViewItem lvi in AssemblyListView.Items) + aa.ScanAssemblyForPInvokes ((string)lvi.Tag); + + // Start the results reports + string output_path = Path.Combine (Path.GetDirectoryName (Application.ExecutablePath), "Reports"); + XhtmlTextWriter report = aa.BeginHtmlReport (new FileStream (Path.Combine (output_path, "output.html"), FileMode.Create)); + StreamWriter submit_report = aa.BeginTextReport (new FileStream (Path.Combine (output_path, "submit.txt"), FileMode.Create)); + + // Scan user's assemblies for issues + foreach (ListViewItem lvi in AssemblyListView.Items) + { + aa.AnalyzeAssembly ((string)lvi.Tag); + + report.WriteFullBeginTag ("h2"); + report.WriteEncodedText (Path.GetFileName ((string)lvi.Tag)); + report.WriteEndTag ("h2"); + + aa.AddResultsToHtmlReport (report); + aa.AddResultsToTextReport (submit_report); + + monotodocount += aa.MonoTodoResults.Count; + notimplementedcount += aa.NotImplementedExceptionResults.Count; + pinvokecount += aa.PInvokeResults.Count; + missingcount += aa.MissingMethodResults.Count; + + aa.MissingMethodResults.Clear (); + aa.MonoTodoResults.Clear (); + aa.NotImplementedExceptionResults.Clear (); + aa.PInvokeResults.Clear (); + } + + // Finish up the reports + aa.FinishHtmlReport (report); + aa.FinishTextReport (submit_report); + + // Update the summary screen + UpdateResultsSummary (monotodocount, notimplementedcount, pinvokecount, missingcount); + + // Enable the report submission button + SubmitReportButton.Enabled = true; + } + + private void UpdateResultsSummary (int monotodocount, int notimplementedcount, int pinvokecount, int missingcount) + { + if (monotodocount == 0) { + MonoTodoResultsImage.Image = MoMA.Properties.Resources.button_ok; + MonoTodoResultsLabel.Text = "No methods marked with [MonoTodo] are called."; + } + else { + MonoTodoResultsImage.Image = MoMA.Properties.Resources.dialog_warning; + MonoTodoResultsLabel.Text = String.Format ("Methods called marked with [MonoTodo]: {0}", monotodocount); + } + + if (notimplementedcount == 0) { + NotImplementedResultsImage.Image = MoMA.Properties.Resources.button_ok; + NotImplementedResultsLabel.Text = "No methods that throw NotImplementedException are called."; + } + else { + NotImplementedResultsImage.Image = MoMA.Properties.Resources.dialog_warning; + NotImplementedResultsLabel.Text = String.Format ("Methods called that throw NotImplementedException: {0}", notimplementedcount); + } + + if (pinvokecount == 0) { + PInvokesResultsImage.Image = MoMA.Properties.Resources.button_ok; + PInvokesResultsLabel.Text = "No P/Invokes are called."; + } + else { + PInvokesResultsImage.Image = MoMA.Properties.Resources.dialog_warning; + PInvokesResultsLabel.Text = String.Format ("P/Invokes called: {0}", pinvokecount); + } + + if (missingcount == 0) { + MissingResultsImage.Image = MoMA.Properties.Resources.button_ok; + MissingResultsLabel.Text = "All methods called exist in Mono."; + } + else { + MissingResultsImage.Image = MoMA.Properties.Resources.dialog_warning; + MissingResultsLabel.Text = String.Format ("Methods that are still missing in Mono: {0}", missingcount); + } + + if (monotodocount + notimplementedcount + pinvokecount + missingcount == 0) + ResultsText.Text = "Congratulations! No potential issues were detected in the selected assemblies. The only thing left to do is to try running them on Mono and see what happens."; + else { + ResultsText.Text = "There were potential issues detected in the selected assemblies. A report detailing each issue has been created."; + ResultsDetailLink.Visible = true; + } + } + + private void ResultsDetailLink_LinkClicked (object sender, LinkLabelLinkClickedEventArgs e) + { + System.Diagnostics.Process.Start (Path.Combine (Path.Combine (Path.GetDirectoryName (Application.ExecutablePath), "Reports"), "output.html")); + } + + private void ProjectLink_LinkClicked (object sender, LinkLabelLinkClickedEventArgs e) + { + System.Diagnostics.Process.Start ("http://www.mono-project.com/"); + } + + private void ViewReportButton_Click (object sender, EventArgs e) + { + System.Diagnostics.Process.Start (Path.Combine (Path.Combine (Path.GetDirectoryName (Application.ExecutablePath), "Reports"), "submit.txt")); + } + + private void SubmitReportButton_Click (object sender, EventArgs e) + { + SubmitReportButton.Enabled = false; + + string output_path = Path.Combine (Path.GetDirectoryName (Application.ExecutablePath), "Reports"); + StreamReader sr = new StreamReader (new FileStream (Path.Combine (output_path, "submit.txt"), FileMode.Open)); + + string results = sr.ReadToEnd (); + + MoMAWebServices.MoMASubmit ws = new MoMA.MoMAWebServices.MoMASubmit (); + + if (ws.SubmitResults (results)) + MessageBox.Show ("Results successfully submitted. Thanks!"); + else + MessageBox.Show ("Result submission failed. Please try again later."); + } + } +} \ No newline at end of file diff --git a/MainForm.resx b/MainForm.resx new file mode 100644 index 0000000..9bdca11 --- /dev/null +++ b/MainForm.resx @@ -0,0 +1,364 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + The Mono Migration Analyzer (MoMA) tool helps you identify issues you may have when porting your .Net application to Mono. It helps pinpoint platform specific calls (P/Invoke) and areas that are not yet supported by the Mono project. + +While MoMA can help show potential issues, there are many complex factors that cannot be covered by a simple tool. MoMA may fail to point out areas that will cause problems, and may point out areas which will not actually be an issue. + +Use the results provided as a guide to get you started on porting your application, but remember the true test is actually running your application on Mono. + +Good luck! + + + Want to help out the Mono project? Please submit your results to the Mono team so they can prioritize their efforts based on what functionality people need most. + +The following report has been prepared. It doesn't contain any information about your assemblies, just which incomplete methods it calls in Mono and which P/Invokes it uses. (You can view the report before sending as well.) + +This information is invaluable to the Mono team to find which areas are missing that are needed by real-world applications. + + + + + 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 + HgAAAABJRU5ErkJggg== + + + \ No newline at end of file diff --git a/MoMA.Analyzer/Analysis/BaseChecker.cs b/MoMA.Analyzer/Analysis/BaseChecker.cs new file mode 100644 index 0000000..043266a --- /dev/null +++ b/MoMA.Analyzer/Analysis/BaseChecker.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +namespace MoMA.Analyzer +{ + public class BaseChecker + { + protected SortedList data; + + protected BaseChecker () + { + } + + public BaseChecker (Stream input) + { + data = new SortedList (); + + StreamReader input_reader = new StreamReader (input); + string line; + + while ((line = input_reader.ReadLine ()) != null) + data[line] = new Method (line); + } + + public BaseChecker (SortedList data) + { + this.data = data; + } + + public virtual bool Matches (string method, out Method match) + { + if (method.Contains ("AddMemoryPressure")) + Console.WriteLine (method); + + if (data.ContainsKey (method)) { + match = data[method]; + return true; + } + + match = null; + return false; + } + + } +} diff --git a/MoMA.Analyzer/Analysis/CheckMonoTodo.cs b/MoMA.Analyzer/Analysis/CheckMonoTodo.cs new file mode 100644 index 0000000..cd98a9e --- /dev/null +++ b/MoMA.Analyzer/Analysis/CheckMonoTodo.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +namespace MoMA.Analyzer +{ + public class CheckMonoTodo : BaseChecker + { + public CheckMonoTodo (Stream input) + { + data = new SortedList (); + + StreamReader input_reader = new StreamReader (input); + string line; + + while ((line = input_reader.ReadLine ()) != null) + { + int split = line.IndexOf ("-"); + + string method = line.Substring (0, split); + string description = line.Substring (split + 1); + + data[method] = new Method (method, description); + } + } + } +} diff --git a/MoMA.Analyzer/Analysis/CheckPInvokes.cs b/MoMA.Analyzer/Analysis/CheckPInvokes.cs new file mode 100644 index 0000000..2a1fef2 --- /dev/null +++ b/MoMA.Analyzer/Analysis/CheckPInvokes.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using Mono.Cecil; + +namespace MoMA.Analyzer +{ + public class CheckPInvokes : BaseChecker + { + public CheckPInvokes () + { + data = new SortedList (); + } + + public void FindPInvokesInAssembly (string assembly) + { + AssemblyDefinition ad = AssemblyFactory.GetAssembly (assembly); + + //Gets all types of the MainModule of the assembly + foreach (TypeDefinition type in ad.MainModule.Types) { + if (type.Name != "") { + //Gets all methods of the current type + foreach (MethodDefinition method in type.Methods) + if ((method.Attributes & MethodAttributes.PInvokeImpl) == MethodAttributes.PInvokeImpl) + data[method.ToString ()] = new Method (method.ToString (), method.PInvokeInfo.Module.Name); + } + } + } + } +} diff --git a/MoMA.Analyzer/AssemblyAnalyzer.cs b/MoMA.Analyzer/AssemblyAnalyzer.cs new file mode 100644 index 0000000..a3fdfdd --- /dev/null +++ b/MoMA.Analyzer/AssemblyAnalyzer.cs @@ -0,0 +1,278 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using Mono.Cecil; +using Mono.Cecil.Cil; +using System.Web.UI; + +namespace MoMA.Analyzer +{ + public class AssemblyAnalyzer + { + private CheckMonoTodo mono_todo; + private BaseChecker not_implemented; + private BaseChecker missing; + private CheckPInvokes pinvoke; + + private List mono_todo_results; + private List not_implemented_results; + private List missing_results; + private List pinvoke_results; + + public List MonoTodoResults + { + get { return this.mono_todo_results; } + } + + public List NotImplementedExceptionResults + { + get { return this.not_implemented_results; } + } + + public List MissingMethodResults + { + get { return this.missing_results; } + } + + public List PInvokeResults + { + get { return this.pinvoke_results; } + } + + public AssemblyAnalyzer () + { + mono_todo_results = new List (); + not_implemented_results = new List (); + missing_results = new List (); + pinvoke_results = new List (); + } + + public void LoadDefinitions (string monoTodoDefinitions, string notImplementedDefinitions, string missingDefinitions) + { + Stream mt = new FileStream (monoTodoDefinitions, FileMode.Open); + Stream ni = new FileStream (notImplementedDefinitions, FileMode.Open); + Stream mi = new FileStream (missingDefinitions, FileMode.Open); + + LoadDefinitions (mt, ni, mi); + + mt.Close (); + ni.Close (); + mi.Close (); + } + + public void LoadDefinitions (Stream monoTodoDefinitions, Stream notImplementedDefinitions, Stream missingDefinitions) + { + if (monoTodoDefinitions != null) + mono_todo = new CheckMonoTodo (monoTodoDefinitions); + + if (notImplementedDefinitions != null) + not_implemented = new BaseChecker (notImplementedDefinitions); + + if (missingDefinitions != null) + missing = new BaseChecker (missingDefinitions); + } + + public void ScanAssemblyForPInvokes (string assembly) + { + if (pinvoke == null) + pinvoke = new CheckPInvokes (); + + pinvoke.FindPInvokesInAssembly (assembly); + } + + public void AnalyzeAssembly (string assembly) + { + AssemblyDefinition ad = AssemblyFactory.GetAssembly (assembly); + + foreach (TypeDefinition type in ad.MainModule.Types) { + if (type.Name != "") { + foreach (MethodDefinition method in type.Methods) { + if (method.Body != null) { + foreach (Instruction i in method.Body.Instructions) { + if (i.OpCode == OpCodes.Call || i.OpCode == OpCodes.Callvirt) { + Method match; + + if (mono_todo != null && mono_todo.Matches (i.Operand.ToString (), out match)) + mono_todo_results.Add (new MonoTodoError (new Method (method.ToString ()), match)); + + if (not_implemented != null && not_implemented.Matches (i.Operand.ToString (), out match)) + not_implemented_results.Add (new NotImplementedExceptionError (new Method (method.ToString ()), match)); + + if (pinvoke.Matches (i.Operand.ToString (), out match)) + pinvoke_results.Add (new PInvokeError (new Method (method.ToString ()), match)); + + if (missing.Matches (i.Operand.ToString (), out match)) + missing_results.Add (new MissingMethodError (new Method (method.ToString ()), match)); + } + } + } + } + } + } + } + + public XhtmlTextWriter BeginHtmlReport (Stream output) + { + StreamWriter sw = new StreamWriter (output); + XhtmlTextWriter writer = new XhtmlTextWriter (sw); + + writer.WriteBeginTag ("html"); + writer.WriteAttribute ("xmlns", "http://www.w3.org/1999/xhtml"); + writer.Write (HtmlTextWriter.TagRightChar); + writer.WriteFullBeginTag ("head"); + + writer.WriteFullBeginTag ("title"); + writer.WriteEncodedText ("MoMa Report"); + writer.WriteEndTag ("title"); + + WriteCss (writer); + + writer.WriteEndTag ("head"); + writer.WriteFullBeginTag ("body"); + + writer.WriteFullBeginTag ("h1"); + writer.WriteEncodedText ("MoMA Scan Results"); + writer.WriteEndTag ("h1"); + + writer.WriteBreak (); + writer.WriteEncodedText (String.Format ("Scan time: {0}" , DateTime.Now.ToString ())); + writer.WriteBreak (); + writer.WriteBreak (); + writer.Write ("For descriptions of issues and what to do, see http://www.mono-project.com/MoMA_-_Issue_Descriptions."); + writer.WriteBreak (); + writer.WriteBreak (); + + return writer; + } + + public StreamWriter BeginTextReport (Stream output) + { + return new StreamWriter (output); + } + + public void AddResultsToHtmlReport (XhtmlTextWriter writer) + { + if (missing_results.Count + pinvoke_results.Count + not_implemented_results.Count + mono_todo_results.Count == 0) { + writer.WriteFullBeginTag ("h3"); + writer.WriteEncodedText ("No Issues Found"); + writer.WriteEndTag ("h3"); + writer.WriteBreak (); + } + else { + OutputHtmlResults (writer, "Methods missing from Mono", missing_results, "Calling Method", "Method not yet in Mono"); + OutputHtmlResults (writer, "P/Invokes into native code", pinvoke_results, "Calling Method", "P/Invoke Method", "External DLL"); + OutputHtmlResults (writer, "Methods called that throw NotImplementedException", not_implemented_results, "Calling Method", "Mono method that throws NotImplementedException"); + OutputHtmlResults (writer, "Methods called marked with [MonoTodo]", mono_todo_results, "Calling Method", "Method with [MonoTodo]", "Reason"); + } + } + + public void AddResultsToTextReport (StreamWriter writer) + { + OutputTextResults (writer, "Methods missing from Mono", missing_results); + OutputTextResults (writer, "P/Invokes into native code", pinvoke_results); + OutputTextResults (writer, "Methods called that throw NotImplementedException", not_implemented_results); + OutputTextResults (writer, "Methods called marked with [MonoTodo]", mono_todo_results); + } + + private void OutputHtmlResults (XhtmlTextWriter writer, string heading, List results, params string[] tableHeaders) + { + if (results.Count == 0) + return; + + writer.WriteFullBeginTag ("h3"); + writer.WriteEncodedText (heading); + writer.WriteEndTag ("h3"); + + writer.WriteFullBeginTag ("table"); + writer.WriteBeginTag ("tr"); + writer.WriteAttribute ("class", "header"); + writer.Write (HtmlTextWriter.TagRightChar); + + + if (tableHeaders != null && tableHeaders.Length > 0) { + foreach (string s in tableHeaders) { + writer.WriteFullBeginTag ("td"); + writer.WriteEncodedText (s); + writer.WriteEndTag ("td"); + } + } + + writer.WriteEndTag ("tr"); + + bool odd = false; + string previous_class = string.Empty; + + foreach (BaseError be in results) { + if (previous_class != be.GetCaller ().Class) { + writer.WriteBeginTag ("tr"); + writer.WriteAttribute ("class", "class"); + writer.Write (HtmlTextWriter.TagRightChar); + + writer.WriteBeginTag ("td"); + writer.WriteAttribute ("colspan", "3"); + writer.Write (HtmlTextWriter.TagRightChar); + + writer.WriteEncodedText ("Class " + be.GetCaller ().Class + ":"); + writer.WriteEndTag ("td"); + writer.WriteEndTag ("tr"); + + + } + be.WriteHtml (writer, odd); + odd = !odd; + previous_class = be.GetCaller ().Class; + } + + writer.WriteEndTag ("table"); + writer.WriteBreak (); + writer.WriteBreak (); + } + + private void OutputTextResults (StreamWriter writer, string heading, List results) + { + if (results.Count == 0) + return; + + writer.WriteLine ("[{0}]", heading); + + foreach (BaseError be in results) + be.WriteText (writer); + } + + public void FinishHtmlReport (XhtmlTextWriter writer) + { + writer.WriteEndTag ("body"); + writer.WriteEndTag ("html"); + writer.Close (); + } + + public void FinishTextReport (StreamWriter writer) + { + writer.Close (); + } + + public void ClearPInvokeDefinitions () + { + pinvoke_results = new List (); + } + + private void WriteCss (XhtmlTextWriter writer) + { + writer.WriteFullBeginTag ("style"); + + writer.WriteLine ("body { background-color: #fff; color: #333; font-family: lucida grande, sans-serif; margin: 5; padding: 0; font-size: 9pt; }"); + writer.WriteLine ("table { font-size: 9pt; width: 100%; padding: 0; margin: 0; font-family: Verdana, Tahoma, Lucida Sans, Sans-Serif; border-collapse: collapse; }"); + writer.WriteLine ("table tr.header { font-weight: bold; font-size: 12px; padding: 5px; background-color: #e8f3d4; border: none; }"); + writer.WriteLine ("table tr.header td { padding: 5px; border: 1px; }"); + writer.WriteLine ("tr.odd { background-color: #F1F5FA; }"); + writer.WriteLine ("tr.class { font-weight: bold; }"); + writer.WriteLine ("h1,h2,h3,h4,h5,h6 { color: #68892f; font-family: vag rounded, vag round, arial mt rounded, arial rounded, lucida grande, myriad, andale sans, luxi sans, bitstream vera sans, tahoma, toga sans, helvetica, arial, sans-serif; margin: 0; padding: 0; }"); + writer.WriteLine ("h1 { font-size: 2.25em; }"); + writer.WriteLine ("h2 { margin-bottom: .5em; font-size: 1.75em; }"); + writer.WriteLine ("h3 { margin-bottom: .45em; font-size: 1.25em; }"); + + writer.WriteEndTag ("style"); + } + } +} diff --git a/MoMA.Analyzer/Method.cs b/MoMA.Analyzer/Method.cs new file mode 100644 index 0000000..c0ea478 --- /dev/null +++ b/MoMA.Analyzer/Method.cs @@ -0,0 +1,122 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MoMA.Analyzer +{ + public class Method + { + private string raw_method; + private string method_output; + private string method_output_with_class; + private string method_class; + private string data; + + public Method (string method) + { + raw_method = method; + + ParseMethod(); + } + + public Method (string method, string data) + { + this.raw_method = method; + this.data = data; + + ParseMethod (); + } + + public string RawMethod + { + get { return raw_method; } + set { raw_method = value; } + } + + public string Data + { + get { return data; } + set { data = value; } + } + + public string Class + { + get { return method_class; } + set { method_class = value; } + } + + private void ParseMethod () + { + string return_type; + string function_name; + string[] parameters; + + if (raw_method.Contains ("modopt(")) + { + int mod_start = raw_method.IndexOf ("modopt("); + int mod_end = raw_method.IndexOf (")", mod_start); + + raw_method = raw_method.Substring (0, mod_start) + raw_method.Substring (mod_end + 2); + } + + return_type = raw_method.Substring (0, raw_method.IndexOf (" ")); + + int colons = raw_method.IndexOf ("::"); + int function_end = raw_method.IndexOf ("("); + + function_name = raw_method.Substring (colons + 2, function_end - colons - 2).Replace ("::", "."); + + string parameter_string = raw_method.Substring (function_end + 1, raw_method.Length - function_end - 2); + + parameters = parameter_string.Split (','); + + string final_parameters = string.Empty; + + foreach (string p in parameters) + final_parameters += (ConvertType (p) + ", "); + + final_parameters = final_parameters.Substring (0, final_parameters.Length - 2); + method_output = string.Format ("{0} {1}({2})", ConvertType (return_type), function_name, final_parameters); + method_class = raw_method.Substring (raw_method.IndexOf (" ") + 1, colons - raw_method.IndexOf (" ") - 1); + method_output_with_class = string.Format ("{0} {1}.{2}({3})", ConvertType (return_type), method_class.Substring (method_class.LastIndexOf (".") + 1), function_name, final_parameters); + + } + public override string ToString () + { + return method_output; + } + + public string ToStringWithClass () + { + return method_output_with_class; + } + + private string ConvertType (string type) + { + switch (type) { + case "System.Void": + return "void"; + case "System.Boolean": + return "bool"; + case "System.Int32": + return "int"; + case "System.String": + return "string"; + case "System.Double": + return "double"; + case "System.Decimal": + return "decimal"; + case "System.Char": + return "char"; + case "System.UInt32": + return "uint"; + case "System.Void*": + return "void*"; + case "System.Byte": + return "byte"; + } + + return type.Substring (type.LastIndexOf (".") + 1); + } + } +} diff --git a/MoMA.Analyzer/MethodExtractor.cs b/MoMA.Analyzer/MethodExtractor.cs new file mode 100644 index 0000000..4f23223 --- /dev/null +++ b/MoMA.Analyzer/MethodExtractor.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Mono.Cecil; +using Mono.Cecil.Cil; +using System.IO; + +namespace MoMA.Analyzer +{ + public class MethodExtractor + { + // Parse the assemblies looking for various sticky points + // Leave any of the SortedList parameters null that you aren't interested in + public static void ExtractFromAssembly (string assembly, SortedList allMethods, SortedList throwsNotImplementedMethods, SortedList monoTodoMethods) + { + AssemblyDefinition ad = AssemblyFactory.GetAssembly (assembly); + + //Gets all types of the MainModule of the assembly + foreach (TypeDefinition type in ad.MainModule.Types) { + if (type.Name != "") { + //Gets all methods of the current type + foreach (MethodDefinition method in type.Methods) { + // We only want Public and Protected methods + if ((method.Attributes & MethodAttributes.Family) == 0 && (method.Attributes & MethodAttributes.Public) == 0) + continue; + + // If adding all methods, add this method + if (allMethods != null) + allMethods[method.ToString ()] = new Method (method.ToString ()); + + // If adding MonoTODO methods, check this method + if (monoTodoMethods != null) + foreach (CustomAttribute ca in method.CustomAttributes) + if (ca.Constructor.DeclaringType.ToString () == "System.MonoTODOAttribute") + monoTodoMethods[method.ToString ()] = new Method (method.ToString (), ca.ConstructorParameters.Count > 0 ? ca.ConstructorParameters[0].ToString () : string.Empty); + + // If adding methods that throw NotImplementedException, look for those + if (throwsNotImplementedMethods != null && method.Body != null) + foreach (Instruction i in method.Body.Instructions) + if (i.OpCode == OpCodes.Throw) + if (i.Previous.Operand != null && i.Previous.Operand.ToString ().StartsWith ("System.Void System.NotImplementedException")) + throwsNotImplementedMethods[method.ToString ()] = new Method (method.ToString ()); + } + } + } + } + + public static void ComputeMethodDifference (SortedList master, SortedList subset, SortedList output) + { + // If it's in the master but not the subset, add it to the output + foreach (string s in master.Keys) + if (!(subset.ContainsKey (s))) + output[s] = new Method (s); + } + } +} diff --git a/MoMA.Analyzer/MoMA.Analyzer.csproj b/MoMA.Analyzer/MoMA.Analyzer.csproj new file mode 100644 index 0000000..b37587b --- /dev/null +++ b/MoMA.Analyzer/MoMA.Analyzer.csproj @@ -0,0 +1,61 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {CC12F142-C92F-4AD0-AEA3-D94F661C557B} + Library + Properties + MoMA.Analyzer + MoMA.Analyzer + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + ..\..\Cecil\gendarme\console\bin\Release\Mono.Cecil.dll + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MoMA.Analyzer/Properties/AssemblyInfo.cs b/MoMA.Analyzer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..4eeca17 --- /dev/null +++ b/MoMA.Analyzer/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 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 ("MoMA.Analyzer")] +[assembly: AssemblyDescription ("")] +[assembly: AssemblyConfiguration ("")] +[assembly: AssemblyCompany ("None")] +[assembly: AssemblyProduct ("MoMA.Analyzer")] +[assembly: AssemblyCopyright ("Copyright © None 2006")] +[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)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid ("a86c98e8-0c8d-4041-a7dd-aefae6bedc1a")] + +// 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.0.0")] +[assembly: AssemblyFileVersion ("1.0.0.0")] diff --git a/MoMA.Analyzer/Results/BaseError.cs b/MoMA.Analyzer/Results/BaseError.cs new file mode 100644 index 0000000..7123056 --- /dev/null +++ b/MoMA.Analyzer/Results/BaseError.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MoMA.Analyzer +{ + public abstract class BaseError + { + protected Method caller; + protected Method callee; + + public abstract void WriteHtml (System.Web.UI.XhtmlTextWriter tw, bool odd); + public abstract void WriteText (System.IO.StreamWriter results); + + public virtual Method GetCaller () + { + return caller; + } + + } +} diff --git a/MoMA.Analyzer/Results/MissingMethodError.cs b/MoMA.Analyzer/Results/MissingMethodError.cs new file mode 100644 index 0000000..05f047f --- /dev/null +++ b/MoMA.Analyzer/Results/MissingMethodError.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Web.UI; + +namespace MoMA.Analyzer +{ + class MissingMethodError : BaseError + { + public MissingMethodError (Method caller, Method callee) + { + this.caller = caller; + this.callee = callee; + } + + public override void WriteHtml (System.Web.UI.XhtmlTextWriter tw, bool odd) + { + if (odd) { + tw.WriteBeginTag ("tr"); + tw.WriteAttribute ("class", "odd"); + tw.Write (HtmlTextWriter.TagRightChar); + } + else + tw.WriteFullBeginTag ("tr"); + + tw.WriteFullBeginTag ("td"); + tw.WriteEncodedText (caller.ToString ()); + tw.WriteEndTag ("td"); + tw.WriteFullBeginTag ("td"); + tw.WriteEncodedText (callee.ToStringWithClass ()); + tw.WriteEndTag ("td"); + tw.WriteEndTag ("tr"); + } + + public override void WriteText (System.IO.StreamWriter results) + { + results.WriteLine (callee.RawMethod); + } + + } +} diff --git a/MoMA.Analyzer/Results/MonoTodoError.cs b/MoMA.Analyzer/Results/MonoTodoError.cs new file mode 100644 index 0000000..03e853a --- /dev/null +++ b/MoMA.Analyzer/Results/MonoTodoError.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Web.UI; + +namespace MoMA.Analyzer +{ + class MonoTodoError : BaseError + { + public MonoTodoError (Method caller, Method callee) + { + this.caller = caller; + this.callee = callee; + } + + public override void WriteHtml (System.Web.UI.XhtmlTextWriter tw, bool odd) + { + if (odd) { + tw.WriteBeginTag ("tr"); + tw.WriteAttribute ("class", "odd"); + tw.Write (HtmlTextWriter.TagRightChar); + } + else + tw.WriteFullBeginTag ("tr"); + + tw.WriteFullBeginTag ("td"); + tw.WriteEncodedText (caller.ToString ()); + tw.WriteEndTag ("td"); + tw.WriteFullBeginTag ("td"); + tw.WriteEncodedText (callee.ToStringWithClass ()); + tw.WriteEndTag ("td"); + tw.WriteFullBeginTag ("td"); + tw.WriteEncodedText (callee.Data.Trim ().Length > 0 ? callee.Data : "Not Specified"); + tw.WriteEndTag ("td"); + tw.WriteEndTag ("tr"); + } + + public override void WriteText (System.IO.StreamWriter results) + { + results.WriteLine (callee.RawMethod); + } + } +} diff --git a/MoMA.Analyzer/Results/NotImplementedExceptionError.cs b/MoMA.Analyzer/Results/NotImplementedExceptionError.cs new file mode 100644 index 0000000..509ebc9 --- /dev/null +++ b/MoMA.Analyzer/Results/NotImplementedExceptionError.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Web.UI; + +namespace MoMA.Analyzer +{ + class NotImplementedExceptionError : BaseError + { + public NotImplementedExceptionError (Method caller, Method callee) + { + this.caller = caller; + this.callee = callee; + } + + public override void WriteHtml (System.Web.UI.XhtmlTextWriter tw, bool odd) + { + if (odd) { + tw.WriteBeginTag ("tr"); + tw.WriteAttribute ("class", "odd"); + tw.Write (HtmlTextWriter.TagRightChar); + } + else + tw.WriteFullBeginTag ("tr"); + + tw.WriteFullBeginTag ("td"); + tw.WriteEncodedText (caller.ToString ()); + tw.WriteEndTag ("td"); + tw.WriteFullBeginTag ("td"); + tw.WriteEncodedText (callee.ToStringWithClass ()); + tw.WriteEndTag ("td"); + tw.WriteEndTag ("tr"); + } + + public override void WriteText (System.IO.StreamWriter results) + { + results.WriteLine (callee.RawMethod); + } + } +} diff --git a/MoMA.Analyzer/Results/PInvokeError.cs b/MoMA.Analyzer/Results/PInvokeError.cs new file mode 100644 index 0000000..aeccc78 --- /dev/null +++ b/MoMA.Analyzer/Results/PInvokeError.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Web.UI; + +namespace MoMA.Analyzer +{ + class PInvokeError : BaseError + { + public PInvokeError (Method caller, Method callee) + { + this.caller = caller; + this.callee = callee; + } + + public override void WriteHtml (System.Web.UI.XhtmlTextWriter tw, bool odd) + { + if (odd) + { + tw.WriteBeginTag ("tr"); + tw.WriteAttribute ("class", "odd"); + tw.Write (HtmlTextWriter.TagRightChar); + } + else + tw.WriteFullBeginTag ("tr"); + + tw.WriteFullBeginTag ("td"); + tw.WriteEncodedText (caller.ToString ()); + tw.WriteEndTag ("td"); + tw.WriteFullBeginTag ("td"); + tw.WriteEncodedText (callee.ToString ()); + tw.WriteEndTag ("td"); + tw.WriteFullBeginTag ("td"); + tw.WriteEncodedText (callee.Data.ToString ()); + tw.WriteEndTag ("td"); + tw.WriteEndTag ("tr"); + } + + public override void WriteText (System.IO.StreamWriter results) + { + results.WriteLine ("{0}-{1}", callee.ToString (), this.callee.Data); + } + } +} diff --git a/MoMA.csproj b/MoMA.csproj new file mode 100644 index 0000000..864950e --- /dev/null +++ b/MoMA.csproj @@ -0,0 +1,127 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {D7FF97F5-1029-4886-9C9D-4EE5618836BC} + WinExe + Properties + MoMA + MoMA + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + Form + + + MainForm.cs + + + + + MainForm.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + True + True + Reference.map + + + + + + + + + + + + + + + + {CC12F142-C92F-4AD0-AEA3-D94F661C557B} + MoMA.Analyzer + + + + + + + + Static + Web References\MoMAWebServices\ + http://jpobst.com/moma/MoMASubmit.asmx + + + + + Settings + MoMA_MoMAWebServices_MoMASubmit + + + + + + + + MSDiscoCodeGenerator + Reference.cs + + + + + \ No newline at end of file diff --git a/MoMA.csproj.user b/MoMA.csproj.user new file mode 100644 index 0000000..b875c0c --- /dev/null +++ b/MoMA.csproj.user @@ -0,0 +1,5 @@ + + + ProjectFiles + + \ No newline at end of file diff --git a/MoMA.sln b/MoMA.sln new file mode 100644 index 0000000..daa7f74 --- /dev/null +++ b/MoMA.sln @@ -0,0 +1,32 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MoMA", "MoMA.csproj", "{D7FF97F5-1029-4886-9C9D-4EE5618836BC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MoMA.Analyzer", "MoMA.Analyzer\MoMA.Analyzer.csproj", "{CC12F142-C92F-4AD0-AEA3-D94F661C557B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MoMAExtractor", "MoMAExtractor\MoMAExtractor.csproj", "{64DE84A1-C274-4875-84F2-FCA7B24104D8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D7FF97F5-1029-4886-9C9D-4EE5618836BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D7FF97F5-1029-4886-9C9D-4EE5618836BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D7FF97F5-1029-4886-9C9D-4EE5618836BC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D7FF97F5-1029-4886-9C9D-4EE5618836BC}.Release|Any CPU.Build.0 = Release|Any CPU + {CC12F142-C92F-4AD0-AEA3-D94F661C557B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CC12F142-C92F-4AD0-AEA3-D94F661C557B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CC12F142-C92F-4AD0-AEA3-D94F661C557B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CC12F142-C92F-4AD0-AEA3-D94F661C557B}.Release|Any CPU.Build.0 = Release|Any CPU + {64DE84A1-C274-4875-84F2-FCA7B24104D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {64DE84A1-C274-4875-84F2-FCA7B24104D8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {64DE84A1-C274-4875-84F2-FCA7B24104D8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {64DE84A1-C274-4875-84F2-FCA7B24104D8}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/MoMA.suo b/MoMA.suo new file mode 100644 index 0000000000000000000000000000000000000000..f56e895f1d7cfcf633468aec0571d88bb61d9927 GIT binary patch literal 79360 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

bs*<) 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 literal 0 HcmV?d00001 diff --git a/MoMAExtractor/MoMAExtractor.csproj b/MoMAExtractor/MoMAExtractor.csproj new file mode 100644 index 0000000..7eda6dc --- /dev/null +++ b/MoMAExtractor/MoMAExtractor.csproj @@ -0,0 +1,54 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {64DE84A1-C274-4875-84F2-FCA7B24104D8} + Exe + Properties + MoMAExtractor + MoMAExtractor + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + {CC12F142-C92F-4AD0-AEA3-D94F661C557B} + MoMA.Analyzer + + + + + \ No newline at end of file diff --git a/MoMAExtractor/Program.cs b/MoMAExtractor/Program.cs new file mode 100644 index 0000000..95b3339 --- /dev/null +++ b/MoMAExtractor/Program.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using MoMA.Analyzer; +using System.Windows.Forms; + +namespace MoMAExtractor +{ + class Program + { + static void Main (string[] args) + { + // I'm just interested in getting the files needed for MoMA + // right now, this may only work on my machine :) + + string mono_path = @"C:\Program Files\Mono-1.2\lib\mono\2.0"; + string ms_path = @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727"; + string output_path = Path.GetDirectoryName (Application.ExecutablePath); + + List mono_assemblies = GetMonoAssemblies (mono_path); + List ms_assemblies = GetMicrosoftAssemblies (ms_path); + + SortedList all = new SortedList (); + SortedList todo = new SortedList (); + SortedList nie = new SortedList (); + + foreach (string assembly in mono_assemblies) + MethodExtractor.ExtractFromAssembly (assembly, all, nie, todo); + + WriteListToFile (todo, Path.Combine (output_path, "monotodo.txt"), true); + WriteListToFile (nie, Path.Combine (output_path, "exception.txt"), false); + + todo.Clear (); + nie.Clear (); + + SortedList ms_all = new SortedList (); + SortedList missing = new SortedList (); + + foreach (string assembly in ms_assemblies) + MethodExtractor.ExtractFromAssembly (assembly, ms_all, null, null); + + MethodExtractor.ComputeMethodDifference (ms_all, all, missing); + + WriteListToFile (missing, Path.Combine (output_path, "missing.txt"), false); + + Console.WriteLine ("done"); + Console.ReadLine (); + } + + private static List GetMonoAssemblies (string directory) + { + // Find all of Mono's assemblies + List assemblies = new List (); + + foreach (string f in Directory.GetFiles (directory, "*.dll")) + if (f.Contains ("Accessibility") || f.Contains ("System") || f.Contains ("mscorlib") || f.Contains ("Microsoft")) + assemblies.Add (f); + + return assemblies; + } + + private static List GetMicrosoftAssemblies (string directory) + { + // Find all of Microsoft's assemblies + List assemblies = new List (); + + foreach (string filepath in Directory.GetFiles (directory, "*.dll")) { + string f = Path.GetFileName (filepath); + + if ((f.Contains ("Accessibility") || f.Contains ("System") || f.Contains ("mscorlib") || f.Contains ("Microsoft")) && !(f.Contains ("_")) && !(f.Contains ("Thunk")) && !(f.Contains ("Wrapper"))) + assemblies.Add (filepath); + } + + return assemblies; + } + + private static void WriteListToFile (SortedList list, string filename, bool writeDataField) + { + StreamWriter sw = new StreamWriter (filename); + + foreach (Method m in list.Values) { + if (writeDataField) + sw.WriteLine ("{0}-{1}", m.RawMethod, m.Data); + else + sw.WriteLine (m.RawMethod); + } + + sw.Close (); + } + } +} diff --git a/MoMAExtractor/Properties/AssemblyInfo.cs b/MoMAExtractor/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..af3f734 --- /dev/null +++ b/MoMAExtractor/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 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 ("MoMAExtractor")] +[assembly: AssemblyDescription ("")] +[assembly: AssemblyConfiguration ("")] +[assembly: AssemblyCompany ("None")] +[assembly: AssemblyProduct ("MoMAExtractor")] +[assembly: AssemblyCopyright ("Copyright © None 2006")] +[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)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid ("e83c2e8a-45dc-404f-a964-aed716c92faf")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion ("1.0.0.0")] +[assembly: AssemblyFileVersion ("1.0.0.0")] diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..1e7b14d --- /dev/null +++ b/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace MoMA +{ + static class Program + { + ///

+ /// The main entry point for the application. + /// + [STAThread] + static void Main () + { + Application.EnableVisualStyles (); + Application.SetCompatibleTextRenderingDefault (false); + Application.Run (new MainForm ()); + } + } +} \ No newline at end of file diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..770193e --- /dev/null +++ b/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 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 ("MoMA")] +[assembly: AssemblyDescription ("")] +[assembly: AssemblyConfiguration ("")] +[assembly: AssemblyCompany ("None")] +[assembly: AssemblyProduct ("MoMA")] +[assembly: AssemblyCopyright ("Copyright © None 2006")] +[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)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid ("e2aab240-3610-486e-a326-db7aa84f741a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion ("1.0.0.0")] +[assembly: AssemblyFileVersion ("1.0.0.0")] diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs new file mode 100644 index 0000000..79c7b61 --- /dev/null +++ b/Properties/Resources.Designer.cs @@ -0,0 +1,105 @@ +//------------------------------------------------------------------------------ +// +// 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. +// +//------------------------------------------------------------------------------ + +namespace MoMA.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // 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() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [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("MoMA.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [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 button_ok { + get { + object obj = ResourceManager.GetObject("button_ok", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap dialog_warning { + get { + object obj = ResourceManager.GetObject("dialog-warning", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap list_add { + get { + object obj = ResourceManager.GetObject("list-add", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap list_remove { + get { + object obj = ResourceManager.GetObject("list-remove", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap monkey { + get { + object obj = ResourceManager.GetObject("monkey", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap monoback { + get { + object obj = ResourceManager.GetObject("monoback", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Properties/Resources.resx b/Properties/Resources.resx new file mode 100644 index 0000000..1e86c57 --- /dev/null +++ b/Properties/Resources.resx @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\monkey.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\button_ok.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\dialog-warning.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\list-remove.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\list-add.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\monoback.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs new file mode 100644 index 0000000..458e03f --- /dev/null +++ b/Properties/Settings.Designer.cs @@ -0,0 +1,36 @@ +//------------------------------------------------------------------------------ +// +// 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. +// +//------------------------------------------------------------------------------ + +namespace MoMA.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.WebServiceUrl)] + [global::System.Configuration.DefaultSettingValueAttribute("http://jpobst.com/pobst/moma/MoMASubmit.asmx")] + public string MoMA_MoMAWebServices_MoMASubmit { + get { + return ((string)(this["MoMA_MoMAWebServices_MoMASubmit"])); + } + } + } +} diff --git a/Properties/Settings.settings b/Properties/Settings.settings new file mode 100644 index 0000000..de086d5 --- /dev/null +++ b/Properties/Settings.settings @@ -0,0 +1,9 @@ + + + + + + http://jpobst.com/pobst/moma/MoMASubmit.asmx + + + \ No newline at end of file diff --git a/Resources/button_ok.png b/Resources/button_ok.png new file mode 100644 index 0000000000000000000000000000000000000000..31c064ba9221ee125c0e45fd78c5c5aee61df26e GIT binary patch literal 769 zcmV+c1OEJpP)cHeO`Ol5zyLImnGt9T1H%VqW(G%q0AggA&F~&9`H#VoA)Q3SX95jmWT@xj;7a)R z^BV(@{Q!sq8Il<;00a;d!!L#n;(X!)41XB*GfZYMAj-f=Km(^R%;#X{xbI--kf0)> z!T>bq0>f_xLy(~$B>({gGI%4<76vm1GXbE)euf@AhW7vs>}8nG%FKFS(^xaXBh-W8 z%8e@wmu_A<0CbomLngxqm{NcMVqoZE5MbzF_^Sy{dctr5O#t#j!dhU7L{~0=gA&dn81P~-iG%@UF4rO*=QfFfLbMX(u|4sitF#HF) z;6Km>z%XRs1V)NE0|Sd03j-quP|FJjhChpe>VE!Tz);7Kh|OSt0Ac}?KN&Xuz4X`N zul!#I26Z6c4d{z4z+hnq(q=$D2y*}p144#}K=u-_oP$4LH|iN6a)YQh#7^a2TZY_83Gt?0om_>hAsuh{$++AuiL$5uuQc zi$WH))CSxL{R_J8s!$0u-4vuCbuod^p&AR)v?yq(24ZUxGdh{;VkV)9on&ec9Ny*L zcRu%f4~H*WYdXo(V08Mg)*3|z;fstPgXL+%xaW)XcT!_^0CnGhAKxAw4Xo5^;l|CI zH-Mh~>h@J^z*M-euhH)~j3$%Hw(V|T zf8B!kRjoH)NwEc=AIM~M@bP2J`J+@UT6VRHH!}ma z&FYymJV~ed;rjKbx0|Y;{wKw6!S}DlVk)@2OrTuGNG37jaqLowxCn<_*EHahwvyY- zZ1yvyp3R*+spnHE{adxFJS5PD6LcbNnWJ*EcYrtfeJ_ z=g*_UVO-b6^E^~n7r}`My4Kb>5{)VgraNkdFOuIhjQ;%L!-n42z?ql;z;#_**F{7K zo;}O+l@-Ru$IU^JkA0CN`-1Z@lN}l|jQjTqUbui*79xV@d4$7ZLveUbN- zWgQqicn~9#*#WKB>lBMc%H{GlR4GO1)F}vu$@TUsWmzd-nWUqo{7^|7NzE$-gM zotoMKFin%5o*oj3#P;6SdFUZuiGBRT4;G5m0K_@);6X2UZ<6TR!R%{YzwTl cuK!#83wh2#=*+j5WB>pF07*qoM6N<$f-^77nE(I) literal 0 HcmV?d00001 diff --git a/Resources/list-add.png b/Resources/list-add.png new file mode 100644 index 0000000000000000000000000000000000000000..0291f24edfcd80e8fb06b8626a4274e380e0f14e GIT binary patch literal 405 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fY)RhkE4!(%y#zfZ7r4Jt{2)=e(aF%jTx%D zxupe461uGCRHyBDex~(*M7c$zgJZG*%byn+ZRTGU-uBHdWY~Xu&85t+PE(B*i}F8w zNoO0s2DL<~T(x|b-mmJoS7qV4+osDF6`$U*?(}a97twW5=`D*^G`-rsR_}Lt-K!%E z`NF49zhDj(2y{8vmBi}Am_0Q>M9|{a`jl#}10}z{dke>0@i#ob-p0mG_2Z0?M=GD$ zdmF8~C6*h6zsbp0+QqlqHA&QU591UDzVD~z$h<%IN;Dz+YW(B1E2b~jVSKiy{Ppn` vD+aX#551-NdmlLE!rR$#su6|Es;(=ArUw>XPUa(|$9} zVEr}aXx_xV;z7$Zx5b`adDWvK>P)FowHD*GpAVHg($6dv@_VkGwjgUo;|fKt-lmR= zD;9EHK6&Hs4P!m?pN178A6Nae-_G~9jNkUTZ-dkZfyW{eTcw!pz0!WbcPGj-<5A<~ h=?rJrADJl5zdq3Bo=Vn5Z=mBDJYD@<);T3K0RY0qZLk0U literal 0 HcmV?d00001 diff --git a/Resources/monkey.png b/Resources/monkey.png new file mode 100644 index 0000000000000000000000000000000000000000..8650aa37df70d53427336122c723d32f04dee090 GIT binary patch literal 20335 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 S$sqp#0000&Z9U@nC+K(W1ZVGro%_NQjs(Sr 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 E0W$McmjD0& literal 0 HcmV?d00001 diff --git a/Web References/MoMAWebServices/MoMASubmit.disco b/Web References/MoMAWebServices/MoMASubmit.disco new file mode 100644 index 0000000..0583477 --- /dev/null +++ b/Web References/MoMAWebServices/MoMASubmit.disco @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Web References/MoMAWebServices/MoMASubmit.wsdl b/Web References/MoMAWebServices/MoMASubmit.wsdl new file mode 100644 index 0000000..039d313 --- /dev/null +++ b/Web References/MoMAWebServices/MoMASubmit.wsdl @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Web References/MoMAWebServices/Reference.cs b/Web References/MoMAWebServices/Reference.cs new file mode 100644 index 0000000..a63a5df --- /dev/null +++ b/Web References/MoMAWebServices/Reference.cs @@ -0,0 +1,150 @@ +//------------------------------------------------------------------------------ +// +// 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. +// +//------------------------------------------------------------------------------ + +// +// This source code was auto-generated by Microsoft.VSDesigner, Version 2.0.50727.42. +// +#pragma warning disable 1591 + +namespace MoMA.MoMAWebServices { + using System.Diagnostics; + using System.Web.Services; + using System.ComponentModel; + using System.Web.Services.Protocols; + using System; + using System.Xml.Serialization; + + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Web.Services.WebServiceBindingAttribute(Name="MoMASubmitSoap", Namespace="http://mono-project.com/MoMASubmit/")] + public partial class MoMASubmit : System.Web.Services.Protocols.SoapHttpClientProtocol { + + private System.Threading.SendOrPostCallback SubmitResultsOperationCompleted; + + private bool useDefaultCredentialsSetExplicitly; + + /// + public MoMASubmit() { + this.Url = "http://jpobst.com/pobst/moma/MoMASubmit.asmx"; + if ((this.IsLocalFileSystemWebService(this.Url) == true)) { + this.UseDefaultCredentials = true; + this.useDefaultCredentialsSetExplicitly = false; + } + else { + this.useDefaultCredentialsSetExplicitly = true; + } + } + + public new string Url { + get { + return base.Url; + } + set { + if ((((this.IsLocalFileSystemWebService(base.Url) == true) + && (this.useDefaultCredentialsSetExplicitly == false)) + && (this.IsLocalFileSystemWebService(value) == false))) { + base.UseDefaultCredentials = false; + } + base.Url = value; + } + } + + public new bool UseDefaultCredentials { + get { + return base.UseDefaultCredentials; + } + set { + base.UseDefaultCredentials = value; + this.useDefaultCredentialsSetExplicitly = true; + } + } + + /// + public event SubmitResultsCompletedEventHandler SubmitResultsCompleted; + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://mono-project.com/MoMASubmit/SubmitResults", RequestNamespace="http://mono-project.com/MoMASubmit/", ResponseNamespace="http://mono-project.com/MoMASubmit/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public bool SubmitResults(string results) { + object[] results1 = this.Invoke("SubmitResults", new object[] { + results}); + return ((bool)(results1[0])); + } + + /// + public void SubmitResultsAsync(string results) { + this.SubmitResultsAsync(results, null); + } + + /// + public void SubmitResultsAsync(string results, object userState) { + if ((this.SubmitResultsOperationCompleted == null)) { + this.SubmitResultsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSubmitResultsOperationCompleted); + } + this.InvokeAsync("SubmitResults", new object[] { + results}, this.SubmitResultsOperationCompleted, userState); + } + + private void OnSubmitResultsOperationCompleted(object arg) { + if ((this.SubmitResultsCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.SubmitResultsCompleted(this, new SubmitResultsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + public new void CancelAsync(object userState) { + base.CancelAsync(userState); + } + + private bool IsLocalFileSystemWebService(string url) { + if (((url == null) + || (url == string.Empty))) { + return false; + } + System.Uri wsUri = new System.Uri(url); + if (((wsUri.Port >= 1024) + && (string.Compare(wsUri.Host, "localHost", System.StringComparison.OrdinalIgnoreCase) == 0))) { + return true; + } + return false; + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "2.0.50727.42")] + public delegate void SubmitResultsCompletedEventHandler(object sender, SubmitResultsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class SubmitResultsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal SubmitResultsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public bool Result { + get { + this.RaiseExceptionIfNecessary(); + return ((bool)(this.results[0])); + } + } + } +} + +#pragma warning restore 1591 \ No newline at end of file diff --git a/Web References/MoMAWebServices/Reference.map b/Web References/MoMAWebServices/Reference.map new file mode 100644 index 0000000..53a162e --- /dev/null +++ b/Web References/MoMAWebServices/Reference.map @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/WizardStep.cs b/WizardStep.cs new file mode 100644 index 0000000..577a0f2 --- /dev/null +++ b/WizardStep.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MoMA +{ + public enum WizardStep + { + Introduction = 1, + ChooseAssemblies = 2, + ViewResults = 3, + SubmitResults = 4 + } +} diff --git a/app.config b/app.config new file mode 100644 index 0000000..a8e6c0c --- /dev/null +++ b/app.config @@ -0,0 +1,15 @@ + + + + +
+ + + + + + http://jpobst.com/pobst/moma/MoMASubmit.asmx + + + + \ No newline at end of file