summaryrefslogtreecommitdiff
path: root/binfilter/bf_sw/source/core/swg/sw_rdmisc.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'binfilter/bf_sw/source/core/swg/sw_rdmisc.cxx')
-rw-r--r--binfilter/bf_sw/source/core/swg/sw_rdmisc.cxx509
1 files changed, 509 insertions, 0 deletions
diff --git a/binfilter/bf_sw/source/core/swg/sw_rdmisc.cxx b/binfilter/bf_sw/source/core/swg/sw_rdmisc.cxx
new file mode 100644
index 000000000000..9adcfaec90c5
--- /dev/null
+++ b/binfilter/bf_sw/source/core/swg/sw_rdmisc.cxx
@@ -0,0 +1,509 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#ifdef _MSC_VER
+#pragma hdrstop
+#endif
+
+
+#include <tools/color.hxx>
+#include <vcl/jobset.hxx>
+#include <bf_sfx2/docinf.hxx>
+#include <bf_svtools/macitem.hxx>
+
+#include <fmtanchr.hxx>
+#include <frmfmt.hxx>
+#include <docstat.hxx>
+#include <ftninfo.hxx>
+
+#include <horiornt.hxx>
+
+#include <doc.hxx>
+#include <pam.hxx>
+#include <swtypes.hxx>
+#include <rdswg.hxx>
+#include <swgpar.hxx> // SWGRD_xxx-Flags
+#include <frmids.hxx>
+#include <flypos.hxx>
+#include <ndtxt.hxx> // Zeichen-Konversion
+namespace binfilter {
+
+//using namespace ::com::sun::star;
+
+//////////////////////////////////////////////////////////////////////////////
+
+// Achtung: Jede Routine nimmt an, dass der Record-Header bereits eingelesen
+// ist. Sie arbeitet den Record so weit ab wie moeglich und schliesst den
+// Vorgang mit end() ab.
+
+//////////////////////////////////////////////////////////////////////////////
+
+
+//////////////////////////////////////////////////////////////////////////////
+
+// FlyFrames
+
+// Ein FlyFrame ist ein normales Frame-Format. Die Hints RES_CNTNT und
+// RES_FLY_ANCHOR muessen allerdings noch verbunden werden. Wenn der
+// ANCHOR-Hint eingelesen wird, wird die globale Variable nCntntCol
+// besetzt.
+
+ void SwSwgReader::InFlyFrame( const SwNodeIndex* pNdIdx )
+ {
+ BOOL bAtCnt = FALSE;
+
+ nCntntCol = 0;
+ if( r.cur() != SWG_FLYFMT )
+ {
+ Error();
+ return;
+ }
+
+ USHORT eSave_StartNodeType = eStartNodeType;
+ eStartNodeType = SwFlyStartNode;
+
+ SwFrmFmt* pFmt = (SwFrmFmt*) InFormat( NULL );
+ RegisterFmt( *pFmt );
+ if( pNdIdx )
+ {
+ // Content und Anchor miteinander verbinden, wenn Node angegeben ist
+ SwFmtAnchor aAnchor = pFmt->GetAnchor();
+ USHORT nId = aAnchor.GetAnchorId();
+ switch( nId )
+ {
+ case FLY_AT_CNTNT:
+ bAtCnt = TRUE;
+ case FLY_IN_CNTNT:
+ {
+ SwCntntNode *pNode = pDoc->GetNodes() [ *pNdIdx ]->GetCntntNode();
+ if( pNode )
+ {
+ SwPosition aPos( *pNdIdx, SwIndex( pNode, nCntntCol ) );
+ aAnchor.SetAnchor( &aPos );
+ pFmt->SetAttr( aAnchor );
+ }
+ // Layout-Frames im Insert Mode fuer absatzgebundene
+ // Flys erzeugen
+ if( !bNew && bAtCnt )
+ pFmt->MakeFrms();
+ }
+ break;
+ }
+ }
+ //JP 01.04.97: wird nach dem Lesen durchs SwReader::Read eindeutig gemacht!
+ if( pFmt->GetName().EqualsAscii("Fly") )
+ pFmt->SetName( aEmptyStr );
+
+ eStartNodeType = eSave_StartNodeType;
+ }
+
+ void SwSwgReader::InFlyFrames( const SwNodeIndex* pNdIdx )
+ {
+ USHORT nFrm;
+ r >> nFrm;
+ r.next();
+ for( USHORT i = 0; i < nFrm && r.good(); i++)
+ InFlyFrame( pNdIdx );
+
+ }
+
+/////////////////////////////////////////////////////////////////////////////
+
+// Makros
+
+
+ void SwSwgReader::InGlobalMacroTbl()
+ {
+ short nMacro;
+ r >> nMacro;
+ for( short i = 0; i < nMacro; i++ )
+ {
+ USHORT nEvent;
+ r >> nEvent;
+ String aLib = GetText();
+ String aMac = GetText();
+ pDoc->SetGlobalMacro( nEvent, SvxMacro( aMac, aLib, STARBASIC ) );
+ }
+ r.next();
+
+ }
+
+/////////////////////////////////////////////////////////////////////////////
+
+// Job-Setup
+
+ void SwSwgReader::InJobSetup()
+ {
+ BYTE recid = r.cur();
+ // Der alte Job-Setup ist nicht mehr zu erstellen.
+ if( recid == SWG_JOBSETUP )
+ r.skipnext();
+ else
+ {
+ JobSetup aJobSetup;
+ BOOL bDfltPrn = FALSE;
+ r.Strm() >> bDfltPrn >> aJobSetup;
+
+ pDoc->SetJobsetup( aJobSetup );
+ //JP 25.04.95: das Flag gibts nicht mehr:
+ // pDoc->UseDfltPrt( (BOOL)bDfltPrn );
+ r.skipnext();
+ }
+ }
+
+/////////////////////////////////////////////////////////////////////////////
+
+// Dokument-Info
+
+ void SwSwgReader::InDocInfo()
+ {
+ while( r.good() )
+ {
+ switch( r.next() )
+ {
+ case SWGINF_DBNAME:
+ {
+ String aName = ParseText();
+ if( bNew )
+ {
+ if( aName.EqualsIgnoreCaseAscii( "ADRESSEN" ) )
+ aName.AssignAscii( "Address" );
+ SwDBData aData;
+ aData.sDataSource = aName;
+ pDoc->ChgDBData( aData );
+ }
+ }
+ break;
+ case SWGINF_DOCSTAT:
+ if( bNew )
+ {
+ USHORT nPage, nPara;
+ SwDocStat aStat;
+ r >> aStat.nTbl >> aStat.nGrf >> aStat.nOLE
+ >> nPage >> nPara >> aStat.nWord
+ >> aStat.nChar;
+ aStat.nPage = nPage;
+ aStat.nPara = nPara;
+ aStat.bModified = FALSE;
+ aStat.pInternStat = NULL;
+ pDoc->SetDocStat( aStat );
+ break;
+ } else r.skip(); // wird bei Einfuegen ignoriert
+ break;
+ case SWGINF_END:
+ return;
+ case SWGINF_LAYOUTPR: {
+ //JP 25.04.95: SetLayoutPrtName gibts nicht mehr
+ ParseText();
+ } break;
+ default:
+ // wird ignoriert
+ r.skip();
+ }
+ }
+
+ }
+
+/////////////////////////////////////////////////////////////////////////////
+
+
+ Color SwSwgReader::InColor()
+ {
+ USHORT red, green, blue;
+ r >> red >> green >> blue;
+ Color aClr( BYTE(red >> 8), BYTE(green >> 8), BYTE( blue >> 8) );
+ return aClr;
+
+ }
+
+
+ void SwSwgReader::InPen(USHORT& nWidth, Color& rCol)
+ {
+ BYTE cStyle;
+ r >> cStyle >> nWidth;
+ rCol = InColor();
+ }
+
+
+ Color SwSwgReader::InBrush()
+ {
+ BYTE cStyle, cTransparent;
+ r >> cStyle >> cTransparent;
+
+ // Brush aBr( (BrushStyle) cStyle );
+ // aBr.SetTransparent( BOOL( cTransparent ) );
+ // aBr.SetColor( InColor() );
+ Color aCol(InColor());
+ Color aTmpFillColor(InColor());
+
+ return aCol;
+
+ }
+
+/////////////////////////////////////////////////////////////////////////////
+
+
+ void SwSwgReader::InFtnInfo()
+ {
+ SwFtnInfo aFtn;
+ aFtn = pDoc->GetFtnInfo();
+ aFtn.aQuoVadis = GetText();
+ aFtn.aErgoSum = GetText();
+ //Ab der 3.0 sind nur noch max. 30 Zeichen erlaubt.
+ aFtn.aQuoVadis.Erase( 30 );
+ aFtn.aErgoSum. Erase( 30 );
+
+ BYTE ePos, eNum, eType;
+ USHORT nDesc, nCollIdx;
+ if( ( aHdr.nVersion >= SWG_VER_COMPAT ) && ( r.next() != SWG_DATA ) )
+ {
+ Error(); return;
+ }
+ r >> ePos >> eNum >> eType >> nDesc;
+ if( aHdr.nVersion >= SWG_VER_COMPAT )
+ {
+ r >> nCollIdx;
+ r.skip();
+ if( nCollIdx != IDX_NO_VALUE )
+ {
+ nCollIdx |= IDX_COLLECTION;
+ SwTxtFmtColl* pColl = (SwTxtFmtColl*) FindFmt( nCollIdx, 0 );
+ if( pColl )
+ aFtn.SetFtnTxtColl( *pColl );
+ }
+ }
+ if( nLay )
+ nLay = pLayIdx[ nDesc ].nActualIdx;
+ aFtn.ChgPageDesc( (SwPageDesc*)&pDoc->GetPageDesc( nLay ) );
+
+ aFtn.ePos = (SwFtnPos) ePos;
+ aFtn.eNum = (SwFtnNum) eNum;
+ aFtn.aFmt.SetNumberingType(eType);
+ pDoc->SetFtnInfo( aFtn );
+ r.next();
+ }
+
+// Aufdroeseln des Comment-Records fuer kuenftige Erweiterungen
+
+ void SwSwgReader::InComment()
+ {
+ BYTE cType;
+ USHORT nVal;
+ r >> cType;
+ switch( cType ) {
+ case SWG_XFTNCOLL: {
+ // Fussnoten-Erweiterung: Nummer der TxtColl
+ r >> nVal;
+ nVal &= IDX_COLLECTION;
+ SwTxtFmtColl* pColl = (SwTxtFmtColl*) FindFmt( nVal, 0 );
+ if( pColl )
+ {
+ SwFtnInfo aFtn;
+ aFtn = pDoc->GetFtnInfo();
+ aFtn.SetFtnTxtColl( *pColl );
+ pDoc->SetFtnInfo( aFtn );
+ }
+ } break;
+ default:
+ r.skip();
+ }
+ r.next();
+ }
+
+///////////////////////////////////////////////////////////////////////////
+
+// Einlesen der statischen DocInfo
+
+ static void InSfxStamp( swistream& r, SfxStamp& rStamp,
+ rtl_TextEncoding eCharSet )
+ {
+ r.long4();
+ long nDate, nTime;
+ sal_Char buf[ 32 ];
+ r >> nDate >> nTime;
+ r.get( buf, 32 );
+ r.long3();
+ Date d( nDate );
+ Time t( nTime );
+ String aName( buf, eCharSet );
+ rStamp.SetTime( DateTime( d, t ) );
+ rStamp.SetName( aName );
+ }
+
+ static void InSfxDocString
+ ( swistream& r, String& rText, short nLen, rtl_TextEncoding eCharSet )
+ {
+ sal_Char buf[ 256 ];
+ r.get( buf, nLen );
+ String sTmp( buf, eCharSet );
+ rText = sTmp;
+ }
+
+ void SwSwgReader::InStaticDocInfo( SfxDocumentInfo& rInfo )
+ {
+ long pos;
+ USHORT n, i;
+ BYTE cGUIType, cCharSet;
+ // TODO: unicode: is this correct?
+ rtl_TextEncoding eCharSet = gsl_getSystemTextEncoding();
+ SfxStamp aStamp;
+ String aText;
+
+ while( r.good() )
+ {
+ switch( r.next() )
+ {
+ case SWGINF_END:
+ return;
+ case SWGINF_SAVEINFO:
+ pos = r.tell();
+ r.skip();
+ if( r.peek() == SWGINF_EXTINFO )
+ {
+ r.next();
+ r >> cGUIType
+ >> cCharSet;
+ eCharSet = (rtl_TextEncoding) cCharSet;
+ }
+ r.seek( pos );
+ InSfxStamp( r, aStamp, eCharSet );
+ rInfo.SetCreated( aStamp );
+ InSfxStamp( r, aStamp, eCharSet );
+ rInfo.SetChanged( aStamp );
+ InSfxStamp( r, aStamp, eCharSet );
+ rInfo.SetPrinted( aStamp );
+ // SwSwgInfo-Felder II: Titel, Autor etc
+ InSfxDocString( r, aText, 64, eCharSet );
+ rInfo.SetTitle( aText );
+ InSfxDocString( r, aText, 64, eCharSet );
+ rInfo.SetTheme( aText );
+ InSfxDocString( r, aText, 256, eCharSet );
+ rInfo.SetComment( aText );
+ InSfxDocString( r, aText, 128, eCharSet );
+ rInfo.SetKeywords( aText );
+ // SwSwgInfo-Felder III: User-Keys
+ r >> n;
+ for( i = 0; i < n; i++ )
+ {
+ String aKeys;
+ InSfxDocString( r, aText, 20, eCharSet );
+ InSfxDocString( r, aKeys, 20, eCharSet );
+ SfxDocUserKey aKey( aText, aKeys );
+ rInfo.SetUserKey( aKey, i );
+ }
+ break;
+ default:
+ // wird ignoriert
+ r.skip();
+ }
+ }
+
+ }
+
+ void SwSwgReader::InDynamicDocInfo( SfxDocumentInfo& rInfo )
+ {
+ // Record suchen:
+ if( r.next() == SWG_DOCUMENT )
+ {
+ r.skip();
+ if( r.peek() == SWG_DYNDOCINFO )
+ {
+ r.next();
+ long nextrec = r.getskip();
+ long pos, d, t;
+ BYTE cFlags = 0;
+ while( r.tell() < nextrec && r.good() )
+ {
+ String aText;
+ switch( r.next() )
+ {
+ case SWGINF_TEMPLATE:
+ pos = r.getskip();
+ aText = GetText();
+ r.long4();
+ r >> d >> t;
+ r.long3();
+ if( r.tell() < pos ) r >> cFlags;
+ rInfo.SetTemplateDate( DateTime( Date( d ), Time( t ) ) );
+ rInfo.SetTemplateName( aText );
+ rInfo.SetTemplateFileName( aFileName );
+ rInfo.SetQueryLoadTemplate( BOOL( ( cFlags & 0x01 ) != 0 ) );
+ r.skip( pos ); break;
+ default:
+ r.skip();
+ }
+ }
+ }
+ }
+ }
+
+ BOOL SwSwgReader::LoadDocInfo( SfxDocumentInfo& rInfo )
+ {
+ FileHeader aFile;
+ long pos0 = r.tell();
+
+ memset( &aFile, 0, sizeof aFile );
+ r.get( &aFile, 4 );
+ // Die Signatur sollte schon stimmen!!!
+ // Aber bitte nur die ersten drei Zeichen, um nicht abwaertskompatible
+ // Versionen erkennen zu koennen.
+ if( memcmp( ( const void*) &aFile.nSignature, SWG_SIGNATURE, 3 ) )
+ return FALSE;
+ r.long4();
+ r >> aFile.nVersion
+ >> aFile.nFlags
+ >> aFile.nFree1
+ >> aFile.nDocInfo;
+ r.get( aFile.cPasswd, 16 );
+ r.long3();
+ // rInfo.SetPasswd( BOOL( ( aFile.nFlags & SWGF_HAS_PASSWD ) != 0 ) );
+ rInfo.SetPortableGraphics( BOOL( ( aFile.nFlags & SWGF_PORT_GRAF ) != 0 ) );
+
+ // Passwort in Stream eintragen
+ if( aFile.nFlags & SWGF_HAS_PASSWD )
+ r.copypasswd( aFile.cPasswd );
+ // Die statische DocInfo lesen
+ // Hot fix fuer Bug #4955 (Textbausteine mit geloeschten Bereichen)
+ if( !aFile.nDocInfo ) aFile.nDocInfo = 0x5B;
+ if( aFile.nVersion >= SWG_VER_FMTNAME )
+ {
+ r.seek( aFile.nDocInfo - 4 );
+ InStaticDocInfo( rInfo );
+ }
+ if( aFile.nVersion >= SWG_VER_DOCINFO )
+ {
+ r.seek( pos0 + 32 /* sizeof( FileHeader ) in Datei */ );
+ InDynamicDocInfo( rInfo );
+ r.seek( pos0 );
+ }
+ return BOOL( r.good() );
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */