Kaydet (Commit) 2b61ae38 authored tarafından Caolán McNamara's avatar Caolán McNamara

rework ScQProReader to take SvStream instead of SfxMedium

its only uses the stream anyway and this makes it far
easier to build a fuzzer on

Change-Id: I4aa8b56d4b041708c4de1730d503641ab23c14e8
üst 1d5c3028
...@@ -75,7 +75,7 @@ class SAL_DLLPUBLIC_RTTI ScFormatFilterPlugin { ...@@ -75,7 +75,7 @@ class SAL_DLLPUBLIC_RTTI ScFormatFilterPlugin {
public: public:
// various import filters // various import filters
virtual FltError ScImportLotus123( SfxMedium&, ScDocument*, rtl_TextEncoding eSrc ) = 0; virtual FltError ScImportLotus123( SfxMedium&, ScDocument*, rtl_TextEncoding eSrc ) = 0;
virtual FltError ScImportQuattroPro( SfxMedium &rMedium, ScDocument *pDoc ) = 0; virtual FltError ScImportQuattroPro(SvStream* pStream, ScDocument *pDoc) = 0;
virtual FltError ScImportExcel( SfxMedium&, ScDocument*, const EXCIMPFORMAT ) = 0; virtual FltError ScImportExcel( SfxMedium&, ScDocument*, const EXCIMPFORMAT ) = 0;
// eFormat == EIF_AUTO -> matching filter is used automatically // eFormat == EIF_AUTO -> matching filter is used automatically
// eFormat == EIF_BIFF5 -> only Biff5 stream is read successfully (in an Excel97 doc, too) // eFormat == EIF_BIFF5 -> only Biff5 stream is read successfully (in an Excel97 doc, too)
......
...@@ -219,18 +219,21 @@ FltError ScFormatFilterPluginImpl::ScExportExcel5( SfxMedium& rMedium, ScDocumen ...@@ -219,18 +219,21 @@ FltError ScFormatFilterPluginImpl::ScExportExcel5( SfxMedium& rMedium, ScDocumen
return eRet; return eRet;
} }
extern "C" SAL_DLLPUBLIC_EXPORT bool SAL_CALL TestImportSpreadsheet(const OUString &rURL, const OUString &rFlt) extern "C" SAL_DLLPUBLIC_EXPORT bool SAL_CALL TestImportQPW(SvStream &rStream)
{
ScDLL::Init();
ScDocument aDocument;
aDocument.MakeTable(0);
return ScFormatFilter::Get().ScImportQuattroPro(&rStream, &aDocument) == eERR_OK;
}
extern "C" SAL_DLLPUBLIC_EXPORT bool SAL_CALL TestImportXLS(const OUString &rURL)
{ {
ScDLL::Init(); ScDLL::Init();
SfxMedium aMedium(rURL, StreamMode::READ); SfxMedium aMedium(rURL, StreamMode::READ);
ScDocument aDocument; ScDocument aDocument;
aDocument.MakeTable(0); aDocument.MakeTable(0);
FltError eError(eERR_OK); return ScFormatFilter::Get().ScImportExcel(aMedium, &aDocument, EIF_AUTO) == eERR_OK;
if (rFlt == "xls")
eError = ScFormatFilter::Get().ScImportExcel(aMedium, &aDocument, EIF_AUTO);
else if (rFlt == "wb2")
eError = ScFormatFilter::Get().ScImportQuattroPro(aMedium, &aDocument);
return eError == eERR_OK;
} }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -264,7 +264,7 @@ public: ...@@ -264,7 +264,7 @@ public:
virtual ~ScFormatFilterPluginImpl(); virtual ~ScFormatFilterPluginImpl();
// various import filters // various import filters
virtual FltError ScImportLotus123( SfxMedium&, ScDocument*, rtl_TextEncoding eSrc ) override; virtual FltError ScImportLotus123( SfxMedium&, ScDocument*, rtl_TextEncoding eSrc ) override;
virtual FltError ScImportQuattroPro( SfxMedium &rMedium, ScDocument *pDoc ) override; virtual FltError ScImportQuattroPro(SvStream* pStream, ScDocument *pDoc) override;
virtual FltError ScImportExcel( SfxMedium&, ScDocument*, const EXCIMPFORMAT ) override; virtual FltError ScImportExcel( SfxMedium&, ScDocument*, const EXCIMPFORMAT ) override;
// eFormat == EIF_AUTO -> matching filter is used automatically // eFormat == EIF_AUTO -> matching filter is used automatically
// eFormat == EIF_BIFF5 -> only Biff5 stream leads to success (even in an Excel97 doc) // eFormat == EIF_BIFF5 -> only Biff5 stream leads to success (even in an Excel97 doc)
......
...@@ -40,7 +40,7 @@ class ScQProReader ...@@ -40,7 +40,7 @@ class ScQProReader
bool mbEndOfFile; bool mbEndOfFile;
public: public:
ScQProReader( SfxMedium &rMedium ); ScQProReader(SvStream* pStream);
~ScQProReader(); ~ScQProReader();
bool recordsLeft(); bool recordsLeft();
......
...@@ -123,20 +123,20 @@ FltError ScQProReader::readSheet( SCTAB nTab, ScDocument* pDoc, ScQProStyle *pSt ...@@ -123,20 +123,20 @@ FltError ScQProReader::readSheet( SCTAB nTab, ScDocument* pDoc, ScQProStyle *pSt
return eRet; return eRet;
} }
FltError ScFormatFilterPluginImpl::ScImportQuattroPro( SfxMedium &rMedium, ScDocument *pDoc ) FltError ScFormatFilterPluginImpl::ScImportQuattroPro(SvStream *pStream, ScDocument *pDoc)
{ {
ScQProReader aReader( rMedium ); ScQProReader aReader(pStream);
FltError eRet = aReader.import( pDoc ); FltError eRet = aReader.import( pDoc );
return eRet; return eRet;
} }
ScQProReader::ScQProReader( SfxMedium &rMedium ) ScQProReader::ScQProReader(SvStream* pStream)
: mnId(0) : mnId(0)
, mnLength(0) , mnLength(0)
, mnOffset(0) , mnOffset(0)
, mpStream(pStream)
, mbEndOfFile(false) , mbEndOfFile(false)
{ {
mpStream = rMedium.GetInStream();
if( mpStream ) if( mpStream )
{ {
mpStream->SetBufferSize( 65535 ); mpStream->SetBufferSize( 65535 );
......
...@@ -1372,7 +1372,7 @@ bool ScDocShell::ConvertFrom( SfxMedium& rMedium ) ...@@ -1372,7 +1372,7 @@ bool ScDocShell::ConvertFrom( SfxMedium& rMedium )
} }
else if (aFltName == pFilterQPro6) else if (aFltName == pFilterQPro6)
{ {
FltError eError = ScFormatFilter::Get().ScImportQuattroPro( rMedium, &aDocument); FltError eError = ScFormatFilter::Get().ScImportQuattroPro(rMedium.GetInStream(), &aDocument);
if (eError != eERR_OK) if (eError != eERR_OK)
{ {
if (!GetError()) if (!GetError())
......
...@@ -2217,7 +2217,7 @@ class ScFormatFilterMissing : public ScFormatFilterPlugin { ...@@ -2217,7 +2217,7 @@ class ScFormatFilterMissing : public ScFormatFilterPlugin {
} }
virtual ~ScFormatFilterMissing() {} virtual ~ScFormatFilterMissing() {}
virtual FltError ScImportLotus123( SfxMedium&, ScDocument*, rtl_TextEncoding ) override { return eERR_INTERN; } virtual FltError ScImportLotus123( SfxMedium&, ScDocument*, rtl_TextEncoding ) override { return eERR_INTERN; }
virtual FltError ScImportQuattroPro( SfxMedium &, ScDocument * ) override { return eERR_INTERN; } virtual FltError ScImportQuattroPro(SvStream*, ScDocument *) override { return eERR_INTERN; }
virtual FltError ScImportExcel( SfxMedium&, ScDocument*, const EXCIMPFORMAT ) override { return eERR_INTERN; } virtual FltError ScImportExcel( SfxMedium&, ScDocument*, const EXCIMPFORMAT ) override { return eERR_INTERN; }
virtual FltError ScImportStarCalc10( SvStream&, ScDocument* ) override { return eERR_INTERN; } virtual FltError ScImportStarCalc10( SvStream&, ScDocument* ) override { return eERR_INTERN; }
virtual FltError ScImportDif( SvStream&, ScDocument*, const ScAddress&, virtual FltError ScImportDif( SvStream&, ScDocument*, const ScAddress&,
......
...@@ -66,7 +66,7 @@ using namespace cppu; ...@@ -66,7 +66,7 @@ using namespace cppu;
extern "C" { static void SAL_CALL thisModule() {} } extern "C" { static void SAL_CALL thisModule() {} }
#endif #endif
typedef bool (*WFilterCall)(const OUString &rUrl, const OUString &rFlt); typedef bool (*WFilterCall)(const OUString &rUrl);
typedef bool (*FFilterCall)(SvStream &rStream); typedef bool (*FFilterCall)(SvStream &rStream);
/* This constant specifies the number of inputs to process before restarting. /* This constant specifies the number of inputs to process before restarting.
...@@ -379,8 +379,7 @@ try_again: ...@@ -379,8 +379,7 @@ try_again:
SvFileStream aFileStream(out, StreamMode::READ); SvFileStream aFileStream(out, StreamMode::READ);
ret = (int) (*pfnImport)(aFileStream); ret = (int) (*pfnImport)(aFileStream);
} }
else if ( (strcmp(argv[2], "xls") == 0) || else if (strcmp(argv[2], "xls") == 0)
(strcmp(argv[2], "wb2") == 0) )
{ {
static WFilterCall pfnImport(nullptr); static WFilterCall pfnImport(nullptr);
if (!pfnImport) if (!pfnImport)
...@@ -388,10 +387,24 @@ try_again: ...@@ -388,10 +387,24 @@ try_again:
osl::Module aLibrary; osl::Module aLibrary;
aLibrary.loadRelative(&thisModule, "libscfiltlo.so", SAL_LOADMODULE_LAZY); aLibrary.loadRelative(&thisModule, "libscfiltlo.so", SAL_LOADMODULE_LAZY);
pfnImport = reinterpret_cast<WFilterCall>( pfnImport = reinterpret_cast<WFilterCall>(
aLibrary.getFunctionSymbol("TestImportSpreadsheet")); aLibrary.getFunctionSymbol("TestImportXLS"));
aLibrary.release(); aLibrary.release();
} }
ret = (int) (*pfnImport)(out, OUString(argv[2], strlen(argv[2]), RTL_TEXTENCODING_UTF8)); ret = (int) (*pfnImport)(out);
}
else if (strcmp(argv[2], "ww2") == 0)
{
static FFilterCall pfnImport(nullptr);
if (!pfnImport)
{
osl::Module aLibrary;
aLibrary.loadRelative(&thisModule, "libscfiltlo.so", SAL_LOADMODULE_LAZY);
pfnImport = reinterpret_cast<FFilterCall>(
aLibrary.getFunctionSymbol("TestImportQPW"));
aLibrary.release();
}
SvFileStream aFileStream(out, StreamMode::READ);
ret = (int) (*pfnImport)(aFileStream);
} }
else if (strcmp(argv[2], "hwp") == 0) else if (strcmp(argv[2], "hwp") == 0)
{ {
......
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