summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2017-06-06 20:22:19 +0200
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2017-06-07 23:11:40 +0200
commit839fd8215b557a22282824a2ab42b37b48ffd0f9 (patch)
tree297436654c034e88960f3920f96a5ed9614ab79f
parent631af1a5fa364f97c0d0761f3ef8d87fba667b62 (diff)
fix memory leak and improve variable lifecycle
Change-Id: I88689f19d5a25e87a02d330ed4a3bc7d78dfdbe5 Reviewed-on: https://gerrit.libreoffice.org/38536 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
-rw-r--r--sc/source/ui/docshell/dataprovider.cxx36
-rw-r--r--sc/source/ui/inc/dataprovider.hxx8
2 files changed, 21 insertions, 23 deletions
diff --git a/sc/source/ui/docshell/dataprovider.cxx b/sc/source/ui/docshell/dataprovider.cxx
index 0dbd60bb1b2d..8d0f9358ccc4 100644
--- a/sc/source/ui/docshell/dataprovider.cxx
+++ b/sc/source/ui/docshell/dataprovider.cxx
@@ -27,7 +27,7 @@ namespace sc {
namespace {
-std::unique_ptr<SvStream> FetchStreamFromURL(const OUString& rURL)
+std::unique_ptr<SvStream> FetchStreamFromURL(const OUString& rURL, OStringBuffer& rBuffer)
{
uno::Reference< ucb::XSimpleFileAccess3 > xFileAccess( ucb::SimpleFileAccess::create( comphelper::getProcessComponentContext() ), uno::UNO_QUERY );
@@ -36,22 +36,21 @@ std::unique_ptr<SvStream> FetchStreamFromURL(const OUString& rURL)
const sal_Int32 BUF_LEN = 8000;
uno::Sequence< sal_Int8 > buffer( BUF_LEN );
- OStringBuffer* aBuffer = new OStringBuffer( 64000 );
sal_Int32 nRead = 0;
while ( ( nRead = xStream->readBytes( buffer, BUF_LEN ) ) == BUF_LEN )
{
- aBuffer->append( reinterpret_cast< const char* >( buffer.getConstArray() ), nRead );
+ rBuffer.append( reinterpret_cast< const char* >( buffer.getConstArray() ), nRead );
}
if ( nRead > 0 )
{
- aBuffer->append( reinterpret_cast< const char* >( buffer.getConstArray() ), nRead );
+ rBuffer.append( reinterpret_cast< const char* >( buffer.getConstArray() ), nRead );
}
xStream->closeInput();
- SvStream* pStream = new SvMemoryStream(const_cast<char*>(aBuffer->getStr()), aBuffer->getLength(), StreamMode::READ);
+ SvStream* pStream = new SvMemoryStream(const_cast<char*>(rBuffer.getStr()), rBuffer.getLength(), StreamMode::READ);
return std::unique_ptr<SvStream>(pStream);
}
@@ -135,18 +134,17 @@ public:
}
};
-CSVFetchThread::CSVFetchThread(ScDocument** pDoc, const OUString& mrURL, size_t nColCount):
+CSVFetchThread::CSVFetchThread(ScDocument& rDoc, const OUString& mrURL, size_t nColCount):
Thread("ReaderThread"),
mpStream(nullptr),
- mpDocument(new ScDocument),
+ mrDocument(rDoc),
maURL (mrURL),
mnColCount(nColCount),
mbTerminate(false)
{
maConfig.delimiters.push_back(',');
maConfig.text_qualifier = '"';
- mpDocument->InsertTab(0, "blah");
- *pDoc = mpDocument;
+ mrDocument.InsertTab(0, "blah");
}
CSVFetchThread::~CSVFetchThread()
@@ -172,7 +170,8 @@ void CSVFetchThread::EndThread()
void CSVFetchThread::execute()
{
- mpStream = FetchStreamFromURL(maURL);
+ OStringBuffer aBuffer(64000);
+ mpStream = FetchStreamFromURL(maURL, aBuffer);
if (mpStream->good())
{
LinesType* pLines = new LinesType(10);
@@ -196,11 +195,11 @@ void CSVFetchThread::execute()
{
if (rCell.mbValue)
{
- mpDocument->SetValue(ScAddress(nCol, nCurRow, 0 /* Tab */), rCell.mfValue);
+ mrDocument.SetValue(ScAddress(nCol, nCurRow, 0 /* Tab */), rCell.mfValue);
}
else
{
- mpDocument->SetString(nCol, nCurRow, 0 /* Tab */, OUString(pLineHead+rCell.maStr.Pos, rCell.maStr.Size, RTL_TEXTENCODING_UTF8));
+ mrDocument.SetString(nCol, nCurRow, 0 /* Tab */, OUString(pLineHead+rCell.maStr.Pos, rCell.maStr.Size, RTL_TEXTENCODING_UTF8));
}
++nCol;
}
@@ -259,8 +258,8 @@ void CSVDataProvider::StartImport()
if (!mxCSVFetchThread.is())
{
- ScDocument* pDoc = nullptr;
- mxCSVFetchThread = new CSVFetchThread(&pDoc, maURL, mrRange.aEnd.Col() - mrRange.aStart.Col() + 1);
+ ScDocument aDoc;
+ mxCSVFetchThread = new CSVFetchThread(aDoc, maURL, mrRange.aEnd.Col() - mrRange.aStart.Col() + 1);
mxCSVFetchThread->launch();
if (mxCSVFetchThread.is())
{
@@ -268,8 +267,7 @@ void CSVDataProvider::StartImport()
mxCSVFetchThread->join();
}
- WriteToDoc(pDoc);
- delete pDoc;
+ WriteToDoc(aDoc);
}
Refresh();
@@ -303,7 +301,7 @@ Line CSVDataProvider::GetLine()
return mpLines->at(mnLineCount++);
}
-void CSVDataProvider::WriteToDoc(ScDocument* pDoc)
+void CSVDataProvider::WriteToDoc(ScDocument& rDoc)
{
double* pfValue;
for (int nRow = mrRange.aStart.Row(); nRow < mrRange.aEnd.Row(); ++nRow)
@@ -311,11 +309,11 @@ void CSVDataProvider::WriteToDoc(ScDocument* pDoc)
for (int nCol = mrRange.aStart.Col(); nCol < mrRange.aEnd.Col(); ++nCol)
{
ScAddress aAddr = ScAddress(nCol, nRow, mrRange.aStart.Tab());
- pfValue = pDoc->GetValueCell(aAddr);
+ pfValue = rDoc.GetValueCell(aAddr);
if (pfValue == nullptr)
{
- OUString aString = pDoc->GetString(nCol, nRow, mrRange.aStart.Tab());
+ OUString aString = rDoc.GetString(nCol, nRow, mrRange.aStart.Tab());
mpDocument->SetString(nCol, nRow, mrRange.aStart.Tab(), aString);
}
else
diff --git a/sc/source/ui/inc/dataprovider.hxx b/sc/source/ui/inc/dataprovider.hxx
index 07c8a0564d6f..19256199d258 100644
--- a/sc/source/ui/inc/dataprovider.hxx
+++ b/sc/source/ui/inc/dataprovider.hxx
@@ -88,7 +88,7 @@ typedef std::vector<Line> LinesType;
class CSVFetchThread : public salhelper::Thread
{
std::unique_ptr<SvStream> mpStream;
- ScDocument* mpDocument;
+ ScDocument& mrDocument;
OUString maURL;
size_t mnColCount;
@@ -106,7 +106,7 @@ class CSVFetchThread : public salhelper::Thread
virtual void execute() override;
public:
- CSVFetchThread(ScDocument** pDoc, const OUString&, size_t);
+ CSVFetchThread(ScDocument& rDoc, const OUString&, size_t);
virtual ~CSVFetchThread() override;
void RequestTerminate();
@@ -128,7 +128,7 @@ public:
virtual void StartImport() = 0;
virtual void Refresh() = 0;
- virtual void WriteToDoc(ScDocument*) = 0;
+ virtual void WriteToDoc(ScDocument&) = 0;
virtual ScRange GetRange() const = 0;
virtual const OUString& GetURL() const = 0;
@@ -153,7 +153,7 @@ public:
virtual void StartImport() override;
virtual void Refresh() override;
- virtual void WriteToDoc(ScDocument*) override;
+ virtual void WriteToDoc(ScDocument&) override;
Line GetLine();
ScRange GetRange() const override