/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_vcl.hxx" #include "vcl/jobdata.hxx" #include "vcl/printerinfomanager.hxx" #include "tools/stream.hxx" #include "sal/alloca.h" using namespace psp; using namespace rtl; JobData& JobData::operator=(const JobData& rRight) { m_nCopies = rRight.m_nCopies; m_nLeftMarginAdjust = rRight.m_nLeftMarginAdjust; m_nRightMarginAdjust = rRight.m_nRightMarginAdjust; m_nTopMarginAdjust = rRight.m_nTopMarginAdjust; m_nBottomMarginAdjust = rRight.m_nBottomMarginAdjust; m_nColorDepth = rRight.m_nColorDepth; m_eOrientation = rRight.m_eOrientation; m_aPrinterName = rRight.m_aPrinterName; m_pParser = rRight.m_pParser; m_aContext = rRight.m_aContext; m_nPSLevel = rRight.m_nPSLevel; m_nPDFDevice = rRight.m_nPDFDevice; m_nColorDevice = rRight.m_nColorDevice; if( ! m_pParser && m_aPrinterName.getLength() ) { PrinterInfoManager& rMgr = PrinterInfoManager::get(); rMgr.setupJobContextData( *this ); } return *this; } void JobData::setCollate( bool bCollate ) { const PPDParser* pParser = m_aContext.getParser(); if( pParser ) { const PPDKey* pKey = pParser->getKey( String( RTL_CONSTASCII_USTRINGPARAM( "Collate" ) ) ); if( pKey ) { const PPDValue* pVal = NULL; if( bCollate ) pVal = pKey->getValue( String( RTL_CONSTASCII_USTRINGPARAM( "True" ) ) ); else { pVal = pKey->getValue( String( RTL_CONSTASCII_USTRINGPARAM( "False" ) ) ); if( ! pVal ) pVal = pKey->getValue( String( RTL_CONSTASCII_USTRINGPARAM( "None" ) ) ); } m_aContext.setValue( pKey, pVal ); } } } bool JobData::setPaper( int i_nWidth, int i_nHeight ) { bool bSuccess = false; if( m_pParser ) { rtl::OUString aPaper( m_pParser->matchPaper( i_nWidth, i_nHeight ) ); const PPDKey* pKey = m_pParser->getKey( String( RTL_CONSTASCII_USTRINGPARAM( "PageSize" ) ) ); const PPDValue* pValue = pKey ? pKey->getValueCaseInsensitive( aPaper ) : NULL; bSuccess = pKey && pValue && m_aContext.setValue( pKey, pValue, false ); } return bSuccess; } bool JobData::setPaperBin( int i_nPaperBin ) { bool bSuccess = false; if( m_pParser ) { const PPDKey* pKey = m_pParser->getKey( String( RTL_CONSTASCII_USTRINGPARAM( "InputSlot" ) ) ); const PPDValue* pValue = pKey ? pKey->getValue( i_nPaperBin ) : NULL; bSuccess = pKey && pValue && m_aContext.setValue( pKey, pValue, false ); } return bSuccess; } bool JobData::getStreamBuffer( void*& pData, int& bytes ) { // consistency checks if( ! m_pParser ) m_pParser = m_aContext.getParser(); if( m_pParser != m_aContext.getParser() || ! m_pParser ) return false; SvMemoryStream aStream; ByteString aLine; // write header job data aStream.WriteLine( "JobData 1" ); aLine = "printer="; aLine += ByteString( String( m_aPrinterName ), RTL_TEXTENCODING_UTF8 ); aStream.WriteLine( aLine ); aLine = "orientation="; aLine += m_eOrientation == orientation::Landscape ? "Landscape" : "Portrait"; aStream.WriteLine( aLine ); aLine = "copies="; aLine += ByteString::CreateFromInt32( m_nCopies ); aStream.WriteLine( aLine ); aLine = "margindajustment="; aLine += ByteString::CreateFromInt32( m_nLeftMarginAdjust ); aLine += ','; aLine += ByteString::CreateFromInt32( m_nRightMarginAdjust ); aLine += ','; aLine += ByteString::CreateFromInt32( m_nTopMarginAdjust ); aLine += ','; aLine += ByteString::CreateFromInt32( m_nBottomMarginAdjust ); aStream.WriteLine( aLine ); aLine = "colordepth="; aLine += ByteString::CreateFromInt32( m_nColorDepth ); aStream.WriteLine( aLine ); aLine = "pslevel="; aLine += ByteString::CreateFromInt32( m_nPSLevel ); aStream.WriteLine( aLine ); aLine = "pdfdevice="; aLine += ByteString::CreateFromInt32( m_nPDFDevice ); aStream.WriteLine( aLine ); aLine = "colordevice="; aLine += ByteString::CreateFromInt32( m_nColorDevice ); aStream.WriteLine( aLine ); // now append the PPDContext stream buffer aStream.WriteLine( "PPDContexData" ); sal_uLong nBytes; void* pContextBuffer = m_aContext.getStreamableBuffer( nBytes ); if( nBytes ) aStream.Write( pContextBuffer, nBytes ); // success pData = rtl_allocateMemory( bytes = aStream.Tell() ); memcpy( pData, aStream.GetData(), bytes ); return true; } bool JobData::constructFromStreamBuffer( void* pData, int bytes, JobData& rJobData ) { SvMemoryStream aStream( pData, bytes, STREAM_READ ); ByteString aLine; bool bVersion = false; bool bPrinter = false; bool bOrientation = false; bool bCopies = false; bool bContext = false; bool bMargin = false; bool bColorDepth = false; bool bColorDevice = false; bool bPSLevel = false; bool bPDFDevice = false; while( ! aStream.IsEof() ) { aStream.ReadLine( aLine ); if( aLine.CompareTo( "JobData", 7 ) == COMPARE_EQUAL ) bVersion = true; else if( aLine.CompareTo( "printer=", 8 ) == COMPARE_EQUAL ) { bPrinter = true; rJobData.m_aPrinterName = String( aLine.Copy( 8 ), RTL_TEXTENCODING_UTF8 ); } else if( aLine.CompareTo( "orientation=", 12 ) == COMPARE_EQUAL ) { bOrientation = true; rJobData.m_eOrientation = aLine.Copy( 12 ).EqualsIgnoreCaseAscii( "landscape" ) ? orientation::Landscape : orientation::Portrait; } else if( aLine.CompareTo( "copies=", 7 ) == COMPARE_EQUAL ) { bCopies = true; rJobData.m_nCopies = aLine.Copy( 7 ).ToInt32(); } else if( aLine.CompareTo( "margindajustment=",17 ) == COMPARE_EQUAL ) { bMargin = true; ByteString aValues( aLine.Copy( 17 ) ); rJobData.m_nLeftMarginAdjust = aValues.GetToken( 0, ',' ).ToInt32(); rJobData.m_nRightMarginAdjust = aValues.GetToken( 1, ',' ).ToInt32(); rJobData.m_nTopMarginAdjust = aValues.GetToken( 2, ',' ).ToInt32(); rJobData.m_nBottomMarginAdjust = aValues.GetToken( 3, ',' ).ToInt32(); } else if( aLine.CompareTo( "colordepth=", 11 ) == COMPARE_EQUAL ) { bColorDepth = true; rJobData.m_nColorDepth = aLine.Copy( 11 ).ToInt32(); } else if( aLine.CompareTo( "colordevice=", 12 ) == COMPARE_EQUAL ) { bColorDevice = true; rJobData.m_nColorDevice = aLine.Copy( 12 ).ToInt32(); } else if( aLine.CompareTo( "pslevel=", 8 ) == COMPARE_EQUAL ) { bPSLevel = true; rJobData.m_nPSLevel = aLine.Copy( 8 ).ToInt32(); } else if( aLine.CompareTo( "pdfdevice=", 10 ) == COMPARE_EQUAL ) { bPDFDevice = true; rJobData.m_nPDFDevice = aLine.Copy( 10 ).ToInt32(); } else if( aLine.Equals( "PPDContexData" ) ) { if( bPrinter ) { PrinterInfoManager& rManager = PrinterInfoManager::get(); const PrinterInfo& rInfo = rManager.getPrinterInfo( rJobData.m_aPrinterName ); rJobData.m_pParser = PPDParser::getParser( rInfo.m_aDriverName ); if( rJobData.m_pParser ) { rJobData.m_aContext.setParser( rJobData.m_pParser ); int nBytes = bytes - aStream.Tell(); void* pRemain = alloca( bytes - aStream.Tell() ); aStream.Read( pRemain, nBytes ); rJobData.m_aContext.rebuildFromStreamBuffer( pRemain, nBytes ); bContext = true; } } } } return bVersion && bPrinter && bOrientation && bCopies && bContext && bMargin && bPSLevel && bPDFDevice && bColorDevice && bColorDepth; }