Kaydet (Commit) 608a67ac authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Fix memory leaks, by refcounting XFContent

Change-Id: I8c94c63230eec13bf22043ff07f9f480a0463111
üst a83e40e2
......@@ -165,7 +165,9 @@ void LwpFribFrame::XFConvert(XFContentContainer* pCont)
else if(pContainerLayout && pContainerLayout->IsCell())
{
//same page as text and in cell, get the first xfpara
XFContentContainer* pXFFirtPara = static_cast<XFContentContainer*>(pCont->FindFirstContent(enumXFContentPara));
rtl::Reference<XFContent> first(
pCont->FindFirstContent(enumXFContentPara));
XFContentContainer* pXFFirtPara = static_cast<XFContentContainer*>(first.get());
if(pXFFirtPara)
pXFContentContainer = pXFFirtPara;
}
......
......@@ -127,7 +127,9 @@ void LwpFribTable::XFConvert(XFContentContainer* pCont)
else if(pContainer->IsCell())
{
//same page as text and in cell, get the first xfpara
XFContentContainer* pXFFirtPara = static_cast<XFContentContainer*>(pCont->FindFirstContent(enumXFContentPara));
rtl::Reference<XFContent> first(
pCont->FindFirstContent(enumXFContentPara));
XFContentContainer* pXFFirtPara = static_cast<XFContentContainer*>(first.get());
if(pXFFirtPara)
pXFContentContainer = pXFFirtPara;
}
......
......@@ -197,15 +197,15 @@ void LwpGraphicObject::XFConvert (XFContentContainer* pCont)
{
if ((m_sServerContextFormat[1]=='s'&&m_sServerContextFormat[2]=='d'&&m_sServerContextFormat[3]=='w'))
{
std::vector <XFFrame*>::iterator iter;
std::vector< rtl::Reference<XFFrame> >::iterator iter;
for (iter = m_vXFDrawObjects.begin(); iter != m_vXFDrawObjects.end(); ++iter)
{
pCont->Add(*iter);
pCont->Add(iter->get());
}
}
else if (this->IsGrafFormatValid())
{
XFImage* pImage = static_cast<XFImage*>(m_vXFDrawObjects.front());
XFImage* pImage = static_cast<XFImage*>(m_vXFDrawObjects.front().get());
if (m_bIsLinked)
{
......@@ -438,7 +438,7 @@ sal_uInt32 LwpGraphicObject::GetGrafData(sal_uInt8*& pGrafData)
*/
void LwpGraphicObject::CreateGrafObject()
{
XFImage* pImage = new XFImage();
rtl::Reference<XFImage> pImage = new XFImage();
// set image processing styles
XFImageStyle* pImageStyle = new XFImageStyle();
......@@ -660,7 +660,7 @@ void LwpGraphicObject::CreateGrafObject()
}
// insert image object into array
m_vXFDrawObjects.push_back(pImage);
m_vXFDrawObjects.push_back(pImage.get());
}
......
......@@ -110,7 +110,7 @@ private:
void ParseChart(IXFStream* pOutputStream);
bool IsGrafFormatValid();
// add by , 03/25/2005
std::vector <XFFrame*> m_vXFDrawObjects;
std::vector< rtl::Reference<XFFrame> > m_vXFDrawObjects;
// end add
public:
......
......@@ -78,7 +78,7 @@ LwpSdwFileLoader::~LwpSdwFileLoader(void)
* @descr entry of lwp-drawing objects.
* @param pDrawObjVector a container which will contains the created drawing object of XF-Model.
*/
void LwpSdwFileLoader::CreateDrawObjects(std::vector <XFFrame*>* pDrawObjVector)
void LwpSdwFileLoader::CreateDrawObjects(std::vector< rtl::Reference<XFFrame> >* pDrawObjVector)
{
unsigned char BinSignature[2];
m_pStream->Read(BinSignature,2);
......
......@@ -62,11 +62,15 @@
#ifndef INCLUDED_LOTUSWORDPRO_SOURCE_FILTER_LWPSDWFILELOADER_HXX
#define INCLUDED_LOTUSWORDPRO_SOURCE_FILTER_LWPSDWFILELOADER_HXX
#include <assert.h>
#include <sal/config.h>
#include <vector>
#include <rtl/ref.hxx>
#include <tools/stream.hxx>
#include "lwpheader.hxx"
#include "xfilter/ixfstream.hxx"
#include <vector>
class XFFrame;
class LwpGraphicObject;
......@@ -83,7 +87,7 @@ public:
// void RegisterStyle(void);
// add by ,03/25/2005
void CreateDrawObjects(std::vector <XFFrame*>* pDrawObjVector);
void CreateDrawObjects(std::vector< rtl::Reference<XFFrame> >* pDrawObjVector);
// end add
};
......
......@@ -93,7 +93,7 @@ LwpSdwGroupLoaderV0102::~LwpSdwGroupLoaderV0102()
* the corresponding drawing objects.
* @param pDrawObjVector a container which will contains the created drawing object of XF-Model.
*/
void LwpSdwGroupLoaderV0102::BeginDrawObjects(std::vector <XFFrame*>* pDrawObjVector)
void LwpSdwGroupLoaderV0102::BeginDrawObjects(std::vector< rtl::Reference<XFFrame> >* pDrawObjVector)
{
// save the container
m_pDrawObjVector = pDrawObjVector;
......
......@@ -62,9 +62,12 @@
#ifndef INCLUDED_LOTUSWORDPRO_SOURCE_FILTER_LWPSDWGROUPLOADERV0102_HXX
#define INCLUDED_LOTUSWORDPRO_SOURCE_FILTER_LWPSDWGROUPLOADERV0102_HXX
#include <sal/config.h>
#include <rtl/ref.hxx>
#include <tools/stream.hxx>
#include "lwpheader.hxx"
#include "assert.h"
#include "lwpsdwdrawheader.hxx"
class XFFrame;
......@@ -75,7 +78,7 @@ class LwpSdwGroupLoaderV0102
private:
SvStream* m_pStream;
LwpGraphicObject* m_pGraphicObj;
std::vector <XFFrame*>* m_pDrawObjVector;
std::vector< rtl::Reference<XFFrame> >* m_pDrawObjVector;
DrawingOffsetAndScale m_aTransformData;
......@@ -84,7 +87,7 @@ public:
~LwpSdwGroupLoaderV0102();
public:
void BeginDrawObjects(std::vector <XFFrame*>* pDrawObjVector);
void BeginDrawObjects(std::vector< rtl::Reference<XFFrame> >* pDrawObjVector);
XFDrawGroup* CreateDrawGroupObject(void);
XFFrame* CreateDrawObject(void);
// end add
......
......@@ -348,7 +348,9 @@ void LwpStory::XFConvertFrameInCell(XFContentContainer* pCont)
if(pFrameLayout->IsAnchorCell() && pFrameLayout->HasContent())
{
//get the first xfpara
XFContentContainer* pXFFirtPara = static_cast<XFContentContainer*>(pCont->FindFirstContent(enumXFContentPara));
rtl::Reference<XFContent> first(
pCont->FindFirstContent(enumXFContentPara));
XFContentContainer* pXFFirtPara = static_cast<XFContentContainer*>(first.get());
if(pXFFirtPara)
pFrameLayout->XFConvert(pXFFirtPara);
}
......@@ -424,7 +426,9 @@ void LwpStory::XFConvertFrameInHeaderFooter(XFContentContainer* pCont)
if(pFrameLayout->IsAnchorPage() && (pLayout->IsHeader() || pLayout->IsFooter()))
{
//The frame must be included by <text:p>
XFContentContainer* pXFFirtPara = static_cast<XFContentContainer*>(pCont->FindFirstContent(enumXFContentPara));
rtl::Reference<XFContent> first(
pCont->FindFirstContent(enumXFContentPara));
XFContentContainer* pXFFirtPara = static_cast<XFContentContainer*>(first.get());
if(pXFFirtPara)
pFrameLayout->XFConvert(pXFFirtPara);
}
......
......@@ -1183,8 +1183,9 @@ void LwpTableLayout::PostProcessParagraph(XFCell *pCell, sal_uInt16 nRowID, sal_
LwpCellLayout * pCellLayout = GetCellByRowCol(nRowID, nColID);
if(pCellLayout)
{
XFParagraph * pXFPara = NULL;
pXFPara = static_cast<XFParagraph*>(pCell->FindFirstContent(enumXFContentPara));
rtl::Reference<XFContent> first(
pCell->FindFirstContent(enumXFContentPara));
XFParagraph * pXFPara = static_cast<XFParagraph*>(first.get());
if (!pXFPara)
return;
XFColor aNullColor = XFColor();
......
......@@ -63,6 +63,7 @@
#include <sal/config.h>
#include <rtl/ustring.hxx>
#include <salhelper/simplereferenceobject.hxx>
#include "xfdefs.hxx"
......@@ -73,11 +74,9 @@ class IXFStream;
* Base class for all content object.
* There is only two properties:style name and content type in this class.
*/
class XFContent
class XFContent: public salhelper::SimpleReferenceObject
{
public:
virtual ~XFContent() {}
/**
* @short: return the content type.
*/
......@@ -98,6 +97,8 @@ public:
protected:
XFContent() {}
virtual ~XFContent() {}
OUString m_strStyleName;
};
......
......@@ -66,13 +66,6 @@ XFContentContainer::XFContentContainer()
XFContentContainer::~XFContentContainer()
{
std::vector<XFContent*>::iterator it;
for( it = m_aContents.begin(); it != m_aContents.end(); ++it )
{
XFContent *pContent = *it;
delete pContent;
}
}
void XFContentContainer::Add(XFContent *pContent)
......@@ -102,26 +95,18 @@ int XFContentContainer::GetCount() const
void XFContentContainer::Reset()
{
std::vector<XFContent*>::iterator it;
for( it = m_aContents.begin(); it != m_aContents.end(); ++it )
{
XFContent *pContent = *it;
if( pContent )
delete pContent;
}
m_aContents.clear();
}
XFContent* XFContentContainer::FindFirstContent(enumXFContent type)
rtl::Reference<XFContent> XFContentContainer::FindFirstContent(enumXFContent type)
{
XFContent *pRet = NULL;
XFContent *pContent = NULL;
rtl::Reference<XFContent> pRet;
rtl::Reference<XFContent> pContent;
for( int i=0; i<GetCount(); i++ )
{
pContent = GetContent(i);
if( !pContent )
if( !pContent.is() )
continue;
enumXFContent eType = pContent->GetContentType();
......@@ -129,11 +114,11 @@ XFContent* XFContentContainer::FindFirstContent(enumXFContent type)
return pContent;
else
{
XFContentContainer *pChildCont = static_cast<XFContentContainer*>(pContent);
XFContentContainer *pChildCont = static_cast<XFContentContainer*>(pContent.get());
if( pChildCont )
{
pRet = pChildCont->FindFirstContent(type);
if( pRet )
if( pRet.is() )
return pRet;
}
}
......@@ -148,17 +133,17 @@ enumXFContent XFContentContainer::GetContentType()
void XFContentContainer::ToXml(IXFStream *pStrm)
{
std::vector<XFContent*>::iterator it;
std::vector< rtl::Reference<XFContent> >::iterator it;
for( it = m_aContents.begin(); it != m_aContents.end(); ++it )
{
XFContent *pContent = *it;
XFContent *pContent = it->get();
if( pContent )
pContent->ToXml(pStrm);
}
}
XFContent* XFContentContainer::GetLastContent()
rtl::Reference<XFContent> XFContentContainer::GetLastContent()
{
sal_uInt32 index = m_aContents.size()-1;
if(index >0)
......
......@@ -64,7 +64,7 @@
#include <vector>
#include <boost/noncopyable.hpp>
#include <rtl/ref.hxx>
#include "xfcontent.hxx"
......@@ -73,7 +73,7 @@
* A container for content.
* The contents will be deleted when delete container.
*/
class XFContentContainer : public XFContent, private boost::noncopyable
class XFContentContainer : public XFContent
{
public:
XFContentContainer();
......@@ -91,7 +91,7 @@ public:
virtual void InsertAtBegin(XFContent *pContent);
virtual void RemoveAt(sal_uInt32 nPos);
virtual XFContent* GetLastContent();
virtual rtl::Reference<XFContent> GetLastContent();
virtual void RemoveLastContent();
/**
* @descr convience function for add text content.
......@@ -106,7 +106,7 @@ public:
/**
* @descr get content by index.
*/
XFContent* GetContent(sal_uInt32 index) const;
rtl::Reference<XFContent> GetContent(sal_uInt32 index) const;
/**
* @descr clear all contents in the container.
......@@ -116,7 +116,7 @@ public:
/**
* @descr helper function, find first content by type.
*/
XFContent* FindFirstContent(enumXFContent type);
rtl::Reference<XFContent> FindFirstContent(enumXFContent type);
/**
* @descr return the content type.
......@@ -128,10 +128,10 @@ public:
virtual void ToXml(IXFStream *pStrm) SAL_OVERRIDE;
private:
std::vector<XFContent*> m_aContents;
std::vector< rtl::Reference<XFContent> > m_aContents;
};
inline XFContent* XFContentContainer::GetContent(sal_uInt32 index) const
inline rtl::Reference<XFContent> XFContentContainer::GetContent(sal_uInt32 index) const
{
if (index > m_aContents.size()-1)
return NULL;
......
......@@ -194,12 +194,12 @@ void XFFrame::AdjustZIndex()
{
for( int i=0; i<GetCount(); i++ )
{
XFContent *pContent = GetContent(i);
if( pContent )
rtl::Reference<XFContent> pContent = GetContent(i);
if( pContent.is() )
{
if( pContent->GetContentType() == enumXFContentFrame )
{
XFFrame *pFrame = (XFFrame*)pContent;
XFFrame *pFrame = (XFFrame*)pContent.get();
pFrame->m_nZIndex = m_nZIndex + 1;
pFrame->AdjustZIndex();
}
......
......@@ -77,16 +77,6 @@ XFTextSpan::XFTextSpan(const OUString& text,
XFTextSpan::~XFTextSpan()
{
std::vector<XFContent*>::iterator it;
for( it = m_aContents.begin(); it != m_aContents.end(); ++it )
{
XFContent *pContent = *it;
if( pContent )
{
delete pContent;
}
}
m_aContents.clear();
}
enumXFContent XFTextSpan::GetContentType()
......@@ -117,10 +107,10 @@ void XFTextSpan::ToXml(IXFStream *pStrm)
pAttrList->AddAttribute( "text:style-name", GetStyleName() );
pStrm->StartElement( "text:span" );
std::vector<XFContent*>::iterator it;
std::vector< rtl::Reference<XFContent> >::iterator it;
for( it= m_aContents.begin(); it!= m_aContents.end(); ++it )
{
XFContent *pContent = *it;
XFContent *pContent = it->get();
if( pContent )
pContent->ToXml(pStrm);
}
......@@ -140,20 +130,20 @@ void XFTextSpanStart::ToXml(IXFStream *pStrm)
pAttrList->AddAttribute( "text:style-name", GetStyleName() );
pStrm->StartElement( "text:span" );
std::vector<XFContent*>::iterator it;
std::vector< rtl::Reference<XFContent> >::iterator it;
for( it= m_aContents.begin(); it!= m_aContents.end(); ++it )
{
XFContent *pContent = *it;
XFContent *pContent = it->get();
if( pContent )
pContent->ToXml(pStrm);
}
}
void XFTextSpanEnd::ToXml(IXFStream *pStrm)
{
std::vector<XFContent*>::iterator it;
std::vector< rtl::Reference<XFContent> >::iterator it;
for( it= m_aContents.begin(); it!= m_aContents.end(); ++it )
{
XFContent *pContent = *it;
XFContent *pContent = it->get();
if( pContent )
pContent->ToXml(pStrm);
}
......
......@@ -60,9 +60,14 @@
#ifndef INCLUDED_LOTUSWORDPRO_SOURCE_FILTER_XFILTER_XFTEXTSPAN_HXX
#define INCLUDED_LOTUSWORDPRO_SOURCE_FILTER_XFILTER_XFTEXTSPAN_HXX
#include <sal/config.h>
#include <vector>
#include <rtl/ref.hxx>
#include "xfglobal.hxx"
#include "xfcontent.hxx"
#include <vector>
class IXFStream;
......@@ -80,7 +85,7 @@ public:
virtual enumXFContent GetContentType() SAL_OVERRIDE;
virtual void ToXml(IXFStream *pStrm) SAL_OVERRIDE;
protected:
std::vector<XFContent*> m_aContents;
std::vector< rtl::Reference<XFContent> > m_aContents;
};
class XFTextSpanStart : public XFTextSpan //for adding style of power field
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment