diff options
| author | Ted Gould <ted@gould.cx> | 2006-07-31 05:14:00 +0000 |
|---|---|---|
| committer | gouldtj <gouldtj@users.sourceforge.net> | 2006-07-31 05:14:00 +0000 |
| commit | 1b268270d703d308dad917363a9e1ad950bbe566 (patch) | |
| tree | cdb3579b27d2223cd75ef135e84e0b0e253438b5 /src/extension/internal/libwpg/WPGStreamImplementation.cpp | |
| parent | handling recieved messages (diff) | |
| download | inkscape-1b268270d703d308dad917363a9e1ad950bbe566.tar.gz inkscape-1b268270d703d308dad917363a9e1ad950bbe566.zip | |
r13105@tres: ted | 2006-07-30 11:08:56 -0700
Copying in libwpg as it seems they have no releases.
(bzr r1522)
Diffstat (limited to 'src/extension/internal/libwpg/WPGStreamImplementation.cpp')
| -rw-r--r-- | src/extension/internal/libwpg/WPGStreamImplementation.cpp | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/src/extension/internal/libwpg/WPGStreamImplementation.cpp b/src/extension/internal/libwpg/WPGStreamImplementation.cpp new file mode 100644 index 000000000..bd0c59cd5 --- /dev/null +++ b/src/extension/internal/libwpg/WPGStreamImplementation.cpp @@ -0,0 +1,239 @@ +/* libwpg + * Copyright (C) 2006 Ariya Hidayat (ariya@kde.org) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02111-1301 USA + * + * For further information visit http://libwpg.sourceforge.net + */ + +/* "This product is not manufactured, approved, or supported by + * Corel Corporation or Corel Corporation Limited." + */ + +#include "WPGStreamImplementation.h" +#include "WPGOLEStream.h" +#include "libwpg_utils.h" + +#include <fstream> +#include <sstream> +#include <string> + +// MSVC++ 6.0 defines getc as macro, so undefine it +#undef getc + +namespace libwpg +{ + +class WPGFileStreamPrivate +{ +public: + WPGFileStreamPrivate(); + std::fstream file; + std::stringstream buffer; +}; + +class WPGMemoryStreamPrivate +{ +public: + WPGMemoryStreamPrivate(const std::string str); + std::stringstream buffer; +}; + +} // namespace libwpg + +using namespace libwpg; + +WPGFileStreamPrivate::WPGFileStreamPrivate() : + buffer(std::ios::binary | std::ios::in | std::ios::out) +{ +} + +WPGMemoryStreamPrivate::WPGMemoryStreamPrivate(const std::string str) : + buffer(str, std::ios::binary | std::ios::in) +{ +} + + +WPGFileStream::WPGFileStream(const char* filename) +{ + d = new WPGFileStreamPrivate; + + d->file.open( filename, std::ios::binary | std::ios::in ); +} + +WPGFileStream::~WPGFileStream() +{ + delete d; +} + +unsigned char WPGFileStream::getc() +{ + return d->file.get(); +} + +long WPGFileStream::read(long nbytes, char* buffer) +{ + long nread = 0; + + if(d->file.good()) + { + long curpos = d->file.tellg(); + d->file.read(buffer, nbytes); + nread = (long)d->file.tellg() - curpos; + } + + return nread; +} + +long WPGFileStream::tell() +{ + return d->file.good() ? (long)d->file.tellg() : -1L; +} + +void WPGFileStream::seek(long offset) +{ + if(d->file.good()) + d->file.seekg(offset); +} + +bool WPGFileStream::atEnd() +{ + return d->file.eof(); +} + +bool WPGFileStream::isOle() +{ + if (d->buffer.str().empty()) + d->buffer << d->file.rdbuf(); + Storage tmpStorage( d->buffer ); + if (tmpStorage.isOle()) + return true; + return false; +} + +WPGInputStream* WPGFileStream::getWPGOleStream() +{ + if (d->buffer.str().empty()) + d->buffer << d->file.rdbuf(); + Storage *tmpStorage = new Storage( d->buffer ); + Stream tmpStream( tmpStorage, "PerfectOffice_MAIN" ); + if (!tmpStorage || (tmpStorage->result() != Storage::Ok) || !tmpStream.size()) + { + if (tmpStorage) + delete tmpStorage; + return (WPGInputStream*)0; + } + + unsigned char *tmpBuffer = new unsigned char[tmpStream.size()]; + unsigned long tmpLength; + tmpLength = tmpStream.read(tmpBuffer, tmpStream.size()); + + // sanity check + if (tmpLength > tmpStream.size() || tmpLength < tmpStream.size()) + /* something went wrong here and we do not trust the + resulting buffer */ + { + if (tmpStorage) + delete tmpStorage; + return (WPGInputStream*)0; + } + + delete tmpStorage; + return new WPGMemoryStream((const char *)tmpBuffer, tmpLength); +} + + +WPGMemoryStream::WPGMemoryStream(const char *data, const unsigned int dataSize) +{ + d = new WPGMemoryStreamPrivate(std::string(data, dataSize)); +} + +WPGMemoryStream::~WPGMemoryStream() +{ + delete d; +} + +unsigned char WPGMemoryStream::getc() +{ + return d->buffer.get(); +} + +long WPGMemoryStream::read(long nbytes, char* buffer) +{ + long nread = 0; + + if(d->buffer.good()) + { + long curpos = d->buffer.tellg(); + d->buffer.read(buffer, nbytes); + nread = (long)d->buffer.tellg() - curpos; + } + + return nread; +} + +long WPGMemoryStream::tell() +{ + return d->buffer.good() ? (long)d->buffer.tellg() : -1L; +} + +void WPGMemoryStream::seek(long offset) +{ + if(d->buffer.good()) + d->buffer.seekg(offset); +} + +bool WPGMemoryStream::atEnd() +{ + return d->buffer.eof(); +} + +bool WPGMemoryStream::isOle() +{ + Storage tmpStorage( d->buffer ); + if (tmpStorage.isOle()) + return true; + return false; +} + +WPGInputStream* WPGMemoryStream::getWPGOleStream() +{ + Storage *tmpStorage = new Storage( d->buffer ); + Stream tmpStream( tmpStorage, "PerfectOffice_MAIN" ); + if (!tmpStorage || (tmpStorage->result() != Storage::Ok) || !tmpStream.size()) + { + if (tmpStorage) + delete tmpStorage; + return (WPGInputStream*)0; + } + + unsigned char *tmpBuffer = new unsigned char[tmpStream.size()]; + unsigned long tmpLength; + tmpLength = tmpStream.read(tmpBuffer, tmpStream.size()); + + // sanity check + if (tmpLength > tmpStream.size() || tmpLength < tmpStream.size()) + /* something went wrong here and we do not trust the + resulting buffer */ + { + if (tmpStorage) + delete tmpStorage; + return (WPGInputStream*)0; + } + + delete tmpStorage; + return new WPGMemoryStream((const char *)tmpBuffer, tmpLength); +} |
