File libmwaw-0.3.1-stream.patch of Package libmwaw

--- libmwaw-0.3.1/configure.ac	2014-05-16 15:02:34.000000000 +0200
+++ libmwaw-0.3.1/configure.ac	2014-07-01 16:43:15.247625691 +0200
@@ -16,7 +16,7 @@
 AC_INIT([libmwaw],[libmwaw_version])
 AC_CONFIG_MACRO_DIR([m4])
 AC_CONFIG_HEADERS([config.h])
-AM_INIT_AUTOMAKE([1.11 foreign dist-xz dist-bzip2])
+AM_INIT_AUTOMAKE([1.10 foreign dist-bzip2])
 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
 AC_LANG([C++])
 AC_STRUCT_TIMEZONE()
--- libmwaw-0.3.1/src/lib/Makefile.am	2014-05-16 15:02:34.000000000 +0200
+++ libmwaw-0.3.1/src/lib/Makefile.am	2014-05-26 12:38:37.689185841 +0200
@@ -223,6 +223,8 @@
 	MWAWSpreadsheetEncoder.hxx	\
 	MWAWSpreadsheetListener.cxx	\
 	MWAWSpreadsheetListener.hxx	\
+	MWAWStringStream.cxx		\
+	MWAWStringStream.hxx		\
 	MWAWSubDocument.cxx		\
 	MWAWSubDocument.hxx		\
 	MWAWTable.cxx			\
--- libmwaw-0.3.1/src/lib/MWAWInputStream.cxx	2014-04-22 15:37:01.000000000 +0200
+++ libmwaw-0.3.1/src/lib/MWAWInputStream.cxx	2014-05-26 12:38:45.892999633 +0200
@@ -43,6 +43,7 @@
 #include "MWAWDebug.hxx"
 
 #include "MWAWInputStream.hxx"
+#include "MWAWStringStream.hxx"
 
 MWAWInputStream::MWAWInputStream(shared_ptr<librevenge::RVNGInputStream> inp, bool inverted)
   : m_stream(inp), m_streamSize(0), m_inverseRead(inverted), m_readLimit(-1), m_prevLimits(),
@@ -517,7 +518,7 @@
       MWAW_DEBUG_MSG(("MWAWInputStream::unBinHex: can not read the resource fork\n"));
     }
     else {
-      shared_ptr<librevenge::RVNGInputStream> rsrc(new librevenge::RVNGStringStream(data, (unsigned int)numBytesRead));
+      shared_ptr<librevenge::RVNGInputStream> rsrc(new MWAWStringStream(data, (unsigned int)numBytesRead));
       m_resourceFork.reset(new MWAWInputStream(rsrc,false));
     }
   }
@@ -532,7 +533,7 @@
       MWAW_DEBUG_MSG(("MWAWInputStream::unBinHex: can not read the data fork\n"));
       return false;
     }
-    m_stream.reset(new librevenge::RVNGStringStream(data, (unsigned int)numBytesRead));
+    m_stream.reset(new MWAWStringStream(data, (unsigned int)numBytesRead));
   }
 
   return true;
@@ -692,9 +693,9 @@
         return false;
       }
       if (wh==1)
-        dataInput.reset(new librevenge::RVNGStringStream(data, (unsigned int)numBytesRead));
+        dataInput.reset(new MWAWStringStream(data, (unsigned int)numBytesRead));
       else if (wh==2)
