blob: 775caba7e13971d4fe7e5f77710ae67c769a95ab [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 <hintids.hxx>
#include <osl/endian.h>
#include <tools/stream.hxx>
#include <pam.hxx>
#include <doc.hxx>
#include <ndtxt.hxx>
#include <mdiexp.hxx> // ...Percent()
#include <docary.hxx>
#include <fmtcntnt.hxx>
#include <frmfmt.hxx>
#include <wrtasc.hxx>
#ifndef _STATSTR_HRC
#include <statstr.hrc> // ResId fuer Statusleiste
#endif
//-----------------------------------------------------------------
SwASCWriter::SwASCWriter( const String& rFltNm )
{
SwAsciiOptions aNewOpts;
switch( 5 <= rFltNm.Len() ? rFltNm.GetChar( 4 ) : 0 )
{
case 'D':
#if !defined(PM2)
aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_850 );
aNewOpts.SetParaFlags( LINEEND_CRLF );
#endif
if( 5 < rFltNm.Len() )
switch( rFltNm.Copy( 5 ).ToInt32() )
{
case 437: aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_437 ); break;
case 850: aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_850 ); break;
case 860: aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_860 ); break;
case 861: aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_861 ); break;
case 863: aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_863 ); break;
case 865: aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_865 ); break;
}
break;
case 'A':
#if !defined(WNT)
aNewOpts.SetCharSet( RTL_TEXTENCODING_MS_1252 );
aNewOpts.SetParaFlags( LINEEND_CRLF );
#endif
break;
case 'M':
aNewOpts.SetCharSet( RTL_TEXTENCODING_APPLE_ROMAN );
aNewOpts.SetParaFlags( LINEEND_CR );
break;
case 'X':
#if !defined(UNX)
aNewOpts.SetCharSet( RTL_TEXTENCODING_MS_1252 );
aNewOpts.SetParaFlags( LINEEND_LF );
#endif
break;
default:
if( rFltNm.Copy( 4 ).EqualsAscii( "_DLG" ))
{
// use the options
aNewOpts = GetAsciiOptions();
}
}
SetAsciiOptions( aNewOpts );
}
SwASCWriter::~SwASCWriter() {}
sal_uLong SwASCWriter::WriteStream()
{
sal_Char cLineEnd[ 3 ];
sal_Char* pCEnd = cLineEnd;
if( bASCII_ParaAsCR ) // falls vorgegeben ist.
*pCEnd++ = '\015';
else if( bASCII_ParaAsBlanc )
*pCEnd++ = ' ';
else
switch( GetAsciiOptions().GetParaFlags() )
{
case LINEEND_CR: *pCEnd++ = '\015'; break;
case LINEEND_LF: *pCEnd++ = '\012'; break;
case LINEEND_CRLF: *pCEnd++ = '\015', *pCEnd++ = '\012'; break;
}
*pCEnd = 0;
sLineEnd.AssignAscii( cLineEnd );
long nMaxNode = pDoc->GetNodes().Count();
if( bShowProgress )
::StartProgress( STR_STATSTR_W4WWRITE, 0, nMaxNode, pDoc->GetDocShell() );
SwPaM* pPam = pOrigPam;
sal_Bool bWriteSttTag = bUCS2_WithStartChar &&
(RTL_TEXTENCODING_UCS2 == GetAsciiOptions().GetCharSet() ||
RTL_TEXTENCODING_UTF8 == GetAsciiOptions().GetCharSet());
rtl_TextEncoding eOld = Strm().GetStreamCharSet();
Strm().SetStreamCharSet( GetAsciiOptions().GetCharSet() );
// gebe alle Bereich des Pams in das ASC-File aus.
do {
sal_Bool bTstFly = sal_True;
while( pCurPam->GetPoint()->nNode.GetIndex() < pCurPam->GetMark()->nNode.GetIndex() ||
(pCurPam->GetPoint()->nNode.GetIndex() == pCurPam->GetMark()->nNode.GetIndex() &&
pCurPam->GetPoint()->nContent.GetIndex() <= pCurPam->GetMark()->nContent.GetIndex()) )
{
SwTxtNode* pNd = pCurPam->GetPoint()->nNode.GetNode().GetTxtNode();
if( pNd )
{
// sollten nur Rahmen vorhanden sein?
// (Moeglich, wenn Rahmen-Selektion ins Clipboard
// gestellt wurde)
if( bTstFly && bWriteAll &&
// keine Laenge
!pNd->GetTxt().Len() &&
// Rahmen vorhanden
pDoc->GetSpzFrmFmts()->Count() &&
// nur ein Node im Array
pDoc->GetNodes().GetEndOfExtras().GetIndex() + 3 ==
pDoc->GetNodes().GetEndOfContent().GetIndex() &&
// und genau der ist selektiert
pDoc->GetNodes().GetEndOfContent().GetIndex() - 1 ==
pCurPam->GetPoint()->nNode.GetIndex() )
{
// dann den Inhalt vom Rahmen ausgeben.
// dieser steht immer an Position 0 !!
SwFrmFmt* pFmt = (*pDoc->GetSpzFrmFmts())[ 0 ];
const SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx();
if( pIdx )
{
delete pCurPam;
pCurPam = NewSwPaM( *pDoc, pIdx->GetIndex(),
pIdx->GetNode().EndOfSectionIndex() );
pCurPam->Exchange();
continue; // while-Schleife neu aufsetzen !!
}
}
else
{
if (bWriteSttTag)
{
switch(GetAsciiOptions().GetCharSet())
{
case RTL_TEXTENCODING_UTF8:
Strm() << sal_uInt8(0xEF) << sal_uInt8(0xBB) <<
sal_uInt8(0xBF);
break;
case RTL_TEXTENCODING_UCS2:
//Strm().StartWritingUnicodeText();
Strm().SetEndianSwap(sal_False);
#ifdef OSL_LITENDIAN
Strm() << sal_uInt8(0xFF) << sal_uInt8(0xFE);
#else
Strm() << sal_uInt8(0xFE) << sal_uInt8(0xFF);
#endif
break;
}
bWriteSttTag = sal_False;
}
Out( aASCNodeFnTab, *pNd, *this );
}
bTstFly = sal_False; // eimal Testen reicht
}
if( !pCurPam->Move( fnMoveForward, fnGoNode ) )
break;
if( bShowProgress )
::SetProgressState( pCurPam->GetPoint()->nNode.GetIndex(),
pDoc->GetDocShell() ); // Wie weit ?
}
} while( CopyNextPam( &pPam ) ); // bis alle Pam bearbeitet
Strm().SetStreamCharSet( eOld );
if( bShowProgress )
::EndProgress( pDoc->GetDocShell() );
return 0;
}
void GetASCWriter( const String& rFltNm, const String& /*rBaseURL*/, WriterRef& xRet )
{
xRet = new SwASCWriter( rFltNm );
}