Exemplo n.º 1
0
		public List<PrintItem> ImportFromProjectArchive(string loadedFileName = null)
		{
			if (loadedFileName == null)
			{
				loadedFileName = defaultProjectPathAndFileName;
			}

			if (!System.IO.File.Exists(loadedFileName))
			{
				return null;
			}

			try
			{
				using (FileStream fs = File.OpenRead(loadedFileName))
				using (ZipArchive zip = new ZipArchive(fs))
				{
					int projectHashCode = zip.GetHashCode();

					//If the temp folder doesn't exist - create it, otherwise clear it
					string stagingFolder = Path.Combine(applicationDataPath, "data", "temp", "project-extract", projectHashCode.ToString());
					if (!Directory.Exists(stagingFolder))
					{
						Directory.CreateDirectory(stagingFolder);
					}
					else
					{
						System.IO.DirectoryInfo directory = new System.IO.DirectoryInfo(@stagingFolder);
						EmptyFolder(directory);
					}

					List<PrintItem> printItemList = new List<PrintItem>();
					Project projectManifest = null;

					foreach (ZipArchiveEntry zipEntry in zip.Entries)
					{
						string sourceExtension = Path.GetExtension(zipEntry.Name).ToUpper();

						// Note: directories have empty Name properties
						//
						// Only process ZipEntries that are:
						//    - not directories and
						//     - are in the ValidFileExtension list or
						//     - have a .GCODE extension or
						//     - are named manifest.json
						if (!string.IsNullOrWhiteSpace(zipEntry.Name) &&
							(zipEntry.Name == "manifest.json"
							|| MeshFileIo.ValidFileExtensions().Contains(sourceExtension)
							|| sourceExtension == ".GCODE"))
						{
							string extractedFileName = Path.Combine(stagingFolder, zipEntry.Name);

							string neededPathForZip = Path.GetDirectoryName(extractedFileName);
							if (!Directory.Exists(neededPathForZip))
							{
								Directory.CreateDirectory(neededPathForZip);
							}

							using (Stream zipStream = zipEntry.Open())
							using (FileStream streamWriter = File.Create(extractedFileName))
							{
								zipStream.CopyTo(streamWriter);
							}

							if (zipEntry.Name == "manifest.json")
							{
								using (StreamReader sr = new System.IO.StreamReader(extractedFileName))
								{
									projectManifest = (Project)Newtonsoft.Json.JsonConvert.DeserializeObject(sr.ReadToEnd(), typeof(Project));
								}
							}
						}
					}

					if (projectManifest != null)
					{
						foreach (ManifestItem item in projectManifest.ProjectFiles)
						{
							for (int i = 1; i <= item.ItemQuantity; i++)
							{
								printItemList.Add(this.GetPrintItemFromFile(Path.Combine(stagingFolder, item.FileName), item.Name));
							}
						}
					}
					else
					{
						string[] files = Directory.GetFiles(stagingFolder, "*.*", SearchOption.AllDirectories);
						foreach (string fileName in files)
						{
							printItemList.Add(this.GetPrintItemFromFile(fileName, Path.GetFileNameWithoutExtension(fileName)));
						}
					}

					return printItemList;
				}
			}
			catch
			{
				return null;
			}
		}