Kaydet (Commit) 839fd821 authored tarafından Markus Mohrhard's avatar Markus Mohrhard

fix memory leak and improve variable lifecycle

Change-Id: I88689f19d5a25e87a02d330ed4a3bc7d78dfdbe5
Reviewed-on: https://gerrit.libreoffice.org/38536Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarMarkus Mohrhard <markus.mohrhard@googlemail.com>
üst 631af1a5
......@@ -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
......
......@@ -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
......
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