diff options
Diffstat (limited to 'sc/source/filter/excel/xiformula.cxx')
-rw-r--r-- | sc/source/filter/excel/xiformula.cxx | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/sc/source/filter/excel/xiformula.cxx b/sc/source/filter/excel/xiformula.cxx new file mode 100644 index 000000000..a5f4d7864 --- /dev/null +++ b/sc/source/filter/excel/xiformula.cxx @@ -0,0 +1,107 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#include <xiformula.hxx> +#include <rangelst.hxx> +#include <xistream.hxx> + +#include <excform.hxx> + +// Formula compiler =========================================================== + +/** Implementation class of the export formula compiler. */ +class XclImpFmlaCompImpl : protected XclImpRoot, protected XclTokenArrayHelper +{ +public: + explicit XclImpFmlaCompImpl( const XclImpRoot& rRoot ); + + /** Creates a range list from the passed Excel token array. */ + void CreateRangeList( + ScRangeList& rScRanges, XclFormulaType eType, + const XclTokenArray& rXclTokArr, XclImpStream& rStrm ); + + std::unique_ptr<ScTokenArray> CreateFormula( XclFormulaType eType, const XclTokenArray& rXclTokArr ); + +}; + +XclImpFmlaCompImpl::XclImpFmlaCompImpl( const XclImpRoot& rRoot ) : + XclImpRoot( rRoot ) +{ +} + +void XclImpFmlaCompImpl::CreateRangeList( + ScRangeList& rScRanges, XclFormulaType /*eType*/, + const XclTokenArray& rXclTokArr, XclImpStream& /*rStrm*/ ) +{ + rScRanges.RemoveAll(); + + //FIXME: evil hack, using old formula import :-) + if( !rXclTokArr.Empty() ) + { + SvMemoryStream aMemStrm; + aMemStrm.WriteUInt16( EXC_ID_EOF ).WriteUInt16( rXclTokArr.GetSize() ); + aMemStrm.WriteBytes(rXclTokArr.GetData(), rXclTokArr.GetSize()); + XclImpStream aFmlaStrm( aMemStrm, GetRoot() ); + aFmlaStrm.StartNextRecord(); + GetOldFmlaConverter().GetAbsRefs( rScRanges, aFmlaStrm, aFmlaStrm.GetRecSize() ); + } +} + +std::unique_ptr<ScTokenArray> XclImpFmlaCompImpl::CreateFormula( + XclFormulaType /*eType*/, const XclTokenArray& rXclTokArr ) +{ + if (rXclTokArr.Empty()) + return nullptr; + + // evil hack! are we trying to phase out the old style formula converter ? + SvMemoryStream aMemStrm; + aMemStrm.WriteUInt16( EXC_ID_EOF ).WriteUInt16( rXclTokArr.GetSize() ); + aMemStrm.WriteBytes(rXclTokArr.GetData(), rXclTokArr.GetSize()); + XclImpStream aFmlaStrm( aMemStrm, GetRoot() ); + aFmlaStrm.StartNextRecord(); + std::unique_ptr<ScTokenArray> pArray; + GetOldFmlaConverter().Reset(); + GetOldFmlaConverter().Convert(pArray, aFmlaStrm, aFmlaStrm.GetRecSize(), true); + return pArray; +} + +XclImpFormulaCompiler::XclImpFormulaCompiler( const XclImpRoot& rRoot ) : + XclImpRoot( rRoot ), + mxImpl( std::make_shared<XclImpFmlaCompImpl>( rRoot ) ) +{ +} + +XclImpFormulaCompiler::~XclImpFormulaCompiler() +{ +} + +void XclImpFormulaCompiler::CreateRangeList( + ScRangeList& rScRanges, XclFormulaType eType, + const XclTokenArray& rXclTokArr, XclImpStream& rStrm ) +{ + mxImpl->CreateRangeList( rScRanges, eType, rXclTokArr, rStrm ); +} + +std::unique_ptr<ScTokenArray> XclImpFormulaCompiler::CreateFormula( + XclFormulaType eType, const XclTokenArray& rXclTokArr ) +{ + return mxImpl->CreateFormula(eType, rXclTokArr); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |