diff options
Diffstat (limited to 'sw/inc/shellio.hxx')
-rw-r--r-- | sw/inc/shellio.hxx | 573 |
1 files changed, 573 insertions, 0 deletions
diff --git a/sw/inc/shellio.hxx b/sw/inc/shellio.hxx new file mode 100644 index 000000000..f4d72f480 --- /dev/null +++ b/sw/inc/shellio.hxx @@ -0,0 +1,573 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#ifndef INCLUDED_SW_INC_SHELLIO_HXX +#define INCLUDED_SW_INC_SHELLIO_HXX + +#include <memory> + +#include <com/sun/star/uno/Reference.h> +#include <sot/storage.hxx> +#include <tools/date.hxx> +#include <tools/time.hxx> +#include <tools/datetime.hxx> +#include <tools/ref.hxx> +#include <rtl/ref.hxx> +#include <osl/thread.h> +#include <o3tl/deleter.hxx> +#include <o3tl/typed_flags_set.hxx> +#include "swdllapi.h" +#include "docfac.hxx" +#include "unocrsr.hxx" + +class SfxItemPool; +class SfxItemSet; +class SfxMedium; +class SvStream; +class SvxFontItem; +class SvxMacroTableDtor; +class SwContentNode; +class SwCursorShell; +class SwDoc; +class SwPaM; +class SwTextBlocks; +struct SwPosition; +struct Writer_Impl; +namespace sw::mark { class IMark; } +namespace com::sun::star::embed { class XStorage; } + +// Defines the count of chars at which a paragraph read via ASCII/W4W-Reader +// is forced to wrap. It has to be always greater than 200!!! +#define MAX_ASCII_PARA 10000 + +class SW_DLLPUBLIC SwAsciiOptions +{ + OUString m_sFont; + rtl_TextEncoding m_eCharSet; + LanguageType m_nLanguage; + LineEnd m_eCRLF_Flag; + bool m_bIncludeBOM; // Whether to include a byte-order-mark in the output. + bool m_bIncludeHidden; // Whether to include hidden paragraphs and text. + +public: + + const OUString& GetFontName() const { return m_sFont; } + void SetFontName( const OUString& rFont ) { m_sFont = rFont; } + + rtl_TextEncoding GetCharSet() const { return m_eCharSet; } + void SetCharSet( rtl_TextEncoding nVal ) { m_eCharSet = nVal; } + + LanguageType GetLanguage() const { return m_nLanguage; } + void SetLanguage( LanguageType nVal ) { m_nLanguage = nVal; } + + LineEnd GetParaFlags() const { return m_eCRLF_Flag; } + void SetParaFlags( LineEnd eVal ) { m_eCRLF_Flag = eVal; } + + bool GetIncludeBOM() const { return m_bIncludeBOM; } + void SetIncludeBOM( bool bVal ) { m_bIncludeBOM = bVal; } + + bool GetIncludeHidden() const { return m_bIncludeHidden; } + void SetIncludeHidden( bool bVal ) { m_bIncludeHidden = bVal; } + + void Reset() + { + m_sFont.clear(); + m_eCRLF_Flag = GetSystemLineEnd(); + m_eCharSet = ::osl_getThreadTextEncoding(); + m_nLanguage = LANGUAGE_SYSTEM; + m_bIncludeBOM = true; + m_bIncludeHidden = true; + } + // for the automatic conversion (mail/news/...) + void ReadUserData( std::u16string_view ); + void WriteUserData( OUString& ) const; + + SwAsciiOptions() { Reset(); } +}; + +// Base class of possible options for a special reader. +class Reader; + +class SwgReaderOption +{ + SwAsciiOptions m_aASCIIOpts; + bool m_bFrameFormats; + bool m_bPageDescs; + bool m_bTextFormats; + bool m_bNumRules; + bool m_bMerge; + css::uno::Reference<css::io::XInputStream> m_xInputStream; +public: + void ResetAllFormatsOnly() { m_bFrameFormats = m_bPageDescs = m_bTextFormats = m_bNumRules = m_bMerge = false; } + bool IsFormatsOnly() const { return m_bFrameFormats || m_bPageDescs || m_bTextFormats || m_bNumRules || m_bMerge; } + + bool IsFrameFormats() const { return m_bFrameFormats; } + void SetFrameFormats( const bool bNew) { m_bFrameFormats = bNew; } + + bool IsPageDescs() const { return m_bPageDescs; } + void SetPageDescs( const bool bNew) { m_bPageDescs = bNew; } + + bool IsTextFormats() const { return m_bTextFormats; } + void SetTextFormats( const bool bNew) { m_bTextFormats = bNew; } + + bool IsNumRules() const { return m_bNumRules; } + void SetNumRules( const bool bNew) { m_bNumRules = bNew; } + + bool IsMerge() const { return m_bMerge; } + void SetMerge( const bool bNew ) { m_bMerge = bNew; } + + const SwAsciiOptions& GetASCIIOpts() const { return m_aASCIIOpts; } + void SetASCIIOpts( const SwAsciiOptions& rOpts ) { m_aASCIIOpts = rOpts; } + void ResetASCIIOpts() { m_aASCIIOpts.Reset(); } + + css::uno::Reference<css::io::XInputStream>& GetInputStream() { return m_xInputStream; } + void SetInputStream(const css::uno::Reference<css::io::XInputStream>& xInputStream) + { + m_xInputStream = xInputStream; + } + + SwgReaderOption() + { ResetAllFormatsOnly(); m_aASCIIOpts.Reset(); } +}; + +// Calls reader with its options, document, cursor etc. +class SW_DLLPUBLIC SwReader: public SwDocFac +{ + SvStream* mpStrm; + tools::SvRef<SotStorage> mpStg; + css::uno::Reference < css::embed::XStorage > mxStg; + SfxMedium* mpMedium; // Who wants to obtain a Medium (W4W). + + SwPaM* mpCursor; + OUString maFileName; + OUString msBaseURL; + bool mbSkipImages; + +public: + + // Initial reading. Document is created only at Read(...) + // or in case it is given, into that. + // Special case for Load with Sw3Reader. + SwReader( SfxMedium&, const OUString& rFilename, SwDoc *pDoc = nullptr ); + + // Read into existing document. + // Document and position in document are taken from SwPaM. + SwReader( SvStream&, const OUString& rFilename, const OUString& rBaseURL, SwPaM& ); + SwReader( SfxMedium&, const OUString& rFilename, SwPaM& ); + SwReader( const css::uno::Reference < css::embed::XStorage >&, const OUString& rFilename, SwPaM& ); + + // The only export interface is SwReader::Read(...)!!! + ErrCode Read( const Reader& ); + + // Ask for glossaries. + bool HasGlossaries( const Reader& ); + bool ReadGlossaries( const Reader&, SwTextBlocks&, bool bSaveRelFiles ); + +protected: + void SetBaseURL( const OUString& rURL ) { msBaseURL = rURL; } + void SetSkipImages( bool bSkipImages ) { mbSkipImages = bSkipImages; } +}; + +typedef std::unique_ptr<SwReader, o3tl::default_delete<SwReader>> SwReaderPtr; + +// Special Readers can be both!! (Excel, W4W, .. ). +enum class SwReaderType { + NONE = 0x00, + Stream = 0x01, + Storage = 0x02 +}; +namespace o3tl { + template<> struct typed_flags<SwReaderType> : is_typed_flags<SwReaderType, 0x03> {}; +}; + +extern "C" SAL_DLLPUBLIC_EXPORT bool TestImportDOC(SvStream &rStream, const OUString &rFltName); +extern "C" SAL_DLLPUBLIC_EXPORT bool TestImportDOCX(SvStream &rStream); +extern "C" SAL_DLLPUBLIC_EXPORT bool TestImportRTF(SvStream &rStream); +extern "C" SAL_DLLPUBLIC_EXPORT bool TestImportHTML(SvStream &rStream); +SAL_DLLPUBLIC_EXPORT void FlushFontCache(); + +class SW_DLLPUBLIC Reader +{ + friend class SwReader; + friend bool TestImportDOC(SvStream &rStream, const OUString &rFltName); + friend bool TestImportRTF(SvStream &rStream); + friend bool TestImportHTML(SvStream &rStream); + rtl::Reference<SwDoc> mxTemplate; + OUString m_aTemplateName; + + Date m_aDateStamp; + tools::Time m_aTimeStamp; + DateTime m_aCheckDateTime; + +protected: + SvStream* m_pStream; + tools::SvRef<SotStorage> m_pStorage; + css::uno::Reference < css::embed::XStorage > m_xStorage; + SfxMedium* m_pMedium; // Who wants to obtain a Medium (W4W). + + SwgReaderOption m_aOption; + bool m_bInsertMode : 1; + bool m_bTemplateBrowseMode : 1; + bool m_bReadUTF8: 1; // Interpret stream as UTF-8. + bool m_bBlockMode: 1; + bool m_bOrganizerMode : 1; + bool m_bHasAskTemplateName : 1; + bool m_bIgnoreHTMLComments : 1; + bool m_bSkipImages : 1; + + virtual OUString GetTemplateName(SwDoc& rDoc) const; + +public: + Reader(); + virtual ~Reader(); + + virtual SwReaderType GetReaderType(); + SwgReaderOption& GetReaderOpt() { return m_aOption; } + + virtual void SetFltName( const OUString& rFltNm ); + + // Adapt item-set of a Frame-Format to the old format. + static void ResetFrameFormatAttrs( SfxItemSet &rFrameSet ); + + // Adapt Frame-/Graphics-/OLE- styles to the old format + // (without borders etc.). + static void ResetFrameFormats( SwDoc& rDoc ); + + // Load filter template, set it and release it again. + SwDoc* GetTemplateDoc(SwDoc& rDoc); + bool SetTemplate( SwDoc& rDoc ); + void ClearTemplate(); + void SetTemplateName( const OUString& rDir ); + void MakeHTMLDummyTemplateDoc(); + + bool IsReadUTF8() const { return m_bReadUTF8; } + void SetReadUTF8( bool bSet ) { m_bReadUTF8 = bSet; } + + bool IsBlockMode() const { return m_bBlockMode; } + void SetBlockMode( bool bSet ) { m_bBlockMode = bSet; } + + bool IsOrganizerMode() const { return m_bOrganizerMode; } + void SetOrganizerMode( bool bSet ) { m_bOrganizerMode = bSet; } + + void SetIgnoreHTMLComments( bool bSet ) { m_bIgnoreHTMLComments = bSet; } + + virtual bool HasGlossaries() const; + virtual bool ReadGlossaries( SwTextBlocks&, bool bSaveRelFiles ) const; + + // Read the sections of the document, which is equal to the medium. + // Returns the count of it + virtual size_t GetSectionList( SfxMedium& rMedium, + std::vector<OUString>& rStrings) const; + + const tools::SvRef<SotStorage>& getSotStorageRef() const { return m_pStorage; }; + void setSotStorageRef(const tools::SvRef<SotStorage>& pStgRef) { m_pStorage = pStgRef; }; + +private: + virtual ErrCode Read(SwDoc &, const OUString& rBaseURL, SwPaM &, const OUString &)=0; + + // Everyone who does not need the streams / storages open + // has to override the method (W4W!!). + virtual bool SetStrmStgPtr(); +}; + +class AsciiReader final : public Reader +{ + friend class SwReader; + virtual ErrCode Read( SwDoc &, const OUString& rBaseURL, SwPaM &, const OUString &) override; +public: + AsciiReader(): Reader() {} +}; + +class SW_DLLPUBLIC StgReader : public Reader +{ + OUString m_aFltName; + +public: + virtual SwReaderType GetReaderType() override; + const OUString& GetFltName() const { return m_aFltName; } + virtual void SetFltName( const OUString& r ) override; +}; + +// The given stream has to be created dynamically and must +// be requested via Stream() before the instance is deleted! + +class SwImpBlocks; + +class SW_DLLPUBLIC SwTextBlocks +{ + std::unique_ptr<SwImpBlocks> m_pImp; + ErrCode m_nErr; + +public: + SwTextBlocks( const OUString& ); + ~SwTextBlocks(); + + SwDoc* GetDoc(); + void ClearDoc(); // Delete Doc-contents. + OUString GetName() const; + void SetName( const OUString& ); + ErrCode const & GetError() const { return m_nErr; } + + OUString GetBaseURL() const; + void SetBaseURL( const OUString& rURL ); + + sal_uInt16 GetCount() const; // Get count text modules. + sal_uInt16 GetIndex( const OUString& ) const; // Get index of short names. + sal_uInt16 GetLongIndex( const OUString& ) const; // Get index of long names. + OUString GetShortName( sal_uInt16 ) const; // Get short name for index. + OUString GetLongName( sal_uInt16 ) const; // Get long name for index. + + bool Delete( sal_uInt16 ); + void Rename( sal_uInt16, const OUString*, const OUString* ); + ErrCode const & CopyBlock( SwTextBlocks const & rSource, OUString& rSrcShort, + const OUString& rLong ); + + bool BeginGetDoc( sal_uInt16 ); // Read text modules. + void EndGetDoc(); // Release text modules. + + bool BeginPutDoc( const OUString&, const OUString& ); // Begin save. + sal_uInt16 PutDoc(); // End save. + + sal_uInt16 PutText( const OUString&, const OUString&, const OUString& ); // Save (short name, text). + + bool IsOnlyTextBlock( sal_uInt16 ) const; + bool IsOnlyTextBlock( const OUString& rShort ) const; + + OUString const & GetFileName() const; // Filename of pImp. + bool IsReadOnly() const; // ReadOnly-flag of pImp. + + bool GetMacroTable( sal_uInt16 nIdx, SvxMacroTableDtor& rMacroTable ); + bool SetMacroTable( sal_uInt16 nIdx, const SvxMacroTableDtor& rMacroTable ); + + bool StartPutMuchBlockEntries(); + void EndPutMuchBlockEntries(); +}; + +// BEGIN source/filter/basflt/fltini.cxx + +extern Reader *ReadAscii, *ReadHTML, *ReadXML; + +SW_DLLPUBLIC Reader* SwGetReaderXML(); + +// END source/filter/basflt/fltini.cxx + +extern bool SetHTMLTemplate( SwDoc &rDoc ); //For templates from HTML before loading shellio.cxx. + +// Base-class of all writers. + +class IDocumentSettingAccess; +class IDocumentStylePoolAccess; + +class SW_DLLPUBLIC Writer + : public SvRefBase +{ + SwAsciiOptions m_aAsciiOptions; + OUString m_sBaseURL; + + void AddFontItem( SfxItemPool& rPool, const SvxFontItem& rFont ); + void AddFontItems_( SfxItemPool& rPool, sal_uInt16 nWhichId ); + + std::unique_ptr<Writer_Impl> m_pImpl; + + Writer(Writer const&) = delete; + Writer& operator=(Writer const&) = delete; + +protected: + + const OUString* m_pOrigFileName; + + void ResetWriter(); + bool CopyNextPam( SwPaM ** ); + + void PutNumFormatFontsInAttrPool(); + void PutEditEngFontsInAttrPool(); + + virtual ErrCode WriteStream() = 0; + void SetBaseURL( const OUString& rURL ) { m_sBaseURL = rURL; } + + IDocumentSettingAccess& getIDocumentSettingAccess(); + const IDocumentSettingAccess& getIDocumentSettingAccess() const; + + IDocumentStylePoolAccess& getIDocumentStylePoolAccess(); + const IDocumentStylePoolAccess& getIDocumentStylePoolAccess() const; + +public: + SwDoc* m_pDoc; + SwPaM* m_pOrigPam; // Last Pam that has to be processed. + std::shared_ptr<SwUnoCursor> m_pCurrentPam; + bool m_bWriteAll : 1; + bool m_bShowProgress : 1; + bool m_bWriteClipboardDoc : 1; + bool m_bWriteOnlyFirstTable : 1; + bool m_bASCII_ParaAsCR : 1; + bool m_bASCII_ParaAsBlank : 1; + bool m_bASCII_NoLastLineEnd : 1; + bool m_bUCS2_WithStartChar : 1; + bool m_bExportParagraphNumbering : 1; + + bool m_bBlock : 1; + bool m_bOrganizerMode : 1; + bool m_bHideDeleteRedlines : 1; + + Writer(); + virtual ~Writer() override; + + virtual ErrCode Write( SwPaM&, SfxMedium&, const OUString* ); + ErrCode Write( SwPaM&, SvStream&, const OUString* ); + virtual ErrCode Write( SwPaM&, const css::uno::Reference < css::embed::XStorage >&, const OUString*, SfxMedium* = nullptr ); + virtual ErrCode Write( SwPaM&, SotStorage&, const OUString* ); + + virtual void SetupFilterOptions(SfxMedium& rMedium); + + virtual bool IsStgWriter() const; + + void SetShowProgress( bool bFlag ) { m_bShowProgress = bFlag; } + + const OUString* GetOrigFileName() const { return m_pOrigFileName; } + + const SwAsciiOptions& GetAsciiOptions() const { return m_aAsciiOptions; } + void SetAsciiOptions( const SwAsciiOptions& rOpt ) { m_aAsciiOptions = rOpt; } + + const OUString& GetBaseURL() const { return m_sBaseURL;} + + // Look up next bookmark position from bookmark-table. + sal_Int32 FindPos_Bkmk( const SwPosition& rPos ) const; + // Build a bookmark table, which is sort by the node position. The + // OtherPos of the bookmarks also inserted. + void CreateBookmarkTable(); + // Search all Bookmarks in the range and return it in the Array. + bool GetBookmarks( const SwContentNode& rNd, + sal_Int32 nStt, sal_Int32 nEnd, + std::vector< const ::sw::mark::IMark* >& rArr ); + + // Create new PaM at position. + static std::shared_ptr<SwUnoCursor> NewUnoCursor(SwDoc & rDoc, + SwNodeOffset const nStartIdx, SwNodeOffset const nEndIdx); + + // If applicable copy a local file into internet. + bool CopyLocalFileToINet( OUString& rFileNm ); + + // Stream-specific routines. Do not use in storage-writer! + + // Optimizing output on stream. + static SvStream& OutLong( SvStream& rStrm, tools::Long nVal ); + static SvStream& OutULong( SvStream& rStrm, sal_uLong nVal ); + + void SetStream(SvStream *const pStream); + SvStream& Strm(); + + void SetOrganizerMode( bool bSet ) { m_bOrganizerMode = bSet; } +}; + +typedef tools::SvRef<Writer> WriterRef; + +// Base class for all storage writers. +class SW_DLLPUBLIC StgWriter : public Writer +{ +protected: + tools::SvRef<SotStorage> m_pStg; + css::uno::Reference < css::embed::XStorage > m_xStg; + + // Create error at call. + virtual ErrCode WriteStream() override; + virtual ErrCode WriteStorage() = 0; + virtual ErrCode WriteMedium( SfxMedium& ) = 0; + + using Writer::Write; + +public: + StgWriter() : Writer() {} + + virtual bool IsStgWriter() const override; + + virtual ErrCode Write( SwPaM&, const css::uno::Reference < css::embed::XStorage >&, const OUString*, SfxMedium* = nullptr ) override; + virtual ErrCode Write( SwPaM&, SotStorage&, const OUString* ) override; + + SotStorage& GetStorage() const { return *m_pStg; } +}; + +// Interface class for general access on special writers. + +class SW_DLLPUBLIC SwWriter +{ + SvStream* m_pStrm; + css::uno::Reference < css::embed::XStorage > m_xStg; + SfxMedium* m_pMedium; + + SwPaM* m_pOutPam; + SwCursorShell *m_pShell; + SwDoc &m_rDoc; + + bool m_bWriteAll; + +public: + ErrCode Write( WriterRef const & rxWriter, const OUString* = nullptr); + + SwWriter( SvStream&, SwCursorShell &, bool bWriteAll = false ); + SwWriter( SvStream&, SwDoc & ); + SwWriter( SvStream&, SwPaM &, bool bWriteAll = false ); + + SwWriter( const css::uno::Reference < css::embed::XStorage >&, SwDoc& ); + + SwWriter( SfxMedium&, SwCursorShell &, bool bWriteAll ); + SwWriter( SfxMedium&, SwDoc & ); +}; + +typedef Reader* (*FnGetReader)(); +typedef void (*FnGetWriter)(std::u16string_view, const OUString& rBaseURL, WriterRef&); +ErrCode SaveOrDelMSVBAStorage( SfxObjectShell&, SotStorage&, bool, const OUString& ); +ErrCode GetSaveWarningOfMSVBAStorage( SfxObjectShell &rDocS ); + +struct SwReaderWriterEntry +{ + Reader* pReader; + FnGetReader fnGetReader; + FnGetWriter fnGetWriter; + bool bDelReader; + + SwReaderWriterEntry( const FnGetReader fnReader, const FnGetWriter fnWriter, bool bDel ) + : pReader( nullptr ), fnGetReader( fnReader ), fnGetWriter( fnWriter ), bDelReader( bDel ) + {} + + /// Get access to the reader. + Reader* GetReader(); + + /// Get access to the writer. + void GetWriter( std::u16string_view rNm, const OUString& rBaseURL, WriterRef& xWrt ) const; +}; + +namespace SwReaderWriter +{ + SW_DLLPUBLIC Reader* GetRtfReader(); + SW_DLLPUBLIC Reader* GetDOCXReader(); + + /// Return reader based on the name. + Reader* GetReader( const OUString& rFltName ); + + /// Return writer based on the name. + SW_DLLPUBLIC void GetWriter( std::u16string_view rFltName, const OUString& rBaseURL, WriterRef& xWrt ); +} + +void GetRTFWriter( std::u16string_view, const OUString&, WriterRef& ); +void GetASCWriter( std::u16string_view, const OUString&, WriterRef&); +void GetHTMLWriter( std::u16string_view, const OUString&, WriterRef& ); +void GetXMLWriter( std::u16string_view, const OUString&, WriterRef& ); + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |