Line data Source code
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 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <string.h>
21 : #include <stdio.h>
22 : #include <hintids.hxx>
23 : #include <i18nlangtag/lang.h>
24 : #include <i18nlangtag/languagetag.hxx>
25 : #include <vcl/msgbox.hxx>
26 : #include <svtools/parhtml.hxx>
27 : #include <sot/storage.hxx>
28 : #include <comphelper/classids.hxx>
29 : #include <sfx2/app.hxx>
30 : #include <sfx2/docfilt.hxx>
31 : #include <sfx2/fcontnr.hxx>
32 : #include <sfx2/docfile.hxx>
33 : #include <editeng/lrspitem.hxx>
34 : #include <editeng/tstpitem.hxx>
35 : #include <doc.hxx>
36 : #include <docary.hxx>
37 : #include <pam.hxx>
38 : #include <shellio.hxx>
39 : #include <docsh.hxx>
40 : #include <wdocsh.hxx>
41 : #include <fltini.hxx>
42 : #include <hints.hxx>
43 : #include <init.hxx>
44 : #include <frmatr.hxx>
45 : #include <fmtfsize.hxx>
46 : #include <swtable.hxx>
47 : #include <fmtcntnt.hxx>
48 : #include <editeng/boxitem.hxx>
49 : #include <frmfmt.hxx>
50 : #include <numrule.hxx>
51 : #include <ndtxt.hxx>
52 : #include <swfltopt.hxx>
53 : #include <swerror.h>
54 : #include <osl/module.hxx>
55 : #include <comphelper/processfactory.hxx>
56 : #include <com/sun/star/beans/XPropertySet.hpp>
57 : #include <com/sun/star/util/XMacroExpander.hpp>
58 : #include <rtl/uri.hxx>
59 :
60 : using namespace utl;
61 : using namespace com::sun::star::uno;
62 : using namespace com::sun::star;
63 :
64 : SwRead ReadAscii = 0, ReadHTML = 0, ReadXML = 0;
65 :
66 : Reader* GetRTFReader();
67 : Reader* GetWW8Reader();
68 :
69 : // Note: if editing, please don't forget to modify also the enum
70 : // ReaderWriterEnum and aFilterDetect in shellio.hxx
71 0 : SwReaderWriterEntry aReaderWriter[] =
72 : {
73 : SwReaderWriterEntry( &::GetRTFReader, &::GetRTFWriter, sal_True ),
74 : SwReaderWriterEntry( 0, &::GetASCWriter, sal_False ),
75 : SwReaderWriterEntry( &::GetWW8Reader, &::GetWW8Writer, sal_True ),
76 : SwReaderWriterEntry( &::GetWW8Reader, &::GetWW8Writer, sal_True ),
77 : SwReaderWriterEntry( &::GetRTFReader, &::GetRTFWriter, sal_True ),
78 : SwReaderWriterEntry( 0, &::GetHTMLWriter, sal_True ),
79 : SwReaderWriterEntry( 0, 0, sal_True ),
80 : SwReaderWriterEntry( &::GetWW8Reader, 0, sal_True ),
81 : SwReaderWriterEntry( 0, &::GetXMLWriter, sal_True ),
82 : SwReaderWriterEntry( 0, &::GetASCWriter, sal_False ),
83 : SwReaderWriterEntry( 0, &::GetASCWriter, sal_True )
84 0 : };
85 :
86 0 : Reader* SwReaderWriterEntry::GetReader()
87 : {
88 0 : if ( pReader )
89 0 : return pReader;
90 0 : else if ( fnGetReader )
91 : {
92 0 : pReader = (*fnGetReader)();
93 0 : return pReader;
94 : }
95 0 : return NULL;
96 : }
97 :
98 0 : void SwReaderWriterEntry::GetWriter( const OUString& rNm, const OUString& rBaseURL, WriterRef& xWrt ) const
99 : {
100 0 : if ( fnGetWriter )
101 0 : (*fnGetWriter)( rNm, rBaseURL, xWrt );
102 : else
103 0 : xWrt = WriterRef(0);
104 0 : }
105 :
106 0 : SwRead SwGetReaderXML() // SW_DLLPUBLIC
107 : {
108 0 : return ReadXML;
109 : }
110 :
111 0 : inline void _SetFltPtr( sal_uInt16 rPos, SwRead pReader )
112 : {
113 0 : aReaderWriter[ rPos ].pReader = pReader;
114 0 : }
115 :
116 : namespace {
117 :
118 : #ifndef DISABLE_DYNLOADING
119 :
120 0 : extern "C" { static void SAL_CALL thisModule() {} }
121 :
122 : #endif
123 :
124 : }
125 :
126 : namespace sw {
127 :
128 0 : Filters::Filters()
129 : {
130 0 : _SetFltPtr( READER_WRITER_BAS, (ReadAscii = new AsciiReader) );
131 0 : _SetFltPtr( READER_WRITER_HTML, (ReadHTML = new HTMLReader) );
132 0 : _SetFltPtr( READER_WRITER_WW1, new WW1Reader );
133 0 : _SetFltPtr( READER_WRITER_XML, (ReadXML = new XMLReader) );
134 0 : _SetFltPtr( READER_WRITER_TEXT_DLG, ReadAscii );
135 0 : _SetFltPtr( READER_WRITER_TEXT, ReadAscii );
136 0 : }
137 :
138 0 : Filters::~Filters()
139 : {
140 : // kill Readers
141 0 : for( sal_uInt16 n = 0; n < MAXFILTER; ++n )
142 : {
143 0 : SwReaderWriterEntry& rEntry = aReaderWriter[n];
144 0 : if( rEntry.bDelReader && rEntry.pReader )
145 0 : delete rEntry.pReader, rEntry.pReader = NULL;
146 : }
147 0 : }
148 :
149 : #ifndef DISABLE_DYNLOADING
150 :
151 0 : oslGenericFunction Filters::GetMswordLibSymbol( const char *pSymbol )
152 : {
153 0 : if (!msword_.is())
154 : {
155 0 : bool ok = msword_.loadRelative( &thisModule, SVLIBRARY( "msword" ), SAL_LOADMODULE_GLOBAL | SAL_LOADMODULE_LAZY );
156 : SAL_WARN_IF(!ok, "sw", "failed to load msword library");
157 : }
158 0 : if (msword_.is())
159 0 : return msword_.getFunctionSymbol( OUString::createFromAscii( pSymbol ) );
160 0 : return NULL;
161 : }
162 :
163 : #endif
164 :
165 : }
166 :
167 : namespace SwReaderWriter {
168 :
169 0 : SW_DLLPUBLIC Reader* GetReader( ReaderWriterEnum eReader )
170 : {
171 0 : return aReaderWriter[eReader].GetReader();
172 : }
173 :
174 0 : SW_DLLPUBLIC void GetWriter( const OUString& rFltName, const OUString& rBaseURL, WriterRef& xRet )
175 : {
176 0 : for( sal_uInt16 n = 0; n < MAXFILTER; ++n )
177 0 : if ( aFilterDetect[n].IsFilter( rFltName ) )
178 : {
179 0 : aReaderWriter[n].GetWriter( rFltName, rBaseURL, xRet );
180 0 : break;
181 : }
182 0 : }
183 :
184 0 : SwRead GetReader( const OUString& rFltName )
185 : {
186 0 : SwRead pRead = 0;
187 0 : for( sal_uInt16 n = 0; n < MAXFILTER; ++n )
188 0 : if ( aFilterDetect[n].IsFilter( rFltName ) )
189 : {
190 0 : pRead = aReaderWriter[n].GetReader();
191 : // add special treatment for some readers
192 0 : if ( pRead )
193 0 : pRead->SetFltName( rFltName );
194 0 : break;
195 : }
196 0 : return pRead;
197 : }
198 :
199 : } // namespace SwReaderWriter
200 :
201 0 : void Writer::SetVersion( const OUString&, long ) {}
202 :
203 0 : sal_Bool Writer::IsStgWriter() const { return sal_False; }
204 :
205 0 : sal_Bool StgWriter::IsStgWriter() const { return sal_True; }
206 :
207 0 : sal_Bool SwReader::NeedsPasswd( const Reader& /*rOptions*/ )
208 : {
209 0 : return sal_False;
210 : }
211 :
212 0 : sal_Bool SwReader::CheckPasswd( const OUString& /*rPasswd*/, const Reader& /*rOptions*/ )
213 : {
214 0 : return sal_True;
215 : }
216 :
217 : // Read Filter Flags; used by WW8 / W4W / EXCEL / LOTUS
218 :
219 : /*
220 : <FilterFlags>
221 : <Excel_Lotus>
222 : <MinRow cfg:type="long">0</MinRow>
223 : <MaxRow cfg:type="long">0</MaxRow>
224 : <MinCol cfg:type="long">0</MinCol>
225 : <MaxCol cfg:type="long">0</MaxCol>
226 : </Excel_Lotus>
227 : <W4W>
228 : <W4WHD cfg:type="long">0</W4WHD>
229 : <W4WFT cfg:type="long">0</W4WFT>
230 : <W4W000 cfg:type="long">0</W4W000>
231 : </W4W>
232 : <WinWord>
233 : <WW1F cfg:type="long">0</WW1F>
234 : <WW cfg:type="long">0</WW>
235 : <WW8 cfg:type="long">0</WW8>
236 : <WWF cfg:type="long">0</WWF>
237 : <WWFA0 cfg:type="long">0</WWFA0>
238 : <WWFA1 cfg:type="long">0</WWFA1>
239 : <WWFA2 cfg:type="long">0</WWFA2>
240 : <WWFB0 cfg:type="long">0</WWFB0>
241 : <WWFB1 cfg:type="long">0</WWFB1>
242 : <WWFB2 cfg:type="long">0</WWFB2>
243 : <WWFLX cfg:type="long">0</WWFLX>
244 : <WWFLY cfg:type="long">0</WWFLY>
245 : <WWFT cfg:type="long">0</WWFT>
246 : <WWWR cfg:type="long">0</WWWR>
247 : </WinWord>
248 : <Writer>
249 : <SW3Imp cfg:type="long">0</SW3Imp>
250 : </Writer>
251 : </FilterFlags>
252 : */
253 :
254 : #define FILTER_OPTION_ROOT OUString("Office.Writer/FilterFlags")
255 :
256 0 : SwFilterOptions::SwFilterOptions( sal_uInt16 nCnt, const sal_Char** ppNames,
257 : sal_uInt32* pValues )
258 0 : : ConfigItem( FILTER_OPTION_ROOT )
259 : {
260 0 : GetValues( nCnt, ppNames, pValues );
261 0 : }
262 :
263 0 : void SwFilterOptions::GetValues( sal_uInt16 nCnt, const sal_Char** ppNames,
264 : sal_uInt32* pValues )
265 : {
266 0 : Sequence<OUString> aNames( nCnt );
267 0 : OUString* pNames = aNames.getArray();
268 : sal_uInt16 n;
269 :
270 0 : for( n = 0; n < nCnt; ++n )
271 0 : pNames[ n ] = OUString::createFromAscii( ppNames[ n ] );
272 0 : Sequence<Any> aValues = GetProperties( aNames );
273 :
274 0 : if( nCnt == aValues.getLength() )
275 : {
276 0 : const Any* pAnyValues = aValues.getConstArray();
277 0 : for( n = 0; n < nCnt; ++n )
278 0 : pValues[ n ] = pAnyValues[ n ].hasValue()
279 0 : ? *(sal_uInt32*)pAnyValues[ n ].getValue()
280 0 : : 0;
281 : }
282 : else
283 0 : for( n = 0; n < nCnt; ++n )
284 0 : pValues[ n ] = 0;
285 0 : }
286 :
287 0 : void SwFilterOptions::Commit() {}
288 0 : void SwFilterOptions::Notify( const ::com::sun::star::uno::Sequence< OUString >& ) {}
289 :
290 0 : void StgReader::SetFltName( const OUString& rFltNm )
291 : {
292 0 : if( SW_STORAGE_READER & GetReaderType() )
293 0 : aFltName = rFltNm;
294 0 : }
295 :
296 0 : SwRelNumRuleSpaces::SwRelNumRuleSpaces( SwDoc& rDoc, sal_Bool bNDoc )
297 : {
298 0 : pNumRuleTbl = new SwNumRuleTbl();
299 0 : pNumRuleTbl->reserve(8);
300 0 : if( !bNDoc )
301 : pNumRuleTbl->insert( pNumRuleTbl->begin(),
302 0 : rDoc.GetNumRuleTbl().begin(), rDoc.GetNumRuleTbl().end() );
303 0 : }
304 :
305 0 : SwRelNumRuleSpaces::~SwRelNumRuleSpaces()
306 : {
307 0 : if( pNumRuleTbl )
308 : {
309 0 : pNumRuleTbl->clear();
310 0 : delete pNumRuleTbl;
311 : }
312 0 : }
313 :
314 0 : void CalculateFlySize(SfxItemSet& rFlySet, const SwNodeIndex& rAnchor,
315 : SwTwips nPageWidth)
316 : {
317 0 : const SfxPoolItem* pItem = 0;
318 0 : if( SFX_ITEM_SET != rFlySet.GetItemState( RES_FRM_SIZE, true, &pItem ) ||
319 0 : MINFLY > ((SwFmtFrmSize*)pItem)->GetWidth() )
320 : {
321 0 : SwFmtFrmSize aSz((SwFmtFrmSize&)rFlySet.Get(RES_FRM_SIZE, true));
322 0 : if (pItem)
323 0 : aSz = (SwFmtFrmSize&)(*pItem);
324 :
325 : SwTwips nWidth;
326 : // determine the width; if there is a table use the width of the table;
327 : // otherwise use the width of the page
328 0 : const SwTableNode* pTblNd = rAnchor.GetNode().FindTableNode();
329 0 : if( pTblNd )
330 0 : nWidth = pTblNd->GetTable().GetFrmFmt()->GetFrmSize().GetWidth();
331 : else
332 0 : nWidth = nPageWidth;
333 :
334 0 : const SwNodeIndex* pSttNd = ((SwFmtCntnt&)rFlySet.Get( RES_CNTNT )).
335 0 : GetCntntIdx();
336 0 : if( pSttNd )
337 : {
338 0 : bool bOnlyOneNode = true;
339 0 : sal_uLong nMinFrm = 0;
340 0 : sal_uLong nMaxFrm = 0;
341 0 : SwTxtNode* pFirstTxtNd = 0;
342 0 : SwNodeIndex aIdx( *pSttNd, 1 );
343 0 : SwNodeIndex aEnd( *pSttNd->GetNode().EndOfSectionNode() );
344 0 : while( aIdx < aEnd )
345 : {
346 0 : SwTxtNode *pTxtNd = aIdx.GetNode().GetTxtNode();
347 0 : if( pTxtNd )
348 : {
349 0 : if( !pFirstTxtNd )
350 0 : pFirstTxtNd = pTxtNd;
351 0 : else if( pFirstTxtNd != pTxtNd )
352 : {
353 : // forget it
354 0 : bOnlyOneNode = false;
355 0 : break;
356 : }
357 :
358 : sal_uLong nAbsMinCnts;
359 : pTxtNd->GetMinMaxSize( aIdx.GetIndex(), nMinFrm,
360 0 : nMaxFrm, nAbsMinCnts );
361 : }
362 0 : ++aIdx;
363 : }
364 :
365 0 : if( bOnlyOneNode )
366 : {
367 0 : if( nMinFrm < MINLAY && pFirstTxtNd )
368 : {
369 : // if the first node dont contained any content, then
370 : // insert one char in it calc again and delete once again
371 0 : SwIndex aNdIdx( pFirstTxtNd );
372 0 : pFirstTxtNd->InsertText(OUString("MM"), aNdIdx);
373 : sal_uLong nAbsMinCnts;
374 : pFirstTxtNd->GetMinMaxSize( pFirstTxtNd->GetIndex(),
375 0 : nMinFrm, nMaxFrm, nAbsMinCnts );
376 0 : aNdIdx -= 2;
377 0 : pFirstTxtNd->EraseText( aNdIdx, 2 );
378 : }
379 :
380 : // consider border and distance to content
381 0 : const SvxBoxItem& rBoxItem = (SvxBoxItem&)rFlySet.Get( RES_BOX );
382 0 : sal_uInt16 nLine = BOX_LINE_LEFT;
383 0 : for( int i = 0; i < 2; ++i )
384 : {
385 0 : const editeng::SvxBorderLine* pLn = rBoxItem.GetLine( nLine );
386 0 : if( pLn )
387 : {
388 0 : sal_uInt16 nWidthTmp = pLn->GetOutWidth() + pLn->GetInWidth();
389 0 : nWidthTmp = nWidthTmp + rBoxItem.GetDistance( nLine );
390 0 : nMinFrm += nWidthTmp;
391 0 : nMaxFrm += nWidthTmp;
392 : }
393 0 : nLine = BOX_LINE_RIGHT;
394 : }
395 :
396 : // enforce minimum width for contents
397 0 : if( nMinFrm < MINLAY )
398 0 : nMinFrm = MINLAY;
399 0 : if( nMaxFrm < MINLAY )
400 0 : nMaxFrm = MINLAY;
401 :
402 0 : if( nWidth > (sal_uInt16)nMaxFrm )
403 0 : nWidth = nMaxFrm;
404 0 : else if( nWidth > (sal_uInt16)nMinFrm )
405 0 : nWidth = nMinFrm;
406 0 : }
407 : }
408 :
409 0 : if( MINFLY > nWidth )
410 0 : nWidth = MINFLY;
411 :
412 0 : aSz.SetWidth( nWidth );
413 0 : if( MINFLY > aSz.GetHeight() )
414 0 : aSz.SetHeight( MINFLY );
415 0 : rFlySet.Put( aSz );
416 : }
417 0 : else if( MINFLY > ((SwFmtFrmSize*)pItem)->GetHeight() )
418 : {
419 0 : SwFmtFrmSize aSz( *(SwFmtFrmSize*)pItem );
420 0 : aSz.SetHeight( MINFLY );
421 0 : rFlySet.Put( aSz );
422 : }
423 0 : }
424 :
425 : namespace
426 : {
427 :
428 : struct CharSetNameMap
429 : {
430 : rtl_TextEncoding eCode;
431 : const sal_Char* pName;
432 : };
433 :
434 0 : const CharSetNameMap *GetCharSetNameMap()
435 : {
436 : static const CharSetNameMap aMapArr[] =
437 : {
438 : # define IMPLENTRY(X) { RTL_TEXTENCODING_##X, "" #X "" }
439 : IMPLENTRY(DONTKNOW),
440 : IMPLENTRY(MS_1252),
441 : IMPLENTRY(APPLE_ROMAN),
442 : IMPLENTRY(IBM_437),
443 : IMPLENTRY(IBM_850),
444 : IMPLENTRY(IBM_860),
445 : IMPLENTRY(IBM_861),
446 : IMPLENTRY(IBM_863),
447 : IMPLENTRY(IBM_865),
448 : IMPLENTRY(SYMBOL),
449 : IMPLENTRY(ASCII_US),
450 : IMPLENTRY(ISO_8859_1),
451 : IMPLENTRY(ISO_8859_2),
452 : IMPLENTRY(ISO_8859_3),
453 : IMPLENTRY(ISO_8859_4),
454 : IMPLENTRY(ISO_8859_5),
455 : IMPLENTRY(ISO_8859_6),
456 : IMPLENTRY(ISO_8859_7),
457 : IMPLENTRY(ISO_8859_8),
458 : IMPLENTRY(ISO_8859_9),
459 : IMPLENTRY(ISO_8859_14),
460 : IMPLENTRY(ISO_8859_15),
461 : IMPLENTRY(IBM_737),
462 : IMPLENTRY(IBM_775),
463 : IMPLENTRY(IBM_852),
464 : IMPLENTRY(IBM_855),
465 : IMPLENTRY(IBM_857),
466 : IMPLENTRY(IBM_862),
467 : IMPLENTRY(IBM_864),
468 : IMPLENTRY(IBM_866),
469 : IMPLENTRY(IBM_869),
470 : IMPLENTRY(MS_874),
471 : IMPLENTRY(MS_1250),
472 : IMPLENTRY(MS_1251),
473 : IMPLENTRY(MS_1253),
474 : IMPLENTRY(MS_1254),
475 : IMPLENTRY(MS_1255),
476 : IMPLENTRY(MS_1256),
477 : IMPLENTRY(MS_1257),
478 : IMPLENTRY(MS_1258),
479 : IMPLENTRY(APPLE_ARABIC),
480 : IMPLENTRY(APPLE_CENTEURO),
481 : IMPLENTRY(APPLE_CROATIAN),
482 : IMPLENTRY(APPLE_CYRILLIC),
483 : IMPLENTRY(APPLE_DEVANAGARI),
484 : IMPLENTRY(APPLE_FARSI),
485 : IMPLENTRY(APPLE_GREEK),
486 : IMPLENTRY(APPLE_GUJARATI),
487 : IMPLENTRY(APPLE_GURMUKHI),
488 : IMPLENTRY(APPLE_HEBREW),
489 : IMPLENTRY(APPLE_ICELAND),
490 : IMPLENTRY(APPLE_ROMANIAN),
491 : IMPLENTRY(APPLE_THAI),
492 : IMPLENTRY(APPLE_TURKISH),
493 : IMPLENTRY(APPLE_UKRAINIAN),
494 : IMPLENTRY(APPLE_CHINSIMP),
495 : IMPLENTRY(APPLE_CHINTRAD),
496 : IMPLENTRY(APPLE_JAPANESE),
497 : IMPLENTRY(APPLE_KOREAN),
498 : IMPLENTRY(MS_932),
499 : IMPLENTRY(MS_936),
500 : IMPLENTRY(MS_949),
501 : IMPLENTRY(MS_950),
502 : IMPLENTRY(SHIFT_JIS),
503 : IMPLENTRY(GB_2312),
504 : IMPLENTRY(GBT_12345),
505 : IMPLENTRY(GBK),
506 : IMPLENTRY(BIG5),
507 : IMPLENTRY(EUC_JP),
508 : IMPLENTRY(EUC_CN),
509 : IMPLENTRY(EUC_TW),
510 : IMPLENTRY(ISO_2022_JP),
511 : IMPLENTRY(ISO_2022_CN),
512 : IMPLENTRY(KOI8_R),
513 : IMPLENTRY(KOI8_U),
514 : IMPLENTRY(UTF7),
515 : IMPLENTRY(UTF8),
516 : IMPLENTRY(ISO_8859_10),
517 : IMPLENTRY(ISO_8859_13),
518 : IMPLENTRY(EUC_KR),
519 : IMPLENTRY(ISO_2022_KR),
520 : IMPLENTRY(JIS_X_0201),
521 : IMPLENTRY(JIS_X_0208),
522 : IMPLENTRY(JIS_X_0212),
523 : IMPLENTRY(MS_1361),
524 : IMPLENTRY(GB_18030),
525 : IMPLENTRY(BIG5_HKSCS),
526 : IMPLENTRY(TIS_620),
527 : IMPLENTRY(PT154),
528 : IMPLENTRY(UCS4),
529 : IMPLENTRY(UCS2),
530 : IMPLENTRY(UNICODE),
531 : {0,0} //Last
532 : };
533 0 : return &aMapArr[0];
534 : }
535 :
536 : /*
537 : Get a rtl_TextEncoding from its name
538 : */
539 0 : rtl_TextEncoding CharSetFromName(const OUString& rChrSetStr)
540 : {
541 0 : const CharSetNameMap *pStart = GetCharSetNameMap();
542 0 : rtl_TextEncoding nRet = pStart->eCode;
543 :
544 0 : for(const CharSetNameMap *pMap = pStart; pMap->pName; ++pMap)
545 : {
546 0 : if(rChrSetStr.equalsIgnoreAsciiCaseAscii(pMap->pName))
547 : {
548 0 : nRet = pMap->eCode;
549 0 : break;
550 : }
551 : }
552 :
553 : OSL_ENSURE(nRet != pStart->eCode, "TXT: That was an unknown language!");
554 :
555 0 : return nRet;
556 : }
557 :
558 : /*
559 : Get the String name of an rtl_TextEncoding
560 : */
561 0 : OUString NameFromCharSet(rtl_TextEncoding nChrSet)
562 : {
563 0 : const CharSetNameMap *pStart = GetCharSetNameMap();
564 0 : const char *pRet = pStart->pName;
565 :
566 0 : for(const CharSetNameMap *pMap = pStart; pMap->pName; ++pMap)
567 : {
568 0 : if (nChrSet == pMap->eCode)
569 : {
570 0 : pRet = pMap->pName;
571 0 : break;
572 : }
573 : }
574 :
575 : OSL_ENSURE(pRet != pStart->pName, "TXT: That was an unknown language!");
576 :
577 0 : return OUString::createFromAscii(pRet);
578 : }
579 :
580 : }
581 :
582 : // for the automatic conversion (mail/news/...)
583 : // The user data contains the options for the ascii import/export filter.
584 : // The format is:
585 : // 1. CharSet - as ascii chars
586 : // 2. LineEnd - as CR/LR/CRLF
587 : // 3. Fontname
588 : // 4. Language
589 : // the delimiter character is ","
590 :
591 0 : void SwAsciiOptions::ReadUserData( const OUString& rStr )
592 : {
593 0 : sal_Int32 nToken = 0;
594 0 : sal_uInt16 nCnt = 0;
595 0 : do {
596 0 : const OUString sToken = rStr.getToken( 0, ',', nToken );
597 0 : if (!sToken.isEmpty())
598 : {
599 0 : switch( nCnt )
600 : {
601 : case 0: // CharSet
602 0 : eCharSet = CharSetFromName(sToken);
603 0 : break;
604 : case 1: // LineEnd
605 0 : if (sToken.equalsIgnoreAsciiCase("CRLF"))
606 0 : eCRLF_Flag = LINEEND_CRLF;
607 0 : else if (sToken.equalsIgnoreAsciiCase("LF"))
608 0 : eCRLF_Flag = LINEEND_LF;
609 : else
610 0 : eCRLF_Flag = LINEEND_CR;
611 0 : break;
612 : case 2: // fontname
613 0 : sFont = sToken;
614 0 : break;
615 : case 3: // Language
616 0 : nLanguage = LanguageTag::convertToLanguageTypeWithFallback( sToken );
617 0 : break;
618 : }
619 : }
620 0 : ++nCnt;
621 0 : } while( -1 != nToken );
622 0 : }
623 :
624 0 : void SwAsciiOptions::WriteUserData(OUString& rStr)
625 : {
626 : // 1. charset
627 0 : rStr = NameFromCharSet(eCharSet) + ",";
628 :
629 : // 2. LineEnd
630 0 : switch(eCRLF_Flag)
631 : {
632 : case LINEEND_CRLF:
633 0 : rStr += "CRLF";
634 0 : break;
635 : case LINEEND_CR:
636 0 : rStr += "CR";
637 0 : break;
638 : case LINEEND_LF:
639 0 : rStr += "LF";
640 0 : break;
641 : }
642 0 : rStr += ",";
643 :
644 : // 3. Fontname
645 0 : rStr += sFont + ",";
646 :
647 : // 4. Language
648 0 : if (nLanguage)
649 : {
650 0 : rStr += LanguageTag::convertToBcp47(nLanguage);
651 : }
652 0 : rStr += ",";
653 0 : }
654 :
655 : #ifdef DISABLE_DYNLOADING
656 :
657 : extern "C" {
658 : Reader *ImportRTF();
659 : void ExportRTF( const OUString&, const OUString& rBaseURL, WriterRef& );
660 : Reader *ImportDOC();
661 : void ExportDOC( const OUString&, const OUString& rBaseURL, WriterRef& );
662 : sal_uLong SaveOrDelMSVBAStorage_ww8( SfxObjectShell&, SotStorage&, sal_Bool, const OUString& );
663 : sal_uLong GetSaveWarningOfMSVBAStorage_ww8( SfxObjectShell& );
664 : }
665 :
666 : #endif
667 :
668 0 : Reader* GetRTFReader()
669 : {
670 : #ifndef DISABLE_DYNLOADING
671 :
672 0 : FnGetReader pFunction = reinterpret_cast<FnGetReader>( SwGlobals::getFilters().GetMswordLibSymbol( "ImportRTF" ) );
673 :
674 0 : if ( pFunction )
675 0 : return (*pFunction)();
676 :
677 0 : return NULL;
678 : #else
679 : return ImportRTF();
680 : #endif
681 :
682 : }
683 :
684 0 : void GetRTFWriter( const OUString& rFltName, const OUString& rBaseURL, WriterRef& xRet )
685 : {
686 : #ifndef DISABLE_DYNLOADING
687 0 : FnGetWriter pFunction = reinterpret_cast<FnGetWriter>( SwGlobals::getFilters().GetMswordLibSymbol( "ExportRTF" ) );
688 :
689 0 : if ( pFunction )
690 0 : (*pFunction)( rFltName, rBaseURL, xRet );
691 : else
692 0 : xRet = WriterRef(0);
693 : #else
694 : ExportRTF( rFltName, rBaseURL, xRet );
695 : #endif
696 0 : }
697 :
698 0 : Reader* GetWW8Reader()
699 : {
700 : #ifndef DISABLE_DYNLOADING
701 0 : FnGetReader pFunction = reinterpret_cast<FnGetReader>( SwGlobals::getFilters().GetMswordLibSymbol( "ImportDOC" ) );
702 :
703 0 : if ( pFunction )
704 0 : return (*pFunction)();
705 :
706 0 : return NULL;
707 : #else
708 : return ImportDOC();
709 : #endif
710 : }
711 :
712 0 : void GetWW8Writer( const OUString& rFltName, const OUString& rBaseURL, WriterRef& xRet )
713 : {
714 : #ifndef DISABLE_DYNLOADING
715 0 : FnGetWriter pFunction = reinterpret_cast<FnGetWriter>( SwGlobals::getFilters().GetMswordLibSymbol( "ExportDOC" ) );
716 :
717 0 : if ( pFunction )
718 0 : (*pFunction)( rFltName, rBaseURL, xRet );
719 : else
720 0 : xRet = WriterRef(0);
721 : #else
722 : ExportDOC( rFltName, rBaseURL, xRet );
723 : #endif
724 0 : }
725 :
726 : typedef sal_uLong ( SAL_CALL *SaveOrDel )( SfxObjectShell&, SotStorage&, sal_Bool, const OUString& );
727 : typedef sal_uLong ( SAL_CALL *GetSaveWarning )( SfxObjectShell& );
728 :
729 0 : sal_uLong SaveOrDelMSVBAStorage( SfxObjectShell& rDoc, SotStorage& rStor, sal_Bool bSaveInto, const OUString& rStorageName )
730 : {
731 : #ifndef DISABLE_DYNLOADING
732 0 : SaveOrDel pFunction = reinterpret_cast<SaveOrDel>( SwGlobals::getFilters().GetMswordLibSymbol( "SaveOrDelMSVBAStorage_ww8" ) );
733 0 : if( pFunction )
734 0 : return pFunction( rDoc, rStor, bSaveInto, rStorageName );
735 0 : return ERRCODE_NONE;
736 : #else
737 : return SaveOrDelMSVBAStorage_ww8( rDoc, rStor, bSaveInto, rStorageName );
738 : #endif
739 : }
740 :
741 0 : sal_uLong GetSaveWarningOfMSVBAStorage( SfxObjectShell &rDocS )
742 : {
743 : #ifndef DISABLE_DYNLOADING
744 0 : GetSaveWarning pFunction = reinterpret_cast<GetSaveWarning>( SwGlobals::getFilters().GetMswordLibSymbol( "GetSaveWarningOfMSVBAStorage_ww8" ) );
745 0 : if( pFunction )
746 0 : return pFunction( rDocS );
747 0 : return ERRCODE_NONE;
748 : #else
749 : return GetSaveWarningOfMSVBAStorage_ww8( rDocS );
750 : #endif
751 0 : }
752 :
753 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|