xref: /AOO41X/main/vcl/source/gdi/jobset.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_vcl.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include <tools/debug.hxx>
32*cdf0e10cSrcweir #include <tools/stream.hxx>
33*cdf0e10cSrcweir 
34*cdf0e10cSrcweir #include <rtl/alloc.h>
35*cdf0e10cSrcweir 
36*cdf0e10cSrcweir #include <vcl/jobset.hxx>
37*cdf0e10cSrcweir 
38*cdf0e10cSrcweir #include <jobset.h>
39*cdf0e10cSrcweir 
40*cdf0e10cSrcweir // =======================================================================
41*cdf0e10cSrcweir 
42*cdf0e10cSrcweir DBG_NAME( JobSetup )
43*cdf0e10cSrcweir 
44*cdf0e10cSrcweir #define JOBSET_FILEFORMAT2		3780
45*cdf0e10cSrcweir #define JOBSET_FILE364_SYSTEM	((sal_uInt16)0xFFFF)
46*cdf0e10cSrcweir #define JOBSET_FILE605_SYSTEM	((sal_uInt16)0xFFFE)
47*cdf0e10cSrcweir 
48*cdf0e10cSrcweir struct ImplOldJobSetupData
49*cdf0e10cSrcweir {
50*cdf0e10cSrcweir 	char	cPrinterName[64];
51*cdf0e10cSrcweir 	char	cDeviceName[32];
52*cdf0e10cSrcweir 	char	cPortName[32];
53*cdf0e10cSrcweir 	char	cDriverName[32];
54*cdf0e10cSrcweir };
55*cdf0e10cSrcweir 
56*cdf0e10cSrcweir struct Impl364JobSetupData
57*cdf0e10cSrcweir {
58*cdf0e10cSrcweir 	SVBT16	nSize;
59*cdf0e10cSrcweir 	SVBT16	nSystem;
60*cdf0e10cSrcweir 	SVBT32	nDriverDataLen;
61*cdf0e10cSrcweir 	SVBT16	nOrientation;
62*cdf0e10cSrcweir 	SVBT16	nPaperBin;
63*cdf0e10cSrcweir 	SVBT16	nPaperFormat;
64*cdf0e10cSrcweir 	SVBT32	nPaperWidth;
65*cdf0e10cSrcweir 	SVBT32	nPaperHeight;
66*cdf0e10cSrcweir };
67*cdf0e10cSrcweir 
68*cdf0e10cSrcweir // =======================================================================
69*cdf0e10cSrcweir 
70*cdf0e10cSrcweir ImplJobSetup::ImplJobSetup()
71*cdf0e10cSrcweir {
72*cdf0e10cSrcweir 	mnRefCount			= 1;
73*cdf0e10cSrcweir 	mnSystem			= 0;
74*cdf0e10cSrcweir 	meOrientation		= ORIENTATION_PORTRAIT;
75*cdf0e10cSrcweir     meDuplexMode        = DUPLEX_UNKNOWN;
76*cdf0e10cSrcweir 	mnPaperBin			= 0;
77*cdf0e10cSrcweir 	mePaperFormat		= PAPER_USER;
78*cdf0e10cSrcweir 	mnPaperWidth		= 0;
79*cdf0e10cSrcweir 	mnPaperHeight		= 0;
80*cdf0e10cSrcweir 	mnDriverDataLen 	= 0;
81*cdf0e10cSrcweir 	mpDriverData		= NULL;
82*cdf0e10cSrcweir }
83*cdf0e10cSrcweir 
84*cdf0e10cSrcweir // -----------------------------------------------------------------------
85*cdf0e10cSrcweir 
86*cdf0e10cSrcweir ImplJobSetup::ImplJobSetup( const ImplJobSetup& rJobSetup ) :
87*cdf0e10cSrcweir 	maPrinterName( rJobSetup.maPrinterName ),
88*cdf0e10cSrcweir 	maDriver( rJobSetup.maDriver )
89*cdf0e10cSrcweir {
90*cdf0e10cSrcweir 	mnRefCount			= 1;
91*cdf0e10cSrcweir 	mnSystem			= rJobSetup.mnSystem;
92*cdf0e10cSrcweir 	meOrientation		= rJobSetup.meOrientation;
93*cdf0e10cSrcweir     meDuplexMode        = rJobSetup.meDuplexMode;
94*cdf0e10cSrcweir 	mnPaperBin			= rJobSetup.mnPaperBin;
95*cdf0e10cSrcweir 	mePaperFormat		= rJobSetup.mePaperFormat;
96*cdf0e10cSrcweir 	mnPaperWidth		= rJobSetup.mnPaperWidth;
97*cdf0e10cSrcweir 	mnPaperHeight		= rJobSetup.mnPaperHeight;
98*cdf0e10cSrcweir 	mnDriverDataLen 	= rJobSetup.mnDriverDataLen;
99*cdf0e10cSrcweir 	if ( rJobSetup.mpDriverData )
100*cdf0e10cSrcweir 	{
101*cdf0e10cSrcweir 		mpDriverData = (sal_uInt8*)rtl_allocateMemory( mnDriverDataLen );
102*cdf0e10cSrcweir 		memcpy( mpDriverData, rJobSetup.mpDriverData, mnDriverDataLen );
103*cdf0e10cSrcweir 	}
104*cdf0e10cSrcweir 	else
105*cdf0e10cSrcweir 		mpDriverData = NULL;
106*cdf0e10cSrcweir 	maValueMap 			= rJobSetup.maValueMap;
107*cdf0e10cSrcweir }
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir // -----------------------------------------------------------------------
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir ImplJobSetup::~ImplJobSetup()
112*cdf0e10cSrcweir {
113*cdf0e10cSrcweir 	rtl_freeMemory( mpDriverData );
114*cdf0e10cSrcweir }
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir // =======================================================================
117*cdf0e10cSrcweir 
118*cdf0e10cSrcweir ImplJobSetup* JobSetup::ImplGetData()
119*cdf0e10cSrcweir {
120*cdf0e10cSrcweir 	if ( !mpData )
121*cdf0e10cSrcweir 		mpData = new ImplJobSetup;
122*cdf0e10cSrcweir 	else if ( mpData->mnRefCount != 1 )
123*cdf0e10cSrcweir 	{
124*cdf0e10cSrcweir 		mpData->mnRefCount--;
125*cdf0e10cSrcweir 		mpData = new ImplJobSetup( *mpData );
126*cdf0e10cSrcweir 	}
127*cdf0e10cSrcweir 
128*cdf0e10cSrcweir 	return mpData;
129*cdf0e10cSrcweir }
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir // -----------------------------------------------------------------------
132*cdf0e10cSrcweir 
133*cdf0e10cSrcweir ImplJobSetup* JobSetup::ImplGetConstData()
134*cdf0e10cSrcweir {
135*cdf0e10cSrcweir 	if ( !mpData )
136*cdf0e10cSrcweir 		mpData = new ImplJobSetup;
137*cdf0e10cSrcweir 	return mpData;
138*cdf0e10cSrcweir }
139*cdf0e10cSrcweir 
140*cdf0e10cSrcweir // -----------------------------------------------------------------------
141*cdf0e10cSrcweir 
142*cdf0e10cSrcweir const ImplJobSetup* JobSetup::ImplGetConstData() const
143*cdf0e10cSrcweir {
144*cdf0e10cSrcweir 	if ( !mpData )
145*cdf0e10cSrcweir 		((JobSetup*)this)->mpData = new ImplJobSetup;
146*cdf0e10cSrcweir 	return mpData;
147*cdf0e10cSrcweir }
148*cdf0e10cSrcweir 
149*cdf0e10cSrcweir // =======================================================================
150*cdf0e10cSrcweir 
151*cdf0e10cSrcweir JobSetup::JobSetup()
152*cdf0e10cSrcweir {
153*cdf0e10cSrcweir 	DBG_CTOR( JobSetup, NULL );
154*cdf0e10cSrcweir 
155*cdf0e10cSrcweir 	mpData = NULL;
156*cdf0e10cSrcweir }
157*cdf0e10cSrcweir 
158*cdf0e10cSrcweir // -----------------------------------------------------------------------
159*cdf0e10cSrcweir 
160*cdf0e10cSrcweir JobSetup::JobSetup( const JobSetup& rJobSetup )
161*cdf0e10cSrcweir {
162*cdf0e10cSrcweir 	DBG_CTOR( JobSetup, NULL );
163*cdf0e10cSrcweir 	DBG_CHKOBJ( &rJobSetup, JobSetup, NULL );
164*cdf0e10cSrcweir 	DBG_ASSERT( !rJobSetup.mpData || (rJobSetup.mpData->mnRefCount < 0xFFFE), "JobSetup: RefCount overflow" );
165*cdf0e10cSrcweir 
166*cdf0e10cSrcweir 	mpData = rJobSetup.mpData;
167*cdf0e10cSrcweir 	if ( mpData )
168*cdf0e10cSrcweir 		mpData->mnRefCount++;
169*cdf0e10cSrcweir }
170*cdf0e10cSrcweir 
171*cdf0e10cSrcweir // -----------------------------------------------------------------------
172*cdf0e10cSrcweir 
173*cdf0e10cSrcweir JobSetup::~JobSetup()
174*cdf0e10cSrcweir {
175*cdf0e10cSrcweir 	DBG_DTOR( JobSetup, NULL );
176*cdf0e10cSrcweir 
177*cdf0e10cSrcweir 	if ( mpData )
178*cdf0e10cSrcweir 	{
179*cdf0e10cSrcweir 		if ( mpData->mnRefCount == 1 )
180*cdf0e10cSrcweir 			delete mpData;
181*cdf0e10cSrcweir 		else
182*cdf0e10cSrcweir 			mpData->mnRefCount--;
183*cdf0e10cSrcweir 	}
184*cdf0e10cSrcweir }
185*cdf0e10cSrcweir 
186*cdf0e10cSrcweir // -----------------------------------------------------------------------
187*cdf0e10cSrcweir 
188*cdf0e10cSrcweir XubString JobSetup::GetPrinterName() const
189*cdf0e10cSrcweir {
190*cdf0e10cSrcweir 	if ( mpData )
191*cdf0e10cSrcweir 		return mpData->maPrinterName;
192*cdf0e10cSrcweir 	else
193*cdf0e10cSrcweir 	{
194*cdf0e10cSrcweir 		XubString aName;
195*cdf0e10cSrcweir 		return aName;
196*cdf0e10cSrcweir 	}
197*cdf0e10cSrcweir }
198*cdf0e10cSrcweir 
199*cdf0e10cSrcweir // -----------------------------------------------------------------------
200*cdf0e10cSrcweir 
201*cdf0e10cSrcweir XubString JobSetup::GetDriverName() const
202*cdf0e10cSrcweir {
203*cdf0e10cSrcweir 	if ( mpData )
204*cdf0e10cSrcweir 		return mpData->maDriver;
205*cdf0e10cSrcweir 	else
206*cdf0e10cSrcweir 	{
207*cdf0e10cSrcweir 		XubString aDriver;
208*cdf0e10cSrcweir 		return aDriver;
209*cdf0e10cSrcweir 	}
210*cdf0e10cSrcweir }
211*cdf0e10cSrcweir 
212*cdf0e10cSrcweir // -----------------------------------------------------------------------
213*cdf0e10cSrcweir 
214*cdf0e10cSrcweir String JobSetup::GetValue( const String& rKey ) const
215*cdf0e10cSrcweir {
216*cdf0e10cSrcweir 	if( mpData )
217*cdf0e10cSrcweir 	{
218*cdf0e10cSrcweir 		::std::hash_map< ::rtl::OUString, ::rtl::OUString, ::rtl::OUStringHash >::const_iterator it;
219*cdf0e10cSrcweir 		it = mpData->maValueMap.find( rKey );
220*cdf0e10cSrcweir 		return it != mpData->maValueMap.end() ? String( it->second ) : String();
221*cdf0e10cSrcweir 	}
222*cdf0e10cSrcweir 	return String();
223*cdf0e10cSrcweir }
224*cdf0e10cSrcweir 
225*cdf0e10cSrcweir // -----------------------------------------------------------------------
226*cdf0e10cSrcweir 
227*cdf0e10cSrcweir void JobSetup::SetValue( const String& rKey, const String& rValue )
228*cdf0e10cSrcweir {
229*cdf0e10cSrcweir 	if( ! mpData )
230*cdf0e10cSrcweir 		mpData = new ImplJobSetup();
231*cdf0e10cSrcweir 
232*cdf0e10cSrcweir 	mpData->maValueMap[ rKey ] = rValue;
233*cdf0e10cSrcweir }
234*cdf0e10cSrcweir 
235*cdf0e10cSrcweir // -----------------------------------------------------------------------
236*cdf0e10cSrcweir 
237*cdf0e10cSrcweir JobSetup& JobSetup::operator=( const JobSetup& rJobSetup )
238*cdf0e10cSrcweir {
239*cdf0e10cSrcweir 	DBG_CHKTHIS( JobSetup, NULL );
240*cdf0e10cSrcweir 	DBG_CHKOBJ( &rJobSetup, JobSetup, NULL );
241*cdf0e10cSrcweir 	DBG_ASSERT( !rJobSetup.mpData || (rJobSetup.mpData->mnRefCount) < 0xFFFE, "JobSetup: RefCount overflow" );
242*cdf0e10cSrcweir 
243*cdf0e10cSrcweir 	// Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann
244*cdf0e10cSrcweir 	if ( rJobSetup.mpData )
245*cdf0e10cSrcweir 		rJobSetup.mpData->mnRefCount++;
246*cdf0e10cSrcweir 
247*cdf0e10cSrcweir 	// Wenn es keine statischen ImpDaten sind, dann loeschen, wenn es
248*cdf0e10cSrcweir 	// die letzte Referenz ist, sonst Referenzcounter decrementieren
249*cdf0e10cSrcweir 	if ( mpData )
250*cdf0e10cSrcweir 	{
251*cdf0e10cSrcweir 		if ( mpData->mnRefCount == 1 )
252*cdf0e10cSrcweir 			delete mpData;
253*cdf0e10cSrcweir 		else
254*cdf0e10cSrcweir 			mpData->mnRefCount--;
255*cdf0e10cSrcweir 	}
256*cdf0e10cSrcweir 
257*cdf0e10cSrcweir 	mpData = rJobSetup.mpData;
258*cdf0e10cSrcweir 
259*cdf0e10cSrcweir 	return *this;
260*cdf0e10cSrcweir }
261*cdf0e10cSrcweir 
262*cdf0e10cSrcweir // -----------------------------------------------------------------------
263*cdf0e10cSrcweir 
264*cdf0e10cSrcweir sal_Bool JobSetup::operator==( const JobSetup& rJobSetup ) const
265*cdf0e10cSrcweir {
266*cdf0e10cSrcweir 	DBG_CHKTHIS( JobSetup, NULL );
267*cdf0e10cSrcweir 	DBG_CHKOBJ( &rJobSetup, JobSetup, NULL );
268*cdf0e10cSrcweir 
269*cdf0e10cSrcweir 	if ( mpData == rJobSetup.mpData )
270*cdf0e10cSrcweir 		return sal_True;
271*cdf0e10cSrcweir 
272*cdf0e10cSrcweir 	if ( !mpData || !rJobSetup.mpData )
273*cdf0e10cSrcweir 		return sal_False;
274*cdf0e10cSrcweir 
275*cdf0e10cSrcweir 	ImplJobSetup* pData1 = mpData;
276*cdf0e10cSrcweir 	ImplJobSetup* pData2 = rJobSetup.mpData;
277*cdf0e10cSrcweir 	if ( (pData1->mnSystem			== pData2->mnSystem)				&&
278*cdf0e10cSrcweir 		 (pData1->maPrinterName 	== pData2->maPrinterName)			&&
279*cdf0e10cSrcweir 		 (pData1->maDriver			== pData2->maDriver)				&&
280*cdf0e10cSrcweir 		 (pData1->meOrientation 	== pData2->meOrientation)			&&
281*cdf0e10cSrcweir 		 (pData1->meDuplexMode      == pData2->meDuplexMode)			&&
282*cdf0e10cSrcweir 		 (pData1->mnPaperBin		== pData2->mnPaperBin)				&&
283*cdf0e10cSrcweir 		 (pData1->mePaperFormat 	== pData2->mePaperFormat)			&&
284*cdf0e10cSrcweir 		 (pData1->mnPaperWidth		== pData2->mnPaperWidth)			&&
285*cdf0e10cSrcweir 		 (pData1->mnPaperHeight 	== pData2->mnPaperHeight)			&&
286*cdf0e10cSrcweir 		 (pData1->mnDriverDataLen	== pData2->mnDriverDataLen) 		&&
287*cdf0e10cSrcweir 		 (memcmp( pData1->mpDriverData, pData2->mpDriverData, pData1->mnDriverDataLen ) == 0)															&&
288*cdf0e10cSrcweir 		 (pData1->maValueMap		== pData2->maValueMap)
289*cdf0e10cSrcweir 		 )
290*cdf0e10cSrcweir 		return sal_True;
291*cdf0e10cSrcweir 
292*cdf0e10cSrcweir 	return sal_False;
293*cdf0e10cSrcweir }
294*cdf0e10cSrcweir 
295*cdf0e10cSrcweir // -----------------------------------------------------------------------
296*cdf0e10cSrcweir 
297*cdf0e10cSrcweir SvStream& operator>>( SvStream& rIStream, JobSetup& rJobSetup )
298*cdf0e10cSrcweir {
299*cdf0e10cSrcweir 	DBG_ASSERTWARNING( rIStream.GetVersion(), "JobSetup::>> - Solar-Version not set on rOStream" );
300*cdf0e10cSrcweir 
301*cdf0e10cSrcweir 	// Zur Zeit haben wir noch kein neues FileFormat
302*cdf0e10cSrcweir //	  if ( rIStream.GetVersion() < JOBSET_FILEFORMAT2 )
303*cdf0e10cSrcweir 	{
304*cdf0e10cSrcweir 		sal_Size nFirstPos = rIStream.Tell();
305*cdf0e10cSrcweir 
306*cdf0e10cSrcweir 		sal_uInt16 nLen = 0;
307*cdf0e10cSrcweir 		rIStream >> nLen;
308*cdf0e10cSrcweir 		if ( !nLen )
309*cdf0e10cSrcweir 			return rIStream;
310*cdf0e10cSrcweir 
311*cdf0e10cSrcweir 		sal_uInt16 nSystem = 0;
312*cdf0e10cSrcweir 		rIStream >> nSystem;
313*cdf0e10cSrcweir 
314*cdf0e10cSrcweir 		char* pTempBuf = new char[nLen];
315*cdf0e10cSrcweir 		rIStream.Read( pTempBuf,  nLen - sizeof( nLen ) - sizeof( nSystem ) );
316*cdf0e10cSrcweir 		if ( nLen >= sizeof(ImplOldJobSetupData)+4 )
317*cdf0e10cSrcweir 		{
318*cdf0e10cSrcweir 			ImplOldJobSetupData* pData = (ImplOldJobSetupData*)pTempBuf;
319*cdf0e10cSrcweir 			if ( rJobSetup.mpData )
320*cdf0e10cSrcweir 			{
321*cdf0e10cSrcweir 				if ( rJobSetup.mpData->mnRefCount == 1 )
322*cdf0e10cSrcweir 					delete rJobSetup.mpData;
323*cdf0e10cSrcweir 				else
324*cdf0e10cSrcweir 					rJobSetup.mpData->mnRefCount--;
325*cdf0e10cSrcweir 			}
326*cdf0e10cSrcweir 
327*cdf0e10cSrcweir             rtl_TextEncoding aStreamEncoding = RTL_TEXTENCODING_UTF8;
328*cdf0e10cSrcweir             if( nSystem == JOBSET_FILE364_SYSTEM )
329*cdf0e10cSrcweir                 aStreamEncoding = rIStream.GetStreamCharSet();
330*cdf0e10cSrcweir 
331*cdf0e10cSrcweir 			rJobSetup.mpData = new ImplJobSetup;
332*cdf0e10cSrcweir 			ImplJobSetup* pJobData = rJobSetup.mpData;
333*cdf0e10cSrcweir 			pJobData->maPrinterName = UniString( pData->cPrinterName, aStreamEncoding );
334*cdf0e10cSrcweir 			pJobData->maDriver		= UniString( pData->cDriverName, aStreamEncoding );
335*cdf0e10cSrcweir 
336*cdf0e10cSrcweir 			// Sind es unsere neuen JobSetup-Daten?
337*cdf0e10cSrcweir 			if ( nSystem == JOBSET_FILE364_SYSTEM ||
338*cdf0e10cSrcweir 				 nSystem == JOBSET_FILE605_SYSTEM )
339*cdf0e10cSrcweir 			{
340*cdf0e10cSrcweir 				Impl364JobSetupData* pOldJobData	= (Impl364JobSetupData*)(pTempBuf + sizeof( ImplOldJobSetupData ));
341*cdf0e10cSrcweir 				sal_uInt16 nOldJobDataSize				= SVBT16ToShort( pOldJobData->nSize );
342*cdf0e10cSrcweir 				pJobData->mnSystem					= SVBT16ToShort( pOldJobData->nSystem );
343*cdf0e10cSrcweir 				pJobData->mnDriverDataLen			= SVBT32ToUInt32( pOldJobData->nDriverDataLen );
344*cdf0e10cSrcweir 				pJobData->meOrientation 			= (Orientation)SVBT16ToShort( pOldJobData->nOrientation );
345*cdf0e10cSrcweir                 pJobData->meDuplexMode              = DUPLEX_UNKNOWN;
346*cdf0e10cSrcweir 				pJobData->mnPaperBin				= SVBT16ToShort( pOldJobData->nPaperBin );
347*cdf0e10cSrcweir 				pJobData->mePaperFormat 			= (Paper)SVBT16ToShort( pOldJobData->nPaperFormat );
348*cdf0e10cSrcweir 				pJobData->mnPaperWidth				= (long)SVBT32ToUInt32( pOldJobData->nPaperWidth );
349*cdf0e10cSrcweir 				pJobData->mnPaperHeight 			= (long)SVBT32ToUInt32( pOldJobData->nPaperHeight );
350*cdf0e10cSrcweir 				if ( pJobData->mnDriverDataLen )
351*cdf0e10cSrcweir 				{
352*cdf0e10cSrcweir 					sal_uInt8* pDriverData = ((sal_uInt8*)pOldJobData) + nOldJobDataSize;
353*cdf0e10cSrcweir 					pJobData->mpDriverData = (sal_uInt8*)rtl_allocateMemory( pJobData->mnDriverDataLen );
354*cdf0e10cSrcweir 					memcpy( pJobData->mpDriverData, pDriverData, pJobData->mnDriverDataLen );
355*cdf0e10cSrcweir 				}
356*cdf0e10cSrcweir 				if( nSystem == JOBSET_FILE605_SYSTEM )
357*cdf0e10cSrcweir 				{
358*cdf0e10cSrcweir 					rIStream.Seek( nFirstPos + sizeof( ImplOldJobSetupData ) + 4 + sizeof( Impl364JobSetupData ) + pJobData->mnDriverDataLen );
359*cdf0e10cSrcweir 					while( rIStream.Tell() < nFirstPos + nLen )
360*cdf0e10cSrcweir 					{
361*cdf0e10cSrcweir 						String aKey, aValue;
362*cdf0e10cSrcweir 						rIStream.ReadByteString( aKey, RTL_TEXTENCODING_UTF8 );
363*cdf0e10cSrcweir 						rIStream.ReadByteString( aValue, RTL_TEXTENCODING_UTF8 );
364*cdf0e10cSrcweir                         if( aKey.EqualsAscii( "COMPAT_DUPLEX_MODE" ) )
365*cdf0e10cSrcweir                         {
366*cdf0e10cSrcweir                             if( aValue.EqualsAscii( "DUPLEX_UNKNOWN" ) )
367*cdf0e10cSrcweir                                 pJobData->meDuplexMode = DUPLEX_UNKNOWN;
368*cdf0e10cSrcweir                             else if( aValue.EqualsAscii( "DUPLEX_OFF" ) )
369*cdf0e10cSrcweir                                 pJobData->meDuplexMode = DUPLEX_OFF;
370*cdf0e10cSrcweir                             else if( aValue.EqualsAscii( "DUPLEX_SHORTEDGE" ) )
371*cdf0e10cSrcweir                                 pJobData->meDuplexMode = DUPLEX_SHORTEDGE;
372*cdf0e10cSrcweir                             else if( aValue.EqualsAscii( "DUPLEX_LONGEDGE" ) )
373*cdf0e10cSrcweir                                 pJobData->meDuplexMode = DUPLEX_LONGEDGE;
374*cdf0e10cSrcweir                         }
375*cdf0e10cSrcweir                         else
376*cdf0e10cSrcweir                             pJobData->maValueMap[ aKey ] = aValue;
377*cdf0e10cSrcweir 					}
378*cdf0e10cSrcweir 					DBG_ASSERT( rIStream.Tell() == nFirstPos+nLen, "corrupted job setup" );
379*cdf0e10cSrcweir 					// ensure correct stream position
380*cdf0e10cSrcweir 					rIStream.Seek( nFirstPos + nLen );
381*cdf0e10cSrcweir 				}
382*cdf0e10cSrcweir 			}
383*cdf0e10cSrcweir 		}
384*cdf0e10cSrcweir 		delete[] pTempBuf;
385*cdf0e10cSrcweir 	}
386*cdf0e10cSrcweir /*
387*cdf0e10cSrcweir 	else
388*cdf0e10cSrcweir 	{
389*cdf0e10cSrcweir 	}
390*cdf0e10cSrcweir */
391*cdf0e10cSrcweir 
392*cdf0e10cSrcweir 	return rIStream;
393*cdf0e10cSrcweir }
394*cdf0e10cSrcweir 
395*cdf0e10cSrcweir // -----------------------------------------------------------------------
396*cdf0e10cSrcweir 
397*cdf0e10cSrcweir SvStream& operator<<( SvStream& rOStream, const JobSetup& rJobSetup )
398*cdf0e10cSrcweir {
399*cdf0e10cSrcweir 	DBG_ASSERTWARNING( rOStream.GetVersion(), "JobSetup::<< - Solar-Version not set on rOStream" );
400*cdf0e10cSrcweir 
401*cdf0e10cSrcweir 	// Zur Zeit haben wir noch kein neues FileFormat
402*cdf0e10cSrcweir //	  if ( rOStream.GetVersion() < JOBSET_FILEFORMAT2 )
403*cdf0e10cSrcweir 	{
404*cdf0e10cSrcweir 		sal_uInt16 nLen = 0;
405*cdf0e10cSrcweir 		if ( !rJobSetup.mpData )
406*cdf0e10cSrcweir 			rOStream << nLen;
407*cdf0e10cSrcweir 		else
408*cdf0e10cSrcweir 		{
409*cdf0e10cSrcweir 			sal_uInt16 nSystem = JOBSET_FILE605_SYSTEM;
410*cdf0e10cSrcweir 
411*cdf0e10cSrcweir 			const ImplJobSetup* pJobData = rJobSetup.ImplGetConstData();
412*cdf0e10cSrcweir 			Impl364JobSetupData aOldJobData;
413*cdf0e10cSrcweir 			sal_uInt16				nOldJobDataSize = sizeof( aOldJobData );
414*cdf0e10cSrcweir 			ShortToSVBT16( nOldJobDataSize, aOldJobData.nSize );
415*cdf0e10cSrcweir 			ShortToSVBT16( pJobData->mnSystem, aOldJobData.nSystem );
416*cdf0e10cSrcweir 			UInt32ToSVBT32( pJobData->mnDriverDataLen, aOldJobData.nDriverDataLen );
417*cdf0e10cSrcweir 			ShortToSVBT16( (sal_uInt16)(pJobData->meOrientation), aOldJobData.nOrientation );
418*cdf0e10cSrcweir 			ShortToSVBT16( pJobData->mnPaperBin, aOldJobData.nPaperBin );
419*cdf0e10cSrcweir 			ShortToSVBT16( (sal_uInt16)(pJobData->mePaperFormat), aOldJobData.nPaperFormat );
420*cdf0e10cSrcweir 			UInt32ToSVBT32( (sal_uLong)(pJobData->mnPaperWidth), aOldJobData.nPaperWidth );
421*cdf0e10cSrcweir 			UInt32ToSVBT32( (sal_uLong)(pJobData->mnPaperHeight), aOldJobData.nPaperHeight );
422*cdf0e10cSrcweir 
423*cdf0e10cSrcweir 			ImplOldJobSetupData aOldData;
424*cdf0e10cSrcweir 			memset( &aOldData, 0, sizeof( aOldData ) );
425*cdf0e10cSrcweir 			ByteString aPrnByteName( rJobSetup.GetPrinterName(), RTL_TEXTENCODING_UTF8 );
426*cdf0e10cSrcweir 			strncpy( aOldData.cPrinterName, aPrnByteName.GetBuffer(), 63 );
427*cdf0e10cSrcweir 			ByteString aDriverByteName( rJobSetup.GetDriverName(), RTL_TEXTENCODING_UTF8 );
428*cdf0e10cSrcweir 			strncpy( aOldData.cDriverName, aDriverByteName.GetBuffer(), 31 );
429*cdf0e10cSrcweir //			nLen = sizeof( aOldData ) + 4 + nOldJobDataSize + pJobData->mnDriverDataLen;
430*cdf0e10cSrcweir 			int nPos = rOStream.Tell();
431*cdf0e10cSrcweir 			rOStream << nLen;
432*cdf0e10cSrcweir 			rOStream << nSystem;
433*cdf0e10cSrcweir 			rOStream.Write( (char*)&aOldData, sizeof( aOldData ) );
434*cdf0e10cSrcweir 			rOStream.Write( (char*)&aOldJobData, nOldJobDataSize );
435*cdf0e10cSrcweir 			rOStream.Write( (char*)pJobData->mpDriverData, pJobData->mnDriverDataLen );
436*cdf0e10cSrcweir 			::std::hash_map< ::rtl::OUString, ::rtl::OUString, ::rtl::OUStringHash >::const_iterator it;
437*cdf0e10cSrcweir 			for( it = pJobData->maValueMap.begin(); it != pJobData->maValueMap.end(); ++it )
438*cdf0e10cSrcweir 			{
439*cdf0e10cSrcweir 				rOStream.WriteByteString( it->first, RTL_TEXTENCODING_UTF8 );
440*cdf0e10cSrcweir 				rOStream.WriteByteString( it->second, RTL_TEXTENCODING_UTF8 );
441*cdf0e10cSrcweir 			}
442*cdf0e10cSrcweir             rOStream.WriteByteString( "COMPAT_DUPLEX_MODE" ) ;
443*cdf0e10cSrcweir             switch( pJobData->meDuplexMode )
444*cdf0e10cSrcweir             {
445*cdf0e10cSrcweir             case DUPLEX_UNKNOWN: rOStream.WriteByteString( "DUPLEX_UNKNOWN" );break;
446*cdf0e10cSrcweir             case DUPLEX_OFF: rOStream.WriteByteString( "DUPLEX_OFF" );break;
447*cdf0e10cSrcweir             case DUPLEX_SHORTEDGE: rOStream.WriteByteString( "DUPLEX_SHORTEDGE" );break;
448*cdf0e10cSrcweir             case DUPLEX_LONGEDGE: rOStream.WriteByteString( "DUPLEX_LONGEDGE" );break;
449*cdf0e10cSrcweir             }
450*cdf0e10cSrcweir 			nLen = sal::static_int_cast<sal_uInt16>(rOStream.Tell() - nPos);
451*cdf0e10cSrcweir 			rOStream.Seek( nPos );
452*cdf0e10cSrcweir 			rOStream << nLen;
453*cdf0e10cSrcweir 			rOStream.Seek( nPos + nLen );
454*cdf0e10cSrcweir 		}
455*cdf0e10cSrcweir 	}
456*cdf0e10cSrcweir /*
457*cdf0e10cSrcweir 	else
458*cdf0e10cSrcweir 	{
459*cdf0e10cSrcweir 	}
460*cdf0e10cSrcweir */
461*cdf0e10cSrcweir 
462*cdf0e10cSrcweir 	return rOStream;
463*cdf0e10cSrcweir }
464