/// <summary>
		///     Install a jarfile
		/// </summary>
		/// <param name="version">Version to install</param>
		/// <param name="targetlocation">Target location, plugins/name by default</param>
		/// <param name="showUi">Allow pop-up dialogs</param>
		/// <remarks></remarks>
		private static Boolean InstallJar(BukgetPluginVersion version, string targetlocation = "", bool showUi = true)
		{
			if (showUi)
			{
				if (
					MetroMessageBox.Show(Application.OpenForms[0],
						Locale.Tr("You are about to install") + " " + version.Filename.Replace(".jar", "") + " (" +
						version.VersionNumber + ")" + Constants.vbCrLf + Locale.Tr("Do you wish to continue?"),
						Locale.Tr("Continue?"), MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
					return false;
			}

			Logger.Log(LogLevel.Info, "BukGetAPI", "Installing plugin:" + version.Filename + ", packed as jar file");

			// It's nicer to have a plugin name instead of a file name with a random version. versions are retrieved from yml files, so we're using pretty names
			if (string.IsNullOrEmpty(targetlocation))
				targetlocation = Fl.Location(RequestFile.Plugindir) + "/" + version.PluginName.ToLower();

			FileDownloader fdd = new FileDownloader();
			fdd.AddFile(version.DownloadLink, targetlocation);
			fdd.ShowDialog();

			InstalledPluginManager.ReloadInstalledPluginFile(targetlocation);

			if (showUi)
			{
				ShowInstallationComplete(version.Filename.Replace(".jar", ""), version.VersionNumber);
			}
			return true;
		}
Esempio n. 2
0
		public static void DownloadFile(string url, string targetlocation, Boolean showUi, Boolean sync = false)
		{
			FileDownloader fileDownloadDialog = new FileDownloader();
			fileDownloadDialog.AddFile(url, targetlocation);
			if (!showUi)
			{
				fileDownloadDialog.StartDownload();
				return;
			}
			if (!sync)
			{
				fileDownloadDialog.Show();
			}
			else
			{
				fileDownloadDialog.ShowDialog();
			}
		}
		/// <summary>
		///     Install plguins from a zip file
		/// </summary>
		/// <param name="version">Version to install</param>
		/// <param name="showUi">Allow pop-up dialogs</param>
		/// <remarks></remarks>
		private static Boolean InstallZip(BukgetPluginVersion version, bool showUi = true)
		{
			if (showUi)
			{
				if (
					MetroMessageBox.Show(Application.OpenForms[0],
						Locale.Tr("You are about to install") + " " + version.Filename.Replace(".zip", "") + " (" +
						version.VersionNumber + ")" + Constants.vbCrLf + Locale.Tr("Do you wish to continue?"),
						Locale.Tr("Continue?"), MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
					return false;
			}

			Logger.Log(LogLevel.Info, "BukGetAPI", "Installing plugin:" + version.Filename + ", packed as zip file");

			string randomName = DateTime.Now.Ticks.ToString();

			string zipfile = Fl.SafeLocation(RequestFile.Temp) + "install.zip";
			string extraction = Fl.SafeLocation(RequestFile.Temp) + "/install_" + randomName + "/";

			FileDownloader fdd = new FileDownloader();
			fdd.AddFile(version.DownloadLink, zipfile);
			fdd.ShowDialog();

			Compression.Decompress(extraction, zipfile);

			// ******************************
			// At this point, the zip file is extracted to a temporary location
			// Now only the needed files should be moved


			Boolean hasFileBeenMoved = false;

			Boolean hasFolderBeenMoved = false;

			//file is decompressed, now search the needed files
			DirectoryInfo extracteDirectoryInfo = new DirectoryInfo(extraction);

			List<string> extractedFileNamesList = new List<string>();
			foreach (FileInfo fileInfo in extracteDirectoryInfo.GetFiles())
			{
				if (fileInfo.Extension == ".jar")
				{
					File.Copy(fileInfo.FullName,
						Fl.Location(RequestFile.Plugindir) + "/" + fileInfo.Name, true);
					extractedFileNamesList.Add(fileInfo.Name);
					hasFileBeenMoved = true;
					Logger.Log(LogLevel.Info, "BukGetAPI", "Jar file found in .zip (L1), copied:" + fileInfo.Name);
				}
			}

			// now we check if there's a folder with the same name as the plugin. This folder should also be moved to the /plugins folder
			foreach (DirectoryInfo directoryInZipInfo in extracteDirectoryInfo.GetDirectories())
			{
				Boolean folderShouldBeMoved = false;

				foreach (string f in extractedFileNamesList)
				{
					if (f.Contains(directoryInZipInfo.Name))
					{
						folderShouldBeMoved = true;
						Logger.Log(LogLevel.Info, "BukgetAPI",
							"Config/Info folder found in .zip, marked directory for copy:" + directoryInZipInfo.Name);
					}
				}
				if (!folderShouldBeMoved)
				{
					foreach (FileInfo fileInfo in directoryInZipInfo.GetFiles())
					{
						if (fileInfo.Extension == ".txt" | fileInfo.Extension == ".yml" | fileInfo.Extension == ".cfg" |
						    fileInfo.Extension == ".csv" | fileInfo.Extension == ".js")
						{
							folderShouldBeMoved = true;
							Logger.Log(LogLevel.Info, "BukgetAPI",
								"Config/Info file found in .zip, marked directory for copy:" + fileInfo.Name);
						}
					}
				}
				if (folderShouldBeMoved)
				{
					Directory.Move(directoryInZipInfo.FullName,
						Fl.Location(RequestFile.Plugindir) + "/" + directoryInZipInfo.Name);
					hasFileBeenMoved = false;
					hasFolderBeenMoved = true;
				}

				// If we didn't copy a file yet, check other folders for jar files
				//L2
				if (!hasFileBeenMoved)
				{
					foreach (FileInfo fileInfo in directoryInZipInfo.GetFiles())
					{
						if (fileInfo.Extension != ".jar") continue;
						fileInfo.MoveTo(Fl.Location(RequestFile.Plugindir) + "/" + fileInfo.Name);
						hasFileBeenMoved = true;
						Logger.Log(LogLevel.Info, "BukgetAPI", "Jar file found in .zip (L2), copied:" + fileInfo.Name);
					}
				}

				if (hasFolderBeenMoved) continue;
				// If we didn't find a config folder yet, check deeper. config folders are not required
				foreach (DirectoryInfo dir2 in directoryInZipInfo.GetDirectories())
				{
					bool copy2 = false;
					foreach (string f in extractedFileNamesList)
					{
						if (!f.Contains(dir2.Name)) continue;
						copy2 = true;
						Logger.Log(LogLevel.Info, "BukgetAPI",
							"Config/Info folder found in .zip, marked directory for copy:" + dir2.Name);
					}
					foreach (FileInfo fileInfo in dir2.GetFiles())
					{
						if (fileInfo.Extension == ".txt" | fileInfo.Extension == ".yml" | fileInfo.Extension == ".cfg" |
						    fileInfo.Extension == ".csv" | fileInfo.Extension == ".js")
						{
							copy2 = true;
							Logger.Log(LogLevel.Info, "BukgetAPI",
								"Config/Info file found in .zip, marked directory for copy:" + fileInfo.Name);
						}
					}
					if (copy2)
					{
						FsUtil.CopyFolder(directoryInZipInfo.FullName,
							Fl.Location(RequestFile.Plugindir) + "/" + dir2.Name, true);
					}
				}

				// end of second level searching
			}


			Logger.Log(LogLevel.Info, "BukgetAPI",
				"Finished plugin installation: Success?" + (hasFileBeenMoved || hasFolderBeenMoved));

			//refresh installed list
			if (showUi) ShowInstallationComplete(version.PluginName, version.VersionNumber);

			return (hasFileBeenMoved || hasFolderBeenMoved);
		}