/// <summary> /// Creates a root document in the CDA package. /// </summary> /// <param name="fileContent">The content of the file.</param> public void CreateRootDocument(byte[] fileContent) { // Validation var vb = new ValidationBuilder(); vb.ArgumentRequiredCheck("fileContent", fileContent); if (vb.Messages.Count > 0) { throw new ValidationException(vb.Messages); } var file = new CDAPackageFile(); // Indicate that this is the root document file.CDAPackageFileType = CDAPackageFile.FileType.RootDocument; // Set file content file.FileContent = fileContent; // Known fields file.FileName = "CDA_ROOT.XML"; CDADocumentRoot = file; }
/// <summary> /// Adds an attachment to the CDA Package. /// </summary> /// <param name="fileName">The name of the file.</param> /// <param name="fileContent">The content of the file.</param> public void AddDocumentAttachment( string fileName, byte[] fileContent) { // Validation var vb = new ValidationBuilder(); vb.ArgumentRequiredCheck("fileName", fileName); vb.ArgumentRequiredCheck("fileContent", fileContent); if (vb.Messages.Count > 0) { throw new ValidationException(vb.Messages); } var file = new CDAPackageFile(); // Indicate that this is a document attachment file.CDAPackageFileType = CDAPackageFile.FileType.Attachment; // User specified fields file.FileName = fileName; file.FileContent = fileContent; if (CDADocumentAttachments == null) { CDADocumentAttachments = new List <CDAPackageFile>(); } CDADocumentAttachments.Add(file); }
/// <summary> /// Extracts a CDA package zip file without verifying the signature. /// </summary> /// <param name="package">A byte array of a CDA package zip file.</param> /// <returns>A CDAPackage instance constructed from the CDA package zip file.</returns> public static CDAPackage ExtractAndIgnoreSignatureVerification(byte[] package) { CDAPackage extractedPackage = null; // Validation on package Validation.ValidateArgumentRequired("package", package); // Get zip entries in zip package var inputStream = new MemoryStream(package); Dictionary <string, byte[]> entries = GetZipEntriesFromZipStream(new ZipArchive(inputStream)); // Check to ensure that there is only one submission set folder string submissionPath = null; foreach (var name in entries.Keys) { var m = Regex.Match(name, @"^([^/\\]+[/\\][^/\\]+[/\\])[^/\\]+$", RegexOptions.IgnoreCase); if (m.Success) { if (submissionPath == null) { submissionPath = m.Groups[1].Value; } else if (submissionPath != m.Groups[1].Value) { throw new ArgumentException("More than one submission set folder found."); } } } // Get root document var rootDoc = entries.FirstOrDefault(a => Regex.IsMatch(a.Key, @"^[^/\\]+[/\\][^/\\]+[/\\]CDA_ROOT.XML$", RegexOptions.IgnoreCase)); if (string.IsNullOrEmpty(rootDoc.Key)) { throw new ArgumentException("CDA_ROOT.XML not found."); } // Get submission set folder string submissionSetPath = Regex.Match(rootDoc.Key, @"^([^/\\]+[/\\][^/\\]+[/\\])CDA_ROOT.XML$", RegexOptions.IgnoreCase).Groups[1].Value; var newPackage = new CDAPackage(); newPackage.CDADocumentRoot = new CDAPackageFile(); newPackage.CDADocumentRoot.CDAPackageFileType = CDAPackageFile.FileType.RootDocument; newPackage.CDADocumentRoot.FileName = rootDoc.Key.Replace(submissionPath, ""); newPackage.CDADocumentRoot.FileContent = rootDoc.Value; foreach (var entry in entries) { if (entry.Key == rootDoc.Key) { continue; } else if (entry.Key.Equals(submissionPath + "CDA_SIGN.XML", StringComparison.InvariantCultureIgnoreCase)) { var signature = new CDAPackageFile(); signature.CDAPackageFileType = CDAPackageFile.FileType.Signature; signature.FileName = entry.Key.Replace(submissionPath, ""); signature.FileContent = entry.Value; newPackage.CDASignature = signature; } else if (entry.Key.StartsWith(submissionPath, true, CultureInfo.InvariantCulture)) { var attachment = new CDAPackageFile(); attachment.CDAPackageFileType = CDAPackageFile.FileType.Attachment; attachment.FileName = entry.Key.Replace(submissionPath, ""); attachment.FileContent = entry.Value; if (newPackage.CDADocumentAttachments == null) { newPackage.CDADocumentAttachments = new List <CDAPackageFile>(); } newPackage.CDADocumentAttachments.Add(attachment); } } extractedPackage = newPackage; return(extractedPackage); }