diff options
Diffstat (limited to 'lotuswordpro/source/filter/lwpobjfactory.cxx')
-rw-r--r-- | lotuswordpro/source/filter/lwpobjfactory.cxx | 726 |
1 files changed, 726 insertions, 0 deletions
diff --git a/lotuswordpro/source/filter/lwpobjfactory.cxx b/lotuswordpro/source/filter/lwpobjfactory.cxx new file mode 100644 index 000000000..72db1c7a4 --- /dev/null +++ b/lotuswordpro/source/filter/lwpobjfactory.cxx @@ -0,0 +1,726 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: IBM Corporation + * + * Copyright: 2008 by IBM Corporation + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +/************************************************************************* + * @file + * For LWP filter architecture prototype + ************************************************************************/ + +#include <lwpobjfactory.hxx> +#include <lwpdefs.hxx> +#include "lwpdoc.hxx" +#include "lwpstory.hxx" +#include "lwplayout.hxx" +#include "lwppara.hxx" +#include "lwpparastyle.hxx" +#include "lwpcharacterstyle.hxx" +#include "lwppiece.hxx" +#include "lwptabrack.hxx" +#include "lwpsilverbullet.hxx" +#include "lwpdivinfo.hxx" +#include "lwpholder.hxx" +#include "lwpdivopts.hxx" +#include "lwplaypiece.hxx" +#include "lwpsection.hxx" +#include "lwppagehint.hxx" +#include "lwpoleobject.hxx" +#include "lwpgrfobj.hxx" +#include "lwptable.hxx" +#include "lwptblcell.hxx" +#include "lwpmarker.hxx" +#include "lwpproplist.hxx" +#include "lwpframelayout.hxx" +#include "lwptablelayout.hxx" +#include "lwppagelayout.hxx" +#include "lwptblformula.hxx" +#include "lwpvpointer.hxx" +#include "lwpfootnote.hxx" +#include "lwpnumericfmt.hxx" +#include "lwpfnlayout.hxx" +#include "lwptoc.hxx" +#include <lwpdocdata.hxx> +#include "lwpnotes.hxx" +#include "lwpverdocument.hxx" +#include <sal/log.hxx> +#include <osl/diagnose.h> + +//LwpObjectFactory* LwpObjectFactory::m_pMgr = NULL; + +LwpObjectFactory::LwpObjectFactory(LwpSvStream* pSvStream) + : m_pSvStream(pSvStream) +{ + m_IdToObjList.clear(); +} + +LwpObjectFactory::~LwpObjectFactory() {} + +/** + * @descr read the index manager +*/ +void LwpObjectFactory::ReadIndex(LwpSvStream* pStrm) { m_IndexMgr.Read(pStrm); } + +/** + * @descr create all kinds of objects except lwp7 +*/ +rtl::Reference<LwpObject> LwpObjectFactory::CreateObject(sal_uInt32 type, LwpObjectHeader& objHdr) +{ + rtl::Reference<LwpObject> newObj; + SAL_WARN_IF(type >= 300, "lwp", "invalid type: " << type); + switch (type) + { + case VO_DOCUMENT: + { + newObj = new LwpDocument(objHdr, m_pSvStream); + break; + } + case VO_DOCSOCK: + { + newObj = new LwpDocSock(objHdr, m_pSvStream); + break; + } + case VO_DIVISIONINFO: + { + newObj = new LwpDivInfo(objHdr, m_pSvStream); + break; + } + case VO_DIVOPTS: + { + newObj = new LwpDivisionOptions(objHdr, m_pSvStream); + break; + } + case VO_HEADCONTENT: + { + newObj = new LwpHeadContent(objHdr, m_pSvStream); + break; + } + case VO_HEADLAYOUT: + { + newObj = new LwpHeadLayout(objHdr, m_pSvStream); + break; + } + case VO_PAGELAYOUT: + { + newObj = new LwpPageLayout(objHdr, m_pSvStream); + break; + } + case VO_STORY: + { + newObj = new LwpStory(objHdr, m_pSvStream); + break; + } + case VO_PARA: + { + newObj = new LwpPara(objHdr, m_pSvStream); + break; + } + case VO_HEADERLAYOUT: + { + newObj = new LwpHeaderLayout(objHdr, m_pSvStream); + break; + } + case VO_FOOTERLAYOUT: + { + newObj = new LwpFooterLayout(objHdr, m_pSvStream); + break; + } + case VO_FRAMELAYOUT: + { + newObj = new LwpFrameLayout(objHdr, m_pSvStream); + break; + } + case VO_LAYOUTGEOMETRY: + { + newObj = new LwpLayoutGeometry(objHdr, m_pSvStream); + break; + } + case VO_LAYOUTSCALE: + { + newObj = new LwpLayoutScale(objHdr, m_pSvStream); + break; + } + case VO_LAYOUTMARGINS: + { + newObj = new LwpLayoutMargins(objHdr, m_pSvStream); + break; + } + case VO_LAYOUTBORDERSTUFF: + { + newObj = new LwpLayoutBorder(objHdr, m_pSvStream); + break; + } + case VO_LAYOUTBACKGROUNDSTUFF: + { + newObj = new LwpLayoutBackground(objHdr, m_pSvStream); + break; + } + case VO_LAYOUTEXTERNALBORDERSTUFF: + { + newObj = new LwpLayoutExternalBorder(objHdr, m_pSvStream); + break; + } + case VO_LAYOUTCOLUMNS: + { + newObj = new LwpLayoutColumns(objHdr, m_pSvStream); + break; + } + case VO_LAYOUTGUTTERSTUFF: + { + newObj = new LwpLayoutGutters(objHdr, m_pSvStream); + break; + } + case VO_LAYOUTJOINSTUFF: + { + newObj = new LwpLayoutJoins(objHdr, m_pSvStream); + break; + } + case VO_LAYOUTSHADOW: + { + newObj = new LwpLayoutShadow(objHdr, m_pSvStream); + break; + } + // 01/12/2005 + case VO_PARASTYLE: + { + newObj = new LwpParaStyle(objHdr, m_pSvStream); + break; + } + case VO_CHARACTERSTYLE: + { + newObj = new LwpCharacterStyle(objHdr, m_pSvStream); + break; + } + case VO_SILVERBULLET: + { + newObj = new LwpSilverBullet(objHdr, m_pSvStream); + break; + } + case VO_ALIGNMENTPIECE: + { + newObj = new LwpAlignmentPiece(objHdr, m_pSvStream); + break; + } + case VO_INDENTPIECE: + { + newObj = new LwpIndentPiece(objHdr, m_pSvStream); + break; + } + case VO_SPACINGPIECE: + { + newObj = new LwpSpacingPiece(objHdr, m_pSvStream); + break; + } + case VO_CHARBORDERPIECE: + { + newObj = new LwpCharacterBorderPiece(objHdr, m_pSvStream); + break; + } + case VO_AMIKAKEPIECE: + { + newObj = new LwpAmikakePiece(objHdr, m_pSvStream); + break; + } + + case VO_HEADHOLDER: + { + newObj = new LwpDLVListHeadHolder(objHdr, m_pSvStream); + break; + } + + // start + case VO_PARABORDERPIECE: + { + newObj = new LwpParaBorderPiece(objHdr, m_pSvStream); + break; + } + case VO_BREAKSPIECE: + { + newObj = new LwpBreaksPiece(objHdr, m_pSvStream); + break; + } + case VO_NUMBERINGPIECE: + { + newObj = new LwpNumberingPiece(objHdr, m_pSvStream); + break; + } + case VO_TABRACK: + { + newObj = new LwpTabRack(objHdr, m_pSvStream); + break; + } + case VO_TABPIECE: + { + newObj = new LwpTabPiece(objHdr, m_pSvStream); + break; + } + case VO_PARABACKGROUNDPIECE: //perhaps wrong. + { + newObj = new LwpBackgroundPiece(objHdr, m_pSvStream); + break; + } + + case VO_SECTION: + { + newObj = new LwpSection(objHdr, m_pSvStream); + break; + } + case VO_INDEXSECTION: + { + newObj = new LwpIndexSection(objHdr, m_pSvStream); + break; + } + case VO_HEADTAILHOLDER: + { + newObj = new LwpDLVListHeadTailHolder(objHdr, m_pSvStream); + break; + } + case VO_PAGEHINT: + { + newObj = new LwpPageHint(objHdr, m_pSvStream); + break; + } + case VO_OLEOBJECT: + { + newObj = new LwpOleObject(objHdr, m_pSvStream); + break; + } + + case VO_GRAPHIC: + { + newObj = new LwpGraphicObject(objHdr, m_pSvStream); + break; + } + case VO_DOCDATA: + { + newObj = new LwpDocData(objHdr, m_pSvStream); + break; + } + + case VO_DROPCAPLAYOUT: + { + newObj = new LwpDropcapLayout(objHdr, m_pSvStream); + break; + } + case VO_LAYOUTRELATIVITY: + { + newObj = new LwpLayoutRelativity(objHdr, m_pSvStream); + break; + } + // for table + case VO_TABLE: + { + newObj = new LwpTable(objHdr, m_pSvStream); + break; + } + case VO_TABLELAYOUT: + { + newObj = new LwpTableLayout(objHdr, m_pSvStream); + break; + } + case VO_SUPERTABLE: + { + newObj = new LwpSuperTable(objHdr, m_pSvStream); + break; + } + case VO_SUPERTABLELAYOUT: + { + newObj = new LwpSuperTableLayout(objHdr, m_pSvStream); + break; + } + case VO_CELLLAYOUT: + { + newObj = new LwpCellLayout(objHdr, m_pSvStream); + break; + } + case VO_ROWLAYOUT: + { + newObj = new LwpRowLayout(objHdr, m_pSvStream); + break; + } + case VO_LAYOUTNUMERICS: + { + newObj = new LwpLayoutNumerics(objHdr, m_pSvStream); + break; + } + case VO_NUMERICVALUE: + { + newObj = new LwpNumericValue(objHdr, m_pSvStream); + break; + } + case VO_FORMULAINFO: + { + newObj = new LwpFormulaInfo(objHdr, m_pSvStream); + break; + } + case VO_COLUMNLAYOUT: + { + newObj = new LwpColumnLayout(objHdr, m_pSvStream); + break; + } + case VO_ROWLIST: + { + newObj = new LwpRowList(objHdr, m_pSvStream); + break; + } + case VO_CELLLIST: + { + newObj = new LwpCellList(objHdr, m_pSvStream); + break; + } + case VO_TABLERANGE: + { + newObj = new LwpTableRange(objHdr, m_pSvStream); + break; + } + case VO_CELLRANGE: + { + newObj = new LwpCellRange(objHdr, m_pSvStream); + break; + } + case VO_FOLDER: + { + newObj = new LwpFolder(objHdr, m_pSvStream); + break; + } + case VO_DEPENDENT: + { + newObj = new LwpDependent(objHdr, m_pSvStream); + break; + } + case VO_CONNECTEDCELLLAYOUT: + { + newObj = new LwpConnectedCellLayout(objHdr, m_pSvStream); + break; + } + case VO_HIDDENCELLLAYOUT: + { + newObj = new LwpHiddenCellLayout(objHdr, m_pSvStream); + break; + } + case VO_TABLEHEADINGLAYOUT: + { + newObj = new LwpTableHeadingLayout(objHdr, m_pSvStream); + break; + } + case VO_ROWHEADINGLAYOUT: + { + newObj = new LwpRowHeadingLayout(objHdr, m_pSvStream); + break; + } + case VO_TABLEHEADING: + { + newObj = new LwpTableHeading(objHdr, m_pSvStream); + break; + } + case VO_CHBLKMARKER: + { + newObj = new LwpCHBlkMarker(objHdr, m_pSvStream); + break; + } + case VO_PROPLIST: + { + newObj = new LwpPropListElement(objHdr, m_pSvStream); + break; + } + case VO_BOOKMARK: + { + newObj = new LwpBookMark(objHdr, m_pSvStream); + break; + } + case VO_FIELDMARKER: + { + newObj = new LwpFieldMark(objHdr, m_pSvStream); + break; + } + case VO_OBJECTHOLDER: + { + newObj = new LwpObjectHolder(objHdr, m_pSvStream); + break; + } + case VO_POBJECTHOLDER: + { + newObj = new LwpObjectHolder(objHdr, m_pSvStream); + break; + } + case VO_VERGTR: //fall through + case VO_VERQTR: + { + newObj = new LwpVersionedPointer(objHdr, m_pSvStream); + break; + } + case VO_FOOTNOTE: + { + newObj = new LwpFootnote(objHdr, m_pSvStream); + break; + } + case VO_FOOTNOTETABLE: + { + newObj = new LwpFootnoteTable(objHdr, m_pSvStream); + break; + } + case VO_FOOTNOTEOPTS: + { + newObj = new LwpFootnoteOptions(objHdr, m_pSvStream); + break; + } + case VO_FOOTNOTELAYOUT: + { + newObj = new LwpFootnoteLayout(objHdr, m_pSvStream); + break; + } + case VO_FNROWLAYOUT: + { + newObj = new LwpFnRowLayout(objHdr, m_pSvStream); + break; + } + case VO_FNCELLLAYOUT: + { + newObj = new LwpFnCellLayout(objHdr, m_pSvStream); + break; + } + case VO_ENDNOTELAYOUT: + { + newObj = new LwpEndnoteLayout(objHdr, m_pSvStream); + break; + } + case VO_ENSUPERTABLELAYOUT: + { + newObj = new LwpEnSuperTableLayout(objHdr, m_pSvStream); + break; + } + case VO_FNSUPERTABLELAYOUT: + { + newObj = new LwpFnSuperTableLayout(objHdr, m_pSvStream); + break; + } + case VO_CONTONLAYOUT: + { + newObj = new LwpContOnLayout(objHdr, m_pSvStream); + break; + } + case VO_CONTFROMLAYOUT: + { + newObj = new LwpContFromLayout(objHdr, m_pSvStream); + break; + } + case VO_GROUPLAYOUT: + { + newObj = new LwpGroupLayout(objHdr, m_pSvStream); + break; + } + case VO_GROUPFRAME: + { + newObj = new LwpGroupFrame(objHdr, m_pSvStream); + break; + } + case VO_TOCSUPERTABLELAYOUT: + { + newObj = new LwpTocSuperLayout(objHdr, m_pSvStream); + break; + } + case VO_LISTLIST: + { + newObj = new LwpListList(objHdr, m_pSvStream); + break; + } + case VO_TOCLEVELDATA: + { + newObj = new LwpTocLevelData(objHdr, m_pSvStream); + break; + } + case VO_NOTELAYOUT: + { + newObj = new LwpNoteLayout(objHdr, m_pSvStream); + break; + } + case VO_NOTEHEADERLAYOUT: + { + newObj = new LwpNoteHeaderLayout(objHdr, m_pSvStream); + break; + } + case VO_NOTETEXTLAYOUT: + { + newObj = new LwpNoteTextLayout(objHdr, m_pSvStream); + break; + } + case VO_VPLAYOUT: + { + newObj = new LwpViewportLayout(objHdr, m_pSvStream); + break; + } + case VO_PCOLBLOCK: + { + newObj = new LwpParallelColumnsBlock(objHdr, m_pSvStream); + break; + } + case VO_SUPERPARALLELCOLUMNLAYOUT: + { + newObj = new LwpSuperParallelColumnLayout(objHdr, m_pSvStream); + break; + } + case VO_PCOLLAYOUT: + { + newObj = new LwpParallelColumnsLayout(objHdr, m_pSvStream); + break; + } + case VO_PARALLELCOLUMNS: + { + newObj = new LwpParallelColumns(objHdr, m_pSvStream); + break; + } + case VO_RUBYMARKER: + { + newObj = new LwpRubyMarker(objHdr, m_pSvStream); + break; + } + case VO_RUBYLAYOUT: + { + newObj = new LwpRubyLayout(objHdr, m_pSvStream); + break; + } + case VO_GLOSSARY: + { + newObj = new LwpGlossary(objHdr, m_pSvStream); + break; + } + case VO_SUPERGLOSSARYLAYOUT: + { + newObj = new LwpSuperGlossaryLayout(objHdr, m_pSvStream); + break; + } + case VO_VERDOCUMENT: + { + newObj = new LwpVerDocument(objHdr, m_pSvStream); + break; + } + default: + { + //Unknown object type + newObj = nullptr; + break; + } + } + if (newObj.is()) + { + newObj->QuickRead(); + auto result = m_IdToObjList.emplace(objHdr.GetID(), newObj); + if (!result.second) + { + SAL_WARN("lwp", "clearing duplicate object"); + newObj.clear(); + } + } + + return newObj; +} +/** + * @descr query object by object id + * object is created if not in the factory +*/ +rtl::Reference<LwpObject> LwpObjectFactory::QueryObject(const LwpObjectID& objID) +{ + rtl::Reference<LwpObject> obj = FindObject(objID); + if (!obj.is()) + { + //Read the object from file + sal_uInt32 nStreamOffset = m_IndexMgr.GetObjOffset(objID); + if (nStreamOffset == BAD_OFFSET) //does not find the offset in index manager + return nullptr; + + sal_Int64 nDesiredPos = nStreamOffset + LwpSvStream::LWP_STREAM_BASE; + if (nDesiredPos != m_pSvStream->Seek(nDesiredPos)) + return nullptr; + LwpObjectHeader objHdr; + if (!objHdr.Read(*m_pSvStream)) + return nullptr; + + LwpObjectID& rId = objHdr.GetID(); + if (rId != objID) + { + OSL_FAIL("apparently incorrect objid, invalidating"); + return nullptr; + } + + if (std::find(m_aObjsIDInCreation.begin(), m_aObjsIDInCreation.end(), objID) + != m_aObjsIDInCreation.end()) + throw std::runtime_error("recursion in object creation"); + + m_aObjsIDInCreation.push_back(objID); + obj = CreateObject(objHdr.GetTag(), objHdr); + m_aObjsIDInCreation.pop_back(); + } + return obj; +} + +/** + * @descr find object in the factory per the object id +*/ +rtl::Reference<LwpObject> LwpObjectFactory::FindObject(const LwpObjectID& objID) +{ + LwpIdToObjMap::const_iterator it = m_IdToObjList.find(objID); + if (it != m_IdToObjList.end()) + { + return (*it).second; + } + else + { + return nullptr; + } +} +/** + * @descr release object in the factory per the object id +*/ +void LwpObjectFactory::ReleaseObject(const LwpObjectID& objID) { m_IdToObjList.erase(objID); } + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |