/**************************************************************
 *
 * 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)
{
}
