--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Dist" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+\r
+ <PropertyGroup>\r
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>\r
+\r
+ <DistDir>dist</DistDir>\r
+ <AllGetBinDir>all-get/bin/$(Configuration)</AllGetBinDir>\r
+ <ArchiveInstBinDir>archive-inst/bin/$(Configuration)</ArchiveInstBinDir>\r
+ <AppliStationBinDir>AppliStation/bin/$(Configuration)</AppliStationBinDir>\r
+ </PropertyGroup>\r
+\r
+ <ItemGroup>\r
+ <ProviderList Include="provider.list.txt" />\r
+ </ItemGroup>\r
+\r
+ <ItemGroup>\r
+ <AllGetBin Include="$(AllGetBinDir)/*.exe;$(AllGetBinDir)/*.dll" />\r
+ <ArchiveInstBin Include="$(ArchiveInstBinDir)/*.exe" />\r
+ <AppliStationBin Include="$(AppliStationBinDir)/*.png;$(AppliStationBinDir)/*.exe" />\r
+ </ItemGroup>\r
+\r
+ <ItemGroup Condition=" '$(IncludePdb)' == 'Yes' ">\r
+ <AllGetBin Include="$(AllGetBinDir)/*.exe;$(AllGetBinDir)/*.dll;$(AllGetBinDir)/*.pdb" />\r
+ <ArchiveInstBin Include="$(ArchiveInstBinDir)/*.exe;$(ArchiveInstBinDir)/*.pdb" />\r
+ <AppliStationBin Include="$(AppliStationBinDir)/*.png;$(AppliStationBinDir)/*.exe;$(AppliStationBinDir)/*.pdb" />\r
+ </ItemGroup>\r
+\r
+ <Target Name="Build">\r
+ <MSBuild Projects="AppliStation.sln" />\r
+ </Target>\r
+\r
+ <Target Name="Dist">\r
+ <MakeDir Directories="$(DistDir)" />\r
+\r
+ <Copy SourceFiles="@(AllGetBin)" DestinationFolder="$(DistDir)" />\r
+ <Copy SourceFiles="@(ProviderList)" DestinationFolder="$(DistDir)" />\r
+ <Copy SourceFiles="@(ArchiveInstBin)" DestinationFolder="$(DistDir)" />\r
+ <Copy SourceFiles="@(AppliStationBin)" DestinationFolder="$(DistDir)" />\r
+ </Target>\r
+\r
+</Project>\r
--- /dev/null
+\r
+Microsoft Visual Studio Solution File, Format Version 9.00\r
+# Visual Studio 2005\r
+# SharpDevelop 2.2.1.2648\r
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "na-get-lib", "na-get-lib\na-get-lib.csproj", "{058E953D-3986-4F74-8516-5A50D267D36A}"\r
+EndProject\r
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "all-get", "all-get\all-get.csproj", "{F212C7FF-0FC5-4319-BD72-87DB3A4CC55F}"\r
+EndProject\r
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "archive-inst", "archive-inst\archive-inst.csproj", "{9D7ADB99-6E53-4E3E-A13B-6D82412B3671}"\r
+EndProject\r
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppliStation", "AppliStation\AppliStation.csproj", "{0FC9CFF6-95CE-4C2D-833D-F6D697CD57EB}"\r
+EndProject\r
+Global\r
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+ Debug|Any CPU = Debug|Any CPU\r
+ Release|Any CPU = Release|Any CPU\r
+ EndGlobalSection\r
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+ {B4CD5E33-03CC-427D-A358-39360D6E4AD0}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+ {B4CD5E33-03CC-427D-A358-39360D6E4AD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+ {B4CD5E33-03CC-427D-A358-39360D6E4AD0}.Release|Any CPU.Build.0 = Release|Any CPU\r
+ {B4CD5E33-03CC-427D-A358-39360D6E4AD0}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+ {25332B1A-85A4-47DB-AC50-97A6F418ED22}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+ {25332B1A-85A4-47DB-AC50-97A6F418ED22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+ {25332B1A-85A4-47DB-AC50-97A6F418ED22}.Release|Any CPU.Build.0 = Release|Any CPU\r
+ {25332B1A-85A4-47DB-AC50-97A6F418ED22}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+ {F212C7FF-0FC5-4319-BD72-87DB3A4CC55F}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+ {F212C7FF-0FC5-4319-BD72-87DB3A4CC55F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+ {F212C7FF-0FC5-4319-BD72-87DB3A4CC55F}.Release|Any CPU.Build.0 = Release|Any CPU\r
+ {F212C7FF-0FC5-4319-BD72-87DB3A4CC55F}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+ {058E953D-3986-4F74-8516-5A50D267D36A}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+ {058E953D-3986-4F74-8516-5A50D267D36A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+ {058E953D-3986-4F74-8516-5A50D267D36A}.Release|Any CPU.Build.0 = Release|Any CPU\r
+ {058E953D-3986-4F74-8516-5A50D267D36A}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+ {9D7ADB99-6E53-4E3E-A13B-6D82412B3671}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+ {9D7ADB99-6E53-4E3E-A13B-6D82412B3671}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+ {9D7ADB99-6E53-4E3E-A13B-6D82412B3671}.Release|Any CPU.Build.0 = Release|Any CPU\r
+ {9D7ADB99-6E53-4E3E-A13B-6D82412B3671}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+ {0FC9CFF6-95CE-4C2D-833D-F6D697CD57EB}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+ {0FC9CFF6-95CE-4C2D-833D-F6D697CD57EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+ {0FC9CFF6-95CE-4C2D-833D-F6D697CD57EB}.Release|Any CPU.Build.0 = Release|Any CPU\r
+ {0FC9CFF6-95CE-4C2D-833D-F6D697CD57EB}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+ EndGlobalSection\r
+EndGlobal\r
--- /dev/null
+namespace AppliStation.Util\r
+{\r
+ partial class ExceptionDialogForm\r
+ {\r
+ /// <summary>\r
+ /// Designer variable used to keep track of non-visual components.\r
+ /// </summary>\r
+ private System.ComponentModel.IContainer components = null;\r
+ \r
+ /// <summary>\r
+ /// Disposes resources used by the form.\r
+ /// </summary>\r
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>\r
+ protected override void Dispose(bool disposing)\r
+ {\r
+ if (disposing) {\r
+ if (components != null) {\r
+ components.Dispose();\r
+ }\r
+ }\r
+ base.Dispose(disposing);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// This method is required for Windows Forms designer support.\r
+ /// Do not change the method contents inside the source code editor. The Forms designer might\r
+ /// not be able to load this method if it was changed manually.\r
+ /// </summary>\r
+ private void InitializeComponent()\r
+ {\r
+ this.label1 = new System.Windows.Forms.Label();\r
+ this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\r
+ this.detailTextBox = new System.Windows.Forms.TextBox();\r
+ this.buttonsPanel = new System.Windows.Forms.FlowLayoutPanel();\r
+ this.viewDetailButton = new System.Windows.Forms.Button();\r
+ this.quitButton = new System.Windows.Forms.Button();\r
+ this.continueButton = new System.Windows.Forms.Button();\r
+ this.tableLayoutPanel1.SuspendLayout();\r
+ this.buttonsPanel.SuspendLayout();\r
+ this.SuspendLayout();\r
+ // \r
+ // label1\r
+ // \r
+ this.label1.Dock = System.Windows.Forms.DockStyle.Fill;\r
+ this.label1.Location = new System.Drawing.Point(8, 8);\r
+ this.label1.Margin = new System.Windows.Forms.Padding(8);\r
+ this.label1.Name = "label1";\r
+ this.label1.RightToLeft = System.Windows.Forms.RightToLeft.No;\r
+ this.label1.Size = new System.Drawing.Size(408, 84);\r
+ this.label1.TabIndex = 0;\r
+ this.label1.Text = "ご迷惑をかけて申し訳ありません。AppliStationの実行中に予期せぬエラーが発生いたしました。\r\n\r\n動作を継続すればAppliStationはご利用いただ" +\r
+ "けますが、正常な動作をしないことがありえます。";\r
+ this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\r
+ // \r
+ // tableLayoutPanel1\r
+ // \r
+ this.tableLayoutPanel1.ColumnCount = 1;\r
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 414F));\r
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\r
+ this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0);\r
+ this.tableLayoutPanel1.Controls.Add(this.detailTextBox, 0, 2);\r
+ this.tableLayoutPanel1.Controls.Add(this.buttonsPanel, 0, 1);\r
+ this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\r
+ this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);\r
+ this.tableLayoutPanel1.Name = "tableLayoutPanel1";\r
+ this.tableLayoutPanel1.RowCount = 3;\r
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 100F));\r
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\r
+ this.tableLayoutPanel1.Size = new System.Drawing.Size(424, 136);\r
+ this.tableLayoutPanel1.TabIndex = 0;\r
+ // \r
+ // detailTextBox\r
+ // \r
+ this.detailTextBox.Dock = System.Windows.Forms.DockStyle.Fill;\r
+ this.detailTextBox.ImeMode = System.Windows.Forms.ImeMode.Off;\r
+ this.detailTextBox.Location = new System.Drawing.Point(12, 148);\r
+ this.detailTextBox.Margin = new System.Windows.Forms.Padding(12);\r
+ this.detailTextBox.Multiline = true;\r
+ this.detailTextBox.Name = "detailTextBox";\r
+ this.detailTextBox.ReadOnly = true;\r
+ this.detailTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;\r
+ this.detailTextBox.Size = new System.Drawing.Size(400, 1);\r
+ this.detailTextBox.TabIndex = 5;\r
+ this.detailTextBox.Visible = false;\r
+ // \r
+ // buttonsPanel\r
+ // \r
+ this.buttonsPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r
+ this.buttonsPanel.AutoSize = true;\r
+ this.buttonsPanel.Controls.Add(this.viewDetailButton);\r
+ this.buttonsPanel.Controls.Add(this.quitButton);\r
+ this.buttonsPanel.Controls.Add(this.continueButton);\r
+ this.buttonsPanel.Location = new System.Drawing.Point(18, 103);\r
+ this.buttonsPanel.Name = "buttonsPanel";\r
+ this.buttonsPanel.Size = new System.Drawing.Size(403, 30);\r
+ this.buttonsPanel.TabIndex = 4;\r
+ // \r
+ // viewDetailButton\r
+ // \r
+ this.viewDetailButton.Anchor = System.Windows.Forms.AnchorStyles.None;\r
+ this.viewDetailButton.AutoSize = true;\r
+ this.viewDetailButton.Location = new System.Drawing.Point(3, 4);\r
+ this.viewDetailButton.Margin = new System.Windows.Forms.Padding(3, 3, 10, 3);\r
+ this.viewDetailButton.Name = "viewDetailButton";\r
+ this.viewDetailButton.Size = new System.Drawing.Size(125, 22);\r
+ this.viewDetailButton.TabIndex = 0;\r
+ this.viewDetailButton.Text = "エラーの詳細を表示(&D)";\r
+ this.viewDetailButton.Click += new System.EventHandler(this.ViewDetailLabelLinkClicked);\r
+ // \r
+ // quitButton\r
+ // \r
+ this.quitButton.AutoSize = true;\r
+ this.quitButton.DialogResult = System.Windows.Forms.DialogResult.OK;\r
+ this.quitButton.Location = new System.Drawing.Point(141, 3);\r
+ this.quitButton.Name = "quitButton";\r
+ this.quitButton.Size = new System.Drawing.Size(129, 24);\r
+ this.quitButton.TabIndex = 1;\r
+ this.quitButton.Text = "AppliStationを終了(&X)";\r
+ this.quitButton.UseVisualStyleBackColor = true;\r
+ // \r
+ // continueButton\r
+ // \r
+ this.continueButton.AutoSize = true;\r
+ this.continueButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r
+ this.continueButton.Location = new System.Drawing.Point(276, 3);\r
+ this.continueButton.Name = "continueButton";\r
+ this.continueButton.Size = new System.Drawing.Size(124, 24);\r
+ this.continueButton.TabIndex = 2;\r
+ this.continueButton.Text = "強制的に動作継続(&C)";\r
+ this.continueButton.UseVisualStyleBackColor = true;\r
+ // \r
+ // ExceptionDialogForm\r
+ // \r
+ this.AcceptButton = this.quitButton;\r
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
+ this.AutoSize = true;\r
+ this.CancelButton = this.continueButton;\r
+ this.ClientSize = new System.Drawing.Size(424, 136);\r
+ this.Controls.Add(this.tableLayoutPanel1);\r
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;\r
+ this.MaximizeBox = false;\r
+ this.Name = "ExceptionDialogForm";\r
+ this.ShowIcon = false;\r
+ this.ShowInTaskbar = false;\r
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\r
+ this.Text = "AppliStationのエラー発生";\r
+ this.Shown += new System.EventHandler(this.Form_Shown);\r
+ this.tableLayoutPanel1.ResumeLayout(false);\r
+ this.tableLayoutPanel1.PerformLayout();\r
+ this.buttonsPanel.ResumeLayout(false);\r
+ this.buttonsPanel.PerformLayout();\r
+ this.ResumeLayout(false);\r
+ }\r
+ private System.Windows.Forms.FlowLayoutPanel buttonsPanel;\r
+ private System.Windows.Forms.TextBox detailTextBox;\r
+ private System.Windows.Forms.Button continueButton;\r
+ private System.Windows.Forms.Button quitButton;\r
+ private System.Windows.Forms.Button viewDetailButton;\r
+ private System.Windows.Forms.Label label1;\r
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.Drawing;\r
+using System.Windows.Forms;\r
+\r
+namespace AppliStation.Util\r
+{\r
+ /// <summary>\r
+ /// Description of ExceptionDialogForm.\r
+ /// </summary>\r
+ public partial class ExceptionDialogForm : Form\r
+ {\r
+ public ExceptionDialogForm()\r
+ {\r
+ //\r
+ // The InitializeComponent() call is required for Windows Forms designer support.\r
+ //\r
+ InitializeComponent();\r
+ }\r
+ \r
+ private static void Application_ThrowException(Exception e)\r
+ {\r
+ ExceptionDialogForm form = new ExceptionDialogForm();\r
+ if (e != null) {\r
+ form.detailTextBox.Text = e.ToString() + System.Environment.NewLine + e.StackTrace;\r
+ } else {\r
+ form.viewDetailButton.Visible = false;\r
+ }\r
+ \r
+ switch (form.ShowDialog()) {\r
+ case DialogResult.Cancel:\r
+ return;\r
+ default:\r
+ Application.Exit();\r
+ break;\r
+ }\r
+ }\r
+ \r
+ public static void Application_ThrowException(object sender, System.Threading.ThreadExceptionEventArgs e)\r
+ {\r
+ Application_ThrowException(e.Exception);\r
+ }\r
+ \r
+ public static void Application_ThrowException(object sender, UnhandledExceptionEventArgs e)\r
+ {\r
+ Application_ThrowException((Exception) e.ExceptionObject);\r
+ }\r
+ \r
+ void ViewDetailLabelLinkClicked(object sender, EventArgs e)\r
+ {\r
+ this.detailTextBox.Visible = true;\r
+ this.viewDetailButton.Enabled = false;\r
+ this.Size = new Size(this.Size.Width, this.Size.Height + 250);\r
+ }\r
+ \r
+ void Form_Shown(object sender, EventArgs e)\r
+ {\r
+ this.quitButton.Focus();\r
+ }\r
+ }\r
+}\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<root>\r
+ <!-- \r
+ Microsoft ResX Schema \r
+ \r
+ Version 2.0\r
+ \r
+ The primary goals of this format is to allow a simple XML format \r
+ that is mostly human readable. The generation and parsing of the \r
+ various data types are done through the TypeConverter classes \r
+ associated with the data types.\r
+ \r
+ Example:\r
+ \r
+ ... ado.net/XML headers & schema ...\r
+ <resheader name="resmimetype">text/microsoft-resx</resheader>\r
+ <resheader name="version">2.0</resheader>\r
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
+ <value>[base64 mime encoded serialized .NET Framework object]</value>\r
+ </data>\r
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
+ <comment>This is a comment</comment>\r
+ </data>\r
+ \r
+ There are any number of "resheader" rows that contain simple \r
+ name/value pairs.\r
+ \r
+ Each data row contains a name, and value. The row also contains a \r
+ type or mimetype. Type corresponds to a .NET class that support \r
+ text/value conversion through the TypeConverter architecture. \r
+ Classes that don't support this are serialized and stored with the \r
+ mimetype set.\r
+ \r
+ The mimetype is used for serialized objects, and tells the \r
+ ResXResourceReader how to depersist the object. This is currently not \r
+ extensible. For a given mimetype the value must be set accordingly:\r
+ \r
+ Note - application/x-microsoft.net.object.binary.base64 is the format \r
+ that the ResXResourceWriter will generate, however the reader can \r
+ read any of the formats listed below.\r
+ \r
+ mimetype: application/x-microsoft.net.object.binary.base64\r
+ value : The object must be serialized with \r
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
+ : and then encoded with base64 encoding.\r
+ \r
+ mimetype: application/x-microsoft.net.object.soap.base64\r
+ value : The object must be serialized with \r
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+ : and then encoded with base64 encoding.\r
+\r
+ mimetype: application/x-microsoft.net.object.bytearray.base64\r
+ value : The object must be serialized into a byte array \r
+ : using a System.ComponentModel.TypeConverter\r
+ : and then encoded with base64 encoding.\r
+ -->\r
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
+ <xsd:element name="root" msdata:IsDataSet="true">\r
+ <xsd:complexType>\r
+ <xsd:choice maxOccurs="unbounded">\r
+ <xsd:element name="metadata">\r
+ <xsd:complexType>\r
+ <xsd:sequence>\r
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
+ </xsd:sequence>\r
+ <xsd:attribute name="name" use="required" type="xsd:string" />\r
+ <xsd:attribute name="type" type="xsd:string" />\r
+ <xsd:attribute name="mimetype" type="xsd:string" />\r
+ <xsd:attribute ref="xml:space" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ <xsd:element name="assembly">\r
+ <xsd:complexType>\r
+ <xsd:attribute name="alias" type="xsd:string" />\r
+ <xsd:attribute name="name" type="xsd:string" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ <xsd:element name="data">\r
+ <xsd:complexType>\r
+ <xsd:sequence>\r
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
+ </xsd:sequence>\r
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
+ <xsd:attribute ref="xml:space" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ <xsd:element name="resheader">\r
+ <xsd:complexType>\r
+ <xsd:sequence>\r
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+ </xsd:sequence>\r
+ <xsd:attribute name="name" type="xsd:string" use="required" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ </xsd:choice>\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ </xsd:schema>\r
+ <resheader name="resmimetype">\r
+ <value>text/microsoft-resx</value>\r
+ </resheader>\r
+ <resheader name="version">\r
+ <value>2.0</value>\r
+ </resheader>\r
+ <resheader name="reader">\r
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+ </resheader>\r
+ <resheader name="writer">\r
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+ </resheader>\r
+</root>
\ No newline at end of file
--- /dev/null
+\r
+namespace AppliStation.Util\r
+{\r
+ partial class ExecutionProgressViewer\r
+ {\r
+ /// <summary>\r
+ /// Designer variable used to keep track of non-visual components.\r
+ /// </summary>\r
+ private System.ComponentModel.IContainer components = null;\r
+ \r
+ /// <summary>\r
+ /// Disposes resources used by the form.\r
+ /// </summary>\r
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>\r
+ protected override void Dispose(bool disposing)\r
+ {\r
+ if (disposing) {\r
+ if (components != null) {\r
+ components.Dispose();\r
+ }\r
+ }\r
+ base.Dispose(disposing);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// This method is required for Windows Forms designer support.\r
+ /// Do not change the method contents inside the source code editor. The Forms designer might\r
+ /// not be able to load this method if it was changed manually.\r
+ /// </summary>\r
+ private void InitializeComponent()\r
+ {\r
+ this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\r
+ this.progressSubLabel = new System.Windows.Forms.Label();\r
+ this.subtitleLabel = new System.Windows.Forms.Label();\r
+ this.progressBar = new System.Windows.Forms.ProgressBar();\r
+ this.progressLabel = new System.Windows.Forms.Label();\r
+ this.progressBarSub = new System.Windows.Forms.ProgressBar();\r
+ this.bottomPanel = new System.Windows.Forms.FlowLayoutPanel();\r
+ this.okButton = new System.Windows.Forms.Button();\r
+ this.cancelButton = new System.Windows.Forms.Button();\r
+ this.logBox = new System.Windows.Forms.RichTextBox();\r
+ this.tableLayoutPanel1.SuspendLayout();\r
+ this.bottomPanel.SuspendLayout();\r
+ this.SuspendLayout();\r
+ // \r
+ // tableLayoutPanel1\r
+ // \r
+ this.tableLayoutPanel1.ColumnCount = 1;\r
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\r
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\r
+ this.tableLayoutPanel1.Controls.Add(this.progressSubLabel, 0, 5);\r
+ this.tableLayoutPanel1.Controls.Add(this.subtitleLabel, 0, 0);\r
+ this.tableLayoutPanel1.Controls.Add(this.progressBar, 0, 1);\r
+ this.tableLayoutPanel1.Controls.Add(this.progressLabel, 0, 2);\r
+ this.tableLayoutPanel1.Controls.Add(this.progressBarSub, 0, 4);\r
+ this.tableLayoutPanel1.Controls.Add(this.bottomPanel, 0, 7);\r
+ this.tableLayoutPanel1.Controls.Add(this.logBox, 0, 6);\r
+ this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\r
+ this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);\r
+ this.tableLayoutPanel1.Name = "tableLayoutPanel1";\r
+ this.tableLayoutPanel1.RowCount = 8;\r
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50F));\r
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\r
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
+ this.tableLayoutPanel1.Size = new System.Drawing.Size(444, 318);\r
+ this.tableLayoutPanel1.TabIndex = 0;\r
+ // \r
+ // progressSubLabel\r
+ // \r
+ this.progressSubLabel.Dock = System.Windows.Forms.DockStyle.Fill;\r
+ this.progressSubLabel.Location = new System.Drawing.Point(10, 128);\r
+ this.progressSubLabel.Margin = new System.Windows.Forms.Padding(10, 0, 3, 0);\r
+ this.progressSubLabel.Name = "progressSubLabel";\r
+ this.progressSubLabel.Size = new System.Drawing.Size(431, 26);\r
+ this.progressSubLabel.TabIndex = 6;\r
+ this.progressSubLabel.Text = "しばらくお待ちください...";\r
+ this.progressSubLabel.Visible = false;\r
+ // \r
+ // subtitleLabel\r
+ // \r
+ this.subtitleLabel.Dock = System.Windows.Forms.DockStyle.Bottom;\r
+ this.subtitleLabel.Location = new System.Drawing.Point(3, 27);\r
+ this.subtitleLabel.Name = "subtitleLabel";\r
+ this.subtitleLabel.Size = new System.Drawing.Size(438, 23);\r
+ this.subtitleLabel.TabIndex = 0;\r
+ this.subtitleLabel.Text = "しばらくお待ちください...";\r
+ // \r
+ // progressBar\r
+ // \r
+ this.progressBar.Dock = System.Windows.Forms.DockStyle.Top;\r
+ this.progressBar.Location = new System.Drawing.Point(10, 53);\r
+ this.progressBar.Margin = new System.Windows.Forms.Padding(10, 3, 10, 3);\r
+ this.progressBar.Name = "progressBar";\r
+ this.progressBar.Size = new System.Drawing.Size(424, 20);\r
+ this.progressBar.Style = System.Windows.Forms.ProgressBarStyle.Marquee;\r
+ this.progressBar.TabIndex = 2;\r
+ // \r
+ // progressLabel\r
+ // \r
+ this.progressLabel.Dock = System.Windows.Forms.DockStyle.Fill;\r
+ this.progressLabel.Location = new System.Drawing.Point(10, 76);\r
+ this.progressLabel.Margin = new System.Windows.Forms.Padding(10, 0, 3, 0);\r
+ this.progressLabel.Name = "progressLabel";\r
+ this.progressLabel.Size = new System.Drawing.Size(431, 26);\r
+ this.progressLabel.TabIndex = 3;\r
+ this.progressLabel.Text = "しばらくお待ちください...";\r
+ // \r
+ // progressBarSub\r
+ // \r
+ this.progressBarSub.Dock = System.Windows.Forms.DockStyle.Top;\r
+ this.progressBarSub.Location = new System.Drawing.Point(10, 105);\r
+ this.progressBarSub.Margin = new System.Windows.Forms.Padding(10, 3, 10, 3);\r
+ this.progressBarSub.Name = "progressBarSub";\r
+ this.progressBarSub.Size = new System.Drawing.Size(424, 20);\r
+ this.progressBarSub.Style = System.Windows.Forms.ProgressBarStyle.Continuous;\r
+ this.progressBarSub.TabIndex = 5;\r
+ this.progressBarSub.Visible = false;\r
+ // \r
+ // bottomPanel\r
+ // \r
+ this.bottomPanel.AutoSize = true;\r
+ this.bottomPanel.Controls.Add(this.okButton);\r
+ this.bottomPanel.Controls.Add(this.cancelButton);\r
+ this.bottomPanel.Dock = System.Windows.Forms.DockStyle.Right;\r
+ this.bottomPanel.Location = new System.Drawing.Point(279, 286);\r
+ this.bottomPanel.Name = "bottomPanel";\r
+ this.bottomPanel.Size = new System.Drawing.Size(162, 29);\r
+ this.bottomPanel.TabIndex = 4;\r
+ // \r
+ // okButton\r
+ // \r
+ this.okButton.Enabled = false;\r
+ this.okButton.Location = new System.Drawing.Point(3, 3);\r
+ this.okButton.Name = "okButton";\r
+ this.okButton.Size = new System.Drawing.Size(75, 23);\r
+ this.okButton.TabIndex = 0;\r
+ this.okButton.Text = "OK";\r
+ this.okButton.UseVisualStyleBackColor = true;\r
+ this.okButton.Click += new System.EventHandler(this.OkButtonClick);\r
+ // \r
+ // cancelButton\r
+ // \r
+ this.cancelButton.Enabled = false;\r
+ this.cancelButton.Location = new System.Drawing.Point(84, 3);\r
+ this.cancelButton.Name = "cancelButton";\r
+ this.cancelButton.Size = new System.Drawing.Size(75, 23);\r
+ this.cancelButton.TabIndex = 1;\r
+ this.cancelButton.Text = "キャンセル";\r
+ this.cancelButton.UseVisualStyleBackColor = true;\r
+ this.cancelButton.Click += new System.EventHandler(this.CancelButtonClick);\r
+ // \r
+ // logBox\r
+ // \r
+ this.logBox.BackColor = System.Drawing.SystemColors.Control;\r
+ this.logBox.DetectUrls = false;\r
+ this.logBox.Dock = System.Windows.Forms.DockStyle.Fill;\r
+ this.logBox.ForeColor = System.Drawing.SystemColors.ControlText;\r
+ this.logBox.Location = new System.Drawing.Point(10, 157);\r
+ this.logBox.Margin = new System.Windows.Forms.Padding(10, 3, 3, 3);\r
+ this.logBox.Name = "logBox";\r
+ this.logBox.ReadOnly = true;\r
+ this.logBox.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.ForcedVertical;\r
+ this.logBox.Size = new System.Drawing.Size(431, 123);\r
+ this.logBox.TabIndex = 8;\r
+ this.logBox.Text = "";\r
+ // \r
+ // ExecutionProgressViewer\r
+ // \r
+ this.AcceptButton = this.okButton;\r
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
+ this.ClientSize = new System.Drawing.Size(444, 318);\r
+ this.Controls.Add(this.tableLayoutPanel1);\r
+ this.MaximizeBox = false;\r
+ this.Name = "ExecutionProgressViewer";\r
+ this.ShowIcon = false;\r
+ this.Text = "AppliStation";\r
+ this.Shown += new System.EventHandler(this.ExecutionProgressViewerShown);\r
+ this.tableLayoutPanel1.ResumeLayout(false);\r
+ this.tableLayoutPanel1.PerformLayout();\r
+ this.bottomPanel.ResumeLayout(false);\r
+ this.ResumeLayout(false);\r
+ }\r
+ private System.Windows.Forms.Button cancelButton;\r
+ private System.Windows.Forms.Button okButton;\r
+ private System.Windows.Forms.RichTextBox logBox;\r
+ private System.Windows.Forms.Label progressSubLabel;\r
+ private System.Windows.Forms.ProgressBar progressBarSub;\r
+ private System.Windows.Forms.FlowLayoutPanel bottomPanel;\r
+ private System.Windows.Forms.Label progressLabel;\r
+ private System.Windows.Forms.ProgressBar progressBar;\r
+ private System.Windows.Forms.Label subtitleLabel;\r
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.Drawing;\r
+using System.Windows.Forms;\r
+using System.Threading;\r
+using NaGet.SubCommands;\r
+using NaGet.Net;\r
+\r
+namespace AppliStation.Util\r
+{\r
+ /// <summary>\r
+ /// Description of ExecutionProgressViewer.\r
+ /// </summary>\r
+ public partial class ExecutionProgressViewer : Form\r
+ {\r
+ private NaGetTaskSet taskSet;\r
+ \r
+ private Downloader downloader;\r
+ \r
+ private Thread tasksetRunningThread = null;\r
+ \r
+ public Downloader Downloader {\r
+ get { return downloader; }\r
+ }\r
+ \r
+ public ExecutionProgressViewer()\r
+ {\r
+ //\r
+ // The InitializeComponent() call is required for Windows Forms designer support.\r
+ //\r
+ InitializeComponent();\r
+ \r
+ downloader = new Downloader();\r
+ downloader.DownloadEventRaised += delegate(object sender, DownloadEventArgs e) {\r
+ if (InvokeRequired) {\r
+ Invoke(new EventHandler<DownloadEventArgs>(onDownloadEvent), sender, e);\r
+ } else {\r
+ onDownloadEvent(sender, e);\r
+ }\r
+ };\r
+ }\r
+ \r
+ private void onDownloadEvent(object sender, DownloadEventArgs a)\r
+ {\r
+ if (a.TaskProgressPercent >= 0) {\r
+ progressBarSub.Value = (int) a.TaskProgressPercent;\r
+ progressBarSub.Style = ProgressBarStyle.Continuous;\r
+ } else {\r
+ progressBarSub.Style = ProgressBarStyle.Marquee;\r
+ }\r
+ \r
+ switch (a.Type) {\r
+ case DownloadEventType.INITED:\r
+ case DownloadEventType.CONNECTED:\r
+ progressSubLabel.Text = a.TaskMessage;\r
+ \r
+ progressBarSub.Visible = true;\r
+ progressSubLabel.Visible = true;\r
+ break;\r
+ case DownloadEventType.DOWNLOADING:\r
+ progressSubLabel.Text = a.TaskMessage;\r
+ break;\r
+ case DownloadEventType.COMPLETED:\r
+ progressBarSub.Visible = false;\r
+ progressSubLabel.Visible = false;\r
+ break;\r
+ case DownloadEventType.ERROR:\r
+ progressBarSub.Visible = false;\r
+ progressSubLabel.Visible = false;\r
+ \r
+ logBox.SelectionColor = System.Drawing.Color.Red;\r
+ logBox.AppendText(" [\83G\83\89\81[] " + a.TaskMessage + System.Environment.NewLine);\r
+ logBox.SelectionColor = logBox.ForeColor;\r
+ break;\r
+ }\r
+ }\r
+ \r
+ #region NaGetTaskSet\8aÖ\98A\r
+ \r
+ private void onTaskSetRaised(object sender, NaGetTaskSetEventArgs e)\r
+ {\r
+ NaGetTaskSet taskSet = (NaGetTaskSet) sender;\r
+ \r
+ if (e.TaskProgressPercent >= 0) {\r
+ progressBar.Value = (int) e.TaskProgressPercent;\r
+ progressBar.Style = ProgressBarStyle.Continuous;\r
+ } else {\r
+ progressBar.Style = ProgressBarStyle.Marquee;\r
+ }\r
+ progressLabel.Text = e.TaskMessage ?? string.Empty;\r
+ \r
+ cancelButton.Enabled = taskSet.Running && taskSet.Cancelable;\r
+ \r
+ switch (e.Type) {\r
+ case NaGetTaskSetEventType.COMPLETED:\r
+ logBox.AppendText("\8a®\97¹." + System.Environment.NewLine);\r
+ if (taskSet.Done) {\r
+ okButton.Enabled = true;\r
+ cancelButton.Enabled = false;\r
+ }\r
+ break;\r
+ case NaGetTaskSetEventType.STARTED_TASKSET:\r
+ subtitleLabel.Text = taskSet.TaskSetNames[taskSet.CurrentTaskSetIndex];\r
+ logBox.AppendText(" " + e.TaskMessage + System.Environment.NewLine);\r
+ break;\r
+ case NaGetTaskSetEventType.COMPLETED_TASKSET:\r
+ if (progressBarSub.Visible) progressBarSub.Hide();\r
+ if (progressSubLabel.Visible) progressSubLabel.Hide();\r
+ \r
+ NativeMethods.ProgressBar_SetState(progressBar, 1); // VistaProgress\90F\81F\83m\81[\83}\83\8b\r
+ \r
+ logBox.AppendText(string.Format(" ... \8a®\97¹. [{0}%]", (int) e.TaskProgressPercent));\r
+ logBox.AppendText(System.Environment.NewLine);\r
+ break;\r
+ case NaGetTaskSetEventType.INFO:\r
+ logBox.AppendText(" " + e.TaskMessage + System.Environment.NewLine);\r
+ break;\r
+ case NaGetTaskSetEventType.ERROR:\r
+ logBox.SelectionColor = System.Drawing.Color.Red;\r
+ logBox.AppendText(" [\83G\83\89\81[] " + e.TaskMessage + System.Environment.NewLine);\r
+ logBox.SelectionColor = logBox.ForeColor;\r
+ \r
+ NativeMethods.ProgressBar_SetState(progressBar, 2); // VistaProgress\90F\81F\83G\83\89\81[\r
+ \r
+ okButton.Enabled = true;\r
+ cancelButton.Enabled = false;\r
+ break;\r
+ case NaGetTaskSetEventType.CANCELED:\r
+ logBox.SelectionColor = System.Drawing.Color.Red;\r
+ logBox.AppendText(e.TaskMessage + System.Environment.NewLine);\r
+ logBox.SelectionColor = logBox.ForeColor;\r
+ \r
+ NativeMethods.ProgressBar_SetState(progressBar, 1); // VistaProgress\90F\81F\92\86\92f\r
+ \r
+ okButton.Enabled = true;\r
+ cancelButton.Enabled = false;\r
+ break;\r
+ case NaGetTaskSetEventType.WARNING:\r
+ logBox.SelectionColor = System.Drawing.Color.Red;\r
+ logBox.AppendText(" [\83G\83\89\81[] " + e.TaskMessage + System.Environment.NewLine);\r
+ logBox.SelectionColor = logBox.ForeColor;\r
+ \r
+ break;\r
+ }\r
+ \r
+ if (taskSet.Done) {\r
+ NativeMethods.Form_FlashWindow(this,\r
+ NativeMethods.FlashFlag.All | NativeMethods.FlashFlag.TimerNoFG,\r
+ uint.MaxValue, 0);\r
+ }\r
+ }\r
+ \r
+ public void SetTaskSet(NaGetTaskSet taskSet)\r
+ {\r
+ this.taskSet = taskSet;\r
+ \r
+ taskSet.TaskSetRaised += delegate(object sender, NaGetTaskSetEventArgs e) {\r
+ if (InvokeRequired) {\r
+ Invoke(new EventHandler<NaGetTaskSetEventArgs>(onTaskSetRaised), taskSet, e);\r
+ } else {\r
+ onTaskSetRaised(taskSet, e);\r
+ }\r
+ };\r
+ }\r
+\r
+ public void StartTaskSet()\r
+ {\r
+ tasksetRunningThread = new Thread(taskSet.Run);\r
+ tasksetRunningThread.Start();\r
+ }\r
+ \r
+ #endregion\r
+ \r
+ void OkButtonClick(object sender, EventArgs e)\r
+ {\r
+ if (taskSet == null || taskSet.Done) {\r
+ this.Close();\r
+ this.Dispose();\r
+ }\r
+ }\r
+ \r
+ void CancelButtonClick(object sender, EventArgs e)\r
+ {\r
+ if (InvokeRequired) {\r
+ Invoke(new EventHandler(CancelButtonClickConcrete), sender, e);\r
+ } else {\r
+ CancelButtonClickConcrete(sender,e);\r
+ }\r
+ }\r
+ \r
+ void CancelButtonClickConcrete(object sender, EventArgs e)\r
+ {\r
+ if (taskSet != null && taskSet.Running && taskSet.Cancelable) {\r
+ cancelButton.Enabled = false;\r
+ \r
+ NativeMethods.ProgressBar_SetState(progressBar, 3); // VistaProgress\90F\81F\92\86\92f\r
+ \r
+ taskSet.Cancel();\r
+ }\r
+ }\r
+ \r
+ void ExecutionProgressViewerShown(object sender, EventArgs e)\r
+ {\r
+ this.BringToFront();\r
+ }\r
+ }\r
+}\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<root>\r
+ <!-- \r
+ Microsoft ResX Schema \r
+ \r
+ Version 2.0\r
+ \r
+ The primary goals of this format is to allow a simple XML format \r
+ that is mostly human readable. The generation and parsing of the \r
+ various data types are done through the TypeConverter classes \r
+ associated with the data types.\r
+ \r
+ Example:\r
+ \r
+ ... ado.net/XML headers & schema ...\r
+ <resheader name="resmimetype">text/microsoft-resx</resheader>\r
+ <resheader name="version">2.0</resheader>\r
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
+ <value>[base64 mime encoded serialized .NET Framework object]</value>\r
+ </data>\r
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
+ <comment>This is a comment</comment>\r
+ </data>\r
+ \r
+ There are any number of "resheader" rows that contain simple \r
+ name/value pairs.\r
+ \r
+ Each data row contains a name, and value. The row also contains a \r
+ type or mimetype. Type corresponds to a .NET class that support \r
+ text/value conversion through the TypeConverter architecture. \r
+ Classes that don't support this are serialized and stored with the \r
+ mimetype set.\r
+ \r
+ The mimetype is used for serialized objects, and tells the \r
+ ResXResourceReader how to depersist the object. This is currently not \r
+ extensible. For a given mimetype the value must be set accordingly:\r
+ \r
+ Note - application/x-microsoft.net.object.binary.base64 is the format \r
+ that the ResXResourceWriter will generate, however the reader can \r
+ read any of the formats listed below.\r
+ \r
+ mimetype: application/x-microsoft.net.object.binary.base64\r
+ value : The object must be serialized with \r
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
+ : and then encoded with base64 encoding.\r
+ \r
+ mimetype: application/x-microsoft.net.object.soap.base64\r
+ value : The object must be serialized with \r
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+ : and then encoded with base64 encoding.\r
+\r
+ mimetype: application/x-microsoft.net.object.bytearray.base64\r
+ value : The object must be serialized into a byte array \r
+ : using a System.ComponentModel.TypeConverter\r
+ : and then encoded with base64 encoding.\r
+ -->\r
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
+ <xsd:element name="root" msdata:IsDataSet="true">\r
+ <xsd:complexType>\r
+ <xsd:choice maxOccurs="unbounded">\r
+ <xsd:element name="metadata">\r
+ <xsd:complexType>\r
+ <xsd:sequence>\r
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
+ </xsd:sequence>\r
+ <xsd:attribute name="name" use="required" type="xsd:string" />\r
+ <xsd:attribute name="type" type="xsd:string" />\r
+ <xsd:attribute name="mimetype" type="xsd:string" />\r
+ <xsd:attribute ref="xml:space" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ <xsd:element name="assembly">\r
+ <xsd:complexType>\r
+ <xsd:attribute name="alias" type="xsd:string" />\r
+ <xsd:attribute name="name" type="xsd:string" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ <xsd:element name="data">\r
+ <xsd:complexType>\r
+ <xsd:sequence>\r
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
+ </xsd:sequence>\r
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
+ <xsd:attribute ref="xml:space" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ <xsd:element name="resheader">\r
+ <xsd:complexType>\r
+ <xsd:sequence>\r
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+ </xsd:sequence>\r
+ <xsd:attribute name="name" type="xsd:string" use="required" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ </xsd:choice>\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ </xsd:schema>\r
+ <resheader name="resmimetype">\r
+ <value>text/microsoft-resx</value>\r
+ </resheader>\r
+ <resheader name="version">\r
+ <value>2.0</value>\r
+ </resheader>\r
+ <resheader name="reader">\r
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+ </resheader>\r
+ <resheader name="writer">\r
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+ </resheader>\r
+</root>
\ No newline at end of file
--- /dev/null
+using System;\r
+using System.Drawing;\r
+using System.Windows.Forms;\r
+using NaGet.Packages;\r
+using NaGet.Packages.Install;\r
+using System.IO;\r
+using System.Collections.Generic;\r
+\r
+namespace AppliStation.Util\r
+{\r
+ class ListViewItemSortComparer : System.Collections.IComparer\r
+ {\r
+ public SortOrder Order = SortOrder.Ascending;\r
+ \r
+ public int Column = -1;\r
+ \r
+ public ListViewItemSortComparer(int index, SortOrder order)\r
+ {\r
+ this.Column = index;\r
+ this.Order = order;\r
+ }\r
+ \r
+ public int Compare(object x, object y)\r
+ {\r
+ ListViewItem itemx = (ListViewItem) x;\r
+ ListViewItem itemy = (ListViewItem) y;\r
+ \r
+ int result = -1;\r
+ result = string.Compare(itemx.SubItems[Column].Text,\r
+ itemy.SubItems[Column].Text);\r
+ \r
+ switch (Order) {\r
+ case SortOrder.Descending:\r
+ result = -result;\r
+ break;\r
+ case SortOrder.None:\r
+ result = 0;\r
+ break;\r
+ }\r
+ return result;\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.Runtime.InteropServices;\r
+using System.Windows.Forms;\r
+\r
+namespace AppliStation.Util\r
+{\r
+ public sealed class NativeMethods\r
+ {\r
+ private NativeMethods()\r
+ {\r
+ }\r
+ \r
+ \r
+ /// <summary>\r
+ /// WindowsVista\8cü\82¯\81A\83v\83\8d\83O\83\8c\83X\83o\81[\83X\83e\81[\83^\83X(\90F)\82ð\90Ý\92è\82·\82é\r
+ /// </summary>\r
+ /// <param name="progBar">\91Î\8fÛ\82Ì\83v\83\8d\83O\83\8c\83X\83o\81[</param>\r
+ /// <param name="state">\8fó\91Ô\81B(1:Normal,2:Error,3:Paused)</param>\r
+ public static void ProgressBar_SetState(ProgressBar progBar, uint state)\r
+ {\r
+ try {\r
+ // status := (PBST_NORMAL | PBST_ERROR | PBST_PAUSED)\r
+ // SendMessage(progressBar.Handle, PBM_SETSTATE, state, 0);\r
+ SendMessage(progBar.Handle, 0x410, state, 0);\r
+ } catch (Exception) {\r
+ }\r
+ }\r
+ \r
+ #region \83^\83X\83N\83o\81[\82¨\82æ\82Ñ\83^\83C\83g\83\8b\83o\81[\82Ì\83t\83\89\83b\83V\83\85\r
+ \r
+ /// <summary>\r
+ /// \83^\83X\83N\83o\81[\82¨\82æ\82Ñ\83^\83C\83g\83\8b\83o\81[\83{\83^\83\93\82Ì\83t\83\89\83b\83V\83\85\82Ì\90Ý\92è\83t\83\89\83O\r
+ /// </summary>\r
+ public enum FlashFlag : uint {\r
+ /// <summary>\r
+ /// \93_\96Å\82Ì\92â\8e~\r
+ /// </summary>\r
+ Stop = 0,\r
+ /// <summary>\r
+ /// \83^\83C\83g\83\8b\83o\81[\82ð\93_\96Å\r
+ /// </summary>\r
+ Caption = 1,\r
+ /// <summary>\r
+ /// \83^\83X\83N\83o\81[\83{\83^\83\93\82ð\93_\96Å\r
+ /// </summary>\r
+ Tray = 2,\r
+ /// <summary>\r
+ /// \83^\83C\83g\83\8b\83o\81[\82Æ\83^\83X\83N\83o\81[\83{\83^\83\93\82ð\93_\96Å\r
+ /// </summary>\r
+ All = 3,\r
+ /// <summary>\r
+ /// Stop\82ª\90Ý\92è\82³\82ê\82é\82Ü\82Å\93_\96Å\82·\82é\r
+ /// </summary>\r
+ Timer = 4,\r
+ /// <summary>\r
+ /// \83t\83H\83A\83O\83\89\83E\83\93\83h\82Ì\8fó\91Ô\82É\82È\82é\82Ü\82Å\93_\96Å\r
+ /// </summary>\r
+ TimerNoFG = 12,\r
+ }\r
+ \r
+ [StructLayout(LayoutKind.Sequential)]\r
+ struct FLASHWINFO\r
+ {\r
+ public int cbSize;\r
+ public IntPtr hWnd;\r
+ public FlashFlag dwFlags;\r
+ public uint uCount;\r
+ public uint dwTimeout;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \83^\83X\83N\83o\81[\82¨\82æ\82Ñ\83^\83C\83g\83\8b\83o\81[\83{\83^\83\93\82ð\93_\96Å\82³\82¹\82é\r
+ /// </summary>\r
+ /// <param name="form">\91Î\8fÛ\83t\83H\81[\83\80</param>\r
+ /// <param name="flag">\93_\96Å\83p\83\89\83\81\81[\83^\83t\83\89\83O</param>\r
+ /// <param name="count">\93_\96Å\89ñ\90\94</param>\r
+ /// <param name="timeout">\93_\96Å\82Ì\8aÔ\8au(\83~\83\8a\95b)</param>\r
+ /// <returns></returns>\r
+ public static bool Form_FlashWindow(Form form, FlashFlag flag, uint count, uint timeout)\r
+ {\r
+ try {\r
+ FLASHWINFO info = new FLASHWINFO();\r
+ info.cbSize = Marshal.SizeOf(typeof(FLASHWINFO));\r
+ info.hWnd = form.Handle;\r
+ info.dwFlags = flag;\r
+ info.uCount = count;\r
+ info.dwTimeout = timeout;\r
+ \r
+ return FlashWindowEx(ref info) == 0;\r
+ } catch (Exception) {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ [DllImport("user32.dll")]\r
+ static extern Int32 FlashWindowEx(ref FLASHWINFO pwfi);\r
+ \r
+ #endregion\r
+ \r
+ #region ColumnHeader\82Ì\83\\81[\83g\82Ì\8eO\8ap\88ó\97p\r
+ \r
+ [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]\r
+ internal struct HD_ITEM\r
+ {\r
+ public uint mask;\r
+ public int cxy;\r
+ [MarshalAs(UnmanagedType.LPTStr)]public string pszText;\r
+ public IntPtr hbm;\r
+ public int cchTextMax;\r
+ public int fmt;\r
+ [MarshalAs(UnmanagedType.LPTStr)]public string lParam;\r
+ public int iImage; // index of bitmap in ImageList\r
+ public int iOrder;\r
+ }\r
+ \r
+ internal static IntPtr ListView_GetHeader(ListView listview)\r
+ {\r
+ // SendMessage(hWnd, LVM_GETHEADER, 0, NULL);\r
+ return SendMessage(listview.Handle, 0x101E, 0, 0);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// WinXP\88È\8d~\81A\83\\81[\83g\82Ì\96î\88ó\82ð\95\\8e¦\r
+ /// </summary>\r
+ /// <param name="listView">\91Î\8fÛ\82ÌListView</param>\r
+ /// <param name="column">\95\\8e¦\82·\82é\96î\88ó\82Ì\83w\83b\83_</param>\r
+ /// <param name="order">\83\\81[\83g\82Ì\8f¸\8f\87\81E\8d~\8f\87</param>\r
+ public static void ColumnHeader_SetSortState(ListView listView, int column, SortOrder order)\r
+ {\r
+ try {\r
+ // SendMessage(hWnd, LVM_GETHEADER, NULL, NULL);\r
+ IntPtr hWnd = SendMessage(listView.Handle, 0x101F, 0, 0);\r
+ \r
+ HD_ITEM hdi = new HD_ITEM();\r
+ hdi.mask = 0x0004; // HDI_FORMAT;\r
+ for (int i = 0; i < listView.Columns.Count; i++) {\r
+ // SendMessage(hWnd, HDM_GETITEMW, i, &hdi);\r
+ SendMessage(hWnd, 0x120b, i, ref hdi);\r
+ \r
+ const int HDF_SORTUP = 0x400;\r
+ const int HDF_SORTDOWN = 0x200;\r
+ \r
+ if (i != column || order == SortOrder.None) {\r
+ hdi.fmt = hdi.fmt & ~(HDF_SORTUP | HDF_SORTDOWN);\r
+ } else if (order == SortOrder.Ascending) { // \8f¸\8f\87\r
+ hdi.fmt = hdi.fmt & ~HDF_SORTDOWN | HDF_SORTUP;\r
+ } else if (order == SortOrder.Descending) { // \8d~\8f\87\r
+ hdi.fmt = hdi.fmt & ~HDF_SORTUP | HDF_SORTDOWN;\r
+ }\r
+ \r
+ // SendMessage(hWnd, HDM_SETITEMW, i, &hdi);\r
+ SendMessage(hWnd, 0x120c, i, ref hdi);\r
+ }\r
+ } catch (Exception) {\r
+ }\r
+ }\r
+ \r
+ #endregion\r
+ \r
+ [DllImport("user32.dll", CharSet=CharSet.Auto)]\r
+ internal static extern IntPtr SendMessage( IntPtr hWnd, UInt32 Msg, UInt32 wParam, UInt32 lParam);\r
+ \r
+ [DllImport("user32.dll", CharSet=CharSet.Auto)]\r
+ internal static extern IntPtr SendMessage( IntPtr hWnd, UInt32 Msg, int wParam, ref HD_ITEM lParam);\r
+ }\r
+}\r
--- /dev/null
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <PropertyGroup>\r
+ <ProjectGuid>{0FC9CFF6-95CE-4C2D-833D-F6D697CD57EB}</ProjectGuid>\r
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>\r
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>\r
+ <OutputType>WinExe</OutputType>\r
+ <RootNamespace>AppliStation</RootNamespace>\r
+ <AssemblyName>AppliStation</AssemblyName>\r
+ <BaseIntermediateOutputPath>bin\</BaseIntermediateOutputPath>\r
+ <AllowUnsafeBlocks>False</AllowUnsafeBlocks>\r
+ <NoStdLib>False</NoStdLib>\r
+ <WarningLevel>4</WarningLevel>\r
+ <TreatWarningsAsErrors>false</TreatWarningsAsErrors>\r
+ <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">\r
+ <OutputPath>bin\Debug\</OutputPath>\r
+ <DebugSymbols>true</DebugSymbols>\r
+ <DebugType>Full</DebugType>\r
+ <Optimize>false</Optimize>\r
+ <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>\r
+ <DefineConstants>DEBUG;TRACE</DefineConstants>\r
+ <OutputType>WinExe</OutputType>\r
+ <AssemblyName>AppliStation</AssemblyName>\r
+ <RootNamespace>AppliStation</RootNamespace>\r
+ <AllowUnsafeBlocks>false</AllowUnsafeBlocks>\r
+ <WarningLevel>4</WarningLevel>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">\r
+ <OutputPath>bin\Release\</OutputPath>\r
+ <DebugSymbols>false</DebugSymbols>\r
+ <DebugType>None</DebugType>\r
+ <Optimize>true</Optimize>\r
+ <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>\r
+ <DefineConstants>TRACE</DefineConstants>\r
+ <OutputType>WinExe</OutputType>\r
+ <AssemblyName>AppliStation</AssemblyName>\r
+ <RootNamespace>AppliStation</RootNamespace>\r
+ <AllowUnsafeBlocks>false</AllowUnsafeBlocks>\r
+ <WarningLevel>4</WarningLevel>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">\r
+ <RegisterForComInterop>False</RegisterForComInterop>\r
+ <GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>\r
+ <BaseAddress>4194304</BaseAddress>\r
+ <PlatformTarget>AnyCPU</PlatformTarget>\r
+ <FileAlignment>4096</FileAlignment>\r
+ </PropertyGroup>\r
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />\r
+ <ItemGroup>\r
+ <Reference Include="System" />\r
+ <Reference Include="System.Drawing" />\r
+ <Reference Include="System.Drawing.Design" />\r
+ <Reference Include="System.Web" />\r
+ <Reference Include="System.Windows.Forms" />\r
+ <Reference Include="System.Xml" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <Compile Include="AppliStation.Util\ExceptionDialogForm.cs" />\r
+ <Compile Include="AppliStation.Util\ExceptionDialogForm.Designer.cs">\r
+ <DependentUpon>ExceptionDialogForm.cs</DependentUpon>\r
+ </Compile>\r
+ <Compile Include="AppliStation.Util\ExecutionProgressViewer.cs" />\r
+ <Compile Include="AppliStation.Util\ExecutionProgressViewer.Designer.cs">\r
+ <DependentUpon>ExecutionProgressViewer.cs</DependentUpon>\r
+ </Compile>\r
+ <Compile Include="AppliStation.Util\ListViewItemSortComparer.cs" />\r
+ <Compile Include="AppliStation.Util\NativeMethods.cs" />\r
+ <Compile Include="AssemblyInfo.cs" />\r
+ <Compile Include="ArgParse.cs" />\r
+ <Compile Include="PackageListViewForm.cs" />\r
+ <Compile Include="PackageListViewForm.Designer.cs">\r
+ <DependentUpon>PackageListViewForm.cs</DependentUpon>\r
+ </Compile>\r
+ <Compile Include="PackagesInstallConfirmForm.cs" />\r
+ <Compile Include="PackagesInstallConfirmForm.Designer.cs">\r
+ <DependentUpon>PackagesInstallConfirmForm.cs</DependentUpon>\r
+ </Compile>\r
+ <Compile Include="PackageUninstallConfirmForm.cs" />\r
+ <Compile Include="PackageUninstallConfirmForm.Designer.cs">\r
+ <DependentUpon>PackageUninstallConfirmForm.cs</DependentUpon>\r
+ </Compile>\r
+ <Compile Include="Program.cs" />\r
+ <EmbeddedResource Include="AppliStation.Util\ExceptionDialogForm.resx">\r
+ <DependentUpon>ExceptionDialogForm.Designer.cs</DependentUpon>\r
+ </EmbeddedResource>\r
+ <EmbeddedResource Include="AppliStation.Util\ExecutionProgressViewer.resx">\r
+ <DependentUpon>ExecutionProgressViewer.cs</DependentUpon>\r
+ </EmbeddedResource>\r
+ <EmbeddedResource Include="PackageListViewForm.resx">\r
+ <DependentUpon>PackageListViewForm.cs</DependentUpon>\r
+ </EmbeddedResource>\r
+ <EmbeddedResource Include="PackagesInstallConfirmForm.resx">\r
+ <DependentUpon>PackagesInstallConfirmForm.cs</DependentUpon>\r
+ </EmbeddedResource>\r
+ <EmbeddedResource Include="PackageUninstallConfirmForm.resx">\r
+ <DependentUpon>PackageUninstallConfirmForm.cs</DependentUpon>\r
+ </EmbeddedResource>\r
+ <None Include="SplashScreen.png">\r
+ <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
+ </None>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <Folder Include="AppliStation.Util" />\r
+ <ProjectReference Include="..\na-get-lib\na-get-lib.csproj">\r
+ <Project>{058E953D-3986-4F74-8516-5A50D267D36A}</Project>\r
+ <Name>na-get-lib</Name>\r
+ </ProjectReference>\r
+ </ItemGroup>\r
+</Project>
\ No newline at end of file
--- /dev/null
+using System;\r
+using System.Collections.Generic;\r
+using System.Text.RegularExpressions;\r
+\r
+namespace AppliStation\r
+{\r
+ /// <summary>\r
+ /// \92á\8b@\94\\82È\88ø\90\94\89ð\90Í\82ð\82·\82é\81B\r
+ /// </summary>\r
+ public class ArgParse\r
+ {\r
+ /// <summary>\r
+ /// \89ð\90Í\8c\8b\89Ê\r
+ /// </summary>\r
+ private Dictionary<string,object> opts;\r
+ \r
+ /// <summary>\r
+ /// \89ð\90Í\8c\8b\89Ê\82ð\83n\83b\83V\83\85\8e«\8f\91\82Æ\82µ\82Ä\8eæ\93¾\r
+ /// </summary>\r
+ public Dictionary<string, object> Opts {\r
+ get {\r
+ lock (opts) {\r
+ return opts;\r
+ }\r
+ }\r
+ }\r
+ \r
+ public ArgParse()\r
+ : this(new Dictionary<string,object>())\r
+ {\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \8f\89\8aú\89»\r
+ /// </summary>\r
+ /// <param name="hashDefault">\8f\89\8aú\82Ì\8e«\8f\91</param>\r
+ public ArgParse(Dictionary<string,object> hashDefault)\r
+ {\r
+ opts = hashDefault;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \83n\83b\83V\83\85\82Ì\92\86\90g\82ð\90Ý\92è\82 \82é\82¢\82Í\8eæ\93¾\82·\82é\81B\r
+ /// </summary>\r
+ public object this[string key] {\r
+ set {\r
+ lock(opts) {\r
+ opts[key] = value;\r
+ }\r
+ }\r
+ get {\r
+ lock(opts) {\r
+ return opts[key];\r
+ }\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \88ø\90\94\82ð\89ð\90Í\82·\82é\r
+ /// </summary>\r
+ /// <param name="args">\91Î\8fÛ\88ø\90\94</param>\r
+ /// <returns>\8ec\82Á\82½(\83I\83v\83V\83\87\83\93\82Å\82Í\82È\82¢)\88ø\90\94</returns>\r
+ public string[] Parse(string[] args)\r
+ {\r
+ List<string> rest = new List<string>();\r
+ lock (opts) {\r
+ bool disableOptionParse = false;\r
+ for (int i = 0; i < args.Length; i++) {\r
+ if (disableOptionParse || !args[i].StartsWith("-")) {\r
+ rest.Add(args[i]);\r
+ } else {\r
+ if (args[i].StartsWith("-")) {\r
+ if (args[i] == "--") {\r
+ // \83I\83v\83V\83\87\83\93\89ð\90Í\92\86\92f\r
+ disableOptionParse = true;\r
+ } else {\r
+ parseOption(args[i]);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ return rest.ToArray();\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \83I\83v\83V\83\87\83\93\83g\81[\83N\83\93\82Ì\89ð\90Í\r
+ /// </summary>\r
+ /// <param name="option"></param>\r
+ private void parseOption(string option)\r
+ {\r
+ Match match = Regex.Match(option, "^--?([^=]+)(=\"?(.+)\"?)?$");\r
+ if (match.Success) {\r
+ string key = match.Groups[1].Value;\r
+ string val = match.Groups[3].Value;\r
+ \r
+ if (opts.ContainsKey(key)) { // \93o\98^\8c\8b\89Ê\82É\93ü\82Á\82Ä\82¢\82é\82±\82Æ\r
+ object origVal = opts[key];\r
+ \r
+ try {\r
+ if (origVal is bool) {\r
+ opts[key] = val.ToLower() != "no";\r
+ } else if (origVal is int) {\r
+ opts[key] = int.Parse(val);\r
+ } else /* if (origVal is string) */ {\r
+ opts[key] = val;\r
+ }\r
+ } catch (FormatException) {\r
+ throw new ApplicationException(string.Format("Illegal Format For {0}", key));\r
+ }\r
+ } else {\r
+ throw new ApplicationException(string.Format("Undefined option: {0}", key));\r
+ }\r
+ }\r
+ }\r
+ }\r
+}\r
--- /dev/null
+#region Using directives\r
+\r
+using System.Reflection;\r
+using System.Runtime.CompilerServices;\r
+using System.Runtime.InteropServices;\r
+\r
+#endregion\r
+\r
+// General Information about an assembly is controlled through the following \r
+// set of attributes. Change these attribute values to modify the information\r
+// associated with an assembly.\r
+[assembly: AssemblyTitle("AppliStation")]\r
+[assembly: AssemblyDescription("")]\r
+[assembly: AssemblyConfiguration("")]\r
+[assembly: AssemblyCompany("")]\r
+[assembly: AssemblyProduct("AppliStation")]\r
+[assembly: AssemblyCopyright("")]\r
+[assembly: AssemblyTrademark("")]\r
+[assembly: AssemblyCulture("")]\r
+\r
+// This sets the default COM visibility of types in the assembly to invisible.\r
+// If you need to expose a type to COM, use [ComVisible(true)] on that type.\r
+[assembly: ComVisible(false)]\r
+\r
+// The assembly version has following format :\r
+//\r
+// Major.Minor.Build.Revision\r
+//\r
+// You can specify all the values or you can use the default the Revision and \r
+// Build Numbers by using the '*' as shown below:\r
+[assembly: AssemblyVersion("0.9.8.*")]\r
--- /dev/null
+namespace AppliStation\r
+{\r
+ partial class PackageListViewForm\r
+ {\r
+ /// <summary>\r
+ /// Designer variable used to keep track of non-visual components.\r
+ /// </summary>\r
+ private System.ComponentModel.IContainer components = null;\r
+ \r
+ /// <summary>\r
+ /// Disposes resources used by the form.\r
+ /// </summary>\r
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>\r
+ protected override void Dispose(bool disposing)\r
+ {\r
+ if (disposing) {\r
+ if (components != null) {\r
+ components.Dispose();\r
+ }\r
+ }\r
+ base.Dispose(disposing);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// This method is required for Windows Forms designer support.\r
+ /// Do not change the method contents inside the source code editor. The Forms designer might\r
+ /// not be able to load this method if it was changed manually.\r
+ /// </summary>\r
+ private void InitializeComponent()\r
+ {\r
+ this.components = new System.ComponentModel.Container();\r
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PackageListViewForm));\r
+ this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();\r
+ this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\r
+ this.toolStripContainer = new System.Windows.Forms.ToolStripPanel();\r
+ this.packageListFilterToolStrip = new System.Windows.Forms.ToolStrip();\r
+ this.packageFilterToolStripDropDownButton = new System.Windows.Forms.ToolStripDropDownButton();\r
+ this.allPackageFilterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+ this.notInstalledPackageFilterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+ this.installedASPackageFilterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+ this.installedSysPackageFilterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+ this.searchTextBox = new System.Windows.Forms.ToolStripTextBox();\r
+ this.packageCommandsToolStrip = new System.Windows.Forms.ToolStrip();\r
+ this.updateToolStripButton = new System.Windows.Forms.ToolStripSplitButton();\r
+ this.localUpdateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+ this.upgradeToolStripButton = new System.Windows.Forms.ToolStripButton();\r
+ this.installToolStripButton = new System.Windows.Forms.ToolStripButton();\r
+ this.uninstallToolStripButton = new System.Windows.Forms.ToolStripButton();\r
+ this.splitContainer = new System.Windows.Forms.SplitContainer();\r
+ this.packageListView = new System.Windows.Forms.ListView();\r
+ this.nameHeader = new System.Windows.Forms.ColumnHeader();\r
+ this.versionHeader = new System.Windows.Forms.ColumnHeader();\r
+ this.summaryHeader = new System.Windows.Forms.ColumnHeader();\r
+ this.packageListContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);\r
+ this.installToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+ this.uninstallToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+ this.webResourcesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+ this.webOfficialToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+ this.webGoogleSearchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+ this.openInstalledDirectoryStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+ this.detailBox = new System.Windows.Forms.RichTextBox();\r
+ this.tableLayoutPanel1.SuspendLayout();\r
+ this.toolStripContainer.SuspendLayout();\r
+ this.packageListFilterToolStrip.SuspendLayout();\r
+ this.packageCommandsToolStrip.SuspendLayout();\r
+ this.splitContainer.Panel1.SuspendLayout();\r
+ this.splitContainer.Panel2.SuspendLayout();\r
+ this.splitContainer.SuspendLayout();\r
+ this.packageListContextMenuStrip.SuspendLayout();\r
+ this.SuspendLayout();\r
+ // \r
+ // toolStripSeparator1\r
+ // \r
+ this.toolStripSeparator1.Name = "toolStripSeparator1";\r
+ this.toolStripSeparator1.Size = new System.Drawing.Size(222, 6);\r
+ // \r
+ // tableLayoutPanel1\r
+ // \r
+ this.tableLayoutPanel1.ColumnCount = 1;\r
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\r
+ this.tableLayoutPanel1.Controls.Add(this.toolStripContainer, 0, 0);\r
+ this.tableLayoutPanel1.Controls.Add(this.splitContainer, 0, 1);\r
+ this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\r
+ this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);\r
+ this.tableLayoutPanel1.Name = "tableLayoutPanel1";\r
+ this.tableLayoutPanel1.RowCount = 2;\r
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\r
+ this.tableLayoutPanel1.Size = new System.Drawing.Size(492, 366);\r
+ this.tableLayoutPanel1.TabIndex = 0;\r
+ // \r
+ // toolStripContainer\r
+ // \r
+ this.toolStripContainer.Controls.Add(this.packageListFilterToolStrip);\r
+ this.toolStripContainer.Controls.Add(this.packageCommandsToolStrip);\r
+ this.toolStripContainer.Dock = System.Windows.Forms.DockStyle.Top;\r
+ this.toolStripContainer.Location = new System.Drawing.Point(0, 0);\r
+ this.toolStripContainer.Name = "toolStripContainer";\r
+ this.toolStripContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;\r
+ this.toolStripContainer.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);\r
+ this.toolStripContainer.Size = new System.Drawing.Size(492, 50);\r
+ // \r
+ // packageListFilterToolStrip\r
+ // \r
+ this.packageListFilterToolStrip.Dock = System.Windows.Forms.DockStyle.None;\r
+ this.packageListFilterToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
+ this.packageFilterToolStripDropDownButton,\r
+ this.searchTextBox});\r
+ this.packageListFilterToolStrip.Location = new System.Drawing.Point(3, 0);\r
+ this.packageListFilterToolStrip.Name = "packageListFilterToolStrip";\r
+ this.packageListFilterToolStrip.Size = new System.Drawing.Size(177, 25);\r
+ this.packageListFilterToolStrip.TabIndex = 1;\r
+ // \r
+ // packageFilterToolStripDropDownButton\r
+ // \r
+ this.packageFilterToolStripDropDownButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
+ this.allPackageFilterToolStripMenuItem,\r
+ this.notInstalledPackageFilterToolStripMenuItem,\r
+ this.installedASPackageFilterToolStripMenuItem,\r
+ this.installedSysPackageFilterToolStripMenuItem});\r
+ this.packageFilterToolStripDropDownButton.Name = "packageFilterToolStripDropDownButton";\r
+ this.packageFilterToolStripDropDownButton.Size = new System.Drawing.Size(13, 22);\r
+ // \r
+ // allPackageFilterToolStripMenuItem\r
+ // \r
+ this.allPackageFilterToolStripMenuItem.Name = "allPackageFilterToolStripMenuItem";\r
+ this.allPackageFilterToolStripMenuItem.Size = new System.Drawing.Size(144, 22);\r
+ this.allPackageFilterToolStripMenuItem.Text = "全て";\r
+ this.allPackageFilterToolStripMenuItem.ToolTipText = "全てのソフトを表示";\r
+ this.allPackageFilterToolStripMenuItem.Click += new System.EventHandler(this.AnyPackageFilterToolStripMenuItemClicked);\r
+ // \r
+ // notInstalledPackageFilterToolStripMenuItem\r
+ // \r
+ this.notInstalledPackageFilterToolStripMenuItem.Name = "notInstalledPackageFilterToolStripMenuItem";\r
+ this.notInstalledPackageFilterToolStripMenuItem.Size = new System.Drawing.Size(144, 22);\r
+ this.notInstalledPackageFilterToolStripMenuItem.Text = "未インストール";\r
+ this.notInstalledPackageFilterToolStripMenuItem.ToolTipText = "インストールされていないソフトを表示";\r
+ this.notInstalledPackageFilterToolStripMenuItem.Click += new System.EventHandler(this.AnyPackageFilterToolStripMenuItemClicked);\r
+ // \r
+ // installedASPackageFilterToolStripMenuItem\r
+ // \r
+ this.installedASPackageFilterToolStripMenuItem.Name = "installedASPackageFilterToolStripMenuItem";\r
+ this.installedASPackageFilterToolStripMenuItem.Size = new System.Drawing.Size(144, 22);\r
+ this.installedASPackageFilterToolStripMenuItem.Text = "AppliStation内";\r
+ this.installedASPackageFilterToolStripMenuItem.ToolTipText = "AppliStationにインストールされているソフトを表示";\r
+ this.installedASPackageFilterToolStripMenuItem.Click += new System.EventHandler(this.AnyPackageFilterToolStripMenuItemClicked);\r
+ // \r
+ // installedSysPackageFilterToolStripMenuItem\r
+ // \r
+ this.installedSysPackageFilterToolStripMenuItem.Name = "installedSysPackageFilterToolStripMenuItem";\r
+ this.installedSysPackageFilterToolStripMenuItem.Size = new System.Drawing.Size(144, 22);\r
+ this.installedSysPackageFilterToolStripMenuItem.Text = "コンピュータ内";\r
+ this.installedSysPackageFilterToolStripMenuItem.ToolTipText = "コンピュータにインストールされているソフトを表示";\r
+ this.installedSysPackageFilterToolStripMenuItem.Click += new System.EventHandler(this.AnyPackageFilterToolStripMenuItemClicked);\r
+ // \r
+ // searchTextBox\r
+ // \r
+ this.searchTextBox.ForeColor = System.Drawing.SystemColors.GrayText;\r
+ this.searchTextBox.Name = "searchTextBox";\r
+ this.searchTextBox.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;\r
+ this.searchTextBox.Size = new System.Drawing.Size(150, 25);\r
+ this.searchTextBox.Text = "検索";\r
+ this.searchTextBox.ToolTipText = "検索する語を入力";\r
+ this.searchTextBox.Enter += new System.EventHandler(this.SearchTextBoxEnter);\r
+ this.searchTextBox.Leave += new System.EventHandler(this.SearchTextBoxLeave);\r
+ this.searchTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.SearchTextBoxKeyPress);\r
+ // \r
+ // packageCommandsToolStrip\r
+ // \r
+ this.packageCommandsToolStrip.Dock = System.Windows.Forms.DockStyle.None;\r
+ this.packageCommandsToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
+ this.updateToolStripButton,\r
+ this.upgradeToolStripButton,\r
+ this.installToolStripButton,\r
+ this.uninstallToolStripButton});\r
+ this.packageCommandsToolStrip.Location = new System.Drawing.Point(3, 25);\r
+ this.packageCommandsToolStrip.Name = "packageCommandsToolStrip";\r
+ this.packageCommandsToolStrip.Size = new System.Drawing.Size(223, 25);\r
+ this.packageCommandsToolStrip.TabIndex = 2;\r
+ // \r
+ // updateToolStripButton\r
+ // \r
+ this.updateToolStripButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
+ this.localUpdateToolStripMenuItem});\r
+ this.updateToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("updateToolStripButton.Image")));\r
+ this.updateToolStripButton.Name = "updateToolStripButton";\r
+ this.updateToolStripButton.Size = new System.Drawing.Size(111, 22);\r
+ this.updateToolStripButton.Text = "リストの更新(&U)";\r
+ this.updateToolStripButton.ToolTipText = "ソフトリスト更新(U)";\r
+ this.updateToolStripButton.ButtonClick += new System.EventHandler(this.UpdateToolStripButtonClick);\r
+ // \r
+ // localUpdateToolStripMenuItem\r
+ // \r
+ this.localUpdateToolStripMenuItem.Name = "localUpdateToolStripMenuItem";\r
+ this.localUpdateToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F5;\r
+ this.localUpdateToolStripMenuItem.Size = new System.Drawing.Size(250, 22);\r
+ this.localUpdateToolStripMenuItem.Text = "インストール済ソフトの読み直し(&R)";\r
+ this.localUpdateToolStripMenuItem.Click += new System.EventHandler(this.LocalupdateToolStripMenuItemClick);\r
+ // \r
+ // upgradeToolStripButton\r
+ // \r
+ this.upgradeToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("upgradeToolStripButton.Image")));\r
+ this.upgradeToolStripButton.Name = "upgradeToolStripButton";\r
+ this.upgradeToolStripButton.Size = new System.Drawing.Size(100, 22);\r
+ this.upgradeToolStripButton.Text = "ソフトの更新(&G)";\r
+ this.upgradeToolStripButton.Click += new System.EventHandler(this.UpgradeToolStripButtonClick);\r
+ // \r
+ // installToolStripButton\r
+ // \r
+ this.installToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("installToolStripButton.Image")));\r
+ this.installToolStripButton.Name = "installToolStripButton";\r
+ this.installToolStripButton.Size = new System.Drawing.Size(80, 22);\r
+ this.installToolStripButton.Text = "インストール";\r
+ this.installToolStripButton.ToolTipText = "選択されているアプリケーションをインストール";\r
+ this.installToolStripButton.Visible = false;\r
+ this.installToolStripButton.Click += new System.EventHandler(this.InstallToolStripButtonClick);\r
+ // \r
+ // uninstallToolStripButton\r
+ // \r
+ this.uninstallToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("uninstallToolStripButton.Image")));\r
+ this.uninstallToolStripButton.Name = "uninstallToolStripButton";\r
+ this.uninstallToolStripButton.Size = new System.Drawing.Size(98, 22);\r
+ this.uninstallToolStripButton.Text = "アンインストール";\r
+ this.uninstallToolStripButton.ToolTipText = "選択されているアプリケーションをアンインストール";\r
+ this.uninstallToolStripButton.Visible = false;\r
+ this.uninstallToolStripButton.Click += new System.EventHandler(this.UninstallToolStripButtonClick);\r
+ // \r
+ // splitContainer\r
+ // \r
+ this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;\r
+ this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;\r
+ this.splitContainer.Location = new System.Drawing.Point(3, 53);\r
+ this.splitContainer.Name = "splitContainer";\r
+ this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;\r
+ // \r
+ // splitContainer.Panel1\r
+ // \r
+ this.splitContainer.Panel1.Controls.Add(this.packageListView);\r
+ // \r
+ // splitContainer.Panel2\r
+ // \r
+ this.splitContainer.Panel2.Controls.Add(this.detailBox);\r
+ this.splitContainer.Size = new System.Drawing.Size(486, 310);\r
+ this.splitContainer.SplitterDistance = 225;\r
+ this.splitContainer.TabIndex = 1;\r
+ // \r
+ // packageListView\r
+ // \r
+ this.packageListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r
+ this.nameHeader,\r
+ this.versionHeader,\r
+ this.summaryHeader});\r
+ this.packageListView.ContextMenuStrip = this.packageListContextMenuStrip;\r
+ this.packageListView.Dock = System.Windows.Forms.DockStyle.Fill;\r
+ this.packageListView.FullRowSelect = true;\r
+ this.packageListView.GridLines = true;\r
+ this.packageListView.Location = new System.Drawing.Point(0, 0);\r
+ this.packageListView.MultiSelect = false;\r
+ this.packageListView.Name = "packageListView";\r
+ this.packageListView.Size = new System.Drawing.Size(486, 225);\r
+ this.packageListView.TabIndex = 0;\r
+ this.packageListView.UseCompatibleStateImageBehavior = false;\r
+ this.packageListView.View = System.Windows.Forms.View.Details;\r
+ this.packageListView.ItemActivate += new System.EventHandler(this.PackageListViewItemActivate);\r
+ this.packageListView.SelectedIndexChanged += new System.EventHandler(this.PackageListViewSelectedIndexChanged);\r
+ this.packageListView.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.PackageListViewColumnClick);\r
+ // \r
+ // nameHeader\r
+ // \r
+ this.nameHeader.Text = "名前";\r
+ this.nameHeader.Width = 100;\r
+ // \r
+ // versionHeader\r
+ // \r
+ this.versionHeader.Text = "バージョン";\r
+ // \r
+ // summaryHeader\r
+ // \r
+ this.summaryHeader.Text = "概要";\r
+ this.summaryHeader.Width = 300;\r
+ // \r
+ // packageListContextMenuStrip\r
+ // \r
+ this.packageListContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
+ this.installToolStripMenuItem,\r
+ this.uninstallToolStripMenuItem,\r
+ this.toolStripSeparator1,\r
+ this.webResourcesToolStripMenuItem,\r
+ this.openInstalledDirectoryStripMenuItem});\r
+ this.packageListContextMenuStrip.Name = "packageListContextMenuStrip";\r
+ this.packageListContextMenuStrip.Size = new System.Drawing.Size(226, 98);\r
+ this.packageListContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.PackageListContextMenuStripOpening);\r
+ // \r
+ // installToolStripMenuItem\r
+ // \r
+ this.installToolStripMenuItem.Name = "installToolStripMenuItem";\r
+ this.installToolStripMenuItem.Size = new System.Drawing.Size(225, 22);\r
+ this.installToolStripMenuItem.Text = "インストール(&I)...";\r
+ this.installToolStripMenuItem.Click += new System.EventHandler(this.InstallToolStripButtonClick);\r
+ // \r
+ // uninstallToolStripMenuItem\r
+ // \r
+ this.uninstallToolStripMenuItem.Name = "uninstallToolStripMenuItem";\r
+ this.uninstallToolStripMenuItem.Size = new System.Drawing.Size(225, 22);\r
+ this.uninstallToolStripMenuItem.Text = "アンインストール(&U)...";\r
+ this.uninstallToolStripMenuItem.Click += new System.EventHandler(this.UninstallToolStripButtonClick);\r
+ // \r
+ // webResourcesToolStripMenuItem\r
+ // \r
+ this.webResourcesToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
+ this.webOfficialToolStripMenuItem,\r
+ this.webGoogleSearchToolStripMenuItem});\r
+ this.webResourcesToolStripMenuItem.Name = "webResourcesToolStripMenuItem";\r
+ this.webResourcesToolStripMenuItem.Size = new System.Drawing.Size(225, 22);\r
+ this.webResourcesToolStripMenuItem.Tag = "\"{0}\"に関するWebページ(&W)";\r
+ // \r
+ // webOfficialToolStripMenuItem\r
+ // \r
+ this.webOfficialToolStripMenuItem.Name = "webOfficialToolStripMenuItem";\r
+ this.webOfficialToolStripMenuItem.Size = new System.Drawing.Size(145, 22);\r
+ this.webOfficialToolStripMenuItem.Text = "公式サイト(&O)";\r
+ this.webOfficialToolStripMenuItem.Click += new System.EventHandler(this.WebOfficialToolStripMenuItemClick);\r
+ // \r
+ // webGoogleSearchToolStripMenuItem\r
+ // \r
+ this.webGoogleSearchToolStripMenuItem.Name = "webGoogleSearchToolStripMenuItem";\r
+ this.webGoogleSearchToolStripMenuItem.Size = new System.Drawing.Size(145, 22);\r
+ this.webGoogleSearchToolStripMenuItem.Text = "Google検索(&G)";\r
+ this.webGoogleSearchToolStripMenuItem.Click += new System.EventHandler(this.WebGoogleSearchToolStripMenuItemClick);\r
+ // \r
+ // openInstalledDirectoryStripMenuItem\r
+ // \r
+ this.openInstalledDirectoryStripMenuItem.Name = "openInstalledDirectoryStripMenuItem";\r
+ this.openInstalledDirectoryStripMenuItem.Size = new System.Drawing.Size(225, 22);\r
+ this.openInstalledDirectoryStripMenuItem.Text = "インストール先のフォルダを開く(&O)";\r
+ this.openInstalledDirectoryStripMenuItem.Click += new System.EventHandler(this.OpenInstalledDirectoryStripMenuItemClick);\r
+ // \r
+ // detailBox\r
+ // \r
+ this.detailBox.BackColor = System.Drawing.SystemColors.Control;\r
+ this.detailBox.BorderStyle = System.Windows.Forms.BorderStyle.None;\r
+ this.detailBox.Dock = System.Windows.Forms.DockStyle.Fill;\r
+ this.detailBox.ForeColor = System.Drawing.SystemColors.ControlText;\r
+ this.detailBox.Location = new System.Drawing.Point(0, 0);\r
+ this.detailBox.Name = "detailBox";\r
+ this.detailBox.ReadOnly = true;\r
+ this.detailBox.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;\r
+ this.detailBox.Size = new System.Drawing.Size(486, 81);\r
+ this.detailBox.TabIndex = 0;\r
+ this.detailBox.Text = "";\r
+ this.detailBox.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.PackageDetailBoxLinkClicked);\r
+ // \r
+ // PackageListViewForm\r
+ // \r
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
+ this.ClientSize = new System.Drawing.Size(492, 366);\r
+ this.Controls.Add(this.tableLayoutPanel1);\r
+ this.Name = "PackageListViewForm";\r
+ this.Text = "AppliStation";\r
+ this.Load += new System.EventHandler(this.Form_OnLoad);\r
+ this.tableLayoutPanel1.ResumeLayout(false);\r
+ this.tableLayoutPanel1.PerformLayout();\r
+ this.toolStripContainer.ResumeLayout(false);\r
+ this.toolStripContainer.PerformLayout();\r
+ this.packageListFilterToolStrip.ResumeLayout(false);\r
+ this.packageListFilterToolStrip.PerformLayout();\r
+ this.packageCommandsToolStrip.ResumeLayout(false);\r
+ this.packageCommandsToolStrip.PerformLayout();\r
+ this.splitContainer.Panel1.ResumeLayout(false);\r
+ this.splitContainer.Panel2.ResumeLayout(false);\r
+ this.splitContainer.ResumeLayout(false);\r
+ this.packageListContextMenuStrip.ResumeLayout(false);\r
+ this.ResumeLayout(false);\r
+ }\r
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;\r
+ private System.Windows.Forms.ToolStripMenuItem openInstalledDirectoryStripMenuItem;\r
+ private System.Windows.Forms.ToolStripMenuItem webGoogleSearchToolStripMenuItem;\r
+ private System.Windows.Forms.ToolStripMenuItem webOfficialToolStripMenuItem;\r
+ private System.Windows.Forms.ToolStripMenuItem webResourcesToolStripMenuItem;\r
+ private System.Windows.Forms.RichTextBox detailBox;\r
+ private System.Windows.Forms.SplitContainer splitContainer;\r
+ private System.Windows.Forms.ToolStripPanel toolStripContainer;\r
+ private System.Windows.Forms.ToolStripMenuItem installedSysPackageFilterToolStripMenuItem;\r
+ private System.Windows.Forms.ToolStripMenuItem installedASPackageFilterToolStripMenuItem;\r
+ private System.Windows.Forms.ToolStripMenuItem notInstalledPackageFilterToolStripMenuItem;\r
+ private System.Windows.Forms.ToolStripMenuItem allPackageFilterToolStripMenuItem;\r
+ private System.Windows.Forms.ToolStripDropDownButton packageFilterToolStripDropDownButton;\r
+ private System.Windows.Forms.ToolStripButton upgradeToolStripButton;\r
+ private System.Windows.Forms.ToolStripMenuItem localUpdateToolStripMenuItem;\r
+ private System.Windows.Forms.ToolStripSplitButton updateToolStripButton;\r
+ private System.Windows.Forms.ToolStripMenuItem uninstallToolStripMenuItem;\r
+ private System.Windows.Forms.ToolStripMenuItem installToolStripMenuItem;\r
+ private System.Windows.Forms.ContextMenuStrip packageListContextMenuStrip;\r
+ private System.Windows.Forms.ToolStripButton uninstallToolStripButton;\r
+ private System.Windows.Forms.ToolStripButton installToolStripButton;\r
+ private System.Windows.Forms.ToolStrip packageCommandsToolStrip;\r
+ private System.Windows.Forms.ToolStrip packageListFilterToolStrip;\r
+ private System.Windows.Forms.ToolStripTextBox searchTextBox;\r
+ private System.Windows.Forms.ColumnHeader versionHeader;\r
+ private System.Windows.Forms.ListView packageListView;\r
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\r
+ private System.Windows.Forms.ColumnHeader summaryHeader;\r
+ private System.Windows.Forms.ColumnHeader nameHeader;\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.Drawing;\r
+using System.Windows.Forms;\r
+using NaGet.Packages;\r
+using NaGet.Packages.Install;\r
+using System.IO;\r
+using System.Collections.Generic;\r
+\r
+namespace AppliStation\r
+{\r
+ /// <summary>\r
+ /// Description of PackageListViewForm.\r
+ /// </summary>\r
+ public partial class PackageListViewForm : Form\r
+ {\r
+ protected PackageListsManager pkgListsMan = null;\r
+ \r
+ public PackageListViewForm()\r
+ {\r
+ //\r
+ // The InitializeComponent() call is required for Windows Forms designer support.\r
+ //\r
+ InitializeComponent();\r
+ \r
+ installToolStripMenuItem.Font = new Font(installToolStripMenuItem.Font, FontStyle.Bold);\r
+ uninstallToolStripMenuItem.Font = new Font(uninstallToolStripMenuItem.Font, FontStyle.Bold);\r
+ \r
+ pkgListsMan = new PackageListsManager();\r
+ }\r
+ \r
+ void PackageListViewSelectedIndexChanged(object sender, EventArgs e)\r
+ {\r
+ bool installBtnEnabled = false;\r
+ bool uninstallBtnEnabled = false;\r
+ \r
+ detailBox.Clear();\r
+ foreach (ListViewItem item in packageListView.SelectedItems) {\r
+ Package pkg = (Package) item.Tag;\r
+ \r
+ bool isInstalledPackage = pkg is InstalledPackage;\r
+ uninstallBtnEnabled = isInstalledPackage;\r
+ installBtnEnabled = ! isInstalledPackage;\r
+ \r
+ detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 12);\r
+ detailBox.SelectedText += string.Format("{0} ({1})\r\n", pkg.Name, pkg.Version);\r
+ if (! string.IsNullOrEmpty(pkg.Tags) ) {\r
+ detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 8);\r
+ detailBox.SelectedText += string.Format("\83^\83O: {0}\r\n", pkg.Tags);\r
+ }\r
+ if (isInstalledPackage) {\r
+ InstalledPackage iPkg = (InstalledPackage) pkg;\r
+ System.Text.StringBuilder sb = new System.Text.StringBuilder();\r
+ if (iPkg.UninstallInfo.InstallDate != null) {\r
+ sb.AppendFormat("\83C\83\93\83X\83g\81[\83\8b\82µ\82½\93ú: {0:d} ", iPkg.UninstallInfo.InstallDate.Value);\r
+ }\r
+ if (iPkg.UninstallInfo.EstimatedSize > 0) {\r
+ sb.AppendFormat("\83T\83C\83Y: {0} ", NaGet.Utils.FormatSize(iPkg.UninstallInfo.EstimatedSize*1024));\r
+ }\r
+ \r
+ if (sb.Length > 0) {\r
+ detailBox.SelectionFont = new Font(detailBox.Font.FontFamily, 8);\r
+ detailBox.SelectedText += sb.ToString();\r
+ detailBox.SelectedText += "\r\n";\r
+ }\r
+ }\r
+ detailBox.SelectionFont = detailBox.Font;\r
+ if (pkg.Url != null && pkg.Url.Href != null) {\r
+ detailBox.SelectedText += "\8cö\8e®\83T\83C\83g: " + pkg.Url.Href + "\r\n";\r
+ }\r
+ detailBox.SelectedText += pkg.Summary;\r
+ \r
+ break;\r
+ }\r
+ \r
+ uninstallToolStripButton.Visible = uninstallBtnEnabled;\r
+ installToolStripButton.Visible = installBtnEnabled;\r
+ \r
+ if (packageListView.SelectedItems.Count <= 0) {\r
+ detailBox.SelectionFont = detailBox.Font;\r
+ int count = packageListView.Items.Count;\r
+ detailBox.Text = (count > 0) ? string.Format("{0}\8cÂ\82Ì\83\\83t\83g\82ª\82 \82è\82Ü\82·\81B", count)\r
+ : "\8aY\93\96\82·\82é\83\\83t\83g\82ª\82 \82è\82Ü\82¹\82ñ\81B";\r
+ }\r
+ \r
+ detailBox.SelectionStart = 0;\r
+ detailBox.ScrollToCaret();\r
+ }\r
+\r
+ void PackageListViewItemActivate(object sender, EventArgs e)\r
+ {\r
+ if (packageListView.SelectedItems.Count <= 0) {\r
+ return; // exit \r
+ }\r
+ \r
+ foreach (ListViewItem item in packageListView.SelectedItems) {\r
+ Package pkg = (Package) item.Tag;\r
+ \r
+ if (pkg is InstalledPackage) {\r
+ UninstallToolStripButtonClick(sender, e);\r
+ } else {\r
+ InstallToolStripButtonClick(sender, e);\r
+ }\r
+ \r
+ break;\r
+ }\r
+ }\r
+ \r
+ AppliStation.Util.ListViewItemSortComparer packageListViewSortComparer;\r
+\r
+ void PackageListViewColumnClick(object sender, ColumnClickEventArgs e)\r
+ {\r
+ SortOrder order = SortOrder.None;\r
+ \r
+ if (packageListViewSortComparer == null) {\r
+ order = SortOrder.Ascending;\r
+ packageListViewSortComparer = new AppliStation.Util.ListViewItemSortComparer(e.Column, order);\r
+ packageListView.ListViewItemSorter = packageListViewSortComparer;\r
+ } else {\r
+ if (packageListViewSortComparer.Column == e.Column) {\r
+ order = (packageListViewSortComparer.Order == SortOrder.Ascending)? SortOrder.Descending : SortOrder.Ascending;\r
+ \r
+ packageListViewSortComparer.Order = order;\r
+ } else {\r
+ order = packageListViewSortComparer.Order;\r
+ packageListViewSortComparer.Column = e.Column;\r
+ }\r
+ \r
+ packageListView.Sort();\r
+ }\r
+ AppliStation.Util.NativeMethods.ColumnHeader_SetSortState(packageListView, e.Column, order);\r
+ \r
+ // \83\\81[\83g\91Î\8fÛ\97ñ\82Ì\90F\95t\82¯\r
+ try {\r
+ // SendMessage(hWnd, LVM_SETSELECTEDCOLUMN, column, NULL);\r
+ AppliStation.Util.NativeMethods.SendMessage(packageListView.Handle, 0x1000+140, (uint) e.Column, 0);\r
+ } catch (Exception) { \r
+ }\r
+ }\r
+ \r
+ void Form_OnLoad(object sender, EventArgs e)\r
+ {\r
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PackageListViewForm));\r
+ ImageList imageList = new ImageList();\r
+ imageList.Images.Add("installed", this.Icon);\r
+ imageList.Images.Add("sys", (Icon)(resources.GetObject("sysinstalled.Icon")));\r
+ packageListView.SmallImageList = imageList;\r
+ \r
+ updatePackageFilterToolStripMenuItemCheckState();\r
+ installedASPackageFilterToolStripMenuItem.Image = this.Icon.ToBitmap();\r
+ installedSysPackageFilterToolStripMenuItem.Image = ((Icon)(resources.GetObject("sysinstalled.Icon"))).ToBitmap();\r
+ }\r
+ \r
+ #region PackageFilter\8aÖ\98A\r
+ \r
+ private enum PackageFilterIndex : int\r
+ {\r
+ All = 0,\r
+ NotInstalled = 1,\r
+ InstalledAS = 2,\r
+ InstalledSys = 3,\r
+ }\r
+ \r
+ private PackageFilterIndex currentPackageFilter = PackageFilterIndex.All;\r
+ \r
+ private PackageFilterIndex CurrentPackageFilter {\r
+ get {\r
+ return currentPackageFilter;\r
+ }\r
+ set {\r
+ currentPackageFilter = value;\r
+ \r
+ updatePackageFilterToolStripMenuItemCheckState();\r
+ }\r
+ }\r
+ \r
+ private void updatePackageFilterToolStripMenuItemCheckState()\r
+ {\r
+ ToolStripMenuItem selected = getCheckedPackageFilterToolStripItem();\r
+ \r
+ foreach (ToolStripMenuItem item in packageFilterToolStripDropDownButton.DropDown.Items) {\r
+ item.Checked = selected == item;\r
+ }\r
+ \r
+ packageFilterToolStripDropDownButton.Text = selected.Text;\r
+ packageFilterToolStripDropDownButton.Image = selected.Image;\r
+ packageFilterToolStripDropDownButton.ToolTipText = selected.ToolTipText;\r
+ }\r
+ \r
+ private ToolStripMenuItem getCheckedPackageFilterToolStripItem()\r
+ {\r
+ switch (currentPackageFilter) {\r
+ case PackageFilterIndex.NotInstalled:\r
+ return notInstalledPackageFilterToolStripMenuItem;\r
+ case PackageFilterIndex.InstalledAS:\r
+ return installedASPackageFilterToolStripMenuItem;\r
+ case PackageFilterIndex.InstalledSys:\r
+ return installedSysPackageFilterToolStripMenuItem;\r
+ default:\r
+ return allPackageFilterToolStripMenuItem;\r
+ }\r
+ }\r
+ \r
+ void AnyPackageFilterToolStripMenuItemClicked(object sender, EventArgs e)\r
+ {\r
+ if (sender == notInstalledPackageFilterToolStripMenuItem) {\r
+ currentPackageFilter = PackageFilterIndex.NotInstalled;\r
+ } else if (sender == installedASPackageFilterToolStripMenuItem) {\r
+ currentPackageFilter = PackageFilterIndex.InstalledAS;\r
+ } else if (sender == installedSysPackageFilterToolStripMenuItem) {\r
+ currentPackageFilter = PackageFilterIndex.InstalledSys;\r
+ } else {\r
+ currentPackageFilter = PackageFilterIndex.All;\r
+ }\r
+ \r
+ updatePackageFilterToolStripMenuItemCheckState();\r
+ searchTextBoxUpdate(false);\r
+ }\r
+ \r
+ #endregion\r
+ \r
+ void PackageListViewUpdate()\r
+ {\r
+ this.packageListView.Items.Clear();\r
+ \r
+ if (currentPackageFilter == PackageFilterIndex.All || currentPackageFilter == PackageFilterIndex.NotInstalled) {\r
+ foreach (Package pkg in pkgListsMan.AvailablePkgList.Search(this.SearchKeyword)) {\r
+ if (Installation.GetPreferInstallerIndex(pkg) >= 0) { // \83C\83\93\83X\83g\81[\83\8b\89Â\94\\r
+ if (currentPackageFilter == PackageFilterIndex.NotInstalled &&\r
+ (pkgListsMan.InstalledPkgList.GetPackageForName(pkg.Name) != null||\r
+ pkgListsMan.SystemInstalledPkgList.GetPackageForName(pkg.Name) != null) ) {\r
+ continue; // \83C\83\93\83X\83g\81[\83\8b\8dÏ\82Ý\82Í\8e\9f\82Ì\83\8b\81[\83v\82Ö(\96¢\83C\83\93\83X\83g\81[\83\8b\83\\83t\83g\92\8a\8fo\8e\9e)\r
+ }\r
+ \r
+ ListViewItem item = new ListViewItem(new string[]{pkg.Name, pkg.Version, pkg.Summary});\r
+ item.Tag = pkg;\r
+ item.ToolTipText = pkg.Summary;\r
+ \r
+ this.packageListView.Items.Add(item);\r
+ }\r
+ }\r
+ }\r
+ \r
+ if (currentPackageFilter == PackageFilterIndex.All || currentPackageFilter == PackageFilterIndex.InstalledAS) {\r
+ foreach (Package pkg in pkgListsMan.InstalledPkgList.Search(this.SearchKeyword)) {\r
+ ListViewItem item = new ListViewItem(new string[]{pkg.Name, pkg.Version, pkg.Summary});\r
+ item.Tag = pkg;\r
+ item.ToolTipText = pkg.Summary;\r
+ item.ImageKey = "installed";\r
+ \r
+ this.packageListView.Items.Add(item);\r
+ }\r
+ }\r
+ \r
+ if (currentPackageFilter == PackageFilterIndex.All || currentPackageFilter == PackageFilterIndex.InstalledSys) {\r
+ foreach (Package pkg in pkgListsMan.SystemInstalledPkgList.Search(this.SearchKeyword)) {\r
+ ListViewItem item = new ListViewItem(new string[]{pkg.Name, pkg.Version, pkg.Summary});\r
+ item.Tag = pkg;\r
+ item.ToolTipText = pkg.Summary;\r
+ item.ImageKey = "sys";\r
+ \r
+ this.packageListView.Items.Add(item);\r
+ }\r
+ }\r
+ \r
+ PackageListViewSelectedIndexChanged(packageListView, null);\r
+ detailBox.Refresh();\r
+ \r
+ //this.packageListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);\r
+ }\r
+ \r
+ void PackageDetailBoxLinkClicked(object sender, LinkClickedEventArgs e)\r
+ {\r
+ System.Diagnostics.Process.Start(e.LinkText);\r
+ }\r
+ \r
+ internal void updateActionInvoke(bool downloadPackageListsFlag)\r
+ {\r
+ AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer();\r
+ prog.Shown += delegate(object sender2, EventArgs e2) {\r
+ NaGet.SubCommands.NaGetUpdate tasks = new NaGet.SubCommands.NaGetUpdate(pkgListsMan, downloadPackageListsFlag);\r
+ tasks.Downloader = prog.Downloader;\r
+ prog.SetTaskSet(tasks);\r
+ prog.Refresh();\r
+ prog.StartTaskSet();\r
+ };\r
+ prog.Text = "\83\8a\83X\83g\82Ì\8dX\90V";\r
+ prog.ShowDialog(this);\r
+ }\r
+ \r
+ void UpdateToolStripButtonClick(object sender, EventArgs e)\r
+ {\r
+ updateActionInvoke(true);\r
+ \r
+ UpdatePackageList();\r
+ }\r
+ \r
+ void LocalupdateToolStripMenuItemClick(object sender, EventArgs e)\r
+ {\r
+ updateActionInvoke(false);\r
+ \r
+ UpdatePackageList();\r
+ }\r
+ \r
+ #region searchTextBox\82Ü\82í\82è\r
+ \r
+ private bool searchTextBoxIsEmpty = true;\r
+ \r
+ private Timer searchUpdateTimer = null;\r
+ \r
+ string SearchKeyword {\r
+ get {\r
+ return searchTextBoxIsEmpty? string.Empty : searchTextBox.Text;\r
+ }\r
+ }\r
+ \r
+ void SearchTextBoxEnter(object sender, EventArgs e)\r
+ {\r
+ if (searchTextBoxIsEmpty) {\r
+ searchTextBox.Text = string.Empty;\r
+ searchTextBox.ForeColor = DefaultForeColor;\r
+ searchTextBoxIsEmpty = false;\r
+ }\r
+ }\r
+ \r
+ void SearchTextBoxLeave(object sender, EventArgs e)\r
+ {\r
+ if (string.IsNullOrEmpty(searchTextBox.Text)) {\r
+ searchTextBox.Text = "\8c\9f\8dõ";\r
+ searchTextBox.ForeColor = SystemColors.GrayText;\r
+ searchTextBoxIsEmpty = true;\r
+ }\r
+ }\r
+ \r
+ void SearchTextBoxKeyPress(object sender, KeyPressEventArgs e)\r
+ {\r
+ switch (e.KeyChar) {\r
+ case (char)Keys.Enter:\r
+ searchTextBoxUpdate(true);\r
+ break;\r
+ case (char)Keys.Escape:\r
+ searchTextBox.Text = "";\r
+ searchTextBoxUpdate(false);\r
+ break;\r
+ default:\r
+ searchTextBoxUpdate(false);\r
+ break;\r
+ }\r
+ }\r
+ \r
+ private void searchTextBoxUpdate(bool force)\r
+ {\r
+ if (! this.Created) return;\r
+ \r
+ if (searchUpdateTimer != null) {\r
+ searchUpdateTimer.Stop();\r
+ } else {\r
+ searchUpdateTimer = new Timer();\r
+ searchUpdateTimer.Tick += searchUpdateTimerTick;\r
+ }\r
+ searchUpdateTimer.Interval = (force)? 10 : 500;\r
+ searchUpdateTimer.Start();\r
+ }\r
+ \r
+ private void searchUpdateTimerTick(object sender, EventArgs e)\r
+ {\r
+ searchUpdateTimer.Stop();\r
+ \r
+ PackageListViewUpdate();\r
+ }\r
+ \r
+ #endregion\r
+ \r
+ internal void installActionInvoke(Package[] pkgs)\r
+ {\r
+ AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer();\r
+ prog.Shown += delegate(object sender2, EventArgs e2) {\r
+ NaGet.SubCommands.NaGetInstall tasks = new NaGet.SubCommands.NaGetInstall(pkgListsMan, pkgs);\r
+ tasks.Downloader = prog.Downloader;\r
+ prog.SetTaskSet(tasks);\r
+ prog.Refresh();\r
+ prog.StartTaskSet();\r
+ };\r
+ prog.Text = string.Format("\83\\83t\83g\83E\83F\83A\82Ì\83C\83\93\83X\83g\81[\83\8b");\r
+ prog.ShowDialog(this);\r
+ }\r
+ \r
+ void InstallToolStripButtonClick(object sender, EventArgs e)\r
+ {\r
+ PackagesInstallConfirmForm confirm = new PackagesInstallConfirmForm();\r
+ confirm.PkgListsManager = pkgListsMan;\r
+ confirm.Packages = SelectedPackages<Package>();\r
+ confirm.UseRunas = confirm.GetShouldUseRunas();\r
+ DialogResult result = confirm.ShowDialog(this);\r
+ \r
+ if (result == DialogResult.OK) {\r
+ Package[] instPkgs = confirm.CheckedPackages;\r
+ \r
+ if (confirm.UseRunas) {\r
+ this.Enabled = false;\r
+ installRunasActionInvoke(instPkgs);\r
+ this.Enabled = true;\r
+ this.Focus();\r
+ } else {\r
+ installActionInvoke(instPkgs);\r
+ }\r
+ \r
+ UpdatePackageList();\r
+ }\r
+ }\r
+ \r
+ public void installRunasActionInvoke(Package[] pkgs)\r
+ {\r
+ string tmpfileName = System.IO.Path.GetTempFileName();\r
+ try {\r
+ NaGet.Utils.PutSerializeObject(tmpfileName, pkgs);\r
+ \r
+ System.Diagnostics.ProcessStartInfo procInfo = new System.Diagnostics.ProcessStartInfo();\r
+ procInfo.FileName = Application.ExecutablePath;\r
+ procInfo.Arguments = string.Format("--noupdate --cmd=install \"--pkgsref={0}\"", tmpfileName);\r
+ procInfo.Verb = "runas";\r
+ procInfo.WorkingDirectory = Environment.CurrentDirectory;\r
+ \r
+ using (System.Diagnostics.Process hProc = System.Diagnostics.Process.Start(procInfo)) {\r
+ hProc.WaitForExit();\r
+ }\r
+ \r
+ pkgListsMan.LoadPackageLists();\r
+ } catch (System.ComponentModel.Win32Exception ex) {\r
+ MessageBox.Show(ex.Message, "\83C\83\93\83X\83g\81[\83\8b", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+ } finally {\r
+ if (File.Exists(tmpfileName)) {\r
+ File.Delete(tmpfileName);\r
+ }\r
+ }\r
+ }\r
+ \r
+ internal void uninstallActionInvoke(InstalledPackage[] pkgs)\r
+ {\r
+ AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer();\r
+ prog.Shown += delegate(object sender2, EventArgs e2) {\r
+ NaGet.SubCommands.NaGetUninstall tasks = new NaGet.SubCommands.NaGetUninstall(pkgListsMan, pkgs);\r
+ prog.SetTaskSet(tasks);\r
+ prog.Refresh();\r
+ prog.StartTaskSet();\r
+ };\r
+ prog.Text = string.Format("\83\\83t\83g\83E\83F\83A\82Ì\83A\83\93\83C\83\93\83X\83g\81[\83\8b");\r
+ prog.ShowDialog(this);\r
+ }\r
+ \r
+ internal void uninstallRunasActionInvoke(InstalledPackage[] pkgs)\r
+ {\r
+ string tmpfileName = System.IO.Path.GetTempFileName();\r
+ try {\r
+ NaGet.Utils.PutSerializeObject(tmpfileName, pkgs);\r
+ \r
+ System.Diagnostics.ProcessStartInfo procInfo = new System.Diagnostics.ProcessStartInfo();\r
+ procInfo.FileName = Application.ExecutablePath;\r
+ procInfo.Arguments = string.Format("--noupdate --cmd=uninstall \"--pkgsref={0}\"", tmpfileName);\r
+ procInfo.Verb = "runas";\r
+ procInfo.WorkingDirectory = Environment.CurrentDirectory;\r
+ \r
+ using (System.Diagnostics.Process hProc = System.Diagnostics.Process.Start(procInfo)) {\r
+ hProc.WaitForExit();\r
+ }\r
+ \r
+ pkgListsMan.LoadPackageLists();\r
+ } catch (System.ComponentModel.Win32Exception ex) {\r
+ MessageBox.Show(ex.Message, "\83A\83\93\83C\83\93\83X\83g\81[\83\8b", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+ } finally {\r
+ if (File.Exists(tmpfileName)) {\r
+ File.Delete(tmpfileName);\r
+ }\r
+ }\r
+ }\r
+ \r
+ void UninstallToolStripButtonClick(object sender, EventArgs e)\r
+ {\r
+ PackageUninstallConfirmForm confirm = new PackageUninstallConfirmForm();\r
+ foreach (InstalledPackage pkg in SelectedPackages<InstalledPackage>()) {\r
+ confirm.UninstallPackage = pkg;\r
+ break;\r
+ }\r
+ confirm.UseRunas = confirm.GetShouldUseRunas();\r
+ DialogResult result = confirm.ShowDialog(this);\r
+ \r
+ if (result == DialogResult.OK) {\r
+ InstalledPackage[] instPkgs = new InstalledPackage[]{confirm.UninstallPackage};\r
+ \r
+ if (confirm.UseRunas) {\r
+ this.Enabled = false;\r
+ uninstallRunasActionInvoke(instPkgs);\r
+ this.Enabled = true;\r
+ this.Focus();\r
+ } else {\r
+ uninstallActionInvoke(instPkgs);\r
+ }\r
+ \r
+ UpdatePackageList();\r
+ }\r
+ }\r
+ \r
+ \r
+ void WebOfficialToolStripMenuItemClick(object sender, EventArgs e)\r
+ {\r
+ foreach (Package pkg in SelectedPackages<Package>()) {\r
+ string linkURL = pkg.Url.Href;\r
+ \r
+ if (! (pkg == null || string.IsNullOrEmpty(linkURL))) {\r
+ System.Diagnostics.Process.Start(linkURL);\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ \r
+ void WebGoogleSearchToolStripMenuItemClick(object sender, EventArgs e)\r
+ {\r
+ foreach (Package pkg in SelectedPackages<Package>()) {\r
+ string q = System.Web.HttpUtility.UrlEncode(pkg.Name, System.Text.Encoding.UTF8);\r
+ string googleURL = @"http://www.google.co.jp/search?q="+q;\r
+ \r
+ System.Diagnostics.Process.Start(googleURL);\r
+\r
+ break;\r
+ }\r
+ }\r
+ \r
+ void OpenInstalledDirectoryStripMenuItemClick(object sender, EventArgs e)\r
+ {\r
+ foreach (InstalledPackage pkg in SelectedPackages<InstalledPackage>()) {\r
+ if (pkg.Type == InstallerType.ARCHIVE) {\r
+ System.Diagnostics.Process.Start(Path.Combine(NaGet.Env.ArchiveProgramFiles, pkg.Name));\r
+ } else if (Directory.Exists(pkg.UninstallInfo.InstallLocation)) {\r
+ System.Diagnostics.Process.Start(pkg.UninstallInfo.InstallLocation);\r
+ }\r
+\r
+ break;\r
+ }\r
+ }\r
+ \r
+ void PackageListContextMenuStripOpening(object sender, System.ComponentModel.CancelEventArgs e)\r
+ {\r
+ // \91I\91ð\82³\82ê\82Ä\82¢\82È\82¢\82È\82ç\8aJ\82©\82È\82¢\r
+ if (packageListView.SelectedItems.Count <= 0) {\r
+ e.Cancel = true;\r
+ return;\r
+ }\r
+ \r
+ foreach (Package pkg in SelectedPackages<Package>()) {\r
+ bool isInstalledPackage = pkg is InstalledPackage;\r
+ \r
+ installToolStripMenuItem.Visible = ! isInstalledPackage;\r
+ uninstallToolStripMenuItem.Visible = isInstalledPackage;\r
+ \r
+ webResourcesToolStripMenuItem.Text = string.Format(webResourcesToolStripMenuItem.Tag.ToString(), pkg.Name);\r
+ webOfficialToolStripMenuItem.Enabled = ! (pkg.Url == null || string.IsNullOrEmpty(pkg.Url.Href));\r
+ // webGoogleSearchToolStripMenuItem always active.\r
+ \r
+ openInstalledDirectoryStripMenuItem.Visible = isInstalledPackage &&\r
+ ( (pkg.Type == InstallerType.ARCHIVE) || Directory.Exists(((InstalledPackage) pkg).UninstallInfo.InstallLocation) );\r
+\r
+ break;\r
+ }\r
+ }\r
+ \r
+ private IEnumerable<Package> getUpdatedPackages(PackageList<InstalledPackage> installedPkgList, PackageList<Package> avaiablePkgList, IComparer<string> verComp)\r
+ {\r
+ foreach (InstalledPackage pkg in installedPkgList.Packages) {\r
+ Package avaiablePkg = avaiablePkgList.GetPackageForName(pkg.Name);\r
+ \r
+ if (avaiablePkgList != null) {\r
+ if (verComp.Compare(pkg.Version, avaiablePkg.Version) < 0 &&\r
+ installedPkgList.GetPackageForPackage(pkg.Name, avaiablePkg.Version) == null) {\r
+ \r
+ yield return avaiablePkg;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ void UpgradeToolStripButtonClick(object sender, EventArgs e)\r
+ {\r
+ List<Package> pkgs = new List<Package>();\r
+ VersionComparetor verComp = new VersionComparetor();\r
+ PackageList<Package> avaiablePackageList = pkgListsMan.AvailablePkgList;\r
+ \r
+ pkgs.AddRange(getUpdatedPackages(pkgListsMan.InstalledPkgList, avaiablePackageList, verComp));\r
+ pkgs.AddRange(getUpdatedPackages(pkgListsMan.SystemInstalledPkgList, avaiablePackageList, verComp));\r
+ \r
+ if (pkgs.Count <= 0) {\r
+ MessageBox.Show(this, "\8dX\90V\82³\82ê\82½\83\\83t\83g\82Í\82 \82è\82Ü\82¹\82ñ", "\83\\83t\83g\82Ì\8dX\90V");\r
+ return;\r
+ }\r
+ \r
+ PackagesInstallConfirmForm confirm = new PackagesInstallConfirmForm();\r
+ confirm.PkgListsManager = pkgListsMan;\r
+ confirm.Packages = pkgs.ToArray();\r
+ DialogResult result = confirm.ShowDialog(this);\r
+ \r
+ if (result == DialogResult.OK) {\r
+ Package[] instPkgs = confirm.CheckedPackages;\r
+ \r
+ if (confirm.UseRunas) {\r
+ this.Enabled = false;\r
+ installRunasActionInvoke(instPkgs);\r
+ this.Enabled = true;\r
+ } else {\r
+ installActionInvoke(instPkgs);\r
+ }\r
+ \r
+ UpdatePackageList();\r
+ }\r
+ }\r
+ \r
+ public void UpdatePackageList()\r
+ {\r
+ pkgListsMan.LoadPackageLists();\r
+ this.PackageListViewUpdate();\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \83C\83\93\83X\83g\81[\83\8b\82·\82é\82æ\82¤\91I\91ð\82³\82ê\82½\83p\83b\83P\81[\83W\82Ì\94z\97ñ\r
+ /// </summary>\r
+ public TPackage[] SelectedPackages<TPackage>() where TPackage : Package\r
+ {\r
+ List<TPackage> pkgs = new List<TPackage>();\r
+ foreach (ListViewItem item in packageListView.SelectedItems) {\r
+ pkgs.Add((TPackage) item.Tag);\r
+ }\r
+ \r
+ return pkgs.ToArray();\r
+ }\r
+ }\r
+\r
+}\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<root>\r
+ <!-- \r
+ Microsoft ResX Schema \r
+ \r
+ Version 2.0\r
+ \r
+ The primary goals of this format is to allow a simple XML format \r
+ that is mostly human readable. The generation and parsing of the \r
+ various data types are done through the TypeConverter classes \r
+ associated with the data types.\r
+ \r
+ Example:\r
+ \r
+ ... ado.net/XML headers & schema ...\r
+ <resheader name="resmimetype">text/microsoft-resx</resheader>\r
+ <resheader name="version">2.0</resheader>\r
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
+ <value>[base64 mime encoded serialized .NET Framework object]</value>\r
+ </data>\r
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
+ <comment>This is a comment</comment>\r
+ </data>\r
+ \r
+ There are any number of "resheader" rows that contain simple \r
+ name/value pairs.\r
+ \r
+ Each data row contains a name, and value. The row also contains a \r
+ type or mimetype. Type corresponds to a .NET class that support \r
+ text/value conversion through the TypeConverter architecture. \r
+ Classes that don't support this are serialized and stored with the \r
+ mimetype set.\r
+ \r
+ The mimetype is used for serialized objects, and tells the \r
+ ResXResourceReader how to depersist the object. This is currently not \r
+ extensible. For a given mimetype the value must be set accordingly:\r
+ \r
+ Note - application/x-microsoft.net.object.binary.base64 is the format \r
+ that the ResXResourceWriter will generate, however the reader can \r
+ read any of the formats listed below.\r
+ \r
+ mimetype: application/x-microsoft.net.object.binary.base64\r
+ value : The object must be serialized with \r
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
+ : and then encoded with base64 encoding.\r
+ \r
+ mimetype: application/x-microsoft.net.object.soap.base64\r
+ value : The object must be serialized with \r
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+ : and then encoded with base64 encoding.\r
+\r
+ mimetype: application/x-microsoft.net.object.bytearray.base64\r
+ value : The object must be serialized into a byte array \r
+ : using a System.ComponentModel.TypeConverter\r
+ : and then encoded with base64 encoding.\r
+ -->\r
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
+ <xsd:element name="root" msdata:IsDataSet="true">\r
+ <xsd:complexType>\r
+ <xsd:choice maxOccurs="unbounded">\r
+ <xsd:element name="metadata">\r
+ <xsd:complexType>\r
+ <xsd:sequence>\r
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
+ </xsd:sequence>\r
+ <xsd:attribute name="name" use="required" type="xsd:string" />\r
+ <xsd:attribute name="type" type="xsd:string" />\r
+ <xsd:attribute name="mimetype" type="xsd:string" />\r
+ <xsd:attribute ref="xml:space" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ <xsd:element name="assembly">\r
+ <xsd:complexType>\r
+ <xsd:attribute name="alias" type="xsd:string" />\r
+ <xsd:attribute name="name" type="xsd:string" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ <xsd:element name="data">\r
+ <xsd:complexType>\r
+ <xsd:sequence>\r
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
+ </xsd:sequence>\r
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
+ <xsd:attribute ref="xml:space" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ <xsd:element name="resheader">\r
+ <xsd:complexType>\r
+ <xsd:sequence>\r
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+ </xsd:sequence>\r
+ <xsd:attribute name="name" type="xsd:string" use="required" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ </xsd:choice>\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ </xsd:schema>\r
+ <resheader name="resmimetype">\r
+ <value>text/microsoft-resx</value>\r
+ </resheader>\r
+ <resheader name="version">\r
+ <value>2.0</value>\r
+ </resheader>\r
+ <resheader name="reader">\r
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+ </resheader>\r
+ <resheader name="writer">\r
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+ </resheader>\r
+ <metadata name="packageListFilterToolStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
+ <value>127, 17</value>\r
+ </metadata>\r
+ <metadata name="packageCommandsToolStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
+ <value>314, 17</value>\r
+ </metadata>\r
+ <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
+ <data name="updateToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+ <value>\r
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAyBJREFUOE9dU1lM\r
+ E1EUbUESd038QaNf+iMmGui0pQRDjNEPRSXKh3EJxHampUJEoyzGWEOUEKNIAgmgEKDTmVZAtpAqLlQI\r
+ yiJFoShVFgmrBUEUhmqXub43QFOd5CYv79177rnnnhGL/D4i3rgjaDVkiMSiKI+XDw4MCPwRIIY+l8eT\r
+ D2JnnfWh2r2STpCGdLfLne8rl1H6GLmaWdQ8sLge1NjA1PwVTE1DkFvbC3GZzxbkasMcQTKncQFBMRQC\r
+ AAlVvkkACFWW7VYkMNy9JzYofjUAZY2DUP9uHCw2B3QOzsLHkTmw9EzCkZQqTqY2vD6YXOEkKNojS6I3\r
+ CgCKBOMjTY7Fe6XgDUReNIGUMoBCy3rO3zHPlz638/axn9A/8QsGv81DltHqbbNPQYSW/RNxoWiDAICo\r
+ zx9IroDIRBOPHjhCRV8LI+mtEqX+kFzDWOOzGjhr/zSMTHMwMbsoRITW6Np7Tr9OAJCSNK9IYN3qnNZi\r
+ BDYRRhp3+osrVRniMavWPge8tU/D6HcOM3BJqMK1Qp6EpD3R6XU3Ux6+3xOT+WKLSKcLWAGI0llWyTVs\r
+ S3blB9ck6oxHwQyQZu7wy4/XCHm+WfzbLp8JlaEUK374auXv6JRqpxCp1U58FxVXslpII0j6DwpeCJXB\r
+ ixlJVLQbnRuwN6TakuD/Q6ait/v64YLxGQ7GZxZhDM1X9PSTV6Zmh/fFlWz+n5SO7dt2qcCqwDUh2vL1\r
+ SwzQTvFcLX3T0P55CpbZaP2LseLISI7EvLb7J3Xm5iUjFQYtrZFivBgAqzuGmDT1TMCxtGoOrbBDomRk\r
+ y2NqI7WmmRM3zHgDPHpz+RqEq1kvNkterY0fdiwIhukcmIHsym7+aGo1h7q50Zqx8vz+pMcQnVaDjWby\r
+ ASCf82dum53Ipr3Hr9cs1HeMQvuX7/CyexJq2kehtHEIsip6IIPpguwqG4RrGGRpOsQHgOdBRskVPKGi\r
+ Y2UUOxt7q37+NtsF+WY7FDb0w91KGyTlNnvwDydVMWf/ERcV6UUiEK9cYnEIUn8K0WyUJ7AOKWlwobnH\r
+ UJSHKvW7/Iv/Alo06RVYWPh9AAAAAElFTkSuQmCC\r
+</value>\r
+ </data>\r
+ <data name="upgradeToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+ <value>\r
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwJJREFUOE91k1tM\r
+ 0mEYxv96UVt33dRtW1e1VhfNLls3Nddc2jITswPl5sykXHmglrOpzfJCE9HKA4YIs9RSEdQhpqmc/4J4\r
+ CEQ5qcMTeAAXIjz9odAt9duefdu39/nted/v+yKiruTGREQSHcQB6+S5U+4ACGVkZARPUHyXs29ZEHIh\r
+ Ohdhpb/kwDS7gvklN8bNS2gbmEBeVTdoTK4ykck/uweSwKiLimdUBZLSWRBKNBgx2NDTNwipygjp2BKk\r
+ ygkYrAtoEJEUpGF5D4SW+cETNA9ShaROD5srgJkVH8bmNiGRj+HHMImpGQuVaBX1Qg0F4cl2Ulx7WNoU\r
+ jP6tSwX77ByU42bY1gA7JePiFoZHfmHSMAW32wOfz0e1tABmhQi0XC49BLmeWua+nVEBg8kM9bQLFhdg\r
+ Xf0r49I2ZJpRSGVa8DoV6JTKMTvvQEOXNtiKiEsQZ4hLNwtQxGrDF6keavsWZpyAmYIERU4twu/3IxAI\r
+ hHbb7DxM02ZINGak0gucPIK4SATjt3STaFYuQDK5DoXVi3HHNkbnvJCPjIfMYXm9XrR2SvBz1I4nNzL9\r
+ jQSRSMQ9YgfqWoYgHtBATo6hQ+1Ap86JNnIZTRIdflOmtfWNEMTlcoHU6tClmAYj4dlqA0HkEcnZ9Q62\r
+ YAAm61yoyGy1g9trRE2vBSyRCYV8JUoEMng8HthsNtTyW1HboUHh+ctGCtBP3GNy2S/YYkxQ0w1HXXG6\r
+ UCAgkS/QIYujwuPKIVgsFuj1ejSKFcguacHHo8e01Axeh27ifp5go6ZdBZN9AZubm+jqG0ZmtQLplcN4\r
+ UNoPWrEEOp0OkkE1KprlyImmGykzKMWEALFp5XF3XvHx6bsK6kkbMsrESH7Xi4Q3PYjNFyGhSIyOfi1Y\r
+ X2VISSleqzt8pH/HHH5RV+lvaWkFjd6cchE4QhJiuQnSESuEMhOq29XIei8EI/6pZV/z7uc4fegWg82n\r
+ ZdU5k5jcQBKTB1rOZ1/i81oD6/iJgX+xg9F34x/0jcPn/5nC5h3IH5TSYb0vmXYTAAAAAElFTkSuQmCC\r
+</value>\r
+ </data>\r
+ <data name="installToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+ <value>\r
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA49JREFUOE89k39M\r
+ GwUUx28KUTfnnGE1JF23dZuJxhmN4h8aXTJN8D91W2JnHGIQbaQVyCaoc5M4IyWOxbDE6LSUUmiFrQLp\r
+ gEFt11HaUo5B18FGx4/R0sLalVqu0Bb64+trnb7kk0vu7vu5d+/ebaiVyTbnbNyyN2dT3jYmlXyCSa5t\r
+ 3bhp25ZHHt7My0Vyx/TUcDef/2RuXl7eYz6fb1ar1Zr0en2YYZgkwTAq9R8/NQxF4mdtibRyJI22UaCL\r
+ 0DsA2zjQrrUHpm4H0+k0YDKZ3Hw+/w2KbSU2ZAXNSmVViFvBuWtJ/GhJQT4YR5OBg6o3iNbORZgGgwgE\r
+ gFAojYMHD12hyKeEgHggKygvLy+YnZpcvzw4ieM13ag5rUN9vR6KRgvaNSwcIy7ElwPwez2QSiUuHo8n\r
+ oVj+/x1IJJI9N5zO2B3fEmyOeYTv+uH3B+H2+eHyLODS+CJq+tyo6JpD8ceVMwKBsJrC24kHsx1UV1fv\r
+ Nv7VF7Ven0SlDfiOTeDLwXWIryTxTmcMR3+dwC89Hlw0LqKhoZ8rKqq1C4UFhRR9NNvFya++EH6vsURl\r
+ vfOoGgCK+gCxiehJorbFiYD3HqIcMDMFjNJwe+h8RcWfnp07n38zKzlZVSn8RDUWffcCB7UT+M0ehWpg\r
+ Bo1qFiH/EjIVDgNOFrikA5pVgEKRpIGeyAz0Oab8c6mw38JGdbej6HCuYlX7ERI/vwKzUgNuFUgkyBAB\r
+ po0c2KspNCoAHYlkMlOMBB8yZWUSITtkiQYCIeimI+ieO4ph9cu43GrFtTFgdga4M+HFeVU/RtglsDSj\r
+ YXYdra2jmUU6zYjFYqF5YCDq8QZhdEdQtnAIz3YJINcOYcQODBPXbQvo6LTBO7eMldU4uJU4WtSmBAnO\r
+ MqWlpUKDwRB1e+7C7lvGAfMLeKiJwXG5AoZeoEkJ9HcBDn0SMXqV/6q4+Ot5EtQyJSUluzs7OtbGxsZx\r
+ 414Ye7W7sKv9aZSc/x0tchI0ARe1gMGI7EZmymyeSOXnP6UngZgRiUTbm5uVy+MTt8ClgJucB+7IGuRX\r
+ Qzj1gzV9oS0GqxVwuYBgME3hm6l9+w44KFxPvJbZpdzCwsL36+rqpjWatr9PffOtTyQ6cuvFlwosgh17\r
+ eva//sGQWHxm9tixc97Dh6UuPv+ZzJPPEG8TvIwg81c9TuwnpMQJoiL7if696S3iPeKz+9eL6Pjq/XDO\r
+ P90Qa56ijxDNAAAAAElFTkSuQmCC\r
+</value>\r
+ </data>\r
+ <data name="uninstallToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+ <value>\r
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA49JREFUOE89k39M\r
+ GwUUx28KUTfnnGE1JF23dZuJxhmN4h8aXTJN8D91W2JnHGIQbaQVyCaoc5M4IyWOxbDE6LSUUmiFrQLp\r
+ gEFt11HaUo5B18FGx4/R0sLalVqu0Bb64+trnb7kk0vu7vu5d+/ebaiVyTbnbNyyN2dT3jYmlXyCSa5t\r
+ 3bhp25ZHHt7My0Vyx/TUcDef/2RuXl7eYz6fb1ar1Zr0en2YYZgkwTAq9R8/NQxF4mdtibRyJI22UaCL\r
+ 0DsA2zjQrrUHpm4H0+k0YDKZ3Hw+/w2KbSU2ZAXNSmVViFvBuWtJ/GhJQT4YR5OBg6o3iNbORZgGgwgE\r
+ gFAojYMHD12hyKeEgHggKygvLy+YnZpcvzw4ieM13ag5rUN9vR6KRgvaNSwcIy7ElwPwez2QSiUuHo8n\r
+ oVj+/x1IJJI9N5zO2B3fEmyOeYTv+uH3B+H2+eHyLODS+CJq+tyo6JpD8ceVMwKBsJrC24kHsx1UV1fv\r
+ Nv7VF7Ven0SlDfiOTeDLwXWIryTxTmcMR3+dwC89Hlw0LqKhoZ8rKqq1C4UFhRR9NNvFya++EH6vsURl\r
+ vfOoGgCK+gCxiehJorbFiYD3HqIcMDMFjNJwe+h8RcWfnp07n38zKzlZVSn8RDUWffcCB7UT+M0ehWpg\r
+ Bo1qFiH/EjIVDgNOFrikA5pVgEKRpIGeyAz0Oab8c6mw38JGdbej6HCuYlX7ERI/vwKzUgNuFUgkyBAB\r
+ po0c2KspNCoAHYlkMlOMBB8yZWUSITtkiQYCIeimI+ieO4ph9cu43GrFtTFgdga4M+HFeVU/RtglsDSj\r
+ YXYdra2jmUU6zYjFYqF5YCDq8QZhdEdQtnAIz3YJINcOYcQODBPXbQvo6LTBO7eMldU4uJU4WtSmBAnO\r
+ MqWlpUKDwRB1e+7C7lvGAfMLeKiJwXG5AoZeoEkJ9HcBDn0SMXqV/6q4+Ot5EtQyJSUluzs7OtbGxsZx\r
+ 414Ye7W7sKv9aZSc/x0tchI0ARe1gMGI7EZmymyeSOXnP6UngZgRiUTbm5uVy+MTt8ClgJucB+7IGuRX\r
+ Qzj1gzV9oS0GqxVwuYBgME3hm6l9+w44KFxPvJbZpdzCwsL36+rqpjWatr9PffOtTyQ6cuvFlwosgh17\r
+ eva//sGQWHxm9tixc97Dh6UuPv+ZzJPPEG8TvIwg81c9TuwnpMQJoiL7if696S3iPeKz+9eL6Pjq/XDO\r
+ P90Qa56ijxDNAAAAAElFTkSuQmCC\r
+</value>\r
+ </data>\r
+ <data name="sysinstalled.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+ <value>\r
+ AAABAAMAICAAAAEAIACoEAAANgAAABgYAAABACAAiAkAAN4QAAAQEAAAAQAgAGgEAABmGgAAKAAAACAA\r
+ AABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEuLi4Sqqq\r
+ qoa2traWubm5laGhoZWBgYGHd3d3TgAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnp6eZMfH\r
+ x9nV1dX/3d3d/+Li4v/a2tr/1tbW/9zc3P/IyMj/oqKivZeXl18AAAAAAAAAAAAAAAAAAAACAAAAAQAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl5eXC6+v\r
+ r+fZ2dn/2dnZ/9zc3P/g4OD/39/f/9DQ0P/Pz8//6urq/83Nzf/Ozs7/0NDQ/6CgoKwdHR02AAAACQAA\r
+ ACkAAAAWAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AACzs7Pn09PT/8fHx//IyMj/1NTU/9/f3//h4eH/0tLS/8/Pz//a2tr/vb29/8PDw/+2trb/xcXF/7Cw\r
+ sP8AAABUAAAAOgAAAC4AAAAXAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAqqqqLr29vf+3t7f/vr6+/8bGxv/Pz8//2tra/9vb2//Pz8//x8fH/8rKyv/Gxsb/ubm5/56e\r
+ nv+Ojo7/ycnJ/yEhIXEAAAAhAAAAMgAAAB8AAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAxcXF4c7Ozv+/v7//v7+//8nJyf/Q0ND/0tLU/8/Pz//Gxsb/vr6+/6Ki\r
+ ov+FhYX/hISE/5ubm/+VlZXvAAAAFwwMDBgICAkVAAAAEwAAAAwAAAAAOTs8GlVVV8iJh4f/UVBQngEB\r
+ AToAAAA2ExMTcRQUFGRDQ0ENAAAAAAAAAAAAAAAAiYmJo9PT1P/Ly8v/tra1/7CwsP+vr63/mpmZ/4OE\r
+ g/9qamr/U1JS/2dnZ/+Vk5P/tLS1/6Shod6loqTbw8PE/19fXVoAAAAAAAAABQAAAAB9fH3InpuZ/7ey\r
+ sf/g4OH/m5ub/0dHR/toaGj/paWk+I2Ni9oeHh1zTExNDgAAAAAAAAAAISAeSXJycL6bm5vunJqZ/3d3\r
+ df9zcHP/dHF0/4CBg/+en6H/q7K2/7fHy//A2dv/z+ns/9zk5v/T09T/Xl5egAAAAAAAAAAAAAAAAI2M\r
+ jem7t7T/jo2O/62trv/S1NL/xMTE/5CQkexSUlK6eXl6yKysrfmIiIrmKysreQAAAAoAAAAAMzE1H2Nj\r
+ ZoSKj5T9iJGY/4yco/+Xr7f/udPZ/8vk5f/Q3uD/1dLQ/9Sxp//RfHr/y7y2/7vIyP+Tk5GYAAAAAAAA\r
+ AAAAAAAAh4WF2cC6u/+koaT/rays/66urf+qqan/z8/P/9fX1/+Mi4zdU1FS4YSDhP9qbG7xjZaa7bHC\r
+ x/+1zdT/rMjO/67LzP+9xsj/xbe1/8esqv/Ilo7/xWlZ/7stHv+vBQD/owAA/5kAAP+8ioT/w+Dk/5iU\r
+ lLUAAAAAAAAAAAAAAACMiovcysTF/6ejpf+sra7/oqSk/5KRkf+RjpL/f4yO/5a0rv+5ztP/1O70/9z7\r
+ /f/Q4eP/xsDA/7yfnv+7fXX/tF1d/6s1M/+gDAD/oAAA/6EAAP+iAAD/pAsA/6sdCv+yLBj/txYA/8eJ\r
+ gP/G5ur/ko+OzAAAAAAAAAAAAAAAAJGNjuDSzcz/pqKh/66sr/+pqan/l5eX/6inrP+ntbb/wM/K/7qn\r
+ p/+wdHL/olBS/5g1M/+OERD/hQAA/4EAAP+DAQH/jQAA/5oCAP+vMR3/tz0r/7s8Kf+/Py3/wkEt/8ZD\r
+ LP/IKRD/zHRn/8bp7f+Xk5LWAAAAAAAAAAAAAAAAk4+S4drS0v+mpKX/rK6v/6yqrP+cnJz/wtPX/5BD\r
+ RP+OFBf/jAwF/3wAAP90AAD/dQAA/3sAAP+JAwD/dyIZ/28rIv+ZEAD/rRgB/8BIOf/FTD3/yks6/85P\r
+ PP/RUj7/1FZB/9ZELf/SZ1P/yubr/52enuaTk5MSAAAAAAAAAACRkZLh3tbY/6imp/+usK7/sbCx/6Cg\r
+ oP/H2t//gSsn/38AAP+NFQn/ixgP/4sXDP+JEAX/kBAA/3kkGv+xp6X/tLS0/3YeFv+1Hgv/0WVS/9Nk\r
+ Uv/XYk7/2mRQ/91nUv/gaVX/5l9H/+RoUv/Q5eb/oqip/5SQkC4AAAAAAAAAAJOQkuHe1NX/paOk/7Cv\r
+ r/+0tLX/pqam/8PQ0v+PXVj/jhMI/5gvKf+TJyD/kigd/5ETB/94HRf/xbe1/9/f3//FxcX/nYiH/6Mr\r
+ Fv/demv/3XRi/+B0Yv/jd2P/5nhk/+l7aP/rd17/7HBa/9Pe4f+psbL/kpGRSQAAAAAAAAAAko6Q4dHN\r
+ zf+dm5v/srGx/7/AwP+zs7P/yNHT/5p2ef+OGhH/njoy/5s6Nv+XMSf/fC8q/9fMy//29vb/m2Nb/7WR\r
+ i//f39//kGBY/+KPgv/mhXT/6Yd1/+uJd//uinn/8I16//OPef/0eGP/1dLR/629vv+Rjo1dAAAAAAAA\r
+ AACRjpLhzLS+/5WDiv+2urf/y8vL/7u6u//Gy83/n5KU/48hGv+mSUP/q1VM/6RJQf/UzMz/7uzr/5NO\r
+ Rf+tGAP/rTYj/+ff3//Y1tb/p311/+6Yh//wmYn/85uK//adjP/3no3/+qKR//yJcv/hxL//t8zQ/5GN\r
+ jWcAAAAAAAAAAI+BiuGvqqj/kZuV/720u//N0M7/v72//8HFxv+wtrr/jioh/65WT/+zYFf/lRkS/6RQ\r
+ Sv+UNij/qhYB/7cXAP/AGQH/s2hl//////+5sK7/y4t///Womf/4qpv/+q2c//2unf//saX//5mD/+2/\r
+ t/+80Nj/kY6NgQAAAAAAAAAAdo6D3RXyhf9Lxo7/36jE/9HX1P/FxcX/x8jJ/7rKzv+RMS3/uGdg/7BS\r
+ Sf+QAAD/pBMA/6oVAP+0GAD/whwA/8kaAP/FHw7/1cbD//39/f+oj4v/8rGj//27rP/+va3//7+u///D\r
+ tv//spr/8MK1/8DU2v+QjYu5AAAAAAAAAABogXbYAHs5/2J4af/YxND/19zb/8rKyv/Nzc7/vM7R/5M0\r
+ Mf++cGj/oisg/5sBAP+uGAD/vhkA/8odAP/WJAD/4BYA//AsBP/VraP/4N3c/+Dg4P+nioL//867///M\r
+ vP//z73//9XF///Jsf/0w63/xdTc/5GPj+CXl5cLAAAAAHRqceRHJi3/el9n/8DGx//X2Nj/w8PD/9DQ\r
+ 0f++0NP/lUI9/7dhVP+cCQD/qg8A/7cZAP/EHAD/0CAA/9smAP/nDgD/9Eoo//7g2P/Erqf/3t7e/767\r
+ uv+9oZb//9jI///Zyf//287//9jD//nCqf/L19v/k5aX9paWlRgAAAAAjouNnnp0d/+trKz/9fb5////\r
+ ///h4eH/19fX/8HS1/+bWFP/oSgZ/58EAP+vFwD/uxoA/8cdAP/TIAD/3yYA/+sJAP/7d13///Hv//jV\r
+ yP/As6//1NTU/6ejof/Js6j//N/S///k2///49X//8qz/9re3v+bnaD/k5KQIQAAAAAAAAAJsbSyUaao\r
+ qbi2t7f/2NjY//z8/P//////0N7j/5xbU/+MAAD/phAA/7IXAP+/GwD/yx4A/9ckAP/jIAD/8A4A//+w\r
+ nf//+Pb//9/Z//DXz/+zrKr/vb29/62jn//55+L///Ls///z7v//2Mb/6eXk/6asrv+QkI8sAAAAAAAA\r
+ AAAAAAAAAAAABZ+goBeQkZFimZqauLO0tPPDz9L/nnJt/40AAP+oEwD/tRwA/8EeAP/PIAD/2yYA/+YY\r
+ AP/4JAD//+LX////////7en///Dr/+7i2v/p3tb/7NvS//3m2///5dX//9zJ//u7nv/z6eT/sbq8/42L\r
+ ilAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlpaWDK62uaymnZz/kQUC/60IAP+6DQD/xgoA/9QK\r
+ AP/jCAD/7wAA//8rAv//29D//dnP///Gtf/6xLH/9MKw//jBr//0u6T/5rSh/+C6rP/jxbn/48zE//X2\r
+ 9f/Exsn/nZybOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsri8bbG6vf+FAAD/oQAA/7MI\r
+ A/+4Fgv/vywa/8xIMf/WV0X/0Xxr/9WupP/Rsqz/0LWv/8i9vP/Hysr/y9DS/8rR1P/J1trpy9ngzcfX\r
+ 3KLJ1tuPz9HTidHU1FEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACztblktr/E/59z\r
+ b/+tkY3/uq2r/7i7uP+4zs//vODl/8Ht8/fA5+/fxNfav8TV2qDF1NmFyNHVc8jNzlTEy8w/x8zNOcjK\r
+ zSXHycgdxsjJD8bIyQ0AAAAEAAAABgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJqZ\r
+ nAy6vL2jzubovsjh45bJ3d9ryt3hT8vX2jjK0dIuyM3MHsjJyg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////\r
+ Af///AB///AAE//wAAD/4AAA//AAAIA4AAOADAADgAIAA4AAAAOAAAADgAAAA4AAAAGAAAABgAAAAYAA\r
+ AAGAAAABgAAAAYAAAAGAAAAAgAAAAIAAAADAAAAA8AAAAP4AAAD/AAAB/wAAB/8AP////////////ygA\r
+ AAAYAAAAMAAAAAEAIAAAAAAAYAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAACRkJD/hIKC/3x6ev+RkJD/AAAAAAAAAAAAAAAAu7y8Q7u8vPm8vb3/uru7/7e4\r
+ uP+nqKj/mZqa/5qbm/+dnp7/n6Cg/6CgoP+goKDEAAAAAAAAAAAAAAAAAAAAAAAAAAClpaW0k5KS/4SE\r
+ hP+Xl5exAAAAAAAAAAAAAAAAy8vLOMnJyerExcX/v8DA/7/Bwf+4ubn/rq+v/6eoqP+ioqL/n5+f/6Cg\r
+ oPqgoKCYAAAAAAAAAAAAAAAAAAAAAAAAAACsrKzfuLi4/7i4uP+pqangAAAAAAAAAAAAAAAAAAAACNXV\r
+ 1W7T09PZzc7O+sbIyP+7vLz/r7Cw/6mqqv+jo6P9n5+f7qCgoJKgoKAXAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AACsrKz4ysrK/8rKyv+pqan5AAAAAAAAAAAAAAAAAAAAAAAAAADe3t4U3NzclsTFxfygoaH/i4uL/5SV\r
+ lf+dnZ3WoKCgRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACurq7+0dHR/9HR0f+srKz/AAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAALq6uvChoqL/k5OT/5mZmf+fnp7HAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAACurq730dHR/9HR0f+srKz/xcbGxMTFxf/Dxsb/wcbG/77ExP+7wMD/ub6+/7m/\r
+ v/+2u7z/sre3/6+1tf+ts7T/rLKy/6qwsP+pr6//qK2u/6epqf+ko6P1oKCgtwAAAACtra33z8/P/8/P\r
+ z/+rq6v/zM7O987Pz//O1tb/ztvc/83a2v/M2dr/y9jY/8rX1//I1NX/xdLU/8LS1P/C0tT/wtLU/8DR\r
+ 0//A0dP/wc7Q/8HO0P+xsbD9oKCg9QAAAACtra33z8/P/8/Pz/+rq6v/zM/P/8DJyf+lAAD/pQAA/6kD\r
+ AP+pAwD/qAAA/6oAAP+0BQD/xA8A/9IRAP/YEgD/2BIA/90SAP/XBgD/zTEO/80xDv+1v8H/oKCg/wAA\r
+ AACura331M7T/9TO0/+tq6z/yc7O/6+/v/+lAAD/pQAA/6kDAP+pAwD/qAAA/6kAAP+AKij/kxQK/9IR\r
+ AP/YEgD/2BIA/90SAP/XBgD/zTEO/80xDv+zxsr/oaGh/wAAAACwra/33s3Z/97N2f+xqq//ys7O/7C+\r
+ v/+xGxH/sRsR/7ErHf+zJBX/uBgI/41BOf/FxcX/kHNv/9I7H//aPiP/3jke/+M8If/iLAb/2Eki/9hJ\r
+ Iv+yw8f/o6Oj/wAAAACfuKf3WPKG/1jyhv+Bv5b/yc3N/6+7vP+1LyL/tS8i/7I1J/+3KBj/kTkv/+Xl\r
+ 5f/Pzs7/ysrK/5JFOP/ZVDr/304y/+FTOP/jQRr/3Fc0/9xXNP+yw8b/pKSk/wAAAACXu6P5ANE3/wDR\r
+ N/9etXv/yc3N/622t/+2OCz/tjgs/7QxJP+TRD3/+vr6/7qalv+vQTD/29LQ/7qxr/+0VEH/2l5C/9ph\r
+ Sf/eUTP/2mRI/9pkSP+0w8b/pqam/wAAAACnrKn+NU04/zVNOP9zfHX/ys3N/6mztP+5OC3/uTgt/7kq\r
+ HP+xaGH/t4aA/8cTAf/XNx7/tXNo//////+YeHH/1GhT/9NrWf/XXEX/1m5X/9ZuV/+4xcj/qqqq/wAA\r
+ AAC3tLbQjneF/453hf+imJ7wys3N/6eys/+8LiL/vC4i/70iEv/IGQT/1hgA/90VAP/nOBz/5mBF/9K9\r
+ uP/n5+b/qVU9/+tqSf/tXjf/6XNO/+lzTv+3xsr/rK2t/wAAAAC+vr6Uvr6+/76+vty+vr7Ayc3N/6az\r
+ tP/BHBD/wRwQ/8UbCP/THAH/4B8A/+QWAP/2Ohz//2M9/9xjRP/e1tT/vrGt/+FiNv//Yin//HRF//x0\r
+ Rf+1xsv/rq+v/wAAAAAAAAAAAAAAAAAAAAAAAAAAyc3O/6Sztf/IDwL/yA8C/88WAf/aIQD/5CUA/+gV\r
+ AP/2QiT//3JP//9qR//Hc13/3d3d/5p0ZP/4bDb/+nVP//p1T/+2x8z/sLGx/wAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAyc7O/6O1tv/TAAD/0wAA/9wAAP/nCgD/8AwA//gAAP//PxL//35C//B2Sv/lckz/roh4/8rK\r
+ yv+qYUD/7XRJ/+10Sf+5yM7/sbKy/wAAAAAAAAAAAAAAAAAAAAAAAAAAyc3N/6Sysv/HGhv/xxob/84j\r
+ G//WKBz/3Sgc/+UlHP/vWzL/65BW/9CNaP/HjW7/x4lo/8OYf/+7d1X/1Ilm/9SJZv+9x8v/s7S0/wAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAycvM/6Slpv+iior/ooqK/6OLiv+ljYv/p46M/6mPjf+vm5b/tKih/7Kp\r
+ pP+yqqb/ta2o/7auqP+4raf/vbSv/720r//AxMT/tLW1/wAAAAAAAAAAAAAAAAAAAAAAAAAAzs7Q1b69\r
+ vv+2v8D/tsnJ/7a/wP+2v8D/tr/A/7a/wP+2v8D/tr/A/7a/wP+2v8D/tr/A/7a/wP+2v8D/tr/A/7a/\r
+ wP/Bw8L/t7i41QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAD///8ADgAfAA4AHwAPAB8AD4B/AA/g/wAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAA\r
+ AQAAAAEA8AABAPAAAQDwAAEA8AABAPAAAQD///8A////AP///wAoAAAAEAAAACAAAAABACAAAAAAAEAE\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJGQkP97eXn/kZCQ/wAAAAAAAAAAAAAAALu8vP+7vLz/tLW1/5uc\r
+ nP+bnJz/n6Cg/6CgoP8AAAAAAAAAAAAAAAC0tLTTlJSU/56ens0AAAAAAAAAAAAAAADS0tKCyMnJ/8TG\r
+ xv+5urr/qqur/6CgoP+goKBhAAAAAAAAAAAAAAAAq6ur97+/v/+lpaX/AAAAAAAAAAAAAAAAAAAAAN7e\r
+ 3ja5urr/ioqK/5eXl+ygoKA2AAAAAAAAAAAAAAAAAAAAAK6urvfR0dH/q6ur/8PExIbAwcH/vr+//7u8\r
+ vP+4ubn/tba2/6qqqv+oqKj/pqam/6SkpP+ioqL/oKCg/6CgoJWtra330dHR/6urq//Nz8//zc/P/83O\r
+ z//Mzs7/y83N/8rMzP/Hycn/xsnJ/8bJyf/FyMj/xcjI/8THx/+goKD/ra2t99HR0f+rq6v/ztDQ/62u\r
+ rv+nDw//qxMN/6gODv+pICD/tD8v/9QbAf/UHQH/2B0A/8slA//FyMj/oaGh/66urvfR0dH/rKys/8/R\r
+ 0f+rrKz/siwj/7MxIv+5HQz/ycXE/8xxY//XRyz/3kAl/+NEJ//dOxD/xMfH/6Ojo/+WvaP3APJI/2LC\r
+ gv/P0dH/qamp/7RANf+0LyL/19bV/+7u7v/4+Pj/s42H/9tYO//dXEH/3k8t/8XIyP+lpaX/q6ur90hE\r
+ Q/97eXn/0dLS/6Ojo/+4Qzr/wEE0/9zKyf/YGgD/1IJ1///////WalP/1WxZ/9piSP/Hysr/q6ur/76+\r
+ vpS+vr7/vr6+wNDS0v+ioqL/vC8k/8UcCf/aHgD/5hsA//9ZNv/zpJD/2dnZ//9qPP//ZTH/x8rK/62u\r
+ rv8AAAAAAAAAAAAAAADR0tP/oKCg/8UYB//UGAH/4yYA/+0aAP//cEv//2tI/+Hh4f/Aurj//2s//8jK\r
+ y/+wsbH/AAAAAAAAAAAAAAAA0dLT/6CgoP/KBAT/3A8A/+gSAP/3FgD//388/9aCXP/Xg1n/2oFR/99z\r
+ Q//Jy8v/srOz/wAAAAAAAAAAAAAAANHS0/+goKD/oKCg/6CgoP+ioqL/pKSk/62urv+wsLD/srOz/7W2\r
+ tv+4ubn/ycvM/7W2tv8AAAAAAAAAAAAAAADR0tN40dLT/9HS0//R0tP/0NLS/9DR0v/O0ND/zc/P/83P\r
+ z//Mzs7/y83N/8rMzP+4ubmVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAcBwAAHAcAAB4PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+ AAAAAAAA4AAAAOAAAADgAAAA4AAAAP//AAA=\r
+</value>\r
+ </data>\r
+ <metadata name="packageListFilterToolStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
+ <value>127, 17</value>\r
+ </metadata>\r
+ <metadata name="packageCommandsToolStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
+ <value>314, 17</value>\r
+ </metadata>\r
+ <metadata name="packageListContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
+ <value>511, 17</value>\r
+ </metadata>\r
+ <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
+ <value>53</value>\r
+ </metadata>\r
+</root>\r
--- /dev/null
+\r
+namespace AppliStation\r
+{\r
+ partial class PackageUninstallConfirmForm\r
+ {\r
+ /// <summary>\r
+ /// Designer variable used to keep track of non-visual components.\r
+ /// </summary>\r
+ private System.ComponentModel.IContainer components = null;\r
+ \r
+ /// <summary>\r
+ /// Disposes resources used by the form.\r
+ /// </summary>\r
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>\r
+ protected override void Dispose(bool disposing)\r
+ {\r
+ if (disposing) {\r
+ if (components != null) {\r
+ components.Dispose();\r
+ }\r
+ }\r
+ base.Dispose(disposing);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// This method is required for Windows Forms designer support.\r
+ /// Do not change the method contents inside the source code editor. The Forms designer might\r
+ /// not be able to load this method if it was changed manually.\r
+ /// </summary>\r
+ private void InitializeComponent()\r
+ {\r
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PackageUninstallConfirmForm));\r
+ this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\r
+ this.label = new System.Windows.Forms.Label();\r
+ this.btnPanel = new System.Windows.Forms.FlowLayoutPanel();\r
+ this.runasCheckBox = new System.Windows.Forms.CheckBox();\r
+ this.okButton = new System.Windows.Forms.Button();\r
+ this.cancelButton = new System.Windows.Forms.Button();\r
+ this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();\r
+ this.iconLabel = new System.Windows.Forms.Label();\r
+ this.label2 = new System.Windows.Forms.Label();\r
+ this.tableLayoutPanel1.SuspendLayout();\r
+ this.btnPanel.SuspendLayout();\r
+ this.flowLayoutPanel1.SuspendLayout();\r
+ this.SuspendLayout();\r
+ // \r
+ // tableLayoutPanel1\r
+ // \r
+ this.tableLayoutPanel1.ColumnCount = 1;\r
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\r
+ this.tableLayoutPanel1.Controls.Add(this.label, 0, 0);\r
+ this.tableLayoutPanel1.Controls.Add(this.btnPanel, 0, 2);\r
+ this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel1, 0, 1);\r
+ this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\r
+ this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);\r
+ this.tableLayoutPanel1.Name = "tableLayoutPanel1";\r
+ this.tableLayoutPanel1.RowCount = 3;\r
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\r
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
+ this.tableLayoutPanel1.Size = new System.Drawing.Size(392, 216);\r
+ this.tableLayoutPanel1.TabIndex = 1;\r
+ // \r
+ // label\r
+ // \r
+ this.label.Dock = System.Windows.Forms.DockStyle.Fill;\r
+ this.label.Location = new System.Drawing.Point(10, 10);\r
+ this.label.Margin = new System.Windows.Forms.Padding(10, 10, 10, 0);\r
+ this.label.Name = "label";\r
+ this.label.Size = new System.Drawing.Size(372, 23);\r
+ this.label.TabIndex = 1;\r
+ this.label.Text = "以下のソフトをアンインストールしようとしています。よろしいですか?";\r
+ // \r
+ // btnPanel\r
+ // \r
+ this.btnPanel.AutoSize = true;\r
+ this.btnPanel.Controls.Add(this.runasCheckBox);\r
+ this.btnPanel.Controls.Add(this.okButton);\r
+ this.btnPanel.Controls.Add(this.cancelButton);\r
+ this.btnPanel.Dock = System.Windows.Forms.DockStyle.Right;\r
+ this.btnPanel.Location = new System.Drawing.Point(66, 184);\r
+ this.btnPanel.Name = "btnPanel";\r
+ this.btnPanel.Size = new System.Drawing.Size(323, 29);\r
+ this.btnPanel.TabIndex = 0;\r
+ // \r
+ // runasCheckBox\r
+ // \r
+ this.runasCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\r
+ this.runasCheckBox.AutoSize = true;\r
+ this.runasCheckBox.Checked = true;\r
+ this.runasCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;\r
+ this.runasCheckBox.Location = new System.Drawing.Point(3, 6);\r
+ this.runasCheckBox.Name = "runasCheckBox";\r
+ this.runasCheckBox.Size = new System.Drawing.Size(126, 16);\r
+ this.runasCheckBox.TabIndex = 2;\r
+ this.runasCheckBox.Text = "管理者として実行(&A)";\r
+ this.runasCheckBox.UseVisualStyleBackColor = true;\r
+ this.runasCheckBox.CheckedChanged += new System.EventHandler(this.RunasCheckBoxCheckedChanged);\r
+ // \r
+ // okButton\r
+ // \r
+ this.okButton.AutoSize = true;\r
+ this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;\r
+ this.okButton.Image = ((System.Drawing.Image)(resources.GetObject("okButton.Image")));\r
+ this.okButton.Location = new System.Drawing.Point(135, 3);\r
+ this.okButton.Name = "okButton";\r
+ this.okButton.Size = new System.Drawing.Size(104, 23);\r
+ this.okButton.TabIndex = 0;\r
+ this.okButton.Text = "アンインストール";\r
+ this.okButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r
+ // \r
+ // cancelButton\r
+ // \r
+ this.cancelButton.AutoSize = true;\r
+ this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r
+ this.cancelButton.Location = new System.Drawing.Point(245, 3);\r
+ this.cancelButton.Name = "cancelButton";\r
+ this.cancelButton.Size = new System.Drawing.Size(75, 23);\r
+ this.cancelButton.TabIndex = 1;\r
+ this.cancelButton.Text = "キャンセル";\r
+ // \r
+ // flowLayoutPanel1\r
+ // \r
+ this.flowLayoutPanel1.Controls.Add(this.iconLabel);\r
+ this.flowLayoutPanel1.Controls.Add(this.label2);\r
+ this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\r
+ this.flowLayoutPanel1.Location = new System.Drawing.Point(10, 43);\r
+ this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(10);\r
+ this.flowLayoutPanel1.Name = "flowLayoutPanel1";\r
+ this.flowLayoutPanel1.Size = new System.Drawing.Size(372, 128);\r
+ this.flowLayoutPanel1.TabIndex = 2;\r
+ // \r
+ // iconLabel\r
+ // \r
+ this.iconLabel.Location = new System.Drawing.Point(3, 0);\r
+ this.iconLabel.Name = "iconLabel";\r
+ this.iconLabel.Size = new System.Drawing.Size(1, 1);\r
+ this.iconLabel.TabIndex = 0;\r
+ // \r
+ // label2\r
+ // \r
+ this.label2.AutoSize = true;\r
+ this.label2.Location = new System.Drawing.Point(10, 0);\r
+ this.label2.Name = "label2";\r
+ this.label2.Size = new System.Drawing.Size(0, 12);\r
+ this.label2.TabIndex = 1;\r
+ // \r
+ // PackageUninstallConfirmForm\r
+ // \r
+ this.AcceptButton = this.okButton;\r
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
+ this.CancelButton = this.cancelButton;\r
+ this.ClientSize = new System.Drawing.Size(392, 216);\r
+ this.Controls.Add(this.tableLayoutPanel1);\r
+ this.MaximizeBox = false;\r
+ this.Name = "PackageUninstallConfirmForm";\r
+ this.ShowIcon = false;\r
+ this.ShowInTaskbar = false;\r
+ this.Text = "ソフトのアンインストール";\r
+ this.tableLayoutPanel1.ResumeLayout(false);\r
+ this.tableLayoutPanel1.PerformLayout();\r
+ this.btnPanel.ResumeLayout(false);\r
+ this.btnPanel.PerformLayout();\r
+ this.flowLayoutPanel1.ResumeLayout(false);\r
+ this.flowLayoutPanel1.PerformLayout();\r
+ this.ResumeLayout(false);\r
+ }\r
+ private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;\r
+ private System.Windows.Forms.Label iconLabel;\r
+ private System.Windows.Forms.Label label2;\r
+ private System.Windows.Forms.Label label;\r
+ private System.Windows.Forms.Button cancelButton;\r
+ private System.Windows.Forms.Button okButton;\r
+ private System.Windows.Forms.CheckBox runasCheckBox;\r
+ private System.Windows.Forms.FlowLayoutPanel btnPanel;\r
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.Drawing;\r
+using System.Windows.Forms;\r
+using NaGet.Packages;\r
+using NaGet.Packages.Install;\r
+\r
+namespace AppliStation\r
+{\r
+ /// <summary>\r
+ /// Description of PackageUninstallConfirmForm.\r
+ /// </summary>\r
+ public partial class PackageUninstallConfirmForm : Form\r
+ {\r
+ private InstalledPackage uninstallPackage;\r
+ \r
+ public InstalledPackage UninstallPackage {\r
+ get { return uninstallPackage; }\r
+ set {\r
+ uninstallPackage = value;\r
+ \r
+ label2.Text = string.Format("{0}({1})", uninstallPackage.Name, uninstallPackage.Version);\r
+ label2.Font = new Font(SystemFonts.DefaultFont.FontFamily, SystemFonts.DefaultFont.Size*1.5f);\r
+ \r
+ string iconPath = uninstallPackage.UninstallInfo.IconPath;\r
+ if (!string.IsNullOrEmpty(iconPath)) {\r
+ if (iconPath.EndsWith(",0")) {\r
+ iconPath = iconPath.Substring(0, iconPath.Length-2);\r
+ }\r
+ if (System.IO.File.Exists(iconPath)) {\r
+ iconLabel.Image = Icon.ExtractAssociatedIcon(iconPath).ToBitmap();\r
+ iconLabel.Size = iconLabel.Image.Size;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ public PackageUninstallConfirmForm()\r
+ {\r
+ //\r
+ // The InitializeComponent() call is required for Windows Forms designer support.\r
+ //\r
+ InitializeComponent();\r
+ \r
+ // \8aÇ\97\9d\8eÒ\8c \8cÀ\82Å\93®\82¢\82Ä\82¢\82é\82È\82ç\82Îrunas\82ª\95K\97v\82É\82Í\82È\82ç\82È\82¢\82Ì\82Å\95\\8e¦\82µ\82È\82¢\r
+ if (NaGet.Utils.IsAdministrators()) {\r
+ runasCheckBox.Checked = false;\r
+ runasCheckBox.Visible = false;\r
+ }\r
+ }\r
+ \r
+ #region runas\8aÖ\98A\r
+ \r
+ /// <summary>\r
+ /// runas\82Å\8eÀ\8ds\82·\82é\82©\94Û\82©\r
+ /// </summary>\r
+ public bool UseRunas {\r
+ set {\r
+ runasCheckBox.Checked = (! NaGet.Utils.IsAdministrators()) && value;\r
+ \r
+ updateUseRunas();\r
+ }\r
+ get {\r
+ return runasCheckBox.Checked;\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \91I\91ð\82³\82ê\82½\83p\83b\83P\81[\83W\82ð\92²\8d¸\82µ\82Ä\81ARunas\82ð\8eg\82¤\82×\82«\82©\82¢\82È\82©\82ð\95Ô\82·\r
+ /// </summary>\r
+ public bool GetShouldUseRunas()\r
+ {\r
+ if (NaGet.Utils.IsAdministrators()) {\r
+ // \8aÇ\97\9d\8eÒ\8c \8cÀ\82Å\93®\82¢\82Ä\82¢\82é\8fê\8d\87\82Í\95s\97v\r
+ return false; \r
+ }\r
+ \r
+ return (uninstallPackage.Type != InstallerType.ARCHIVE);\r
+ }\r
+ \r
+ void RunasCheckBoxCheckedChanged(object sender, EventArgs e)\r
+ {\r
+ updateUseRunas();\r
+ }\r
+ \r
+ private void updateUseRunas()\r
+ {\r
+ if (UseRunas) {\r
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PackagesInstallConfirmForm));\r
+ okButton.Image = ((System.Drawing.Bitmap)(resources.GetObject("okButton.Image")));\r
+ } else {\r
+ okButton.Image = null;\r
+ }\r
+ }\r
+ \r
+ #endregion\r
+\r
+ }\r
+}\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<root>\r
+ <!-- \r
+ Microsoft ResX Schema \r
+ \r
+ Version 2.0\r
+ \r
+ The primary goals of this format is to allow a simple XML format \r
+ that is mostly human readable. The generation and parsing of the \r
+ various data types are done through the TypeConverter classes \r
+ associated with the data types.\r
+ \r
+ Example:\r
+ \r
+ ... ado.net/XML headers & schema ...\r
+ <resheader name="resmimetype">text/microsoft-resx</resheader>\r
+ <resheader name="version">2.0</resheader>\r
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
+ <value>[base64 mime encoded serialized .NET Framework object]</value>\r
+ </data>\r
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
+ <comment>This is a comment</comment>\r
+ </data>\r
+ \r
+ There are any number of "resheader" rows that contain simple \r
+ name/value pairs.\r
+ \r
+ Each data row contains a name, and value. The row also contains a \r
+ type or mimetype. Type corresponds to a .NET class that support \r
+ text/value conversion through the TypeConverter architecture. \r
+ Classes that don't support this are serialized and stored with the \r
+ mimetype set.\r
+ \r
+ The mimetype is used for serialized objects, and tells the \r
+ ResXResourceReader how to depersist the object. This is currently not \r
+ extensible. For a given mimetype the value must be set accordingly:\r
+ \r
+ Note - application/x-microsoft.net.object.binary.base64 is the format \r
+ that the ResXResourceWriter will generate, however the reader can \r
+ read any of the formats listed below.\r
+ \r
+ mimetype: application/x-microsoft.net.object.binary.base64\r
+ value : The object must be serialized with \r
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
+ : and then encoded with base64 encoding.\r
+ \r
+ mimetype: application/x-microsoft.net.object.soap.base64\r
+ value : The object must be serialized with \r
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+ : and then encoded with base64 encoding.\r
+\r
+ mimetype: application/x-microsoft.net.object.bytearray.base64\r
+ value : The object must be serialized into a byte array \r
+ : using a System.ComponentModel.TypeConverter\r
+ : and then encoded with base64 encoding.\r
+ -->\r
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
+ <xsd:element name="root" msdata:IsDataSet="true">\r
+ <xsd:complexType>\r
+ <xsd:choice maxOccurs="unbounded">\r
+ <xsd:element name="metadata">\r
+ <xsd:complexType>\r
+ <xsd:sequence>\r
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
+ </xsd:sequence>\r
+ <xsd:attribute name="name" use="required" type="xsd:string" />\r
+ <xsd:attribute name="type" type="xsd:string" />\r
+ <xsd:attribute name="mimetype" type="xsd:string" />\r
+ <xsd:attribute ref="xml:space" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ <xsd:element name="assembly">\r
+ <xsd:complexType>\r
+ <xsd:attribute name="alias" type="xsd:string" />\r
+ <xsd:attribute name="name" type="xsd:string" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ <xsd:element name="data">\r
+ <xsd:complexType>\r
+ <xsd:sequence>\r
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
+ </xsd:sequence>\r
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
+ <xsd:attribute ref="xml:space" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ <xsd:element name="resheader">\r
+ <xsd:complexType>\r
+ <xsd:sequence>\r
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+ </xsd:sequence>\r
+ <xsd:attribute name="name" type="xsd:string" use="required" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ </xsd:choice>\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ </xsd:schema>\r
+ <resheader name="resmimetype">\r
+ <value>text/microsoft-resx</value>\r
+ </resheader>\r
+ <resheader name="version">\r
+ <value>2.0</value>\r
+ </resheader>\r
+ <resheader name="reader">\r
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+ </resheader>\r
+ <resheader name="writer">\r
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+ </resheader>\r
+ <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
+ <data name="okButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+ <value>\r
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAApdJREFUOE+Fk21I\r
+ k1EUx61vgRX0wYqc4mi+JOqoD4WV9oJKpC5fM6m1QKdJEpVCTZFCmpl92FaNEicJlWUffGtEy2eS5sbQ\r
+ 9mIlFRWIIk60TZuYpPt37mgy6QEf+MPl3P/53XPPc+66IJ5PqVRGBwcHv/B6vSLaXk/fiMfjSVMoFE4+\r
+ /0qMEqNaWlpadTrdvNFohM1m84mtGxsbPbTXRp7I/yAULFSr1d9UKpXHZDKBafnDEJaeNaPpkQzlHfmw\r
+ WCy+OHnmNRqNneUEnjxhtVq97DT342YsDvRg8XU7FjQ3Uf8wAyVdWSh6KkGe5qivIvKCAO5AwIzdbseP\r
+ qmuYuV2Dn1olZq9XwC3Nw+VbeyF5nozM5v1IvbMb+xRRPggB5lYBWHD0ghyTFcWYKMrBZOIeOAUCyKp3\r
+ IuZBBBJUYRDf2AFh+WZewDSrYKr0NGZl6ZiKDYUrKAi/SKcUEdhyPxzRd0VIaBAhrHIbL2DM4XDgo7QQ\r
+ X9KOwBqyHcMbt+JzaCTOV+3CwdZ4HH8ihkSXgCRlmB8wFniFDqrAmyVrQsGZe8jMrcehjAak5KvRbZDD\r
+ 8TURw58OY3goGe9fRsFsNi9TD14FAmoMBsOfpKscQuRGhF7isKGkB5vK3qCvrxxwpwLOE8BoOtAXC71e\r
+ P0OA2hVAXV1djFarHWeNFEk7ESfvRPi5TgiLu2B5R4CpY8B4LjBC16NfSN7vBBCuGigK2FgjcyrbIDrb\r
+ jQhpF4RFepj6CeDMBsYkcA0c8M+AgW8aBQRxsSqyq/SIL+MgvshhoP8K4CrF3EiBv3nT5BPwvgnaOEn6\r
+ zSBsbFNqzRgcrPat/w3PIvOs9aAYZKG3t3flMXEcxyZvYc1kP5mMcSQzaYnEkt+SYvhO/gusfu3mrz6d\r
+ pwAAAABJRU5ErkJggg==\r
+</value>\r
+ </data>\r
+</root>
\ No newline at end of file
--- /dev/null
+\r
+namespace AppliStation\r
+{\r
+ partial class PackagesInstallConfirmForm\r
+ {\r
+ /// <summary>\r
+ /// Designer variable used to keep track of non-visual components.\r
+ /// </summary>\r
+ private System.ComponentModel.IContainer components = null;\r
+ \r
+ /// <summary>\r
+ /// Disposes resources used by the form.\r
+ /// </summary>\r
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>\r
+ protected override void Dispose(bool disposing)\r
+ {\r
+ if (disposing) {\r
+ if (components != null) {\r
+ components.Dispose();\r
+ }\r
+ }\r
+ base.Dispose(disposing);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// This method is required for Windows Forms designer support.\r
+ /// Do not change the method contents inside the source code editor. The Forms designer might\r
+ /// not be able to load this method if it was changed manually.\r
+ /// </summary>\r
+ private void InitializeComponent()\r
+ {\r
+ this.components = new System.ComponentModel.Container();\r
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PackagesInstallConfirmForm));\r
+ this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\r
+ this.btnPanel = new System.Windows.Forms.FlowLayoutPanel();\r
+ this.runasCheckBox = new System.Windows.Forms.CheckBox();\r
+ this.okButton = new System.Windows.Forms.Button();\r
+ this.cancelButton = new System.Windows.Forms.Button();\r
+ this.label = new System.Windows.Forms.Label();\r
+ this.packageListView = new System.Windows.Forms.ListView();\r
+ this.nameColumnHeader = new System.Windows.Forms.ColumnHeader();\r
+ this.versionColumnHeader = new System.Windows.Forms.ColumnHeader();\r
+ this.currentVersionColumnHeader = new System.Windows.Forms.ColumnHeader();\r
+ this.packageListViewContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);\r
+ this.selectAllPackagesStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+ this.unselectAllPackagesStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+ this.tableLayoutPanel1.SuspendLayout();\r
+ this.btnPanel.SuspendLayout();\r
+ this.packageListViewContextMenuStrip.SuspendLayout();\r
+ this.SuspendLayout();\r
+ // \r
+ // tableLayoutPanel1\r
+ // \r
+ this.tableLayoutPanel1.ColumnCount = 1;\r
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
+ this.tableLayoutPanel1.Controls.Add(this.btnPanel, 0, 2);\r
+ this.tableLayoutPanel1.Controls.Add(this.label, 0, 0);\r
+ this.tableLayoutPanel1.Controls.Add(this.packageListView, 0, 1);\r
+ this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\r
+ this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);\r
+ this.tableLayoutPanel1.Name = "tableLayoutPanel1";\r
+ this.tableLayoutPanel1.RowCount = 3;\r
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50F));\r
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\r
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
+ this.tableLayoutPanel1.Size = new System.Drawing.Size(392, 266);\r
+ this.tableLayoutPanel1.TabIndex = 0;\r
+ // \r
+ // btnPanel\r
+ // \r
+ this.btnPanel.AutoSize = true;\r
+ this.btnPanel.Controls.Add(this.runasCheckBox);\r
+ this.btnPanel.Controls.Add(this.okButton);\r
+ this.btnPanel.Controls.Add(this.cancelButton);\r
+ this.btnPanel.Dock = System.Windows.Forms.DockStyle.Right;\r
+ this.btnPanel.Location = new System.Drawing.Point(84, 234);\r
+ this.btnPanel.Name = "btnPanel";\r
+ this.btnPanel.Size = new System.Drawing.Size(305, 29);\r
+ this.btnPanel.TabIndex = 0;\r
+ // \r
+ // runasCheckBox\r
+ // \r
+ this.runasCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\r
+ this.runasCheckBox.AutoSize = true;\r
+ this.runasCheckBox.Checked = true;\r
+ this.runasCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;\r
+ this.runasCheckBox.Location = new System.Drawing.Point(3, 6);\r
+ this.runasCheckBox.Name = "runasCheckBox";\r
+ this.runasCheckBox.Size = new System.Drawing.Size(126, 16);\r
+ this.runasCheckBox.TabIndex = 2;\r
+ this.runasCheckBox.Text = "管理者として実行(&A)";\r
+ this.runasCheckBox.UseVisualStyleBackColor = true;\r
+ this.runasCheckBox.CheckedChanged += new System.EventHandler(this.RunasCheckBoxCheckedChanged);\r
+ // \r
+ // okButton\r
+ // \r
+ this.okButton.AutoSize = true;\r
+ this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;\r
+ this.okButton.Image = ((System.Drawing.Image)(resources.GetObject("okButton.Image")));\r
+ this.okButton.Location = new System.Drawing.Point(135, 3);\r
+ this.okButton.Name = "okButton";\r
+ this.okButton.Size = new System.Drawing.Size(86, 23);\r
+ this.okButton.TabIndex = 0;\r
+ this.okButton.Text = "インストール";\r
+ this.okButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r
+ // \r
+ // cancelButton\r
+ // \r
+ this.cancelButton.AutoSize = true;\r
+ this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r
+ this.cancelButton.Location = new System.Drawing.Point(227, 3);\r
+ this.cancelButton.Name = "cancelButton";\r
+ this.cancelButton.Size = new System.Drawing.Size(75, 23);\r
+ this.cancelButton.TabIndex = 1;\r
+ this.cancelButton.Text = "キャンセル";\r
+ // \r
+ // label\r
+ // \r
+ this.label.Dock = System.Windows.Forms.DockStyle.Fill;\r
+ this.label.Location = new System.Drawing.Point(10, 10);\r
+ this.label.Margin = new System.Windows.Forms.Padding(10);\r
+ this.label.Name = "label";\r
+ this.label.Size = new System.Drawing.Size(372, 30);\r
+ this.label.TabIndex = 1;\r
+ this.label.Text = "以下のソフトをインストールしようとしています。インストールするソフトをチェックしてください";\r
+ // \r
+ // packageListView\r
+ // \r
+ this.packageListView.CheckBoxes = true;\r
+ this.packageListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r
+ this.nameColumnHeader,\r
+ this.versionColumnHeader,\r
+ this.currentVersionColumnHeader});\r
+ this.packageListView.ContextMenuStrip = this.packageListViewContextMenuStrip;\r
+ this.packageListView.Dock = System.Windows.Forms.DockStyle.Fill;\r
+ this.packageListView.GridLines = true;\r
+ this.packageListView.Location = new System.Drawing.Point(5, 53);\r
+ this.packageListView.Margin = new System.Windows.Forms.Padding(5, 3, 5, 5);\r
+ this.packageListView.Name = "packageListView";\r
+ this.packageListView.ShowItemToolTips = true;\r
+ this.packageListView.Size = new System.Drawing.Size(382, 173);\r
+ this.packageListView.TabIndex = 2;\r
+ this.packageListView.UseCompatibleStateImageBehavior = false;\r
+ this.packageListView.View = System.Windows.Forms.View.Details;\r
+ this.packageListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.PackageListViewItemChecked);\r
+ this.packageListView.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.PackageListViewColumnClick);\r
+ // \r
+ // nameColumnHeader\r
+ // \r
+ this.nameColumnHeader.Text = "名前";\r
+ this.nameColumnHeader.Width = 146;\r
+ // \r
+ // versionColumnHeader\r
+ // \r
+ this.versionColumnHeader.Text = "バージョン";\r
+ this.versionColumnHeader.Width = 82;\r
+ // \r
+ // currentVersionColumnHeader\r
+ // \r
+ this.currentVersionColumnHeader.Text = "現バージョン";\r
+ this.currentVersionColumnHeader.Width = 89;\r
+ // \r
+ // packageListViewContextMenuStrip\r
+ // \r
+ this.packageListViewContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
+ this.selectAllPackagesStripMenuItem,\r
+ this.unselectAllPackagesStripMenuItem});\r
+ this.packageListViewContextMenuStrip.Name = "packageListViewContextMenuStrip";\r
+ this.packageListViewContextMenuStrip.Size = new System.Drawing.Size(175, 48);\r
+ this.packageListViewContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.PackageListViewContextMenuStripOpening);\r
+ // \r
+ // selectAllPackagesStripMenuItem\r
+ // \r
+ this.selectAllPackagesStripMenuItem.Name = "selectAllPackagesStripMenuItem";\r
+ this.selectAllPackagesStripMenuItem.Size = new System.Drawing.Size(174, 22);\r
+ this.selectAllPackagesStripMenuItem.Text = "全て選択(&A)";\r
+ this.selectAllPackagesStripMenuItem.Click += new System.EventHandler(this.SelectAllPackagesStripMenuItemClick);\r
+ // \r
+ // unselectAllPackagesStripMenuItem\r
+ // \r
+ this.unselectAllPackagesStripMenuItem.Name = "unselectAllPackagesStripMenuItem";\r
+ this.unselectAllPackagesStripMenuItem.Size = new System.Drawing.Size(174, 22);\r
+ this.unselectAllPackagesStripMenuItem.Text = "全ての選択を解除(&U)";\r
+ this.unselectAllPackagesStripMenuItem.Click += new System.EventHandler(this.UnselectAllPackagesStripMenuItemClick);\r
+ // \r
+ // PackagesInstallConfirmForm\r
+ // \r
+ this.AcceptButton = this.okButton;\r
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
+ this.CancelButton = this.cancelButton;\r
+ this.ClientSize = new System.Drawing.Size(392, 266);\r
+ this.Controls.Add(this.tableLayoutPanel1);\r
+ this.MaximizeBox = false;\r
+ this.Name = "PackagesInstallConfirmForm";\r
+ this.ShowIcon = false;\r
+ this.ShowInTaskbar = false;\r
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;\r
+ this.Text = "ソフトのインストール";\r
+ this.tableLayoutPanel1.ResumeLayout(false);\r
+ this.tableLayoutPanel1.PerformLayout();\r
+ this.btnPanel.ResumeLayout(false);\r
+ this.btnPanel.PerformLayout();\r
+ this.packageListViewContextMenuStrip.ResumeLayout(false);\r
+ this.ResumeLayout(false);\r
+ }\r
+ private System.Windows.Forms.ToolStripMenuItem unselectAllPackagesStripMenuItem;\r
+ private System.Windows.Forms.ToolStripMenuItem selectAllPackagesStripMenuItem;\r
+ private System.Windows.Forms.ContextMenuStrip packageListViewContextMenuStrip;\r
+ private System.Windows.Forms.CheckBox runasCheckBox;\r
+ private System.Windows.Forms.ColumnHeader currentVersionColumnHeader;\r
+ private System.Windows.Forms.ColumnHeader versionColumnHeader;\r
+ private System.Windows.Forms.ColumnHeader nameColumnHeader;\r
+ private System.Windows.Forms.ListView packageListView;\r
+ private System.Windows.Forms.Label label;\r
+ private System.Windows.Forms.Button cancelButton;\r
+ private System.Windows.Forms.Button okButton;\r
+ private System.Windows.Forms.FlowLayoutPanel btnPanel;\r
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.Drawing;\r
+using System.Windows.Forms;\r
+using NaGet.Packages;\r
+\r
+namespace AppliStation\r
+{\r
+ /// <summary>\r
+ /// Description of PackagesInstallConfirmForm.\r
+ /// </summary>\r
+ public partial class PackagesInstallConfirmForm : Form\r
+ {\r
+ private Package[] packages;\r
+ \r
+ private PackageListsManager pkgListMan;\r
+ \r
+ /// <summary>\r
+ /// \83p\83b\83P\81[\83W\82Ì\8fW\8d\87\r
+ /// </summary>\r
+ public Package[] Packages {\r
+ get { return packages; }\r
+ set {\r
+ packages = value;\r
+ \r
+ updatePackagesListView();\r
+ }\r
+ }\r
+ \r
+ public PackageListsManager PkgListsManager {\r
+ get { return pkgListMan; }\r
+ set {\r
+ pkgListMan = value;\r
+ \r
+ updatePackagesListView();\r
+ }\r
+ }\r
+ \r
+ public PackagesInstallConfirmForm()\r
+ {\r
+ //\r
+ // The InitializeComponent() call is required for Windows Forms designer support.\r
+ //\r
+ InitializeComponent();\r
+ \r
+ // \8aÇ\97\9d\8eÒ\8c \8cÀ\82Å\93®\82¢\82Ä\82¢\82é\82È\82ç\82Îrunas\82ª\95K\97v\82É\82Í\82È\82ç\82È\82¢\82Ì\82Å\95\\8e¦\82µ\82È\82¢\r
+ if (NaGet.Utils.IsAdministrators()) {\r
+ runasCheckBox.Checked = false;\r
+ runasCheckBox.Visible = false;\r
+ }\r
+ }\r
+ \r
+ private void updatePackagesListView()\r
+ {\r
+ packageListView.Items.Clear();\r
+ \r
+ if (packages != null && packages.Length > 0) {\r
+ foreach (Package pkg in packages) {\r
+ Package curPkg = null;\r
+ if (pkgListMan != null) { \r
+ curPkg = pkgListMan.InstalledPkgList.GetPackageForName(pkg.Name);\r
+ if (curPkg == null) curPkg = pkgListMan.SystemInstalledPkgList.GetPackageForName(pkg.Name);\r
+ }\r
+ string curVersion = (curPkg == null)? "-" : curPkg.Version;\r
+ \r
+ ListViewItem item = new ListViewItem(new string[]{pkg.Name, pkg.Version, curVersion});\r
+ item.Tag = pkg;\r
+ item.ToolTipText = pkg.Summary;\r
+ item.Checked = true;\r
+ \r
+ packageListView.Items.Add(item);\r
+ }\r
+ }\r
+ \r
+ PackageListViewItemChecked(packageListView, null);\r
+ packageListView.Refresh();\r
+ }\r
+ \r
+ void PackageListViewItemChecked(object sender, ItemCheckedEventArgs e)\r
+ {\r
+ System.Windows.Forms.ListView.CheckedListViewItemCollection checkeds = packageListView.CheckedItems;\r
+ \r
+ okButton.Enabled = checkeds != null && checkeds.Count > 0;\r
+ }\r
+ \r
+ AppliStation.Util.ListViewItemSortComparer packageListViewSortComparer;\r
+\r
+ void PackageListViewColumnClick(object sender, ColumnClickEventArgs e)\r
+ {\r
+ SortOrder order = SortOrder.None;\r
+ \r
+ if (packageListViewSortComparer == null) {\r
+ order = SortOrder.Ascending;\r
+ packageListViewSortComparer = new AppliStation.Util.ListViewItemSortComparer(e.Column, order);\r
+ packageListView.ListViewItemSorter = packageListViewSortComparer;\r
+ } else {\r
+ if (packageListViewSortComparer.Column == e.Column) {\r
+ order = (packageListViewSortComparer.Order == SortOrder.Ascending)? SortOrder.Descending : SortOrder.Ascending;\r
+ \r
+ packageListViewSortComparer.Order = order;\r
+ } else {\r
+ order = packageListViewSortComparer.Order;\r
+ packageListViewSortComparer.Column = e.Column;\r
+ }\r
+ \r
+ packageListView.Sort();\r
+ }\r
+ AppliStation.Util.NativeMethods.ColumnHeader_SetSortState(packageListView, e.Column, order);\r
+ \r
+ // \83\\81[\83g\91Î\8fÛ\97ñ\82Ì\90F\95t\82¯\r
+ try {\r
+ // SendMessage(hWnd, LVM_SETSELECTEDCOLUMN, column, NULL);\r
+ AppliStation.Util.NativeMethods.SendMessage(packageListView.Handle, 0x1000+140, (uint) e.Column, 0);\r
+ } catch (Exception) { \r
+ }\r
+ }\r
+ \r
+ \r
+ void PackageListViewContextMenuStripOpening(object sender, System.ComponentModel.CancelEventArgs e)\r
+ {\r
+ System.Windows.Forms.ListView.CheckedIndexCollection coll = packageListView.CheckedIndices;\r
+ selectAllPackagesStripMenuItem.Enabled = coll.Count < packages.Length;\r
+ unselectAllPackagesStripMenuItem.Enabled = coll.Count > 0;\r
+ }\r
+ \r
+ void SelectAllPackagesStripMenuItemClick(object sender, EventArgs e)\r
+ {\r
+ foreach (ListViewItem item in packageListView.Items) {\r
+ item.Checked = true;\r
+ }\r
+ packageListView.Refresh();\r
+ }\r
+ \r
+ void UnselectAllPackagesStripMenuItemClick(object sender, EventArgs e)\r
+ {\r
+ foreach (ListViewItem item in packageListView.CheckedItems) {\r
+ item.Checked = false;\r
+ }\r
+ packageListView.Refresh();\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \83C\83\93\83X\83g\81[\83\8b\82·\82é\82æ\82¤\91I\91ð\82³\82ê\82½\83p\83b\83P\81[\83W\82Ì\94z\97ñ\r
+ /// </summary>\r
+ public Package[] CheckedPackages {\r
+ get {\r
+ System.Collections.Generic.List<Package> pkgs = new System.Collections.Generic.List<Package>();\r
+ foreach (ListViewItem item in packageListView.CheckedItems) {\r
+ pkgs.Add((Package) item.Tag);\r
+ }\r
+ return pkgs.ToArray();\r
+ }\r
+ }\r
+ \r
+ #region runas\8aÖ\98A\r
+ \r
+ /// <summary>\r
+ /// runas\82Å\8eÀ\8ds\82·\82é\82©\94Û\82©\r
+ /// </summary>\r
+ public bool UseRunas {\r
+ set {\r
+ runasCheckBox.Checked = (! NaGet.Utils.IsAdministrators()) && value;\r
+ \r
+ updateUseRunas();\r
+ }\r
+ get {\r
+ return runasCheckBox.Checked;\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \91I\91ð\82³\82ê\82½\83p\83b\83P\81[\83W\82ð\92²\8d¸\82µ\82Ä\81ARunas\82ð\8eg\82¤\82×\82«\82©\82¢\82È\82©\82ð\95Ô\82·\r
+ /// </summary>\r
+ public bool GetShouldUseRunas()\r
+ {\r
+ if (NaGet.Utils.IsAdministrators()) {\r
+ // \8aÇ\97\9d\8eÒ\8c \8cÀ\82Å\93®\82¢\82Ä\82¢\82é\8fê\8d\87\82Í\95s\97v\r
+ return false; \r
+ } else if (NaGet.Utils.IsUACEnabled()) {\r
+ // UAC\82ª\93K\97p\82³\82ê\82Ä\82¢\82é\8fê\8d\87\82Í\95W\8f\80\82Å\82Í\95s\97v\82Æ\82·\82é\r
+ return false; \r
+ }\r
+ \r
+ bool useRunas = false;\r
+ foreach (Package pkg in CheckedPackages) {\r
+ if (pkg.Type != InstallerType.ARCHIVE) {\r
+ useRunas = true;\r
+ break;\r
+ }\r
+ }\r
+ return useRunas;\r
+ }\r
+ \r
+ void RunasCheckBoxCheckedChanged(object sender, EventArgs e)\r
+ {\r
+ updateUseRunas();\r
+ }\r
+ \r
+ private void updateUseRunas()\r
+ {\r
+ if (UseRunas) {\r
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PackagesInstallConfirmForm));\r
+ okButton.Image = ((System.Drawing.Bitmap)(resources.GetObject("okButton.Image")));\r
+ } else {\r
+ okButton.Image = null;\r
+ }\r
+ }\r
+ \r
+ #endregion\r
+\r
+\r
+ }\r
+}\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<root>\r
+ <!-- \r
+ Microsoft ResX Schema \r
+ \r
+ Version 2.0\r
+ \r
+ The primary goals of this format is to allow a simple XML format \r
+ that is mostly human readable. The generation and parsing of the \r
+ various data types are done through the TypeConverter classes \r
+ associated with the data types.\r
+ \r
+ Example:\r
+ \r
+ ... ado.net/XML headers & schema ...\r
+ <resheader name="resmimetype">text/microsoft-resx</resheader>\r
+ <resheader name="version">2.0</resheader>\r
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
+ <value>[base64 mime encoded serialized .NET Framework object]</value>\r
+ </data>\r
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
+ <comment>This is a comment</comment>\r
+ </data>\r
+ \r
+ There are any number of "resheader" rows that contain simple \r
+ name/value pairs.\r
+ \r
+ Each data row contains a name, and value. The row also contains a \r
+ type or mimetype. Type corresponds to a .NET class that support \r
+ text/value conversion through the TypeConverter architecture. \r
+ Classes that don't support this are serialized and stored with the \r
+ mimetype set.\r
+ \r
+ The mimetype is used for serialized objects, and tells the \r
+ ResXResourceReader how to depersist the object. This is currently not \r
+ extensible. For a given mimetype the value must be set accordingly:\r
+ \r
+ Note - application/x-microsoft.net.object.binary.base64 is the format \r
+ that the ResXResourceWriter will generate, however the reader can \r
+ read any of the formats listed below.\r
+ \r
+ mimetype: application/x-microsoft.net.object.binary.base64\r
+ value : The object must be serialized with \r
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
+ : and then encoded with base64 encoding.\r
+ \r
+ mimetype: application/x-microsoft.net.object.soap.base64\r
+ value : The object must be serialized with \r
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+ : and then encoded with base64 encoding.\r
+\r
+ mimetype: application/x-microsoft.net.object.bytearray.base64\r
+ value : The object must be serialized into a byte array \r
+ : using a System.ComponentModel.TypeConverter\r
+ : and then encoded with base64 encoding.\r
+ -->\r
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
+ <xsd:element name="root" msdata:IsDataSet="true">\r
+ <xsd:complexType>\r
+ <xsd:choice maxOccurs="unbounded">\r
+ <xsd:element name="metadata">\r
+ <xsd:complexType>\r
+ <xsd:sequence>\r
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
+ </xsd:sequence>\r
+ <xsd:attribute name="name" use="required" type="xsd:string" />\r
+ <xsd:attribute name="type" type="xsd:string" />\r
+ <xsd:attribute name="mimetype" type="xsd:string" />\r
+ <xsd:attribute ref="xml:space" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ <xsd:element name="assembly">\r
+ <xsd:complexType>\r
+ <xsd:attribute name="alias" type="xsd:string" />\r
+ <xsd:attribute name="name" type="xsd:string" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ <xsd:element name="data">\r
+ <xsd:complexType>\r
+ <xsd:sequence>\r
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
+ </xsd:sequence>\r
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
+ <xsd:attribute ref="xml:space" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ <xsd:element name="resheader">\r
+ <xsd:complexType>\r
+ <xsd:sequence>\r
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+ </xsd:sequence>\r
+ <xsd:attribute name="name" type="xsd:string" use="required" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ </xsd:choice>\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ </xsd:schema>\r
+ <resheader name="resmimetype">\r
+ <value>text/microsoft-resx</value>\r
+ </resheader>\r
+ <resheader name="version">\r
+ <value>2.0</value>\r
+ </resheader>\r
+ <resheader name="reader">\r
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+ </resheader>\r
+ <resheader name="writer">\r
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+ </resheader>\r
+ <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
+ <data name="okButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+ <value>\r
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAApdJREFUOE+Fk21I\r
+ k1EUx61vgRX0wYqc4mi+JOqoD4WV9oJKpC5fM6m1QKdJEpVCTZFCmpl92FaNEicJlWUffGtEy2eS5sbQ\r
+ 9mIlFRWIIk60TZuYpPt37mgy6QEf+MPl3P/53XPPc+66IJ5PqVRGBwcHv/B6vSLaXk/fiMfjSVMoFE4+\r
+ /0qMEqNaWlpadTrdvNFohM1m84mtGxsbPbTXRp7I/yAULFSr1d9UKpXHZDKBafnDEJaeNaPpkQzlHfmw\r
+ WCy+OHnmNRqNneUEnjxhtVq97DT342YsDvRg8XU7FjQ3Uf8wAyVdWSh6KkGe5qivIvKCAO5AwIzdbseP\r
+ qmuYuV2Dn1olZq9XwC3Nw+VbeyF5nozM5v1IvbMb+xRRPggB5lYBWHD0ghyTFcWYKMrBZOIeOAUCyKp3\r
+ IuZBBBJUYRDf2AFh+WZewDSrYKr0NGZl6ZiKDYUrKAi/SKcUEdhyPxzRd0VIaBAhrHIbL2DM4XDgo7QQ\r
+ X9KOwBqyHcMbt+JzaCTOV+3CwdZ4HH8ihkSXgCRlmB8wFniFDqrAmyVrQsGZe8jMrcehjAak5KvRbZDD\r
+ 8TURw58OY3goGe9fRsFsNi9TD14FAmoMBsOfpKscQuRGhF7isKGkB5vK3qCvrxxwpwLOE8BoOtAXC71e\r
+ P0OA2hVAXV1djFarHWeNFEk7ESfvRPi5TgiLu2B5R4CpY8B4LjBC16NfSN7vBBCuGigK2FgjcyrbIDrb\r
+ jQhpF4RFepj6CeDMBsYkcA0c8M+AgW8aBQRxsSqyq/SIL+MgvshhoP8K4CrF3EiBv3nT5BPwvgnaOEn6\r
+ zSBsbFNqzRgcrPat/w3PIvOs9aAYZKG3t3flMXEcxyZvYc1kP5mMcSQzaYnEkt+SYvhO/gusfu3mrz6d\r
+ pwAAAABJRU5ErkJggg==\r
+</value>\r
+ </data>\r
+ <metadata name="packageListViewContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
+ <value>17, 17</value>\r
+ </metadata>\r
+</root>
\ No newline at end of file
--- /dev/null
+using System;\r
+using System.Collections.Generic;\r
+using System.Windows.Forms;\r
+using System.IO;\r
+\r
+namespace AppliStation\r
+{\r
+ class Program\r
+ {\r
+ Form splashScreen;\r
+ \r
+ PackageListViewForm form;\r
+ \r
+ /// <summary>\r
+ /// \83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Ì\83I\83v\83V\83\87\83\93\r
+ /// </summary>\r
+ Dictionary<string, object> appArgs;\r
+ \r
+ string[] restAppArgs;\r
+ \r
+ public Program()\r
+ {\r
+ appArgs = new Dictionary<string, object>();\r
+ appArgs["noupdate"] = false;\r
+ appArgs["cmd"] = string.Empty;\r
+ appArgs["pkgsref"] = string.Empty;\r
+ \r
+ form = new PackageListViewForm();\r
+ }\r
+ \r
+ void RunNormal()\r
+ {\r
+ form.Load += delegate(object sender, EventArgs e) {\r
+ hideSplashScreen();\r
+ form.updateActionInvoke(((bool)appArgs["noupdate"]) != true);\r
+ \r
+ form.UpdatePackageList();\r
+ };\r
+ Application.Run(form);\r
+ }\r
+ \r
+ void RunInstall()\r
+ {\r
+ try {\r
+ NaGet.Packages.Package[] pkgs = NaGet.Utils.GetDeserializedObject<NaGet.Packages.Package[]>((string) appArgs["pkgsref"]);\r
+ \r
+ hideSplashScreen();\r
+ form.installActionInvoke(pkgs);\r
+ } catch (UnauthorizedAccessException e) {\r
+ MessageBox.Show(string.Format("\8aÇ\97\9d\8eÒ\8c \8cÀ\82É\8f¸\8ai\82µ\82Ä\82¢\82È\82¢\82©\81A\8eÀ\8ds\8c \8cÀ\82É\96â\91è\82ª\82 \82è\82Ü\82·\81B\n(\8fÚ\8d×:{0})", e.Message),\r
+ Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+ } catch (FileNotFoundException e) {\r
+ MessageBox.Show(string.Format("\83\\83t\83g\8ew\92è\83t\83@\83C\83\8b{0}\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ", e.FileName),\r
+ Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+ }\r
+ }\r
+ \r
+ void RunUninstall()\r
+ {\r
+ try {\r
+ NaGet.Packages.Install.InstalledPackage[] pkgs = NaGet.Utils.GetDeserializedObject<NaGet.Packages.Install.InstalledPackage[]>((string) appArgs["pkgsref"]);\r
+ \r
+ hideSplashScreen();\r
+ form.uninstallActionInvoke(pkgs);\r
+ } catch (UnauthorizedAccessException e) {\r
+ MessageBox.Show(string.Format("\8aÇ\97\9d\8eÒ\8c \8cÀ\82É\8f¸\8ai\82µ\82Ä\82¢\82È\82¢\82©\81A\8eÀ\8ds\8c \8cÀ\82É\96â\91è\82ª\82 \82è\82Ü\82·\81B\n(\8fÚ\8d×:{0})", e.Message),\r
+ Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+ } catch (FileNotFoundException e) {\r
+ MessageBox.Show(string.Format("\83\\83t\83g\8ew\92è\83t\83@\83C\83\8b{0}\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ", e.FileName),\r
+ Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+ }\r
+ }\r
+ \r
+ private void hideSplashScreen()\r
+ {\r
+ if (splashScreen != null && splashScreen.Visible) {\r
+ splashScreen.Hide();\r
+ splashScreen.Dispose();\r
+ }\r
+ }\r
+ \r
+ public void Run(string[] args)\r
+ {\r
+ parseArgs(args);\r
+ \r
+ switch ((string) appArgs["cmd"]) {\r
+ case "install":\r
+ RunInstall();\r
+ break;\r
+ case "uninstall":\r
+ RunUninstall();\r
+ break;\r
+ default:\r
+ RunNormal();\r
+ break;\r
+ }\r
+ }\r
+ \r
+ private void parseArgs(string[] args)\r
+ {\r
+ ArgParse parser = new ArgParse(appArgs);\r
+ restAppArgs = parser.Parse(args);\r
+ }\r
+ \r
+ [STAThread]\r
+ public static void Main(string[] args)\r
+ {\r
+ Form splashScreen = null;\r
+ \r
+ try {\r
+ if (args.Length <= 0) { // HACK \88ø\90\94\83p\81[\83X\82Ì\8e\9e\8aÔ\82³\82¦\91Ò\82Ä\82È\82¢\82Ì\82Å\88ø\90\94\82Ì\97L\96³\82Å\95\\8e¦\82ð\94»\92f\r
+ splashScreen = new Form();\r
+ splashScreen.FormBorderStyle = FormBorderStyle.None;\r
+ splashScreen.BackgroundImage = System.Drawing.Bitmap.FromFile(Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "SplashScreen.png"));\r
+ splashScreen.Size = splashScreen.BackgroundImage.Size;\r
+ splashScreen.ShowIcon = false;\r
+ splashScreen.ShowInTaskbar = false;\r
+ splashScreen.StartPosition = FormStartPosition.CenterScreen;\r
+ splashScreen.Show();\r
+ }\r
+ \r
+ ToolStripManager.VisualStylesEnabled = false; // ToolStrip\82ªLuna\82Å\90Â\82\82È\82ç\82È\82¢\82æ\82¤\82É\r
+ Application.EnableVisualStyles(); // Luna\82âVista\82Ì\83f\83U\83C\83\93\82ð\97L\8cø\82É\r
+ \r
+ Application.ThreadException += AppliStation.Util.ExceptionDialogForm.Application_ThrowException;\r
+ System.Threading.Thread.GetDomain().UnhandledException += AppliStation.Util.ExceptionDialogForm.Application_ThrowException;\r
+ \r
+ Program prog = new Program();\r
+ prog.splashScreen = splashScreen;\r
+ prog.Run(args);\r
+ } catch (Exception e) {\r
+ AppliStation.Util.ExceptionDialogForm.Application_ThrowException(null, new System.Threading.ThreadExceptionEventArgs(e));\r
+ } finally {\r
+ if (splashScreen != null) {\r
+ splashScreen.Dispose();\r
+ }\r
+ }\r
+ }\r
+ }\r
+}\r
--- /dev/null
+#region Using directives\r
+\r
+using System.Reflection;\r
+using System.Runtime.CompilerServices;\r
+using System.Runtime.InteropServices;\r
+\r
+#endregion\r
+\r
+// General Information about an assembly is controlled through the following \r
+// set of attributes. Change these attribute values to modify the information\r
+// associated with an assembly.\r
+[assembly: AssemblyTitle("all-get")]\r
+[assembly: AssemblyDescription("")]\r
+[assembly: AssemblyConfiguration("")]\r
+[assembly: AssemblyCompany("")]\r
+[assembly: AssemblyProduct("all-get")]\r
+[assembly: AssemblyCopyright("")]\r
+[assembly: AssemblyTrademark("")]\r
+[assembly: AssemblyCulture("")]\r
+\r
+// This sets the default COM visibility of types in the assembly to invisible.\r
+// If you need to expose a type to COM, use [ComVisible(true)] on that type.\r
+[assembly: ComVisible(false)]\r
+\r
+// The assembly version has following format :\r
+//\r
+// Major.Minor.Build.Revision\r
+//\r
+// You can specify all the values or you can use the default the Revision and \r
+// Build Numbers by using the '*' as shown below:\r
+[assembly: AssemblyVersion("0.9.*")]\r
--- /dev/null
+// project created on 2007/09/08 at 20:20\r
+using System;\r
+using System.IO;\r
+using System.Collections.Generic;\r
+using NaGet.Net;\r
+using NaGet.Packages;\r
+using NaGet.Packages.Install;\r
+using NaGet.SubCommands;\r
+\r
+namespace AllGet\r
+{\r
+\r
+ class DownloadListener\r
+ {\r
+ private string line = null;\r
+ \r
+ /// <summary>\r
+ /// lineのコンソール上における長さ\r
+ /// </summary>\r
+ private int lineWidth = 0;\r
+ \r
+ public void OnDownload(object sender, DownloadEventArgs a) {\r
+ if (line != null) {\r
+ lock (line) {\r
+ int newpos = (lineWidth <= 0)? 0 : Console.CursorLeft - lineWidth;\r
+ if (newpos < 0) newpos = 0;\r
+ \r
+ // 空白で埋める\r
+ Console.CursorLeft = newpos;\r
+ for (int i = 0; i < lineWidth && Console.CursorLeft < Console.BufferWidth; i++) {\r
+ Console.Write(' ');\r
+ }\r
+ Console.CursorLeft = newpos;\r
+ \r
+ line = null; lineWidth = 0;\r
+ }\r
+ }\r
+ \r
+ switch (a.Type) {\r
+ case DownloadEventType.INITED:\r
+ line = "starting...";\r
+ break;\r
+ case DownloadEventType.CONNECTED:\r
+ case DownloadEventType.DOWNLOADING:\r
+ line = a.TaskMessage;\r
+ break;\r
+ case DownloadEventType.COMPLETED:\r
+ //\r
+ line = null;\r
+ break;\r
+ case DownloadEventType.ERROR:\r
+ Console.Write("interrupted! ERROR!");\r
+ line = null;\r
+ break;\r
+ }\r
+ \r
+ if (line != null) {\r
+ int posOld = Console.CursorLeft;\r
+ Console.Write(line);\r
+ lineWidth = Console.CursorLeft - posOld;\r
+ }\r
+ }\r
+ }\r
+\r
+ class MainClass\r
+ {\r
+ private Downloader downloader;\r
+ \r
+ private PackageListsManager pkgListMan;\r
+ \r
+ public MainClass()\r
+ {\r
+ downloader = new Downloader();\r
+ DownloadListener dl = new DownloadListener();\r
+ downloader.DownloadEventRaised += new EventHandler<DownloadEventArgs>(dl.OnDownload);\r
+ \r
+ pkgListMan = new PackageListsManager();\r
+ }\r
+ \r
+ public void Update()\r
+ {\r
+ update(true);\r
+ }\r
+ \r
+ public void LocalUpdate()\r
+ {\r
+ update(false);\r
+ }\r
+ \r
+ public void update(bool downloadPackageListFlag)\r
+ {\r
+ NaGet.SubCommands.NaGetUpdate tasks = new NaGet.SubCommands.NaGetUpdate(pkgListMan, downloadPackageListFlag);\r
+ tasks.Downloader = this.downloader;\r
+ tasks.TaskSetRaised += delegate(object sender, NaGetTaskSetEventArgs e) { \r
+ switch (e.Type) {\r
+// case NaGetTaskSetEventType.COMPLETED_TASKSET\r
+// break;\r
+ case NaGetTaskSetEventType.COMPLETED:\r
+ Console.WriteLine("Done.");\r
+ break;\r
+ case NaGetTaskSetEventType.STARTED_TASKSET:\r
+ Console.Write(" " + e.TaskMessage);\r
+ break;\r
+ case NaGetTaskSetEventType.COMPLETED_TASKSET:\r
+ Console.WriteLine(" ... Done. [{0}%]", (int) e.TaskProgressPercent);\r
+ break;\r
+ case NaGetTaskSetEventType.INFO:\r
+ Console.WriteLine(" " + e.TaskMessage);\r
+ break;\r
+ case NaGetTaskSetEventType.ERROR:\r
+ case NaGetTaskSetEventType.WARNING:\r
+ Console.WriteLine(" [Error]" + e.TaskMessage);\r
+ break;\r
+ }\r
+ };\r
+ \r
+ tasks.Run();\r
+ }\r
+ \r
+ public void Upgrade()\r
+ {\r
+ PackageList<Package> packageList = pkgListMan.AvailablePkgList;\r
+ \r
+ VersionComparetor verComp = new VersionComparetor();\r
+ \r
+ foreach (InstalledPackage pkg in pkgListMan.InstalledPkgList.Packages) {\r
+ Package avaiablePkg = packageList.GetPackageForName(pkg.Name);\r
+ \r
+ if (avaiablePkg != null) {\r
+ if (verComp.Compare(pkg.Version, avaiablePkg.Version) < 0 &&\r
+ pkgListMan.InstalledPkgList.GetPackageForPackage(pkg.Name, avaiablePkg.Version) == null) {\r
+ Console.ForegroundColor = ConsoleColor.Green;\r
+ }\r
+ \r
+ Console.WriteLine("{0} ({1}) => ({2})", pkg.Name, pkg.Version, avaiablePkg.Version);\r
+ Console.ResetColor();\r
+ }\r
+ }\r
+ foreach (InstalledPackage pkg in pkgListMan.SystemInstalledPkgList.Packages) {\r
+ Package avaiablePkg = packageList.GetPackageForName(pkg.Name);\r
+ \r
+ if (avaiablePkg != null) {\r
+ if (verComp.Compare(pkg.Version, avaiablePkg.Version) < 0 &&\r
+ pkgListMan.SystemInstalledPkgList.GetPackageForPackage(pkg.Name, avaiablePkg.Version) == null) {\r
+ Console.ForegroundColor = ConsoleColor.Green;\r
+ }\r
+ \r
+ Console.WriteLine("{0} ({1})@sys => ({2})", pkg.Name, pkg.Version, avaiablePkg.Version);\r
+ Console.ResetColor();\r
+ }\r
+ }\r
+ }\r
+ \r
+ public void Search(string keys)\r
+ {\r
+ foreach(Package package in pkgListMan.AvailablePkgList.Search(keys)) {\r
+ Console.WriteLine("{0} ({1}) - {2}", package.Name, package.Version, package.Summary);\r
+ }\r
+ \r
+ foreach(InstalledPackage package in pkgListMan.InstalledPkgList.Search(keys)) {\r
+ Console.WriteLine("{0} ({1})[@install] - {2}", package.Name, package.Version, package.Summary);\r
+ }\r
+ \r
+ foreach(InstalledPackage package in pkgListMan.SystemInstalledPkgList.Search(keys)) {\r
+ Console.WriteLine("{0} ({1})[@sys] - {2}", package.Name, package.Version, package.Summary);\r
+ }\r
+ }\r
+ \r
+ public void Show(string packagename)\r
+ {\r
+ PackageList<Package> allPkgs = new PackageList<Package>();\r
+ allPkgs.AddPackages(pkgListMan.GetAllPackages());\r
+ \r
+ foreach (Package pkg in allPkgs.GetPackagesForName(packagename)) {\r
+ Console.WriteLine("Package: {0}", pkg.Name);\r
+ Console.WriteLine("Version: {0}", pkg.Version);\r
+ if (pkg.Url != null) Console.WriteLine("Website: {0}", pkg.Url.Href);\r
+ if (pkg.Tags != null) Console.WriteLine("Tag: {0}", pkg.Tags.ToLower());\r
+ Console.WriteLine("Type: {0}", pkg.Type);\r
+ if (pkg.License != null) Console.WriteLine("License: {0}", pkg.License);\r
+ if (pkg is InstalledPackage) Console.WriteLine("State: Installed");\r
+ \r
+ if (pkg.Description != null) {\r
+ Console.WriteLine("Description:");\r
+ Console.WriteLine(pkg.Description);\r
+ }\r
+ Console.WriteLine();\r
+ }\r
+ }\r
+ \r
+ public void Download(string[] packagenames)\r
+ {\r
+ Installation[] installations = null;\r
+ {\r
+ List<Package> downloadList = new List<Package>();\r
+ \r
+ foreach(string packagename in packagenames) {\r
+ Package foundPackage = pkgListMan.AvailablePkgList.GetPackageForName(packagename);\r
+ if (foundPackage == null) {\r
+ Console.WriteLine("E: Couldn't find package "+packagename);\r
+ Environment.Exit(1);\r
+ }\r
+ if (! downloadList.Contains(foundPackage)) {\r
+ downloadList.Add(foundPackage);\r
+ }\r
+ }\r
+ \r
+ installations = new Installation[downloadList.Count];\r
+ for (int i = 0; i < installations.Length; i++) {\r
+ installations[i] = new Installation((Package) downloadList[i]);\r
+ }\r
+ }\r
+ \r
+ Console.WriteLine("The following packages will be downloaded:");\r
+ Console.WriteLine(" {0}", Installation.ToString(installations));\r
+ if (AllGet.Util.Confirm("Do you want to continue [Y/n]?", true) == false) {\r
+ Console.WriteLine("Abort.");\r
+ Environment.Exit(0);\r
+ }\r
+ \r
+ {\r
+ int i = 0;\r
+ foreach (Installation inst in installations) {\r
+ i++;\r
+ \r
+ if (! inst.IsInstallablePackage()) {\r
+ Console.WriteLine("E:{0} {1} can not be installed.", i, inst.ToString());\r
+ continue;\r
+ }\r
+ \r
+ try {\r
+ Console.Write("Get:{0} {1}", i, inst.ToString());\r
+ inst.Download(downloader);\r
+ Console.WriteLine(" ...Done");\r
+ } catch (Exception e) {\r
+ Console.WriteLine("E: "+e.Message);\r
+ throw new ApplicationException(string.Format("Failed to download {0}", inst.ToString()), e);\r
+ }\r
+ }\r
+ \r
+ i = 0;\r
+ foreach (Installation inst in installations) {\r
+ i++;\r
+ \r
+ if (inst.IsInstallablePackage() && inst.VerifyHashValues() == false) {\r
+ Console.WriteLine("Verify:{0} {1} does not match hash value!", i, inst.ToString());\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ public void Install(string[] packagenames)\r
+ {\r
+ if (! NaGet.Utils.IsAdministrators()) {\r
+ Console.WriteLine("W: you are not administrators!");\r
+ }\r
+ \r
+ Installation[] installations = null;\r
+ {\r
+ List<Package> downloadList = new List<Package>();\r
+ \r
+ foreach(string packagename in packagenames) {\r
+ Package foundPackage = pkgListMan.AvailablePkgList.GetPackageForName(packagename);\r
+ if (foundPackage == null) {\r
+ Console.WriteLine("E: Couldn't find package "+packagename);\r
+ Environment.Exit(1);\r
+ }\r
+ if (! downloadList.Contains(foundPackage)) {\r
+ downloadList.Add(foundPackage);\r
+ }\r
+ }\r
+ \r
+ installations = new Installation[downloadList.Count];\r
+ for (int i = 0; i < installations.Length; i++) {\r
+ installations[i] = new Installation((Package) downloadList[i]);\r
+ \r
+ if (! installations[i].IsInstallablePackage()) {\r
+ Console.WriteLine("E: Can not install package {0} to your PC.", installations[i].ToString());\r
+ Environment.Exit(1);\r
+ }\r
+ }\r
+ }\r
+ \r
+ Console.WriteLine("The following packages will be downloaded:");\r
+ Console.WriteLine(" {0}", Installation.ToString(installations));\r
+ if (AllGet.Util.Confirm("Do you want to continue [Y/n]?", true) == false) {\r
+ Console.WriteLine("Abort.");\r
+ Environment.Exit(0);\r
+ }\r
+ \r
+ NaGet.SubCommands.NaGetInstall tasks = new NaGet.SubCommands.NaGetInstall(pkgListMan, installations);\r
+ tasks.Downloader = this.downloader;\r
+ tasks.TaskSetRaised += delegate(object sender, NaGetTaskSetEventArgs e) { \r
+ switch (e.Type) {\r
+// case NaGetTaskSetEventType.COMPLETED_TASKSET\r
+// break;\r
+ case NaGetTaskSetEventType.COMPLETED:\r
+ Console.WriteLine("Done.");\r
+ break;\r
+ case NaGetTaskSetEventType.STARTED_TASKSET:\r
+ Console.Write(" " + e.TaskMessage);\r
+ break;\r
+ case NaGetTaskSetEventType.COMPLETED_TASKSET:\r
+ Console.WriteLine(" ... Done. [{0}%]", (int) e.TaskProgressPercent);\r
+ break;\r
+ case NaGetTaskSetEventType.INFO:\r
+ Console.WriteLine(" " + e.TaskMessage);\r
+ break;\r
+ case NaGetTaskSetEventType.ERROR:\r
+ case NaGetTaskSetEventType.WARNING:\r
+ Console.WriteLine(" [Error] " + e.TaskMessage);\r
+ break;\r
+ }\r
+ };\r
+ \r
+ tasks.Run();\r
+ }\r
+ \r
+ public void Remove(string[] packagenames)\r
+ {\r
+ if (! NaGet.Utils.IsAdministrators()) {\r
+ Console.WriteLine("W: you are not administrators!");\r
+ }\r
+ \r
+ this.LocalUpdate();\r
+ \r
+ PackageList<InstalledPackage> installedPkgList = new PackageList<InstalledPackage>();\r
+ installedPkgList.AddPackages(pkgListMan.GetAllInstalledPackages());\r
+ \r
+ Uninstallation[] uninstallations = new Uninstallation[packagenames.Length];\r
+ for (int i = 0; i < packagenames.Length; i++) {\r
+ InstalledPackage pkg = installedPkgList.GetPackageForName(packagenames[i]);\r
+ \r
+ if (pkg == null) {\r
+ Console.WriteLine("E: could not found package " + packagenames[i]);\r
+ Environment.Exit(1);\r
+ }\r
+ \r
+ uninstallations[i] = new Uninstallation(pkg);\r
+ }\r
+ \r
+// if (AllGet.Util.Confirm("Do you want to continue [Y/n]?", true) == false) {\r
+// Console.WriteLine("Abort.");\r
+// Environment.Exit(0);\r
+// }\r
+ \r
+ NaGet.SubCommands.NaGetUninstall tasks = new NaGet.SubCommands.NaGetUninstall(pkgListMan, uninstallations);\r
+ tasks.TaskSetRaised += delegate(object sender, NaGetTaskSetEventArgs e) { \r
+ switch (e.Type) {\r
+// case NaGetTaskSetEventType.COMPLETED_TASKSET\r
+// break;\r
+ case NaGetTaskSetEventType.COMPLETED:\r
+ Console.WriteLine("Done.");\r
+ break;\r
+ case NaGetTaskSetEventType.STARTED_TASKSET:\r
+ Console.Write(" " + e.TaskMessage);\r
+ break;\r
+ case NaGetTaskSetEventType.COMPLETED_TASKSET:\r
+ Console.WriteLine(" ... Done. [{0}%]", (int) e.TaskProgressPercent);\r
+ break;\r
+ case NaGetTaskSetEventType.INFO:\r
+ Console.WriteLine(" " + e.TaskMessage);\r
+ break;\r
+ case NaGetTaskSetEventType.ERROR:\r
+ case NaGetTaskSetEventType.WARNING:\r
+ Console.WriteLine(" [Error] " + e.TaskMessage);\r
+ break;\r
+ }\r
+ };\r
+ \r
+ tasks.Run();\r
+ }\r
+ \r
+ public void CleanCache(string[] packages)\r
+ {\r
+ if (! Directory.Exists(NaGet.Env.ArchiveFolderPath)) {\r
+ return; \r
+ }\r
+ \r
+ int i = 0;\r
+ if (packages.Length == 0) {\r
+ foreach (string folder in Directory.GetDirectories(NaGet.Env.ArchiveFolderPath)) {\r
+ Directory.Delete(folder, true);\r
+ i ++;\r
+ }\r
+ } else {\r
+ foreach (string package in packages) {\r
+ foreach (string folder in Directory.GetDirectories(NaGet.Env.ArchiveFolderPath, package+"*", SearchOption.TopDirectoryOnly)) {\r
+ Directory.Delete(folder, true);\r
+ i ++;\r
+ }\r
+ }\r
+ }\r
+ if (i > 0) {\r
+ Console.WriteLine("... Done.");\r
+ }\r
+ }\r
+ \r
+ public void Help()\r
+ {\r
+ string executeFileName = System.AppDomain.CurrentDomain.FriendlyName;\r
+ Console.Write("Usage:");\r
+ \r
+ Console.WriteLine("\t{0} update|localupdate", executeFileName);\r
+ Console.WriteLine("\t{0} search|show pkg1 [pkg2 ...]", executeFileName);\r
+ Console.WriteLine("\t{0} cleancache [pkg ...]", executeFileName);\r
+ Console.WriteLine("\t{0} download pkg1 [pkg2 ...]", executeFileName);\r
+ Console.WriteLine("\t{0} install|uninstall pkg1 [pkg2 ...]", executeFileName);\r
+ Console.WriteLine();\r
+ Console.WriteLine("{0} is a simple command line interface for downloading and "+\r
+ "installing packages. The most frequently used commands are update "+\r
+ "and install.", executeFileName);\r
+ Console.WriteLine();\r
+ Console.WriteLine("Commands:");\r
+ Console.WriteLine(" update - Retrieve new lists of packages");\r
+ Console.WriteLine(" localupdate - Update installed-soft-list only");\r
+ Console.WriteLine(" search - Search the package list for not a regex pattern");\r
+ Console.WriteLine(" show - Show package detail");\r
+ Console.WriteLine(" cleancache - Clear cached archived file(s)");\r
+ Console.WriteLine(" download - Download only - do NOT install or unpack archives");\r
+ Console.WriteLine(" install - Install new packages");\r
+ Console.WriteLine(" remove - Uninstall packages");\r
+ Console.WriteLine();\r
+ }\r
+ \r
+ public void FooBar()\r
+ {\r
+ foreach (InstalledPackage pkg in pkgListMan.SystemInstalledPkgList.Packages) {\r
+ Console.WriteLine("{0} : {1}", pkg.Name, pkg.UninstallInfo.UninstallString);\r
+ }\r
+ }\r
+ \r
+ public void Hoge()\r
+ {\r
+ foreach (UninstallInformation uInfo in RegistriedUninstallers.Uninstallers) {\r
+ if (! uInfo.IsOSPatch && ! uInfo.IsSystemComponent) {\r
+ Console.WriteLine("{0}", uInfo.DisplayName);\r
+ }\r
+ }\r
+ }\r
+ \r
+ public static void Main(string[] args)\r
+ {\r
+ // アーカイブSYSTEM32をパスに足す\r
+ NaGet.Utils.AddDirectoryToPath(NaGet.Env.ArchiveSystem32);\r
+ \r
+ MainClass mc = new MainClass();\r
+ \r
+ if (args.Length == 0) {\r
+ mc.Help();\r
+ } else if (args[0] == "update") {\r
+ if (args.Length != 1) {\r
+ Console.WriteLine("E: The update command takes no arguments");\r
+ Environment.Exit(1);\r
+ }\r
+ mc.Update();\r
+ } else if (args[0] == "localupdate") {\r
+ if (args.Length != 1) {\r
+ Console.WriteLine("E: The update command takes no arguments");\r
+ Environment.Exit(1);\r
+ }\r
+ mc.LocalUpdate();\r
+ } else if (args[0] == "search") {\r
+ if (args.Length <= 1) {\r
+ Console.WriteLine("E: You must give exactly one pattern");\r
+ Environment.Exit(1);\r
+ }\r
+ \r
+ mc.Search(string.Join(" ", args, 1, args.Length - 1));\r
+ } else if (args[0] == "show") {\r
+ if (args.Length <= 1) {\r
+ Console.WriteLine("E: You must give exactly one pattern");\r
+ Environment.Exit(1);\r
+ }\r
+ \r
+ for (int i = 1; i < args.Length; i++) {\r
+ mc.Show(args[i]);\r
+ }\r
+ } else if (args[0] == "download") {\r
+ if (args.Length <= 1) {\r
+ Console.WriteLine("E: Invalid operation download");\r
+ Environment.Exit(1);\r
+ }\r
+ \r
+ string[] packages = new string[args.Length - 1];\r
+ Array.Copy(args, 1, packages, 0, packages.Length);\r
+ \r
+ mc.Download(packages);\r
+ } else if (args[0] == "install") {\r
+ if (args.Length <= 1) {\r
+ Console.WriteLine("E: Invalid operation install");\r
+ Environment.Exit(1);\r
+ }\r
+ \r
+ string[] packages = new string[args.Length - 1];\r
+ Array.Copy(args, 1, packages, 0, packages.Length);\r
+ \r
+ mc.Install(packages);\r
+ } else if (args[0] == "upgrade") {\r
+ mc.Upgrade();\r
+ } else if (args[0] == "remove") {\r
+ if (args.Length <= 1) {\r
+ Console.WriteLine("E: Invalid operation remove");\r
+ Environment.Exit(1);\r
+ }\r
+ \r
+ string[] packages = new string[args.Length - 1];\r
+ Array.Copy(args, 1, packages, 0, packages.Length);\r
+ \r
+ mc.Remove(packages);\r
+ } else if (args[0] == "cleancache") {\r
+ string[] packages = new string[args.Length - 1];\r
+ Array.Copy(args, 1, packages, 0, packages.Length);\r
+ \r
+ mc.CleanCache(packages);\r
+ } else if (args[0] == "foobar") {\r
+ mc.FooBar();\r
+ } else if (args[0] == "hoge") {\r
+ mc.Hoge();\r
+ } else {\r
+ mc.Help();\r
+ \r
+ Environment.Exit(1);\r
+ }\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+\r
+namespace AllGet\r
+{\r
+ \r
+ sealed class Util\r
+ {\r
+ public static bool Confirm(string msg, bool defaultSelection)\r
+ {\r
+ Console.Write(msg);\r
+ string response = Console.ReadLine();\r
+ \r
+ switch (response.ToLower())\r
+ {\r
+ case "y":\r
+ return true;\r
+ case "n":\r
+ return false;\r
+ default:\r
+ return defaultSelection;\r
+ }\r
+ }\r
+ }\r
+}\r
--- /dev/null
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <PropertyGroup>\r
+ <ProjectGuid>{F212C7FF-0FC5-4319-BD72-87DB3A4CC55F}</ProjectGuid>\r
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>\r
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>\r
+ <OutputType>Exe</OutputType>\r
+ <RootNamespace>AllGet</RootNamespace>\r
+ <AssemblyName>all-get</AssemblyName>\r
+ <BaseIntermediateOutputPath>bin/</BaseIntermediateOutputPath>\r
+ <AllowUnsafeBlocks>False</AllowUnsafeBlocks>\r
+ <NoStdLib>False</NoStdLib>\r
+ <WarningLevel>4</WarningLevel>\r
+ <TreatWarningsAsErrors>false</TreatWarningsAsErrors>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">\r
+ <OutputPath>bin\Debug\</OutputPath>\r
+ <DebugSymbols>true</DebugSymbols>\r
+ <DebugType>Full</DebugType>\r
+ <Optimize>False</Optimize>\r
+ <CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>\r
+ <DefineConstants>DEBUG;TRACE</DefineConstants>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">\r
+ <OutputPath>bin\Release\</OutputPath>\r
+ <DebugSymbols>False</DebugSymbols>\r
+ <DebugType>None</DebugType>\r
+ <Optimize>True</Optimize>\r
+ <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>\r
+ <DefineConstants>TRACE</DefineConstants>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">\r
+ <RegisterForComInterop>False</RegisterForComInterop>\r
+ <GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>\r
+ <BaseAddress>4194304</BaseAddress>\r
+ <PlatformTarget>AnyCPU</PlatformTarget>\r
+ <FileAlignment>4096</FileAlignment>\r
+ </PropertyGroup>\r
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />\r
+ <ItemGroup>\r
+ <Reference Include="System" />\r
+ <Reference Include="System.Xml" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <Compile Include="AssemblyInfo.cs" />\r
+ <Compile Include="Main.cs" />\r
+ <Compile Include="Util.cs" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ProjectReference Include="..\na-get-lib\na-get-lib.csproj">\r
+ <Project>{058E953D-3986-4F74-8516-5A50D267D36A}</Project>\r
+ <Name>na-get-lib</Name>\r
+ </ProjectReference>\r
+ </ItemGroup>\r
+</Project>
\ No newline at end of file
--- /dev/null
+#region Using directives\r
+\r
+using System.Reflection;\r
+using System.Runtime.CompilerServices;\r
+using System.Runtime.InteropServices;\r
+\r
+#endregion\r
+\r
+// General Information about an assembly is controlled through the following \r
+// set of attributes. Change these attribute values to modify the information\r
+// associated with an assembly.\r
+[assembly: AssemblyTitle("archive-inst")]\r
+[assembly: AssemblyDescription("")]\r
+[assembly: AssemblyConfiguration("")]\r
+[assembly: AssemblyCompany("")]\r
+[assembly: AssemblyProduct("archive-inst")]\r
+[assembly: AssemblyCopyright("")]\r
+[assembly: AssemblyTrademark("")]\r
+[assembly: AssemblyCulture("")]\r
+\r
+// This sets the default COM visibility of types in the assembly to invisible.\r
+// If you need to expose a type to COM, use [ComVisible(true)] on that type.\r
+[assembly: ComVisible(false)]\r
+\r
+// The assembly version has following format :\r
+//\r
+// Major.Minor.Build.Revision\r
+//\r
+// You can specify all the values or you can use the default the Revision and \r
+// Build Numbers by using the '*' as shown below:\r
+[assembly: AssemblyVersion("1.0.*")]\r
--- /dev/null
+using System;\r
+using System.Xml.Serialization;\r
+using System.Collections.Generic;\r
+using System.IO;\r
+using NaGet.Packages;\r
+\r
+namespace ArchiveInstall\r
+{\r
+ public class InstalledFileList\r
+ {\r
+ [XmlElement("Entry")]\r
+ public List<InstalledFile> Entries;\r
+ \r
+ public InstalledFileList()\r
+ {\r
+ Entries = new List<InstalledFile>();\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \83n\83b\83V\83\85\8c\9f\8fØ\82ð\8ds\82¢\81A\95Ï\8dX\82³\82ê\82½\82Æ\8am\94F\82µ\82½(\91Ã\93\96\82Å\82È\82¢)\83t\83@\83C\83\8b\82ð\95Ô\82·\r
+ /// </summary>\r
+ /// <param name="rootDirectory">\8c\9f\8d¸\82·\82é\83t\83@\83C\83\8b\82Ì\83\8b\81[\83g\83f\83B\83\8c\83N\83g\83\8a</param>\r
+ /// <returns>\95Ï\8dX\82³\82ê\82½\82Æ\8c\9f\8fo\82µ\82½\83t\83@\83C\83\8b()</returns>\r
+ public IEnumerable<InstalledFile> Verify(string rootDirectory)\r
+ {\r
+ foreach (InstalledFile file in Entries) {\r
+ if (! file.Hash.Validate(Path.Combine(rootDirectory, file.Path)) ) {\r
+ yield return file;\r
+ }\r
+ }\r
+ }\r
+ \r
+ public static InstalledFileList CreateFromFiles(string rootDirectory)\r
+ {\r
+ InstalledFileList list = new InstalledFileList();\r
+ foreach (string filepath in Directory.GetFiles(rootDirectory, "*", SearchOption.AllDirectories)) {\r
+ string relativePath = NaGet.Utils.GetRelativePath(rootDirectory, filepath);\r
+ if (relativePath.StartsWith(".applistation.")) {\r
+ continue;\r
+ }\r
+ \r
+ InstalledFile file = new InstalledFile();\r
+ file.Path = relativePath;\r
+ file.Hash = new HashValue();\r
+ file.Hash.Type = HashValueType.SHA1SUM;\r
+ file.Hash.Value = HashValue.HashValueFor(filepath, file.Hash.Type);\r
+ \r
+ list.Entries.Add(file);\r
+ }\r
+ return list;\r
+ }\r
+ }\r
+ \r
+ public class InstalledFile\r
+ {\r
+ /// <summary>\r
+ /// \83t\83@\83C\83\8b\82Ì\83p\83X\r
+ /// </summary>\r
+ public string Path;\r
+ \r
+ /// <summary>\r
+ /// \83n\83b\83V\83\85\92l\r
+ /// </summary>\r
+ public HashValue Hash;\r
+ \r
+ public InstalledFile()\r
+ {\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using Microsoft.Build.BuildEngine;\r
+\r
+namespace ArchiveInstall\r
+{\r
+ public static class MSBuild\r
+ {\r
+ public static Engine Engine {\r
+ get {\r
+ string binPath = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory();\r
+ return new Engine(binPath);\r
+ }\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// WriteHandler\82ð\8eæ\82è\8fo\82·\82½\82ß\82Ì\83N\83\89\83X\r
+ /// </summary>\r
+ public class MSBuildLogger : ConsoleLogger\r
+ {\r
+ public void AddHandler(WriteHandler writehandler)\r
+ {\r
+ this.WriteHandler += writehandler;\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.Text;\r
+using System.IO;\r
+using Microsoft.Build.BuildEngine;\r
+using NaGet.Packages;\r
+using NaGet.Packages.Install;\r
+\r
+namespace ArchiveInstall\r
+{\r
+ class Program\r
+ {\r
+ public const string InstalledFileListName = ".applistation.installedfiles.xml";\r
+ \r
+ public const string InstalledPackageFileName = ".applistation.package.xml";\r
+ \r
+ private static void extract(string arcFile, string extractDestDir)\r
+ {\r
+ StringBuilder output = new StringBuilder(1024);\r
+ int res = NaGet.InteropServices.CommonArchiverExtracter.ExtractArchive(arcFile, extractDestDir, output, IntPtr.Zero);\r
+ if (res != 0) {\r
+ Environment.Exit(res);\r
+ }\r
+ }\r
+ \r
+ private static void install(string fakeTargetDir, string targetDir)\r
+ {\r
+ string installSrc = fakeTargetDir;\r
+ \r
+ if (Directory.GetFiles(installSrc).Length == 0 &&\r
+ Directory.GetDirectories(installSrc).Length == 1) {\r
+ installSrc = Directory.GetDirectories(installSrc)[0];\r
+ }\r
+ \r
+ // ハッシュ比較\r
+ if (Directory.Exists(targetDir)) {\r
+ InstalledFileList list = null;\r
+ try {\r
+ list = NaGet.Utils.GetDeserializedObject<InstalledFileList>(Path.Combine(targetDir, InstalledFileListName));\r
+ } catch {\r
+ }\r
+ if (list != null) {\r
+ foreach (InstalledFile changedFile in list.Verify(targetDir)) { // 変更されたファイルたちを。。。\r
+ string changedFilePath = Path.Combine(targetDir, changedFile.Path);\r
+ string toBeChangedFilePath = Path.Combine(installSrc, changedFile.Path);\r
+ \r
+ if (File.Exists(toBeChangedFilePath)) {\r
+ File.Move(toBeChangedFilePath, toBeChangedFilePath + ".newfile"); // 新規を退避させて\r
+ }\r
+ File.Copy(changedFilePath, toBeChangedFilePath); // installSrcの方に反映させておく\r
+ }\r
+ }\r
+ } else {\r
+ Directory.CreateDirectory(targetDir);\r
+ }\r
+ \r
+ // まずはフォルダツリーを作成\r
+ foreach (string dir in Directory.GetDirectories(installSrc, "*", SearchOption.AllDirectories)) {\r
+ string dirPath = NaGet.Utils.GetRelativePath(installSrc, dir);\r
+ string targetDirPath = Path.Combine(targetDir, dirPath);\r
+ if (! Directory.Exists(targetDirPath)) {\r
+ Directory.CreateDirectory(targetDirPath);\r
+ }\r
+ }\r
+ \r
+ // ファイルをインストール(高速化のため移動)\r
+ foreach (string file in Directory.GetFiles(installSrc, "*", SearchOption.AllDirectories)) {\r
+ string filePath = NaGet.Utils.GetRelativePath(installSrc, file);\r
+ string targetFilePath = Path.Combine(targetDir, filePath);\r
+ if (File.Exists(targetFilePath)) {\r
+ File.Delete(targetFilePath);\r
+ }\r
+ File.Move(file, targetFilePath);\r
+ }\r
+ }\r
+ \r
+ private static void postInstall(string targetDir, Package package)\r
+ {\r
+ // SYSTEM32へのコピーの実行\r
+ if (!string.IsNullOrEmpty(package.System32CopyFiles)) {\r
+ if (! Directory.Exists(NaGet.Env.ArchiveSystem32)) {\r
+ Directory.CreateDirectory(NaGet.Env.ArchiveSystem32);\r
+ }\r
+ \r
+ string logfile = Path.Combine(NaGet.Env.ArchiveSystem32, ".applistation.install."+package.Name+".log");\r
+ if (File.Exists(logfile)) {\r
+ File.SetAttributes(logfile, FileAttributes.Normal);\r
+ }\r
+ using (FileStream fs = new FileStream(logfile, FileMode.Create))\r
+ using (StreamWriter sw = new StreamWriter(fs)){\r
+ foreach (string pathpat in package.System32CopyFiles.Split(';')) {\r
+ foreach (string path in NaGet.Utils.ExtendWildcardFile(targetDir, pathpat)) {\r
+ if ((File.GetAttributes(path) & FileAttributes.Directory) == 0) { // もしファイルならば\r
+ string destPath = Path.Combine(NaGet.Env.ArchiveSystem32, Path.GetFileName(path));\r
+ File.Copy(path, destPath, true);\r
+ \r
+ sw.WriteLine(Path.GetFileName(destPath));\r
+ }\r
+ }\r
+ }\r
+ }\r
+ File.SetAttributes(logfile, FileAttributes.Hidden);\r
+ }\r
+ \r
+ // インストールスクリプトの実行\r
+ if (! string.IsNullOrEmpty(package.InstallScript) ) {\r
+ Engine engine = MSBuild.Engine;\r
+ Project proj = new Project(engine);\r
+ try {\r
+ proj.LoadXml(package.InstallScript);\r
+ } catch (InvalidProjectFileException e) {\r
+ throw new ApplicationException("InstallScript is invalid", e);\r
+ }\r
+ \r
+ engine.BuildProject(proj, "Install");\r
+ }\r
+ \r
+ // 直下のファイルで*.exeがGUIプログラムならプログラムフォルダに登録\r
+ foreach (string exeFile in Directory.GetFiles(targetDir, "*.exe")) {\r
+ if (NaGet.InteropServices.PEFileInfoUtils.GetPEFileType(exeFile) == NaGet.InteropServices.PEFileInfoUtils.PEFileType.WinGUI) {\r
+ string progGrpPath = Path.Combine(NaGet.Env.ArchiveProgramGroup, package.Name);\r
+ if (! Directory.Exists(progGrpPath)) Directory.CreateDirectory(progGrpPath);\r
+ \r
+ using (NaGet.InteropServices.ShellLink lnk = new NaGet.InteropServices.ShellLink() ) {\r
+ //string path = NaGet.Utils.GetRelativePath(progGrpPath, exeFile);// lnkファイルに相対パス指定不能\r
+ string path = exeFile;\r
+ \r
+ lnk.Path = path;\r
+ //lnk.SetIconLocation(path, 0);\r
+ \r
+ // .lnk ファイル名\r
+ string lnkFileName;\r
+ System.Diagnostics.FileVersionInfo vInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo(exeFile);\r
+ if (vInfo.ProductName != null && vInfo.ProductName != string.Empty\r
+ && (!File.Exists(Path.Combine(progGrpPath, vInfo.ProductName+".lnk")))) {\r
+ // 原則、lnkファイル名に製品名を採用\r
+ lnkFileName = vInfo.ProductName;\r
+ } else {\r
+ // そのほかの場合は、*.exeファイルの名前をそのまま使用\r
+ lnkFileName = Path.GetFileNameWithoutExtension(exeFile);\r
+ }\r
+ \r
+ // 保存\r
+ lnk.ToPersistFile().Save(Path.Combine(progGrpPath, lnkFileName+".lnk"), true);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ private static void storeInstalledFileList(string targetDir)\r
+ {\r
+ string installedFileListPath = Path.Combine(targetDir, InstalledFileListName);\r
+ if (File.Exists(installedFileListPath)) {\r
+ File.SetAttributes(installedFileListPath, FileAttributes.Normal);\r
+ }\r
+ InstalledFileList installedFileList = InstalledFileList.CreateFromFiles(targetDir);\r
+ NaGet.Utils.PutSerializeObject(installedFileListPath, installedFileList);\r
+ \r
+ File.SetAttributes(installedFileListPath, FileAttributes.Hidden | FileAttributes.ReadOnly);\r
+ }\r
+ \r
+ private static void storePackageXml(Package package, string destDir)\r
+ {\r
+ if (package == null) {\r
+ return;\r
+ }\r
+ \r
+ InstalledPackage pkg = InstalledPackage.PackageConverter(package);\r
+ UninstallInformation uninfo = pkg.UninstallInfo;\r
+ uninfo.InstallLocation = destDir;\r
+ uninfo.UninstallString = string.Format("archive-inst -x \"{0}\"", package.Name);\r
+ uninfo.EstimatedSize = (int) (NaGet.Utils.GetFileSize(destDir) >> 10);\r
+ uninfo.InstallDateString = DateTime.Now.ToString("yyyyMMdd");\r
+ pkg.UninstallInfo = uninfo;\r
+ \r
+ string packageXmlFilePath = Path.Combine(destDir, InstalledPackageFileName);\r
+ if (File.Exists(packageXmlFilePath)) {\r
+ File.SetAttributes(packageXmlFilePath, FileAttributes.Normal);\r
+ }\r
+ NaGet.Utils.PutSerializeObject(packageXmlFilePath, pkg);\r
+ File.SetAttributes(packageXmlFilePath, FileAttributes.Hidden | FileAttributes.ReadOnly);\r
+ }\r
+ \r
+ private static void removePackage(InstalledPackage package, string targetDir)\r
+ {\r
+ // アンインストールスクリプトの実行\r
+ if (! string.IsNullOrEmpty(package.InstallScript)) {\r
+ Engine engine = MSBuild.Engine;\r
+ Project proj = new Project(engine);\r
+ try {\r
+ proj.LoadXml(package.InstallScript);\r
+ } catch (InvalidProjectFileException e) {\r
+ throw new ApplicationException("InstallScript is invalid", e);\r
+ }\r
+ \r
+ engine.BuildProject(proj, "Uninstall");\r
+ }\r
+ \r
+ // GUIプログラムでプログラムフォルダに登録しているのを解除\r
+ string progGrpPath = Path.Combine(NaGet.Env.ArchiveProgramGroup, package.Name);\r
+ if (Directory.Exists(progGrpPath)) {\r
+ NaGet.Utils.SetAttributeRecursive(progGrpPath, FileAttributes.Normal);\r
+ Directory.Delete(progGrpPath, true);\r
+ }\r
+ \r
+ // SYSTEM32からの削除の実行\r
+ if (! string.IsNullOrEmpty(package.System32CopyFiles) ) {\r
+ string logfile = Path.Combine(NaGet.Env.ArchiveSystem32, ".applistation.install."+package.Name+".log");\r
+ \r
+ if (File.Exists(logfile)) {\r
+ using (FileStream fs = new FileStream(logfile, FileMode.Open))\r
+ using (StreamReader sr = new StreamReader(fs)){\r
+ string fileName = sr.ReadLine().Trim();\r
+ string filePath = Path.Combine(NaGet.Env.ArchiveSystem32, fileName);\r
+ \r
+ if (File.Exists(filePath)) {\r
+ File.SetAttributes(filePath, FileAttributes.Normal);\r
+ File.Delete(filePath);\r
+ }\r
+ }\r
+ File.SetAttributes(logfile, FileAttributes.Normal);\r
+ File.Delete(logfile);\r
+ }\r
+ }\r
+ \r
+ NaGet.Utils.SetAttributeRecursive(targetDir, FileAttributes.Normal);\r
+ Directory.Delete(targetDir, true);\r
+ }\r
+ \r
+ private static void parseMainArguments(string[] args, out string arcFile, out string targetDir, out Package package)\r
+ {\r
+ if (args.Length < 1) {\r
+ throw new ArgumentException();\r
+ }\r
+ \r
+ switch (args[0].ToLower()) {\r
+ case "-t":\r
+ if (args.Length != 3) {\r
+ throw new ArgumentException();\r
+ }\r
+ \r
+ arcFile = args[1];\r
+ targetDir = args[2];\r
+ package = null;\r
+ break;\r
+ case "-i":\r
+ if (args.Length != 3) {\r
+ throw new ArgumentException();\r
+ }\r
+ \r
+ arcFile = args[1];\r
+ PackageList<Package> pkgList = NaGet.Utils.GetDeserializedObject<PackageList<Package>>(NaGet.Env.PackageListFile);\r
+ package = pkgList.GetPackageForName(args[2]);\r
+ targetDir = Path.Combine(NaGet.Env.ArchiveProgramFiles, package.Name);\r
+ break;\r
+ case "-x":\r
+ if (args.Length != 2) {\r
+ throw new ArgumentException();\r
+ }\r
+ \r
+ arcFile = null;\r
+ targetDir = Path.Combine(NaGet.Env.ArchiveProgramFiles, args[1]);\r
+ package = null;\r
+ \r
+ string filepath = Path.Combine(targetDir, InstalledPackageFileName);\r
+ if (File.Exists(filepath)) {\r
+ package = NaGet.Utils.GetDeserializedObject<InstalledPackage>(filepath);\r
+ } else {\r
+ Console.Error.WriteLine("Not found or already removed package : {0}", args[1]);\r
+ Environment.Exit(100);\r
+ }\r
+ break;\r
+ default:\r
+ arcFile = null;\r
+ targetDir = null;\r
+ package = null;\r
+ Console.Error.WriteLine("Unreconized command \"{0}\".", args[0]);\r
+ Environment.Exit(100);\r
+ break;\r
+ }\r
+ }\r
+ \r
+ [STAThread]\r
+ public static void Main(string[] args)\r
+ {\r
+ // アーカイブSYSTEM32をパスに足す\r
+ NaGet.Utils.AddDirectoryToPath(NaGet.Env.ArchiveSystem32);\r
+ \r
+ string arcFile = null;\r
+ string targetDir = null;\r
+ Package package = null;\r
+ \r
+ try {\r
+ parseMainArguments(args, out arcFile, out targetDir, out package);\r
+ } catch (ArgumentException) {\r
+ string executeFileName = System.AppDomain.CurrentDomain.FriendlyName;\r
+ Console.Write("Usage:");\r
+ Console.WriteLine("\t{0} -t archive.zip target_dir\tExtraction", executeFileName);\r
+ Console.WriteLine("\t{0} -i archive.zip PackageName\tInstall", executeFileName);\r
+ Console.WriteLine("\t{0} -x PackageName\t\tUninstall", executeFileName);\r
+ Console.WriteLine();\r
+ }\r
+ \r
+ if (arcFile != null) { // install or extract \r
+ string tempExtractDir = targetDir + "___temp___"; // HACK \r
+ Directory.CreateDirectory(tempExtractDir);\r
+ \r
+ try {\r
+ extract(arcFile, tempExtractDir);\r
+ \r
+ install(tempExtractDir, targetDir);\r
+ \r
+ if (package != null) {\r
+ postInstall(targetDir, package);\r
+ \r
+ storeInstalledFileList(targetDir);\r
+ storePackageXml(package, targetDir);\r
+ }\r
+ } catch (DllNotFoundException) {\r
+ Console.Error.WriteLine("E: Does not exist archive dll for {0}", arcFile); // TODO\r
+ Environment.Exit(10);\r
+ } finally {\r
+ Directory.Delete(tempExtractDir, true);\r
+ }\r
+ } else if (package is InstalledPackage) {\r
+ removePackage((InstalledPackage) package, targetDir);\r
+ }\r
+ }\r
+ }\r
+}\r
--- /dev/null
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <PropertyGroup>\r
+ <ProjectGuid>{9D7ADB99-6E53-4E3E-A13B-6D82412B3671}</ProjectGuid>\r
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>\r
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>\r
+ <OutputType>Exe</OutputType>\r
+ <RootNamespace>ArchiveInstall</RootNamespace>\r
+ <AssemblyName>archive-inst</AssemblyName>\r
+ <BaseIntermediateOutputPath>bin/</BaseIntermediateOutputPath>\r
+ <AllowUnsafeBlocks>False</AllowUnsafeBlocks>\r
+ <NoStdLib>False</NoStdLib>\r
+ <WarningLevel>4</WarningLevel>\r
+ <TreatWarningsAsErrors>false</TreatWarningsAsErrors>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">\r
+ <OutputPath>bin\Debug\</OutputPath>\r
+ <DebugSymbols>true</DebugSymbols>\r
+ <DebugType>Full</DebugType>\r
+ <Optimize>False</Optimize>\r
+ <CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>\r
+ <DefineConstants>DEBUG;TRACE</DefineConstants>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">\r
+ <OutputPath>bin\Release\</OutputPath>\r
+ <DebugSymbols>False</DebugSymbols>\r
+ <DebugType>None</DebugType>\r
+ <Optimize>True</Optimize>\r
+ <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>\r
+ <DefineConstants>TRACE</DefineConstants>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">\r
+ <RegisterForComInterop>False</RegisterForComInterop>\r
+ <GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>\r
+ <BaseAddress>4194304</BaseAddress>\r
+ <PlatformTarget>x86</PlatformTarget>\r
+ <FileAlignment>4096</FileAlignment>\r
+ </PropertyGroup>\r
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />\r
+ <ItemGroup>\r
+ <Reference Include="Microsoft.Build.Engine" />\r
+ <Reference Include="Microsoft.Build.Framework" />\r
+ <Reference Include="Microsoft.Build.Tasks" />\r
+ <Reference Include="System" />\r
+ <Reference Include="System.Xml" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <Compile Include="AssemblyInfo.cs" />\r
+ <Compile Include="InstalledFileList.cs" />\r
+ <Compile Include="MSBuild.cs" />\r
+ <Compile Include="Program.cs" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ProjectReference Include="..\na-get-lib\na-get-lib.csproj">\r
+ <Project>{058E953D-3986-4F74-8516-5A50D267D36A}</Project>\r
+ <Name>na-get-lib</Name>\r
+ </ProjectReference>\r
+ </ItemGroup>\r
+</Project>
\ No newline at end of file
--- /dev/null
+@set path=%windir%\Microsoft.NET\Framework\v2.0.50727;%path%\r
+msbuild AppliStation.proj /t:Build\r
+msbuild AppliStation.proj /t:Dist /p:IncludePdb=Yes
\ No newline at end of file
--- /dev/null
+using System.Reflection;\r
+using System.Runtime.CompilerServices;\r
+\r
+// Information about this assembly is defined by the following\r
+// attributes.\r
+//\r
+// change them to the information which is associated with the assembly\r
+// you compile.\r
+\r
+[assembly: AssemblyTitle("NaGet Library")]\r
+[assembly: AssemblyDescription("")]\r
+[assembly: AssemblyConfiguration("")]\r
+[assembly: AssemblyCompany("")]\r
+[assembly: AssemblyProduct("")]\r
+[assembly: AssemblyCopyright("")]\r
+[assembly: AssemblyTrademark("")]\r
+[assembly: AssemblyCulture("")]\r
+\r
+// The assembly version has following format :\r
+//\r
+// Major.Minor.Build.Revision\r
+//\r
+// You can specify all values by your own or you can build default build and revision\r
+// numbers with the '*' character (the default):\r
+\r
+[assembly: AssemblyVersion("0.9.8.*")]\r
+\r
+// The following attributes specify the key for the sign of your assembly. See the\r
+// .NET Framework documentation for more information about signing.\r
+// This is not required, if you don't want signing let these attributes like they're.\r
+[assembly: AssemblyDelaySign(false)]\r
+[assembly: AssemblyKeyFile("")]\r
--- /dev/null
+using System;\r
+using System.Runtime.InteropServices;\r
+using System.IO;\r
+\r
+namespace NaGet.InteropServices\r
+{\r
+ /// <summary>\r
+ /// CommonArchiverDllの設定\r
+ /// </summary>\r
+ public struct CommonArchiverDllConfig\r
+ {\r
+ public CommonArchiverDllConfig(string dllName, string cmdName, string cmdLineFmt, int versionreq)\r
+ {\r
+ DllName = dllName;\r
+ CmdName = cmdName;\r
+ CmdLineFmt = cmdLineFmt;\r
+ VersionMoreThan = versionreq;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// DLLの名称。LoadLibraryに渡される\r
+ /// </summary>\r
+ public string DllName;\r
+ /// <summary>\r
+ /// コマンド名称。\r
+ /// </summary>\r
+ public string CmdName;\r
+ /// <summary>\r
+ /// コマンドライン形式"{0}"がアーカイブ名、"{1}"が展開先\r
+ /// </summary>\r
+ public string CmdLineFmt;\r
+ /// <summary>\r
+ /// 最低バージョン要求\r
+ /// </summary>\r
+ public int VersionMoreThan;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// アーカイバDLLを使った書庫展開器\r
+ /// </summary>\r
+ public class CommonArchiverExtracter\r
+ {\r
+ \r
+ #region DLL関数のdelegate\r
+ \r
+ /// <summary>\r
+ /// DLL の版の取得\r
+ /// </summary>\r
+ private delegate ushort ArcGetVersion();\r
+ \r
+ /// <summary>\r
+ /// DLL の実行状況の取得\r
+ /// </summary>\r
+ private delegate bool ArcGetRunning();\r
+ \r
+ /// <summary>\r
+ /// 書庫のチェック\r
+ /// </summary>\r
+ private delegate bool ArcCheckArchive(string szFileName, ArchCheckFlag iMode);\r
+ \r
+ /// <summary>\r
+ /// 書庫のチェックの精度\r
+ /// </summary>\r
+ private enum ArchCheckFlag {\r
+ /// <summary>\r
+ /// 簡易モード。先頭の数個のヘッダのみ確認\r
+ /// </summary>\r
+ RAPID = 0,\r
+ /// <summary>\r
+ /// 通常モード。すべてのヘッダを確認\r
+ /// </summary>\r
+ BASIC = 1,\r
+ /// <summary>\r
+ /// 厳密モード。CRCも含めすべて確認\r
+ /// </summary>\r
+ FULLCRC = 2,\r
+ //RECOVERY = 4,\r
+ //SFX = 8,\r
+ //ALL = 16,\r
+ }\r
+ \r
+ /// <summary>\r
+ /// 格納ファイル数の取得\r
+ /// </summary>\r
+ private delegate int ArcGetFileCount(string szFileName);\r
+ \r
+ /// <summary>\r
+ /// 書庫操作一般\r
+ /// </summary>\r
+ private delegate int ArcMain(IntPtr hWnd,\r
+ [MarshalAs(UnmanagedType.LPStr)] string szCmdLine,\r
+ [MarshalAs(UnmanagedType.LPStr)] System.Text.StringBuilder szOutput, uint dwSize);\r
+ \r
+ #endregion\r
+ \r
+ /// <summary>\r
+ /// アーカイバDLLの設定\r
+ /// </summary>\r
+ public static readonly CommonArchiverDllConfig[] Configs = {\r
+ new CommonArchiverDllConfig("UNZIP32", "UnZip", "-x -o \"{0}\" \"{1}\" *", 541),\r
+ new CommonArchiverDllConfig("7-ZIP32", "SevenZip", "x -y \"{0}\" \"-o{1}\"", 423),\r
+ new CommonArchiverDllConfig("UNLHA32", "Unlha", "x \"{0}\" \"{1}\" *", 240),\r
+ new CommonArchiverDllConfig("CAB32", "Cab", "-x \"{0}\" \"{1}\" *", 98),\r
+ new CommonArchiverDllConfig("TAR32", "Tar", "-x \"{0}\" -o \"{1}\"", 218),\r
+ new CommonArchiverDllConfig("UNGCA32", "UnGCA", "e \"{0}\" \"{1}\"", 10), // いるかな?\r
+ \r
+ //new CommonArchiverDllConfig("UNRAR32", "Unrar", "x -y \"{0}\" \"{1}\" *", -1),\r
+ };\r
+ \r
+ /// <summary>\r
+ /// アーカイブを展開する。適切なDLLで自動的に展開する。\r
+ /// </summary>\r
+ /// <param name="arcFile">アーカイブのパス</param>\r
+ /// <param name="targetDir">展開先ディレクトリ</param>\r
+ /// <param name="output">アーカイバDLLの展開時の標準出力を格納する</param>\r
+ /// <param name="hWnd">親フレーム</param>\r
+ /// <returns>アーカイバDLLの展開時のエラーコード(0なら正常終了)</returns>\r
+ public static int ExtractArchive(string arcFile, string targetDir, System.Text.StringBuilder output, IntPtr hWnd)\r
+ {\r
+ foreach (CommonArchiverDllConfig config in Configs) {\r
+ try {\r
+ return ExtractArchiveWith(arcFile, targetDir, config, output, hWnd);\r
+ } catch (DllNotFoundException) {\r
+ } catch (ApplicationException) {\r
+ }\r
+ }\r
+ throw new DllNotFoundException("Not found dll matched for " + arcFile);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// 指定したDLLの設定を使ってアーカイブを展開する\r
+ /// </summary>\r
+ /// <param name="arcFile">アーカイブのパス</param>\r
+ /// <param name="targetDir">展開先ディレクトリ</param>\r
+ /// <param name="config">使用するアーカイバDLLの設定</param>\r
+ /// <param name="output">アーカイバDLLの展開時の標準出力を格納する</param>\r
+ /// <param name="hWnd">親フレーム</param>\r
+ /// <returns>アーカイバDLLの展開時のエラーコード(0なら正常終了)</returns>\r
+ public static int ExtractArchiveWith(string arcFile, string targetDir, CommonArchiverDllConfig config, System.Text.StringBuilder output, IntPtr hWnd)\r
+ {\r
+ if (! File.Exists(arcFile) ) {\r
+ throw new FileNotFoundException("File not found: ", arcFile);\r
+ }\r
+ if (! Directory.Exists(targetDir)) {\r
+ throw new DirectoryNotFoundException("Directory not found: " + targetDir);\r
+ }\r
+ \r
+ // 統合アーカイバDLLの解凍先ディレクトリは\で終わらないといけない(重要)\r
+ if (! targetDir.EndsWith("\\")) {\r
+ targetDir += "\\";\r
+ }\r
+ \r
+ // DLLバージョンチェック\r
+ using (DllAccess dll = new DllAccess(config.DllName)) {\r
+ ArcGetVersion GetVersion = (ArcGetVersion) dll.GetFunction(config.CmdName+"GetVersion", typeof(ArcGetVersion));\r
+ ushort version = GetVersion();\r
+ if (version < config.VersionMoreThan) {\r
+ throw new DllNotFoundException("Dll version is too old.");\r
+ }\r
+ }\r
+ \r
+ string cmdLine = string.Format(config.CmdLineFmt, arcFile, targetDir);\r
+ return ExtractArchiveWith(config.DllName, config.CmdName, cmdLine, arcFile, output, hWnd);\r
+ }\r
+ \r
+ protected static int ExtractArchiveWith(string dllName, string cmdName, string cmdLine, string arcFile, System.Text.StringBuilder output, IntPtr hWnd)\r
+ {\r
+ using (DllAccess dll = new DllAccess(dllName)) {\r
+ ArcGetRunning GetRunning = (ArcGetRunning) dll.GetFunction(cmdName+"GetRunning", typeof(ArcGetRunning));\r
+ if ( GetRunning() ) { // マルチスレッド対応でないのでビジー時には例外\r
+ throw new SystemException(dllName + " is busy");\r
+ }\r
+ \r
+ ArcCheckArchive CheckArchive = (ArcCheckArchive) dll.GetFunction(cmdName+"CheckArchive", typeof(ArcCheckArchive));\r
+ if (! CheckArchive(arcFile, ArchCheckFlag.BASIC)) {\r
+ throw new ApplicationException(dllName + " could not treat the archive file");\r
+ }\r
+ \r
+ ArcMain Exec = (ArcMain) dll.GetFunction(cmdName, typeof(ArcMain));\r
+ int retVal = Exec(hWnd, cmdLine, output, (uint)((output != null)? output.Capacity : 0) );\r
+ \r
+ return retVal;\r
+ }\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.Diagnostics;\r
+using System.Runtime.InteropServices;\r
+\r
+namespace NaGet.InteropServices\r
+{\r
+ public class CreateProcessCaller : IDisposable\r
+ {\r
+ #region Win32API\r
+ \r
+ /*\r
+ [StructLayout(LayoutKind.Sequential)]\r
+ internal struct SECURITY_ATTRIBUTES\r
+ {\r
+ public int nLength;\r
+ public IntPtr lpSecurityDescriptor;\r
+ public int bInheritHandle;\r
+ }\r
+ */\r
+ \r
+ [StructLayout(LayoutKind.Sequential)]\r
+ internal struct PROCESS_INFORMATION\r
+ {\r
+ public IntPtr hProcess;\r
+ public IntPtr hThread;\r
+ public int dwProcessId;\r
+ public int dwThreadId;\r
+ }\r
+ \r
+ [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]\r
+ struct STARTUPINFO\r
+ {\r
+ public Int32 cb;\r
+ string lpReserved;\r
+ string lpDesktop;\r
+ string lpTitle;\r
+ Int32 dwX;\r
+ Int32 dwY;\r
+ Int32 dwXSize;\r
+ Int32 dwYSize;\r
+ Int32 dwXCountChars;\r
+ Int32 dwYCountChars;\r
+ Int32 dwFillAttribute;\r
+ Int32 dwFlags;\r
+ Int16 wShowWindow;\r
+ Int16 cbReserved2;\r
+ IntPtr lpReserved2;\r
+ IntPtr hStdInput;\r
+ IntPtr hStdOutput;\r
+ IntPtr hStdError;\r
+ }\r
+ \r
+ [DllImport("kernel32.dll", CharSet= CharSet.Auto, SetLastError=true)]\r
+ static extern bool CreateProcess(string lpApplicationName,\r
+ string lpCommandLine,\r
+ /* ref SECURITY_ATTRIBUTES lpProcessAttributes, */\r
+ IntPtr lpProcessAttributes,\r
+ /* ref SECURITY_ATTRIBUTES lpThreadAttributes, */\r
+ IntPtr lpThreadAttributes,\r
+ bool bInheritHandles,\r
+ uint dwCreationFlags, IntPtr lpEnvironment, string lpCurrentDirectory,\r
+ [In] ref STARTUPINFO lpStartupInfo,\r
+ out PROCESS_INFORMATION lpProcessInformation);\r
+ \r
+ [DllImport("kernel32", SetLastError=true, ExactSpelling=true)]\r
+ static extern UInt32 WaitForSingleObject(IntPtr handle, UInt32 milliseconds);\r
+ \r
+ [DllImport("kernel32.dll", SetLastError=true)]\r
+ [return: MarshalAs(UnmanagedType.Bool)]\r
+ static extern bool CloseHandle(IntPtr hObject);\r
+ \r
+ [DllImport("kernel32.dll", SetLastError = true)]\r
+ [return: MarshalAs(UnmanagedType.Bool)]\r
+ static extern bool GetExitCodeProcess(IntPtr hProcess, out int lpExitCode);\r
+ \r
+ #endregion\r
+ \r
+ STARTUPINFO si;\r
+ PROCESS_INFORMATION pi;\r
+ \r
+ public CreateProcessCaller(ProcessStartInfo procInfo)\r
+ {\r
+ if (procInfo.UseShellExecute) {\r
+ throw new ArgumentException("UseShellExecute must be false");\r
+ }\r
+ si.cb = Marshal.SizeOf(si);\r
+ \r
+ string lpFileName = (string.IsNullOrEmpty(procInfo.FileName))? null : procInfo.FileName;\r
+ \r
+ uint dwCreationFlags = 0x0020; // NORMAL_PRIORITY_CLASS\r
+ if (procInfo.CreateNoWindow) dwCreationFlags |= 0x08000000; // CREATE_NO_WINDOW\r
+ string lpCurrentDirectory = (System.IO.Directory.Exists(procInfo.WorkingDirectory))? procInfo.WorkingDirectory : null;\r
+ \r
+ bool retValue = CreateProcess(lpFileName, procInfo.Arguments,\r
+ IntPtr.Zero, IntPtr.Zero,\r
+ false, dwCreationFlags,\r
+ IntPtr.Zero, lpCurrentDirectory, ref si, out pi);\r
+ if (! retValue) {\r
+ throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());\r
+ }\r
+ CloseHandle(pi.hThread);\r
+ }\r
+ \r
+ public uint WaitForExit(uint timeout)\r
+ {\r
+ return WaitForSingleObject(pi.hProcess, timeout);\r
+ }\r
+ \r
+ public uint WaitForExit()\r
+ {\r
+ // return WaitForExit(INFINITE)\r
+ return WaitForExit(0xFFFFFFFF);\r
+ }\r
+ \r
+ public int ExitCode {\r
+ get {\r
+ int lpExitCode;\r
+ if (! GetExitCodeProcess(pi.hProcess, out lpExitCode) ) {\r
+ throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());\r
+ }\r
+ return lpExitCode;\r
+ }\r
+ }\r
+ \r
+ public void Dispose()\r
+ {\r
+ CloseHandle(pi.hProcess);\r
+ }\r
+ \r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.Reflection;\r
+using System.Runtime.InteropServices;\r
+\r
+namespace NaGet.InteropServices\r
+{\r
+ /// <summary>\r
+ /// DLLへの動的アクセスを行うクラス\r
+ /// </summary>\r
+ public class DllAccess : IDisposable\r
+ {\r
+ #region Win32 API\r
+ \r
+ [DllImport("kernel32.dll", CharSet=CharSet.Auto)]\r
+ private extern static IntPtr LoadLibrary(string lpFileName);\r
+ \r
+ [DllImport("kernel32.dll")]\r
+ private extern static bool FreeLibrary(IntPtr hModule);\r
+ \r
+ [DllImport("kernel32.dll", CharSet=CharSet.Ansi)]\r
+ private extern static IntPtr GetProcAddress(IntPtr hModule, string lpProcName);\r
+ \r
+ #endregion\r
+ \r
+ private IntPtr hModule = IntPtr.Zero;\r
+ \r
+ /// <summary>\r
+ /// コンストラクタ。DLLを読み込む\r
+ /// </summary>\r
+ /// <param name="dllName">\r
+ /// DLLの名称。直接Win32APIのLoadLibraryにわたされる\r
+ /// </param>\r
+ public DllAccess(string dllName)\r
+ {\r
+ hModule = LoadLibrary(dllName);\r
+ if (hModule == IntPtr.Zero) {\r
+ Exception innerEx = null;\r
+ try {\r
+ innerEx = Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());\r
+ } catch {\r
+ }\r
+ throw new DllNotFoundException("Failed to LoadLibrary " + dllName, innerEx);\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// 関数をdelegateに変換して得る\r
+ /// </summary>\r
+ /// <param name="strProcName">\r
+ /// 関数名\r
+ /// </param>\r
+ /// <param name="type">\r
+ /// 関数の型。戻り値のdelegateのタイプ\r
+ /// </param>\r
+ /// <returns>\r
+ /// delegateに変換された関数\r
+ /// </returns>\r
+ public Delegate GetFunction(string strProcName, Type type)\r
+ {\r
+ IntPtr pFunc = GetProcAddress(hModule, strProcName);\r
+ if (pFunc == IntPtr.Zero) {\r
+ int result = Marshal.GetHRForLastWin32Error();\r
+ throw Marshal.GetExceptionForHR(result);\r
+ }\r
+ \r
+ return Marshal.GetDelegateForFunctionPointer(pFunc, type);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// DLLの読み込みを閉じる\r
+ /// </summary>\r
+ public void Dispose()\r
+ {\r
+ if (hModule != IntPtr.Zero) {\r
+ FreeLibrary(hModule);\r
+ hModule = IntPtr.Zero;\r
+ }\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.IO;\r
+using System.Runtime.InteropServices;\r
+\r
+namespace NaGet.InteropServices\r
+{ \r
+ public sealed class PEFileInfoUtils\r
+ {\r
+ // \8cÄ\82Ñ\8fo\82µ\8bÖ\8e~\r
+ private PEFileInfoUtils()\r
+ {\r
+ }\r
+ \r
+ /// <summary>\r
+ /// PE\83t\83@\83C\83\8b\82Ì\8eí\97Þ\r
+ /// </summary>\r
+ public enum PEFileType : uint\r
+ {\r
+ /// <summary>\r
+ /// \95s\96¾\82È\8c`\8e®\81A\82 \82é\82¢\82ÍPE\83t\83@\83C\83\8b\83w\83b\83_\82ð\8e\9d\82½\82È\82¢\r
+ /// </summary>\r
+ Unknown = 0,\r
+ /// <summary>\r
+ /// Windows\83R\83\93\83\\81[\83\8b\83A\83v\83\8a\83P\81[\83V\83\87\83\93\r
+ /// </summary>\r
+ WinConsole = 1,\r
+ /// <summary>\r
+ /// Windows GUI\83A\83v\83\8a\83P\81[\83V\83\87\83\93\r
+ /// </summary>\r
+ WinGUI = 2,\r
+ /// <summary>\r
+ /// MS-DOS(\8by\82Ñ\83R\83}\83\93\83h\83v\83\8d\83\93\83v\83g)\82Å\82ÌCOM\83t\83@\83C\83\8b\r
+ /// </summary>\r
+ MSDosCom = 3,\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \93n\82³\82ê\82½\8eÀ\8ds\83t\83@\83C\83\8b\82Ì\8eí\97Þ\82ð\95Ô\82·\81B\93à\95\94\82ÅSHGetFileInfo\82ð\8eg\97p\81B\r
+ /// </summary>\r
+ /// <param name="path">\8eÀ\8ds\83t\83@\83C\83\8b(*.exe,*.dll)\82Ö\82Ì\83p\83X</param>\r
+ /// <returns>\8eÀ\8ds\83t\83@\83C\83\8b\82Ì\8eí\97Þ</returns>\r
+ public static PEFileType GetPEFileType(string path)\r
+ {\r
+ PEFileType fileType;\r
+ \r
+ try {\r
+ SHFILEINFO info = new SHFILEINFO();\r
+ int type = (int) shGetFileInfo(path, 0, ref info, SHGFI.ExeType);\r
+ \r
+ const int MZ = 0x5a4d;\r
+ const int NE = 0x504e;\r
+ const int PE = 0x4550;\r
+ switch (type)\r
+ {\r
+ case MZ:\r
+ fileType = PEFileType.MSDosCom;\r
+ break;\r
+ case PE:\r
+ fileType = PEFileType.WinConsole;\r
+ break;\r
+ default:\r
+ int loWord = type & 0xffff;\r
+ int hiWord = (type >> 16) & 0xffff;\r
+ \r
+ if (((loWord == PE) || (loWord == NE)) &&\r
+ ((hiWord == 0x0300) || (hiWord == 0x0350) || (hiWord == 0x0400)))\r
+ {\r
+ fileType = PEFileType.WinGUI;\r
+ } else {\r
+ fileType = PEFileType.Unknown;\r
+ }\r
+ break;\r
+ }\r
+ } catch (FileNotFoundException e) {\r
+ throw new FileNotFoundException(e.Message, e);\r
+ } catch (IOException) {\r
+ fileType = PEFileType.Unknown;\r
+ }\r
+ \r
+ return fileType;\r
+ }\r
+ \r
+ #region SHGetFileInfo\r
+ \r
+ [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]\r
+ private struct SHFILEINFO\r
+ {\r
+ public IntPtr hIcon;\r
+ public IntPtr iIcon;\r
+ public uint dwAttributes;\r
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst=260)]\r
+ public string szDisplayName;\r
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst=80)]\r
+ public string szTypeName;\r
+ }\r
+ \r
+ private enum SHGFI : uint\r
+ {\r
+ Icon = 256,\r
+ DisplayName = 512,\r
+ TypeName = 1024,\r
+ Attributes = 2048,\r
+ IconLocation = 4096,\r
+ ExeType = 8192,\r
+ SysIconIndex = 16384,\r
+ LinkOverlay = 32768,\r
+ Selected = 65536,\r
+ AttrSpecified = 131072,\r
+ LargeIcon = 0,\r
+ SmallIcon = 1,\r
+ OpenIcon = 2,\r
+ PIDL = 8,\r
+ UseFileAttributes = 16\r
+ }\r
+ \r
+ [DllImport("shell32.dll", CharSet=CharSet.Auto)]\r
+ private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbFileInfo, uint uFlags);\r
+\r
+ /// <summary>\r
+ /// SHGetFileInfo\82ð\8cÄ\82Ñ\8fo\82·\95Ö\97\98\83\81\83\\83b\83h\81B\83t\83@\83C\83\8b\93Ç\82Ý\8d\9e\82Ý\82È\82Ç\82É\8e¸\94s\82µ\82½\82è\81A\r
+ /// \8eÀ\8ds\83t\83@\83C\83\8b\82Å\82È\82¢\8fê\8d\87\82ÍIOException\82ð\93\8a\82°\82Ü\82·\81B\r
+ /// </summary>\r
+ /// <param name="pszPath">\83t\83@\83C\83\8b\83p\83X</param>\r
+ /// <param name="dwFileAttributes">\83t\83@\83C\83\8b\91®\90«</param>\r
+ /// <param name="psfi">\83t\83@\83C\83\8b\8fî\95ñ</param>\r
+ /// <param name="uFlags">\83t\83\89\83O</param>\r
+ private static IntPtr shGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, SHGFI uFlags)\r
+ {\r
+ if (! File.Exists(pszPath)) {\r
+ throw new FileNotFoundException(null, pszPath);\r
+ }\r
+ \r
+ IntPtr hSuccess = SHGetFileInfo(pszPath, 0, ref psfi, (uint)Marshal.SizeOf(psfi), (uint) uFlags);\r
+ if (hSuccess == IntPtr.Zero) {\r
+ throw new IOException(string.Format("Maybe {0} is not a executable file.", pszPath));\r
+ }\r
+ return hSuccess;\r
+ }\r
+ \r
+ #endregion\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.Text;\r
+using System.Runtime.InteropServices;\r
+using System.Runtime.InteropServices.ComTypes;\r
+using System.Diagnostics;\r
+\r
+namespace NaGet.InteropServices\r
+{ \r
+ /// <summary>\r
+ /// ShellLink\82Ì\8dX\90V\83t\83\89\83O\r
+ /// </summary>\r
+ [Flags]\r
+ public enum ShellLinkResolve : uint\r
+ {\r
+ // AnyMatch = 0x02, // winMe,win2k\88È\8d~\96³\8cø\r
+ \r
+ /// <summary>\r
+ /// MSI\82ð\8cÄ\82Ô\r
+ /// </summary>\r
+ InvokeMSI = 0x80,\r
+ /// <summary>\r
+ /// \92Ç\90Õ\8bÖ\8e~\r
+ /// </summary>\r
+ NoLinkInfo = 0x40,\r
+ /// <summary>\r
+ /// \83\8a\83\93\83N\90æ\82Ì\89ð\8c\88\82ª\82Å\82«\82È\82¢\82Æ\82«\83_\83C\83A\83\8d\83O\82ð\95\\8e¦\82µ\82È\82¢\r
+ /// </summary>\r
+ NoUi = 0x01,\r
+ NoUiWithMsgPump = 0x101,\r
+ /// <summary>\r
+ /// \83\8a\83\93\83N\90æ\82Ì\83f\81[\83^\8dX\90V\82ð\8ds\82í\82È\82¢\r
+ /// </summary>\r
+ NoUpdate = 0x07,\r
+ /// <summary>\r
+ /// \8c\9f\8dõ\82ð\82µ\82È\82¢\r
+ /// </summary>\r
+ NoSearch = 0x10,\r
+ NoTrack = 0x20,\r
+ /// <summary>\r
+ /// \83\8a\83\93\83N\90æ\82ð\8dX\90V\82·\82é\r
+ /// </summary>\r
+ Update = 0x04,\r
+ }\r
+ \r
+ [ComImport()]\r
+ [Guid("000214F9-0000-0000-C000-000000000046")]\r
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]\r
+ public interface IShellLinkW\r
+ {\r
+ void GetPath([MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile,\r
+ int cchMaxPath, IntPtr pfd, uint fFlags);\r
+ \r
+ void GetIDList(out IntPtr ppidl);\r
+ void SetIDList(IntPtr pidl);\r
+ \r
+ void GetDescription([MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDesc,\r
+ int cchMaxPath);\r
+ void SetDescription(string pszDesc);\r
+ \r
+ void GetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir,\r
+ int cchMaxPath);\r
+ void SetWorkingDirectory(string pszDir);\r
+ \r
+ void GetArguments([MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs,\r
+ int cchMaxPath);\r
+ void SetArguments(string pszArgs);\r
+ \r
+ void GetHotkey(out short pwHotkey);\r
+ void SetHotkey(short pwHotkey);\r
+ \r
+ void GetShowCmd(out uint piShowCmd);\r
+ void SetShowCmd(uint piShowCmd);\r
+ \r
+ void GetIconLocation([MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath,\r
+ int cchMaxPath, out int piIcon);\r
+ void SetIconLocation(string pszIconPath, int iIcon);\r
+ \r
+ void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszPath,\r
+ int cchMaxPath, uint dwReserved);\r
+ \r
+ void Resolve(IntPtr hWnd, ShellLinkResolve fFlag);\r
+ \r
+ void SetPath(string pszFile);\r
+ }\r
+\r
+ /// <summary>\r
+ /// \83V\83F\83\8b\83\8a\83\93\83N(\83V\83\87\81[\83g\83J\83b\83g)\82Ì\83J\83v\83Z\83\8b\83N\83\89\83X\r
+ /// </summary>\r
+ public class ShellLink : IDisposable\r
+ {\r
+ /// <summary>\r
+ /// \83V\83F\83\8b\83\8a\83\93\83N\82ÌCOM\83I\83u\83W\83F\83N\83g\r
+ /// </summary>\r
+ protected IShellLinkW shellLink;\r
+ \r
+ /// <summary>\r
+ /// \83V\83F\83\8b\83\8a\83\93\83N\82ÌGUID\r
+ /// </summary>\r
+ public const string ShellLinkGuid = "00021401-0000-0000-C000-000000000046";\r
+ \r
+ protected const int MAX_PATH = 260;\r
+ \r
+ public ShellLink()\r
+ {\r
+ Type shellLinkType = Type.GetTypeFromCLSID(new Guid(ShellLinkGuid));\r
+ shellLink = (IShellLinkW) Activator.CreateInstance(shellLinkType);\r
+ }\r
+ \r
+ public ShellLink(string path) : this()\r
+ {\r
+ if (! System.IO.File.Exists(path)) {\r
+ throw new System.IO.FileNotFoundException("File does not found", path);\r
+ }\r
+ \r
+ ToPersistFile().Load(path, 0);\r
+ Resolve(IntPtr.Zero, ShellLinkResolve.NoUpdate | ShellLinkResolve.NoUi);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \83V\83F\83\8b\83\8a\83\93\83N\82Ì\89ð\90Í\89ð\8c\88\r
+ /// </summary>\r
+ /// <param name="hWnd">\90e\83t\83\8c\81[\83\80\82Ì\83n\83\93\83h\83\8b</param>\r
+ /// <param name="fFlags">\95û\96@</param>\r
+ public void Resolve(IntPtr? hWnd, ShellLinkResolve fFlags)\r
+ {\r
+ shellLink.Resolve(hWnd ?? IntPtr.Zero, fFlags);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// IPersistFile\82Æ\82µ\82Ä\8eæ\82è\8fo\82·\r
+ /// </summary>\r
+ /// <returns>IPersistFile\82É\83L\83\83\83X\83g\82³\82ê\82½COM\83I\83u\83W\83F\83N\83g</returns>\r
+ public IPersistFile ToPersistFile()\r
+ {\r
+ return (IPersistFile) shellLink;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \83\8a\83\93\83N\90æ\83p\83X\82ð\93¾\82é\81B\83R\83}\83\93\83h\83\89\83C\83\93\82ð\93¾\82é\82½\82ß\82É\82à\r
+ /// </summary>\r
+ /// <param name="fFlags">\83p\83X\82Ì\83^\83C\83v(1:8.3\8c`\8e®; 2:UNC\83p\83X; 4:\8aÂ\8b«\95Ï\90\94\95Ï\8a·\82È\82µ)</param>\r
+ /// <returns>\83p\83X</returns>\r
+ public string GetPath(uint fFlags)\r
+ {\r
+ StringBuilder sb = new StringBuilder(MAX_PATH);\r
+ shellLink.GetPath(sb, sb.Capacity, IntPtr.Zero, fFlags);\r
+ return sb.ToString();\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \83\8a\83\93\83N\90æ\83p\83X(\8eæ\93¾\8e\9e\82É\82Í\8aÂ\8b«\95Ï\90\94\82Í\93W\8aJ\82³\82ê\82Ü\82¹\82ñ)\r
+ /// </summary>\r
+ public string Path {\r
+ get { return GetPath(0x04); }\r
+ set { shellLink.SetPath(value); }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \83\8a\83\93\83N\90æ(\88ø\90\94)\r
+ /// </summary>\r
+ public string Arguments {\r
+ get {\r
+ StringBuilder sb = new StringBuilder(MAX_PATH);\r
+ shellLink.GetArguments(sb, sb.Capacity);\r
+ return sb.ToString();\r
+ }\r
+ set { shellLink.SetArguments(value); }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \8dì\8bÆ\83t\83H\83\8b\83_\r
+ /// </summary>\r
+ public string WorkingDirectory {\r
+ get {\r
+ StringBuilder sb = new StringBuilder(MAX_PATH);\r
+ shellLink.GetWorkingDirectory(sb, sb.Capacity);\r
+ return sb.ToString();\r
+ }\r
+ set { shellLink.SetWorkingDirectory(value); }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \83E\83B\83\93\83h\83E\83X\83^\83C\83\8b(ShowCmd\82Ì\83\8f\83b\83p)\r
+ /// </summary>\r
+ public ProcessWindowStyle WindowStyle\r
+ {\r
+ get {\r
+ uint showcmd;\r
+ shellLink.GetShowCmd(out showcmd);\r
+ switch (showcmd) {\r
+ case 3:\r
+ return ProcessWindowStyle.Maximized;\r
+ case 7:\r
+ return ProcessWindowStyle.Minimized;\r
+ case 1:\r
+ default:\r
+ return ProcessWindowStyle.Normal;\r
+ }\r
+ }\r
+ set {\r
+ switch (value) {\r
+ case ProcessWindowStyle.Normal:\r
+ shellLink.SetShowCmd(1);\r
+ break;\r
+ case ProcessWindowStyle.Maximized:\r
+ shellLink.SetShowCmd(3);\r
+ break;\r
+ case ProcessWindowStyle.Minimized:\r
+ case ProcessWindowStyle.Hidden:\r
+ shellLink.SetShowCmd(7);\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \83A\83C\83R\83\93\82Ì\8fê\8f\8a\82ð\93¾\82é\r
+ /// </summary>\r
+ /// <param name="iconPath">\83A\83C\83R\83\93\82ð\8aÜ\82Þ\83t\83@\83C\83\8b\83p\83X</param>\r
+ /// <param name="iconIndex">\83A\83C\83R\83\93\82Ì\83C\83\93\83f\83b\83N\83X</param>\r
+ public void GetIconLocation(out string iconPath, out int iconIndex)\r
+ {\r
+ StringBuilder sb = new StringBuilder(MAX_PATH);\r
+ shellLink.GetIconLocation(sb, sb.Capacity, out iconIndex);\r
+ iconPath = sb.ToString();\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \83A\83C\83R\83\93\82Ì\8fê\8f\8a\82ð\90Ý\92è\82·\82é\r
+ /// </summary>\r
+ /// <param name="iconPath">\83A\83C\83R\83\93\82ð\8aÜ\82Þ\83t\83@\83C\83\8b\83p\83X</param>\r
+ /// <param name="iconIndex">\83A\83C\83R\83\93\82Ì\83C\83\93\83f\83b\83N\83X</param>\r
+ public void SetIconLocation(string iconPath, int iconIndex)\r
+ {\r
+ shellLink.SetIconLocation(iconPath, iconIndex);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// COM\83I\83u\83W\83F\83N\83g\82Ì\8aJ\95ú\r
+ /// </summary>\r
+ public void Dispose()\r
+ {\r
+ if (shellLink != null) {\r
+ Marshal.ReleaseComObject(shellLink);\r
+ shellLink = null;\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// \83V\83F\83\8b\83\8a\83\93\83N\82Ì\92\86\90g\82ð\83v\83\8d\83Z\83X\8fî\95ñ\82Æ\82µ\82Ä\8eæ\93¾\82·\82é\81B\8bN\93®\82Ì\8dÛ\82É\97\98\97p\r
+ /// </summary>\r
+ /// <returns>\83v\83\8d\83Z\83X\8bN\93®\8fî\95ñ\89»\82³\82ê\82½\83V\83F\83\8b\83\8a\83\93\83N\82Ì\8fî\95ñ</returns>\r
+ public ProcessStartInfo ToProcessStartInfo()\r
+ {\r
+ ProcessStartInfo procInfo = new ProcessStartInfo();\r
+ procInfo.FileName = GetPath(0);\r
+ procInfo.Arguments = Arguments;\r
+ procInfo.WorkingDirectory = WorkingDirectory;\r
+ procInfo.WindowStyle = WindowStyle;\r
+ \r
+ return procInfo;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \83v\83\8d\83Z\83X\8fî\95ñ\82©\82ç\83V\83F\83\8b\83\8a\83\93\83N\83I\83u\83W\83F\83N\83g\82ð\90¶\90¬\r
+ /// </summary>\r
+ /// <param name="procInfo">\83v\83\8d\83Z\83X\8fî\95ñ</param>\r
+ /// <returns>\90¶\90¬\82³\82ê\82½\83V\83F\83\8b\83\8a\83\93\83N\83I\83u\83W\83F\83N\83g</returns>\r
+ public static ShellLink CreateFromProcessStartInfo(ProcessStartInfo procInfo)\r
+ {\r
+ ShellLink shelllink = new ShellLink();\r
+ shelllink.Path = procInfo.FileName;\r
+ shelllink.Arguments = procInfo.Arguments;\r
+ shelllink.WorkingDirectory = procInfo.WorkingDirectory;\r
+ shelllink.WindowStyle = procInfo.WindowStyle;\r
+ \r
+ return shelllink;\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.Net;\r
+using System.IO;\r
+using System.Collections;\r
+using System.Threading;\r
+using NaGet.SubCommands;\r
+\r
+namespace NaGet.Net\r
+{\r
+\r
+/// <summary>\r
+/// ダウンロードイベントオブジェクト\r
+/// </summary>\r
+public class DownloadEventArgs : NaGetEventArgs\r
+{\r
+ /// <summary>\r
+ /// イベントの種類\r
+ /// </summary>\r
+ public DownloadEventType Type;\r
+\r
+ /// <summary>\r
+ /// ダウンロード済みのバイト数\r
+ /// </summary>\r
+ public long DownloadSize;\r
+\r
+ /// <summary>\r
+ /// ダウンロードする総バイト数\r
+ /// </summary>\r
+ public long MaxSize;\r
+ \r
+ /// <summary>\r
+ /// コンストラクタ\r
+ /// </summary>\r
+ /// <param name="type">イベントの種類</param>\r
+ /// <param name="msg">イベントメッセージ</param>\r
+ /// <param name="pos">ダウンロード済みのバイト数</param>\r
+ /// <param name="max">ダウンロードする総バイト数</param>\r
+ public DownloadEventArgs(DownloadEventType type, string msg, long pos, long max)\r
+ {\r
+ Type = type;\r
+ DownloadSize = pos;\r
+ MaxSize = max;\r
+ \r
+ TaskMessage = msg;\r
+ TaskProgressPercent = (max > 0)? (100.0f * pos / max) : -1;\r
+ }\r
+}\r
+\r
+/// <summary>\r
+/// DownloadEventArgsでのイベントの種類\r
+/// </summary>\r
+public enum DownloadEventType {\r
+ INITED,\r
+ CONNECTED,\r
+ STARTED,\r
+ DOWNLOADING,\r
+ ERROR,\r
+ COMPLETED\r
+}\r
+\r
+/// <summary>\r
+/// ダウンロード処理を行うクラス\r
+/// </summary>\r
+public class Downloader : NaGetTask\r
+{\r
+ /// <summary>\r
+ /// デフォルトで使うプロキシ\r
+ /// </summary>\r
+ public static IWebProxy DefaultProxy = WebRequest.GetSystemWebProxy();\r
+ \r
+ /// <summary>\r
+ /// 通信に使うプロキシ\r
+ /// </summary>\r
+ public IWebProxy Proxy;\r
+ \r
+ /// <summary>\r
+ /// イベントハンドラ\r
+ /// </summary>\r
+ public event EventHandler<DownloadEventArgs> DownloadEventRaised;\r
+ \r
+ protected string url;\r
+ \r
+ protected string filepath;\r
+ \r
+ protected WebRequest request;\r
+ \r
+ protected WebResponse response;\r
+ \r
+ private bool cancelCalled = false;\r
+ \r
+ private bool done = false;\r
+ \r
+ /// <summary>\r
+ /// ダウンロード時にHTTPヘッダなどから取得した本来のファイル名\r
+ /// </summary>\r
+ private string downloadedFileName = null;\r
+ \r
+ /// <summary>\r
+ /// ダウンロード時にHTTPヘッダなどから取得した本来のファイル名\r
+ /// </summary>\r
+ public string DownloadedFileName {\r
+ get { return downloadedFileName; }\r
+ }\r
+ \r
+ /* ダウンロードの処理時間計測器 */\r
+ private System.Diagnostics.Stopwatch stopwatch;\r
+\r
+ /// <summary>\r
+ /// ダウンロードを行う\r
+ /// </summary>\r
+ /// <param name="url">ダウンロードするリソースのURL</param>\r
+ /// <param name="filepath">保存先ファイルパス</param>\r
+ public void Download(string url, string filepath)\r
+ {\r
+ this.url = url;\r
+ this.filepath = filepath;\r
+ \r
+ try {\r
+ Run();\r
+ } catch (NotSupportedException e) {\r
+ throw new NotSupportedException("Not supported download location for downloader.", e);\r
+ }\r
+ }\r
+ \r
+ public override bool Done {\r
+ get { return done; }\r
+ }\r
+ \r
+ public override bool Running {\r
+ get { return request != null && (!done); }\r
+ }\r
+\r
+ public override void Run()\r
+ {\r
+ RaiseDownloadEvent(DownloadEventType.INITED, 0, -1);\r
+ \r
+ try {\r
+ request = WebRequest.Create(url);\r
+ request.Proxy = (Proxy == null)? DefaultProxy : Proxy; \r
+ if (request is HttpWebRequest) {\r
+ request.CachePolicy = new System.Net.Cache.HttpRequestCachePolicy(\r
+ System.Net.Cache.HttpRequestCacheLevel.NoCacheNoStore);\r
+ }\r
+ \r
+ if (cancelCalled) {\r
+ throw new NaGetTaskCanceledException(string.Empty);\r
+ }\r
+ \r
+ try {\r
+ response = request.GetResponse();\r
+ } catch (WebException e) {\r
+ if (cancelCalled) { // キャンセル時\r
+ throw new NaGetTaskCanceledException(string.Empty, e);\r
+ } else {\r
+ throw new WebException(e.Message, e);\r
+ }\r
+ }\r
+ \r
+ if (cancelCalled) {\r
+ throw new NaGetTaskCanceledException(string.Empty);\r
+ }\r
+ \r
+ try {\r
+ downloadedFileName = getFileNameFromWebResponse(response);\r
+ } catch (Exception) {\r
+ }\r
+ \r
+ if (File.Exists(filepath)) { // ファイルが存在するとき削除\r
+ File.Delete(filepath);\r
+ }\r
+ \r
+ RaiseDownloadEvent(DownloadEventType.CONNECTED, 0, -1);\r
+ \r
+ using (Stream stream = response.GetResponseStream() )\r
+ using (FileStream fs = new FileStream(filepath,\r
+ FileMode.Create,\r
+ FileAccess.Write) ) {\r
+ try {\r
+ File.SetAttributes(filepath, FileAttributes.Hidden);\r
+ long contentLength = response.ContentLength;\r
+ \r
+ RaiseDownloadEvent(DownloadEventType.STARTED, 0, contentLength);\r
+ \r
+ stopwatch = new System.Diagnostics.Stopwatch();\r
+ stopwatch.Start();\r
+ \r
+ Timer timer = new Timer(new TimerCallback(\r
+ delegate(object obj) {\r
+ try {\r
+ RaiseDownloadEvent(DownloadEventType.DOWNLOADING, fs.Position, contentLength);\r
+ } catch (ObjectDisposedException) {\r
+ }\r
+ }), null, 0, 1000);\r
+ \r
+ try {\r
+ byte[] data = new byte[4096];\r
+ int size = 0;\r
+ while ((size = stream.Read(data,0,data.Length)) > 0) {\r
+ fs.Write(data, 0, size);\r
+ \r
+ bool hoge = cancelCalled;\r
+ \r
+ if (cancelCalled) {\r
+ throw new NaGetTaskCanceledException(string.Empty);\r
+ }\r
+ }\r
+ } finally {\r
+ timer.Dispose();\r
+ }\r
+ \r
+ File.SetAttributes(filepath, FileAttributes.Normal);\r
+ \r
+ RaiseDownloadEvent(DownloadEventType.COMPLETED, fs.Position, contentLength);\r
+ } catch (IOException ex) {\r
+ if (cancelCalled) {\r
+ throw new NaGetTaskCanceledException(string.Empty);\r
+ } else {\r
+ RaiseDownloadEvent(DownloadEventType.ERROR, 0, 0);\r
+ throw new IOException(ex.Message, ex);\r
+ }\r
+ } finally {\r
+ if (stopwatch != null) {\r
+ stopwatch.Stop();\r
+ stopwatch = null;\r
+ }\r
+ }\r
+ }\r
+ } finally {\r
+ if (response != null) {\r
+ response.Close();\r
+ }\r
+ \r
+ request = null;\r
+ done = true;\r
+ }\r
+ }\r
+ \r
+ protected void RaiseDownloadEvent(DownloadEventType type, long pos, long max)\r
+ {\r
+ if (DownloadEventRaised != null) {\r
+ DownloadEventArgs e = new DownloadEventArgs(type, string.Empty, pos, max);\r
+ \r
+ switch (e.Type) {\r
+ case DownloadEventType.CONNECTED:\r
+ e.TaskMessage = "接続しました";\r
+ break;\r
+ case DownloadEventType.STARTED:\r
+ case DownloadEventType.DOWNLOADING:\r
+ case DownloadEventType.COMPLETED:\r
+ try {\r
+ e.TaskMessage = string.Format("{0} bytes ({1} %)", e.DownloadSize, (int) e.TaskProgressPercent);\r
+ } catch (DivideByZeroException) {\r
+ e.TaskMessage = string.Format("{0} bytes", e.DownloadSize);\r
+ }\r
+ \r
+ \r
+ if (stopwatch != null && stopwatch.IsRunning && stopwatch.ElapsedMilliseconds > 3000) {\r
+ long bpers = e.DownloadSize * 1000 / stopwatch.ElapsedMilliseconds;\r
+ try {\r
+ TimeSpan rest = TimeSpan.FromSeconds((max - e.DownloadSize) / bpers);\r
+ e.TaskMessage += string.Format(" 推定残り時間:{0} ({1}/s)", rest, NaGet.Utils.FormatSize(bpers));\r
+ } catch {\r
+ e.TaskMessage += string.Format(" ({0}/s)", NaGet.Utils.FormatSize(bpers));\r
+ }\r
+ }\r
+ \r
+ break;\r
+ }\r
+ \r
+ DownloadEventRaised(this, e);\r
+ }\r
+ }\r
+ \r
+ public override bool Cancelable {\r
+ get { return !(this.Done || cancelCalled); }\r
+ }\r
+ \r
+ public override bool Cancel()\r
+ {\r
+ if (this.Done || cancelCalled) {\r
+ return false;\r
+ }\r
+ \r
+ cancelCalled = true;\r
+ if (request != null) {\r
+ try {\r
+ request.Abort();\r
+ } catch (WebException) {\r
+ }\r
+ }\r
+ return true;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// Webレスポンスからダウンロードしたファイルの名前を取得\r
+ /// </summary>\r
+ /// <param name="response"></param>\r
+ /// <returns></returns>\r
+ private string getFileNameFromWebResponse(WebResponse response)\r
+ {\r
+ if (response is HttpWebResponse) {\r
+ string contentDisposition = ((HttpWebResponse) response).Headers["Content-Disposition"];\r
+ \r
+ // TODO check license for http://www.atmarkit.co.jp/fdotnet/dotnettips/618downnoname/downnoname.html\r
+ if (! string.IsNullOrEmpty(contentDisposition)) {\r
+ System.Text.RegularExpressions.Regex re = new System.Text.RegularExpressions.Regex(\r
+ @"filename\s*=\s*(?:""(?<filename>[^""]*)""|(?<filename>[^;]*))",\r
+ System.Text.RegularExpressions.RegexOptions.IgnoreCase);\r
+ \r
+ System.Text.RegularExpressions.Match m = re.Match(contentDisposition);\r
+ if (m.Success) {\r
+ return m.Groups["filename"].Value;\r
+ }\r
+ }\r
+ }\r
+ \r
+ return NaGet.Utils.Url2filename(response.ResponseUri.ToString());\r
+ }\r
+}\r
+\r
+}\r
+\r
+\r
--- /dev/null
+using System;\r
+using System.IO;\r
+using System.Diagnostics;\r
+using NaGet.Net;\r
+using NaGet.SubCommands;\r
+\r
+namespace NaGet.Packages.Install\r
+{\r
+\r
+ /// <summary>\r
+ /// ダウンロード・インストール処理をカプセル化するクラス\r
+ /// </summary>\r
+ public class Installation\r
+ {\r
+ /// <summary>\r
+ /// インストールするパッケージ\r
+ /// </summary>\r
+ public Package InstalledPackage;\r
+\r
+ /// <summary>\r
+ /// (保存される)インストーラのファイルのパス\r
+ /// </summary>\r
+ public string InstallerFile;\r
+\r
+ /// <summary>\r
+ /// インストールが完了されたか否かのフラグ\r
+ /// </summary>\r
+ private bool installed = false;\r
+ \r
+ /// <summary>\r
+ /// 起動するインストーラのインデックス番号\r
+ /// </summary>\r
+ protected int installerIndex = 0;\r
+ \r
+ /// <summary>\r
+ /// 外部アプリのエラー出力の受信ハンドラ\r
+ /// </summary>\r
+ public event EventHandler<NaGet.Utils.AnyDataEventArgs<string>> ErrorDataReceived;\r
+ \r
+ /// <summary>\r
+ /// 外部アプリの標準出力の受信ハンドラ\r
+ /// </summary>\r
+ public event EventHandler<NaGet.Utils.AnyDataEventArgs<string>> OutputDataReceived;\r
+ \r
+ /// <summary>\r
+ /// コンストラクタ\r
+ /// </summary>\r
+ /// <param name="package">インストールするパッケージ</param>\r
+ public Installation(Package package)\r
+ {\r
+ InstalledPackage = package;\r
+ InstallerFile = getArchiveFilePath();\r
+ installerIndex = GetPreferInstallerIndex(package);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// コンストラクタ\r
+ /// </summary>\r
+ /// <param name="package">インストールするパッケージ</param>\r
+ /// <param name="installerfile">(保存される)インストーラのファイルのパス</param>\r
+ protected Installation(Package package, string installerfile)\r
+ {\r
+ InstalledPackage = package;\r
+ InstallerFile = installerfile;\r
+ installerIndex = GetPreferInstallerIndex(package);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// インストール可能か否か\r
+ /// </summary>\r
+ public bool IsInstallablePackage()\r
+ {\r
+ return installerIndex >= 0;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// すでにインストールされているパッケージを取得する\r
+ /// </summary>\r
+ /// <param name="installedPkgs">\r
+ /// インストールドリスト\r
+ /// </param>\r
+ /// <returns>\r
+ /// インストールされているパッケージの情報。インストールされたパッケージが見つからないならばnullを返す \r
+ /// </returns>\r
+ public InstalledPackage GetInstalledPackage(PackageList<InstalledPackage> installedPkgs)\r
+ {\r
+ return installedPkgs.GetPackageForName(InstalledPackage.Name);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// ダウンロードを行う。\r
+ /// </summary>\r
+ /// <param name="downloader">ダウンローダオブジェクト</param>\r
+ public void Download(Downloader downloader)\r
+ {\r
+ if (! Installed) {\r
+ string url = InstalledPackage.Installer[installerIndex].Url.Href;\r
+ downloader.Download(url, InstallerFile);\r
+ \r
+ // サーバ指定のファイル名に変更する\r
+ if (! string.IsNullOrEmpty(downloader.DownloadedFileName)) {\r
+ string newFile = Path.Combine(Path.GetDirectoryName(InstallerFile), downloader.DownloadedFileName);\r
+ File.Move(InstallerFile, newFile);\r
+ InstallerFile = newFile;\r
+ }\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// ハッシュ検証のためのハッシュの種類の数を返す\r
+ /// </summary>\r
+ /// <returns>ハッシュの個数</returns>\r
+ public int GetRegisteredHashCount()\r
+ {\r
+ HashValue[] hashValues = InstalledPackage.Installer[installerIndex].Hash;\r
+ return (hashValues == null)? 0 : hashValues.Length;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// ハッシュ検証を行う\r
+ /// </summary>\r
+ /// <returns>検証にパスしたらtrue、パスしなかったらfalse</returns>\r
+ public bool VerifyHashValues()\r
+ {\r
+ HashValue[] hashValues = InstalledPackage.Installer[installerIndex].Hash;\r
+ if (hashValues != null) {\r
+ foreach (HashValue hash in hashValues) {\r
+ if (! hash.Validate(InstallerFile)) {\r
+ return false;\r
+ }\r
+ }\r
+ }\r
+ \r
+ return true;\r
+ }\r
+ \r
+ private int invokeInstaller(string installerfile, InstallerType type)\r
+ {\r
+ if (! File.Exists(installerfile)) {\r
+ throw new FileNotFoundException(string.Format("{0} is not found, perhaps failed to download.", installerfile), installerfile);\r
+ }\r
+ \r
+ Process hProcess = null;\r
+ try {\r
+ switch (type) {\r
+ case InstallerType.EXEC_INSTALLER:\r
+ hProcess = Process.Start(installerfile);\r
+ hProcess.WaitForExit();\r
+ \r
+ break;\r
+ case InstallerType.MSI_PACKAGE:\r
+ hProcess = Process.Start("msiexec", string.Format("/i \"{0}\"", installerfile));\r
+ hProcess.WaitForExit();\r
+ break;\r
+ case InstallerType.ARCHIVE:\r
+ // TODO ハックな実装?\r
+ if (File.Exists("archive-inst.exe")) {\r
+ string argument = string.Format("-i \"{0}\" \"{1}\"", installerfile, this.InstalledPackage.Name);\r
+ ProcessStartInfo procInfo = new ProcessStartInfo(Path.GetFullPath("archive-inst.exe"), argument);\r
+ procInfo.UseShellExecute = false;\r
+ procInfo.CreateNoWindow = true;\r
+ procInfo.WorkingDirectory = Environment.CurrentDirectory;\r
+ \r
+ hProcess = NaGet.Utils.ProcessStartWithOutputCapture(procInfo, this.OutputDataReceived, this.ErrorDataReceived);\r
+ hProcess.WaitForExit();\r
+ break;\r
+ }\r
+ throw new NotImplementedException("Not implemented archive installation yet");\r
+ //break;\r
+ default:\r
+ throw new NotImplementedException("Not implemented archive installation yet");\r
+ }\r
+ \r
+ return hProcess.ExitCode;\r
+ } finally {\r
+ if (hProcess != null) {\r
+ hProcess.Close();\r
+ }\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// インストーラ等を起動してインストール作業を行う\r
+ /// </summary>\r
+ /// <returns>インストーラの終了コード</returns>\r
+ public int Install()\r
+ {\r
+ string installerFile = this.InstallerFile;\r
+ string tempDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());\r
+ \r
+ // アーカイブされているなら一旦展開\r
+ if (InstalledPackage.ArchivedInstaller) {\r
+ Directory.CreateDirectory(tempDir);\r
+ \r
+ // 64bit対策で展開も別プロセスで\r
+ // TODO エラーとかの出力を取得できたりとかできるように\r
+ if (File.Exists("archive-inst.exe")) {\r
+ string argument = string.Format("-t \"{0}\" \"{1}\"", installerFile, tempDir);\r
+ ProcessStartInfo info = new ProcessStartInfo(Path.GetFullPath("archive-inst.exe"), argument);\r
+ info.UseShellExecute = false;\r
+ info.WorkingDirectory = Environment.CurrentDirectory;\r
+ \r
+ using (Process hProcess = Process.Start(info)) {\r
+ hProcess.WaitForExit();\r
+ \r
+ if (hProcess.ExitCode != 0) {\r
+ throw new ApplicationException("Extract error " + installerFile + " to " + tempDir);\r
+ }\r
+ }\r
+ } else {\r
+ throw new ApplicationException(string.Format("archive-inst.exe not found in {0}!", Environment.CurrentDirectory));\r
+ }\r
+ \r
+// System.Text.StringBuilder output = new System.Text.StringBuilder(1024);\r
+// int res = NaGet.InteropServices.CommonArchiverExtracter.ExtractArchive(installerFile, tempDir, output, IntPtr.Zero);\r
+// if (res != 0) {\r
+// throw new ApplicationException("Extract error\n" + output.ToString());\r
+// }\r
+ \r
+ installerFile = seekInstallerFile(tempDir, InstalledPackage.Type);\r
+ if (installerFile == null && Directory.GetDirectories(tempDir).Length == 1) {\r
+ installerFile = seekInstallerFile(Path.Combine(tempDir, Directory.GetDirectories(tempDir)[0]), InstalledPackage.Type);\r
+ }\r
+ }\r
+ \r
+ \r
+ int exitCode = invokeInstaller(installerFile, InstalledPackage.Type);\r
+ \r
+ installed = true;\r
+ \r
+ return exitCode;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// ダウンロード済みであるか否か\r
+ /// </summary>\r
+ public bool Downloaded {\r
+ get {\r
+ return File.Exists(InstallerFile) && ((File.GetAttributes(InstallerFile) & FileAttributes.Hidden) != FileAttributes.Hidden);\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// インストール作業済みであるか否か。実際にインストールされたかどうかではありません。\r
+ /// </summary>\r
+ public bool Installed {\r
+ get { return installed; }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// インストーラの処理が成功してインストールされたプログラムが確認できるか否か。\r
+ /// </summary>\r
+ public bool InstallSuccessed {\r
+ get {\r
+ switch (Type) {\r
+ case InstallerType.ARCHIVE: // アーカイブインストーラはフォルダの確認\r
+ return Directory.Exists(Path.Combine(NaGet.Env.ArchiveProgramFiles, InstalledPackage.Name));\r
+ case InstallerType.EXEC_INSTALLER:\r
+ case InstallerType.MSI_PACKAGE:\r
+ return RegistriedUninstallers.GetInstalledPackageFor(InstalledPackage) != null;\r
+ default:\r
+ return false;\r
+ }\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// インストーラの種類を返す\r
+ /// </summary>\r
+ public InstallerType Type {\r
+ get {\r
+ return InstalledPackage.Type;\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// もっともふさわしいインストーラ番号を返す\r
+ /// </summary>\r
+ /// <returns></returns>\r
+ public static int GetPreferInstallerIndex(Package InstalledPackage)\r
+ {\r
+ if (InstalledPackage.Type == InstallerType.CANNOT_INSTALL) { // インストール不能パッケージ\r
+ return -1;\r
+ }\r
+ \r
+ int best = -1;\r
+ int bestVal = 0;\r
+ \r
+ for (int i = 0; i < InstalledPackage.Installer.Length; i++) {\r
+ Platform platform = InstalledPackage.Installer[i].Platform;\r
+ \r
+ int pts = 0;\r
+ if (platform != null) {\r
+ pts = (platform.IsRunnable())? 10 : 0;\r
+ pts += (platform.IsRunnableArchOnWow64() && platform.IsRunnableOS())? 1 : 0;\r
+ } else { // if (platform == null) {\r
+ pts = 1; // null の場合は動作プラットホーム扱い\r
+ }\r
+ if (pts > bestVal) {\r
+ bestVal = pts;\r
+ best = i;\r
+ }\r
+ }\r
+ \r
+ return best;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// インストーラの一時保存先パスを生成\r
+ /// </summary>\r
+ private string getArchiveFilePath()\r
+ {\r
+ Package package = this.InstalledPackage;\r
+ \r
+ string folderName = string.Format("{0}({1})", package.Name, package.Version);\r
+ string fileName = NaGet.Utils.Url2filename(package.Installer[0].Url.Href);\r
+ \r
+ string folder = Path.Combine(NaGet.Env.ArchiveFolderPath, folderName);\r
+ \r
+ if (! File.Exists(Path.Combine(folder, fileName))) {\r
+ if (Directory.Exists(folder)) {\r
+ if (! File.Exists(Path.Combine(folder, fileName))) {\r
+ fileName = seekInstallerFile(folder, package.Type) ?? fileName;\r
+ }\r
+ } else {\r
+ Directory.CreateDirectory(folder);\r
+ }\r
+ }\r
+ \r
+ return Path.Combine(folder, fileName);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// インストーラファイルを探す\r
+ /// </summary>\r
+ /// <param name="basedir">探すフォルダ</param>\r
+ /// <param name="type">インストーラの種類</param>\r
+ /// <returns>探し出されたインストーラファイルのフルパス。存在しないならばnull</returns>\r
+ private static string seekInstallerFile(string basedir, InstallerType type)\r
+ {\r
+ if (! Directory.Exists(basedir)) {\r
+ return null;\r
+ }\r
+ \r
+ System.Collections.Generic.List<string> list = new System.Collections.Generic.List<string>();\r
+ switch (type) {\r
+ case InstallerType.MSI_PACKAGE:\r
+ list.AddRange(Directory.GetFiles(basedir, "*.msi"));\r
+ break;\r
+ case InstallerType.EXEC_INSTALLER:\r
+ list.AddRange(Directory.GetFiles(basedir, "*.exe"));\r
+ break;\r
+ case InstallerType.ARCHIVE:\r
+ list.AddRange(Directory.GetFiles(basedir, "*.zip"));\r
+ list.AddRange(Directory.GetFiles(basedir, "*.lzh"));\r
+ list.AddRange(Directory.GetFiles(basedir, "*.cab"));\r
+ list.AddRange(Directory.GetFiles(basedir, "*.7z"));\r
+ list.AddRange(Directory.GetFiles(basedir, "*.tar*"));\r
+ break;\r
+ default:\r
+ return null;\r
+ }\r
+ \r
+ // 存在しないファイルを削除\r
+ list.RemoveAll(\r
+ delegate(string file) {\r
+ return ! File.Exists(file);\r
+ }\r
+ );\r
+ \r
+ // "setup"の語が入ったファイルはインストーラとみなし、優先選択\r
+ foreach (string path in list) {\r
+ if (Path.GetFileName(path).ToLower().IndexOf("setup") >= 0) {\r
+ return path;\r
+ }\r
+ }\r
+ \r
+ // それ以外なら一つ目を返す\r
+ return (list.Count > 0)? list[0] : null;\r
+ }\r
+ \r
+ public override string ToString()\r
+ {\r
+ return string.Format("{0}({1})", InstalledPackage.Name, InstalledPackage.Version);\r
+ }\r
+ \r
+ public static string ToString(Installation[] installations)\r
+ {\r
+ string[] strs = new string[installations.Length];\r
+ for (int i = 0; i < installations.Length; i++) {\r
+ strs[i] = installations[i].ToString();\r
+ }\r
+ return string.Join(" ", strs);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// パッケージ配列をインストール処理配列に変換する便利メソッド\r
+ /// </summary>\r
+ /// <param name="pkgs">パッケージ配列</param>\r
+ /// <returns>変換されたインストール処理配列</returns>\r
+ public static Installation[] ConvertInstallations(Package[] pkgs)\r
+ {\r
+ Installation[] insts = new Installation[pkgs.Length];\r
+ for (int i = 0; i < pkgs.Length; i++) {\r
+ insts[i] = new Installation(pkgs[i]);\r
+ }\r
+ return insts;\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+\r
+namespace NaGet.Packages.Install\r
+{\r
+ public class InstallationLog\r
+ {\r
+ public DateTime Date;\r
+ public Package Package;\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.IO;\r
+using System.Collections.Generic;\r
+using System.Xml.Serialization;\r
+using System.Text.RegularExpressions;\r
+using NaGet.Packages;\r
+\r
+namespace NaGet.Packages.Install\r
+{ \r
+ public class InstalledPackage : Package\r
+ {\r
+ /// <summary>\r
+ /// アンインストール情報\r
+ /// </summary>\r
+ public UninstallInformation UninstallInfo;\r
+ \r
+ public static InstalledPackage PackageConverter(Package basePkg) \r
+ {\r
+ InstalledPackage pkg = new InstalledPackage();\r
+ \r
+ NaGet.Utils.FieldCopy(basePkg, ref pkg);\r
+ pkg.UninstallInfo = UninstallInformation.NewInstance(basePkg);\r
+ \r
+ return pkg;\r
+ }\r
+ \r
+ public static InstalledPackage PackageConverter(Package basePkg, UninstallInformation info)\r
+ {\r
+ InstalledPackage instPkg = new InstalledPackage();\r
+ \r
+ NaGet.Utils.FieldCopy(basePkg, ref instPkg);\r
+ instPkg.UninstallInfo = info;\r
+ \r
+ Match match = Regex.Match(info.DisplayName, basePkg.UninstallerKey);\r
+ if (! match.Success) {\r
+ throw new ArgumentException(string.Format("{0}({1}) does not matched for {2}.", basePkg.Name, basePkg.Version, info.DisplayName));\r
+ } else if (match.Groups[1].Success) { // DisplayNameの方のバージョン表記を優先\r
+ instPkg.Version = match.Groups[1].Value;\r
+ } else if (! string.IsNullOrEmpty(info.DisplayVersion) ) {\r
+ instPkg.Version = info.DisplayVersion;\r
+ } else {\r
+ instPkg.Version = string.Empty;\r
+ }\r
+ \r
+ return instPkg;\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.Collections.Generic;\r
+using System.Text.RegularExpressions;\r
+using Microsoft.Win32;\r
+\r
+namespace NaGet.Packages.Install\r
+{\r
+ /// <summary>\r
+ /// レジストリ登録されているアンインストーラに関するユーティリティ\r
+ /// </summary>\r
+ public sealed class RegistriedUninstallers\r
+ {\r
+ /// <summary>\r
+ /// アンインストーラのレジストリの格納されているルートキーの文字列表現\r
+ /// </summary>\r
+ public const string UninstallersKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";\r
+ \r
+ /// <summary>\r
+ /// アンインストーラのレジストリの格納されているルートキーの文字列表現\r
+ /// </summary>\r
+ public const string UninstallersKeyWow6432 = @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall";\r
+ \r
+ /// <summary>\r
+ /// アンインストーラのレジストリのキーを返す。\r
+ /// </summary>\r
+ public static IEnumerable<RegistryKey> RegistryKeies {\r
+ get {\r
+ RegistryKey key = null;\r
+ \r
+ // UninstallersKey\r
+ try {\r
+ key = Registry.LocalMachine.OpenSubKey(UninstallersKey, false);\r
+ } catch (System.Security.SecurityException) {\r
+ } \r
+ if (key != null) {\r
+ yield return key;\r
+ key.Close();\r
+ }\r
+ \r
+ // UninstallersKeyWow6432\r
+ try {\r
+ key = Registry.LocalMachine.OpenSubKey(UninstallersKeyWow6432, false);\r
+ } catch (System.Security.SecurityException) {\r
+ } \r
+ if (key != null) {\r
+ yield return key;\r
+ key.Close();\r
+ }\r
+ }\r
+ }\r
+ \r
+ \r
+ /// <summary>\r
+ /// アンインストーラをイテレートする\r
+ /// </summary>\r
+ public static IEnumerable<UninstallInformation> Uninstallers {\r
+ get {\r
+ foreach (RegistryKey regkey in RegistryKeies) {\r
+ foreach (string key in regkey.GetSubKeyNames()) {\r
+ UninstallInformation info;\r
+ using (RegistryKey subregkey = regkey.OpenSubKey(key, false)) {\r
+ info = UninstallInformation.NewInstance(subregkey);\r
+ }\r
+ \r
+ if (info.IsOSPatch || info.IsSystemComponent || string.IsNullOrEmpty(info.DisplayName) ) {\r
+ continue;\r
+ }\r
+ \r
+ yield return info;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// レジストリを走査してインストール済みのソフトを検出する\r
+ /// </summary>\r
+ /// <param name="list">\r
+ /// 参照するパッケージリスト\r
+ /// </param>\r
+ /// <returns>\r
+ /// インストール済みのパッケージを返すイテレータ\r
+ /// </returns>\r
+ public static IEnumerable<InstalledPackage> DetectInstalledPackages(PackageList<Package> list)\r
+ {\r
+ foreach (UninstallInformation info in RegistriedUninstallers.Uninstallers) {\r
+ foreach (Package pkg in list.Packages) {\r
+ if (pkg.Type != InstallerType.ARCHIVE && pkg.UninstallerKey != null) {\r
+ Match match = Regex.Match(info.DisplayName, pkg.UninstallerKey);\r
+ \r
+ if (match.Success) {\r
+ yield return InstalledPackage.PackageConverter(pkg, info);\r
+ \r
+ break;\r
+ }\r
+ }// else continue;\r
+ }\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// パッケージに対応するインストールパッケージを返す。\r
+ /// インストール終了確認などに使用。\r
+ /// </summary>\r
+ /// <param name="pkg">対応するパッケージ</param>\r
+ /// <returns>インストール情報</returns>\r
+ public static InstalledPackage GetInstalledPackageFor(Package pkg)\r
+ {\r
+ if (pkg.Type == InstallerType.ARCHIVE || pkg.Type == InstallerType.CANNOT_INSTALL) {\r
+ return null;\r
+ }\r
+ \r
+ foreach (UninstallInformation info in RegistriedUninstallers.Uninstallers) {\r
+ Match match = Regex.Match(info.DisplayName, pkg.UninstallerKey);\r
+ \r
+ if (match.Success) {\r
+ return InstalledPackage.PackageConverter(pkg, info);\r
+ }\r
+ }\r
+ return null;\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.Xml.Serialization;\r
+using Microsoft.Win32;\r
+\r
+namespace NaGet.Packages.Install\r
+{\r
+ /// <summary>\r
+ /// アンインストール情報の抽象化クラス\r
+ /// </summary>\r
+ public class UninstallInformation\r
+ {\r
+ /// <summary>\r
+ /// 名称。DisplayName\r
+ /// </summary>\r
+ public string DisplayName;\r
+ \r
+ /// <summary>\r
+ /// バージョン。DisplayVersion\r
+ /// </summary>\r
+ public string DisplayVersion;\r
+ \r
+ /// <summary>\r
+ /// 作者。Publisher\r
+ /// </summary>\r
+ public string Publisher;\r
+ \r
+ /// <summary>\r
+ /// アイコンのパス。DisplayIcon\r
+ /// </summary>\r
+ public string IconPath;\r
+ \r
+ /// <summary>\r
+ /// 「変更」・「修復」のコマンド文字列。ModifyPath\r
+ /// </summary>\r
+ public string ModifyPath;\r
+ \r
+ /// <summary>\r
+ /// 「アンインストール」のコマンド文字列。UninstallString\r
+ /// </summary>\r
+ public string UninstallString;\r
+ \r
+ /// <summary>\r
+ /// サイレントアンインストールのコマンド文字列。QuietUninstallString\r
+ /// </summary>\r
+ public string QuietUninstallString;\r
+ \r
+ /// <summary>\r
+ /// 発行元のURL\r
+ /// </summary>\r
+ public string URLInfoAbout;\r
+ \r
+ /// <summary>\r
+ /// 「変更」ができるか否かのフラグ。NoModifyの逆(きちんと動かない??)\r
+ /// </summary>\r
+ public bool CanModify;\r
+ \r
+ /// <summary>\r
+ /// 「修復」ができるか否かのフラグ。NoRepairの逆(きちんと動かない??)\r
+ /// </summary>\r
+ public bool CanRepair;\r
+ \r
+ /// <summary>\r
+ /// 「アンインストール」ができるか否かのフラグ。NoRemoveの逆\r
+ /// </summary>\r
+ public bool CanRemove = true;\r
+ \r
+ /// <summary>\r
+ /// システムコンポーネントか否か\r
+ /// </summary>\r
+ public bool IsSystemComponent;\r
+ \r
+ /// <summary>\r
+ /// OSの更新パッチか否か。\r
+ /// </summary>\r
+ public bool IsOSPatch;\r
+ \r
+ /// <summary>\r
+ /// ソフトをインストールした日付\r
+ /// </summary>\r
+ [XmlIgnore]\r
+ public DateTime? InstallDate = null;\r
+ \r
+ /// <summary>\r
+ /// ソフトをインストールした日付、のレジストリ登録文字列表現\r
+ /// </summary>\r
+ [XmlElement("InstallDate")]\r
+ public string InstallDateString {\r
+ get { return (InstallDate != null)? InstallDate.Value.ToString("yyyyMMdd") : null; }\r
+ set {\r
+ if (value == null) {\r
+ InstallDate = null;\r
+ } else if (System.Text.RegularExpressions.Regex.IsMatch(value, @"^[0-9]{8}$")) {\r
+ InstallDate = new DateTime(int.Parse(value.Substring(0,4)),\r
+ int.Parse(value.Substring(4,2)),\r
+ int.Parse(value.Substring(6,2)));\r
+ } else throw new ArgumentException("Does not match date format (YYYYMMDD)");\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// インストール先のフォルダ\r
+ /// </summary>\r
+ public string InstallLocation;\r
+ \r
+ /// <summary>\r
+ /// (推定の)アプリケーションの占有する容量(キロバイト単位)\r
+ /// </summary>\r
+ public int EstimatedSize = 0;\r
+ \r
+ #region 変換メソッド\r
+ \r
+ /// <summary>\r
+ /// レジストリのキーからアンインストール情報を取得する\r
+ /// </summary>\r
+ /// <param name="regKey">アンインストール情報を示す</param>\r
+ /// <returns>生成されたアンインストール</returns>\r
+ public static UninstallInformation NewInstance(RegistryKey regKey)\r
+ {\r
+ UninstallInformation uninstInfo = new UninstallInformation();\r
+ \r
+ uninstInfo.DisplayName = (string) regKey.GetValue("DisplayName");\r
+ uninstInfo.DisplayVersion = (string) regKey.GetValue("DisplayVersion", null);\r
+ uninstInfo.Publisher = (string) regKey.GetValue("Publisher", null);\r
+ uninstInfo.URLInfoAbout = (string) regKey.GetValue("URLInfoAbout", null);\r
+ uninstInfo.IconPath = (string) regKey.GetValue("DisplayIcon", null);\r
+ uninstInfo.ModifyPath = (string) regKey.GetValue("ModifyPath", null);\r
+ uninstInfo.UninstallString = (string) regKey.GetValue("UninstallString", null);\r
+ uninstInfo.QuietUninstallString = (string) regKey.GetValue("QuietUninstallString", null);\r
+ uninstInfo.CanModify = ((int) regKey.GetValue("NoModify", 1)) != 1;\r
+ uninstInfo.CanRepair = ((int) regKey.GetValue("NoRepair", 1)) != 1;\r
+ uninstInfo.CanRemove = ((int) regKey.GetValue("NoRemove", 1)) != 1; \r
+ uninstInfo.IsSystemComponent = ((int) regKey.GetValue("SystemComponent", 0)) > 0;\r
+ uninstInfo.IsOSPatch = ((string) regKey.GetValue("ParentKeyName", null)) == "OperatingSystem";\r
+ try {\r
+ uninstInfo.InstallDateString = (string) regKey.GetValue("InstallDate", null);\r
+ } catch (ArgumentException) {}\r
+ uninstInfo.InstallLocation = (string) regKey.GetValue("InstallLocation", null);\r
+ uninstInfo.EstimatedSize = (int) regKey.GetValue("EstimatedSize", 0);\r
+ \r
+ PrefixWithSlowInfoCache(ref uninstInfo, regKey);\r
+ \r
+ return uninstInfo;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// SlowInfoCacheを読み込んで情報を補完\r
+ /// </summary>\r
+ /// <param name="uninstInfo">アンインストール情報</param>\r
+ /// <param name="regKey">元のレジストリキー</param>\r
+ private static void PrefixWithSlowInfoCache(ref UninstallInformation uninstInfo, RegistryKey regKey)\r
+ {\r
+ try {\r
+ byte[] slowInfoCache;\r
+ \r
+ string arpCacheKey = string.Format(@"{0}\..\..\App Management\ARPCache\{1}", regKey.Name, System.IO.Path.GetFileName(regKey.Name));\r
+ arpCacheKey = NaGet.Utils.GetDotsRemovedPath(arpCacheKey);\r
+ slowInfoCache = (byte[]) Registry.GetValue(arpCacheKey, "SlowInfoCache", null);\r
+ \r
+ if (slowInfoCache == null || slowInfoCache.Length <= 0) {\r
+ arpCacheKey = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\App Management\ARPCache\"+System.IO.Path.GetFileName(regKey.Name);\r
+ slowInfoCache = (byte[]) Registry.GetValue(arpCacheKey, "SlowInfoCache", null);\r
+ }\r
+ \r
+ if (slowInfoCache != null && slowInfoCache.Length > 0) {\r
+ Int32 size = BitConverter.ToInt32(slowInfoCache, 0);\r
+ Int32 hasName = BitConverter.ToInt32(slowInfoCache, 4);\r
+ Int64 installSize = BitConverter.ToInt64(slowInfoCache, 8);\r
+ //Int64 lastUsed = BitConverter.ToInt64(slowInfoCache, 16);\r
+ //Int32 freq = BitConverter.ToInt32(slowInfoCache, 24);\r
+ \r
+ if (installSize > 0) {\r
+ uninstInfo.EstimatedSize = (int)(installSize >> 10);\r
+ }\r
+ \r
+ string filename = null;\r
+ if (hasName != 0) {\r
+ int offset = 28;\r
+ int pos = offset;\r
+ while (pos < slowInfoCache.Length) {\r
+ if (slowInfoCache[pos] == 0) {\r
+ break;\r
+ }\r
+ pos += 2;\r
+ }\r
+ \r
+ filename = System.Text.Encoding.Unicode.GetString(slowInfoCache, offset, pos-offset);\r
+ \r
+ if (string.IsNullOrEmpty(uninstInfo.IconPath) && System.IO.File.Exists(filename)) {\r
+ uninstInfo.IconPath = filename;\r
+ }\r
+ }\r
+ }\r
+ } catch (Exception) {\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// パッケージ情報からアンインストーラ情報を生成する\r
+ /// </summary>\r
+ /// <param name="pkg">パッケージ</param>\r
+ /// <returns>生成されたアンインストール</returns>\r
+ public static UninstallInformation NewInstance(Package pkg)\r
+ {\r
+ UninstallInformation uninstInfo = new UninstallInformation();\r
+ \r
+ uninstInfo.DisplayName = pkg.Name;\r
+ uninstInfo.DisplayVersion = pkg.Version;\r
+ uninstInfo.Publisher = pkg.Author;\r
+ uninstInfo.URLInfoAbout = pkg.Url.Href;\r
+ uninstInfo.IconPath = null; // TODO\r
+ uninstInfo.ModifyPath = null;\r
+ uninstInfo.UninstallString = null; // TODO\r
+ uninstInfo.CanModify = false;\r
+ uninstInfo.CanRepair = false;\r
+ uninstInfo.CanRemove = true;\r
+ uninstInfo.IsSystemComponent = false;\r
+ uninstInfo.IsOSPatch = false;\r
+ uninstInfo.InstallLocation = null;\r
+ uninstInfo.InstallDate = null;\r
+ uninstInfo.EstimatedSize = 0;\r
+ \r
+ return uninstInfo;\r
+ }\r
+ \r
+ #endregion\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.Diagnostics;\r
+using System.Text.RegularExpressions;\r
+using System.Collections;\r
+using System.CodeDom.Compiler;\r
+using System.IO;\r
+\r
+namespace NaGet.Packages.Install\r
+{\r
+ /// <summary>\r
+ /// Description of Uninstallation.\r
+ /// </summary>\r
+ public class Uninstallation\r
+ {\r
+ /// <summary>\r
+ /// アンインストールするパッケージ\r
+ /// </summary>\r
+ public InstalledPackage UninstalledPackage;\r
+ \r
+ /// <summary>\r
+ /// 外部アプリのエラー出力の受信ハンドラ\r
+ /// </summary>\r
+ public event EventHandler<NaGet.Utils.AnyDataEventArgs<string>> ErrorDataReceived;\r
+ \r
+ /// <summary>\r
+ /// 外部アプリの標準出力の受信ハンドラ\r
+ /// </summary>\r
+ public event EventHandler<NaGet.Utils.AnyDataEventArgs<string>> OutputDataReceived;\r
+ \r
+ /// <summary>\r
+ /// サイレントアンインストールするか否か\r
+ /// </summary>\r
+ public bool Silent = false;\r
+ \r
+ /// <summary>\r
+ /// コンストラクタ\r
+ /// </summary>\r
+ /// <param name="package">アンインストールするパッケージ</param>\r
+ public Uninstallation(InstalledPackage package)\r
+ {\r
+ UninstalledPackage = package;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// インストールされた状態か否か\r
+ /// </summary>\r
+ public bool Installed\r
+ {\r
+ get {\r
+ if (Directory.Exists(UninstalledPackage.UninstallInfo.InstallLocation)) {\r
+ return true;\r
+ } else if (UninstalledPackage.Type == InstallerType.ARCHIVE) {\r
+ return false;\r
+ }\r
+ \r
+ foreach (UninstallInformation info in RegistriedUninstallers.Uninstallers) {\r
+ Match match = Regex.Match(info.DisplayName, UninstalledPackage.UninstallerKey);\r
+ \r
+ if (match.Success) {\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// アンインストーラ等を起動してアンインストール作業を行う\r
+ /// </summary>\r
+ /// <returns>アンインストーラの終了コード</returns>\r
+ public int Uninstall()\r
+ {\r
+ if (! Installed) {\r
+ throw new ApplicationException("Program not found, may be already uninstalled");\r
+ }\r
+ \r
+ int exitValue = 0;\r
+ string uninstallString = Silent? UninstalledPackage.UninstallInfo.QuietUninstallString : UninstalledPackage.UninstallInfo.UninstallString;\r
+ if (string.IsNullOrEmpty(uninstallString)) {\r
+ throw new ApplicationException(string.Format("Could not found {0}install script", Silent? "silent " : ""));\r
+ }\r
+ \r
+ if (File.Exists(uninstallString)) {\r
+ // 単独のファイルの場合\r
+ using (Process hProcess = NaGet.Utils.ProcessStartWithOutputCapture(new ProcessStartInfo(uninstallString),\r
+ NaGet.Utils.ConvertToDataReceivedEventHandler(OutputDataReceived),\r
+ NaGet.Utils.ConvertToDataReceivedEventHandler(ErrorDataReceived)) ) {\r
+ hProcess.WaitForExit();\r
+ \r
+ exitValue = hProcess.ExitCode;\r
+ }\r
+ } else {\r
+ ProcessStartInfo procInfo = new ProcessStartInfo(null, uninstallString);\r
+ procInfo.UseShellExecute = false;\r
+ if (UninstalledPackage.Type == InstallerType.ARCHIVE) {\r
+ procInfo.CreateNoWindow = true;\r
+ }\r
+ using (NaGet.InteropServices.CreateProcessCaller p = new NaGet.InteropServices.CreateProcessCaller(procInfo)) {\r
+ p.WaitForExit();\r
+ \r
+ exitValue = p.ExitCode;\r
+ }\r
+ }\r
+ \r
+ return exitValue;\r
+ }\r
+ \r
+ public override string ToString()\r
+ {\r
+ return string.Format("{0}({1})", UninstalledPackage.Name, UninstalledPackage.Version);\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.IO;\r
+using System.Xml.Serialization;\r
+using System.Security.Cryptography;\r
+\r
+namespace NaGet.Packages\r
+{\r
+ /// <summary>\r
+ /// ハッシュ値の種類(計算法)を表す。\r
+ /// </summary>\r
+ public enum HashValueType\r
+ {\r
+ [XmlEnum(Name="size")]\r
+ SIZE,\r
+ [XmlEnum(Name="md5")]\r
+ MD5SUM,\r
+ [XmlEnum(Name="sha1")]\r
+ SHA1SUM,\r
+ [XmlEnum(Name="sha256")]\r
+ SHA256SUM\r
+ }\r
+ \r
+ public class HashValue\r
+ {\r
+ /// <summary>\r
+ /// ハッシュ値の種類(計算法)\r
+ /// </summary>\r
+ [XmlAttribute]\r
+ public HashValueType Type;\r
+ \r
+ /// <summary>\r
+ /// ハッシュ値そのものをあらわす\r
+ /// </summary>\r
+ [XmlText]\r
+ public string Value;\r
+ \r
+ /// <summary>\r
+ /// コンストラクタ\r
+ /// </summary>\r
+ public HashValue()\r
+ {\r
+ }\r
+ \r
+ /// <summary>\r
+ /// 与えられたファイルのハッシュ値が同一であるか検証する\r
+ /// </summary>\r
+ /// <param name="path">ハッシュ計算を行う対象のファイル</param>\r
+ /// <returns>ファイルのハッシュ値が妥当な場合true。</returns>\r
+ public bool Validate(string path)\r
+ {\r
+ return string.Compare(this.Value, HashValueFor(path, this.Type), true) == 0;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// ファイルのハッシュを計算する\r
+ /// </summary>\r
+ /// <param name="file">計算対象のファイル</param>\r
+ /// <param name="type">ハッシュの種類(計算法)</param>\r
+ /// <returns></returns>\r
+ public static string HashValueFor(string file, HashValueType type)\r
+ {\r
+ using (FileStream fs = new FileStream(file, FileMode.Open)) {\r
+ return HashValue.HashValueFor(fs, type);\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// ストリーム入力からハッシュを計算する\r
+ /// </summary>\r
+ /// <param name="stream">ストリーム入力</param>\r
+ /// <param name="type">ハッシュの種類(計算法)</param>\r
+ /// <returns></returns>\r
+ public static string HashValueFor(Stream stream, HashValueType type)\r
+ {\r
+ byte[] hash;\r
+ \r
+ switch (type) {\r
+ case HashValueType.SIZE:\r
+ return stream.Length.ToString();\r
+ case HashValueType.MD5SUM:\r
+ hash = MD5.Create().ComputeHash(stream);\r
+ break;\r
+ case HashValueType.SHA1SUM:\r
+ hash = SHA1.Create().ComputeHash(stream);\r
+ break;\r
+ case HashValueType.SHA256SUM:\r
+ hash = SHA256.Create().ComputeHash(stream);\r
+ break;\r
+ default:\r
+ throw new NotSupportedException(string.Format("Hash type {0} does not supported", type));\r
+ }\r
+ \r
+ return BitConverter.ToString(hash).Replace("-",string.Empty);\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System.Xml.Serialization;\r
+\r
+namespace NaGet.Packages\r
+{\r
+ /// <summary>\r
+ /// インストーラの種類を表す。\r
+ /// </summary>\r
+ public enum InstallerType\r
+ {\r
+ /// <summary>\r
+ /// インストーラ\r
+ /// </summary>\r
+ [XmlEnum(Name="installer")]\r
+ EXEC_INSTALLER,\r
+ /// <summary>\r
+ /// Microsoft Software Installer\r
+ /// </summary>\r
+ [XmlEnum(Name="msi")]\r
+ MSI_PACKAGE,\r
+ /// <summary>\r
+ /// 自己解凍書庫を含む書庫一般\r
+ /// </summary>\r
+ [XmlEnum(Name="archive")]\r
+ ARCHIVE,\r
+ /// <summary>\r
+ /// インストールできない単なるデータ(BIOSなど)\r
+ /// </summary>\r
+ [XmlEnum(Name="cannotinstall")]\r
+ CANNOT_INSTALL,\r
+ }\r
+ \r
+ /// <summary>\r
+ /// パッケージ情報を格納するクラス\r
+ /// </summary>\r
+ public class Package\r
+ {\r
+ /// <summary>\r
+ /// パッケージ名\r
+ /// </summary>\r
+ public string Name;\r
+\r
+ /// <summary>\r
+ /// バージョン文字列\r
+ /// </summary>\r
+ public string Version;\r
+\r
+ /// <summary>\r
+ /// パッケージの概要\r
+ /// </summary>\r
+ public string Summary;\r
+ \r
+ /// <summary>\r
+ /// パッケージの解説\r
+ /// </summary>\r
+ public string Description;\r
+\r
+ /// <summary>\r
+ /// 公式サイトのURL\r
+ /// </summary>\r
+ public LocationEntry Url;\r
+ \r
+ /// <summary>\r
+ /// 製作者の名前\r
+ /// </summary>\r
+ public string Author;\r
+ \r
+ /// <summary>\r
+ /// インストーラのタイプ\r
+ /// </summary>\r
+ public InstallerType Type;\r
+ \r
+ /// <summary>\r
+ /// インストーラが書庫内に入っているかのフラグ\r
+ /// </summary>\r
+ public bool ArchivedInstaller = false;\r
+ \r
+ /// <summary>\r
+ /// アンインストーラのレジストリのキー\r
+ /// </summary>\r
+ public string UninstallerKey;\r
+ \r
+ /// <summary>\r
+ /// インストールスクリプト(MSBuildドキュメント)\r
+ /// </summary>\r
+ public string InstallScript;\r
+ \r
+ /// <summary>\r
+ /// アーカイブインストーラのときのSystem32のコピー\r
+ /// </summary>\r
+ public string System32CopyFiles;\r
+ \r
+ /// <summary>\r
+ /// インストーラのリソースの配列\r
+ /// </summary>\r
+ [XmlElement]\r
+ public Installer[] Installer;\r
+\r
+ /// <summary>\r
+ /// 必要とされるパッケージの配列\r
+ /// </summary>\r
+ [XmlArray(IsNullable=true),XmlArrayItem("Entry")]\r
+ public Entry[] Requires;\r
+ \r
+ /// <summary>\r
+ /// 競合するパッケージの配列\r
+ /// </summary>\r
+ [XmlArray(IsNullable=true),XmlArrayItem("Entry")]\r
+ public Entry[] Conflicts;\r
+ \r
+ /// <summary>\r
+ /// タグ\r
+ /// </summary>\r
+ public string Tags;\r
+ \r
+ /// <summary>\r
+ /// ライセンス\r
+ /// </summary>\r
+ public string License;\r
+ \r
+ /// <summary>\r
+ /// 所属するパッケージリスト名称\r
+ /// </summary>\r
+ public string PackageListName;\r
+ }\r
+\r
+ /// <summary>\r
+ /// パッケージ参照を示すクラス\r
+ /// </summary>\r
+ public class Entry\r
+ {\r
+ /// <summary>\r
+ /// パッケージ名\r
+ /// </summary>\r
+ [XmlAttribute]\r
+ public string Name;\r
+ /// <summary>\r
+ /// パッケージのバージョン比較の式\r
+ /// </summary>\r
+ [XmlAttribute]\r
+ public string Flags;\r
+ /// <summary>\r
+ /// パッケージのバージョン\r
+ /// </summary>\r
+ public string Version;\r
+ }\r
+\r
+ public class Installer\r
+ {\r
+ /// <summary>\r
+ /// コンストラクタ\r
+ /// </summary>\r
+ public Installer()\r
+ {\r
+ }\r
+ \r
+ public Platform Platform;\r
+ \r
+ /// <summary>\r
+ /// ダウンロードリソースURLの配列\r
+ /// </summary>\r
+ public LocationEntry Url;\r
+ \r
+ /// <summary>\r
+ /// ファイル検証用ハッシュ\r
+ /// </summary>\r
+ [XmlElement]\r
+ public HashValue[] Hash;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// リソースの位置を示すクラス\r
+ /// </summary>\r
+ public class LocationEntry\r
+ {\r
+ // TODO LocationEntryは果たして必要なのかの、考察\r
+ \r
+ /// <summary>\r
+ /// コンストラクタ\r
+ /// </summary>\r
+ public LocationEntry()\r
+ {\r
+ }\r
+\r
+ /// <summary>\r
+ /// コンストラクタ\r
+ /// </summary>\r
+ /// <param name="sHref">リソースのURL</param>\r
+ public LocationEntry(string sHref)\r
+ {\r
+ Href = sHref;\r
+ }\r
+\r
+ /// <summary>\r
+ /// リソースのURL\r
+ /// </summary>\r
+ [XmlAttribute]\r
+ public string Href;\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.IO;\r
+using System.Collections.Generic;\r
+using System.Xml.Serialization;\r
+\r
+namespace NaGet.Packages\r
+{\r
+ /// <summary>\r
+ /// パッケージのリストの情報を示すクラス\r
+ /// </summary>\r
+ [XmlRoot("PackageList", Namespace="http://diffshare.tv/xmlns/2007/na-get/PackageList/")]\r
+ public class PackageList<TPackage> where TPackage : Package\r
+ {\r
+ /// <summary>\r
+ /// パッケージリスト自体の識別名\r
+ /// </summary>\r
+ public string Name;\r
+\r
+ /// <summary>\r
+ /// パッケージの配列のリスト\r
+ /// </summary>\r
+ private List<TPackage> packageArrayList;\r
+\r
+ /// <summary>\r
+ /// コンストラクタ\r
+ /// </summary>\r
+ public PackageList()\r
+ {\r
+ packageArrayList = new List<TPackage>();\r
+ }\r
+\r
+ /// <summary>\r
+ /// 本リストが格納しているパッケージの配列\r
+ /// </summary>\r
+ [XmlElement("Package", Namespace="http://diffshare.tv/xmlns/2007/na-get/PackageList/")]\r
+ public TPackage[] Packages\r
+ {\r
+ get\r
+ {\r
+ return packageArrayList.ToArray();\r
+ }\r
+ set\r
+ {\r
+ packageArrayList = new List<TPackage>();\r
+ if (value != null) {\r
+ foreach (TPackage package in value) {\r
+ packageArrayList.Add(package);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// パッケージをリストに追加する\r
+ /// </summary>\r
+ /// <param name="package">追加するパッケージ</param>\r
+ public void AddPackages(IEnumerable<TPackage> package)\r
+ {\r
+ packageArrayList.AddRange(package);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// パッケージをリストにマージ(追加)する\r
+ /// </summary>\r
+ /// <param name="package">追加するパッケージ</param>\r
+ public void AddPackages(PackageList<TPackage> pkgList)\r
+ {\r
+ packageArrayList.AddRange(pkgList.packageArrayList);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// パッケージをリストに追加する\r
+ /// </summary>\r
+ /// <param name="package">追加するパッケージ</param>\r
+ public void AddPackage(TPackage package)\r
+ {\r
+ packageArrayList.Add(package);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// パッケージをリストから削除\r
+ /// </summary>\r
+ /// <param name="package">削除するパッケージ</param>\r
+ public void RemovePackage(TPackage package)\r
+ {\r
+ packageArrayList.Remove(package);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// パッケージを検索をする際のPredicateを返す \r
+ /// </summary>\r
+ /// <param name="key">検索キー</param>\r
+ protected static Predicate<TPackage> GetPredicateForSearch(string key)\r
+ {\r
+ string lowerKey = key.ToLower();\r
+ return delegate(TPackage package) {\r
+ return package.Name.ToLower().IndexOf(lowerKey) >= 0 ||\r
+ package.Summary.ToLower().IndexOf(lowerKey) >= 0 ||\r
+ ((package.Tags ?? string.Empty).ToLower().IndexOf(lowerKey) >= 0);\r
+ };\r
+ }\r
+ \r
+ /// <summary>\r
+ /// パッケージを検索して、それにマッチしたパッケージをイテレータとして返す。\r
+ /// </summary>\r
+ /// <param name="key">検索キー</param>\r
+ public IEnumerable<TPackage> Search(string key)\r
+ {\r
+ return packageArrayList.FindAll(GetPredicateForSearch(key));\r
+ }\r
+ \r
+ /// <summary>\r
+ /// パッケージ名で検索をする際のPredicateを返す \r
+ /// </summary>\r
+ /// <param name="name">\r
+ /// パッケージ名\r
+ /// </param>\r
+ /// <returns>\r
+ /// Predicate\r
+ /// </returns>\r
+ protected static Predicate<TPackage> GetPredicateForPackageName(string name)\r
+ {\r
+ return delegate(TPackage package) {\r
+ return package.Name == name;\r
+ };\r
+ }\r
+ \r
+ /// <summary>\r
+ /// 指定した名前に対応するパッケージを返す\r
+ /// </summary>\r
+ /// <param name="name">検索にかけるパッケージ名</param>\r
+ public TPackage GetPackageForName(string name)\r
+ {\r
+ return packageArrayList.Find(GetPredicateForPackageName(name));\r
+ }\r
+ \r
+ /// <summary>\r
+ /// 指定した名前に対応するパッケージを返す\r
+ /// </summary>\r
+ /// <param name="name">検索にかけるパッケージ名</param>\r
+ public TPackage[] GetPackagesForName(string name)\r
+ {\r
+ return packageArrayList.FindAll(GetPredicateForPackageName(name)).ToArray();\r
+ }\r
+ \r
+ /// <summary>\r
+ /// 名前・バージョンが対応するパッケージを返す\r
+ /// </summary>\r
+ /// <param name="name">検索にかけるパッケージ名</param>\r
+ /// <param name="version">検索にかけるパッケージのバージョン</param>\r
+ public TPackage GetPackageForPackage(string name, string version)\r
+ {\r
+ TPackage[] pkgs = GetPackagesForName(name);\r
+ foreach (TPackage tpkg in pkgs) {\r
+ if (tpkg.Version == version) {\r
+ return tpkg;\r
+ }\r
+ }\r
+ return null;\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.IO;\r
+using System.Collections.Generic;\r
+using NaGet.Packages;\r
+using NaGet.Packages.Install;\r
+\r
+namespace NaGet.Packages\r
+{\r
+ public class PackageListsManager\r
+ {\r
+ internal PackageList<Package> availablePkgList;\r
+ internal PackageList<InstalledPackage> installedPkgList;\r
+ internal PackageList<InstalledPackage> systemInstalledPkgList;\r
+ \r
+ public PackageList<Package> AvailablePkgList {\r
+ get { return availablePkgList; }\r
+ }\r
+ \r
+ public PackageList<InstalledPackage> InstalledPkgList {\r
+ get { return installedPkgList; }\r
+ }\r
+ \r
+ public PackageList<InstalledPackage> SystemInstalledPkgList {\r
+ get { return systemInstalledPkgList; }\r
+ }\r
+ \r
+ private List<InstallationLog> systemInstalledLogList;\r
+ \r
+ public PackageListsManager()\r
+ {\r
+ LoadPackageLists();\r
+ }\r
+ \r
+ #region \83t\83@\83C\83\8b\93Ç\82Ý\8f\91\82«\r
+ \r
+ /// <summary>\r
+ /// \83t\83@\83C\83\8b\82ð\93Ç\82Ý\8d\9e\82ñ\82Å\8dX\90V\82·\82é\r
+ /// </summary>\r
+ public void LoadPackageLists()\r
+ {\r
+ try {\r
+ availablePkgList = NaGet.Utils.GetDeserializedObject<PackageList<Package>>(NaGet.Env.PackageListFile);\r
+ } catch (FileNotFoundException) {\r
+ availablePkgList = new PackageList<Package>();\r
+ }\r
+ \r
+ try {\r
+ installedPkgList = NaGet.Utils.GetDeserializedObject<PackageList<InstalledPackage>>(NaGet.Env.ArchiveInstalledPackageListFile);\r
+ } catch (FileNotFoundException) {\r
+ installedPkgList = new PackageList<InstalledPackage>();\r
+ }\r
+ \r
+ try {\r
+ systemInstalledPkgList = NaGet.Utils.GetDeserializedObject<PackageList<InstalledPackage>>(NaGet.Env.SystemInstalledPackageListFile);\r
+ } catch (FileNotFoundException) {\r
+ systemInstalledPkgList = new PackageList<InstalledPackage>();\r
+ }\r
+ \r
+ \r
+ systemInstalledLogList = new List<InstallationLog>();\r
+ try {\r
+ systemInstalledLogList.AddRange(\r
+ NaGet.Utils.GetDeserializedObject<InstallationLog[]>(NaGet.Env.SystemInstalledPackageLogFile)\r
+ );\r
+ } catch (Exception) {\r
+ // do nothing\r
+ }\r
+ }\r
+ \r
+ public void SaveAvailablePackageList()\r
+ {\r
+ NaGet.Utils.PutSerializeObject(NaGet.Env.PackageListFile, availablePkgList);\r
+ }\r
+ public void SaveInstalledPackageList()\r
+ {\r
+ NaGet.Utils.PutSerializeObject(NaGet.Env.ArchiveInstalledPackageListFile, installedPkgList);\r
+ }\r
+ public void SaveSystemInstalledPackageList()\r
+ {\r
+ NaGet.Utils.PutSerializeObject(NaGet.Env.SystemInstalledPackageListFile, systemInstalledPkgList);\r
+ }\r
+ public void SaveSystemInstalledLogList()\r
+ {\r
+ NaGet.Utils.PutSerializeObject(NaGet.Env.SystemInstalledPackageLogFile, systemInstalledLogList);\r
+ }\r
+ \r
+ public void CommitToFile()\r
+ {\r
+ SaveAvailablePackageList();\r
+ SaveInstalledPackageList();\r
+ SaveSystemInstalledPackageList();\r
+ \r
+ SaveSystemInstalledLogList();\r
+ }\r
+ \r
+ #endregion\r
+ \r
+ #region \83p\83b\83P\81[\83W\83C\83\93\83X\83g\81[\83\8b\8c\9f\92m\8aÖ\98A\r
+ \r
+ public void DetectInstalledPkgs()\r
+ {\r
+ PackageList<InstalledPackage> pkgList = new PackageList<InstalledPackage>();\r
+ if (Directory.Exists(NaGet.Env.ArchiveProgramFiles)) {\r
+ foreach (string path in NaGet.Utils.ExtendWildcardFile(NaGet.Env.ArchiveProgramFiles, Path.Combine("*", ".applistation.package.xml"))) {\r
+ pkgList.AddPackage(NaGet.Utils.GetDeserializedObject<InstalledPackage>(path));\r
+ }\r
+ this.installedPkgList = pkgList;\r
+ }\r
+ }\r
+ \r
+ public void DetectSystemInstalledPkgs()\r
+ {\r
+ PackageList<InstalledPackage> installedPkgList = new PackageList<InstalledPackage>();\r
+ foreach (InstalledPackage pkg in RegistriedUninstallers.DetectInstalledPackages(availablePkgList)) {\r
+ InstallationLog log = this.GetLogFor(pkg);\r
+ if (log != null) {\r
+ InstalledPackage pkg2 = new InstalledPackage();\r
+ NaGet.Utils.FieldCopy((Package) log.Package, ref pkg2);\r
+ pkg2.UninstallInfo = pkg.UninstallInfo;\r
+ \r
+ installedPkgList.AddPackage(pkg2);\r
+ } else {\r
+ installedPkgList.AddPackage(pkg);\r
+ }\r
+ }\r
+ this.systemInstalledPkgList = installedPkgList;\r
+ }\r
+ \r
+ #endregion\r
+ \r
+ #region \83p\83b\83P\81[\83W\95Ö\97\98\83\81\83\\83b\83h\r
+ \r
+ public IEnumerable<InstalledPackage> GetAllInstalledPackages()\r
+ {\r
+ foreach (InstalledPackage pkg in installedPkgList.Packages) {\r
+ yield return pkg;\r
+ }\r
+ foreach (InstalledPackage pkg in systemInstalledPkgList.Packages) {\r
+ yield return pkg;\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \91S\82Ä\82Ì\83p\83b\83P\81[\83W\82ð\83C\83e\83\8c\81[\83^\82Å\95Ô\82·\95Ö\97\98\83\81\83\\83b\83h\81B\r
+ /// </summary>\r
+ /// <returns>\83p\83b\83P\81[\83W\82Ì\83C\83e\83\8c\81[\83^</returns>\r
+ public IEnumerable<Package> GetAllPackages()\r
+ {\r
+ foreach (Package pkg in availablePkgList.Packages) {\r
+ yield return pkg;\r
+ }\r
+ foreach (Package pkg in GetAllInstalledPackages()) {\r
+ yield return pkg;\r
+ }\r
+ }\r
+ \r
+ #endregion\r
+ \r
+ #region \83C\83\93\83X\83g\81[\83\8b\83\8d\83O\8aÖ\98A\r
+ \r
+ private Predicate<InstallationLog> createPackageNamePredicator(Package pkg)\r
+ {\r
+ return delegate(InstallationLog log) {\r
+ return log.Package.Name == pkg.Name;\r
+ };\r
+ }\r
+ \r
+ public InstallationLog GetLogFor(Package pkg)\r
+ {\r
+ return systemInstalledLogList.Find(createPackageNamePredicator(pkg));\r
+ }\r
+ \r
+ public void WriteInstallationLog(Installation inst)\r
+ {\r
+ // \8fd\95¡\82Í\8dí\8f\9c\r
+ systemInstalledLogList.RemoveAll(createPackageNamePredicator(inst.InstalledPackage));\r
+ \r
+ InstallationLog newLog = new InstallationLog();\r
+ newLog.Date = DateTime.Now;\r
+ newLog.Package = inst.InstalledPackage;\r
+ \r
+ systemInstalledLogList.Add(newLog);\r
+ }\r
+ \r
+ #endregion\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.Reflection;\r
+using System.Xml.Serialization;\r
+\r
+namespace NaGet.Packages\r
+{\r
+ /// <summary>\r
+ /// PlatformのOSの種類をあらわす\r
+ /// </summary>\r
+ public enum PlatformOSType\r
+ {\r
+ WIN95,\r
+ WIN98,\r
+ WINME,\r
+ \r
+ WINNT4,\r
+ WIN2K,\r
+ WINXP,\r
+ WIN2003,\r
+ VISTA,\r
+ }\r
+ \r
+ public class Platform\r
+ {\r
+ /// <summary>\r
+ /// ソフトの動作するアーキテクチャ\r
+ /// </summary>\r
+ [XmlAttribute]\r
+ public ProcessorArchitecture Arch = ProcessorArchitecture.X86;\r
+ \r
+ /// <summary>\r
+ /// 動作するOSの種類の配列\r
+ /// </summary>\r
+ [XmlIgnore]\r
+ public PlatformOSType[] OsType;\r
+ \r
+ /// <summary>\r
+ /// OsTypeの文字列表現\r
+ /// </summary>\r
+ [XmlAttribute]\r
+ public string Os {\r
+ get {\r
+ if (OsType == null) return null;\r
+ string[] strs = new string[OsType.Length];\r
+ for (int i = 0; i < OsType.Length; i++) {\r
+ strs[i] = OsType[i].ToString("G");\r
+ }\r
+ return string.Join(",", strs);\r
+ }\r
+ set {\r
+ string[] strs = (value ?? "").Split(',');\r
+ System.Collections.Generic.List<PlatformOSType> list = new System.Collections.Generic.List<PlatformOSType>();\r
+ for (int i = 0; i < strs.Length; i++) {\r
+ try {\r
+ list.Add((PlatformOSType) Enum.Parse(typeof(PlatformOSType), strs[i], true));\r
+ } catch (ArgumentException) {\r
+ }\r
+ }\r
+ OsType = list.ToArray();\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// 現在のプラットホームで動くか否か?\r
+ /// </summary>\r
+ /// <returns>動く場合はtrue</returns>\r
+ public bool IsRunnable()\r
+ {\r
+ return IsRunnableArch() && IsRunnableOS();\r
+ }\r
+ \r
+ /// <summary>\r
+ /// 現在のマシンのアーキテクチャで動くか否か?\r
+ /// </summary>\r
+ /// <returns>動く場合はtrue</returns>\r
+ public bool IsRunnableArch()\r
+ {\r
+ return Arch == GetArch() ||\r
+ Arch == ProcessorArchitecture.None ||\r
+ Arch == ProcessorArchitecture.MSIL;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// 現在のマシンのアーキテクチャで動かないが、Wow64で動くか否か?\r
+ /// 64ビット環境でない場合は常にfalse\r
+ /// </summary>\r
+ /// <returns></returns>\r
+ public bool IsRunnableArchOnWow64()\r
+ {\r
+ if (IntPtr.Size == 8) {\r
+ return Arch == ProcessorArchitecture.X86;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// 現在のマシンのアーキテクチャを得る\r
+ /// </summary>\r
+ /// <returns>現在のマシンのアーキテクチャ</returns>\r
+ public static ProcessorArchitecture GetArch()\r
+ {\r
+ Module[] moduleArray = Assembly.GetExecutingAssembly().GetModules();\r
+ Module md = moduleArray[0];\r
+ \r
+ PortableExecutableKinds pekinds;\r
+ ImageFileMachine ifm;\r
+ md.GetPEKind(out pekinds, out ifm);\r
+ \r
+ switch (ifm) {\r
+ case ImageFileMachine.AMD64:\r
+ return ProcessorArchitecture.Amd64;\r
+ case ImageFileMachine.I386:\r
+ return (IntPtr.Size == 4)? ProcessorArchitecture.X86 : ProcessorArchitecture.Amd64;\r
+ case ImageFileMachine.IA64:\r
+ return ProcessorArchitecture.IA64;\r
+ default:\r
+ return ProcessorArchitecture.None;\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// 現在のマシンのアーキテクチャを得る\r
+ /// </summary>\r
+ /// <returns>現在のマシンのアーキテクチャ</returns>\r
+ public bool IsRunnableOS()\r
+ {\r
+ if (OsType == null || OsType.Length <= 0) {\r
+ return true; // 記述なしはOS全部で動く扱い\r
+ }\r
+ \r
+ PlatformOSType? thisOs = GetOSType();\r
+ return thisOs != null && Array.BinarySearch(OsType, (PlatformOSType) thisOs) >= 0;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// 現在のマシンのOSを得る\r
+ /// </summary>\r
+ /// <returns>現在のマシンのOS</returns>\r
+ public static PlatformOSType? GetOSType()\r
+ {\r
+ OperatingSystem os = Environment.OSVersion;\r
+ Version osVer = os.Version;\r
+ \r
+ switch (os.Platform) {\r
+ case PlatformID.Win32Windows:\r
+ if (osVer.Major == 4) {\r
+ switch (osVer.Minor) {\r
+ case 4:\r
+ return PlatformOSType.WIN95;\r
+ case 10:\r
+ return PlatformOSType.WIN98;\r
+ case 99:\r
+ return PlatformOSType.WINME;\r
+ }\r
+ }\r
+ break;\r
+ case PlatformID.Win32NT:\r
+ if (osVer.Major == 4) {\r
+ return PlatformOSType.WINNT4;\r
+ } else if (osVer.Major == 5) {\r
+ switch (osVer.Minor) {\r
+ case 0:\r
+ return PlatformOSType.WIN2K;\r
+ case 1:\r
+ return PlatformOSType.WINXP;\r
+ case 2:\r
+ return PlatformOSType.WIN2003;\r
+ }\r
+ } else if (osVer.Major == 6) {\r
+ return PlatformOSType.VISTA;\r
+ }\r
+ break;\r
+// case PlatformID.WinCE:\r
+// return null;\r
+// case PlatformID.Unix:\r
+// return null;\r
+ }\r
+ \r
+ return null;\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.IO;\r
+using System.Collections.Generic;\r
+\r
+namespace NaGet.Packages\r
+{\r
+ /// <summary>\r
+ /// パッケージリストを提供するプロバイダのリストを示すクラス\r
+ /// </summary>\r
+ public class ProviderList\r
+ {\r
+ /// <summary>\r
+ /// パッケージリストのリソースURLの配列\r
+ /// </summary>\r
+ public string[] Urls;\r
+ \r
+ /// <summary>\r
+ /// コンストラクタ\r
+ /// </summary>\r
+ public ProviderList()\r
+ {\r
+ }\r
+\r
+ /// <summary>\r
+ /// コンストラクタ\r
+ /// </summary>\r
+ /// <param name="path">プロバイダリストのファイルのパス</param>\r
+ public ProviderList(string path)\r
+ {\r
+ List<string> providerList = new List<string>();\r
+ using(StreamReader reader = new StreamReader(path)) {\r
+ string line;\r
+ while ((line = reader.ReadLine()) != null) {\r
+ providerList.Add(line);\r
+ }\r
+ }\r
+ \r
+ Urls = providerList.ToArray();\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.Text.RegularExpressions;\r
+\r
+namespace NaGet.Packages\r
+{\r
+ // TODO Debian-apt\82Ì\83R\81[\83h\82ð\97\98\97p\82µ\82Ä\82¢\82é\82Ì\82ÅGPL\82É\82È\82é\82Ì\82É\92\8d\88Ó\r
+ \r
+ \r
+ public class VersionComparetor : System.Collections.Generic.IComparer<string>\r
+ {\r
+ public VersionComparetor()\r
+ {\r
+ }\r
+ \r
+ private static int order(char x)\r
+ {\r
+ return (char.IsDigit(x) ? 0\r
+ : (x==0) ? 0\r
+ : char.IsLetter(x) ? (x)\r
+ : (x) + 256);\r
+ }\r
+ \r
+ public int Compare(string a, string b)\r
+ {\r
+ // \91O\8f\88\97\9d\r
+ a = a.ToLower();\r
+ b = b.ToLower();\r
+ if (Regex.IsMatch(a, @"\.0*$")) \r
+ Regex.Replace(a, @"\.0*$", string.Empty);\r
+ if (Regex.IsMatch(b, @"\.0*$")) \r
+ Regex.Replace(b, @"\.0*$", string.Empty);\r
+ \r
+ if (a == b) {\r
+ return 0;\r
+ }\r
+ \r
+ \r
+ int apos = 0, bpos = 0;\r
+ int alen = a.Length, blen = b.Length;\r
+ \r
+ while ((apos < alen) && (bpos < blen)) {\r
+ int first_diff = 0;\r
+ \r
+ while ((apos < alen) && (bpos < blen) &&\r
+ (!char.IsDigit(a[apos]) || !char.IsDigit(b[bpos])) ) {\r
+ int vc = order(a[apos]);\r
+ int rc = order(b[bpos]);\r
+ if (vc != rc)\r
+ return vc - rc;\r
+ apos ++; bpos ++;\r
+ }\r
+ \r
+ if (a[apos] == '0') apos ++;\r
+ if (b[bpos] == '0') bpos ++;\r
+ \r
+ while ((apos < alen) && (bpos < blen) &&\r
+ char.IsDigit(a[apos]) && char.IsDigit(b[bpos])) {\r
+ if (first_diff == 0)\r
+ first_diff = a[apos] - b[bpos];\r
+ apos ++; bpos ++;\r
+ }\r
+ \r
+ if (apos < alen && char.IsDigit(a[apos])) {\r
+ return 1;\r
+ } else if (bpos < blen && char.IsDigit(b[bpos])) {\r
+ return -1;\r
+ } else if (first_diff != 0) {\r
+ return first_diff;\r
+ }\r
+ }\r
+ \r
+ if (apos == alen && bpos == blen) {\r
+ return 0;\r
+ } else if (apos == alen) {\r
+ return -1;\r
+ } else if (bpos == blen) {\r
+ return 1;\r
+ } else {\r
+ return 1; // Shouldnt happen\r
+ }\r
+ }\r
+ \r
+ \r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using NaGet.Packages.Install;\r
+using NaGet.Packages;\r
+using NaGet.Net;\r
+\r
+namespace NaGet.SubCommands\r
+{\r
+ public class NaGetInstall : NaGetTaskSet\r
+ {\r
+ private bool done = false;\r
+ \r
+ private int currentTaskSetIndex = -1;\r
+ \r
+ private PackageListsManager pkgListMan;\r
+ \r
+ public Downloader Downloader; // TODO \8eQ\8fÆ\82ð\82µ\82Ä\83Z\83b\83g\82·\82é\82æ\82¤\82É\r
+ \r
+ private bool packageInstallerDownloaded = false;\r
+ \r
+ public override bool Cancelable {\r
+ get { return ! done; }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \83C\83\93\83X\83g\81[\83\8b\82·\82é\83p\83b\83P\81[\83W\r
+ /// </summary>\r
+ public Installation[] Installations;\r
+ \r
+ /// <summary>\r
+ /// \83R\83\93\83X\83g\83\89\83N\83^\r
+ /// </summary>\r
+ /// <param name="pkgs">\83C\83\93\83X\83g\81[\83\8b\82·\82é\83p\83b\83P\81[\83W</param>\r
+ public NaGetInstall(PackageListsManager pkgListMan, Package[] pkgs)\r
+ : this(pkgListMan, Installation.ConvertInstallations(pkgs))\r
+ {\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \83R\83\93\83X\83g\83\89\83N\83^\r
+ /// </summary>\r
+ /// <param name="installations">\83C\83\93\83X\83g\81[\83\8b\8f\88\97\9d\82Ì\94z\97ñ</param>\r
+ public NaGetInstall(PackageListsManager pkgMan, Installation[] installations)\r
+ {\r
+ pkgListMan = pkgMan;\r
+ \r
+ Installations = installations;\r
+ initializeMainTaskSetNames();\r
+ }\r
+ \r
+ private void initializeMainTaskSetNames()\r
+ {\r
+ System.Collections.Generic.List<string> taskSetNames = new System.Collections.Generic.List<string>();\r
+ \r
+ for (int i =0; i < Installations.Length; i++) {\r
+ taskSetNames.Add(string.Format("\8eæ\93¾: {0}", Installations[i].ToString()));\r
+ }\r
+ taskSetNames.Add("\83C\83\93\83X\83g\81[\83\89\82Ì\8c\9f\8fØ");\r
+ for (int i =0; i < Installations.Length; i++) {\r
+ taskSetNames.Add(string.Format("\83C\83\93\83X\83g\81[\83\8b: {0}", Installations[i].ToString()));\r
+ }\r
+ taskSetNames.Add(string.Format("\83\8a\83X\83g\8dX\90V: {0}", NaGet.Env.ArchiveInstalledPackageListFile));\r
+ taskSetNames.Add(string.Format("\83\8a\83X\83g\8dX\90V: {0}", NaGet.Env.SystemInstalledPackageListFile));\r
+ \r
+ TaskSetNames = taskSetNames.ToArray();\r
+ }\r
+ \r
+ public override void Run()\r
+ {\r
+ currentTaskSetIndex ++;\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED, "\83C\83\93\83X\83g\81[\83\8b\8f\88\97\9d\8aJ\8en");\r
+ \r
+ foreach (Installation inst in Installations) {\r
+ if (! inst.IsInstallablePackage()) {\r
+ string msg = string.Format("{0}\82Í\83C\83\93\83X\83g\81[\83\8b\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82¹\82ñ", inst.ToString());\r
+ \r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, msg);\r
+ done = true;\r
+ return;\r
+ }\r
+ \r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, inst.ToString());\r
+ \r
+ if (! inst.Downloaded) {\r
+ try {\r
+ inst.Download(Downloader);\r
+ } catch (NaGetTaskCanceledException) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "\83C\83\93\83X\83g\81[\83\89\82Ì\83_\83E\83\93\83\8d\81[\83h\8f\88\97\9d\82ª\83L\83\83\83\93\83Z\83\8b\82³\82ê\82Ü\82µ\82½");\r
+ done = true;\r
+ return;\r
+ } catch (System.Net.WebException e) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, e.Message);\r
+ if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "\83l\83b\83g\83\8f\81[\83N\82É\90Ú\91±\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B");\r
+ } else {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "\83l\83b\83g\83\8f\81[\83N\82É\90Ú\91±\82Å\82«\82Ü\82¹\82ñ\82Å\82µ\82½\81B\83l\83b\83g\83\8f\81[\83N\82ª\90Ø\92f\82³\82ê\82Ä\82¢\82é\82©\81A\83t\83@\83C\83A\83E\83H\81[\83\8b\82É\82æ\82Á\82Ä\8eÕ\92f\82³\82ê\82½\89Â\94\\90«\82ª\82 \82è\82Ü\82·\81B");\r
+ }\r
+ done = true;\r
+ return;\r
+ } catch (Exception e) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, e.Message);\r
+ done = true;\r
+ return;\r
+ }\r
+ }\r
+ currentTaskSetIndex ++;\r
+ \r
+ if (inst.Downloaded) { // \90³\8fí\8fI\97¹\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, inst.ToString());\r
+ } else { // \83C\83\93\83X\83g\81[\83\8b\82ª\8a®\97¹\82¹\82¸\82É\8fI\82í\82Á\82½=\8e¸\94s=\83G\83\89\81[\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, string.Format("{0}\82Ì\83C\83\93\83X\83g\81[\83\89\82ð\90³\8fí\82É\83_\83E\83\93\83\8d\81[\83h\82Å\82«\82Ü\82¹\82ñ\82Å\82µ\82½", inst.ToString()));\r
+ }\r
+ }\r
+ \r
+ packageInstallerDownloaded = true;\r
+ \r
+ {\r
+ bool invalid = false;\r
+ int i = 0;\r
+ foreach (Installation inst in Installations) {\r
+ float percent = (CurrentTaskSetIndex+((float)i / Installations.Length))*100f/TaskSetNames.Length;\r
+ \r
+ if (inst.GetRegisteredHashCount() > 0) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "\8c\9f\8fØ: "+inst.ToString(), percent);\r
+ \r
+ if (inst.IsInstallablePackage() && inst.VerifyHashValues() == false) {\r
+ invalid = true;\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "\8c\9f\8fØ: "+inst.ToString() + " \94ñ\90®\8d\87", percent);\r
+ } else {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "\8c\9f\8fØ: "+inst.ToString() + " OK", percent);\r
+ }\r
+ }\r
+ i++;\r
+ }\r
+ \r
+ // TODO \83n\83b\83V\83\85\82ª\89ó\82ê\82Ä\82¢\82é\82Æ\82«\82Ì\91Î\8dô\r
+// if (invalid && (! AllGet.Util.Confirm("Some packages do not match hash value. Are you really sure to install them [yN]?", false) )) {\r
+// Console.WriteLine("Abort.");\r
+// Environment.Exit(0);\r
+// }\r
+ currentTaskSetIndex ++;\r
+ }\r
+ \r
+ foreach (Installation inst in Installations) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, inst.ToString());\r
+ \r
+ try {\r
+ inst.ErrorDataReceived += this.ReceivedErrorData;\r
+ inst.OutputDataReceived += this.ReceivedOutputData;\r
+ int exitCode = inst.Install();\r
+ if (exitCode != 0) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "\83C\83\93\83X\83g\81[\83\8b\82ª\90³\8fí\82É\8fI\82¦\82Ä\82¢\82È\82¢\89Â\94\\90«\82ª\82 \82è\82Ü\82·\81B\83C\83\93\83X\83g\81[\83\89\82Ì\8fI\97¹\83R\81[\83h:"+exitCode);\r
+ }\r
+ \r
+ pkgListMan.WriteInstallationLog(inst);\r
+ } catch (Exception e) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, e.Message);\r
+ done = true;\r
+ return;\r
+ }\r
+ currentTaskSetIndex ++;\r
+ \r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, inst.ToString());\r
+ \r
+ if (cancelCalled) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "\83p\83b\83P\81[\83W\82Ì\83C\83\93\83X\83g\81[\83\8b\8f\88\97\9d\82ª\83L\83\83\83\93\83Z\83\8b\82³\82ê\82Ü\82µ\82½");\r
+ done = true;\r
+ return;\r
+ }\r
+ }\r
+ pkgListMan.SaveSystemInstalledLogList(); // \83\8d\83O\82Ì\83R\83~\83b\83g\r
+ \r
+ runLocalUpdate();\r
+ \r
+ done = true;\r
+ \r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED, "\8fI\97¹", 100);\r
+ }\r
+ \r
+ private void runLocalUpdate()\r
+ {\r
+ // \83C\83\93\83X\83g\81[\83\8b\83g\83\8a\83X\83g\82Ì\8dX\90V\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+ pkgListMan.DetectInstalledPkgs();\r
+ pkgListMan.SaveInstalledPackageList();\r
+ currentTaskSetIndex++;\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]);\r
+ \r
+ // \83V\83X\83e\83\80\82É\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ä\82¢\82é\83\8a\83X\83g\82Ì\8dX\90V\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+ pkgListMan.DetectSystemInstalledPkgs();\r
+ pkgListMan.SaveSystemInstalledPackageList();\r
+ currentTaskSetIndex++;\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]);\r
+ }\r
+ \r
+ public override bool Done {\r
+ get { return done; }\r
+ }\r
+ \r
+ public override int CurrentTaskSetIndex {\r
+ get { return currentTaskSetIndex; }\r
+ }\r
+ \r
+ private bool cancelCalled = false;\r
+ \r
+ public override bool Cancel()\r
+ {\r
+ cancelCalled = true;\r
+ if (! packageInstallerDownloaded) {\r
+ return Downloader.Cancel();\r
+ } else return true;\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+\r
+namespace NaGet.SubCommands\r
+{\r
+ public class NaGetEventArgs : EventArgs\r
+ {\r
+ /// <summary>\r
+ /// \83^\83X\83N\82Ì\90i\92»\8fó\8bµ\82Ì\95S\95ª\97¦\95\\8e¦\r
+ /// </summary>\r
+ public float TaskProgressPercent = -1;\r
+ \r
+ /// <summary>\r
+ /// \83^\83X\83N\82Ì\8c»\8bµ\82Ì\83\81\83b\83Z\81[\83W\r
+ /// </summary>\r
+ public string TaskMessage;\r
+ }\r
+ \r
+ public class NaGetTaskCanceledException : Exception\r
+ {\r
+ public NaGetTaskCanceledException(string msg)\r
+ : base(msg)\r
+ {\r
+ }\r
+ \r
+ public NaGetTaskCanceledException(string msg, Exception e)\r
+ : base(msg, e)\r
+ {\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// NaGet\82Ì\83R\83}\83\93\83h\83^\83X\83N\82Ì\8dÅ\8f¬\92P\88Ê\82Ì\90e\83N\83\89\83X\r
+ /// </summary>\r
+ public abstract class NaGetTask\r
+ {\r
+ /// <summary>\r
+ /// \8eÀ\8ds\82·\82é\r
+ /// </summary>\r
+ public abstract void Run();\r
+ \r
+ /// <summary>\r
+ /// \8eÀ\8ds\8fó\91Ô\82©\94Û\82©\82ð\93¾\82é\r
+ /// </summary>\r
+ public abstract bool Running {\r
+ get;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \8fI\97¹\82µ\82Ä\82¢\82é\82©\94Û\82©\81B\r
+ /// </summary>\r
+ public abstract bool Done {\r
+ get;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \83L\83\83\83\93\83Z\83\8b\89Â\94\\82©\94Û\82©\82ð\95Ô\82·\r
+ /// </summary>\r
+ public virtual bool Cancelable {\r
+ get { return false; }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \92\86\92f\82³\82¹\82é\r
+ /// </summary>\r
+ /// <returns>\90¬\8c÷\82µ\82½\82©\82¢\82È\82©</returns>\r
+ public virtual bool Cancel()\r
+ {\r
+ return false;\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+\r
+namespace NaGet.SubCommands\r
+{\r
+ public class NaGetTaskSetEventArgs : NaGetEventArgs\r
+ {\r
+ public NaGetTaskSetEventType Type;\r
+ \r
+ public NaGetTaskSetEventArgs(NaGetTaskSetEventType type, string message, float processPercent)\r
+ {\r
+ this.Type = type;\r
+ this.TaskMessage = message;\r
+ this.TaskProgressPercent = processPercent;\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \83^\83X\83N\82Ì\8eí\97Þ\r
+ /// </summary>\r
+ public enum NaGetTaskSetEventType\r
+ {\r
+ /// <summary>\r
+ /// \8aJ\8en\r
+ /// </summary>\r
+ STARTED,\r
+ /// <summary>\r
+ /// \8a®\97¹\82µ\82½(\82·\82×\82Ä\82ð\8a®\97¹)\r
+ /// </summary>\r
+ COMPLETED,\r
+ /// <summary>\r
+ /// \8dì\8bÆ\82ª\83L\83\83\83\93\83Z\83\8b\82³\82ê\82½\r
+ /// </summary>\r
+ CANCELED,\r
+ /// <summary>\r
+ /// \83G\83\89\81[\82ð\94\90¶\82µ(\92\86\92f\82µ\82½)\r
+ /// </summary>\r
+ ERROR,\r
+ /// <summary>\r
+ /// \83G\83\89\81[\82ª\94\90¶\82µ\82½\82ª\8cp\91±\r
+ /// </summary>\r
+ WARNING,\r
+ /// <summary>\r
+ /// \82»\82Ì\82Ù\82©\82Ì\8fî\95ñ\r
+ /// </summary>\r
+ INFO,\r
+ /// <summary>\r
+ /// \8dì\8bÆ\82ð\8aJ\8en\r
+ /// </summary>\r
+ STARTED_TASKSET,\r
+ /// <summary>\r
+ /// \8dì\8bÆ\82ð\8fI\97¹\r
+ /// </summary>\r
+ COMPLETED_TASKSET\r
+ }\r
+ \r
+ /// <summary>\r
+ /// NaGet\83^\83X\83N\8f\88\97\9d\82Ì\83p\83b\83N\r
+ /// </summary>\r
+ public abstract class NaGetTaskSet : NaGetTask\r
+ {\r
+ /// <summary>\r
+ /// \83^\83X\83N\8f\88\97\9d\82Ì\83C\83x\83\93\83g\83n\83\93\83h\83\89\r
+ /// </summary>\r
+ public event EventHandler<NaGetTaskSetEventArgs> TaskSetRaised;\r
+ \r
+ /// <summary>\r
+ /// \95¶\8e\9a\97ñ\82Å\95\\8c»\82µ\82½\8dì\8bÆ\88ê\97\97\83\8a\83X\83g\r
+ /// </summary>\r
+ public string[] TaskSetNames;\r
+ \r
+ /// <summary>\r
+ /// \8c»\8dÝ\8eÀ\8ds\92\86\82Ì\8dì\8bÆ\94Ô\8d\86\r
+ /// </summary>\r
+ public abstract int CurrentTaskSetIndex {\r
+ get;\r
+ }\r
+ \r
+ protected virtual void RaiseTaskSetEvent(NaGetTaskSetEventType type, string message)\r
+ {\r
+ float percent = (CurrentTaskSetIndex >= 0)? CurrentTaskSetIndex * 100 / TaskSetNames.Length : -1;\r
+ RaiseTaskSetEvent(type, message, percent);\r
+ }\r
+ \r
+ protected virtual void RaiseTaskSetEvent(NaGetTaskSetEventType type, string message, float percent)\r
+ {\r
+ RaiseTaskSetEvent(new NaGetTaskSetEventArgs(type, message, percent));\r
+ }\r
+ \r
+ protected virtual void RaiseTaskSetEvent(NaGetTaskSetEventArgs e)\r
+ {\r
+ if (TaskSetRaised != null) {\r
+ TaskSetRaised(this, e);\r
+ }\r
+ }\r
+ \r
+ protected virtual void ReceivedErrorData(object sender, NaGet.Utils.AnyDataEventArgs<string> e)\r
+ {\r
+ if (! string.IsNullOrEmpty(e.Data)) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, e.Data);\r
+ }\r
+ }\r
+ \r
+ protected virtual void ReceivedOutputData(object sender, NaGet.Utils.AnyDataEventArgs<string> e)\r
+ {\r
+ if (! string.IsNullOrEmpty(e.Data)) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, e.Data);\r
+ }\r
+ }\r
+ \r
+ public override bool Running {\r
+ get { return CurrentTaskSetIndex >= 0 && !Done; }\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using NaGet.Packages.Install;\r
+using NaGet.Packages;\r
+using NaGet.Net;\r
+\r
+namespace NaGet.SubCommands\r
+{\r
+ public class NaGetUninstall : NaGetTaskSet\r
+ {\r
+ private bool done = false;\r
+ \r
+ private int currentTaskSetIndex = -1;\r
+ \r
+ private PackageListsManager pkgListMan;\r
+ \r
+ /// <summary>\r
+ /// \83A\83\93\83C\83\93\83X\83g\81[\83\8b\82·\82é\83p\83b\83P\81[\83W\r
+ /// </summary>\r
+ public Uninstallation[] Uninstallations;\r
+ \r
+ /// <summary>\r
+ /// \83R\83\93\83X\83g\83\89\83N\83^\r
+ /// </summary>\r
+ /// <param name="pkgs">\83A\83\93\83C\83\93\83X\83g\81[\83\8b\82·\82é\83p\83b\83P\81[\83W</param>\r
+ public NaGetUninstall(PackageListsManager pkgMan, InstalledPackage[] pkgs)\r
+ {\r
+ pkgListMan = pkgMan;\r
+ \r
+ Uninstallations = new Uninstallation[pkgs.Length];\r
+ for (int i = 0; i < pkgs.Length; i++) {\r
+ Uninstallations[i] = new Uninstallation(pkgs[i]);\r
+ }\r
+ \r
+ initializeMainTaskSetNames();\r
+ }\r
+ \r
+ /// <summary>\r
+ /// \83R\83\93\83X\83g\83\89\83N\83^\r
+ /// </summary>\r
+ /// <param name="uninstallations">\83A\83\93\83C\83\93\83X\83g\81[\83\8b\8f\88\97\9d\82Ì\94z\97ñ</param>\r
+ public NaGetUninstall(PackageListsManager pkgMan, Uninstallation[] uninstallations)\r
+ {\r
+ pkgListMan = pkgMan;\r
+ \r
+ Uninstallations = uninstallations;\r
+ initializeMainTaskSetNames();\r
+ }\r
+ \r
+ private void initializeMainTaskSetNames()\r
+ {\r
+ System.Collections.Generic.List<string> taskSetNames = new System.Collections.Generic.List<string>();\r
+ \r
+ for (int i =0; i < Uninstallations.Length; i++) {\r
+ taskSetNames.Add(string.Format("\83A\83\93\83C\83\93\83X\83g\81[\83\8b: {0}", Uninstallations[i].ToString()));\r
+ }\r
+ taskSetNames.Add(string.Format("\83\8a\83X\83g\8dX\90V: {0}", NaGet.Env.ArchiveInstalledPackageListFile));\r
+ taskSetNames.Add(string.Format("\83\8a\83X\83g\8dX\90V: {0}", NaGet.Env.SystemInstalledPackageListFile));\r
+ \r
+ TaskSetNames = taskSetNames.ToArray();\r
+ }\r
+ \r
+ public override void Run()\r
+ {\r
+ currentTaskSetIndex ++;\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED, "\83A\83\93\83C\83\93\83X\83g\81[\83\8b\8f\88\97\9d\8aJ\8en");\r
+ \r
+ foreach (Uninstallation uninst in Uninstallations) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, uninst.ToString());\r
+ \r
+ if (uninst.Installed) {\r
+ try {\r
+ uninst.OutputDataReceived += this.ReceivedOutputData;\r
+ uninst.ErrorDataReceived += this.ReceivedErrorData;\r
+ int exitCode = uninst.Uninstall();\r
+ if (exitCode != 0) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "\83A\83\93\83C\83\93\83X\83g\81[\83\8b\82ª\90³\8fí\82É\8fI\82¦\82Ä\82¢\82È\82¢\89Â\94\\90«\82ª\82 \82è\82Ü\82·\81B\83A\83\93\83C\83\93\83X\83g\81[\83\89\82Ì\8fI\97¹\83R\81[\83h:"+exitCode);\r
+ }\r
+ } catch (Exception e) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, e.Message);\r
+ done = true;\r
+ return;\r
+ }\r
+ } else {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, string.Format("{0}\82Í\8aù\82É\83A\83\93\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ä\82¢\82é\82©\81A\83\\83t\83g\82Ì\91¶\8dÝ\82ð\8am\94F\82Å\82«\82Ü\82¹\82ñ\82Å\82µ\82½", uninst));\r
+ }\r
+ \r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, uninst.ToString());\r
+ }\r
+ \r
+ runLocalUpdate();\r
+ \r
+ done = true;\r
+ \r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED, "\8fI\97¹", 100);\r
+ }\r
+ \r
+ private void runLocalUpdate()\r
+ {\r
+ // \83C\83\93\83X\83g\81[\83\8b\83g\83\8a\83X\83g\82Ì\8dX\90V\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+ pkgListMan.DetectInstalledPkgs();\r
+ pkgListMan.SaveInstalledPackageList();\r
+ currentTaskSetIndex++;\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]);\r
+ \r
+ // \83V\83X\83e\83\80\82É\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ä\82¢\82é\83\8a\83X\83g\82Ì\8dX\90V\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+ pkgListMan.DetectSystemInstalledPkgs();\r
+ pkgListMan.SaveSystemInstalledPackageList();\r
+ currentTaskSetIndex++;\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]);\r
+ }\r
+ \r
+ public override bool Done {\r
+ get { return done; }\r
+ }\r
+ \r
+ public override int CurrentTaskSetIndex {\r
+ get { return currentTaskSetIndex; }\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.IO;\r
+using NaGet.Packages;\r
+using NaGet.Packages.Install;\r
+using NaGet.Net;\r
+using NaGet.SubCommands;\r
+\r
+namespace NaGet.SubCommands\r
+{\r
+ public class NaGetUpdate : NaGetTaskSet\r
+ {\r
+ private ProviderList providerList;\r
+ \r
+ private PackageListsManager pkgListMan;\r
+ \r
+ private bool downloadPackageLists = false;\r
+ \r
+ private bool packageListsDownloaded = true;\r
+ \r
+ public Downloader Downloader; // TODO 参照をしてセットするように\r
+ \r
+ private int currentTaskSetIndex = -1;\r
+ \r
+ private bool done = false;\r
+ \r
+ public override int CurrentTaskSetIndex {\r
+ get { return currentTaskSetIndex; }\r
+ }\r
+ \r
+ public override bool Cancelable {\r
+ get { return ! packageListsDownloaded; }\r
+ }\r
+ \r
+ public NaGetUpdate(PackageListsManager pkgListMan)\r
+ : this(pkgListMan, true)\r
+ {\r
+ }\r
+ \r
+ public NaGetUpdate(PackageListsManager pkgMan, bool downloadPackageListsFlag)\r
+ {\r
+ pkgListMan = pkgMan;\r
+ downloadPackageLists = downloadPackageListsFlag;\r
+ \r
+ System.Collections.Generic.List<string> taskSetNames = new System.Collections.Generic.List<string>();\r
+ if (downloadPackageLists) {\r
+ providerList = new ProviderList(NaGet.Env.ProviderListFile);\r
+ \r
+ foreach (string url in providerList.Urls) {\r
+ taskSetNames.Add(string.Format("リスト取得: {0}", url));\r
+ }\r
+ taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.PackageListFile));\r
+ }\r
+ taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.ArchiveInstalledPackageListFile));\r
+ taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.SystemInstalledPackageListFile));\r
+ \r
+ TaskSetNames = taskSetNames.ToArray();\r
+ }\r
+\r
+ public override void Run()\r
+ {\r
+ currentTaskSetIndex ++;\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED, "リスト更新処理開始");\r
+ \r
+ try {\r
+ // リストのダウンロード\r
+ if (downloadPackageLists) {\r
+ packageListsDownloaded = false;\r
+ try {\r
+ runDownloadPackages();\r
+ } catch (NaGetTaskCanceledException) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "リストのダウンロード処理がキャンセルされました");\r
+ } catch (System.Net.WebException e) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, e.Message);\r
+ if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "ネットワークに接続されていません。");\r
+ } else {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "ネットワークに接続できませんでした。ネットワークが切断されているか、ファイアウォールによって遮断された可能性があります。");\r
+ }\r
+ } finally {\r
+ currentTaskSetIndex = providerList.Urls.Length + 1;\r
+ }\r
+ packageListsDownloaded = true;\r
+ }\r
+ \r
+ runLocalUpdate();\r
+ } finally {\r
+ done = true;\r
+ }\r
+ \r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED, "終了", 100);\r
+ }\r
+ \r
+ private void runDownloadPackages()\r
+ {\r
+ PackageList<Package> avaiablePackageList = new PackageList<Package>();\r
+ foreach(string provider in providerList.Urls) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+ \r
+ string tmpfileName = Path.GetTempFileName();\r
+ try {\r
+ Downloader.Download(provider, tmpfileName);\r
+ \r
+ avaiablePackageList.AddPackages(NaGet.Utils.GetDeserializedObject<PackageList<Package>>(tmpfileName).Packages);\r
+ } finally {\r
+ if (File.Exists(tmpfileName)) {\r
+ File.Delete(tmpfileName);\r
+ }\r
+ }\r
+ \r
+ currentTaskSetIndex ++;\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]);\r
+ }\r
+ \r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+ pkgListMan.availablePkgList = avaiablePackageList; // Mediatorのリストを更新\r
+ pkgListMan.SaveAvailablePackageList();\r
+ currentTaskSetIndex ++;\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]);\r
+ }\r
+ \r
+ private void runLocalUpdate()\r
+ {\r
+ // インストールトリストの更新\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+ pkgListMan.DetectInstalledPkgs();\r
+ pkgListMan.SaveInstalledPackageList();\r
+ currentTaskSetIndex++;\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]);\r
+ \r
+ // システムにインストールされているリストの更新\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+ pkgListMan.DetectSystemInstalledPkgs();\r
+ pkgListMan.SaveSystemInstalledPackageList();\r
+ currentTaskSetIndex++;\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]);\r
+ }\r
+ \r
+ public override bool Cancel()\r
+ {\r
+ return Downloader.Cancel();\r
+ }\r
+\r
+ public override bool Done {\r
+ get { return done; }\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.IO;\r
+\r
+namespace NaGet\r
+{\r
+ /// <summary>\r
+ /// 環境変数などを取り扱うクラス\r
+ /// </summary>\r
+ public sealed class Env\r
+ {\r
+ /// <summary>\r
+ /// 呼び出し禁止\r
+ /// </summary>\r
+ private Env()\r
+ {\r
+ }\r
+\r
+ \r
+ /// <summary> \r
+ /// ファイルリスト提供サーバのリストファイル \r
+ /// </summary>\r
+ public static readonly string ProviderListFile = "provider.list.txt";\r
+\r
+ /// <summary>\r
+ /// パッケージリスト(キャッシュ)置き場のパス\r
+ /// </summary>\r
+ public static readonly string PackageListFile = "packages.list.xml";\r
+\r
+ /// <summary>\r
+ /// 本ソフトウェアを介してインストールされたパッケージのリストファイル\r
+ /// </summary>\r
+ public static readonly string ArchiveInstalledPackageListFile = "packages.envinstalled.xml";\r
+\r
+ /// <summary>\r
+ /// システムから検出されたパッケージのリストファイル\r
+ /// </summary>\r
+ public static readonly string SystemInstalledPackageListFile = "packages.sysinstalled.xml";\r
+ \r
+ /// <summary>\r
+ /// インストールログファイル\r
+ /// </summary>\r
+ public static readonly string SystemInstalledPackageLogFile = "packages.sysinstalled.log.xml";\r
+ \r
+ private static string appDataFolderPath = null;\r
+ \r
+ /// <summary>\r
+ /// アプリケーションデータを保存するフォルダのパス\r
+ /// </summary>\r
+ public static string AppDataFolderPath\r
+ {\r
+ get {\r
+ if (appDataFolderPath == null) {\r
+// string progFiles = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);\r
+// if (Path.GetDirectoryName(Environment.CurrentDirectory) == progFiles) {\r
+// string appData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);\r
+// return Path.Combine(appData, "AppliStation");\r
+// } else {\r
+ return Environment.CurrentDirectory;\r
+// }\r
+ } else {\r
+ return appDataFolderPath;\r
+ }\r
+ }\r
+ set { appDataFolderPath = value; }\r
+ }\r
+\r
+ /// <summary>\r
+ /// インストーラの一時置き場の親ディレクトリ\r
+ /// </summary>\r
+ public static string ArchiveFolderPath\r
+ {\r
+ get { return Path.Combine(AppDataFolderPath, "Cache"); }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// アーカイバ方式のパッケージのインストール先フォルダ\r
+ /// </summary>\r
+ public static string ArchiveProgramFiles {\r
+ get {\r
+ return Path.Combine(AppDataFolderPath, "progs");\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// アーカイバ方式のパッケージのプログラムグループフォルダ\r
+ /// </summary>\r
+ public static string ArchiveProgramGroup {\r
+ get {\r
+ return Path.Combine(AppDataFolderPath, "programs");\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// アーカイバ方式のパッケージのSystem32のフォルダ\r
+ /// </summary>\r
+ public static string ArchiveSystem32 {\r
+ get {\r
+ return Path.Combine(ArchiveProgramFiles, ".system32");\r
+ }\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.IO;\r
+using System.Text;\r
+using System.Globalization;\r
+using System.Security.Principal;\r
+using System.Reflection;\r
+using System.Diagnostics;\r
+using Microsoft.Win32;\r
+\r
+namespace NaGet\r
+{\r
+\r
+ /// <summary>\r
+ /// 雑多な便利メソッドを集めたクラス\r
+ /// </summary>\r
+ public sealed class Utils\r
+ {\r
+ /// <summary>\r
+ /// 呼び出し禁止\r
+ /// </summary>\r
+ private Utils()\r
+ {\r
+ }\r
+ \r
+ /// <summary>\r
+ /// オブジェクトのフィールドをコピーしてクローン化する\r
+ /// </summary>\r
+ /// <param name="from">コピー元</param>\r
+ /// <param name="target">コピー先。コピー元のクラスと同一か継承している型でなければならない</param>\r
+ public static void FieldCopy<T,U>(T from, ref U target) where U : T\r
+ {\r
+ foreach(FieldInfo member in typeof(T).GetFields()) {\r
+ try {\r
+ member.SetValue(target, member.GetValue(from));\r
+ } catch (FieldAccessException) {} // アクセス不能は無視\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// パス変数に指定のフォルダを追加する\r
+ /// </summary>\r
+ /// <param name="dir">追加するフォルダ</param>\r
+ public static void AddDirectoryToPath(string dir)\r
+ {\r
+ string path = Environment.GetEnvironmentVariable("PATH");\r
+ \r
+ if (path.IndexOf(dir) < 0) {\r
+ path = dir + Path.PathSeparator + path;\r
+ Environment.SetEnvironmentVariable("PATH", path);\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// バイト単位で表現された容量を接尾語を活用して適切な文字列に変換\r
+ /// </summary>\r
+ /// <param name="bytes">バイト単位の容量</param>\r
+ /// <returns>読みやすい形に直された容量文字列</returns>\r
+ public static string FormatSize(double bytes)\r
+ {\r
+ string[] units = new string[] {"B", "KB", "MB", "GB", "TB"};\r
+ \r
+ double size = bytes;\r
+ int i;\r
+ for (i = 0; size >= 1024 && i < units.Length-1 ; i++) {\r
+ size /= 1024.0;\r
+ }\r
+ \r
+ return string.Format("{0:F2}{1}", size, units[i]);\r
+ }\r
+ \r
+ public static string FormatSize(long bytes)\r
+ {\r
+ return FormatSize((double) bytes);\r
+ }\r
+ \r
+ #region ファイル操作関数群\r
+ \r
+ /// <summary>\r
+ /// URLからそのファイル名を生成する\r
+ /// </summary>\r
+ /// <param name="url">対象のurl</param>\r
+ public static string Url2filename(string url)\r
+ {\r
+ string filename = Path.GetFileName(UrlDecode(url, Encoding.UTF8));\r
+ \r
+ int pos;\r
+ if ((pos = filename.IndexOfAny(Path.GetInvalidFileNameChars())) >= 0) {\r
+ // 不正な文字が含まれているならば、それ以降を削除\r
+ filename = filename.Substring(0, pos);\r
+ // そうしてしまったら文字の内容がまったくなくなってしまったら、ランダムな名に\r
+ if (filename.Length == 0) {\r
+ filename = Path.GetFileName(Path.GetTempFileName());\r
+ }\r
+ }\r
+ return filename;\r
+ //return UrlDecode(Path.GetFileName(url), Encoding.UTF8);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// URLのデコードを行う\r
+ /// </summary>\r
+ /// <param name="s">対象のurl文字列</param>\r
+ /// <param name="e">デコードの処理に使う文字コード</param>\r
+ public static string UrlDecode(string s, Encoding e)\r
+ {\r
+ // mono の System.Net.HttpUtility より作成\r
+ \r
+ if (null == s)\r
+ return null;\r
+\r
+ if (s.IndexOf ('%') == -1 && s.IndexOf ('+') == -1)\r
+ return s;\r
+\r
+ if (e == null)\r
+ e = Encoding.GetEncoding (28591);\r
+\r
+ StringBuilder output = new StringBuilder ();\r
+ long len = s.Length;\r
+ NumberStyles hexa = NumberStyles.HexNumber;\r
+ MemoryStream bytes = new MemoryStream ();\r
+\r
+ for (int i = 0; i < len; i++) {\r
+ if (s [i] == '%' && i + 2 < len) {\r
+ if (s [i + 1] == 'u' && i + 5 < len) {\r
+ if (bytes.Length > 0) {\r
+ //output.Append (GetChars (bytes, e));\r
+ output.Append(e.GetChars(bytes.GetBuffer(), 0, (int) bytes.Length));\r
+ bytes.SetLength (0);\r
+ }\r
+ \r
+ output.Append ((char) int.Parse(s.Substring (i + 2, 4), hexa));\r
+ i += 5;\r
+ } else {\r
+ bytes.WriteByte ((byte) int.Parse(s.Substring (i + 1, 2), hexa));\r
+ i += 2;\r
+ }\r
+ continue;\r
+ }\r
+\r
+ if (bytes.Length > 0) {\r
+ //output.Append (GetChars (bytes, e));\r
+ output.Append(e.GetChars(bytes.GetBuffer(), 0, (int) bytes.Length));\r
+ bytes.SetLength (0);\r
+ }\r
+\r
+ if (s [i] == '+') {\r
+ output.Append (' ');\r
+ } else {\r
+ output.Append (s [i]);\r
+ }\r
+ }\r
+\r
+ if (bytes.Length > 0) {\r
+ //output.Append (GetChars (bytes, e));\r
+ output.Append(e.GetChars(bytes.GetBuffer(), 0, (int) bytes.Length));\r
+ }\r
+\r
+ bytes = null;\r
+ return output.ToString ();\r
+ }\r
+ \r
+ /// <summary>\r
+ /// ファイルパスから、指定のパスセパレータの意味でファイル名を取り出す。\r
+ /// </summary>\r
+ /// <param name="filepath">ファイルパス(またはURLパス)</param>\r
+ /// <param name="separator">パスセパレータ</param>\r
+ public static string Basedir(string filepath, char separator)\r
+ {\r
+ int dirSep = filepath.LastIndexOf(separator);\r
+ if (dirSep < 0) return "";\r
+\r
+ return filepath.Substring(0, dirSep);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// 再帰的にファイルの属性を指定します。強制的にフォルダの再帰削除の前に読み込み専用属性を消すのに使います。\r
+ /// </summary>\r
+ /// <param name="path">設定するフォルダ</param>\r
+ /// <param name="attr">設定する属性値</param>\r
+ public static void SetAttributeRecursive(string path, FileAttributes attr)\r
+ {\r
+ // 自分自身の属性を変更\r
+ File.SetAttributes(path, attr);\r
+ \r
+ // 子ファイルの属性変更\r
+ foreach (string file in Directory.GetFiles(path)) {\r
+ File.SetAttributes(file, attr);\r
+ }\r
+ \r
+ // 子フォルダを再帰的に属性変更\r
+ foreach (string file in Directory.GetDirectories(path)) {\r
+ SetAttributeRecursive(file, attr);\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// ファイルまたはフォルダの容量を算出して返す\r
+ /// </summary>\r
+ /// <param name="path">\r
+ /// 対象ファイル及びフォルダのパス\r
+ /// </param>\r
+ /// <returns>\r
+ /// 計算された容量(バイト単位)\r
+ /// </returns>\r
+ public static ulong GetFileSize(string path)\r
+ {\r
+ return ((File.GetAttributes(path) & FileAttributes.Directory) != 0)?\r
+ GetDirectoryFileSize(new DirectoryInfo(path)) : ((ulong) (new FileInfo(path)).Length);\r
+ }\r
+ \r
+ /// <summary>\r
+ /// フォルダの容量を算出して返す\r
+ /// </summary>\r
+ /// <param name="dirInfo">\r
+ /// 対象フォルダ\r
+ /// </param>\r
+ /// <returns>\r
+ /// 計算された容量(バイト単位)\r
+ /// </returns>\r
+ public static ulong GetDirectoryFileSize(DirectoryInfo dirInfo)\r
+ {\r
+ ulong size = 0;\r
+ foreach (FileInfo child in dirInfo.GetFiles("*", SearchOption.AllDirectories)) {\r
+ size += (ulong) child.Length;\r
+ }\r
+ return size;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// ワイルドカードを展開したファイルパス文字列を作り出す。\r
+ /// 戻り値のそれぞれの文字列はフルパスとなる。\r
+ /// </summary>\r
+ /// <param name="baseDir">ベース(基点)のディレクトリ</param>\r
+ /// <param name="pattern">ワイルドカードパターン</param>\r
+ /// <returns>展開したファイルパス</returns>\r
+ public static string[] ExtendWildcardFile(string baseDir, string pattern)\r
+ {\r
+ if (pattern.IndexOfAny(new char[]{'*','?'}) < 0) {\r
+ return new string[]{Path.Combine(baseDir, pattern)}; // ワイルドカードがなければそのまま返す\r
+ }\r
+\r
+ string[] pathArray = pattern.Split(Path.DirectorySeparatorChar);\r
+ System.Collections.Generic.List<string> extended = new System.Collections.Generic.List<string>();\r
+ try {\r
+ if (pathArray.Length == 1) {\r
+ extended.AddRange(Directory.GetFiles(baseDir, pathArray[0], SearchOption.TopDirectoryOnly));\r
+ extended.AddRange(Directory.GetDirectories(baseDir, pathArray[0], SearchOption.TopDirectoryOnly));\r
+ } else { // pathArray.Length > 1\r
+ string subPattern = string.Join(Path.DirectorySeparatorChar.ToString(), pathArray, 1, pathArray.Length-1);\r
+ \r
+ foreach (string subDir in Directory.GetDirectories(baseDir, pathArray[0], SearchOption.TopDirectoryOnly)) {\r
+ // 再帰的に追加してゆく\r
+ extended.AddRange(ExtendWildcardFile(subDir, subPattern));\r
+ }\r
+ }\r
+ } catch (UnauthorizedAccessException) {\r
+ }\r
+ \r
+ // 存在しないパスは消去する\r
+ extended.RemoveAll(\r
+ delegate(string path) {\r
+ return ! File.Exists(path);\r
+ }\r
+ );\r
+ \r
+ return extended.ToArray();\r
+ }\r
+ \r
+ /// <summary>\r
+ /// パスをパス区切り文字列ごとに分割した配列を返す\r
+ /// </summary>\r
+ /// <param name="path">パス文字列。相対・絶対は区別しない</param>\r
+ /// <returns>フォルダ名ごとに分けられた文字列配列</returns>\r
+ private static string[] splitPath(string path)\r
+ {\r
+ return path.Split(new char[]{Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar});\r
+ }\r
+ \r
+ /// <summary>\r
+ /// Converts a given absolute path and a given base path to a path that leads\r
+ /// from the base path to the absoulte path. (as a relative path)\r
+ /// </summary>\r
+ public static string GetRelativePath(string baseDirectoryPath, string absPath)\r
+ {\r
+ // TODO SharpDevelopのICSharpCode.Core.FileUtilityからのコピペ(GPL)\r
+ \r
+ string[] bPath = splitPath(baseDirectoryPath);\r
+ string[] aPath = splitPath(absPath);\r
+ int indx = 0;\r
+ for(; indx < Math.Min(bPath.Length, aPath.Length); ++indx){\r
+ if(!bPath[indx].Equals(aPath[indx], StringComparison.OrdinalIgnoreCase))\r
+ break;\r
+ }\r
+\r
+ if (indx == 0) {\r
+ return absPath;\r
+ }\r
+\r
+ StringBuilder erg = new StringBuilder();\r
+\r
+ if(indx == bPath.Length) {\r
+// erg.Append('.');\r
+// erg.Append(Path.DirectorySeparatorChar);\r
+ } else {\r
+ for (int i = indx; i < bPath.Length; ++i) {\r
+ erg.Append("..");\r
+ erg.Append(Path.DirectorySeparatorChar);\r
+ }\r
+ }\r
+ erg.Append(String.Join(Path.DirectorySeparatorChar.ToString(), aPath, indx, aPath.Length-indx));\r
+ return erg.ToString();\r
+ }\r
+ \r
+ /// <summary>\r
+ /// 相対パスに含まれている".."などを消去する\r
+ /// </summary>\r
+ /// <param name="aPath"></param>\r
+ /// <returns></returns>\r
+ public static string GetDotsRemovedPath(string aPath)\r
+ {\r
+ string[] folders = splitPath(aPath);\r
+ System.Collections.Generic.List<string> newFolders = new System.Collections.Generic.List<string>();\r
+ \r
+ foreach (string fol in folders) {\r
+ if (fol == ".") {\r
+ // 無視\r
+ } else if (fol == "..") {\r
+ // 一つ前のフォルダを消す\r
+ newFolders.RemoveAt(newFolders.Count-1);\r
+ } else {\r
+ newFolders.Add(fol);\r
+ }\r
+ }\r
+ \r
+ return string.Join(Path.DirectorySeparatorChar.ToString(), newFolders.ToArray());\r
+ }\r
+ \r
+ #endregion\r
+ \r
+ #region XmlSerializer便利メソッド群\r
+ \r
+ public static T GetDeserializedObject<T>(string path)\r
+ {\r
+ T retVal = default(T);\r
+ using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) {\r
+ System.Xml.Serialization.XmlSerializer sr = new System.Xml.Serialization.XmlSerializer(typeof(T));\r
+ retVal = (T) sr.Deserialize(fs);\r
+ }\r
+ return retVal;\r
+ }\r
+ \r
+ public static void PutSerializeObject<T>(string path, T obj)\r
+ {\r
+ using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write)) {\r
+ System.Xml.Serialization.XmlSerializer sr = new System.Xml.Serialization.XmlSerializer(typeof(T));\r
+ sr.Serialize(fs, obj);\r
+ }\r
+ }\r
+ \r
+ #endregion\r
+ \r
+ #region 権限関連関数群\r
+ \r
+ /// <summary>\r
+ /// 現在のユーザがAdministrators権限を持っているか否かを返す\r
+ /// </summary>\r
+ public static bool IsAdministrators()\r
+ {\r
+ // TODO UAC はどうするんだ!!!!\r
+ \r
+ // 現在の Windows ユーザーを現在のスレッドのプリンシパルに反映する\r
+ AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal );\r
+ IPrincipal prin = System.Threading.Thread.CurrentPrincipal;\r
+ return prin.IsInRole(@"BUILTIN\Administrators");\r
+ }\r
+ \r
+ /// <summary>\r
+ /// 現在のPCがUACが有効になっているか否かを返す。\r
+ /// レジストリのHKLM\SOFTWARE¥Microsoft¥Windows¥CurrentVersion¥Policies¥System\EnableLUAの値を見る。\r
+ /// </summary>\r
+ /// <returns>UACが有効ならばtrue</returns>\r
+ public static bool IsUACEnabled()\r
+ {\r
+ try {\r
+ using(RegistryKey key = Registry.LocalMachine.CreateSubKey(@"SOFTWARE¥Microsoft¥Windows¥CurrentVersion¥Policies¥System")) {\r
+ return ((int) key.GetValue("EnableLUA", 0)) == 1;\r
+ }\r
+ } catch (Exception) {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ #endregion\r
+\r
+ #region プロセス関連便利メソッド群\r
+ \r
+ /// <summary>\r
+ /// プロセスに出力をリダイレクトした上で実行\r
+ /// </summary>\r
+ /// <param name="procInfo">プロセス起動情報</param>\r
+ /// <param name="outputReceived">標準出力用リスナ(null可)</param>\r
+ /// <param name="errorReceived">エラー出力用リスナ(null可)</param>\r
+ /// <returns>実行プロセス</returns>\r
+ public static Process ProcessStartWithOutputCapture(ProcessStartInfo procInfo,\r
+ DataReceivedEventHandler outputReceived,\r
+ DataReceivedEventHandler errorReceived)\r
+ {\r
+ if (outputReceived != null) {\r
+ procInfo.RedirectStandardOutput = true;\r
+ }\r
+ if (errorReceived != null) {\r
+ procInfo.RedirectStandardError = true;\r
+ }\r
+ procInfo.UseShellExecute = false;\r
+ \r
+ Process hProcess = Process.Start(procInfo);\r
+ if (outputReceived != null) {\r
+ hProcess.OutputDataReceived += outputReceived;\r
+ hProcess.BeginOutputReadLine();\r
+ }\r
+ if (errorReceived != null) {\r
+ hProcess.ErrorDataReceived += errorReceived; \r
+ hProcess.BeginErrorReadLine();\r
+ }\r
+ \r
+ return hProcess;\r
+ }\r
+ \r
+ \r
+ /// <summary>\r
+ /// プロセスに出力をリダイレクトした上で実行\r
+ /// </summary>\r
+ /// <param name="procInfo">プロセス起動情報</param>\r
+ /// <param name="outputReceived">標準出力用リスナ(null可)</param>\r
+ /// <param name="errorReceived">エラー出力用リスナ(null可)</param>\r
+ /// <returns>実行プロセス</returns>\r
+ public static Process ProcessStartWithOutputCapture(ProcessStartInfo procInfo,\r
+ EventHandler<AnyDataEventArgs<string>> outputReceived,\r
+ EventHandler<AnyDataEventArgs<string>> errorReceived)\r
+ {\r
+ return ProcessStartWithOutputCapture(procInfo,\r
+ ConvertToDataReceivedEventHandler(outputReceived),\r
+ ConvertToDataReceivedEventHandler(errorReceived));\r
+ }\r
+ \r
+ public static DataReceivedEventHandler ConvertToDataReceivedEventHandler(EventHandler<AnyDataEventArgs<string>> handler)\r
+ {\r
+ if (handler == null) return null;\r
+ return delegate (object sender, DataReceivedEventArgs e) {\r
+ AnyDataEventArgs<string> args = new AnyDataEventArgs<string>(e.Data);\r
+ handler.Invoke(sender, args);\r
+ };\r
+ }\r
+ \r
+ #endregion\r
+\r
+ \r
+ /// <summary>\r
+ /// 任意データのイベント情報を表現するクラス\r
+ /// </summary>\r
+ public class AnyDataEventArgs<T> : EventArgs\r
+ {\r
+ /// <summary>\r
+ /// データ\r
+ /// </summary>\r
+ T data;\r
+ \r
+ public AnyDataEventArgs(T data)\r
+ {\r
+ this.data = data;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// データを返す\r
+ /// </summary>\r
+ public T Data {\r
+ get { return data; }\r
+ }\r
+ }\r
+ }\r
+}\r
--- /dev/null
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <PropertyGroup>\r
+ <ProjectGuid>{058E953D-3986-4F74-8516-5A50D267D36A}</ProjectGuid>\r
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>\r
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>\r
+ <OutputType>Library</OutputType>\r
+ <RootNamespace>na_get_lib</RootNamespace>\r
+ <AssemblyName>na-get-lib</AssemblyName>\r
+ <BaseIntermediateOutputPath>bin/</BaseIntermediateOutputPath>\r
+ <AllowUnsafeBlocks>False</AllowUnsafeBlocks>\r
+ <NoStdLib>False</NoStdLib>\r
+ <WarningLevel>4</WarningLevel>\r
+ <TreatWarningsAsErrors>false</TreatWarningsAsErrors>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">\r
+ <OutputPath>bin\Debug\</OutputPath>\r
+ <DebugSymbols>true</DebugSymbols>\r
+ <DebugType>Full</DebugType>\r
+ <Optimize>false</Optimize>\r
+ <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>\r
+ <DefineConstants>DEBUG;TRACE</DefineConstants>\r
+ <OutputType>Library</OutputType>\r
+ <AssemblyName>na-get-lib</AssemblyName>\r
+ <RootNamespace>na_get_lib</RootNamespace>\r
+ <AllowUnsafeBlocks>false</AllowUnsafeBlocks>\r
+ <WarningLevel>4</WarningLevel>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">\r
+ <OutputPath>bin\Release\</OutputPath>\r
+ <DebugSymbols>false</DebugSymbols>\r
+ <DebugType>None</DebugType>\r
+ <Optimize>true</Optimize>\r
+ <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>\r
+ <DefineConstants>TRACE</DefineConstants>\r
+ <OutputType>Library</OutputType>\r
+ <AssemblyName>na-get-lib</AssemblyName>\r
+ <RootNamespace>na_get_lib</RootNamespace>\r
+ <AllowUnsafeBlocks>false</AllowUnsafeBlocks>\r
+ <WarningLevel>4</WarningLevel>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">\r
+ <RegisterForComInterop>False</RegisterForComInterop>\r
+ <GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>\r
+ <BaseAddress>4194304</BaseAddress>\r
+ <PlatformTarget>AnyCPU</PlatformTarget>\r
+ <FileAlignment>4096</FileAlignment>\r
+ </PropertyGroup>\r
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />\r
+ <ItemGroup>\r
+ <Reference Include="System" />\r
+ <Reference Include="System.Xml" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <Compile Include="AssemblyInfo.cs" />\r
+ <Compile Include="NaGet.InteropServices\CommonArchiverExtracter.cs" />\r
+ <Compile Include="NaGet.InteropServices\CreateProcessCaller.cs" />\r
+ <Compile Include="NaGet.InteropServices\DllAccess.cs" />\r
+ <Compile Include="NaGet.InteropServices\PEFileInfoUtils.cs" />\r
+ <Compile Include="NaGet.InteropServices\ShellLink.cs" />\r
+ <Compile Include="NaGet.Packages.Install\InstallationLog.cs" />\r
+ <Compile Include="NaGet.Packages\PackageListsManager.cs" />\r
+ <Compile Include="NaGet.Packages\VersionComparetor.cs" />\r
+ <Compile Include="NaGet.SubCommands\NaGetInstall.cs" />\r
+ <Compile Include="NaGet.SubCommands\NaGetTask.cs" />\r
+ <Compile Include="NaGet.SubCommands\NaGetTaskSet.cs" />\r
+ <Compile Include="NaGet.SubCommands\NaGetUninstall.cs" />\r
+ <Compile Include="NaGet\Env.cs" />\r
+ <Compile Include="NaGet\Utils.cs" />\r
+ <Compile Include="NaGet.Net\Downloader.cs" />\r
+ <Compile Include="NaGet.Packages\HashValue.cs" />\r
+ <Compile Include="NaGet.Packages\Package.cs" />\r
+ <Compile Include="NaGet.Packages\Platform.cs" />\r
+ <Compile Include="NaGet.Packages\PackageList.cs" />\r
+ <Compile Include="NaGet.Packages\ProviderList.cs" />\r
+ <Compile Include="NaGet.Packages.Install\Installation.cs" />\r
+ <Compile Include="NaGet.Packages.Install\RegistriedUninstallers.cs" />\r
+ <Compile Include="NaGet.Packages.Install\Uninstallation.cs" />\r
+ <Compile Include="NaGet.Packages.Install\UninstallInformation.cs" />\r
+ <Compile Include="NaGet.Packages.Install\InstalledPackage.cs" />\r
+ <Compile Include="NaGet.SubCommands\NaGetUpdate.cs" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <Folder Include="NaGet.InteropServices" />\r
+ <Folder Include="NaGet.SubCommands" />\r
+ </ItemGroup>\r
+</Project>
\ No newline at end of file
--- /dev/null
+http://diffshare.tv/AppliStationNetwork/softlist.xml\r