blob: 0dfe373721c900b4a2c49e1c7db48703f9a29b9b [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.
*
*************************************************************/
#include "WW8FKPImpl.hxx"
#include "WW8PropertySetImpl.hxx"
namespace writerfilter {
namespace doctok
{
#if 0
sal_uInt32 WW8FKPImpl::getIndex(const Fc & rFc) const
{
sal_uInt32 nLeft = 0;
sal_uInt32 nRight = getEntryCount();
while (nRight - nLeft > 1)
{
sal_uInt32 nMiddle = (nLeft + nRight) / 2;
Fc aFcMiddle = getFc(nMiddle);
if (! (rFc < aFcMiddle))
{
nLeft = nMiddle;
}
else
{
nRight = nMiddle;
}
}
return nLeft;
}
#else
sal_uInt32 WW8FKPImpl::getIndex(const Fc & rFc) const
{
sal_uInt32 nResult = getEntryCount();
while (rFc < getFc(nResult))
nResult--;
return nResult;
}
#endif
writerfilter::Reference<Properties>::Pointer_t WW8CHPFKPImpl::getProperties(const Fc & rFc) const
{
writerfilter::Reference<Properties>::Pointer_t pResult;
sal_uInt32 n = getIndex(rFc);
sal_uInt16 nOffset = 2 * getU8(getRgb() + n);
if (nOffset > getRgb() + getEntryCount())
{
sal_uInt16 nCbChpx = getU8(nOffset);
if (nCbChpx > 1 && nOffset + nCbChpx + 1 <= 511)
{
pResult = writerfilter::Reference<Properties>::Pointer_t
(new WW8PropertySetImpl(*this, nOffset + 1, nCbChpx));
}
}
#if 0
else
{
clog << "outsider!!!" << endl;
}
#endif
return pResult;
}
void WW8CHPFKPImpl::dump(OutputWithDepth<string> & o) const
{
o.addItem("<fkp type='CHP'>");
sal_uInt32 nCount = getEntryCount();
for (sal_uInt32 n = 0; n < nCount; ++n)
{
char sBuffer[256];
snprintf(sBuffer, sizeof(sBuffer),
"<fkpentry fc='%" SAL_PRIxUINT32 "' offsetInFkp='%x'/>",
getFc(n).get(), 2 * getU8(getRgb() + n));
o.addItem(sBuffer);
}
WW8StructBase::dump(o);
o.addItem("</fkp>");
}
writerfilter::Reference<Properties>::Pointer_t
WW8PAPFKPImpl::getProperties(const Fc & rFc) const
{
writerfilter::Reference<Properties>::Pointer_t pResult;
sal_uInt32 n = getIndex(rFc);
sal_uInt16 nOffset = 2 * getU8(getRgb() + n * 13);
if (nOffset != 0)
{
if (nOffset > getRgb() + getEntryCount() * 13)
{
sal_uInt32 nOffsetIStd = nOffset + 1;
sal_uInt16 nCbPapx = getU8(nOffset) * 2;
if (nCbPapx == 0)
{
nOffsetIStd = nOffset + 2;
nCbPapx = getU8(nOffset + 1) * 2 + 2;
}
sal_uInt32 nOffsetEnd = nOffset + nCbPapx;
//sal_uInt32 nOffsetSprms = nOffsetIStd + 2;
if (nCbPapx > 1 && nOffset + nCbPapx <= 511)
{
pResult = writerfilter::Reference<Properties>::Pointer_t
(new WW8PropertySetImpl(*this, nOffsetIStd,
nOffsetEnd - nOffsetIStd,
true));
}
}
#if 0
else
{
clog << "outsider!!!" << endl;
}
#endif
}
return pResult;
}
void WW8PAPFKPImpl::dump(OutputWithDepth<string> & o) const
{
o.addItem("<fkp type='PAP'>");
sal_uInt32 nCount = getEntryCount();
for (sal_uInt32 n = 0; n < nCount; ++n)
{
char sBuffer[256];
snprintf(sBuffer, sizeof(sBuffer),
"<fkpentry fc='%" SAL_PRIxUINT32 "' offsetInFKP='%x'/>",
getFc(n).get(), 2 * getU8(getRgb() + n * 13));
o.addItem(sBuffer);
}
WW8StructBase::dump(o);
o.addItem("</fkp>");
}
bool operator < (const PageNumberAndFKP & rA,
const PageNumberAndFKP & rB)
{
return rA.mnPageNumber < rB.mnPageNumber;
}
WW8FKPCache::~WW8FKPCache()
{
}
WW8FKP::Pointer_t WW8FKPCacheImpl::get(sal_uInt32 nPageNumber,
bool bComplex)
{
WW8FKP::Pointer_t pResult;
PageNumbersAndFKPs::iterator aIt;
aIt = mPageNumbersAndFKPs.find
(PageNumberAndFKP(nPageNumber, WW8FKP::Pointer_t()));
if (aIt != mPageNumbersAndFKPs.end())
pResult = aIt->getFKP();
else
{
if (mPageNumbersAndFKPs.size() > mnCacheSize)
{
PageNumbersAndFKPs::iterator aItDel =
mPageNumbersAndFKPs.find
(PageNumberAndFKP(mPageNumbers.front(),
WW8FKP::Pointer_t()));
mPageNumbersAndFKPs.erase(aItDel);
mPageNumbers.pop_front();
}
pResult = createFKP(nPageNumber, bComplex);
PageNumberAndFKP aPageNumberAndFKP(nPageNumber, pResult);
mPageNumbersAndFKPs.insert(aPageNumberAndFKP);
mPageNumbers.push_back(nPageNumber);
}
return pResult;
}
WW8FKP::Pointer_t WW8CHPFKPCacheImpl::createFKP(sal_uInt32 nPageNumber,
bool bComplex)
{
return WW8FKP::Pointer_t(new WW8CHPFKPImpl
(*mpStream, nPageNumber, bComplex));
}
WW8FKP::Pointer_t WW8PAPFKPCacheImpl::createFKP(sal_uInt32 nPageNumber,
bool bComplex)
{
return WW8FKP::Pointer_t(new WW8PAPFKPImpl
(*mpStream, nPageNumber, bComplex));
}
}}