/// <summary>
/// Saves <see cref="Catalog"/> to an XML file, adds the default stylesheet and sign it it with <see cref="SecretKey"/> (if specified).
/// </summary>
/// <remarks>Writing and signing the catalog file are performed as an atomic operation (i.e. if signing fails an existing file remains unchanged).</remarks>
/// <param name="path">The file to save in.</param>
/// <param name="passphrase">The passphrase to use to unlock the secret key; can be <c>null</c> if <see cref="SecretKey"/> is <c>null</c>.</param>
/// <exception cref="IOException">A problem occurred while writing the file.</exception>
/// <exception cref="UnauthorizedAccessException">Write access to the file is not permitted.</exception>
/// <exception cref="KeyNotFoundException">The specified <see cref="SecretKey"/> could not be found on the system.</exception>
/// <exception cref="WrongPassphraseException"><paramref name="passphrase"/> was incorrect.</exception>
public void Save(string path, string?passphrase = null)
{
#region Sanity checks
if (string.IsNullOrEmpty(path))
{
throw new ArgumentNullException(nameof(path));
}
#endregion
if (SecretKey == null)
{
Catalog.SaveXml(path);
return;
}
using (var stream = new MemoryStream())
{
Catalog.SaveXml(stream, stylesheet: @"catalog.xsl");
stream.Position = 0;
FeedUtils.SignFeed(stream, SecretKey, passphrase, _openPgp);
stream.CopyToFile(path);
}
string directory = Path.GetDirectoryName(path);
_openPgp.DeployPublicKey(SecretKey, directory);
FeedUtils.DeployStylesheet(directory, @"catalog");
}