/* -*- 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 #include #include #include #include #include #include #include #include #include #include #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 MarkBase; } 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!!! // Note: since version 4.3, maximum character count changed to 4 GiB from 64 KiB // in a paragraph, but because of the other limitations, we set a lower wrap value // to get a working text editor e.g. without freezing and crash during loading of // a 50 MB text line, or unusably slow editing of a 5 MB text line. #define MAX_ASCII_PARA 250000 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(); // 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 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& GetInputStream() { return m_xInputStream; } void SetInputStream(const css::uno::Reference& 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; rtl::Reference 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; bool mbSkipInvalidateNumRules = false; bool mbIsInPaste = false; 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&, OUString aFilename, SwDoc *pDoc = nullptr ); // Read into existing document. // Document and position in document are taken from SwPaM. SwReader( SvStream&, OUString aFilename, const OUString& rBaseURL, SwPaM& ); SwReader( SfxMedium&, OUString aFilename, SwPaM& ); SwReader( css::uno::Reference < css::embed::XStorage > , OUString aFilename, SwPaM& ); // The only export interface is SwReader::Read(...)!!! ErrCodeMsg Read( const Reader& ); // Ask for glossaries. bool HasGlossaries( const Reader& ); bool ReadGlossaries( const Reader&, SwTextBlocks&, bool bSaveRelFiles ); void SetSkipInvalidateNumRules(bool bSkipInvalidateNumRules) { mbSkipInvalidateNumRules = bSkipInvalidateNumRules; } void SetInPaste(bool val) { mbIsInPaste = val; } bool IsInPaste() const { return mbIsInPaste; } protected: void SetBaseURL( const OUString& rURL ) { msBaseURL = rURL; } void SetSkipImages( bool bSkipImages ) { mbSkipImages = bSkipImages; } }; typedef std::unique_ptr> SwReaderPtr; // Special Readers can be both!! (Excel, W4W, .. ). enum class SwReaderType { NONE = 0x00, Stream = 0x01, Storage = 0x02 }; namespace o3tl { template<> struct typed_flags : is_typed_flags {}; }; 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 TestPDFExportRTF(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 TestImportHTML(SvStream &rStream); rtl::Reference mxTemplate; OUString m_aTemplateName; Date m_aDateStamp; tools::Time m_aTimeStamp; DateTime m_aCheckDateTime; protected: SvStream* m_pStream; rtl::Reference 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; bool m_bIsInPaste : 1 = false; 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; } bool IsInPaste() const { return m_bIsInPaste; } void SetInPaste(bool bSet) { m_bIsInPaste = 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& rStrings) const; const rtl::Reference& getSotStorageRef() const { return m_pStorage; }; void setSotStorageRef(const rtl::Reference& pStgRef) { m_pStorage = pStgRef; }; private: virtual ErrCodeMsg 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 ErrCodeMsg 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; /// Used for autotext handling. The list of autotexts get imported to a temporary document, and then /// this class provides the actual glossary document which is the final target for autotext. class SW_DLLPUBLIC SwTextBlocks { std::unique_ptr 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( std::u16string_view ) 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, TypedWhichId nWhichId ); std::unique_ptr 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 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 ErrCodeMsg Write( SwPaM&, SfxMedium&, const OUString* ); ErrCodeMsg Write( SwPaM&, SvStream&, const OUString* ); virtual ErrCodeMsg Write( SwPaM&, const css::uno::Reference < css::embed::XStorage >&, const OUString*, SfxMedium* = nullptr ); virtual ErrCodeMsg 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::MarkBase* >& rArr ); // Create new PaM at position. static std::shared_ptr 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! void SetStream(SvStream *const pStream); SvStream& Strm(); void SetOrganizerMode( bool bSet ) { m_bOrganizerMode = bSet; } }; typedef tools::SvRef WriterRef; // Base class for all storage writers. class SW_DLLPUBLIC StgWriter : public Writer { protected: rtl::Reference m_pStg; css::uno::Reference < css::embed::XStorage > m_xStg; // Create error at call. virtual ErrCode WriteStream() override; virtual ErrCodeMsg WriteStorage() = 0; virtual ErrCodeMsg WriteMedium( SfxMedium& ) = 0; using Writer::Write; public: StgWriter() : Writer() {} virtual bool IsStgWriter() const override; virtual ErrCodeMsg Write( SwPaM&, const css::uno::Reference < css::embed::XStorage >&, const OUString*, SfxMedium* = nullptr ) override; virtual ErrCodeMsg 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: ErrCodeMsg Write( WriterRef const & rxWriter, const OUString* = nullptr); SwWriter( SvStream&, SwCursorShell &, bool bWriteAll = false ); SwWriter( SvStream&, SwDoc & ); SwWriter( SvStream&, SwPaM &, bool bWriteAll = false ); SwWriter( 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: */