blob: 1125df331ad10fe25b0b7ff8fe94b1f2f4beac57 [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.
*
*************************************************************/
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */
#include <vector>
#include <boost/shared_ptr.hpp>
#include <boost/shared_array.hpp>
#include <tools/solar.h>
#include <rtl/ustring.hxx>
#include <tools/stream.hxx>
#include <IDocumentExternalData.hxx>
namespace ww8
{
typedef boost::shared_array<sal_uInt8> DataArray_t;
class WW8Struct : public ::sw::ExternalData
{
DataArray_t mp_data;
sal_uInt32 mn_offset;
sal_uInt32 mn_size;
public:
WW8Struct(SvStream& rSt, sal_uInt32 nPos, sal_uInt32 nSize);
WW8Struct(WW8Struct * pStruct, sal_uInt32 nPos, sal_uInt32 nSize);
virtual ~WW8Struct();
sal_uInt8 getU8(sal_uInt32 nOffset);
sal_uInt16 getU16(sal_uInt32 nOffset)
{ return getU8(nOffset) + (getU8(nOffset + 1) << 8); }
sal_uInt32 getU32(sal_uInt32 nOffset)
{ return getU16(nOffset) + (getU16(nOffset + 1) << 16); }
::rtl::OUString getUString(sal_uInt32 nOffset, sal_uInt32 nCount);
::rtl::OUString getString(sal_uInt32 nOffset, sal_uInt32 nCount);
};
typedef ::std::vector<rtl::OUString> StringVector_t;
template <class T>
class WW8Sttb : public WW8Struct
{
typedef ::boost::shared_ptr< void > ExtraPointer_t;
typedef ::std::vector< ExtraPointer_t > ExtrasVector_t;
bool bDoubleByteCharacters;
StringVector_t m_Strings;
ExtrasVector_t m_Extras;
public:
WW8Sttb(SvStream& rSt, sal_Int32 nPos, sal_uInt32 nSize);
virtual ~WW8Sttb();
sal_uInt32 getCount() const;
::rtl::OUString getEntry(sal_uInt32 nEntry) const
{
return m_Strings[nEntry];
}
StringVector_t & getStrings()
{
return m_Strings;
}
const T * getExtra(sal_uInt32 nEntry) const
{
return dynamic_cast<const T *> (m_Extras[nEntry].get());
}
};
template <class T>
WW8Sttb<T>::WW8Sttb(SvStream& rSt, sal_Int32 nPos, sal_uInt32 nSize)
: WW8Struct(rSt, nPos, nSize), bDoubleByteCharacters(false)
{
sal_uInt32 nOffset = 0;
if (getU16(nOffset) == 0xffff)
{
bDoubleByteCharacters = true;
nOffset += 2;
}
sal_uInt16 nCount = getU16(nOffset);
sal_uInt16 ncbExtra = getU16(nOffset + 2);
nOffset += 4;
for (sal_uInt16 i = 0; i < nCount; i++)
{
if (bDoubleByteCharacters)
{
sal_uInt16 nStrLen = getU16(nOffset);
m_Strings.push_back(getUString(nOffset +2, nStrLen));
nOffset += 2 + 2 * nStrLen;
}
else
{
sal_uInt8 nStrLen = getU8(nOffset);
m_Strings.push_back(getUString(nOffset, nStrLen));
nOffset += 1 + nStrLen;
}
if (ncbExtra > 0)
{
ExtraPointer_t pExtra(new T(this, nOffset, ncbExtra));
m_Extras.push_back(pExtra);
nOffset += ncbExtra;
}
}
}
template <class T>
WW8Sttb<T>::~WW8Sttb()
{
}
}