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