-        rsrcInput.reset(new librevenge::RVNGStringStream(data, (unsigned int)numBytesRead));
+        rsrcInput.reset(new MWAWStringStream(data, (unsigned int)numBytesRead));
       else { // the finder info
         if (entrySize < 8) {
           MWAW_DEBUG_MSG(("MWAWInputStream::unMacMIME: finder info size is odd\n"));
--- libmwaw-0.3.1/src/lib/MWAWStringStream.cxx	1970-01-01 01:00:00.000000000 +0100
+++ libmwaw-0.3.1/src/lib/MWAWStringStream.cxx	2014-05-26 12:38:37.689185841 +0200
@@ -0,0 +1,153 @@
+/* -*- Mode: C++; c-default-style: "k&r"; indent-tabs-mode: nil; tab-width: 2; c-basic-offset: 2 -*- */
+
+/* libmwaw
+* Version: MPL 2.0 / LGPLv2+
+*
+* The contents of this file are subject to the Mozilla Public License Version
+* 2.0 (the "License"); you may not use this file except in compliance with
+* the License or as specified alternatively below. You may obtain a copy of
+* the License at http://www.mozilla.org/MPL/
+*
+* Software distributed under the License is distributed on an "AS IS" basis,
+* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+* for the specific language governing rights and limitations under the
+* License.
+*
+* Alternatively, the contents of this file may be used under the terms of
+* the GNU Lesser General Public License Version 2 or later (the "LGPLv2+"),
+* in which case the provisions of the LGPLv2+ are applicable
+* instead of those above.
+*/
+
+#include <cstring>
+#include <vector>
+
+#include <librevenge-stream/librevenge-stream.h>
+
+#include "MWAWStringStream.hxx"
+
+class MWAWStringStreamPrivate
+{
+public:
+  MWAWStringStreamPrivate(const unsigned char *data, unsigned dataSize);
+  ~MWAWStringStreamPrivate();
+  std::vector<unsigned char> buffer;
+  long offset;
+private:
+  MWAWStringStreamPrivate(const MWAWStringStreamPrivate &);
+  MWAWStringStreamPrivate &operator=(const MWAWStringStreamPrivate &);
+};
+
+MWAWStringStreamPrivate::MWAWStringStreamPrivate(const unsigned char *data, unsigned dataSize) :
+  buffer(dataSize),
+  offset(0)
+{
+  std::memcpy(&buffer[0], data, dataSize);
+}
+
+MWAWStringStreamPrivate::~MWAWStringStreamPrivate()
+{
+}
+
+MWAWStringStream::MWAWStringStream(const unsigned char *data, const unsigned int dataSize) :
+  librevenge::RVNGInputStream(),
+  d(new MWAWStringStreamPrivate(data, dataSize))
+{
+}
+
+MWAWStringStream::~MWAWStringStream()
+{
+  delete d;
+}
+
+const unsigned char *MWAWStringStream::read(unsigned long numBytes, unsigned long &numBytesRead)
+{
+  numBytesRead = 0;
+
+  if (numBytes == 0)
+    return 0;
+
+  long numBytesToRead;
+
+  if ((unsigned long)d->offset+numBytes < d->buffer.size())
+    numBytesToRead = (long) numBytes;
+  else
+    numBytesToRead = (long) d->buffer.size() - d->offset;
+
+  numBytesRead = (unsigned long) numBytesToRead; // about as paranoid as we can be..
+
+  if (numBytesToRead == 0)
+    return 0;
+
+  long oldOffset = d->offset;
+  d->offset += numBytesToRead;
+
+  return &d->buffer[size_t(oldOffset)];
+
+}
+
+long MWAWStringStream::tell()
+{
+  return d->offset;
+}
+
+int MWAWStringStream::seek(long offset, librevenge::RVNG_SEEK_TYPE seekType)
+{
+  if (seekType == librevenge::RVNG_SEEK_CUR)
+    d->offset += offset;
+  else if (seekType == librevenge::RVNG_SEEK_SET)
+    d->offset = offset;
+  else if (seekType == librevenge::RVNG_SEEK_END)
+    d->offset += d->buffer.size();
+
+  if (d->offset < 0) {
+    d->offset = 0;
+    return 1;
+  }
+  if ((long)d->offset > (long)d->buffer.size()) {
+    d->offset = (long) d->buffer.size();
+    return 1;
+  }
+
+  return 0;
+}
+
+bool MWAWStringStream::isEnd()
+{
+  if ((long)d->offset >= (long)d->buffer.size())
+    return true;
+
+  return false;
+}
+
+bool MWAWStringStream::isStructured()
+{
+  return false;
+}
+
+unsigned MWAWStringStream::subStreamCount()
+{
+  return 0;
+}
+
+const char *MWAWStringStream::subStreamName(unsigned)
+{
+  return 0;
+}
+
+bool MWAWStringStream::existsSubStream(const char *)
+{
+  return false;
+}
+
+librevenge::RVNGInputStream *MWAWStringStream::getSubStreamById(unsigned)
+{
+  return 0;
+}
+
+librevenge::RVNGInputStream *MWAWStringStream::getSubStreamByName(const char *)
+{
+  return 0;
+}
+
+// vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab:
--- libmwaw-0.3.1/src/lib/MWAWStringStream.hxx	1970-01-01 01:00:00.000000000 +0100
+++ libmwaw-0.3.1/src/lib/MWAWStringStream.hxx	2014-05-26 12:38:37.689185841 +0200
@@ -0,0 +1,50 @@
+/* -*- Mode: C++; c-default-style: "k&r"; indent-tabs-mode: nil; tab-width: 2; c-basic-offset: 2 -*- */
+
+/* libmwaw
+* Version: MPL 2.0 / LGPLv2+
+*
+* The contents of this file are subject to the Mozilla Public License Version
+* 2.0 (the "License"); you may not use this file except in compliance with
+* the License or as specified alternatively below. You may obtain a copy of
+* the License at http://www.mozilla.org/MPL/
+*
+* Software distributed under the License is distributed on an "AS IS" basis,
+* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+* for the specific language governing rights and limitations under the
+* License.
+*
+* Alternatively, the contents of this file may be used under the terms of
+* the GNU Lesser General Public License Version 2 or later (the "LGPLv2+"),
+* in which case the provisions of the LGPLv2+ are applicable
+* instead of those above.
+*/
+
+#include <librevenge-stream/librevenge-stream.h>
+
+class MWAWStringStreamPrivate;
+
+class MWAWStringStream: public librevenge::RVNGInputStream
+{
+public:
+  MWAWStringStream(const unsigned char *data, const unsigned int dataSize);
+  ~MWAWStringStream();
+
+  const unsigned char *read(unsigned long numBytes, unsigned long &numBytesRead);
+  long tell();
+  int seek(long offset, librevenge::RVNG_SEEK_TYPE seekType);
+  bool isEnd();
+
+  bool isStructured();
+  unsigned subStreamCount();
+  const char *subStreamName(unsigned);
+  bool existsSubStream(const char *name);
+  librevenge::RVNGInputStream *getSubStreamByName(const char *name);
+  librevenge::RVNGInputStream *getSubStreamById(unsigned);
+
+private:
+  MWAWStringStreamPrivate *d;
+  MWAWStringStream(const MWAWStringStream &); // copy is not allowed
+  MWAWStringStream &operator=(const MWAWStringStream &); // assignment is not allowed
+};
+
+// vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab:
--- libmwaw-0.3.1/src/lib/WingzParser.cxx	2014-03-29 11:25:32.000000000 +0100
+++ libmwaw-0.3.1/src/lib/WingzParser.cxx	2014-05-26 12:38:37.690185824 +0200
@@ -49,6 +49,7 @@
 #include "MWAWPictMac.hxx"
 #include "MWAWPrinter.hxx"
 #include "MWAWSpreadsheetListener.hxx"
+#include "MWAWStringStream.hxx"
 #include "MWAWSubDocument.hxx"
 
 #include "WingzParser.hxx"
@@ -2496,7 +2497,7 @@
 
   // finally replace the actual input with a new input
   shared_ptr<librevenge::RVNGInputStream> newInput
-  (new librevenge::RVNGStringStream(buffer, (unsigned int)length));
+  (new MWAWStringStream(buffer, (unsigned int)length));
   delete [] buffer;
   getParserState()->m_input.reset(new MWAWInputStream(newInput, false));
   return true;
openSUSE Build Service is sponsored by