private bool ValidateReceivedData(FileTransferIn fileTransfer, out string ErrorMessage) { ErrorMessage = ""; switch (fileTransfer.FileType) { case FileTransferType.Submarine: System.IO.Stream stream; try { stream = SaveUtil.DecompressFiletoStream(fileTransfer.FilePath); } catch (Exception e) { ErrorMessage = "Loading received submarine \"" + fileTransfer.FileName + "\" failed! {" + e.Message + "}"; return(false); } if (stream == null) { ErrorMessage = "Decompressing received submarine file \"" + fileTransfer.FilePath + "\" failed!"; return(false); } try { stream.Position = 0; XmlReaderSettings settings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Prohibit, IgnoreProcessingInstructions = true }; using (var reader = XmlReader.Create(stream, settings)) { while (reader.Read()) { ; } } } catch { stream?.Close(); ErrorMessage = "Parsing file \"" + fileTransfer.FilePath + "\" failed! The file may not be a valid submarine file."; return(false); } stream?.Close(); break; case FileTransferType.CampaignSave: try { var files = SaveUtil.EnumerateContainedFiles(fileTransfer.FilePath); foreach (var file in files) { string extension = Path.GetExtension(file); if ((!extension.Equals(".sub", StringComparison.OrdinalIgnoreCase) && !file.Equals("gamesession.xml")) || file.CleanUpPathCrossPlatform(correctFilenameCase: false).Contains('/')) { ErrorMessage = $"Found unexpected file in \"{fileTransfer.FileName}\"! ({file})"; return(false); } } } catch (Exception e) { ErrorMessage = $"Loading received campaign save \"{fileTransfer.FileName}\" failed! {{{e.Message}}}"; return(false); } break; } return(true); }