/************************************************************** * * 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 namespace writerfilter { namespace doctok { using namespace ::com::sun::star; WW8StructBase::WW8StructBase(const WW8StructBase & rParent, sal_uInt32 nOffset, sal_uInt32 nCount) : mSequence(rParent.mSequence, nOffset, nCount), mpParent(0), mpDocument(rParent.getDocument()) { if (nOffset + nCount > rParent.getCount()) { throw ExceptionOutOfBounds("WW8StructBase"); } } WW8StructBase & WW8StructBase::Assign(const WW8StructBase & rSrc) { mSequence = rSrc.mSequence; mpDocument = rSrc.mpDocument; return *this; } void WW8StructBase::setDocument(WW8DocumentImpl * pDocument) { mpDocument = pDocument; } WW8DocumentImpl * WW8StructBase::getDocument() const { return mpDocument; } sal_uInt8 WW8StructBase::getU8(sal_uInt32 nOffset) const { return doctok::getU8(mSequence, nOffset); } sal_uInt16 WW8StructBase::getU16(sal_uInt32 nOffset) const { return doctok::getU16(mSequence, nOffset); } sal_uInt32 WW8StructBase::getU32(sal_uInt32 nOffset) const { return doctok::getU32(mSequence, nOffset); } sal_Bool WW8StructBase::getBit(sal_uInt32 nValue, sal_uInt16 nBit) const { return (nValue & (1 << nBit)) != 0; } sal_uInt8 WW8StructBase::getNibble(sal_uInt32 nValue, sal_uInt16 nShift) const { return sal::static_int_cast((nValue >> nShift) & 0xf); } sal_uInt8 getU8(const WW8StructBase::Sequence & rSeq, sal_uInt32 nOffset) { return rSeq[nOffset]; } sal_uInt16 getU16(const WW8StructBase::Sequence & rSeq, sal_uInt32 nOffset) { return getU8(rSeq, nOffset) | (getU8(rSeq, nOffset + 1) << 8); } sal_uInt32 getU32(const WW8StructBase::Sequence & rSeq, sal_uInt32 nOffset) { sal_uInt32 nResult = getU8(rSeq, nOffset); nResult |= (getU8(rSeq, nOffset + 1) << 8); nResult |= (getU8(rSeq, nOffset + 2) << 16); nResult |= (getU8(rSeq, nOffset + 3) << 24); return nResult; } rtl::OUString WW8StructBase::getString(sal_uInt32 nOffset, sal_uInt32 nCount) const { rtl::OUString aResult; if (nOffset < getCount()) { sal_uInt32 nCount1 = nCount; if (nOffset + nCount * 2 > getCount()) { nCount1 = (getCount() - nOffset) / 2; } if (nCount1 > 0) { Sequence aSeq(mSequence, nOffset, nCount1 * 2); rtl_uString * pNew = 0; rtl_uString_newFromStr_WithLength (&pNew, reinterpret_cast(&aSeq[0]), nCount1); aResult = rtl::OUString(pNew); } } return aResult; } WW8StructBase * WW8StructBase::getRemainder(sal_uInt32 nOffset) const { WW8StructBase * pResult = NULL; sal_uInt32 nCount = getCount(); if (nCount > nOffset) { pResult = new WW8StructBase(*this, nOffset, nCount - nOffset); } return pResult; } rtl::OUString WW8StructBase::getString(sal_uInt32 nOffset) const { sal_uInt32 nCount = getU16(nOffset); return getString(nOffset + 2, nCount); } WW8StructBaseTmpOffset::WW8StructBaseTmpOffset (WW8StructBase * pStructBase) : mnOffset(0), mpStructBase(pStructBase) { } sal_uInt32 WW8StructBaseTmpOffset::set(sal_uInt32 nOffset) { if (nOffset >= mpStructBase->getCount()) throw ExceptionOutOfBounds("WW8StructBaseTmpOffset::set"); mnOffset = nOffset; return mnOffset; } sal_uInt32 WW8StructBaseTmpOffset::get() const { return mnOffset; } sal_uInt32 WW8StructBaseTmpOffset::inc(sal_uInt32 nOffset) { if (mpStructBase->getCount() - mnOffset < nOffset) throw ExceptionOutOfBounds("WW8StructBaseTmpOffset::inc"); mnOffset += nOffset; return mnOffset; } WW8StructBaseTmpOffset::operator sal_uInt32() const { return mnOffset; } }}