1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  */
9 
10 #include <unotest/filters-test.hxx>
11 #include <test/bootstrapfixture.hxx>
12 
13 #include <comphelper/fileformat.h>
14 
15 #include <sfx2/app.hxx>
16 #include <sfx2/docfilt.hxx>
17 #include <sfx2/docfile.hxx>
18 #include <sfx2/sfxsids.hrc>
19 #include <sfx2/fcontnr.hxx>
20 
21 #include <svl/stritem.hxx>
22 #include <unotools/tempfile.hxx>
23 
24 #include <iodetect.hxx>
25 #include <docsh.hxx>
26 
27 typedef tools::SvRef<SwDocShell> SwDocShellRef;
28 
29 using namespace ::com::sun::star;
30 
31 /* Implementation of Filters test */
32 
33 class SwFiltersTest
34     : public test::FiltersTest
35     , public test::BootstrapFixture
36 {
37 public:
38     virtual bool load( const OUString &rFilter, const OUString &rURL,
39         const OUString &rUserData, SfxFilterFlags nFilterFlags,
40         SotClipboardFormatId nClipboardID, unsigned int nFilterVersion) override;
41     virtual bool save( const OUString &rFilter, const OUString &rURL,
42         const OUString &rUserData, SfxFilterFlags nFilterFlags,
43         SotClipboardFormatId nClipboardID, unsigned int nFilterVersion) override;
44     virtual void setUp() override;
45 
46     // Ensure CVEs remain unbroken
47     void testCVEs();
48 
49     CPPUNIT_TEST_SUITE(SwFiltersTest);
50     CPPUNIT_TEST(testCVEs);
51     CPPUNIT_TEST_SUITE_END();
52 
53 private:
54     bool filter( const OUString &rFilter, const OUString &rURL,
55         const OUString &rUserData, SfxFilterFlags nFilterFlags,
56         SotClipboardFormatId nClipboardID, unsigned int nFilterVersion, bool bExport);
57     uno::Reference<uno::XInterface> m_xWriterComponent;
58 };
59 
load(const OUString & rFilter,const OUString & rURL,const OUString & rUserData,SfxFilterFlags nFilterFlags,SotClipboardFormatId nClipboardID,unsigned int nFilterVersion)60 bool SwFiltersTest::load(const OUString &rFilter, const OUString &rURL,
61     const OUString &rUserData, SfxFilterFlags nFilterFlags,
62         SotClipboardFormatId nClipboardID, unsigned int nFilterVersion)
63 {
64     return filter(rFilter, rURL, rUserData, nFilterFlags, nClipboardID, nFilterVersion, false);
65 }
66 
save(const OUString & rFilter,const OUString & rURL,const OUString & rUserData,SfxFilterFlags nFilterFlags,SotClipboardFormatId nClipboardID,unsigned int nFilterVersion)67 bool SwFiltersTest::save(const OUString &rFilter, const OUString &rURL,
68     const OUString &rUserData, SfxFilterFlags nFilterFlags,
69         SotClipboardFormatId nClipboardID, unsigned int nFilterVersion)
70 {
71     return filter(rFilter, rURL, rUserData, nFilterFlags, nClipboardID, nFilterVersion, true);
72 }
73 
filter(const OUString & rFilter,const OUString & rURL,const OUString & rUserData,SfxFilterFlags nFilterFlags,SotClipboardFormatId nClipboardID,unsigned int nFilterVersion,bool bExport)74 bool SwFiltersTest::filter(const OUString &rFilter, const OUString &rURL,
75     const OUString &rUserData, SfxFilterFlags nFilterFlags,
76         SotClipboardFormatId nClipboardID, unsigned int nFilterVersion, bool bExport)
77 {
78     std::shared_ptr<const SfxFilter> pFilter(new SfxFilter(
79         rFilter, OUString(), nFilterFlags,
80         nClipboardID, OUString(), OUString(),
81         rUserData, OUString()));
82     const_cast<SfxFilter*>(pFilter.get())->SetVersion(nFilterVersion);
83 
84     SwDocShellRef xDocShRef = new SwDocShell;
85     SfxMedium* pSrcMed = new SfxMedium(rURL, StreamMode::STD_READ);
86 
87     std::shared_ptr<const SfxFilter> pImportFilter;
88     std::shared_ptr<const SfxFilter> pExportFilter;
89     if (bExport)
90     {
91         SfxGetpApp()->GetFilterMatcher().GuessFilter(*pSrcMed, pImportFilter, SfxFilterFlags::IMPORT, SfxFilterFlags::NONE);
92         pExportFilter = pFilter;
93     }
94     else
95         pImportFilter = pFilter;
96 
97     pSrcMed->SetFilter(pImportFilter);
98 
99     if (rUserData == FILTER_TEXT_DLG)
100     {
101         pSrcMed->GetItemSet()->Put(
102             SfxStringItem(SID_FILE_FILTEROPTIONS, "UTF8,LF,Liberation Mono,en-US"));
103     }
104 
105     bool bLoaded = xDocShRef->DoLoad(pSrcMed);
106     if (!bExport)
107     {
108         if (xDocShRef.is())
109             xDocShRef->DoClose();
110         return bLoaded;
111     }
112 
113     // How come an error may be set, and still DoLoad() returns success? Strange...
114     if (bLoaded)
115         xDocShRef->ResetError();
116 
117     utl::TempFile aTempFile;
118     aTempFile.EnableKillingFile();
119     SfxMedium aDstMed(aTempFile.GetURL(), StreamMode::STD_WRITE);
120     aDstMed.SetFilter(pExportFilter);
121     bool bSaved = xDocShRef->DoSaveAs(aDstMed);
122     if (xDocShRef.is())
123         xDocShRef->DoClose();
124     return bSaved;
125 }
126 
127 #define isstorage SotClipboardFormatId::STRING
128 
testCVEs()129 void SwFiltersTest::testCVEs()
130 {
131     testDir("StarOffice XML (Writer)",
132             m_directories.getURLFromSrc("/sw/qa/core/data/xml/"),
133             FILTER_XML,
134             SfxFilterFlags::IMPORT | SfxFilterFlags::OWN | SfxFilterFlags::DEFAULT,
135             isstorage, SOFFICE_FILEFORMAT_CURRENT);
136 
137     testDir("writer8",
138             m_directories.getURLFromSrc("/sw/qa/core/data/odt/"),
139             FILTER_XML,
140             SfxFilterFlags::IMPORT | SfxFilterFlags::OWN | SfxFilterFlags::DEFAULT,
141             isstorage, SOFFICE_FILEFORMAT_CURRENT);
142 
143     testDir("MS Word 97",
144             m_directories.getURLFromSrc("/sw/qa/core/data/ww8/"),
145             FILTER_WW8);
146 
147     testDir("MS WinWord 5",
148             m_directories.getURLFromSrc("/sw/qa/core/data/ww5/"),
149             sWW5);
150 
151     testDir("Text (encoded)",
152             m_directories.getURLFromSrc("/sw/qa/core/data/txt/"),
153             FILTER_TEXT_DLG);
154 
155     testDir("MS Word 2007 XML",
156             m_directories.getURLFromSrc("/sw/qa/core/data/ooxml/"),
157             OUString(),
158             SfxFilterFlags::STARONEFILTER);
159 
160     testDir("Rich Text Format",
161             m_directories.getURLFromSrc("/sw/qa/core/data/rtf/"),
162             OUString(),
163             SfxFilterFlags::STARONEFILTER);
164 
165     testDir("HTML",
166             m_directories.getURLFromSrc("/sw/qa/core/data/html/"),
167             sHTML);
168 
169     testDir("T602Document",
170             m_directories.getURLFromSrc("/sw/qa/core/data/602/"),
171             OUString(),
172             SfxFilterFlags::STARONEFILTER);
173 
174     testDir("Rich Text Format",
175             m_directories.getURLFromSrc("/sw/qa/core/exportdata/rtf/"),
176             OUString(),
177             SfxFilterFlags::STARONEFILTER,
178             SotClipboardFormatId::NONE,
179             0,
180             /*bExport=*/true);
181 
182     testDir("HTML",
183             m_directories.getURLFromSrc("/sw/qa/core/exportdata/html/"),
184             sHTML,
185             SfxFilterFlags::NONE,
186             SotClipboardFormatId::NONE,
187             0,
188             /*bExport=*/true);
189 
190     testDir("MS Word 2007 XML",
191             m_directories.getURLFromSrc("/sw/qa/core/exportdata/ooxml/"),
192             OUString(),
193             SfxFilterFlags::STARONEFILTER,
194             SotClipboardFormatId::NONE,
195             0,
196             /*bExport=*/true);
197 
198 }
199 
setUp()200 void SwFiltersTest::setUp()
201 {
202     test::BootstrapFixture::setUp();
203 
204     //This is a bit of a fudge, we do this to ensure that SwGlobals::ensure,
205     //which is a private symbol to us, gets called
206     m_xWriterComponent =
207         getMultiServiceFactory()->createInstance("com.sun.star.comp.Writer.TextDocument");
208     CPPUNIT_ASSERT_MESSAGE("no writer component!", m_xWriterComponent.is());
209 }
210 
211 CPPUNIT_TEST_SUITE_REGISTRATION(SwFiltersTest);
212 
213 CPPUNIT_PLUGIN_IMPLEMENT();
214 
215 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
216