initial header substream support

This commit is contained in:
Miklos Vajna 2011-06-24 12:35:02 +02:00
parent 583cae3868
commit 29041d47d2
2 changed files with 52 additions and 18 deletions

View file

@ -153,17 +153,6 @@ void lcl_Break(Stream& rMapper, bool bMinimal = false)
}
}
void lcl_ParBreak(Stream& rMapper)
{
// end previous paragraph
rMapper.startCharacterGroup();
lcl_Break(rMapper, true);
rMapper.endCharacterGroup();
rMapper.endParagraphGroup();
// start new one
rMapper.startParagraphGroup();
}
void lcl_SectBreak(Stream& rMapper, std::stack<RTFParserState>& aStates, bool bFinal = false)
{
// Section properties are a paragraph sprm.
@ -194,6 +183,7 @@ RTFDocumentImpl::RTFDocumentImpl(uno::Reference<uno::XComponentContext> const& x
uno::Reference<lang::XComponent> const& xDstDoc,
uno::Reference<frame::XFrame> const& xFrame)
: m_xContext(xContext),
m_xInputStream(xInputStream),
m_xDstDoc(xDstDoc),
m_xFrame(xFrame),
m_nGroup(0),
@ -208,7 +198,9 @@ RTFDocumentImpl::RTFDocumentImpl(uno::Reference<uno::XComponentContext> const& x
m_xStorage(),
m_aTableBuffer(),
m_bTable(false),
m_bIsSubtream(false)
m_bIsSubstream(false),
m_nHeaderPos(0),
m_nGroupStartPos(0)
{
OSL_ENSURE(xInputStream.is(), "no input stream");
if (!xInputStream.is())
@ -237,7 +229,38 @@ Stream& RTFDocumentImpl::Mapper()
void RTFDocumentImpl::setSubstream(bool bIsSubtream)
{
m_bIsSubtream = bIsSubtream;
m_bIsSubstream = bIsSubtream;
}
void RTFDocumentImpl::parBreak()
{
// end previous paragraph
Mapper().startCharacterGroup();
lcl_Break(Mapper(), true);
if (m_nHeaderPos > 0)
{
sal_uInt32 nPos = Strm().Tell();
// Seek to header position, parse, then seek back.
RTFDocumentImpl aImpl(m_xContext, m_xInputStream, m_xDstDoc, m_xFrame);
aImpl.setSubstream(true);
aImpl.seek(m_nHeaderPos);
OSL_TRACE("header substream start");
aImpl.resolve(Mapper());
OSL_TRACE("header substream end");
Strm().Seek(nPos);
m_nHeaderPos = 0;
}
Mapper().endCharacterGroup();
Mapper().endParagraphGroup();
// start new one
Mapper().startParagraphGroup();
}
void RTFDocumentImpl::seek(sal_uInt32 nPos)
{
Strm().Seek(nPos);
}
sal_uInt32 RTFDocumentImpl::getColorTable(sal_uInt32 nIndex)
@ -635,6 +658,10 @@ int RTFDocumentImpl::dispatchDestination(RTFKeyword nKeyword)
case RTF_NESTTABLEPROPS:
m_aStates.top().nDestinationState = DESTINATION_NESTEDTABLEPROPERTIES;
break;
case RTF_HEADER:
if (!m_bIsSubstream)
m_nHeaderPos = m_nGroupStartPos-1;
break;
case RTF_LISTTEXT:
// Should be ignored by any reader that understands Word 97 through Word 2007 numbering.
case RTF_NONESTTABLES:
@ -689,7 +716,7 @@ int RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword)
case RTF_PAR:
{
if (!m_bTable)
lcl_ParBreak(Mapper());
parBreak();
else
{
RTFValue::Pointer_t pValue;
@ -1444,7 +1471,7 @@ int RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam)
else if (aPair.first == BUFFER_ENDRUN)
Mapper().endCharacterGroup();
else if (aPair.first == BUFFER_PAR)
lcl_ParBreak(Mapper());
parBreak();
else
OSL_FAIL("should not happen");
}
@ -1650,8 +1677,8 @@ int RTFDocumentImpl::dispatchKeyword(OString& rKeyword, bool bParam, int nParam)
{
if (m_aStates.top().nDestinationState == DESTINATION_SKIP)
return 0;
//OSL_TRACE("%s: keyword '\\%s' with param? %d param val: '%d'", OSL_THIS_FUNC,
// rKeyword.getStr(), (bParam ? 1 : 0), (bParam ? nParam : 0));
OSL_TRACE("%s: keyword '\\%s' with param? %d param val: '%d'", OSL_THIS_FUNC,
rKeyword.getStr(), (bParam ? 1 : 0), (bParam ? nParam : 0));
int i, ret;
for (i = 0; i < nRTFControlWords; i++)
{
@ -1756,6 +1783,7 @@ int RTFDocumentImpl::pushState()
{
//OSL_TRACE("%s before push: %d", OSL_THIS_FUNC, m_nGroup);
m_nGroupStartPos = Strm().Tell();
RTFParserState aState;
if (!m_aStates.empty())
{
@ -2047,6 +2075,7 @@ int RTFDocumentImpl::resolveParse()
while ((Strm() >> ch, !Strm().IsEof()))
{
OSL_TRACE("%s: parsing character '%c'", OSL_THIS_FUNC, ch);
if (m_nGroup < 0)
return ERROR_GROUP_UNDER;
if (!m_aStates.empty() && m_aStates.top().nInternalState == INTERNAL_BIN)

View file

@ -182,6 +182,7 @@ namespace writerfilter {
RTFSprms_t mergeAttributes();
int asHex(char ch);
void setSubstream(bool bIsSubtream);
void seek(sal_uInt32 nPos);
private:
int resolveParse();
int resolveKeyword();
@ -200,8 +201,10 @@ namespace writerfilter {
int pushState();
int popState();
void text(rtl::OUString& rString);
void parBreak();
com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const& m_xContext;
com::sun::star::uno::Reference<com::sun::star::io::XInputStream> const& m_xInputStream;
com::sun::star::uno::Reference<com::sun::star::lang::XComponent> const& m_xDstDoc;
com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const& m_xFrame;
com::sun::star::uno::Reference<com::sun::star::lang::XMultiServiceFactory> m_xModelFactory;
@ -232,7 +235,9 @@ namespace writerfilter {
std::deque<std::pair<RTFBufferTypes, RTFValue::Pointer_t>> m_aTableBuffer;
bool m_bTable;
/// If this is a substream.
bool m_bIsSubtream;
bool m_bIsSubstream;
sal_uInt32 m_nHeaderPos;
sal_uInt32 m_nGroupStartPos;
};
} // namespace rtftok
} // namespace writerfilter