xref: /aoo41x/main/sw/source/filter/basflt/shellio.cxx (revision 6fddd742)
1efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5efeef26fSAndrew Rist  * distributed with this work for additional information
6efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10efeef26fSAndrew Rist  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12efeef26fSAndrew Rist  *
13efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17efeef26fSAndrew Rist  * specific language governing permissions and limitations
18efeef26fSAndrew Rist  * under the License.
19efeef26fSAndrew Rist  *
20efeef26fSAndrew Rist  *************************************************************/
21efeef26fSAndrew Rist 
22efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <hintids.hxx>
28cdf0e10cSrcweir #include <tools/date.hxx>
29cdf0e10cSrcweir #include <tools/time.hxx>
30cdf0e10cSrcweir #include <svl/urihelper.hxx>
31cdf0e10cSrcweir #include <svl/fstathelper.hxx>
32cdf0e10cSrcweir #include <unotools/moduleoptions.hxx>
33cdf0e10cSrcweir #include <sfx2/docfile.hxx>
34cdf0e10cSrcweir #include <editeng/lrspitem.hxx>
35cdf0e10cSrcweir #include <editeng/ulspitem.hxx>
36cdf0e10cSrcweir #include <editeng/boxitem.hxx>
37cdf0e10cSrcweir #include <editeng/paperinf.hxx>
38cdf0e10cSrcweir #include <node.hxx>
39cdf0e10cSrcweir #include <docary.hxx>
40cdf0e10cSrcweir #include <fmtanchr.hxx>
41cdf0e10cSrcweir #include <fmtfsize.hxx>
42cdf0e10cSrcweir #include <fmtpdsc.hxx>
43cdf0e10cSrcweir #include <swtypes.hxx>
44cdf0e10cSrcweir #include <shellio.hxx>
45cdf0e10cSrcweir #include <doc.hxx>
46cdf0e10cSrcweir #include <IDocumentUndoRedo.hxx>
47cdf0e10cSrcweir #include <pam.hxx>
48cdf0e10cSrcweir #include <editsh.hxx>
49cdf0e10cSrcweir #include <undobj.hxx>			// fuer Undo Insert-Dokument
50cdf0e10cSrcweir #include <swundo.hxx>			// fuer Undo Insert-Dokument
51cdf0e10cSrcweir #include <swtable.hxx>
52cdf0e10cSrcweir #include <tblsel.hxx>
53cdf0e10cSrcweir #include <pagedesc.hxx>
54cdf0e10cSrcweir #include <poolfmt.hxx>
55cdf0e10cSrcweir #include <fltini.hxx>
56cdf0e10cSrcweir #include <docsh.hxx>
57cdf0e10cSrcweir #include <redline.hxx>
58cdf0e10cSrcweir #include <swerror.h>
59cdf0e10cSrcweir 
60cdf0e10cSrcweir #include <paratr.hxx>
61cdf0e10cSrcweir 
62cdf0e10cSrcweir // --> OD 2007-03-30 #i73788#
63cdf0e10cSrcweir #include <pausethreadstarting.hxx>
64cdf0e10cSrcweir // <--
65cdf0e10cSrcweir 
66cdf0e10cSrcweir 
67cdf0e10cSrcweir using namespace ::com::sun::star;
68cdf0e10cSrcweir 
69cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////
70cdf0e10cSrcweir 
Read(const Reader & rOptions)71cdf0e10cSrcweir sal_uLong SwReader::Read( const Reader& rOptions )
72cdf0e10cSrcweir {
73cdf0e10cSrcweir 	// Variable uebertragen
74cdf0e10cSrcweir 	Reader* po = (Reader*) &rOptions;
75cdf0e10cSrcweir 	po->pStrm = pStrm;
76cdf0e10cSrcweir 	po->pStg  = pStg;
77cdf0e10cSrcweir     po->xStg  = xStg;
78cdf0e10cSrcweir 	po->bInsertMode = 0 != pCrsr;
79cdf0e10cSrcweir 
80cdf0e10cSrcweir 	// ist ein Medium angegeben, dann aus diesem die Streams besorgen
81cdf0e10cSrcweir 	if( 0 != (po->pMedium = pMedium ) &&
82cdf0e10cSrcweir 		!po->SetStrmStgPtr() )
83cdf0e10cSrcweir 	{
84cdf0e10cSrcweir 		po->SetReadUTF8( sal_False );
85cdf0e10cSrcweir 		po->SetBlockMode( sal_False );
86cdf0e10cSrcweir 		po->SetOrganizerMode( sal_False );
87cdf0e10cSrcweir         po->SetIgnoreHTMLComments( sal_False );
88cdf0e10cSrcweir 		return ERR_SWG_FILE_FORMAT_ERROR;
89cdf0e10cSrcweir 	}
90cdf0e10cSrcweir 
91cdf0e10cSrcweir 	sal_uLong nError = 0L;
92cdf0e10cSrcweir 
93cdf0e10cSrcweir 	GetDoc();
94cdf0e10cSrcweir 
95cdf0e10cSrcweir 	// am Sw3-Reader noch den pIo-Pointer "loeschen"
96cdf0e10cSrcweir     /*
97cdf0e10cSrcweir 	if( po == ReadSw3 && pDoc->GetDocShell() &&
98cdf0e10cSrcweir 		((Sw3Reader*)po)->GetSw3Io() != pDoc->GetDocShell()->GetIoSystem() )
99cdf0e10cSrcweir             ((Sw3Reader*)po)->SetSw3Io( pDoc->GetDocShell()->GetIoSystem() );*/
100cdf0e10cSrcweir 
101cdf0e10cSrcweir 	// waehrend des einlesens kein OLE-Modified rufen
102cdf0e10cSrcweir 	Link aOLELink( pDoc->GetOle2Link() );
103cdf0e10cSrcweir 	pDoc->SetOle2Link( Link() );
104cdf0e10cSrcweir 
105cdf0e10cSrcweir     pDoc->SetInReading( true );
106cdf0e10cSrcweir     pDoc->SetInXMLImport( 0 != dynamic_cast< XMLReader* >(po) );
107cdf0e10cSrcweir 
108cdf0e10cSrcweir 	SwPaM *pPam;
109cdf0e10cSrcweir 	if( pCrsr )
110cdf0e10cSrcweir 		pPam = pCrsr;
111cdf0e10cSrcweir 	else
112cdf0e10cSrcweir 	{
113cdf0e10cSrcweir 		// Wenn der Reader nicht mit einem Shell konstruiert wurde,
114cdf0e10cSrcweir 		// selber einen Pam machen.
115cdf0e10cSrcweir 		SwNodeIndex nNode( pDoc->GetNodes().GetEndOfContent(), -1 );
116cdf0e10cSrcweir 		pPam = new SwPaM( nNode );
117cdf0e10cSrcweir 		// Bei Web-Dokumenten wird die Default-Vorlage schon im InitNew
118cdf0e10cSrcweir 		// gesetzt und braucht deshalb nicht nochmal gesetzt zu werden.
119cdf0e10cSrcweir 		// Das gilt natuerlich nicht, wenn der Filter nicht der HTML-Filter
120cdf0e10cSrcweir 		// ist oder im ConvertFrom zuvor ein SetTemplateName gerufen
121cdf0e10cSrcweir 		// wurde.
122cdf0e10cSrcweir 		if( !pDoc->get(IDocumentSettingAccess::HTML_MODE) || ReadHTML != po || !po->pTemplate  )
123cdf0e10cSrcweir 			po->SetTemplate( *pDoc );
124cdf0e10cSrcweir 	}
125cdf0e10cSrcweir 
126cdf0e10cSrcweir 	// Pams sind ringfoermig verkettet. Aufhoeren, wenn man wieder beim
127cdf0e10cSrcweir 	// ersten ist.
128cdf0e10cSrcweir 	SwPaM *pEnd = pPam;
129cdf0e10cSrcweir 	SwUndoInsDoc* pUndo = 0;
130cdf0e10cSrcweir 
131cdf0e10cSrcweir 	sal_Bool bReadPageDescs = sal_False;
132cdf0e10cSrcweir     bool const bDocUndo = pDoc->GetIDocumentUndoRedo().DoesUndo();
133cdf0e10cSrcweir 	sal_Bool bSaveUndo = bDocUndo && pCrsr;
134cdf0e10cSrcweir 	if( bSaveUndo )
135cdf0e10cSrcweir 	{
136cdf0e10cSrcweir 		// das Einlesen von Seitenvorlagen ist nicht Undofaehig!
137cdf0e10cSrcweir 		if( 0 != ( bReadPageDescs = po->aOpt.IsPageDescs() ) )
138cdf0e10cSrcweir 		{
139cdf0e10cSrcweir 			bSaveUndo = sal_False;
140cdf0e10cSrcweir             pDoc->GetIDocumentUndoRedo().DelAllUndoObj();
141cdf0e10cSrcweir         }
142cdf0e10cSrcweir         else
143cdf0e10cSrcweir         {
144cdf0e10cSrcweir             pDoc->GetIDocumentUndoRedo().ClearRedo();
145cdf0e10cSrcweir             pDoc->GetIDocumentUndoRedo().StartUndo( UNDO_INSDOKUMENT, NULL );
146cdf0e10cSrcweir         }
147cdf0e10cSrcweir 	}
148cdf0e10cSrcweir     pDoc->GetIDocumentUndoRedo().DoUndo(false);
149cdf0e10cSrcweir 
150cdf0e10cSrcweir 	SwNodeIndex aSplitIdx( pDoc->GetNodes() );
151cdf0e10cSrcweir 
152cdf0e10cSrcweir 	RedlineMode_t eOld = pDoc->GetRedlineMode();
153cdf0e10cSrcweir     RedlineMode_t ePostReadRedlineMode( nsRedlineMode_t::REDLINE_IGNORE );
154cdf0e10cSrcweir 
155cdf0e10cSrcweir 	// Array von FlyFormaten
156cdf0e10cSrcweir 	SwSpzFrmFmts aFlyFrmArr;
157cdf0e10cSrcweir 	// only read templates? then ignore multi selection!
158cdf0e10cSrcweir 	sal_Bool bFmtsOnly = po->aOpt.IsFmtsOnly();
159cdf0e10cSrcweir 
160cdf0e10cSrcweir 	while( sal_True )
161cdf0e10cSrcweir 	{
162cdf0e10cSrcweir 		if( bSaveUndo )
163cdf0e10cSrcweir 			pUndo = new SwUndoInsDoc( *pPam );
164cdf0e10cSrcweir 
165cdf0e10cSrcweir 		pDoc->SetRedlineMode_intern( nsRedlineMode_t::REDLINE_IGNORE );
166cdf0e10cSrcweir 
167cdf0e10cSrcweir 		SwPaM* pUndoPam = 0;
168cdf0e10cSrcweir 		if( bDocUndo || pCrsr )
169cdf0e10cSrcweir 		{
170cdf0e10cSrcweir 			// Pam auf den Node davor setzen damit er nicht mit verschoben wird
171cdf0e10cSrcweir 			const SwNodeIndex& rTmp = pPam->GetPoint()->nNode;
172cdf0e10cSrcweir 			pUndoPam = new SwPaM( rTmp, rTmp, 0, -1 );
173cdf0e10cSrcweir 		}
174cdf0e10cSrcweir 
175cdf0e10cSrcweir 		// Speicher mal alle Fly's
176cdf0e10cSrcweir 		if( pCrsr )
177cdf0e10cSrcweir 			aFlyFrmArr.Insert( pDoc->GetSpzFrmFmts(), 0L );
178cdf0e10cSrcweir 
179cdf0e10cSrcweir 		xub_StrLen nSttCntnt = pPam->GetPoint()->nContent.GetIndex();
180cdf0e10cSrcweir 
181cdf0e10cSrcweir 		// damit fuer alle Reader die Ende-Position immer stimmt, hier
182cdf0e10cSrcweir 		// pflegen.
183cdf0e10cSrcweir 		SwCntntNode* pCNd = pPam->GetCntntNode();
184cdf0e10cSrcweir 		xub_StrLen nEndCntnt = pCNd ? pCNd->Len() - nSttCntnt : 0;
185cdf0e10cSrcweir 		SwNodeIndex aEndPos( pPam->GetPoint()->nNode, 1 );
186cdf0e10cSrcweir 
187cdf0e10cSrcweir 		pDoc->SetRedlineMode_intern( eOld );
188cdf0e10cSrcweir 
189cdf0e10cSrcweir         nError = po->Read( *pDoc, GetBaseURL(), *pPam, aFileName );
190cdf0e10cSrcweir 
191cdf0e10cSrcweir         // an ODF document may contain redline mode in settings.xml; save it!
192cdf0e10cSrcweir         ePostReadRedlineMode = pDoc->GetRedlineMode();
193cdf0e10cSrcweir 
194cdf0e10cSrcweir 		pDoc->SetRedlineMode_intern( nsRedlineMode_t::REDLINE_IGNORE );
195cdf0e10cSrcweir 
196cdf0e10cSrcweir 		if( !IsError( nError )) 	// dann setzen wir das Ende mal richtig
197cdf0e10cSrcweir 		{
198cdf0e10cSrcweir 			aEndPos--;
199cdf0e10cSrcweir 			pCNd = aEndPos.GetNode().GetCntntNode();
200cdf0e10cSrcweir 			if( !pCNd && 0 == ( pCNd = pDoc->GetNodes().GoPrevious( &aEndPos ) ))
201cdf0e10cSrcweir 				pCNd = pDoc->GetNodes().GoNext( &aEndPos );
202cdf0e10cSrcweir 
203cdf0e10cSrcweir 			pPam->GetPoint()->nNode = aEndPos;
204cdf0e10cSrcweir 			xub_StrLen nLen = pCNd->Len();
205cdf0e10cSrcweir 			if( nLen < nEndCntnt )
206cdf0e10cSrcweir 				nEndCntnt = 0;
207cdf0e10cSrcweir 			else
208cdf0e10cSrcweir 				nEndCntnt = nLen - nEndCntnt;
209cdf0e10cSrcweir 			pPam->GetPoint()->nContent.Assign( pCNd, nEndCntnt );
210cdf0e10cSrcweir 		}
211cdf0e10cSrcweir 
212cdf0e10cSrcweir 		if( pCrsr )
213cdf0e10cSrcweir 		{
214cdf0e10cSrcweir 			*pUndoPam->GetMark() = *pPam->GetPoint();
215cdf0e10cSrcweir 			pUndoPam->GetPoint()->nNode++;
216cdf0e10cSrcweir 			SwNode* pNd = pUndoPam->GetNode();
217cdf0e10cSrcweir 			if( pNd->IsCntntNode() )
218cdf0e10cSrcweir 				pUndoPam->GetPoint()->nContent.Assign(
219cdf0e10cSrcweir 									(SwCntntNode*)pNd, nSttCntnt );
220cdf0e10cSrcweir 			else
221cdf0e10cSrcweir 				pUndoPam->GetPoint()->nContent.Assign( 0, 0 );
222cdf0e10cSrcweir 
223cdf0e10cSrcweir 			int bChkHeaderFooter = pNd->FindHeaderStartNode() ||
224cdf0e10cSrcweir 								   pNd->FindFooterStartNode();
225cdf0e10cSrcweir 
226cdf0e10cSrcweir 			// Suche alle neuen Fly's und speicher sie als einzelne Undo
227cdf0e10cSrcweir 			// Objecte
228cdf0e10cSrcweir 			for( sal_uInt16 n = 0; n < pDoc->GetSpzFrmFmts()->Count(); ++n )
229cdf0e10cSrcweir 			{
230cdf0e10cSrcweir 				SwFrmFmt* pFrmFmt = (*pDoc->GetSpzFrmFmts())[ n ];
231cdf0e10cSrcweir 				const SwFmtAnchor& rAnchor = pFrmFmt->GetAnchor();
232cdf0e10cSrcweir 				if( USHRT_MAX == aFlyFrmArr.GetPos( pFrmFmt) )
233cdf0e10cSrcweir 				{
234cdf0e10cSrcweir                     SwPosition const*const pFrameAnchor(
235cdf0e10cSrcweir                             rAnchor.GetCntntAnchor());
236cdf0e10cSrcweir                     if  (   (FLY_AT_PAGE == rAnchor.GetAnchorId())
237cdf0e10cSrcweir                         ||  (   pFrameAnchor
238cdf0e10cSrcweir                             &&  (   (   (FLY_AT_PARA == rAnchor.GetAnchorId())
239cdf0e10cSrcweir                                     &&  (   (pUndoPam->GetPoint()->nNode ==
240cdf0e10cSrcweir                                              pFrameAnchor->nNode)
241cdf0e10cSrcweir                                         ||  (pUndoPam->GetMark()->nNode ==
242cdf0e10cSrcweir                                              pFrameAnchor->nNode)
243cdf0e10cSrcweir                                         )
244cdf0e10cSrcweir                                     )
245cdf0e10cSrcweir                                 // #i97570# also check frames anchored AT char
246cdf0e10cSrcweir                                 ||  (   (FLY_AT_CHAR == rAnchor.GetAnchorId())
247cdf0e10cSrcweir                                     &&  !IsDestroyFrameAnchoredAtChar(
248cdf0e10cSrcweir                                               *pFrameAnchor,
249cdf0e10cSrcweir                                               *pUndoPam->GetPoint(),
250cdf0e10cSrcweir                                               *pUndoPam->GetMark())
251cdf0e10cSrcweir                                     )
252cdf0e10cSrcweir                                 )
253cdf0e10cSrcweir                             )
254cdf0e10cSrcweir                         )
255cdf0e10cSrcweir 					{
256cdf0e10cSrcweir 						if( bChkHeaderFooter &&
257cdf0e10cSrcweir                             (FLY_AT_PARA == rAnchor.GetAnchorId()) &&
258cdf0e10cSrcweir 							RES_DRAWFRMFMT == pFrmFmt->Which() )
259cdf0e10cSrcweir 						{
260cdf0e10cSrcweir                             // DrawObjecte in Kopf-/Fusszeilen ist nicht
261cdf0e10cSrcweir 							// erlaubt!
262cdf0e10cSrcweir 							pFrmFmt->DelFrms();
263cdf0e10cSrcweir 							pDoc->DelFrmFmt( pFrmFmt );
264cdf0e10cSrcweir 							--n;
265cdf0e10cSrcweir 						}
266cdf0e10cSrcweir 						else
267cdf0e10cSrcweir 						{
268cdf0e10cSrcweir 							if( bSaveUndo )
269cdf0e10cSrcweir 							{
270cdf0e10cSrcweir 								pDoc->SetRedlineMode_intern( eOld );
271cdf0e10cSrcweir                                 // UGLY: temp. enable undo
272cdf0e10cSrcweir                                 pDoc->GetIDocumentUndoRedo().DoUndo(true);
273cdf0e10cSrcweir                                 pDoc->GetIDocumentUndoRedo().AppendUndo(
274cdf0e10cSrcweir                                     new SwUndoInsLayFmt( pFrmFmt,0,0 ) );
275cdf0e10cSrcweir                                 pDoc->GetIDocumentUndoRedo().DoUndo(false);
276cdf0e10cSrcweir 								pDoc->SetRedlineMode_intern( nsRedlineMode_t::REDLINE_IGNORE );
277cdf0e10cSrcweir 							}
278cdf0e10cSrcweir 							if( pFrmFmt->GetDepends() )
279cdf0e10cSrcweir 							{
280cdf0e10cSrcweir 								// beim Insert legen Draw-Objecte einen Frame an
281cdf0e10cSrcweir 								// also weg damit.
282cdf0e10cSrcweir 								pFrmFmt->DelFrms();
283cdf0e10cSrcweir 							}
284cdf0e10cSrcweir 
285cdf0e10cSrcweir                             if (FLY_AT_PAGE == rAnchor.GetAnchorId())
286cdf0e10cSrcweir                             {
287cdf0e10cSrcweir 								if( !rAnchor.GetCntntAnchor() )
288cdf0e10cSrcweir                                 {
289cdf0e10cSrcweir 									pFrmFmt->MakeFrms();
290cdf0e10cSrcweir                                 }
291cdf0e10cSrcweir 								else if( pCrsr )
292cdf0e10cSrcweir                                 {
293*6fddd742SOliver-Rainer Wittmann 									pDoc->SetContainsAtPageObjWithContentAnchor( true );
294cdf0e10cSrcweir                                 }
295cdf0e10cSrcweir 							}
296cdf0e10cSrcweir 							else
297cdf0e10cSrcweir 								pFrmFmt->MakeFrms();
298cdf0e10cSrcweir 						}
299cdf0e10cSrcweir 					}
300cdf0e10cSrcweir 				}
301cdf0e10cSrcweir 			}
302cdf0e10cSrcweir 			if( aFlyFrmArr.Count() )
303cdf0e10cSrcweir 				aFlyFrmArr.Remove( 0, aFlyFrmArr.Count() );
304cdf0e10cSrcweir 
305cdf0e10cSrcweir 			pDoc->SetRedlineMode_intern( eOld );
306cdf0e10cSrcweir 			if( pDoc->IsRedlineOn() )
307cdf0e10cSrcweir 				pDoc->AppendRedline( new SwRedline( nsRedlineType_t::REDLINE_INSERT, *pUndoPam ), true);
308cdf0e10cSrcweir 			else
309cdf0e10cSrcweir 				pDoc->SplitRedline( *pUndoPam );
310cdf0e10cSrcweir 			pDoc->SetRedlineMode_intern( nsRedlineMode_t::REDLINE_IGNORE );
311cdf0e10cSrcweir 		}
312cdf0e10cSrcweir 		if( bSaveUndo )
313cdf0e10cSrcweir 		{
314cdf0e10cSrcweir 			pDoc->SetRedlineMode_intern( eOld );
315cdf0e10cSrcweir 			pUndo->SetInsertRange( *pUndoPam, sal_False );
316cdf0e10cSrcweir             // UGLY: temp. enable undo
317cdf0e10cSrcweir             pDoc->GetIDocumentUndoRedo().DoUndo(true);
318cdf0e10cSrcweir             pDoc->GetIDocumentUndoRedo().AppendUndo( pUndo );
319cdf0e10cSrcweir             pDoc->GetIDocumentUndoRedo().DoUndo(false);
320cdf0e10cSrcweir 			pDoc->SetRedlineMode_intern( nsRedlineMode_t::REDLINE_IGNORE );
321cdf0e10cSrcweir 		}
322cdf0e10cSrcweir 
323cdf0e10cSrcweir 		delete pUndoPam;
324cdf0e10cSrcweir 
325cdf0e10cSrcweir 		pPam = (SwPaM *) pPam->GetNext();
326cdf0e10cSrcweir 		if( pPam == pEnd )
327cdf0e10cSrcweir 			break;
328cdf0e10cSrcweir 
329cdf0e10cSrcweir 		// only read templates? then ignore multi selection! Bug 68593
330cdf0e10cSrcweir 		if( bFmtsOnly )
331cdf0e10cSrcweir 			break;
332cdf0e10cSrcweir 
333cdf0e10cSrcweir 		/*
334cdf0e10cSrcweir 		 * !!! man muss selbst den Status vom Stream zuruecksetzen. !!!
335cdf0e10cSrcweir 		 *	   Beim seekg wird der akt. Status, eof- und bad-Bit
336cdf0e10cSrcweir 		 *	   gesetzt, warum weiss keiner
337cdf0e10cSrcweir 		 */
338cdf0e10cSrcweir 		if( pStrm )
339cdf0e10cSrcweir 		{
340cdf0e10cSrcweir 			pStrm->Seek(0);
341cdf0e10cSrcweir 			pStrm->ResetError();
342cdf0e10cSrcweir 		}
343cdf0e10cSrcweir 	}
344cdf0e10cSrcweir 
345cdf0e10cSrcweir     pDoc->SetInReading( false );
346cdf0e10cSrcweir     pDoc->SetInXMLImport( false );
347cdf0e10cSrcweir 
348cdf0e10cSrcweir     pDoc->InvalidateNumRules();
349cdf0e10cSrcweir     pDoc->UpdateNumRule();
350cdf0e10cSrcweir     pDoc->ChkCondColls();
351cdf0e10cSrcweir 	pDoc->SetAllUniqueFlyNames();
352*6fddd742SOliver-Rainer Wittmann     pDoc->SetLoaded( true );
353cdf0e10cSrcweir 
354cdf0e10cSrcweir     pDoc->GetIDocumentUndoRedo().DoUndo(bDocUndo);
355cdf0e10cSrcweir     if (!bReadPageDescs)
356cdf0e10cSrcweir     {
357cdf0e10cSrcweir 		if( bSaveUndo )
358cdf0e10cSrcweir 		{
359cdf0e10cSrcweir 			pDoc->SetRedlineMode_intern( eOld );
360cdf0e10cSrcweir             pDoc->GetIDocumentUndoRedo().EndUndo( UNDO_INSDOKUMENT, NULL );
361cdf0e10cSrcweir 			pDoc->SetRedlineMode_intern( nsRedlineMode_t::REDLINE_IGNORE );
362cdf0e10cSrcweir 		}
363cdf0e10cSrcweir 	}
364cdf0e10cSrcweir 
365cdf0e10cSrcweir 	// Wenn der Pam nur fuers Lesen konstruiert wurde, jetzt zerstoeren.
366cdf0e10cSrcweir 	if( !pCrsr )
367cdf0e10cSrcweir 	{
368cdf0e10cSrcweir 		delete pPam;		  // ein neues aufgemacht.
369cdf0e10cSrcweir 
370cdf0e10cSrcweir         // --> FME 2005-02-25 #i42634# Moved common code of SwReader::Read() and
371cdf0e10cSrcweir         // SwDocShell::UpdateLinks() to new SwDoc::UpdateLinks():
372cdf0e10cSrcweir 	// ATM still with Update
373cdf0e10cSrcweir         pDoc->UpdateLinks( sal_True );
374cdf0e10cSrcweir         // <--
375cdf0e10cSrcweir 
376cdf0e10cSrcweir         // not insert: set the redline mode read from settings.xml
377cdf0e10cSrcweir         eOld = static_cast<RedlineMode_t>(
378cdf0e10cSrcweir                 ePostReadRedlineMode & ~nsRedlineMode_t::REDLINE_IGNORE);
379cdf0e10cSrcweir 
380cdf0e10cSrcweir 		pDoc->SetFieldsDirty(false, NULL, 0);
381cdf0e10cSrcweir 	}
382cdf0e10cSrcweir 
383cdf0e10cSrcweir 	pDoc->SetRedlineMode_intern( eOld );
384cdf0e10cSrcweir 	pDoc->SetOle2Link( aOLELink );
385cdf0e10cSrcweir 
386cdf0e10cSrcweir 	if( pCrsr )					// das Doc ist jetzt modifiziert
387cdf0e10cSrcweir 		pDoc->SetModified();
388cdf0e10cSrcweir     // --> OD 2005-02-11 #i38810# - If links have been updated, the document
389cdf0e10cSrcweir     // have to be modified. During update of links the OLE link at the document
390cdf0e10cSrcweir     // isn't set. Thus, the document's modified state has to be set again after
391cdf0e10cSrcweir     // the OLE link is restored - see above <pDoc->SetOle2Link( aOLELink )>.
392cdf0e10cSrcweir     if ( pDoc->LinksUpdated() )
393cdf0e10cSrcweir     {
394cdf0e10cSrcweir         pDoc->SetModified();
395cdf0e10cSrcweir     }
396cdf0e10cSrcweir     // <--
397cdf0e10cSrcweir 
398cdf0e10cSrcweir //  if( po == ReadSw3 )         // am Sw3-Reader noch den pIo-Pointer "loeschen"
399cdf0e10cSrcweir //      ((Sw3Reader*)po)->SetSw3Io( 0 );
400cdf0e10cSrcweir 
401cdf0e10cSrcweir 	po->SetReadUTF8( sal_False );
402cdf0e10cSrcweir 	po->SetBlockMode( sal_False );
403cdf0e10cSrcweir 	po->SetOrganizerMode( sal_False );
404cdf0e10cSrcweir     po->SetIgnoreHTMLComments( sal_False );
405cdf0e10cSrcweir 
406cdf0e10cSrcweir 	return nError;
407cdf0e10cSrcweir }
408cdf0e10cSrcweir 
409cdf0e10cSrcweir 
410cdf0e10cSrcweir /*
411cdf0e10cSrcweir  * Konstruktoren, Destruktor
412cdf0e10cSrcweir  */
413cdf0e10cSrcweir 
414cdf0e10cSrcweir // Initiales Einlesben
415cdf0e10cSrcweir 
416cdf0e10cSrcweir                                        /*
417cdf0e10cSrcweir SwReader::SwReader(SvStorage& rStg, const String& rFileName, SwDoc *pDoc)
418cdf0e10cSrcweir 	: SwDocFac(pDoc), pStrm(0), pStg(&rStg), pMedium(0), pCrsr(0),
419cdf0e10cSrcweir 	aFileName(rFileName)
420cdf0e10cSrcweir {
421cdf0e10cSrcweir }
422cdf0e10cSrcweir 
423cdf0e10cSrcweir SwReader::SwReader(const uno::Reference < embed::XStorage >& rStg, const String& rFileName, SwDoc *pDoc)
424cdf0e10cSrcweir     : SwDocFac(pDoc), pStrm(0), pMedium(0), pCrsr(0), xStg( rStg ), aFileName(rFileName)
425cdf0e10cSrcweir {
426cdf0e10cSrcweir }
427cdf0e10cSrcweir                                          */
SwReader(SfxMedium & rMedium,const String & rFileName,SwDoc * pDocument)428cdf0e10cSrcweir SwReader::SwReader(SfxMedium& rMedium, const String& rFileName, SwDoc *pDocument)
429cdf0e10cSrcweir     : SwDocFac(pDocument), pStrm(0), pMedium(&rMedium), pCrsr(0),
430cdf0e10cSrcweir 	aFileName(rFileName)
431cdf0e10cSrcweir {
432cdf0e10cSrcweir     SetBaseURL( rMedium.GetBaseURL() );
433cdf0e10cSrcweir }
434cdf0e10cSrcweir 
435cdf0e10cSrcweir // In ein existierendes Dokument einlesen
436cdf0e10cSrcweir 
SwReader(SvStream & rStrm,const String & rFileName,const String & rBaseURL,SwPaM & rPam)437cdf0e10cSrcweir SwReader::SwReader(SvStream& rStrm, const String& rFileName, const String& rBaseURL, SwPaM& rPam)
438cdf0e10cSrcweir     : SwDocFac(rPam.GetDoc()), pStrm(&rStrm), pMedium(0), pCrsr(&rPam),
439cdf0e10cSrcweir 	aFileName(rFileName)
440cdf0e10cSrcweir {
441cdf0e10cSrcweir     SetBaseURL( rBaseURL );
442cdf0e10cSrcweir }
443cdf0e10cSrcweir /*
444cdf0e10cSrcweir SwReader::SwReader(SvStorage& rStg, const String& rFileName, SwPaM& rPam)
445cdf0e10cSrcweir 	: SwDocFac(rPam.GetDoc()), pStrm(0), pStg(&rStg), pMedium(0), pCrsr(&rPam),
446cdf0e10cSrcweir 	aFileName(rFileName)
447cdf0e10cSrcweir {
448cdf0e10cSrcweir }
449cdf0e10cSrcweir */
SwReader(SfxMedium & rMedium,const String & rFileName,SwPaM & rPam)450cdf0e10cSrcweir SwReader::SwReader(SfxMedium& rMedium, const String& rFileName, SwPaM& rPam)
451cdf0e10cSrcweir     : SwDocFac(rPam.GetDoc()), pStrm(0), pMedium(&rMedium),
452cdf0e10cSrcweir 	pCrsr(&rPam), aFileName(rFileName)
453cdf0e10cSrcweir {
454cdf0e10cSrcweir     SetBaseURL( rMedium.GetBaseURL() );
455cdf0e10cSrcweir }
456cdf0e10cSrcweir 
SwReader(const uno::Reference<embed::XStorage> & rStg,const String & rFilename,SwPaM & rPam)457cdf0e10cSrcweir SwReader::SwReader( const uno::Reference < embed::XStorage > &rStg, const String& rFilename, SwPaM &rPam )
458cdf0e10cSrcweir 	: SwDocFac(rPam.GetDoc()), pStrm(0), xStg( rStg ), pMedium(0), pCrsr(&rPam), aFileName(rFilename)
459cdf0e10cSrcweir {
460cdf0e10cSrcweir }
461cdf0e10cSrcweir 
Reader()462cdf0e10cSrcweir Reader::Reader()
463cdf0e10cSrcweir     : pTemplate(0), pStrm(0), pMedium(0), bInsertMode(0),
464cdf0e10cSrcweir 	bTmplBrowseMode(0), bReadUTF8(0), bBlockMode(0), bOrganizerMode(0),
465cdf0e10cSrcweir     bHasAskTemplateName(0), bIgnoreHTMLComments(0)
466cdf0e10cSrcweir {
467cdf0e10cSrcweir }
468cdf0e10cSrcweir 
~Reader()469cdf0e10cSrcweir Reader::~Reader()
470cdf0e10cSrcweir {
471cdf0e10cSrcweir 	delete pTemplate;
472cdf0e10cSrcweir }
473cdf0e10cSrcweir 
GetTemplateName() const474cdf0e10cSrcweir String Reader::GetTemplateName() const
475cdf0e10cSrcweir {
476cdf0e10cSrcweir 	return aEmptyStr;
477cdf0e10cSrcweir }
478cdf0e10cSrcweir 
479cdf0e10cSrcweir // Die Filter-Vorlage laden, setzen und wieder freigeben
GetTemplateDoc()480cdf0e10cSrcweir SwDoc* Reader::GetTemplateDoc()
481cdf0e10cSrcweir {
482cdf0e10cSrcweir 	if( !bHasAskTemplateName )
483cdf0e10cSrcweir 	{
484cdf0e10cSrcweir 		SetTemplateName( GetTemplateName() );
485cdf0e10cSrcweir 		bHasAskTemplateName = sal_True;
486cdf0e10cSrcweir 	}
487cdf0e10cSrcweir 
488cdf0e10cSrcweir 	if( !aTemplateNm.Len() )
489cdf0e10cSrcweir 		ClearTemplate();
490cdf0e10cSrcweir 	else
491cdf0e10cSrcweir 	{
492cdf0e10cSrcweir         INetURLObject aTDir( aTemplateNm );
493cdf0e10cSrcweir         String aFileName = aTDir.GetMainURL( INetURLObject::NO_DECODE );
494cdf0e10cSrcweir         DBG_ASSERT( !aTDir.HasError(), "No absolute path for template name!" );
495cdf0e10cSrcweir 		DateTime aCurrDateTime;
496cdf0e10cSrcweir 		sal_Bool bLoad = sal_False;
497cdf0e10cSrcweir 
498cdf0e10cSrcweir 		// Wenn das Template schon mal geladen wurde, nur einmal pro
499cdf0e10cSrcweir 		// Minute nachschauen, ob es geaendert wurde.
500cdf0e10cSrcweir 		if( !pTemplate || aCurrDateTime >= aChkDateTime )
501cdf0e10cSrcweir 		{
502cdf0e10cSrcweir 			Date aTstDate;
503cdf0e10cSrcweir 			Time aTstTime;
504cdf0e10cSrcweir 			if( FStatHelper::GetModifiedDateTimeOfFile(
505cdf0e10cSrcweir 							aTDir.GetMainURL( INetURLObject::NO_DECODE ),
506cdf0e10cSrcweir 							&aTstDate, &aTstTime ) &&
507cdf0e10cSrcweir 				( !pTemplate || aDStamp != aTstDate || aTStamp != aTstTime ))
508cdf0e10cSrcweir 			{
509cdf0e10cSrcweir 				bLoad = sal_True;
510cdf0e10cSrcweir 				aDStamp = aTstDate;
511cdf0e10cSrcweir 				aTStamp = aTstTime;
512cdf0e10cSrcweir 			}
513cdf0e10cSrcweir 
514cdf0e10cSrcweir 			// Erst in einer Minute wieder mal nachschauen, ob sich die
515cdf0e10cSrcweir 			// Vorlage geaendert hat.
516cdf0e10cSrcweir 			aChkDateTime = aCurrDateTime;
517cdf0e10cSrcweir 			aChkDateTime += Time( 0L, 1L );
518cdf0e10cSrcweir 		}
519cdf0e10cSrcweir 
520cdf0e10cSrcweir 		if( bLoad )
521cdf0e10cSrcweir 		{
522cdf0e10cSrcweir 			ClearTemplate();
523cdf0e10cSrcweir 			ASSERT( !pTemplate, "Who holds the template doc?" );
524cdf0e10cSrcweir 
525cdf0e10cSrcweir 				// #95605#: If the writer module is not installed,
526cdf0e10cSrcweir 				// we cannot create a SwDocShell. We could create a
527cdf0e10cSrcweir 				// SwWebDocShell however, because this exists always
528cdf0e10cSrcweir 				// for the help.
529cdf0e10cSrcweir 				SvtModuleOptions aModuleOptions;
530cdf0e10cSrcweir 				if( aModuleOptions.IsWriter() )
531cdf0e10cSrcweir 				{
532cdf0e10cSrcweir 					SwDocShell *pDocSh =
533cdf0e10cSrcweir 						new SwDocShell ( SFX_CREATE_MODE_INTERNAL );
534cdf0e10cSrcweir                     SfxObjectShellLock xDocSh = pDocSh;
535cdf0e10cSrcweir 					if( pDocSh->DoInitNew( 0 ) )
536cdf0e10cSrcweir 					{
537cdf0e10cSrcweir 						pTemplate = pDocSh->GetDoc();
538cdf0e10cSrcweir 						pTemplate->SetOle2Link( Link() );
539cdf0e10cSrcweir                         // always FALSE
540cdf0e10cSrcweir                         pTemplate->GetIDocumentUndoRedo().DoUndo( false );
541cdf0e10cSrcweir                         pTemplate->set(IDocumentSettingAccess::BROWSE_MODE, bTmplBrowseMode );
542cdf0e10cSrcweir                         pTemplate->RemoveAllFmtLanguageDependencies();
543cdf0e10cSrcweir 
544cdf0e10cSrcweir 						ReadXML->SetOrganizerMode( sal_True );
545cdf0e10cSrcweir                         SfxMedium aMedium( aFileName, sal_False );
546cdf0e10cSrcweir                         SwReader aRdr( aMedium, aEmptyStr, pTemplate );
547cdf0e10cSrcweir 						aRdr.Read( *ReadXML );
548cdf0e10cSrcweir 						ReadXML->SetOrganizerMode( sal_False );
549cdf0e10cSrcweir 
550cdf0e10cSrcweir 						pTemplate->acquire();
551cdf0e10cSrcweir 					}
552cdf0e10cSrcweir 				}
553cdf0e10cSrcweir 		}
554cdf0e10cSrcweir 
555cdf0e10cSrcweir         ASSERT( !pTemplate || FStatHelper::IsDocument( aFileName ) ||
556cdf0e10cSrcweir 				aTemplateNm.EqualsAscii( "$$Dummy$$" ),
557cdf0e10cSrcweir                 "TemplatePtr but no template exist!" );
558cdf0e10cSrcweir 	}
559cdf0e10cSrcweir 
560cdf0e10cSrcweir 	return pTemplate;
561cdf0e10cSrcweir }
562cdf0e10cSrcweir 
SetTemplate(SwDoc & rDoc)563cdf0e10cSrcweir sal_Bool Reader::SetTemplate( SwDoc& rDoc )
564cdf0e10cSrcweir {
565cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
566cdf0e10cSrcweir 
567cdf0e10cSrcweir 	GetTemplateDoc();
568cdf0e10cSrcweir 	if( pTemplate )
569cdf0e10cSrcweir 	{
570cdf0e10cSrcweir 		rDoc.RemoveAllFmtLanguageDependencies();
571cdf0e10cSrcweir 		rDoc.ReplaceStyles( *pTemplate );
572cdf0e10cSrcweir 		rDoc.SetFixFields(false, NULL);
573cdf0e10cSrcweir 		bRet = sal_True;
574cdf0e10cSrcweir 	}
575cdf0e10cSrcweir 
576cdf0e10cSrcweir 	return bRet;
577cdf0e10cSrcweir }
578cdf0e10cSrcweir 
ClearTemplate()579cdf0e10cSrcweir void Reader::ClearTemplate()
580cdf0e10cSrcweir {
581cdf0e10cSrcweir 	if( pTemplate )
582cdf0e10cSrcweir 	{
583cdf0e10cSrcweir 		if( 0 == pTemplate->release() )
584cdf0e10cSrcweir 			delete pTemplate,
585cdf0e10cSrcweir 		pTemplate = 0;
586cdf0e10cSrcweir 	}
587cdf0e10cSrcweir }
588cdf0e10cSrcweir 
SetTemplateName(const String & rDir)589cdf0e10cSrcweir void Reader::SetTemplateName( const String& rDir )
590cdf0e10cSrcweir {
591cdf0e10cSrcweir 	if( rDir.Len() && aTemplateNm != rDir )
592cdf0e10cSrcweir 	{
593cdf0e10cSrcweir 		ClearTemplate();
594cdf0e10cSrcweir 		aTemplateNm = rDir;
595cdf0e10cSrcweir 	}
596cdf0e10cSrcweir }
597cdf0e10cSrcweir 
MakeHTMLDummyTemplateDoc()598cdf0e10cSrcweir void Reader::MakeHTMLDummyTemplateDoc()
599cdf0e10cSrcweir {
600cdf0e10cSrcweir 	ClearTemplate();
601cdf0e10cSrcweir 	pTemplate = new SwDoc;
602cdf0e10cSrcweir 	pTemplate->acquire();
603cdf0e10cSrcweir     pTemplate->set(IDocumentSettingAccess::BROWSE_MODE, bTmplBrowseMode );
604cdf0e10cSrcweir     pTemplate->getPrinter( true );
605cdf0e10cSrcweir     pTemplate->RemoveAllFmtLanguageDependencies();
606cdf0e10cSrcweir 	aChkDateTime = Date( 1, 1, 2300 );	// 2300. Jahrtausend sollte reichen
607cdf0e10cSrcweir 	aTemplateNm.AssignAscii( "$$Dummy$$" );
608cdf0e10cSrcweir }
609cdf0e10cSrcweir 
610cdf0e10cSrcweir // alle die die Streams / Storages nicht geoeffnet brauchen,
611cdf0e10cSrcweir // muessen die Methode ueberladen
SetStrmStgPtr()612cdf0e10cSrcweir int Reader::SetStrmStgPtr()
613cdf0e10cSrcweir {
614cdf0e10cSrcweir 	ASSERT( pMedium, "Wo ist das Medium??" );
615cdf0e10cSrcweir 
616cdf0e10cSrcweir 	if( pMedium->IsStorage() )
617cdf0e10cSrcweir 	{
618cdf0e10cSrcweir 		if( SW_STORAGE_READER & GetReaderType() )
619cdf0e10cSrcweir 		{
620cdf0e10cSrcweir             xStg = pMedium->GetStorage();
621cdf0e10cSrcweir 			return sal_True;
622cdf0e10cSrcweir 		}
623cdf0e10cSrcweir 	}
624cdf0e10cSrcweir     else
625cdf0e10cSrcweir 	{
626cdf0e10cSrcweir 		pStrm = pMedium->GetInStream();
627cdf0e10cSrcweir         if ( pStrm && SotStorage::IsStorageFile(pStrm) && (SW_STORAGE_READER & GetReaderType()) )
628cdf0e10cSrcweir         {
629cdf0e10cSrcweir             pStg = new SotStorage( *pStrm );
630cdf0e10cSrcweir             pStrm = NULL;
631cdf0e10cSrcweir         }
632cdf0e10cSrcweir         else if ( !(SW_STREAM_READER & GetReaderType()) )
633cdf0e10cSrcweir         {
634cdf0e10cSrcweir             pStrm = NULL;
635cdf0e10cSrcweir             return sal_False;
636cdf0e10cSrcweir         }
637cdf0e10cSrcweir 
638cdf0e10cSrcweir         return sal_True;
639cdf0e10cSrcweir 	}
640cdf0e10cSrcweir 	return sal_False;
641cdf0e10cSrcweir }
642cdf0e10cSrcweir 
643cdf0e10cSrcweir 
GetReaderType()644cdf0e10cSrcweir int Reader::GetReaderType()
645cdf0e10cSrcweir {
646cdf0e10cSrcweir 	return SW_STREAM_READER;
647cdf0e10cSrcweir }
648cdf0e10cSrcweir 
649cdf0e10cSrcweir 
SetFltName(const String &)650cdf0e10cSrcweir void Reader::SetFltName( const String& )
651cdf0e10cSrcweir {
652cdf0e10cSrcweir }
653cdf0e10cSrcweir 
654cdf0e10cSrcweir 
SetNoOutlineNum(SwDoc &)655cdf0e10cSrcweir void Reader::SetNoOutlineNum( SwDoc& /*rDoc*/ )
656cdf0e10cSrcweir {
657cdf0e10cSrcweir 	// JP 10.03.96: jetzt wieder keine Nummerierung in den Vorlagen
658cdf0e10cSrcweir }
659cdf0e10cSrcweir 
660cdf0e10cSrcweir 
ResetFrmFmtAttrs(SfxItemSet & rFrmSet)661cdf0e10cSrcweir void Reader::ResetFrmFmtAttrs( SfxItemSet &rFrmSet )
662cdf0e10cSrcweir {
663cdf0e10cSrcweir     rFrmSet.Put( SvxLRSpaceItem(RES_LR_SPACE) );
664cdf0e10cSrcweir     rFrmSet.Put( SvxULSpaceItem(RES_UL_SPACE) );
665cdf0e10cSrcweir     rFrmSet.Put( SvxBoxItem(RES_BOX) );
666cdf0e10cSrcweir }
667cdf0e10cSrcweir 
668cdf0e10cSrcweir 
ResetFrmFmts(SwDoc & rDoc)669cdf0e10cSrcweir void Reader::ResetFrmFmts( SwDoc& rDoc )
670cdf0e10cSrcweir {
671cdf0e10cSrcweir 	for (sal_uInt16 i=0; i<3; ++i)
672cdf0e10cSrcweir 	{
673cdf0e10cSrcweir 		sal_uInt16 nPoolId;
674cdf0e10cSrcweir 		switch (i)
675cdf0e10cSrcweir 		{
676cdf0e10cSrcweir 			default:
677cdf0e10cSrcweir 				ASSERT(i == 0, "Impossible");
678cdf0e10cSrcweir 				//fallthrough
679cdf0e10cSrcweir 			case 0:
680cdf0e10cSrcweir 				nPoolId = RES_POOLFRM_FRAME;
681cdf0e10cSrcweir 				break;
682cdf0e10cSrcweir 			case 1:
683cdf0e10cSrcweir 				nPoolId = RES_POOLFRM_GRAPHIC;
684cdf0e10cSrcweir 				break;
685cdf0e10cSrcweir 			case 2:
686cdf0e10cSrcweir 				nPoolId = RES_POOLFRM_OLE;
687cdf0e10cSrcweir 				break;
688cdf0e10cSrcweir 		}
689cdf0e10cSrcweir 
690cdf0e10cSrcweir 		SwFrmFmt *pFrmFmt = rDoc.GetFrmFmtFromPool( nPoolId );
691cdf0e10cSrcweir 
692cdf0e10cSrcweir         pFrmFmt->ResetFmtAttr( RES_LR_SPACE );
693cdf0e10cSrcweir         pFrmFmt->ResetFmtAttr( RES_UL_SPACE );
694cdf0e10cSrcweir         pFrmFmt->ResetFmtAttr( RES_BOX );
695cdf0e10cSrcweir 	}
696cdf0e10cSrcweir }
697cdf0e10cSrcweir 
698cdf0e10cSrcweir 	// read the sections of the document, which is equal to the medium.
699cdf0e10cSrcweir 	// returns the count of it
GetSectionList(SfxMedium &,SvStrings &) const700cdf0e10cSrcweir sal_uInt16 Reader::GetSectionList( SfxMedium&, SvStrings& ) const
701cdf0e10cSrcweir {
702cdf0e10cSrcweir 	return 0;
703cdf0e10cSrcweir }
704cdf0e10cSrcweir 
705cdf0e10cSrcweir // ------------------------------------------------
HasGlossaries(const Reader & rOptions)706cdf0e10cSrcweir sal_Bool SwReader::HasGlossaries( const Reader& rOptions )
707cdf0e10cSrcweir {
708cdf0e10cSrcweir 	// Variable uebertragen
709cdf0e10cSrcweir 	Reader* po = (Reader*) &rOptions;
710cdf0e10cSrcweir 	po->pStrm = pStrm;
711cdf0e10cSrcweir 	po->pStg  = pStg;
712cdf0e10cSrcweir 	po->bInsertMode = sal_False;
713cdf0e10cSrcweir 
714cdf0e10cSrcweir 	// ist ein Medium angegeben, dann aus diesem die Streams besorgen
715cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
716cdf0e10cSrcweir 	if( !( 0 != (po->pMedium = pMedium ) && !po->SetStrmStgPtr() ))
717cdf0e10cSrcweir 		bRet = po->HasGlossaries();
718cdf0e10cSrcweir 	return bRet;
719cdf0e10cSrcweir }
720cdf0e10cSrcweir 
ReadGlossaries(const Reader & rOptions,SwTextBlocks & rBlocks,sal_Bool bSaveRelFiles)721cdf0e10cSrcweir sal_Bool SwReader::ReadGlossaries( const Reader& rOptions,
722cdf0e10cSrcweir 								SwTextBlocks& rBlocks, sal_Bool bSaveRelFiles )
723cdf0e10cSrcweir {
724cdf0e10cSrcweir 	// Variable uebertragen
725cdf0e10cSrcweir 	Reader* po = (Reader*) &rOptions;
726cdf0e10cSrcweir 	po->pStrm = pStrm;
727cdf0e10cSrcweir 	po->pStg  = pStg;
728cdf0e10cSrcweir 	po->bInsertMode = sal_False;
729cdf0e10cSrcweir 
730cdf0e10cSrcweir 	// ist ein Medium angegeben, dann aus diesem die Streams besorgen
731cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
732cdf0e10cSrcweir 	if( !( 0 != (po->pMedium = pMedium ) && !po->SetStrmStgPtr() ))
733cdf0e10cSrcweir 		bRet = po->ReadGlossaries( rBlocks, bSaveRelFiles );
734cdf0e10cSrcweir 	return bRet;
735cdf0e10cSrcweir }
736cdf0e10cSrcweir 
HasGlossaries() const737cdf0e10cSrcweir sal_Bool Reader::HasGlossaries() const
738cdf0e10cSrcweir {
739cdf0e10cSrcweir 	return sal_False;
740cdf0e10cSrcweir }
741cdf0e10cSrcweir 
ReadGlossaries(SwTextBlocks &,sal_Bool) const742cdf0e10cSrcweir sal_Bool Reader::ReadGlossaries( SwTextBlocks&, sal_Bool ) const
743cdf0e10cSrcweir {
744cdf0e10cSrcweir 	return sal_False;
745cdf0e10cSrcweir }
746cdf0e10cSrcweir 
747cdf0e10cSrcweir // ------------------------------------------------
748cdf0e10cSrcweir 
GetReaderType()749cdf0e10cSrcweir int StgReader::GetReaderType()
750cdf0e10cSrcweir {
751cdf0e10cSrcweir 	return SW_STORAGE_READER;
752cdf0e10cSrcweir }
753cdf0e10cSrcweir 
754cdf0e10cSrcweir 
755cdf0e10cSrcweir 
756cdf0e10cSrcweir 
757cdf0e10cSrcweir /*
758cdf0e10cSrcweir  * Writer
759cdf0e10cSrcweir  */
760cdf0e10cSrcweir 
761cdf0e10cSrcweir /*
762cdf0e10cSrcweir  * Konstruktoren, Destruktoren sind inline (inc/shellio.hxx).
763cdf0e10cSrcweir  */
764cdf0e10cSrcweir 
SwWriter(SvStream & rStrm,SwCrsrShell & rShell,sal_Bool bInWriteAll)765cdf0e10cSrcweir SwWriter::SwWriter(SvStream& rStrm, SwCrsrShell &rShell, sal_Bool bInWriteAll)
766cdf0e10cSrcweir     : pStrm(&rStrm), pMedium(0), pOutPam(0), pShell(&rShell),
767cdf0e10cSrcweir 	rDoc(*rShell.GetDoc()), bWriteAll(bInWriteAll)
768cdf0e10cSrcweir {
769cdf0e10cSrcweir }
770cdf0e10cSrcweir 
SwWriter(SvStream & rStrm,SwDoc & rDocument)771cdf0e10cSrcweir SwWriter::SwWriter(SvStream& rStrm,SwDoc &rDocument)
772cdf0e10cSrcweir     : pStrm(&rStrm), pMedium(0), pOutPam(0), pShell(0), rDoc(rDocument),
773cdf0e10cSrcweir 	bWriteAll(true)
774cdf0e10cSrcweir {
775cdf0e10cSrcweir }
776cdf0e10cSrcweir 
SwWriter(SvStream & rStrm,SwPaM & rPam,sal_Bool bInWriteAll)777cdf0e10cSrcweir SwWriter::SwWriter(SvStream& rStrm, SwPaM& rPam, sal_Bool bInWriteAll)
778cdf0e10cSrcweir     : pStrm(&rStrm), pMedium(0), pOutPam(&rPam), pShell(0),
779cdf0e10cSrcweir 	rDoc(*rPam.GetDoc()), bWriteAll(bInWriteAll)
780cdf0e10cSrcweir {
781cdf0e10cSrcweir }
782cdf0e10cSrcweir 
SwWriter(const uno::Reference<embed::XStorage> & rStg,SwDoc & rDocument)783cdf0e10cSrcweir SwWriter::SwWriter( const uno::Reference < embed::XStorage >& rStg, SwDoc &rDocument)
784cdf0e10cSrcweir     : pStrm(0), xStg( rStg ), pMedium(0), pOutPam(0), pShell(0), rDoc(rDocument), bWriteAll(true)
785cdf0e10cSrcweir {
786cdf0e10cSrcweir }
787cdf0e10cSrcweir 
SwWriter(SfxMedium & rMedium,SwCrsrShell & rShell,sal_Bool bInWriteAll)788cdf0e10cSrcweir SwWriter::SwWriter(SfxMedium& rMedium, SwCrsrShell &rShell, sal_Bool bInWriteAll)
789cdf0e10cSrcweir     : pStrm(0), pMedium(&rMedium), pOutPam(0), pShell(&rShell),
790cdf0e10cSrcweir 	rDoc(*rShell.GetDoc()), bWriteAll(bInWriteAll)
791cdf0e10cSrcweir {
792cdf0e10cSrcweir }
793cdf0e10cSrcweir 
SwWriter(SfxMedium & rMedium,SwDoc & rDocument)794cdf0e10cSrcweir SwWriter::SwWriter(SfxMedium& rMedium, SwDoc &rDocument)
795cdf0e10cSrcweir     : pStrm(0), pMedium(&rMedium), pOutPam(0), pShell(0), rDoc(rDocument),
796cdf0e10cSrcweir 	bWriteAll(true)
797cdf0e10cSrcweir {
798cdf0e10cSrcweir }
799cdf0e10cSrcweir 
Write(WriterRef & rxWriter,const String * pRealFileName)800cdf0e10cSrcweir sal_uLong SwWriter::Write( WriterRef& rxWriter, const String* pRealFileName )
801cdf0e10cSrcweir {
802cdf0e10cSrcweir     // --> OD 2007-03-30 #i73788#
803cdf0e10cSrcweir     SwPauseThreadStarting aPauseThreadStarting;
804cdf0e10cSrcweir     // <--
805cdf0e10cSrcweir 
806cdf0e10cSrcweir     sal_Bool bHasMark = sal_False;
807cdf0e10cSrcweir 	SwPaM * pPam;
808cdf0e10cSrcweir 
809cdf0e10cSrcweir 	SwDoc *pDoc = 0;
810cdf0e10cSrcweir 
811cdf0e10cSrcweir 	if ( pShell && !bWriteAll && pShell->IsTableMode() )
812cdf0e10cSrcweir 	{
813cdf0e10cSrcweir 		bWriteAll = sal_True;
814cdf0e10cSrcweir 		pDoc = new SwDoc;
815cdf0e10cSrcweir 		pDoc->acquire();
816cdf0e10cSrcweir 
817cdf0e10cSrcweir 		// kopiere Teile aus einer Tabelle: lege eine Tabelle mit der Breite
818cdf0e10cSrcweir 		// von der Originalen an und kopiere die selectierten Boxen.
819cdf0e10cSrcweir 		// Die Groessen werden prozentual korrigiert.
820cdf0e10cSrcweir 
821cdf0e10cSrcweir 		// lasse ueber das Layout die Boxen suchen
822cdf0e10cSrcweir 		SwSelBoxes aBoxes;
823cdf0e10cSrcweir 		GetTblSel( *pShell, aBoxes );
824cdf0e10cSrcweir         SwTableNode* pTblNd = (SwTableNode*)aBoxes[0]->GetSttNd()->StartOfSectionNode();
825cdf0e10cSrcweir 		SwNodeIndex aIdx( pDoc->GetNodes().GetEndOfExtras(), 2 );
826cdf0e10cSrcweir 		SwCntntNode *pNd = aIdx.GetNode().GetCntntNode();
827cdf0e10cSrcweir 		ASSERT( pNd, "Node not found" );
828cdf0e10cSrcweir 		SwPosition aPos( aIdx, SwIndex( pNd ) );
829cdf0e10cSrcweir 		pTblNd->GetTable().MakeCopy( pDoc, aPos, aBoxes );
830cdf0e10cSrcweir 	}
831cdf0e10cSrcweir 
832cdf0e10cSrcweir 	if( !bWriteAll && ( pShell || pOutPam ))
833cdf0e10cSrcweir 	{
834cdf0e10cSrcweir 		if( pShell )
835cdf0e10cSrcweir 			pPam = pShell->GetCrsr();
836cdf0e10cSrcweir 		else
837cdf0e10cSrcweir 			pPam = pOutPam;
838cdf0e10cSrcweir 
839cdf0e10cSrcweir 		SwPaM *pEnd = pPam;
840cdf0e10cSrcweir 
841cdf0e10cSrcweir 		// Erste Runde: Nachsehen, ob eine Selektion besteht.
842cdf0e10cSrcweir 		while(sal_True)
843cdf0e10cSrcweir 		{
844cdf0e10cSrcweir 			bHasMark = bHasMark || pPam->HasMark();
845cdf0e10cSrcweir 			pPam = (SwPaM *) pPam->GetNext();
846cdf0e10cSrcweir 			if(bHasMark || pPam == pEnd)
847cdf0e10cSrcweir 				break;
848cdf0e10cSrcweir 		}
849cdf0e10cSrcweir 
850cdf0e10cSrcweir 		// Wenn keine Selektion besteht, eine ueber das ganze Dokument aufspannen.
851cdf0e10cSrcweir 		if(!bHasMark)
852cdf0e10cSrcweir 		{
853cdf0e10cSrcweir 			if( pShell )
854cdf0e10cSrcweir 			{
855cdf0e10cSrcweir 				pShell->Push();
856cdf0e10cSrcweir 				pShell->SttEndDoc(sal_True);
857cdf0e10cSrcweir 				pShell->SetMark();
858cdf0e10cSrcweir 				pShell->SttEndDoc(sal_False);
859cdf0e10cSrcweir 			}
860cdf0e10cSrcweir 			else
861cdf0e10cSrcweir 			{
862cdf0e10cSrcweir 				pPam = new SwPaM( *pPam );
863cdf0e10cSrcweir 				pPam->Move( fnMoveBackward, fnGoDoc );
864cdf0e10cSrcweir 				pPam->SetMark();
865cdf0e10cSrcweir 				pPam->Move( fnMoveForward, fnGoDoc );
866cdf0e10cSrcweir 			}
867cdf0e10cSrcweir 		}
868cdf0e10cSrcweir 		// pPam ist immer noch der akt. Cursor !!
869cdf0e10cSrcweir 	}
870cdf0e10cSrcweir 	else
871cdf0e10cSrcweir 	{
872cdf0e10cSrcweir 		// keine Shell oder alles schreiben -> eigenen Pam erzeugen
873cdf0e10cSrcweir 		SwDoc* pOutDoc = pDoc ? pDoc : &rDoc;
874cdf0e10cSrcweir 		pPam = new SwPaM( pOutDoc->GetNodes().GetEndOfContent() );
875cdf0e10cSrcweir         if( pOutDoc->IsClipBoard() )
876cdf0e10cSrcweir         {
877cdf0e10cSrcweir             pPam->Move( fnMoveBackward, fnGoDoc );
878cdf0e10cSrcweir             pPam->SetMark();
879cdf0e10cSrcweir             pPam->Move( fnMoveForward, fnGoDoc );
880cdf0e10cSrcweir         }
881cdf0e10cSrcweir         else
882cdf0e10cSrcweir         {
883cdf0e10cSrcweir             pPam->SetMark();
884cdf0e10cSrcweir             pPam->Move( fnMoveBackward, fnGoDoc );
885cdf0e10cSrcweir         }
886cdf0e10cSrcweir 	}
887cdf0e10cSrcweir 
888cdf0e10cSrcweir 	rxWriter->bWriteAll = bWriteAll;
889cdf0e10cSrcweir 	SwDoc* pOutDoc = pDoc ? pDoc : &rDoc;
890cdf0e10cSrcweir 
891cdf0e10cSrcweir 	// falls der Standart PageDesc. immer noch auf initalen Werten steht
892cdf0e10cSrcweir 	// (wenn z.B. kein Drucker gesetzt wurde) dann setze jetzt auf DIN A4
893cdf0e10cSrcweir     // --> OD 2004-11-17 #i37248# - Modifications are only allowed at a new document.
894cdf0e10cSrcweir     // <pOutDoc> contains a new document, if <pDoc> is set - see above.
895cdf0e10cSrcweir     if ( pDoc && !pOutDoc->getPrinter( false ) )
896cdf0e10cSrcweir     // <--
897cdf0e10cSrcweir 	{
898cdf0e10cSrcweir 		const SwPageDesc& rPgDsc = const_cast<const SwDoc *>(pOutDoc)->GetPageDesc( 0 );
899cdf0e10cSrcweir 		//const SwPageDesc& rPgDsc = *pOutDoc->GetPageDescFromPool( RES_POOLPAGE_STANDARD );;
900cdf0e10cSrcweir 		const SwFmtFrmSize& rSz = rPgDsc.GetMaster().GetFrmSize();
901cdf0e10cSrcweir 		// Clipboard-Dokument wird immer ohne Drucker angelegt, so ist
902cdf0e10cSrcweir 		// der Std.PageDesc immer aug LONG_MAX !! Mappe dann auf DIN A4
903cdf0e10cSrcweir 		if( LONG_MAX == rSz.GetHeight() || LONG_MAX == rSz.GetWidth() )
904cdf0e10cSrcweir 		{
905cdf0e10cSrcweir 			SwPageDesc aNew( rPgDsc );
906cdf0e10cSrcweir 			SwFmtFrmSize aNewSz( rSz );
907cdf0e10cSrcweir 			Size a4(SvxPaperInfo::GetPaperSize( PAPER_A4 ));
908cdf0e10cSrcweir 			aNewSz.SetHeight( a4.Width() );
909cdf0e10cSrcweir 			aNewSz.SetWidth( a4.Height() );
910cdf0e10cSrcweir 			aNew.GetMaster().SetFmtAttr( aNewSz );
911cdf0e10cSrcweir 			pOutDoc->ChgPageDesc( 0, aNew );
912cdf0e10cSrcweir 		}
913cdf0e10cSrcweir 	}
914cdf0e10cSrcweir 
915cdf0e10cSrcweir     sal_Bool bLockedView(sal_False);
916cdf0e10cSrcweir 	SwEditShell* pESh = pOutDoc->GetEditShell();
917cdf0e10cSrcweir 	if( pESh )
918cdf0e10cSrcweir     {
919cdf0e10cSrcweir         bLockedView = pESh->IsViewLocked();
920cdf0e10cSrcweir         pESh->LockView( sal_True );    //lock visible section
921cdf0e10cSrcweir 		pESh->StartAllAction();
922cdf0e10cSrcweir     }
923cdf0e10cSrcweir 
924cdf0e10cSrcweir 	sal_Bool bWasPurgeOle = pOutDoc->get(IDocumentSettingAccess::PURGE_OLE);
925cdf0e10cSrcweir 	pOutDoc->set(IDocumentSettingAccess::PURGE_OLE, false);
926cdf0e10cSrcweir 
927cdf0e10cSrcweir 	sal_uLong nError = 0;
928cdf0e10cSrcweir 	if( pMedium )
929cdf0e10cSrcweir 		nError = rxWriter->Write( *pPam, *pMedium, pRealFileName );
930cdf0e10cSrcweir 	else if( pStg )
931cdf0e10cSrcweir 		nError = rxWriter->Write( *pPam, *pStg, pRealFileName );
932cdf0e10cSrcweir 	else if( pStrm )
933cdf0e10cSrcweir 		nError = rxWriter->Write( *pPam, *pStrm, pRealFileName );
934cdf0e10cSrcweir     else if( xStg.is() )
935cdf0e10cSrcweir         nError = rxWriter->Write( *pPam, xStg, pRealFileName );
936cdf0e10cSrcweir 
937cdf0e10cSrcweir 	pOutDoc->set(IDocumentSettingAccess::PURGE_OLE, bWasPurgeOle );
938cdf0e10cSrcweir 
939cdf0e10cSrcweir 	if( pESh )
940cdf0e10cSrcweir     {
941cdf0e10cSrcweir 		pESh->EndAllAction();
942cdf0e10cSrcweir         pESh->LockView( bLockedView );
943cdf0e10cSrcweir     }
944cdf0e10cSrcweir 
945cdf0e10cSrcweir 	// Falls nur zum Schreiben eine Selektion aufgespannt wurde, vor der
946cdf0e10cSrcweir 	// Rueckkehr den alten Crsr wieder herstellen.
947cdf0e10cSrcweir 	if( !bWriteAll && ( pShell || pOutPam ))
948cdf0e10cSrcweir 	{
949cdf0e10cSrcweir 		if(!bHasMark)
950cdf0e10cSrcweir 		{
951cdf0e10cSrcweir 			if( pShell )
952cdf0e10cSrcweir 				pShell->Pop( sal_False );
953cdf0e10cSrcweir 			else
954cdf0e10cSrcweir 				delete pPam;
955cdf0e10cSrcweir 		}
956cdf0e10cSrcweir 	}
957cdf0e10cSrcweir 	else
958cdf0e10cSrcweir 	{
959cdf0e10cSrcweir 		delete pPam;			// loesche den hier erzeugten Pam
960cdf0e10cSrcweir 		// Alles erfolgreich geschrieben? Sag' das dem Dokument!
961cdf0e10cSrcweir         if ( !IsError( nError ) && !pDoc )
962cdf0e10cSrcweir         {
963cdf0e10cSrcweir 			rDoc.ResetModified();
964cdf0e10cSrcweir             // --> OD 2005-02-11 #i38810# - reset also flag, that indicates
965cdf0e10cSrcweir             // updated links
966cdf0e10cSrcweir             rDoc.SetLinksUpdated( sal_False );
967cdf0e10cSrcweir             // <-
968cdf0e10cSrcweir         }
969cdf0e10cSrcweir 	}
970cdf0e10cSrcweir 
971cdf0e10cSrcweir 	if ( pDoc )
972cdf0e10cSrcweir 	{
973cdf0e10cSrcweir         if ( !pDoc->release() )
974cdf0e10cSrcweir 			delete pDoc;
975cdf0e10cSrcweir 		bWriteAll = sal_False;
976cdf0e10cSrcweir 	}
977cdf0e10cSrcweir 
978cdf0e10cSrcweir 	return nError;
979cdf0e10cSrcweir }
980cdf0e10cSrcweir 
981cdf0e10cSrcweir 
982cdf0e10cSrcweir /*  */
983cdf0e10cSrcweir 
984cdf0e10cSrcweir // ----------------------------------------------------------------------
985cdf0e10cSrcweir 
986cdf0e10cSrcweir 
SetHTMLTemplate(SwDoc & rDoc)987cdf0e10cSrcweir sal_Bool SetHTMLTemplate( SwDoc & rDoc )
988cdf0e10cSrcweir {
989cdf0e10cSrcweir 	// Vorlagennamen von den Sfx-HTML-Filter besorgen!!!
990cdf0e10cSrcweir 	if( !ReadHTML->GetTemplateDoc() )
991cdf0e10cSrcweir 		ReadHTML->MakeHTMLDummyTemplateDoc();
992cdf0e10cSrcweir 
993cdf0e10cSrcweir 	sal_Bool bRet = ReadHTML->SetTemplate( rDoc );
994cdf0e10cSrcweir 
995cdf0e10cSrcweir 	SwNodes& rNds = rDoc.GetNodes();
996cdf0e10cSrcweir 	SwNodeIndex aIdx( rNds.GetEndOfExtras(), 1 );
997cdf0e10cSrcweir 	SwCntntNode* pCNd = rNds.GoNext( &aIdx );
998cdf0e10cSrcweir 	if( pCNd )
999cdf0e10cSrcweir 	{
1000cdf0e10cSrcweir 		pCNd->SetAttr
1001cdf0e10cSrcweir             ( SwFmtPageDesc(rDoc.GetPageDescFromPool(RES_POOLPAGE_HTML, false) ) );
1002cdf0e10cSrcweir         pCNd->ChgFmtColl( rDoc.GetTxtCollFromPool( RES_POOLCOLL_TEXT, false ));
1003cdf0e10cSrcweir 	}
1004cdf0e10cSrcweir 
1005cdf0e10cSrcweir 	return bRet;
1006cdf0e10cSrcweir }
1007cdf0e10cSrcweir 
1008cdf0e10cSrcweir 
1009