/*************************************************************************** * Copyright (C) 2008 by Oliver Groß * * z.o.gross@gmx.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "ccrosspackage.h" #include "nonogramproblem.h" #include #include #include namespace libqnono { //public: CCrossPackage::CCrossPackage() : m_headersOnly(false) {} CCrossPackage::~CCrossPackage() {} /* destructor needs more includes than the header has */ bool CCrossPackage::doReadHeader(QDataStream & in) { QString stringBuffer; QSize sizeBuffer; qDebug("reading header"); if (in.atEnd()) { qCritical("invalid package file - no header"); return false; } in >> stringBuffer; if ((stringBuffer != "QCROSSPACKAGE")) { qCritical("invalid package file - invalid header: %s", stringBuffer.toUtf8().data()); return false; } if (in.atEnd()) { qCritical("invalid package file - no package name"); return false; } in >> stringBuffer; if (stringBuffer.isEmpty()) { qCritical("invalid package file - invalid package name"); return false; } m_Name = stringBuffer; m_headersOnly = true; return true; } bool CCrossPackage::doReadData(QDataStream & in) { m_PictureList.clear(); qint32 pictureCount = 0; if (in.atEnd()) { qCritical("invalid package file - no picture count"); return false; } in >> pictureCount; QString id(identifier()); int i; for (i = 0; i < pictureCount && !in.atEnd(); i++) { m_PictureList.append(NonogramProblem()); if (!m_PictureList.last().readFromStream(in, id, i)) { m_PictureList.pop_back(); qCritical("invalid package file - invalid picture"); return false; } } if (i < pictureCount) qWarning("damaged package file - invalid picture count"); m_headersOnly = false; return true; } const NonogramProblem & CCrossPackage::getPicture(int ndx) { loadPictures(); return m_PictureList[ndx]; } bool CCrossPackage::loadPictures() { if (!m_headersOnly) return true; QFile file(m_FileName); qDebug("opening file: %s", m_FileName.toUtf8().data()); if (!file.open(QIODevice::ReadOnly)) { return false; } QDataStream in(&file); in.setVersion(QDataStream::Qt_4_0); return !doReadHeader(in) || !doReadData(in); } void CCrossPackage::unloadPictures() { if (!m_PictureList.empty()) { m_PictureList.clear(); m_headersOnly = true; } } bool CCrossPackage::save() { Q_ASSERT(!m_headersOnly); QFile file(m_FileName); qDebug("opening file for writing: %s", m_FileName.toUtf8().data()); if (!file.open(QIODevice::WriteOnly)) return false; QDataStream out(&file); out.setVersion(QDataStream::Qt_4_0); out << QString("QCROSSPACKAGE"); out << m_Name; out << (qint32)(m_PictureList.size()); foreach (const NonogramProblem & i, m_PictureList) i.writeToStream(out); file.close(); return true; } CCrossPackage * CCrossPackage::read(QString fileName) { QFile file(fileName); qDebug("opening file: %s", fileName.toUtf8().data()); if (!file.open(QIODevice::ReadOnly)) { return 0; } CCrossPackage *p = new CCrossPackage(); p->setFileName(fileName); QDataStream in(&file); in.setVersion(QDataStream::Qt_4_0); if (!p->doReadHeader(in) || !p->doReadData(in)) { delete p; return 0; } return p; } CCrossPackage * CCrossPackage::readHeader(QString fileName) { QFile file(fileName); qDebug("opening file: %s", fileName.toUtf8().data()); if (!file.open(QIODevice::ReadOnly)) { return 0; } CCrossPackage *p = new CCrossPackage(); p->setFileName(fileName); QDataStream in(&file); in.setVersion(QDataStream::Qt_4_0); if (!p->doReadHeader(in)) { delete p; return 0; } return p; } QString CCrossPackage::identifierFromPath(const QString &fileName) { QString id(QDir::toNativeSeparators(fileName).section(QDir::separator(), -1, -1, QString::SectionSkipEmpty)); while (id.endsWith(".cpk", Qt::CaseInsensitive) || id.endsWith(".hsc", Qt::CaseInsensitive)) id.chop(4); return id; } }