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