blob: 9e21d40cfce07d50d553e0bedd000c93e3ab0591 [file] [log] [blame]
/**************************************************************
*
* 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_sw.hxx"
#include <pam.hxx> // fuer SwPam
#include <doc.hxx>
#include <ndtxt.hxx> // class SwTxtNode
#include <fltini.hxx> // Ww1Reader
#include <w1par.hxx>
#ifndef _SWFLTOPT_HXX
#include <swfltopt.hxx>
#endif
#include <mdiexp.hxx> // StatLine...()
#include <swerror.h> // ERR_WW1_...
#ifndef _STATSTR_HRC
#include <statstr.hrc> // ResId fuer Statusleiste
#endif
//----------------------------------------
// Initialisieren der Feld-FilterFlags
//----------------------------------------
static sal_uLong WW1_Read_FieldIniFlags()
{
// sal_uInt16 i;
static const sal_Char* aNames[ 1 ] = { "WinWord/WW1F" };
sal_uInt32 aVal[ 1 ];
SwFilterOptions aOpt( 1, aNames, aVal );
sal_uLong nFieldFlags = aVal[ 0 ];
if ( SwFltGetFlag( nFieldFlags, SwFltControlStack::HYPO ) )
{
SwFltSetFlag( nFieldFlags, SwFltControlStack::BOOK_TO_VAR_REF );
SwFltSetFlag( nFieldFlags, SwFltControlStack::TAGS_DO_ID );
SwFltSetFlag( nFieldFlags, SwFltControlStack::TAGS_IN_TEXT );
SwFltSetFlag( nFieldFlags, SwFltControlStack::ALLOW_FLD_CR );
}
return nFieldFlags;
}
////////////////////////////////////////////////// StarWriter-Interface
//
// Eine Methode liefern die call-Schnittstelle fuer den Writer.
// Read() liest eine Datei. hierzu werden zwei Objekte erzeugt, die Shell,
// die die Informationen aufnimmt und der Manager der sie aus der Datei liest.
// Diese werden dann einfach per Pipe 'uebertragen'.
//
sal_uLong WW1Reader::Read(SwDoc& rDoc, const String& rBaseURL, SwPaM& rPam, const String& /*cName*/)
{
sal_uLong nRet = ERR_SWG_READ_ERROR;
ASSERT(pStrm!=NULL, "W1-Read ohne Stream");
if (pStrm != NULL)
{
sal_Bool bNew = !bInsertMode; // Neues Doc ( kein Einfuegen )
// erstmal eine shell konstruieren: die ist schnittstelle
// zum writer-dokument
sal_uLong nFieldFlags = WW1_Read_FieldIniFlags();
Ww1Shell* pRdr = new Ww1Shell( rDoc, rPam, rBaseURL, bNew, nFieldFlags );
if( pRdr )
{
// dann den manager, der liest die struktur des word-streams
Ww1Manager* pMan = new Ww1Manager( *pStrm, nFieldFlags );
if( pMan )
{
if( !pMan->GetError() )
{
::StartProgress( STR_STATSTR_W4WREAD, 0, 100,
rDoc.GetDocShell() );
::SetProgressState( 0, rDoc.GetDocShell() );
// jetzt nur noch alles rueberschieben
*pRdr << *pMan;
if( !pMan->GetError() )
// und nur hier, wenn kein fehler auftrat
// fehlerfreiheit melden
nRet = 0; // besser waere: WARN_SWG_FEATURES_LOST;
::EndProgress( rDoc.GetDocShell() );
}
else
{
if( pMan->GetFib().GetFIB().fComplexGet() )
//!!! ACHTUNG: hier muss eigentlich ein Error
// wegen Fastsave kommen, das der PMW-Filter
// das nicht unterstuetzt. Stattdessen temporaer
// nur eine Warnung, bis die entsprechende
// Meldung und Behandlung weiter oben eingebaut ist.
// nRet = WARN_WW6_FASTSAVE_ERR;
// Zum Einchecken mit neuem String:
nRet = ERR_WW6_FASTSAVE_ERR;
}
}
delete pMan;
}
delete pRdr;
}
Ww1Sprm::DeinitTab();
return nRet;
}
///////////////////////////////////////////////////////////////// Shell
//
// Die Shell ist die Schnittstelle vom Filter zum Writer. Sie ist
// abgeleitet von der mit ww-filter gemeinsam benutzten Shell
// SwFltShell und enthaelt alle fuer ww1 noetigen Erweiterungen. Wie
// in einen Stream werden alle Informationen, die aus der Datei
// gelesen werden, in die shell ge'piped'.
//
Ww1Shell::Ww1Shell( SwDoc& rD, SwPaM& rPam, const String& rBaseURL, sal_Bool bNew, sal_uLong nFieldFlags)
: SwFltShell(&rD, rPam, rBaseURL, bNew, nFieldFlags)
{
}