summaryrefslogtreecommitdiff
path: root/vcl/source/gdi/jobset.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/source/gdi/jobset.cxx')
-rw-r--r--vcl/source/gdi/jobset.cxx293
1 files changed, 149 insertions, 144 deletions
diff --git a/vcl/source/gdi/jobset.cxx b/vcl/source/gdi/jobset.cxx
index 2b795e51aa99..11137c191b69 100644
--- a/vcl/source/gdi/jobset.cxx
+++ b/vcl/source/gdi/jobset.cxx
@@ -22,9 +22,9 @@
#include <tools/debug.hxx>
#include <tools/stream.hxx>
#include <vcl/jobset.hxx>
-
#include <jobset.h>
#include <memory>
+#include <rtl/instance.hxx>
#define JOBSET_FILE364_SYSTEM ((sal_uInt16)0xFFFF)
#define JOBSET_FILE605_SYSTEM ((sal_uInt16)0xFFFE)
@@ -51,7 +51,6 @@ struct Impl364JobSetupData
ImplJobSetup::ImplJobSetup()
{
- mnRefCount = 1;
mnSystem = 0;
meOrientation = ORIENTATION_PORTRAIT;
meDuplexMode = DUPLEX_UNKNOWN;
@@ -65,27 +64,26 @@ ImplJobSetup::ImplJobSetup()
}
ImplJobSetup::ImplJobSetup( const ImplJobSetup& rJobSetup ) :
- maPrinterName( rJobSetup.maPrinterName ),
- maDriver( rJobSetup.maDriver )
-{
- mnRefCount = 1;
- mnSystem = rJobSetup.mnSystem;
- meOrientation = rJobSetup.meOrientation;
- meDuplexMode = rJobSetup.meDuplexMode;
- mnPaperBin = rJobSetup.mnPaperBin;
- mePaperFormat = rJobSetup.mePaperFormat;
- mnPaperWidth = rJobSetup.mnPaperWidth;
- mnPaperHeight = rJobSetup.mnPaperHeight;
- mnDriverDataLen = rJobSetup.mnDriverDataLen;
- if ( rJobSetup.mpDriverData )
+ mnSystem( rJobSetup.GetSystem() ),
+ maPrinterName( rJobSetup.GetPrinterName() ),
+ maDriver( rJobSetup.GetDriver() ),
+ meOrientation( rJobSetup.GetOrientation() ),
+ meDuplexMode( rJobSetup.GetDuplexMode() ),
+ mnPaperBin( rJobSetup.GetPaperBin() ),
+ mePaperFormat( rJobSetup.GetPaperFormat() ),
+ mnPaperWidth( rJobSetup.GetPaperWidth() ),
+ mnPaperHeight( rJobSetup.GetPaperHeight() ),
+ mnDriverDataLen( rJobSetup.GetDriverDataLen() ),
+ mbPapersizeFromSetup( rJobSetup.GetPapersizeFromSetup() ),
+ maValueMap( rJobSetup.GetValueMap() )
+ {
+ if ( rJobSetup.GetDriverData() )
{
mpDriverData = static_cast<sal_uInt8*>(rtl_allocateMemory( mnDriverDataLen ));
- memcpy( mpDriverData, rJobSetup.mpDriverData, mnDriverDataLen );
+ memcpy( mpDriverData, rJobSetup.GetDriverData(), mnDriverDataLen );
}
else
mpDriverData = nullptr;
- mbPapersizeFromSetup = rJobSetup.mbPapersizeFromSetup;
- maValueMap = rJobSetup.maValueMap;
}
ImplJobSetup::~ImplJobSetup()
@@ -93,131 +91,140 @@ ImplJobSetup::~ImplJobSetup()
rtl_freeMemory( mpDriverData );
}
-ImplJobSetup* JobSetup::ImplGetData()
+void ImplJobSetup::SetSystem(sal_uInt16 nSystem)
{
- if ( !mpData )
- mpData = new ImplJobSetup;
- else if ( mpData->mnRefCount != 1 )
- {
- mpData->mnRefCount--;
- mpData = new ImplJobSetup( *mpData );
- }
+ mnSystem = nSystem;
+}
- return mpData;
+void ImplJobSetup::SetPrinterName(const OUString& rPrinterName)
+{
+ maPrinterName = rPrinterName;
}
-ImplJobSetup* JobSetup::ImplGetConstData()
+void ImplJobSetup::SetDriver(const OUString& rDriver)
{
- if ( !mpData )
- mpData = new ImplJobSetup;
- return mpData;
+ maDriver = rDriver;
}
-const ImplJobSetup* JobSetup::ImplGetConstData() const
+void ImplJobSetup::SetOrientation(Orientation eOrientation)
{
- if ( !mpData )
- const_cast<JobSetup*>(this)->mpData = new ImplJobSetup;
- return mpData;
+ meOrientation = eOrientation;
}
-JobSetup::JobSetup()
+void ImplJobSetup::SetDuplexMode(DuplexMode eDuplexMode)
{
+ meDuplexMode = eDuplexMode;
+}
- mpData = nullptr;
+void ImplJobSetup::SetPaperBin(sal_uInt16 nPaperBin)
+{
+ mnPaperBin = nPaperBin;
}
-JobSetup::JobSetup( const JobSetup& rJobSetup )
+void ImplJobSetup::SetPaperFormat(Paper ePaperFormat)
{
- SAL_WARN_IF( rJobSetup.mpData && (rJobSetup.mpData->mnRefCount >= 0xFFFE), "vcl", "JobSetup: RefCount overflow" );
+ mePaperFormat = ePaperFormat;
+}
- mpData = rJobSetup.mpData;
- if ( mpData )
- mpData->mnRefCount++;
+void ImplJobSetup::SetPaperWidth(long nPaperWidth)
+{
+ mnPaperWidth = nPaperWidth;
}
-JobSetup::~JobSetup()
+void ImplJobSetup::SetPaperHeight(long nPaperHeight)
{
+ mnPaperHeight = nPaperHeight;
+}
- if ( mpData )
- {
- if ( mpData->mnRefCount == 1 )
- delete mpData;
- else
- mpData->mnRefCount--;
- }
+void ImplJobSetup::SetDriverDataLen(sal_uInt32 nDriverDataLen)
+{
+ mnDriverDataLen = nDriverDataLen;
}
-OUString JobSetup::GetPrinterName() const
+void ImplJobSetup::SetDriverData(sal_uInt8* pDriverData)
{
- if ( mpData )
- return mpData->maPrinterName;
- else
- return OUString();
+ mpDriverData = pDriverData;
}
-OUString JobSetup::GetDriverName() const
+void ImplJobSetup::SetPapersizeFromSetup(bool bPapersizeFromSetup)
{
- if ( mpData )
- return mpData->maDriver;
- else
- return OUString();
+ mbPapersizeFromSetup = bPapersizeFromSetup;
+}
+
+void ImplJobSetup::SetValueMap( const OUString& rKey, const OUString& rValue )
+{
+ maValueMap [ rKey ] = rValue;
}
JobSetup& JobSetup::operator=( const JobSetup& rJobSetup )
{
- SAL_WARN_IF( rJobSetup.mpData && (rJobSetup.mpData->mnRefCount) >= 0xFFFE, "vcl", "JobSetup: RefCount overflow" );
+ mpData = rJobSetup.mpData;
+ return *this;
+}
- // Increment refcount first, so that we can assign to ourselves
- if ( rJobSetup.mpData )
- rJobSetup.mpData->mnRefCount++;
+bool ImplJobSetup::operator==( const ImplJobSetup& rImplJobSetup ) const
+{
+ if ( mnSystem == rImplJobSetup.mnSystem &&
+ maPrinterName == rImplJobSetup.maPrinterName &&
+ maDriver == rImplJobSetup.maDriver &&
+ meOrientation == rImplJobSetup.meOrientation &&
+ meDuplexMode == rImplJobSetup.meDuplexMode &&
+ mnPaperBin == rImplJobSetup.mnPaperBin &&
+ mePaperFormat == rImplJobSetup.mePaperFormat &&
+ mnPaperWidth == rImplJobSetup.mnPaperWidth &&
+ mnPaperHeight == rImplJobSetup.mnPaperHeight &&
+ mnDriverDataLen == rImplJobSetup.mnDriverDataLen &&
+ maValueMap == rImplJobSetup.maValueMap &&
+ memcmp( mpDriverData, rImplJobSetup.mpDriverData, mnDriverDataLen ) == 0)
+ return true;
+ return false;
+}
- // If it's not static ImpData and the last reference, delete it, else
- // decrement refcount
- if ( mpData )
- {
- if ( mpData->mnRefCount == 1 )
- delete mpData;
- else
- mpData->mnRefCount--;
- }
+namespace
+{
+ struct theGlobalDefault :
+ public rtl::Static< JobSetup::ImplType, theGlobalDefault > {};
+}
- mpData = rJobSetup.mpData;
+JobSetup::JobSetup() : mpData(theGlobalDefault::get())
+{
+}
- return *this;
+JobSetup::JobSetup( const JobSetup& rJobSetup ) : mpData(rJobSetup.mpData)
+{
+}
+
+JobSetup::~JobSetup()
+{
}
bool JobSetup::operator==( const JobSetup& rJobSetup ) const
{
+ return mpData == rJobSetup.mpData;
+}
- if ( mpData == rJobSetup.mpData )
- return true;
+const ImplJobSetup& JobSetup::ImplGetConstData() const
+{
+ return *mpData;
+}
- if ( !mpData || !rJobSetup.mpData )
- return false;
-
- ImplJobSetup* pData1 = mpData;
- ImplJobSetup* pData2 = rJobSetup.mpData;
- if ( (pData1->mnSystem == pData2->mnSystem) &&
- (pData1->maPrinterName == pData2->maPrinterName) &&
- (pData1->maDriver == pData2->maDriver) &&
- (pData1->meOrientation == pData2->meOrientation) &&
- (pData1->meDuplexMode == pData2->meDuplexMode) &&
- (pData1->mnPaperBin == pData2->mnPaperBin) &&
- (pData1->mePaperFormat == pData2->mePaperFormat) &&
- (pData1->mnPaperWidth == pData2->mnPaperWidth) &&
- (pData1->mnPaperHeight == pData2->mnPaperHeight) &&
- (pData1->mnDriverDataLen == pData2->mnDriverDataLen) &&
- (memcmp( pData1->mpDriverData, pData2->mpDriverData, pData1->mnDriverDataLen ) == 0) &&
- (pData1->maValueMap == pData2->maValueMap)
- )
- return true;
+ImplJobSetup& JobSetup::ImplGetData()
+{
+ return *mpData;
+}
- return false;
+OUString JobSetup::GetPrinterName() const
+{
+ return mpData->GetPrinterName();
}
-SvStream& ReadJobSetup( SvStream& rIStream, JobSetup& rJobSetup )
+bool JobSetup::IsDefault() const
{
+ return mpData.same_object(theGlobalDefault::get());
+}
+SvStream& ReadJobSetup( SvStream& rIStream, JobSetup& rJobSetup )
+{
{
sal_uInt16 nLen = 0;
rIStream.ReadUInt16( nLen );
@@ -239,22 +246,15 @@ SvStream& ReadJobSetup( SvStream& rIStream, JobSetup& rJobSetup )
if (nRead >= sizeof(ImplOldJobSetupData))
{
ImplOldJobSetupData* pData = reinterpret_cast<ImplOldJobSetupData*>(pTempBuf.get());
- if ( rJobSetup.mpData )
- {
- if ( rJobSetup.mpData->mnRefCount == 1 )
- delete rJobSetup.mpData;
- else
- rJobSetup.mpData->mnRefCount--;
- }
rtl_TextEncoding aStreamEncoding = RTL_TEXTENCODING_UTF8;
if( nSystem == JOBSET_FILE364_SYSTEM )
aStreamEncoding = rIStream.GetStreamCharSet();
- rJobSetup.mpData = new ImplJobSetup;
- ImplJobSetup* pJobData = rJobSetup.mpData;
- pJobData->maPrinterName = OStringToOUString(pData->cPrinterName, aStreamEncoding);
- pJobData->maDriver = OStringToOUString(pData->cDriverName, aStreamEncoding);
+ ImplJobSetup& rJobData = rJobSetup.ImplGetData();
+
+ rJobData.SetPrinterName( OStringToOUString(pData->cPrinterName, aStreamEncoding) );
+ rJobData.SetDriver( OStringToOUString(pData->cDriverName, aStreamEncoding) );
// Are these our new JobSetup files?
if ( nSystem == JOBSET_FILE364_SYSTEM ||
@@ -262,23 +262,26 @@ SvStream& ReadJobSetup( SvStream& rIStream, JobSetup& rJobSetup )
{
Impl364JobSetupData* pOldJobData = reinterpret_cast<Impl364JobSetupData*>(pTempBuf.get() + sizeof( ImplOldJobSetupData ));
sal_uInt16 nOldJobDataSize = SVBT16ToShort( pOldJobData->nSize );
- pJobData->mnSystem = SVBT16ToShort( pOldJobData->nSystem );
- pJobData->mnDriverDataLen = SVBT32ToUInt32( pOldJobData->nDriverDataLen );
- pJobData->meOrientation = (Orientation)SVBT16ToShort( pOldJobData->nOrientation );
- pJobData->meDuplexMode = DUPLEX_UNKNOWN;
- pJobData->mnPaperBin = SVBT16ToShort( pOldJobData->nPaperBin );
- pJobData->mePaperFormat = (Paper)SVBT16ToShort( pOldJobData->nPaperFormat );
- pJobData->mnPaperWidth = (long)SVBT32ToUInt32( pOldJobData->nPaperWidth );
- pJobData->mnPaperHeight = (long)SVBT32ToUInt32( pOldJobData->nPaperHeight );
- if ( pJobData->mnDriverDataLen )
+ rJobData.SetSystem( SVBT16ToShort( pOldJobData->nSystem ) );
+ rJobData.SetDriverDataLen( SVBT32ToUInt32( pOldJobData->nDriverDataLen ) );
+ rJobData.SetOrientation( (Orientation)SVBT16ToShort( pOldJobData->nOrientation ) );
+ rJobData.SetDuplexMode( DUPLEX_UNKNOWN );
+ rJobData.SetPaperBin( SVBT16ToShort( pOldJobData->nPaperBin ) );
+ rJobData.SetPaperFormat( (Paper)SVBT16ToShort( pOldJobData->nPaperFormat ) );
+ rJobData.SetPaperWidth( (long)SVBT32ToUInt32( pOldJobData->nPaperWidth ) );
+ rJobData.SetPaperHeight( (long)SVBT32ToUInt32( pOldJobData->nPaperHeight ) );
+ if ( rJobData.GetDriverDataLen() )
{
- sal_uInt8* pDriverData = reinterpret_cast<sal_uInt8*>(pOldJobData) + nOldJobDataSize;
- pJobData->mpDriverData = static_cast<sal_uInt8*>(rtl_allocateMemory( pJobData->mnDriverDataLen ));
- memcpy( pJobData->mpDriverData, pDriverData, pJobData->mnDriverDataLen );
+ const sal_uInt8* pDriverData = reinterpret_cast<sal_uInt8*>(pOldJobData) + nOldJobDataSize;
+ sal_uInt8* pNewDriverData = static_cast<sal_uInt8*>(
+ rtl_allocateMemory( rJobData.GetDriverDataLen() ));
+ memcpy( pNewDriverData, pDriverData, rJobData.GetDriverDataLen() );
+ rJobData.SetDriverData( pNewDriverData );
}
if( nSystem == JOBSET_FILE605_SYSTEM )
{
- rIStream.Seek( nFirstPos + sizeof( ImplOldJobSetupData ) + sizeof( Impl364JobSetupData ) + pJobData->mnDriverDataLen );
+ rIStream.Seek( nFirstPos + sizeof( ImplOldJobSetupData ) +
+ sizeof( Impl364JobSetupData ) + rJobData.GetDriverDataLen() );
while( rIStream.Tell() < nFirstPos + nRead )
{
OUString aKey = read_uInt16_lenPrefixed_uInt8s_ToOUString(rIStream, RTL_TEXTENCODING_UTF8);
@@ -286,16 +289,16 @@ SvStream& ReadJobSetup( SvStream& rIStream, JobSetup& rJobSetup )
if( aKey == "COMPAT_DUPLEX_MODE" )
{
if( aValue == "DUPLEX_UNKNOWN" )
- pJobData->meDuplexMode = DUPLEX_UNKNOWN;
+ rJobData.SetDuplexMode( DUPLEX_UNKNOWN );
else if( aValue == "DUPLEX_OFF" )
- pJobData->meDuplexMode = DUPLEX_OFF;
+ rJobData.SetDuplexMode( DUPLEX_OFF );
else if( aValue == "DUPLEX_SHORTEDGE" )
- pJobData->meDuplexMode = DUPLEX_SHORTEDGE;
+ rJobData.SetDuplexMode( DUPLEX_SHORTEDGE );
else if( aValue == "DUPLEX_LONGEDGE" )
- pJobData->meDuplexMode = DUPLEX_LONGEDGE;
+ rJobData.SetDuplexMode( DUPLEX_LONGEDGE );
}
else
- pJobData->maValueMap[ aKey ] = aValue;
+ rJobData.SetValueMap(aKey, aValue);
}
SAL_WARN_IF( rIStream.Tell() != nFirstPos+nRead, "vcl", "corrupted job setup" );
// ensure correct stream position
@@ -310,48 +313,50 @@ SvStream& ReadJobSetup( SvStream& rIStream, JobSetup& rJobSetup )
SvStream& WriteJobSetup( SvStream& rOStream, const JobSetup& rJobSetup )
{
-
{
sal_uInt16 nLen = 0;
- if ( !rJobSetup.mpData )
+ if ( rJobSetup.IsDefault() )
rOStream.WriteUInt16( nLen );
else
{
sal_uInt16 nSystem = JOBSET_FILE605_SYSTEM;
- const ImplJobSetup* pJobData = rJobSetup.ImplGetConstData();
+ const ImplJobSetup& rJobData = rJobSetup.ImplGetConstData();
Impl364JobSetupData aOldJobData;
sal_uInt16 nOldJobDataSize = sizeof( aOldJobData );
ShortToSVBT16( nOldJobDataSize, aOldJobData.nSize );
- ShortToSVBT16( pJobData->mnSystem, aOldJobData.nSystem );
- UInt32ToSVBT32( pJobData->mnDriverDataLen, aOldJobData.nDriverDataLen );
- ShortToSVBT16( (sal_uInt16)(pJobData->meOrientation), aOldJobData.nOrientation );
- ShortToSVBT16( pJobData->mnPaperBin, aOldJobData.nPaperBin );
- ShortToSVBT16( (sal_uInt16)(pJobData->mePaperFormat), aOldJobData.nPaperFormat );
- UInt32ToSVBT32( (sal_uLong)(pJobData->mnPaperWidth), aOldJobData.nPaperWidth );
- UInt32ToSVBT32( (sal_uLong)(pJobData->mnPaperHeight), aOldJobData.nPaperHeight );
+ ShortToSVBT16( rJobData.GetSystem(), aOldJobData.nSystem );
+ UInt32ToSVBT32( rJobData.GetDriverDataLen(), aOldJobData.nDriverDataLen );
+ ShortToSVBT16( (sal_uInt16)(rJobData.GetOrientation()), aOldJobData.nOrientation );
+ ShortToSVBT16( rJobData.GetPaperBin(), aOldJobData.nPaperBin );
+ ShortToSVBT16( (sal_uInt16)(rJobData.GetPaperFormat()), aOldJobData.nPaperFormat );
+ UInt32ToSVBT32( (sal_uLong)(rJobData.GetPaperWidth()), aOldJobData.nPaperWidth );
+ UInt32ToSVBT32( (sal_uLong)(rJobData.GetPaperHeight()), aOldJobData.nPaperHeight );
ImplOldJobSetupData aOldData;
memset( &aOldData, 0, sizeof( aOldData ) );
- OString aPrnByteName(OUStringToOString(rJobSetup.GetPrinterName(), RTL_TEXTENCODING_UTF8));
+ OString aPrnByteName(OUStringToOString(rJobData.GetPrinterName(), RTL_TEXTENCODING_UTF8));
strncpy( aOldData.cPrinterName, aPrnByteName.getStr(), 63 );
- OString aDriverByteName(OUStringToOString(rJobSetup.GetDriverName(), RTL_TEXTENCODING_UTF8));
+ OString aDriverByteName(OUStringToOString(rJobData.GetDriver(), RTL_TEXTENCODING_UTF8));
strncpy( aOldData.cDriverName, aDriverByteName.getStr(), 31 );
-// nLen = sizeof( aOldData ) + 4 + nOldJobDataSize + pJobData->mnDriverDataLen;
int nPos = rOStream.Tell();
- rOStream.WriteUInt16( nLen );
+ rOStream.WriteUInt16( 0 );
rOStream.WriteUInt16( nSystem );
rOStream.WriteBytes( &aOldData, sizeof( aOldData ) );
rOStream.WriteBytes( &aOldJobData, nOldJobDataSize );
- rOStream.WriteBytes( pJobData->mpDriverData, pJobData->mnDriverDataLen );
+ rOStream.WriteBytes( rJobData.GetDriverData(), rJobData.GetDriverDataLen() );
+
std::unordered_map< OUString, OUString, OUStringHash >::const_iterator it;
- for( it = pJobData->maValueMap.begin(); it != pJobData->maValueMap.end(); ++it )
+ const std::unordered_map< OUString, OUString, OUStringHash >& rValueMap(
+ rJobData.GetValueMap());
+
+ for( it = rValueMap.begin(); it != rValueMap.end(); ++it )
{
write_uInt16_lenPrefixed_uInt8s_FromOUString(rOStream, it->first, RTL_TEXTENCODING_UTF8);
write_uInt16_lenPrefixed_uInt8s_FromOUString(rOStream, it->second, RTL_TEXTENCODING_UTF8);
}
write_uInt16_lenPrefixed_uInt8s_FromOString(rOStream, "COMPAT_DUPLEX_MODE");
- switch( pJobData->meDuplexMode )
+ switch( rJobData.GetDuplexMode() )
{
case DUPLEX_UNKNOWN:
write_uInt16_lenPrefixed_uInt8s_FromOString(rOStream, "DUPLEX_UNKNOWN");