src/lib/CDRDocument.cpp | 167 ++++++++++++++++++++++++----------------------- src/lib/libcdr_utils.cpp | 1 2 files changed, 88 insertions(+), 80 deletions(-)
New commits: commit 923e2667b275441ee1861e27c882493c8ebbef4e Author: David Tardon <dtar...@redhat.com> Date: Fri May 3 17:51:16 2013 +0200 coverity: try harder at not throwing execptions diff --git a/src/lib/CDRDocument.cpp b/src/lib/CDRDocument.cpp index 497e27c..952bf5b 100644 --- a/src/lib/CDRDocument.cpp +++ b/src/lib/CDRDocument.cpp @@ -133,108 +133,115 @@ bool libcdr::CDRDocument::parse(::WPXInputStream *input, libwpg::WPGPaintInterfa try { version = getCDRVersion(input); - } - catch (libcdr::EndOfStreamException const &) - { - // This can only happen if isSupported() has not been called before - return false; - } - - if (version) - { - input->seek(0, WPX_SEEK_SET); - CDRParserState ps; - CDRStylesCollector stylesCollector(ps); - CDRParser stylesParser(std::vector<WPXInputStream *>(), &stylesCollector); - if (version >= 300) - retVal = stylesParser.parseRecords(input); - else - retVal = stylesParser.parseWaldo(input); - if (ps.m_pages.empty()) - retVal = false; - if (retVal) + if (version) { input->seek(0, WPX_SEEK_SET); - CDRContentCollector contentCollector(ps, painter); - CDRParser contentParser(std::vector<WPXInputStream *>(), &contentCollector); + CDRParserState ps; + CDRStylesCollector stylesCollector(ps); + CDRParser stylesParser(std::vector<WPXInputStream *>(), &stylesCollector); if (version >= 300) - retVal = contentParser.parseRecords(input); + retVal = stylesParser.parseRecords(input); else - retVal = contentParser.parseWaldo(input); + retVal = stylesParser.parseWaldo(input); + if (ps.m_pages.empty()) + retVal = false; + if (retVal) + { + input->seek(0, WPX_SEEK_SET); + CDRContentCollector contentCollector(ps, painter); + CDRParser contentParser(std::vector<WPXInputStream *>(), &contentCollector); + if (version >= 300) + retVal = contentParser.parseRecords(input); + else + retVal = contentParser.parseWaldo(input); + } + return retVal; } - return retVal; + } + catch (libcdr::EndOfStreamException const &) + { + // This can only happen if isSupported() has not been called before + return false; } WPXInputStream *tmpInput = input; - CDRZipStream zinput(input); - bool isZipDocument = zinput.isOLEStream(); - std::vector<std::string> dataFiles; - if (isZipDocument) + std::vector<WPXInputStream *> dataStreams; + try { - input = zinput.getDocumentOLEStream("content/riffData.cdr"); - if (!input) + CDRZipStream zinput(input); + bool isZipDocument = zinput.isOLEStream(); + std::vector<std::string> dataFiles; + if (isZipDocument) { - input = zinput.getDocumentOLEStream("content/root.dat"); - if (input) + input = zinput.getDocumentOLEStream("content/riffData.cdr"); + if (!input) { - WPXInputStream *tmpStream = zinput.getDocumentOLEStream("content/dataFileList.dat"); - if (tmpStream) + input = zinput.getDocumentOLEStream("content/root.dat"); + if (input) { - std::string dataFileName; - while (!tmpStream->atEOS()) + WPXInputStream *tmpStream = zinput.getDocumentOLEStream("content/dataFileList.dat"); + if (tmpStream) { - unsigned char character = readU8(tmpStream); - if (character == 0x0a) + std::string dataFileName; + while (!tmpStream->atEOS()) { - dataFiles.push_back(dataFileName); - dataFileName.clear(); + unsigned char character = readU8(tmpStream); + if (character == 0x0a) + { + dataFiles.push_back(dataFileName); + dataFileName.clear(); + } + else + dataFileName += (char)character; } - else - dataFileName += (char)character; + if (!dataFileName.empty()) + dataFiles.push_back(dataFileName); } - if (!dataFileName.empty()) - dataFiles.push_back(dataFileName); } } } + dataStreams.reserve(dataFiles.size()); + for (unsigned i=0; i<dataFiles.size(); i++) + { + std::string streamName("content/data/"); + streamName += dataFiles[i]; + CDR_DEBUG_MSG(("Extracting stream: %s\n", streamName.c_str())); + dataStreams.push_back(zinput.getDocumentOLEStream(streamName.c_str())); + } + if (!input) + input = tmpInput; + input->seek(0, WPX_SEEK_SET); + CDRParserState ps; + // libcdr extension to the getDocumentOLEStream. Will extract the first stream in the + // given directory + WPXInputStream *cmykProfile = zinput.getDocumentOLEStream("color/profiles/cmyk/"); + if (cmykProfile) + { + ps.setColorTransform(cmykProfile); + delete cmykProfile; + } + WPXInputStream *rgbProfile = zinput.getDocumentOLEStream("color/profiles/rgb/"); + if (rgbProfile) + { + ps.setColorTransform(rgbProfile); + delete rgbProfile; + } + CDRStylesCollector stylesCollector(ps); + CDRParser stylesParser(dataStreams, &stylesCollector); + retVal = stylesParser.parseRecords(input); + if (ps.m_pages.empty()) + retVal = false; + if (retVal) + { + input->seek(0, WPX_SEEK_SET); + CDRContentCollector contentCollector(ps, painter); + CDRParser contentParser(dataStreams, &contentCollector); + retVal = contentParser.parseRecords(input); + } } - std::vector<WPXInputStream *> dataStreams(dataFiles.size()); - for (unsigned i=0; i<dataFiles.size(); i++) - { - std::string streamName("content/data/"); - streamName += dataFiles[i]; - CDR_DEBUG_MSG(("Extracting stream: %s\n", streamName.c_str())); - dataStreams[i] = zinput.getDocumentOLEStream(streamName.c_str()); - } - if (!input) - input = tmpInput; - input->seek(0, WPX_SEEK_SET); - CDRParserState ps; - // libcdr extension to the getDocumentOLEStream. Will extract the first stream in the - // given directory - WPXInputStream *cmykProfile = zinput.getDocumentOLEStream("color/profiles/cmyk/"); - if (cmykProfile) - { - ps.setColorTransform(cmykProfile); - delete cmykProfile; - } - WPXInputStream *rgbProfile = zinput.getDocumentOLEStream("color/profiles/rgb/"); - if (rgbProfile) + catch (libcdr::EndOfStreamException const &) { - ps.setColorTransform(rgbProfile); - delete rgbProfile; - } - CDRStylesCollector stylesCollector(ps); - CDRParser stylesParser(dataStreams, &stylesCollector); - retVal = stylesParser.parseRecords(input); - if (ps.m_pages.empty()) retVal = false; - if (retVal) - { - input->seek(0, WPX_SEEK_SET); - CDRContentCollector contentCollector(ps, painter); - CDRParser contentParser(dataStreams, &contentCollector); - retVal = contentParser.parseRecords(input); } if (input != tmpInput) delete input; commit e508b60b9bf73ed6bdbc204f33e9f7b5c487fb99 Author: David Tardon <dtar...@redhat.com> Date: Fri May 3 17:40:14 2013 +0200 coverity: add missing break diff --git a/src/lib/libcdr_utils.cpp b/src/lib/libcdr_utils.cpp index 00f9193..74d6ed4 100644 --- a/src/lib/libcdr_utils.cpp +++ b/src/lib/libcdr_utils.cpp @@ -377,6 +377,7 @@ void libcdr::appendCharacters(WPXString &text, std::vector<unsigned char> charac break; case 0x88: // CHINESEBIG5 conv = ucnv_open("windows-950", &status); + break; case 0xa1: // GREEEK conv = ucnv_open("windows-1253", &status); break; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits