File indexing completed on 2024-12-01 13:11:47

0001 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
0002 /* writerperfect
0003  * Version: MPL 2.0 / LGPLv2.1+
0004  *
0005  * This Source Code Form is subject to the terms of the Mozilla Public
0006  * License, v. 2.0. If a copy of the MPL was not distributed with this
0007  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
0008  *
0009  * Major Contributor(s):
0010  * Copyright (C) 2007 Fridrich Strba (fridrich.strba@bluewin.ch)
0011  *
0012  * For minor contributions see the git repository.
0013  *
0014  * Alternatively, the contents of this file may be used under the terms
0015  * of the GNU Lesser General Public License Version 2.1 or later
0016  * (LGPLv2.1+), in which case the provisions of the LGPLv2.1+ are
0017  * applicable instead of those above.
0018  *
0019  * For further information visit http://libwpd.sourceforge.net
0020  */
0021 
0022 #ifdef HAVE_CONFIG_H
0023 #include "config.h"
0024 #endif
0025 
0026 #include <stdio.h>
0027 
0028 #include "OutputFileHelper.hxx"
0029 
0030 #ifdef USE_GSF_OUTPUT
0031 #include <gsf/gsf-utils.h>
0032 #include <gsf/gsf-output-stdio.h>
0033 #include <gsf/gsf-outfile.h>
0034 #include <gsf/gsf-outfile-zip.h>
0035 #include <gsf/gsf-input-stdio.h>
0036 #else
0037 #include "FemtoZip.hxx"
0038 #endif
0039 
0040 struct OutputFileHelperImpl
0041 {
0042     OutputFileHelperImpl(const char *password) : mpOutfile(0), mpPassword(password) {}
0043 #ifdef USE_GSF_OUTPUT
0044     GsfOutfile *mpOutfile;
0045 #else
0046     FemtoZip *mpOutfile;
0047 #endif
0048     const char *mpPassword;
0049 private:
0050     OutputFileHelperImpl(OutputFileHelperImpl const &);
0051     OutputFileHelperImpl &operator=(OutputFileHelperImpl const &);
0052 };
0053 
0054 
0055 OutputFileHelper::OutputFileHelper(const char *outFileName, const char *password) :
0056 #ifdef USE_GSF_OUTPUT
0057     m_impl(new OutputFileHelperImpl(password))
0058 #else
0059     m_impl(new OutputFileHelperImpl(password))
0060 #endif
0061 {
0062     m_impl->mpOutfile = 0;
0063 #ifdef USE_GSF_OUTPUT
0064     GsfOutput  *pOutput = 0;
0065     GError   *err = 0;
0066 
0067     gsf_init();
0068 
0069     if (!outFileName)
0070         pOutput = 0;
0071     else
0072     {
0073         pOutput = GSF_OUTPUT(gsf_output_stdio_new(outFileName, &err));
0074         if (pOutput == 0)
0075         {
0076             if (err)
0077             {
0078                 g_warning("'%s' error: %s", outFileName, err->message);
0079                 g_error_free(err);
0080             }
0081             gsf_shutdown();
0082         }
0083         else
0084         {
0085             if (err)
0086                 g_error_free(err);
0087             err = 0;
0088             m_impl->mpOutfile = GSF_OUTFILE(gsf_outfile_zip_new(pOutput, &err));
0089             if (m_impl->mpOutfile == 0)
0090             {
0091                 if (err)
0092                 {
0093                     g_warning("'%s' error: %s",
0094                               "gsf_outfile_zip_new", err->message);
0095                     g_error_free(err);
0096                 }
0097                 gsf_shutdown();
0098             }
0099             else
0100             {
0101                 if (err)
0102                     g_error_free(err);
0103                 err = 0;
0104                 g_object_unref(pOutput);
0105             }
0106         }
0107     }
0108 #else
0109     if (outFileName)
0110         m_impl->mpOutfile = new FemtoZip(outFileName);
0111 #endif
0112 }
0113 
0114 OutputFileHelper::~OutputFileHelper()
0115 {
0116 #ifdef USE_GSF_OUTPUT
0117     if (m_impl->mpOutfile && !gsf_output_close((GsfOutput *) m_impl->mpOutfile))
0118         fprintf(stderr, "ERROR : Couldn't close outfile\n");
0119 
0120     if (m_impl->mpOutfile)
0121         g_object_unref(m_impl->mpOutfile);
0122 
0123     gsf_shutdown();
0124 #else
0125     if (m_impl->mpOutfile)
0126         delete m_impl->mpOutfile;
0127 #endif
0128     if (m_impl)
0129         delete m_impl;
0130 }
0131 
0132 bool OutputFileHelper::writeChildFile(const char *childFileName, const char *str)
0133 {
0134     if (!m_impl->mpOutfile)
0135         return true;
0136 #ifdef USE_GSF_OUTPUT
0137     GsfOutput *child;
0138     if (0 != (child = gsf_outfile_new_child(m_impl->mpOutfile, childFileName, FALSE)))
0139     {
0140         bool res = gsf_output_puts(child, str) &&
0141                    gsf_output_close(child);
0142         g_object_unref(child);
0143         return res;
0144     }
0145     return false;
0146 #else
0147     m_impl->mpOutfile->createEntry(childFileName, 0);
0148     if (m_impl->mpOutfile->errorCode())
0149         return false;
0150     m_impl->mpOutfile->writeString(str);
0151     if (m_impl->mpOutfile->errorCode())
0152         return false;
0153     m_impl->mpOutfile->closeEntry();
0154     if (m_impl->mpOutfile->errorCode())
0155         return false;
0156     return true;
0157 #endif
0158 }
0159 
0160 #if defined(USE_GSF_OUTPUT) && defined(GSF_HAS_COMPRESSION_LEVEL)
0161 bool OutputFileHelper::writeChildFile(const char *childFileName, const char *str, const char compression_level)
0162 #else
0163 bool OutputFileHelper::writeChildFile(const char *childFileName, const char *str, const char)
0164 #endif
0165 {
0166     if (!m_impl->mpOutfile)
0167         return true;
0168 #ifdef USE_GSF_OUTPUT
0169     GsfOutput *child;
0170 #ifdef GSF_HAS_COMPRESSION_LEVEL
0171     if (0 != (child = gsf_outfile_new_child_full(m_impl->mpOutfile, childFileName, FALSE,"compression-level", compression_level, (void *)0)))
0172 #else
0173     if (0 != (child = gsf_outfile_new_child(m_impl->mpOutfile, childFileName, FALSE)))
0174 #endif
0175     {
0176         bool res = gsf_output_puts(child, str) &&
0177                    gsf_output_close(child);
0178         g_object_unref(child);
0179         return res;
0180     }
0181     return false;
0182 #else
0183     m_impl->mpOutfile->createEntry(childFileName, 0); // only storing without compressing works with FemtoZip
0184     if (m_impl->mpOutfile->errorCode())
0185         return false;
0186     m_impl->mpOutfile->writeString(str);
0187     if (m_impl->mpOutfile->errorCode())
0188         return false;
0189     m_impl->mpOutfile->closeEntry();
0190     if (m_impl->mpOutfile->errorCode())
0191         return false;
0192     return true;
0193 #endif
0194 }
0195 
0196 /* vim:set shiftwidth=4 softtabstop=4 noexpandtab: */