summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Weghorn <m.weghorn@posteo.de>2022-07-26 13:53:17 +0200
committerMichael Weghorn <m.weghorn@posteo.de>2022-07-26 22:37:58 +0200
commit11cd74ade59c6b47b25a737775a541fdd6faed44 (patch)
tree9d557f6bb7003b406ff808c6a2ded90d99d6ed9c
parent59cfcd863b483a99491e6f8cd30016386bbff870 (diff)
tdf#150104 Store full printer/driver name in doc's JobSetup
Printer and driver name have a limited length (64 chars for the printer name, 32 for the driver name) in the `ImplOldJobSetupData` struct that is part of what gets serialized into the "PrinterSetup" config item in settings.xml when saving printer settings to the document (s. `WriteJobSetup`). Longer printer and driver names get truncated, and only the truncated name got restored. At least for Windows, this scenario would result in the doc printer settings not getting restored properly, because `ImplTestSalJobSetup` (in vcl/win/gdi/salprn.cxx) among others checks that both printer and driver name match, which isn't the case when one version is truncated. ODF spec, version 1.3, section 3.1.3.5 says this on settings.xml: > 3.1.3.5 <office:document-settings> > The <office:document-settings> root element contains > implementation-dependent settings. The file within a > package for the <office:document-settings> element is > settings.xml. Since the settings are implementation-dependent, changing the exact format and content of the data in "PrinterSetup" is unproblematic, as long as compatibility with older application versions is maintained. Luckily, there is already a way to save variable-length key-value pairs with `JOBSET_FILE605_SYSTEM`, added in commit 4bd178f6ee60f641b2a6c7fcc9f6e4b6dd01df27 Date: Fri Sep 22 11:55:00 2000 +0000 new feature in JobSetup: additional parameters Make use of this to save the full printer and driver name using the "PRINTER_NAME" and "DRIVER_NAME" keys and restore the values from those if present. For compatibility with older versions, the (potentially truncated) values are still written and also used as fallback on document open. Change-Id: I55bed58023fa7a078525add79b13f2310aa9a9dd Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137454 Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com> Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
-rw-r--r--vcl/source/gdi/jobset.cxx15
1 files changed, 15 insertions, 0 deletions
diff --git a/vcl/source/gdi/jobset.cxx b/vcl/source/gdi/jobset.cxx
index 04bc9daf98a6..9969a6165327 100644
--- a/vcl/source/gdi/jobset.cxx
+++ b/vcl/source/gdi/jobset.cxx
@@ -30,6 +30,9 @@
namespace {
+// used only for compatibility with older versions,
+// printer/driver name are truncated if too long,
+// device name and port name are completely unused
struct ImplOldJobSetupData
{
char cPrinterName[64];
@@ -259,6 +262,8 @@ SvStream& ReadJobSetup( SvStream& rIStream, JobSetup& rJobSetup )
ImplJobSetup& rJobData = rJobSetup.ImplGetData();
+ // use (potentially truncated) printer/driver name from ImplOldJobSetupData as fallback,
+ // gets overwritten below if PRINTER_NAME/DRIVER_NAME keys are set
pData->cPrinterName[std::size(pData->cPrinterName) - 1] = 0;
rJobData.SetPrinterName( OStringToOUString(pData->cPrinterName, aStreamEncoding) );
pData->cDriverName[std::size(pData->cDriverName) - 1] = 0;
@@ -327,6 +332,10 @@ SvStream& ReadJobSetup( SvStream& rIStream, JobSetup& rJobSetup )
else if( aValue == "DuplexMode::LongEdge" )
rJobData.SetDuplexMode( DuplexMode::LongEdge );
}
+ else if (aKey == u"PRINTER_NAME")
+ rJobData.SetPrinterName(aValue);
+ else if (aKey == u"DRIVER_NAME")
+ rJobData.SetDriver(aValue);
else
rJobData.SetValueMap(aKey, aValue);
}
@@ -397,6 +406,12 @@ SvStream& WriteJobSetup( SvStream& rOStream, const JobSetup& rJobSetup )
write_uInt16_lenPrefixed_uInt8s_FromOString(rOStream, "DuplexMode::LongEdge");
break;
}
+ // write printer, driver name in full, the ones in aOldData may be truncated
+ write_uInt16_lenPrefixed_uInt8s_FromOUString(rOStream, u"PRINTER_NAME", RTL_TEXTENCODING_UTF8);
+ write_uInt16_lenPrefixed_uInt8s_FromOUString(rOStream, rJobData.GetPrinterName(), RTL_TEXTENCODING_UTF8);
+ write_uInt16_lenPrefixed_uInt8s_FromOUString(rOStream, u"DRIVER_NAME", RTL_TEXTENCODING_UTF8);
+ write_uInt16_lenPrefixed_uInt8s_FromOUString(rOStream, rJobData.GetDriver(), RTL_TEXTENCODING_UTF8);
+
nLen = sal::static_int_cast<sal_uInt16>(rOStream.Tell() - nPos);
rOStream.Seek( nPos );
rOStream.WriteUInt16( nLen );