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 #ifndef INCLUDED_SVX_XMLGRHLP_HXX 21 #define INCLUDED_SVX_XMLGRHLP_HXX 22 23 #include <cppuhelper/compbase.hxx> 24 #include <osl/mutex.hxx> 25 #include <vcl/graph.hxx> 26 #include <rtl/ref.hxx> 27 #include <vector> 28 #include <unordered_map> 29 #include <utility> 30 #include <com/sun/star/document/XGraphicObjectResolver.hpp> 31 #include <com/sun/star/document/XGraphicStorageHandler.hpp> 32 #include <com/sun/star/document/XBinaryStreamResolver.hpp> 33 #include <com/sun/star/embed/XStorage.hpp> 34 #include <svx/svxdllapi.h> 35 36 enum class SvXMLGraphicHelperMode 37 { 38 Read, Write 39 }; 40 41 struct SvxGraphicHelperStream_Impl 42 { 43 css::uno::Reference < css::embed::XStorage > xStorage; 44 css::uno::Reference < css::io::XStream > xStream; 45 }; 46 47 class SVX_DLLPUBLIC SvXMLGraphicHelper final : public cppu::WeakComponentImplHelper<css::document::XGraphicObjectResolver, 48 css::document::XGraphicStorageHandler, 49 css::document::XBinaryStreamResolver> 50 { 51 private: 52 typedef ::std::vector< css::uno::Reference< css::io::XOutputStream > > GraphicOutputStreamVector; 53 54 ::osl::Mutex maMutex; 55 css::uno::Reference < css::embed::XStorage > mxRootStorage; 56 OUString maCurStorageName; 57 GraphicOutputStreamVector maGrfStms; 58 59 std::unordered_map<OUString, css::uno::Reference<css::graphic::XGraphic>> maGraphicObjects; 60 std::unordered_map<Graphic, std::pair<OUString, OUString>> maExportGraphics; 61 std::unordered_map<void*, std::pair<OUString, OUString>> maExportPdf; 62 63 SvXMLGraphicHelperMode meCreateMode; 64 OUString maOutputMimeType; 65 66 SVX_DLLPRIVATE static bool ImplGetStreamNames( const OUString& rURLStr, 67 OUString& rPictureStorageName, 68 OUString& rPictureStreamName ); 69 SVX_DLLPRIVATE css::uno::Reference < css::embed::XStorage > 70 ImplGetGraphicStorage( const OUString& rPictureStorageName ); 71 SVX_DLLPRIVATE SvxGraphicHelperStream_Impl 72 ImplGetGraphicStream( const OUString& rPictureStorageName, 73 const OUString& rPictureStreamName ); 74 SVX_DLLPRIVATE static OUString ImplGetGraphicMimeType( const OUString& rFileName ); 75 SVX_DLLPRIVATE Graphic ImplReadGraphic( const OUString& rPictureStorageName, 76 const OUString& rPictureStreamName ); 77 78 SvXMLGraphicHelper(); 79 virtual ~SvXMLGraphicHelper() override; 80 void Init( const css::uno::Reference < css::embed::XStorage >& xXMLStorage, 81 SvXMLGraphicHelperMode eCreateMode, 82 const OUString& rGraphicMimeType = OUString() ); 83 84 virtual void SAL_CALL disposing() override; 85 86 SVX_DLLPRIVATE OUString implSaveGraphic(css::uno::Reference<css::graphic::XGraphic> const & rxGraphic, 87 OUString & rOutMimeType, OUString const & rRequestName); 88 89 public: 90 SvXMLGraphicHelper( SvXMLGraphicHelperMode eCreateMode ); 91 92 static rtl::Reference<SvXMLGraphicHelper> Create( const css::uno::Reference < css::embed::XStorage >& rXMLStorage, 93 SvXMLGraphicHelperMode eCreateMode ); 94 static rtl::Reference<SvXMLGraphicHelper> Create( SvXMLGraphicHelperMode eCreateMode, 95 const OUString& rMimeType = OUString() ); 96 97 public: 98 99 // XGraphicObjectResolver 100 virtual OUString SAL_CALL resolveGraphicObjectURL( const OUString& aURL ) override; 101 102 // XGraphicStorageHandler 103 virtual css::uno::Reference<css::graphic::XGraphic> SAL_CALL 104 loadGraphic(OUString const & aURL) override; 105 106 virtual css::uno::Reference<css::graphic::XGraphic> SAL_CALL 107 loadGraphicFromOutputStream(css::uno::Reference<css::io::XOutputStream> const & rxOutputStream) override; 108 109 virtual OUString SAL_CALL 110 saveGraphic(css::uno::Reference<css::graphic::XGraphic> const & rxGraphic) override; 111 112 virtual OUString SAL_CALL 113 saveGraphicByName(css::uno::Reference<css::graphic::XGraphic> const & rxGraphic, OUString & rOutSavedMimeType, OUString const & rRequestName) override; 114 115 virtual css::uno::Reference<css::io::XInputStream> SAL_CALL 116 createInputStream(css::uno::Reference<css::graphic::XGraphic> const & rxGraphic) override; 117 118 // XBinaryStreamResolver 119 virtual css::uno::Reference< css::io::XInputStream > SAL_CALL getInputStream( const OUString& rURL ) override; 120 virtual css::uno::Reference< css::io::XOutputStream > SAL_CALL createOutputStream( ) override; 121 virtual OUString SAL_CALL resolveOutputStream( const css::uno::Reference< css::io::XOutputStream >& rxBinaryStream ) override; 122 }; 123 124 #endif 125 126 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 127