annotate data/fileio/BZipFileDevice.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents fc9323a41f5a
children
rev   line source
lbajardsilogic@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 2
lbajardsilogic@0 3 /*
lbajardsilogic@0 4 Sonic Visualiser
lbajardsilogic@0 5 An audio file viewer and annotation editor.
lbajardsilogic@0 6 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 7 This file copyright 2006 Chris Cannam.
lbajardsilogic@0 8
lbajardsilogic@0 9 This program is free software; you can redistribute it and/or
lbajardsilogic@0 10 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 11 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 12 License, or (at your option) any later version. See the file
lbajardsilogic@0 13 COPYING included with this distribution for more information.
lbajardsilogic@0 14 */
lbajardsilogic@0 15
lbajardsilogic@0 16 #include "BZipFileDevice.h"
lbajardsilogic@0 17
lbajardsilogic@0 18 #include <bzlib.h>
lbajardsilogic@0 19
lbajardsilogic@0 20 #include <iostream>
lbajardsilogic@0 21
lbajardsilogic@0 22 BZipFileDevice::BZipFileDevice(QString fileName) :
lbajardsilogic@0 23 m_fileName(fileName),
lbajardsilogic@0 24 m_file(0),
lbajardsilogic@0 25 m_bzFile(0),
lbajardsilogic@0 26 m_atEnd(true),
lbajardsilogic@0 27 m_ok(true)
lbajardsilogic@0 28 {
lbajardsilogic@0 29 }
lbajardsilogic@0 30
lbajardsilogic@0 31 BZipFileDevice::~BZipFileDevice()
lbajardsilogic@0 32 {
lbajardsilogic@0 33 // std::cerr << "BZipFileDevice::~BZipFileDevice(" << m_fileName.toStdString() << ")" << std::endl;
lbajardsilogic@0 34 if (m_bzFile) close();
lbajardsilogic@0 35 }
lbajardsilogic@0 36
lbajardsilogic@0 37 bool
lbajardsilogic@0 38 BZipFileDevice::isOK() const
lbajardsilogic@0 39 {
lbajardsilogic@0 40 return m_ok;
lbajardsilogic@0 41 }
lbajardsilogic@0 42
lbajardsilogic@0 43 bool
lbajardsilogic@0 44 BZipFileDevice::open(OpenMode mode)
lbajardsilogic@0 45 {
lbajardsilogic@0 46 setErrorString("");
lbajardsilogic@0 47
lbajardsilogic@0 48 if (m_bzFile) {
lbajardsilogic@0 49 setErrorString(tr("File is already open"));
lbajardsilogic@0 50 return false;
lbajardsilogic@0 51 }
lbajardsilogic@0 52
lbajardsilogic@0 53 if (mode & Append) {
lbajardsilogic@0 54 setErrorString(tr("Append mode not supported"));
lbajardsilogic@0 55 m_ok = false;
lbajardsilogic@0 56 return false;
lbajardsilogic@0 57 }
lbajardsilogic@0 58
lbajardsilogic@0 59 if ((mode & (ReadOnly | WriteOnly)) == 0) {
lbajardsilogic@0 60 setErrorString(tr("File access mode not specified"));
lbajardsilogic@0 61 m_ok = false;
lbajardsilogic@0 62 return false;
lbajardsilogic@0 63 }
lbajardsilogic@0 64
lbajardsilogic@0 65 if ((mode & ReadOnly) && (mode & WriteOnly)) {
lbajardsilogic@0 66 setErrorString(tr("Read and write modes both specified"));
lbajardsilogic@0 67 m_ok = false;
lbajardsilogic@0 68 return false;
lbajardsilogic@0 69 }
lbajardsilogic@0 70
lbajardsilogic@0 71 if (mode & WriteOnly) {
lbajardsilogic@0 72
lbajardsilogic@0 73 m_file = fopen(m_fileName.toLocal8Bit().data(), "wb");
lbajardsilogic@0 74 if (!m_file) {
lbajardsilogic@0 75 setErrorString(tr("Failed to open file for writing"));
lbajardsilogic@0 76 m_ok = false;
lbajardsilogic@0 77 return false;
lbajardsilogic@0 78 }
lbajardsilogic@0 79
lbajardsilogic@0 80 int bzError = BZ_OK;
lbajardsilogic@0 81 m_bzFile = BZ2_bzWriteOpen(&bzError, m_file, 9, 0, 0);
lbajardsilogic@0 82
lbajardsilogic@0 83 if (!m_bzFile) {
lbajardsilogic@0 84 fclose(m_file);
lbajardsilogic@0 85 m_file = 0;
lbajardsilogic@0 86 setErrorString(tr("Failed to open bzip2 stream for writing"));
lbajardsilogic@0 87 m_ok = false;
lbajardsilogic@0 88 return false;
lbajardsilogic@0 89 }
lbajardsilogic@0 90
lbajardsilogic@0 91 // std::cerr << "BZipFileDevice: opened \"" << m_fileName.toStdString() << "\" for writing" << std::endl;
lbajardsilogic@0 92
lbajardsilogic@0 93 setErrorString(QString());
lbajardsilogic@0 94 setOpenMode(mode);
lbajardsilogic@0 95 return true;
lbajardsilogic@0 96 }
lbajardsilogic@0 97
lbajardsilogic@0 98 if (mode & ReadOnly) {
lbajardsilogic@0 99
lbajardsilogic@0 100 m_file = fopen(m_fileName.toLocal8Bit().data(), "rb");
lbajardsilogic@0 101 if (!m_file) {
lbajardsilogic@0 102 setErrorString(tr("Failed to open file for reading"));
lbajardsilogic@0 103 m_ok = false;
lbajardsilogic@0 104 return false;
lbajardsilogic@0 105 }
lbajardsilogic@0 106
lbajardsilogic@0 107 int bzError = BZ_OK;
lbajardsilogic@0 108 m_bzFile = BZ2_bzReadOpen(&bzError, m_file, 0, 0, NULL, 0);
lbajardsilogic@0 109
lbajardsilogic@0 110 if (!m_bzFile) {
lbajardsilogic@0 111 fclose(m_file);
lbajardsilogic@0 112 m_file = 0;
lbajardsilogic@0 113 setErrorString(tr("Failed to open bzip2 stream for reading"));
lbajardsilogic@0 114 m_ok = false;
lbajardsilogic@0 115 return false;
lbajardsilogic@0 116 }
lbajardsilogic@0 117
lbajardsilogic@0 118 // std::cerr << "BZipFileDevice: opened \"" << m_fileName.toStdString() << "\" for reading" << std::endl;
lbajardsilogic@0 119
lbajardsilogic@0 120 m_atEnd = false;
lbajardsilogic@0 121
lbajardsilogic@0 122 setErrorString(QString());
lbajardsilogic@0 123 setOpenMode(mode);
lbajardsilogic@0 124 return true;
lbajardsilogic@0 125 }
lbajardsilogic@0 126
lbajardsilogic@0 127 setErrorString(tr("Internal error (open for neither read nor write)"));
lbajardsilogic@0 128 m_ok = false;
lbajardsilogic@0 129 return false;
lbajardsilogic@0 130 }
lbajardsilogic@0 131
lbajardsilogic@0 132 void
lbajardsilogic@0 133 BZipFileDevice::close()
lbajardsilogic@0 134 {
lbajardsilogic@0 135 if (!m_bzFile) {
lbajardsilogic@0 136 setErrorString(tr("File not open"));
lbajardsilogic@0 137 m_ok = false;
lbajardsilogic@0 138 return;
lbajardsilogic@0 139 }
lbajardsilogic@0 140
lbajardsilogic@0 141 int bzError = BZ_OK;
lbajardsilogic@0 142
lbajardsilogic@0 143 if (openMode() & WriteOnly) {
lbajardsilogic@0 144 unsigned int in = 0, out = 0;
lbajardsilogic@0 145 BZ2_bzWriteClose(&bzError, m_bzFile, 0, &in, &out);
lbajardsilogic@0 146 // std::cerr << "Wrote bzip2 stream (in=" << in << ", out=" << out << ")" << std::endl;
lbajardsilogic@0 147 if (bzError != BZ_OK) {
lbajardsilogic@0 148 setErrorString(tr("bzip2 stream write close error"));
lbajardsilogic@0 149 }
lbajardsilogic@0 150 fclose(m_file);
lbajardsilogic@0 151 m_bzFile = 0;
lbajardsilogic@0 152 m_file = 0;
lbajardsilogic@0 153 m_ok = false;
lbajardsilogic@0 154 return;
lbajardsilogic@0 155 }
lbajardsilogic@0 156
lbajardsilogic@0 157 if (openMode() & ReadOnly) {
lbajardsilogic@0 158 BZ2_bzReadClose(&bzError, m_bzFile);
lbajardsilogic@0 159 if (bzError != BZ_OK) {
lbajardsilogic@0 160 setErrorString(tr("bzip2 stream read close error"));
lbajardsilogic@0 161 }
lbajardsilogic@0 162 fclose(m_file);
lbajardsilogic@0 163 m_bzFile = 0;
lbajardsilogic@0 164 m_file = 0;
lbajardsilogic@0 165 m_ok = false;
lbajardsilogic@0 166 return;
lbajardsilogic@0 167 }
lbajardsilogic@0 168
lbajardsilogic@0 169 setErrorString(tr("Internal error (close for neither read nor write)"));
lbajardsilogic@0 170 return;
lbajardsilogic@0 171 }
lbajardsilogic@0 172
lbajardsilogic@0 173 qint64
lbajardsilogic@0 174 BZipFileDevice::readData(char *data, qint64 maxSize)
lbajardsilogic@0 175 {
lbajardsilogic@0 176 if (m_atEnd) return 0;
lbajardsilogic@0 177
lbajardsilogic@0 178 int bzError = BZ_OK;
lbajardsilogic@0 179 int read = BZ2_bzRead(&bzError, m_bzFile, data, maxSize);
lbajardsilogic@0 180
lbajardsilogic@0 181 // std::cerr << "BZipFileDevice::readData: requested " << maxSize << ", read " << read << std::endl;
lbajardsilogic@0 182
lbajardsilogic@0 183 if (bzError != BZ_OK) {
lbajardsilogic@0 184 if (bzError != BZ_STREAM_END) {
lbajardsilogic@0 185 std::cerr << "BZipFileDevice::readData: error condition" << std::endl;
lbajardsilogic@0 186 setErrorString(tr("bzip2 stream read error"));
lbajardsilogic@0 187 m_ok = false;
lbajardsilogic@0 188 return -1;
lbajardsilogic@0 189 } else {
lbajardsilogic@0 190 // std::cerr << "BZipFileDevice::readData: reached end of file" << std::endl;
lbajardsilogic@0 191 m_atEnd = true;
lbajardsilogic@0 192 }
lbajardsilogic@0 193 }
lbajardsilogic@0 194
lbajardsilogic@0 195 return read;
lbajardsilogic@0 196 }
lbajardsilogic@0 197
lbajardsilogic@0 198 qint64
lbajardsilogic@0 199 BZipFileDevice::writeData(const char *data, qint64 maxSize)
lbajardsilogic@0 200 {
lbajardsilogic@0 201 int bzError = BZ_OK;
lbajardsilogic@0 202 BZ2_bzWrite(&bzError, m_bzFile, (void *)data, maxSize);
lbajardsilogic@0 203
lbajardsilogic@0 204 // std::cerr << "BZipFileDevice::writeData: " << maxSize << " to write" << std::endl;
lbajardsilogic@0 205
lbajardsilogic@0 206 if (bzError != BZ_OK) {
lbajardsilogic@0 207 std::cerr << "BZipFileDevice::writeData: error condition" << std::endl;
lbajardsilogic@0 208 setErrorString("bzip2 stream write error");
lbajardsilogic@0 209 m_ok = false;
lbajardsilogic@0 210 return -1;
lbajardsilogic@0 211 }
lbajardsilogic@0 212
lbajardsilogic@0 213 // std::cerr << "BZipFileDevice::writeData: wrote " << maxSize << std::endl;
lbajardsilogic@0 214
lbajardsilogic@0 215 return maxSize;
lbajardsilogic@0 216 }
lbajardsilogic@0 217