} catch (FileNotFoundException) {\r
ico = null;\r
}\r
- } else if (pkg.Type == InstallerType.ARCHIVE) {\r
+ } else if ((pkg.Type == InstallerType.ARCHIVE)\r
+ ||(pkg.Type == InstallerType.ITSELF)) {\r
string progGrp = Path.Combine(NaGet.Env.ArchiveProgramGroup, pkg.Name);\r
if (Directory.Exists(progGrp)) {\r
string[] lnkFiles = Directory.GetFiles(progGrp, "*.lnk");\r
UninstallInformation uninstInfo = ((InstalledPackage) pkg).UninstallInfo;\r
\r
string instPath = null;\r
- if (pkg.Type == InstallerType.ARCHIVE) {\r
+ if ((pkg.Type == InstallerType.ARCHIVE)\r
+ ||(pkg.Type == InstallerType.ITSELF)) {\r
instPath = Path.Combine(NaGet.Env.ArchiveProgramFiles, pkg.Name);\r
} else if (Directory.Exists(uninstInfo.InstallLocation)) {\r
instPath = uninstInfo.InstallLocation;\r
case InstallerType.MSI_PACKAGE:\r
typeValueLabel.Text = "MSIファイル形式";\r
break;\r
+ case InstallerType.ITSELF:\r
+ typeValueLabel.Text = "単体の実行ファイル";\r
+ break;\r
default:\r
typeValueLabel.Text = "不明なインストール形式(インストール不能)";\r
break;\r
void OpenInstalledDirectoryStripMenuItemClick(object sender, EventArgs e)\r
{\r
foreach (InstalledPackage pkg in GetSelectedPackages<InstalledPackage>()) {\r
- if (pkg.Type == InstallerType.ARCHIVE) {\r
+ if (pkg.Type == InstallerType.ARCHIVE || pkg.Type == InstallerType.ITSELF) {\r
System.Diagnostics.Process.Start(Path.Combine(NaGet.Env.ArchiveProgramFiles, pkg.Name));\r
} else if (Directory.Exists(pkg.discoverInstalledLocation())) {\r
System.Diagnostics.Process.Start(pkg.discoverInstalledLocation());\r
webOfficialToolStripMenuItem.Enabled = ! (pkg.Url == null || string.IsNullOrEmpty(pkg.Url.Href));\r
// webGoogleSearchToolStripMenuItem always active.\r
\r
- bool installedDirectoryStripMenuItemVisible = isInstalledPackage &&\r
- ( (pkg.Type == InstallerType.ARCHIVE) || Directory.Exists(((InstalledPackage) pkg).discoverInstalledLocation()) );\r
- installedDirectoryStripMenuItem.Visible = installedDirectoryStripMenuItemVisible;\r
- if (installedDirectoryStripMenuItemVisible) {\r
- buildInstalledDirectoryMenuItemStripChildren((InstalledPackage) pkg);\r
+ if (isInstalledPackage) {\r
+ bool installedDirectoryStripMenuItemVisible = \r
+ (pkg.Type == InstallerType.ARCHIVE) ||\r
+ (pkg.Type == InstallerType.ITSELF) ||\r
+ Directory.Exists(((InstalledPackage) pkg).discoverInstalledLocation());\r
+ \r
+ installedDirectoryStripMenuItem.Visible = installedDirectoryStripMenuItemVisible;\r
+ if (installedDirectoryStripMenuItemVisible) {\r
+ buildInstalledDirectoryMenuItemStripChildren((InstalledPackage) pkg);\r
+ }\r
}\r
}\r
\r
return false; \r
}\r
\r
- return (uninstallPackage.Type != InstallerType.ARCHIVE);\r
+ return (uninstallPackage.Type != InstallerType.ARCHIVE)\r
+ && (uninstallPackage.Type != InstallerType.ITSELF);\r
}\r
\r
void RunasCheckBoxCheckedChanged(object sender, EventArgs e)\r
string targetDir = null;\r
Package package = null;\r
\r
+ // 引数パースおよびヘルプ表示\r
try {\r
parseMainArguments(args, out arcFile, out targetDir, out package);\r
} catch (ArgumentException) {\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
+\r
+ // インストールおよび展開処理\r
+ if (arcFile != null) {\r
+ string tempExtractDir = targetDir + "___temp___"; // HACK\r
Directory.CreateDirectory(tempExtractDir);\r
\r
try {\r
- extract(arcFile, tempExtractDir);\r
+ // STEP1. 書庫の展開\r
+ if (package != null && package.Type == InstallerType.ITSELF) {\r
+ // 書庫でない場合展開せずにそのままコピーする\r
+ string destFile = Path.Combine(tempExtractDir, Path.GetFileName(arcFile));\r
+ File.Copy(arcFile, destFile);\r
+ } else {\r
+ extract(arcFile, tempExtractDir);\r
+ }\r
\r
+ // STEP2. インストール\r
install(tempExtractDir, targetDir);\r
\r
if (package != null) {\r
+ // STEP3. カスタマイズ可能な後処理\r
postInstall(targetDir, package);\r
\r
+ // STEP4. パッケージ情報をインストール先(targetDir)に置く\r
storeInstalledFileList(targetDir);\r
storePackageXml(package, targetDir);\r
}\r
public bool InstallSuccessed {\r
get {\r
switch (InstalledPackage.Type) {\r
- case InstallerType.ARCHIVE: // アーカイブインストーラはフォルダの確認\r
+ case InstallerType.ARCHIVE:\r
+ case InstallerType.ITSELF:\r
+ // アーカイブインストーラおよび配布exeそれ自身が実行ファイルのとき、\r
+ // (AppliStationの作る)プログラムフォルダの存在のみで確認を行う。\r
return Directory.Exists(Path.Combine(NaGet.Env.ArchiveProgramFiles, InstalledPackage.Name));\r
case InstallerType.EXEC_INSTALLER:\r
case InstallerType.MSI_PACKAGE:\r
get {\r
switch (InstalledPackage.Type) {\r
case InstallerType.ARCHIVE:\r
+ case InstallerType.ITSELF:\r
case InstallerType.MSI_PACKAGE:\r
return true;\r
case InstallerType.EXEC_INSTALLER:\r
/// サイレントインストールだけをサポートしているか否か\r
/// </summary>\r
public bool SupportsSilentOnly {\r
- get { return InstalledPackage.Type == InstallerType.ARCHIVE; }\r
+ get {\r
+ return (InstalledPackage.Type == InstallerType.ARCHIVE)\r
+ || (InstalledPackage.Type == InstallerType.ITSELF);\r
+ }\r
}\r
\r
/// <summary>\r
/// </summary>\r
/// <remark>RunAsが必要か否かの判断にしようされる</remark>\r
public bool TargetPC {\r
- get { return InstalledPackage.Type != InstallerType.ARCHIVE; }\r
+ get {\r
+ return (InstalledPackage.Type != InstallerType.ARCHIVE)\r
+ && (InstalledPackage.Type != InstallerType.ITSELF);\r
+ }\r
}\r
\r
#endregion\r
hProcess = Process.Start("msiexec", msiexecArgs);\r
break;\r
case InstallerType.ARCHIVE:\r
+ case InstallerType.ITSELF:\r
string argument = string.Format("-i \"{0}\" \"{1}\"", installerfile, this.InstalledPackage.Name);\r
hProcess = createExtractArchiveProcess(argument,\r
this.OutputDataReceived,\r
this.ErrorDataReceived);\r
+ // Note: ARCHIVEかITSELFの判断はarchive-instが行う\r
break;\r
default:\r
throw new NotImplementedException("Not implemented archive installation yet");\r
list.AddRange(Directory.GetFiles(basedir, "*.7z"));\r
list.AddRange(Directory.GetFiles(basedir, "*.tar*"));\r
break;\r
+ case InstallerType.ITSELF:\r
+ list.AddRange(Directory.GetFiles(basedir, "*.exe"));\r
+ break;\r
default:\r
return null;\r
}\r
{\r
foreach (UninstallInformation info in RegistriedUninstallers.Uninstallers) {\r
foreach (Package pkg in pkgList) {\r
- if (pkg.Type != InstallerType.ARCHIVE && pkg.UninstallerKey != null) {\r
+ if (pkg.Type != InstallerType.ARCHIVE\r
+ && pkg.Type != InstallerType.ITSELF\r
+ && pkg.UninstallerKey != null) {\r
Match match = Regex.Match(info.DisplayName, pkg.UninstallerKey);\r
\r
if (match.Success) {\r
/// <returns>インストール情報</returns>\r
public static InstalledPackage GetInstalledPackageFor(Package pkg)\r
{\r
- if (pkg.Type == InstallerType.ARCHIVE || pkg.Type == InstallerType.CANNOT_INSTALL) {\r
+ if (pkg.Type == InstallerType.ARCHIVE\r
+ || pkg.Type == InstallerType.ITSELF\r
+ || pkg.Type == InstallerType.CANNOT_INSTALL) {\r
return null;\r
}\r
\r
public bool Installed\r
{\r
get {\r
- if (UninstalledPackage.Type == InstallerType.ARCHIVE) {\r
+ if ((UninstalledPackage.Type == InstallerType.ARCHIVE)\r
+ || UninstalledPackage.Type == InstallerType.ITSELF) {\r
return Directory.Exists(UninstalledPackage.UninstallInfo.InstallLocation);\r
} else {\r
foreach (UninstallInformation info in RegistriedUninstallers.Uninstallers) {\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
+ procInfo.CreateNoWindow = true;\r
using (NaGet.InteropServices.CreateProcessCaller p = new NaGet.InteropServices.CreateProcessCaller(procInfo)) {\r
\r
if (NaGet.Env.InstallProcessOnBackground) {\r
repo.Name = (string.IsNullOrEmpty(pkgList.Name))? repo.Name : pkgList.Name;\r
\r
avaiablePackageList.AddPackages(pkgList.Packages);\r
- } catch (InvalidOperationException e) {\r
+ } catch (InvalidOperationException) {\r
RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, string.Format("Repository {0} does not have a AppliStation Native XML softlist.", repo.Name ?? repo.Url.Href));\r
}\r
} else {\r