--- a/CMakeLists.txt Thu Sep 08 00:34:57 2011 +0200
+++ b/CMakeLists.txt Sat Oct 08 16:45:52 2011 +0200
@@ -194,6 +194,7 @@
if(NOT BUILD_ENGINE_LIBRARY)
add_subdirectory(bin)
+ add_subdirectory(misc/quazip)
add_subdirectory(QTfrontend)
add_subdirectory(share)
add_subdirectory(tools)
--- a/QTfrontend/CMakeLists.txt Thu Sep 08 00:34:57 2011 +0200
+++ b/QTfrontend/CMakeLists.txt Sat Oct 08 16:45:52 2011 +0200
@@ -4,7 +4,6 @@
set(QT_USE_QTCORE TRUE)
set(QT_USE_QTGUI TRUE)
set(QT_USE_QTNETWORK TRUE)
-set(QT_USE_QTWEBKIT TRUE)
set(QT_USE_QTSVG FALSE)
set(QT_USE_QTXML FALSE)
set(QT_USE_QTOPENGL FALSE)
@@ -20,6 +19,7 @@
include_directories(.)
include_directories(${SDL_INCLUDE_DIR})
include_directories(${SDLMIXER_INCLUDE_DIR})
+include_directories(${CMAKE_SOURCE_DIR}/misc/quazip)
if(UNIX)
# HACK: in freebsd cannot find iconv.h included via SDL.h
include_directories("/usr/local/include")
@@ -115,6 +115,7 @@
drawmapwidget.cpp
drawmapscene.cpp
themesmodel.cpp
+ databrowser.cpp
)
#xfire integration
@@ -196,6 +197,7 @@
drawmapwidget.h
drawmapscene.h
themesmodel.h
+ databrowser.h
)
set(hwfr_hdrs
@@ -236,6 +238,7 @@
set(HW_LINK_LIBS
+ quazip
${QT_LIBRARIES}
${SDL_LIBRARY}
${SDLMIXER_LIBRARY}
@@ -247,7 +250,7 @@
set(HW_LINK_LIBS ${HW_LINK_LIBS} SDL)
endif()
- set( HW_LINK_LIBS
+ set(HW_LINK_LIBS
${HW_LINK_LIBS}
ole32
oleaut32
--- a/QTfrontend/chatwidget.cpp Thu Sep 08 00:34:57 2011 +0200
+++ b/QTfrontend/chatwidget.cpp Sat Oct 08 16:45:52 2011 +0200
@@ -400,9 +400,8 @@
void HWChatWidget::nickRemoved(const QString& nick)
{
- QList<QListWidgetItem *> items = chatNicks->findItems(nick, Qt::MatchExactly);
- QListIterator<QListWidgetItem *> it(items);
- while(it.hasNext()) chatNicks->takeItem(chatNicks->row(it.next()));
+ foreach(QListWidgetItem * item, chatNicks->findItems(nick, Qt::MatchExactly))
+ chatNicks->takeItem(chatNicks->row(item));
emit nickCountUpdate(chatNicks->count());
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/databrowser.cpp Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,57 @@
+#include <QNetworkAccessManager>
+#include <QNetworkRequest>
+#include <QNetworkReply>
+#include <QDebug>
+#include <QUrl>
+
+#include "databrowser.h"
+
+const QNetworkRequest::Attribute typeAttribute = (QNetworkRequest::Attribute)(QNetworkRequest::User + 1);
+const QNetworkRequest::Attribute urlAttribute = (QNetworkRequest::Attribute)(QNetworkRequest::User + 2);
+
+DataBrowser::DataBrowser(QWidget *parent) :
+ QTextBrowser(parent)
+{
+
+ manager = new QNetworkAccessManager(this);
+}
+
+QVariant DataBrowser::loadResource(int type, const QUrl & name)
+{
+ if(type == QTextDocument::ImageResource || type == QTextDocument::StyleSheetResource)
+ {
+ if(resources.contains(name.toString()))
+ {
+ return resources.take(name.toString());
+ }
+ else
+ if(!requestedResources.contains(name.toString()))
+ {
+ qDebug() << "Requesting resource" << name.toString();
+ requestedResources.insert(name.toString());
+
+ QNetworkRequest newRequest(QUrl("http://www.hedgewars.org" + name.toString()));
+ newRequest.setAttribute(typeAttribute, type);
+ newRequest.setAttribute(urlAttribute, name);
+
+ QNetworkReply *reply = manager->get(newRequest);
+ connect(reply, SIGNAL(finished()), this, SLOT(resourceDownloaded()));
+ }
+ }
+
+ return QVariant();
+}
+
+void DataBrowser::resourceDownloaded()
+{
+ QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
+
+ if(reply)
+ {
+ int type = reply->request().attribute(typeAttribute).toInt();
+ QUrl url = reply->request().attribute(urlAttribute).toUrl();
+ resources.insert(url.toString(), reply->readAll());
+ document()->addResource(type, reply->request().url(), QVariant());
+ update();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/databrowser.h Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,33 @@
+#ifndef DATABROWSER_H
+#define DATABROWSER_H
+
+#include <QTextBrowser>
+#include <QSet>
+
+class QNetworkAccessManager;
+
+class DataBrowser : public QTextBrowser
+{
+ Q_OBJECT
+public:
+ explicit DataBrowser(QWidget *parent = 0);
+
+signals:
+
+public slots:
+
+private:
+ QNetworkAccessManager *manager;
+
+ // hash and set of QString instead of QUrl to support Qt versions
+ // older than 4.7 (those have no support for qHash(const QUrl &))
+ QHash<QString, QByteArray> resources;
+ QSet<QString> requestedResources;
+
+ QVariant loadResource(int type, const QUrl & name);
+
+private slots:
+ void resourceDownloaded();
+};
+
+#endif // DATABROWSER_H
--- a/QTfrontend/game.cpp Thu Sep 08 00:34:57 2011 +0200
+++ b/QTfrontend/game.cpp Sat Oct 08 16:45:52 2011 +0200
@@ -53,7 +53,9 @@
void HWGame::onClientDisconnect()
{
switch (gameType) {
- case gtDemo: break;
+ case gtDemo:
+ if (gameState == gsInterrupted || gameState == gsHalted) emit HaveRecord(false, demo);
+ break;
case gtNet:
emit HaveRecord(true, demo);
break;
@@ -84,8 +86,7 @@
if (m_pTeamSelWidget)
{
- QListIterator<HWTeam> it(m_pTeamSelWidget->getPlayingTeams());
- while(it.hasNext())
+ foreach(HWTeam team, m_pTeamSelWidget->getPlayingTeams())
{
HWProto::addStringToBuffer(buf, QString("eammloadt %1").arg(ammostr.mid(0, cAmmoNumber)));
HWProto::addStringToBuffer(buf, QString("eammprob %1").arg(ammostr.mid(cAmmoNumber, cAmmoNumber)));
@@ -93,7 +94,7 @@
HWProto::addStringToBuffer(buf, QString("eammreinf %1").arg(ammostr.mid(3 * cAmmoNumber, cAmmoNumber)));
if(!gamecfg->schemeData(21).toBool()) HWProto::addStringToBuffer(buf, QString("eammstore"));
HWProto::addStringListToBuffer(buf,
- it.next().TeamGameConfig(gamecfg->getInitHealth()));
+ team.TeamGameConfig(gamecfg->getInitHealth()));
;
}
}
@@ -392,9 +393,8 @@
if (m_pTeamSelWidget)
{
QByteArray buf;
- QListIterator<HWTeam> it(m_pTeamSelWidget->getPlayingTeams());
- while(it.hasNext())
- HWProto::addStringToBuffer(buf, QString("eteamgone %1").arg(it.next().TeamName));
+ foreach(HWTeam team, m_pTeamSelWidget->getPlayingTeams())
+ HWProto::addStringToBuffer(buf, QString("eteamgone %1").arg(team.TeamName));
RawSendIPC(buf);
}
}
--- a/QTfrontend/hwconsts.h Thu Sep 08 00:34:57 2011 +0200
+++ b/QTfrontend/hwconsts.h Sat Oct 08 16:45:52 2011 +0200
@@ -74,9 +74,9 @@
#define AMMOLINE_PROMODE_CRATE "111111111111111111111111111111111111111110010111111101"
#define AMMOLINE_SHOPPA_QT "000000990000000000000000000000000000000000000000000000"
-#define AMMOLINE_SHOPPA_PROB "444441004424440221011212122242200000000200040001001101"
+#define AMMOLINE_SHOPPA_PROB "444441004424440221011212122242200000000200040001001100"
#define AMMOLINE_SHOPPA_DELAY "000000000000000000000000000000000000000000000000000000"
-#define AMMOLINE_SHOPPA_CRATE "111111111111111111111111111111111111111110110111111101"
+#define AMMOLINE_SHOPPA_CRATE "111111111111111111111111111111111111111110110111111100"
#define AMMOLINE_CLEAN_QT "101000900001000001100000000000000000000000000000100000"
#define AMMOLINE_CLEAN_PROB "040504054160065554655446477657666666615551010111541101"
--- a/QTfrontend/hwform.cpp Thu Sep 08 00:34:57 2011 +0200
+++ b/QTfrontend/hwform.cpp Sat Oct 08 16:45:52 2011 +0200
@@ -152,12 +152,17 @@
connect(ui.pageMain->BtnNet, SIGNAL(clicked()), pageSwitchMapper, SLOT(map()));
pageSwitchMapper->setMapping(ui.pageMain->BtnNet, ID_PAGE_NETTYPE);
+
connect(ui.pageMain->BtnInfo, SIGNAL(clicked()), pageSwitchMapper, SLOT(map()));
- pageSwitchMapper->setMapping(ui.pageMain->BtnInfo, ID_PAGE_DATADOWNLOAD);
+ pageSwitchMapper->setMapping(ui.pageMain->BtnInfo, ID_PAGE_INFO);
+
+ connect(ui.pageMain->BtnDataDownload, SIGNAL(clicked()), pageSwitchMapper, SLOT(map()));
+ pageSwitchMapper->setMapping(ui.pageMain->BtnDataDownload, ID_PAGE_DATADOWNLOAD);
connect(ui.pageMain->BtnExit, SIGNAL(pressed()), this, SLOT(btnExitPressed()));
connect(ui.pageMain->BtnExit, SIGNAL(clicked()), this, SLOT(btnExitClicked()));
+ connect(ui.pageInfo->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack()));
connect(ui.pageDataDownload->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack()));
connect(ui.pageEditTeam->BtnTeamSave, SIGNAL(clicked()), this, SLOT(TeamSave()));
@@ -621,8 +626,9 @@
}
QStringList tmnames;
- QListIterator<HWTeam> it(curTeamSelWidget->getDontPlayingTeams());
- while(it.hasNext()) tmnames += it.next().TeamName;
+
+ foreach(HWTeam team, curTeamSelWidget->getNotPlayingTeams())
+ tmnames += team.TeamName;
//UpdateTeamsLists(&tmnames); // FIXME: still need more work if teamname is updated while configuring
UpdateTeamsLists();
--- a/QTfrontend/main.cpp Thu Sep 08 00:34:57 2011 +0200
+++ b/QTfrontend/main.cpp Sat Oct 08 16:45:52 2011 +0200
@@ -470,8 +470,8 @@
app.installTranslator(&Translator);
}
+#ifdef _WIN32
// Win32 registry setup (used for xfire detection etc. - don't set it if we're running in "portable" mode with a custom config dir)
-#ifdef _WIN32
if(!custom_config)
{
QSettings registry_hklm("HKEY_LOCAL_MACHINE", QSettings::NativeFormat);
--- a/QTfrontend/mapContainer.cpp Thu Sep 08 00:34:57 2011 +0200
+++ b/QTfrontend/mapContainer.cpp Sat Oct 08 16:45:52 2011 +0200
@@ -64,8 +64,6 @@
imageButt->setFlat(true);
imageButt->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);//QSizePolicy::Minimum, QSizePolicy::Minimum);
mapLayout->addWidget(imageButt, 0, 0, 1, 2);
- //connect(imageButt, SIGNAL(clicked()), this, SLOT(setRandomSeed()));
- //connect(imageButt, SIGNAL(clicked()), this, SLOT(setRandomTheme()));
connect(imageButt, SIGNAL(clicked()), this, SLOT(setRandomMap()));
chooseMap = new QComboBox(mapWidget);
@@ -293,7 +291,6 @@
maze_size_label->hide();
cbMazeSize->hide();
emit mapChanged("+rnd+");
- emit mapgenChanged(mapgen);
emit themeChanged(chooseMap->itemData(index).toList()[1].toString());
break;
case MAPGEN_MAZE:
@@ -305,7 +302,6 @@
maze_size_label->show();
cbMazeSize->show();
emit mapChanged("+maze+");
- emit mapgenChanged(mapgen);
emit themeChanged(chooseMap->itemData(index).toList()[1].toString());
break;
case MAPGEN_DRAWN:
@@ -317,10 +313,10 @@
maze_size_label->hide();
cbMazeSize->hide();
emit mapChanged("+drawn+");
- emit mapgenChanged(mapgen);
emit themeChanged(chooseMap->itemData(index).toList()[1].toString());
break;
default:
+ mapgen = MAPGEN_MAP;
updatePreview();
gbThemes->hide();
lblFilter->hide();
@@ -329,6 +325,8 @@
cbMazeSize->hide();
emit mapChanged(chooseMap->itemData(index).toList()[0].toString());
}
+
+ emit mapgenChanged(mapgen);
}
// Should this add text to identify map size?
@@ -447,7 +445,7 @@
void HWMapContainer::setSeed(const QString & seed)
{
intSetSeed(seed);
- if (chooseMap->currentIndex() < MAPGEN_MAP)
+ if (chooseMap->currentIndex() < MAPGEN_DRAWN)
updatePreview();
}
@@ -511,15 +509,14 @@
{
int i = MAPGEN_MAP + 3 + numMissions + rand() % (chooseMap->count() - MAPGEN_MAP - 3 - numMissions);
chooseMap->setCurrentIndex(i);
- setRandomSeed();
+ updatePreview();
}
void HWMapContainer::setRandomMission()
{
int i = MAPGEN_MAP + 2 + rand() % numMissions;
- qDebug() << i << MAPGEN_MAP << numMissions;
chooseMap->setCurrentIndex(i);
- setRandomSeed();
+ updatePreview();
}
void HWMapContainer::setRandomSeed()
@@ -575,7 +572,10 @@
void HWMapContainer::intSetMapgen(MapGenerator m)
{
mapgen = m;
- chooseMap->setCurrentIndex(m);
+
+ if(m != MAPGEN_MAP)
+ chooseMap->setCurrentIndex(m);
+
emit mapgenChanged(m);
}
@@ -644,9 +644,8 @@
break;
default:
QPixmap mapImage;
- qDebug() << "Map data" << curIndex << chooseMap->currentText() << chooseMap->itemData(curIndex);
QFile tmpfile;
- tmpfile.setFileName(cfgdir->absolutePath() + "/Data//Maps/" + chooseMap->itemData(curIndex).toList()[0].toString() + "/preview.png");
+ tmpfile.setFileName(cfgdir->absolutePath() + "/Data/Maps/" + chooseMap->itemData(curIndex).toList()[0].toString() + "/preview.png");
if (!tmpfile.exists()) tmpfile.setFileName(datadir->absolutePath() + "/Maps/" + chooseMap->itemData(curIndex).toList()[0].toString() + "/preview.png");
if(!mapImage.load(QFileInfo(tmpfile).absoluteFilePath())) {
imageButt->setIcon(QIcon());
--- a/QTfrontend/pagedata.cpp Thu Sep 08 00:34:57 2011 +0200
+++ b/QTfrontend/pagedata.cpp Sat Oct 08 16:45:52 2011 +0200
@@ -23,10 +23,16 @@
#include <QNetworkReply>
#include <QFileInfo>
#include <QFileDialog>
-#include <QTextBrowser>
-
+#include <QDebug>
+#include <QProgressBar>
+#include <QBuffer>
#include "pagedata.h"
+#include "databrowser.h"
+#include "hwconsts.h"
+
+#include "quazip.h"
+#include "quazipfile.h"
PageDataDownload::PageDataDownload(QWidget* parent) : AbstractPage(parent)
{
@@ -35,49 +41,181 @@
pageLayout->setColumnStretch(1, 1);
pageLayout->setColumnStretch(2, 1);
- BtnBack = addButton(":/res/Exit.png", pageLayout, 1, 0, true);
+ BtnBack = addButton(":/res/Exit.png", pageLayout, 2, 0, true);
- web = new QTextBrowser(this);
- connect(web, SIGNAL(anchorClicked(QUrl)), this, SLOT(install(const QUrl&)));
+ web = new DataBrowser(this);
+ connect(web, SIGNAL(anchorClicked(QUrl)), this, SLOT(request(const QUrl&)));
web->setOpenLinks(false);
- //web->setSource();
- //web->load(QUrl("http://m8y.org/hw/downloads/"));
- //web->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
pageLayout->addWidget(web, 0, 0, 1, 3);
-
- QNetworkRequest newRequest(QUrl("http://m8y.org/hw/downloads/index.xhtml"));
- //newRequest.setAttribute(QNetworkRequest::User, fileName);
+ progressBarsLayout = new QVBoxLayout();
+ pageLayout->addLayout(progressBarsLayout, 1, 0, 1, 3);
- QNetworkAccessManager *manager = new QNetworkAccessManager(this);
- QNetworkReply *reply = manager->get(newRequest);
- connect(reply, SIGNAL(finished()), this, SLOT(downloadIssueFinished()));
+ fetchList();
}
-void PageDataDownload::install(const QUrl &url)
+void PageDataDownload::request(const QUrl &url)
{
-qWarning("Download Request");
-QString fileName = QFileInfo(url.toString()).fileName();
+ QUrl finalUrl;
+ if(url.host().isEmpty())
+ finalUrl = QUrl("http://www.hedgewars.org" + url.path());
+ else
+ finalUrl = url;
+
+ if(url.path().endsWith(".zip"))
+ {
+ qWarning() << "Download Request" << url.toString();
+ QString fileName = QFileInfo(url.toString()).fileName();
+
+ QNetworkRequest newRequest(finalUrl);
+ newRequest.setAttribute(QNetworkRequest::User, fileName);
-QNetworkRequest newRequest(url);
-newRequest.setAttribute(QNetworkRequest::User, fileName);
+ QNetworkAccessManager *manager = new QNetworkAccessManager(this);
+ QNetworkReply *reply = manager->get(newRequest);
+ connect(reply, SIGNAL(finished()), this, SLOT(fileDownloaded()));
+ connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64)));
-QNetworkAccessManager *manager = new QNetworkAccessManager(this);
-QNetworkReply *reply = manager->get(newRequest);
-//connect( reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64)) );
+ QProgressBar *progressBar = new QProgressBar(this);
+ progressBarsLayout->addWidget(progressBar);
+ progressBars.insert(reply, progressBar);
+ } else
+ {
+ qWarning() << "Page Request" << url.toString();
+
+ QNetworkRequest newRequest(finalUrl);
+
+ QNetworkAccessManager *manager = new QNetworkAccessManager(this);
+ QNetworkReply *reply = manager->get(newRequest);
+ connect(reply, SIGNAL(finished()), this, SLOT(pageDownloaded()));
+ }
}
-void PageDataDownload::downloadIssueFinished()
+void PageDataDownload::pageDownloaded()
+{
+ QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
+
+ if(reply)
+ {
+ QString html = QString::fromUtf8(reply->readAll());
+ int begin = html.indexOf("<!-- BEGIN -->");
+ int end = html.indexOf("<!-- END -->");
+ if(begin != -1 && begin < end)
+ {
+ html.truncate(end);
+ html.remove(0, begin);
+ }
+ web->setHtml(html);
+ }
+}
+
+void PageDataDownload::fileDownloaded()
{
QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
if(reply)
{
- web->setHtml(QString::fromUtf8(reply->readAll()));
+ QByteArray fileContents = reply->readAll();
+ QProgressBar *progressBar = progressBars.value(reply, 0);
+
+ if(progressBar)
+ {
+ progressBars.remove(reply);
+ progressBar->deleteLater();
+ }
+
+ extractDataPack(&fileContents);
+ }
+}
+
+void PageDataDownload::downloadProgress(qint64 bytesRecieved, qint64 bytesTotal)
+{
+ QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
+
+ if(reply)
+ {
+ QProgressBar *progressBar = progressBars.value(reply, 0);
+
+ if(progressBar)
+ {
+ progressBar->setValue(bytesRecieved);
+ progressBar->setMaximum(bytesTotal);
+ }
}
}
+void PageDataDownload::fetchList()
+{
+ request(QUrl("http://hedgewars.org/content.html"));
+}
+
+bool PageDataDownload::extractDataPack(QByteArray * buf)
+{
+ QBuffer buffer;
+ buffer.setBuffer(buf);
+
+ QuaZip zip;
+ zip.setIoDevice(&buffer);
+ if(!zip.open(QuaZip::mdUnzip))
+ {
+ qWarning("testRead(): zip.open(): %d", zip.getZipError());
+ return false;
+ }
+
+ QuaZipFile file(&zip);
+
+ QDir extractDir(*cfgdir);
+ extractDir.cd("Data");
+
+ for(bool more = zip.goToFirstFile(); more; more = zip.goToNextFile())
+ {
+ if(!file.open(QIODevice::ReadOnly))
+ {
+ qWarning("file.open(): %d", file.getZipError());
+ return false;
+ }
+ QString fileName = file.getActualFileName();
+ QString filePath = extractDir.filePath(fileName);
+ if (fileName.endsWith("/"))
+ {
+ QFileInfo fi(filePath);
+ QDir().mkpath(fi.filePath());
+ } else
+ {
+ qDebug() << "Extracting" << filePath;
+ QFile out(filePath);
+ if(!out.open(QFile::WriteOnly))
+ {
+ qWarning() << "out.open():" << out.errorString();
+ return false;
+ }
+ out.write(file.readAll());
+
+ out.close();
+
+ if(file.getZipError() != UNZ_OK) {
+ qWarning("file.getFileName(): %d", file.getZipError());
+ return false;
+ }
+
+ if(!file.atEnd()) {
+ qWarning("read all but not EOF");
+ return false;
+ }
+ }
+
+ file.close();
+
+ if(file.getZipError()!=UNZ_OK) {
+ qWarning("file.close(): %d", file.getZipError());
+ return false;
+ }
+ }
+
+ zip.close();
+
+ return true;
+}
--- a/QTfrontend/pagedata.h Thu Sep 08 00:34:57 2011 +0200
+++ b/QTfrontend/pagedata.h Sat Oct 08 16:45:52 2011 +0200
@@ -22,7 +22,10 @@
#include <QUrl>
#include "AbstractPage.h"
-class QTextBrowser;
+class DataBrowser;
+class QProgressBar;
+class QNetworkReply;
+class QVBoxLayout;
class PageDataDownload : public AbstractPage
{
@@ -32,12 +35,23 @@
PageDataDownload(QWidget* parent = 0);
QPushButton *BtnBack;
- QTextBrowser *web;
+
+public slots:
+ void fetchList();
+
+private:
+ DataBrowser *web;
+ QHash<QNetworkReply*, QProgressBar *> progressBars;
+ QVBoxLayout *progressBarsLayout;
+
+ bool extractDataPack(QByteArray * buf);
private slots:
- void install(const QUrl &url);
+ void request(const QUrl &url);
- void downloadIssueFinished();
+ void pageDownloaded();
+ void fileDownloaded();
+ void downloadProgress(qint64, qint64);
};
#endif
--- a/QTfrontend/pagemain.cpp Thu Sep 08 00:34:57 2011 +0200
+++ b/QTfrontend/pagemain.cpp Sat Oct 08 16:45:52 2011 +0200
@@ -41,6 +41,7 @@
pageLayout->setRowStretch(2, 0);
pageLayout->setRowStretch(3, 1);
pageLayout->setRowStretch(4, 1);
+ pageLayout->setRowStretch(5, 1);
BtnSinglePlayer = addButton(":/res/LocalPlay.png", pageLayout, 2, 0, 1, 2, true);
BtnSinglePlayer->setToolTip(tr("Local Game (Play a game on a single computer)"));
@@ -50,6 +51,9 @@
BtnNet->setToolTip(tr("Network Game (Play a game across a network)"));
pageLayout->setAlignment(BtnNet, Qt::AlignHCenter);
+ BtnDataDownload = addButton(tr("Downloadable Content"), pageLayout, 4, 0, 1, 4, false);
+ pageLayout->setAlignment(BtnDataDownload, Qt::AlignHCenter);
+
mainNote = new QLabel(this);
mainNote->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
mainNote->setWordWrap(true);
@@ -119,9 +123,9 @@
else
mainNote->setText(QLabel::tr("This development build is 'work in progress' and may not be compatible with other versions of the game. Some features might be broken or incomplete. Use at your own risk!"));
- pageLayout->addWidget(mainNote, 4, 1, 1, 2);
+ pageLayout->addWidget(mainNote, 5, 1, 1, 2);
- BtnSetup = addButton(":/res/Settings.png", pageLayout, 4, 3, true);
+ BtnSetup = addButton(":/res/Settings.png", pageLayout, 5, 3, true);
//BtnInfo = addButton(":/res/About.png", pageLayout, 3, 1, 1, 2, true);
BtnInfo = addButton(":/res/HedgewarsTitle.png", pageLayout, 0, 0, 1, 4, true);
@@ -129,7 +133,7 @@
pageLayout->setAlignment(BtnInfo, Qt::AlignHCenter);
//pageLayout->setAlignment(BtnInfo, Qt::AlignHCenter);
- BtnExit = addButton(":/res/Exit.png", pageLayout, 4, 0, 1, 1, true);
+ BtnExit = addButton(":/res/Exit.png", pageLayout, 5, 0, 1, 1, true);
BtnExit->setFixedHeight(BtnSetup->height());
BtnExit->setStyleSheet("QPushButton{margin-top: 2px;}");
}
--- a/QTfrontend/pagemain.h Thu Sep 08 00:34:57 2011 +0200
+++ b/QTfrontend/pagemain.h Sat Oct 08 16:45:52 2011 +0200
@@ -33,6 +33,7 @@
QPushButton *BtnSetup;
QPushButton *BtnInfo;
QPushButton *BtnExit;
+ QPushButton *BtnDataDownload;
QLabel *mainNote;
};
--- a/QTfrontend/teamselect.cpp Thu Sep 08 00:34:57 2011 +0200
+++ b/QTfrontend/teamselect.cpp Sat Oct 08 16:45:52 2011 +0200
@@ -44,7 +44,7 @@
this, SLOT(proxyTeamColorChanged(const HWTeam&)));
} else {
frameDontPlaying->addTeam(team, false);
- curDontPlayingTeams.push_back(team);
+ m_curNotPlayingTeams.push_back(team);
if(m_acceptOuter) {
connect(frameDontPlaying->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)),
this, SLOT(pre_changeTeamStatus(HWTeam)));
@@ -144,14 +144,14 @@
void TeamSelWidget::changeTeamStatus(HWTeam team)
{
- QList<HWTeam>::iterator itDontPlay=std::find(curDontPlayingTeams.begin(), curDontPlayingTeams.end(), team);
+ QList<HWTeam>::iterator itDontPlay=std::find(m_curNotPlayingTeams.begin(), m_curNotPlayingTeams.end(), team);
QList<HWTeam>::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team);
- bool willBePlaying=itDontPlay!=curDontPlayingTeams.end();
+ bool willBePlaying=itDontPlay!=m_curNotPlayingTeams.end();
if(!willBePlaying) {
// playing team => dont playing
- curDontPlayingTeams.push_back(*itPlay);
+ m_curNotPlayingTeams.push_back(*itPlay);
emit teamNotPlaying(*itPlay);
curPlayingTeams.erase(itPlay);
} else {
@@ -162,7 +162,7 @@
itDontPlay->teamColor=framePlaying->getNextColor();
curPlayingTeams.push_back(*itDontPlay);
if(!m_acceptOuter) emit teamWillPlay(*itDontPlay);
- curDontPlayingTeams.erase(itDontPlay);
+ m_curNotPlayingTeams.erase(itDontPlay);
}
FrameTeams* pRemoveTeams;
@@ -253,10 +253,10 @@
//frameDontPlaying->removeTeam(*it);
//}
frameDontPlaying->resetTeams();
- curDontPlayingTeams.clear();
+ m_curNotPlayingTeams.clear();
- QListIterator<HWTeam> it(teamslist);
- while(it.hasNext()) addTeam(it.next());
+ foreach(HWTeam team, teamslist)
+ addTeam(team);
}
bool TeamSelWidget::isPlaying(HWTeam team) const
@@ -269,9 +269,9 @@
return curPlayingTeams;
}
-QList<HWTeam> TeamSelWidget::getDontPlayingTeams() const
+QList<HWTeam> TeamSelWidget::getNotPlayingTeams() const
{
- return curDontPlayingTeams;
+ return m_curNotPlayingTeams;
}
void TeamSelWidget::pre_changeTeamStatus(HWTeam team)
--- a/QTfrontend/teamselect.h Thu Sep 08 00:34:57 2011 +0200
+++ b/QTfrontend/teamselect.h Sat Oct 08 16:45:52 2011 +0200
@@ -45,7 +45,7 @@
void resetPlayingTeams(const QList<HWTeam>& teamslist);
bool isPlaying(HWTeam team) const;
QList<HWTeam> getPlayingTeams() const;
- QList<HWTeam> getDontPlayingTeams() const;
+ QList<HWTeam> getNotPlayingTeams() const;
void setInteractivity(bool interactive);
public slots:
@@ -77,7 +77,7 @@
bool m_acceptOuter;
QList<HWTeam> curPlayingTeams;
- QList<HWTeam> curDontPlayingTeams;
+ QList<HWTeam> m_curNotPlayingTeams;
};
#endif // _TEAM_SELECT_INCLUDED
--- a/hedgewars/GSHandlers.inc Thu Sep 08 00:34:57 2011 +0200
+++ b/hedgewars/GSHandlers.inc Sat Oct 08 16:45:52 2011 +0200
@@ -1126,7 +1126,8 @@
AllInactive := false;
HHGear := Gear^.Hedgehog^.Gear;
dec(Gear^.Timer);
- if (Gear^.Timer = 0)or((Gear^.Message and gmDestroy) <> 0)or((HHGear^.State and gstHHDriven) =
+ if ((GameFlags and gfInfAttack) <> 0) and (TurnTimeLeft > 0) then dec(TurnTimeLeft);
+ if (TurnTimeLeft = 0) or (Gear^.Timer = 0)or((Gear^.Message and gmDestroy) <> 0)or((HHGear^.State and gstHHDriven) =
0) then
begin
StopSound(Gear^.SoundChannel);
@@ -1235,6 +1236,8 @@
begin
AllInactive := false;
dec(Gear^.Timer);
+ if ((GameFlags and gfInfAttack) <> 0) and (TurnTimeLeft > 0) then dec(TurnTimeLeft);
+
HHGear := Gear^.Hedgehog^.Gear;
HedgehogChAngle(HHGear);
@@ -1302,7 +1305,7 @@
Gear^.dX, Gear^.dY,
cHHRadius * 5, cHHRadius * 2 + 7);
- if (Gear^.Timer = 0) or ((HHGear^.Message and gmAttack) <> 0) then
+ if (TurnTimeLeft = 0) or (Gear^.Timer = 0) or ((HHGear^.Message and gmAttack) <> 0) then
begin
HHGear^.Message := 0;
HHGear^.State := HHGear^.State and (not gstNotKickable);
--- a/hedgewars/uAmmos.pas Thu Sep 08 00:34:57 2011 +0200
+++ b/hedgewars/uAmmos.pas Sat Oct 08 16:45:52 2011 +0200
@@ -215,7 +215,7 @@
FillAmmoStore(hhammo, ammos);
CurWeapon:= GetAmmoEntry(Hedgehog);
with Hedgehog, CurWeapon^ do
- if Count = 0 then
+ if (Count = 0) or (AmmoType = amNothing) then
begin
PackAmmo(Ammo, Ammoz[AmmoType].Slot);
CurAmmoType:= amNothing
--- a/hedgewars/uGearsRender.pas Thu Sep 08 00:34:57 2011 +0200
+++ b/hedgewars/uGearsRender.pas Sat Oct 08 16:45:52 2011 +0200
@@ -1071,14 +1071,18 @@
//DrawTexture(x, y, SpritesData[sprVampiric].Texture, 0.1);
Tint($FF, $FF, $FF, $FF);
end
- else if not isInLag then
+ else //if not isInLag then
begin
+ if isInLag and (Gear^.FlightTime < 256) then inc(Gear^.FlightTime, 8)
+ else if not isInLag and (Gear^.FlightTime > 0) then dec(Gear^.FlightTime, 8);
+ if Gear^.FlightTime > 0 then Tint($FF, $FF, $FF, $FF-min(255,Gear^.FlightTime));
if vobVelocity = 0 then
DrawSprite(sprFlake, x, y, Gear^.Timer)
else
- DrawRotatedF(sprFlake, x, y, Gear^.Timer, 1, Gear^.DirAngle)
+ DrawRotatedF(sprFlake, x, y, Gear^.Timer, 1, Gear^.DirAngle);
//DrawSprite(sprFlake, x-SpritesData[sprFlake].Width div 2, y-SpritesData[sprFlake].Height div 2, Gear^.Timer)
//DrawRotatedF(sprFlake, x-SpritesData[sprFlake].Width div 2, y-SpritesData[sprFlake].Height div 2, Gear^.Timer, 1, Gear^.DirAngle);
+ if Gear^.FlightTime > 0 then Tint($FF, $FF, $FF, $FF);
end;
gtStructure: DrawSprite(sprTarget, x - 16, y - 16, 0);
gtTardis: if Gear^.Pos <> 4 then
--- a/hedgewars/uLand.pas Thu Sep 08 00:34:57 2011 +0200
+++ b/hedgewars/uLand.pas Sat Oct 08 16:45:52 2011 +0200
@@ -1133,9 +1133,14 @@
p: PLongwordArray;
x, y, cpX, cpY: Longword;
begin
- tmpsurf:= LoadImage(Pathz[ptMapCurrent] + '/mask', ifAlpha or ifTransparent or ifIgnoreCaps);
- if (tmpsurf = nil) and (mapName <> '') then
- tmpsurf:= LoadImage(Pathz[ptMissionMaps] + '/' + mapName +'/mask', ifAlpha or ifTransparent or ifIgnoreCaps);
+tmpsurf:= LoadImage(UserPathz[ptMapCurrent] + '/mask', ifAlpha or ifTransparent or ifIgnoreCaps);
+if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[ptMapCurrent] + '/mask', ifAlpha or ifTransparent or ifIgnoreCaps);
+if tmpsurf = nil then
+ begin
+ mapName:= ExtractFileName(Pathz[ptMapCurrent]);
+ tmpsurf:= LoadImage(UserPathz[ptMissionMaps] + '/' + mapName + '/mask', ifAlpha or ifTransparent or ifIgnoreCaps);
+ if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[ptMissionMaps] + '/' + mapName + '/mask', ifAlpha or ifTransparent or ifIgnoreCaps);
+ end;
if (tmpsurf <> nil) and (tmpsurf^.w <= LAND_WIDTH) and (tmpsurf^.h <= LAND_HEIGHT) and (tmpsurf^.format^.BytesPerPixel = 4) then
begin
@@ -1179,11 +1184,11 @@
tmpsurf:= LoadImage(UserPathz[ptMapCurrent] + '/map', ifAlpha or ifTransparent or ifIgnoreCaps);
if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[ptMapCurrent] + '/map', ifAlpha or ifTransparent or ifIgnoreCaps);
if tmpsurf = nil then
-begin
+ begin
mapName:= ExtractFileName(Pathz[ptMapCurrent]);
tmpsurf:= LoadImage(UserPathz[ptMissionMaps] + '/' + mapName + '/map', ifAlpha or ifTransparent or ifIgnoreCaps);
if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[ptMissionMaps] + '/' + mapName + '/map', ifAlpha or ifCritical or ifTransparent or ifIgnoreCaps);
-end;
+ end;
TryDo((tmpsurf^.w <= LAND_WIDTH) and (tmpsurf^.h <= LAND_HEIGHT), 'Map dimensions too big!', true);
// unC0Rr - should this be passed from the GUI? I am not sure which layer does what
--- a/misc/hats_js_anim.xhtml Thu Sep 08 00:34:57 2011 +0200
+++ b/misc/hats_js_anim.xhtml Sat Oct 08 16:45:52 2011 +0200
@@ -12,7 +12,6 @@
-moz-background-size: 200%;
background-size: 200%;
font-family: sans-serif;
- overflow: hidden;
}
h1 { text-shadow: 0 0 2px white; }
a
@@ -45,36 +44,10 @@
//<![CDATA[
/* javascript version of a sprite sheet - this could be pretty trivially done in pure HTML, but maintenance
would be easier with a server-side portion. list of sprites could be gotten from googlecode, but would require XSS whitelisting */
-var masks = [
-'4gsuif', 'Coonskin3', 'jigglypuff', 'NinjaStraight', 'Ryu', 'sth_Super',
-'AkuAku', 'Cororon', 'judo', 'NinjaTriangle', 'Samurai', 'sth_Tails',
-'android', 'Cowboy', 'junior', 'OldMan', 'Samus', 'stormcloud',
-'angel', 'crown', 'Ken', 'OrangeHair', 'Santa', 'stormtrooper',
-'anzac', 'cyborg', 'KirbyMask', 'orange', 'SauceBoatSilver', 'StrawHatEyes',
-'apple', 'darthvader', 'kiss_criss', 'Pantsu', 'ShaggyYeti', 'StrawHatFacial',
-'ash', 'Deer', 'kiss_frehley', 'Pig', 'sheep', 'StrawHat',
-'Balrog', 'diglett', 'kiss_simmons', 'pikachu', 'ShortHair_Black', 'Sunglasses',
-'banana', 'Disguise', 'kiss_stanley', 'PinkHair', 'ShortHair_Brown', 'SunWukong',
-'Bandit', 'Dragon', 'knight', 'pinksunhat', 'ShortHair_Grey', 'Teacup',
-'beaver', 'dwarf', 'Kululun', 'pirate_jack_bandana', 'ShortHair_Red', 'Teapot',
-'beefeater', 'eastertop', 'Ladle', 'pirate_jack', 'ShortHair_Yellow', 'Terminator_Glasses',
-'Blanka', 'Elvis', 'lambda', 'Plunger', 'Skull', 'test',
-'BlankaToothless', 'Eva_00b', 'Laminaria', 'policecap', 'Sleepwalker', 'thug',
-'BlueCap', 'Eva_00y', 'laurel', 'porkey', 'slowpoke', 'Toad',
-'BlueHair', 'Falcon', 'lemon', 'PrincessDaisy', 'Sniper', 'tophats',
-'Bob', 'Gasmask', 'link', 'PrincessPeach', 'Sonic', 'ushanka',
-'BrainSlugMouth', 'Geordi', 'lugia', 'Pumpkin_Hat', 'SparkleSuperFun', 'Vega',
-'BrainSlug', 'Glasses', 'Luigi', 'PurpleHair', 'spartan', 'venom',
-'Bub', 'GreenCap', 'Mario', 'quotecap', 'spidey', 'Viking',
-'Bunny', 'GreenHair', 'MegaHogX', 'Rain', 'squirtle', 'voltorb',
-'charmander', 'GreyHair', 'mickey_ears', 'Rambo', 'sth_AmyClassic', 'Wario',
-'chef', 'Guile', 'Moose', 'rasta', 'sth_Amy', 'WhySoSerious',
-'chikorita', 'HogInTheHat', 'mp3', 'RedCap', 'sth_Eggman', 'WizardHat',
-'Chunli', 'Honda', 'mudkip', 'RedHair', 'sth_Knux', 'YellowCap',
-'clown-copper', 'IndianChief', 'Mummy', 'RobinHood', 'sth_Metal', 'YellowHair',
-'clown-crossed', 'InfernalHorns', 'naruto', 'royalguard', 'sth_Shadow', 'Zombi',
-'clown', 'Jason', 'NinjaFull', 'RSR', 'sth_Sonic'];
+/*var masks = ['2001suit2', '2001suit', '4gsuif', 'AkuAku', 'android', 'angel', 'anzac', 'apple', 'ash', 'Balrog', 'banana', 'Bandit', 'bat', 'beaver', 'beefeater', 'Blanka', 'BlankaToothless', 'BlueCap', 'BlueHair', 'bobby2v', 'bobby', 'Bob', 'BrainSlugMouth', 'BrainSlug', 'britishpithhelmet', 'britmedic', 'britsapper', 'Bub', 'Bunny', 'bushhider', 'charlesdegaulle', 'charmander', 'chef', 'chikorita', 'Chunli', 'clown-copper', 'clown-crossed', 'clown', 'Coonskin3', 'Cororon', 'Cowboy', 'crown', 'cyborg', 'darthvader', 'Deer', 'desertgrenadier01', 'desertgrenadier02', 'desertgrenadier04', 'desertgrenadier05', 'desertgrenadierofficer', 'desertmedic', 'desertsapper1', 'desertsapper2', 'diglett', 'Disguise', 'Dragon', 'dwarf', 'eastertop', 'Elvis', 'Eva_00b', 'Eva_00y', 'Falcon', 'frenchwwigasmask', 'frenchwwihelmet', 'Gasmask', 'Geordi', 'germanwiimedichelmet', 'germanwwihelmetmustache', 'germanwwiipithhelmetdes', 'germanwwitankhelmet', 'Glasses', 'GreenCap', 'GreenHair', 'grenadier1', 'GreyHair', 'Guile', 'hedgehogk', 'HogInTheHat', 'hogpharoah', 'Honda', 'IndianChief', 'infernalhorns', 'InfernalHorns', 'Jason', 'jigglypuff', 'judo', 'junior', 'Ken', 'KirbyMask', 'kiss_criss', 'kiss_frehley', 'kiss_simmons', 'kiss_stanley', 'knight', 'Kululun', 'Ladle', 'lambda', 'Laminaria', 'laurel', 'lemon', 'link', 'lugia', 'Luigi', 'Mario', 'MegaHogX', 'metalband', 'mexicansunbrero', 'mickey_ears', 'Moose', 'mp3', 'mudkip', 'Mummy', 'naruto', 'NinjaFull', 'NinjaStraight', 'NinjaTriangle', 'OldMan', 'OrangeHair', 'orange', 'Pantsu', 'Pig', 'pikachu', 'PinkHair', 'pinksunhat', 'pirate_jack_bandana', 'pirate_jack', 'plainpith', 'Plunger', 'policecap', 'porkey', 'PrincessDaisy', 'PrincessPeach', 'Pumpkin_Hat', 'PurpleHair', 'quotecap', 'Rain', 'Rambo', 'rasta', 'RedCap', 'RedHair', 'RobinHood', 'royalguard', 'RSR', 'Ryu', 'Samurai', 'Samus', 'Santa', 'SauceBoatSilver', 'ShaggyYeti', 'sheep', 'ShortHair_Black', 'ShortHair_Brown', 'ShortHair_Grey', 'ShortHair_Red', 'ShortHair_Yellow', 'Skull', 'Sleepwalker', 'slowpoke', 'Sniper', 'Sonic', 'sovietcomrade2', 'sovietcomrade', 'SparkleSuperFun', 'SparkssHelmet', 'spartan', 'spcartman', 'spidey', 'spkenny', 'spkyle', 'spstan', 'squirtle', 'sth_AmyClassic', 'sth_Amy', 'sth_Eggman', 'sth_Knux', 'sth_Metal', 'sth_Shadow', 'sth_Sonic', 'sth_Super', 'sth_Tails', 'stormcloud', 'stormtrooper', 'StrawHatEyes', 'StrawHatFacial', 'StrawHat', 'Sunglasses', 'SunWukong', 'Teacup', 'Teapot', 'terminatorc', 'Terminator_Glasses', 'thug', 'Toad', 'tophats', 'touhou_chen', 'touhou_marisa', 'touhou_patchouli', 'touhou_remelia', 'touhou_suwako', 'touhou_yukari', 'trenchgrenadier1', 'trenchgrenadier2', 'trenchgrenadier3', 'ushanka', 'vampirichog', 'Vega', 'venom', 'Viking', 'voltorb', 'Wario', 'WhySoSerious', 'WizardHat', 'YellowCap', 'YellowHair', 'Zombi'];*/
+var masks = [];
var themes = {
+"Golf":1,
"Stage":1,
"Island":0,
"Eyes":0,
@@ -107,6 +80,21 @@
var animationInterval;
window.onload = function()
{
+ var xml=new XMLHttpRequest();
+ xml.open("GET", "/hg/share/hedgewars/Data/Graphics/Hats/", false);
+ xml.send(null);
+ /*var resp = xml.responseXML; unfortunately not served as XHTML
+ var a = resp.getElementsByTagName("a");
+ for(var i=0;i<a.length;i++);
+ if (/\.png/.test(a[0].href)) m.push(a[0].replace(/.png/,''));*/
+
+ var resp = xml.responseText;
+ var r = />([^<]*).png</g;
+ var x;
+ while(x = r.exec(resp))
+ if (!/^Team|NoHat/.test(x[1])) // Exclude team coloured ones as repetitive, NoHat one as uninteresting
+ masks.push(x[1]);
+
var opt = document.createElement("option");
opt.appendChild(document.createTextNode(""));
var sel = document.body.appendChild(document.createElement("select"));
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/CMakeLists.txt Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,12 @@
+set(QT_USE_QTCORE TRUE)
+
+find_package(Qt4 REQUIRED)
+include(${QT_USE_FILE})
+
+
+file(GLOB SRCS "*.c" "*.cpp")
+file(GLOB PUBLIC_HEADERS "*.h")
+qt4_wrap_cpp(MOC_SRCS "quazipfile.h")
+set(SRCS ${SRCS} ${MOC_SRCS})
+
+add_library(quazip STATIC ${SRCS})
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/JlCompress.cpp Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,468 @@
+#include "JlCompress.h"
+#include <QDebug>
+/**OK
+ * Comprime il file fileName, nell'oggetto zip, con il nome fileDest.
+ *
+ * La funzione fallisce se:
+ * * zip==NULL;
+ * * l'oggetto zip è stato aperto in una modalità non compatibile con l'aggiunta di file;
+ * * non è possibile aprire il file d'origine;
+ * * non è possibile creare il file all'interno dell'oggetto zip;
+ * * si è rilevato un errore nella copia dei dati;
+ * * non è stato possibile chiudere il file all'interno dell'oggetto zip;
+ */
+bool JlCompress::compressFile(QuaZip* zip, QString fileName, QString fileDest) {
+ // zip: oggetto dove aggiungere il file
+ // fileName: nome del file reale
+ // fileDest: nome del file all'interno del file compresso
+
+ // Controllo l'apertura dello zip
+ if (!zip) return false;
+ if (zip->getMode()!=QuaZip::mdCreate &&
+ zip->getMode()!=QuaZip::mdAppend &&
+ zip->getMode()!=QuaZip::mdAdd) return false;
+
+ // Apro il file originale
+ QFile inFile;
+ inFile.setFileName(fileName);
+ if(!inFile.open(QIODevice::ReadOnly)) return false;
+
+ // Apro il file risulato
+ QuaZipFile outFile(zip);
+ if(!outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(fileDest, inFile.fileName()))) return false;
+
+ // Copio i dati
+ char c;
+ while(inFile.getChar(&c)&&outFile.putChar(c));
+ if(outFile.getZipError()!=UNZ_OK) return false;
+
+ // Chiudo i file
+ outFile.close();
+ if (outFile.getZipError()!=UNZ_OK) return false;
+ inFile.close();
+
+ return true;
+}
+
+/**OK
+ * Comprime la cartella dir nel file fileCompressed, se recursive è true allora
+ * comprime anche le sotto cartelle. I nomi dei file preceduti dal path creato
+ * togliendo il pat della cartella origDir al path della cartella dir.
+ * Se la funzione fallisce restituisce false e cancella il file che si è tentato
+ * di creare.
+ *
+ * La funzione fallisce se:
+ * * zip==NULL;
+ * * l'oggetto zip è stato aperto in una modalità non compatibile con l'aggiunta di file;
+ * * la cartella dir non esiste;
+ * * la compressione di una sotto cartella fallisce (1);
+ * * la compressione di un file fallisce;
+ * (1) La funzione si richiama in maniera ricorsiva per comprimere le sotto cartelle
+ * dunque gli errori di compressione di una sotto cartella sono gli stessi di questa
+ * funzione.
+ */
+bool JlCompress::compressSubDir(QuaZip* zip, QString dir, QString origDir, bool recursive) {
+ // zip: oggetto dove aggiungere il file
+ // dir: cartella reale corrente
+ // origDir: cartella reale originale
+ // (path(dir)-path(origDir)) = path interno all'oggetto zip
+
+ // Controllo l'apertura dello zip
+ if (!zip) return false;
+ if (zip->getMode()!=QuaZip::mdCreate &&
+ zip->getMode()!=QuaZip::mdAppend &&
+ zip->getMode()!=QuaZip::mdAdd) return false;
+
+ // Controllo la cartella
+ QDir directory(dir);
+ if (!directory.exists()) return false;
+
+ // Se comprimo anche le sotto cartelle
+ if (recursive) {
+ // Per ogni sotto cartella
+ QFileInfoList files = directory.entryInfoList(QDir::AllDirs|QDir::NoDotAndDotDot);
+ foreach (QFileInfo file, files) {
+ // Comprimo la sotto cartella
+ if(!compressSubDir(zip,file.absoluteFilePath(),origDir,recursive)) return false;
+ }
+ }
+
+ // Per ogni file nella cartella
+ QFileInfoList files = directory.entryInfoList(QDir::Files);
+ QDir origDirectory(origDir);
+ foreach (QFileInfo file, files) {
+ // Se non è un file o è il file compresso che sto creando
+ if(!file.isFile()||file.absoluteFilePath()==zip->getZipName()) continue;
+
+ // Creo il nome relativo da usare all'interno del file compresso
+ QString filename = origDirectory.relativeFilePath(file.absoluteFilePath());
+
+ // Comprimo il file
+ if (!compressFile(zip,file.absoluteFilePath(),filename)) return false;
+ }
+
+ return true;
+}
+
+/**OK
+ * Estrae il file fileName, contenuto nell'oggetto zip, con il nome fileDest.
+ * Se la funzione fallisce restituisce false e cancella il file che si è tentato di estrarre.
+ *
+ * La funzione fallisce se:
+ * * zip==NULL;
+ * * l'oggetto zip è stato aperto in una modalità non compatibile con l'estrazione di file;
+ * * non è possibile aprire il file all'interno dell'oggetto zip;
+ * * non è possibile creare il file estratto;
+ * * si è rilevato un errore nella copia dei dati (1);
+ * * non è stato possibile chiudere il file all'interno dell'oggetto zip (1);
+ *
+ * (1): prima di uscire dalla funzione cancella il file estratto.
+ */
+bool JlCompress::extractFile(QuaZip* zip, QString fileName, QString fileDest) {
+ // zip: oggetto dove aggiungere il file
+ // filename: nome del file reale
+ // fileincompress: nome del file all'interno del file compresso
+
+ // Controllo l'apertura dello zip
+ if (!zip) return false;
+ if (zip->getMode()!=QuaZip::mdUnzip) return false;
+
+ // Apro il file compresso
+ zip->setCurrentFile(fileName);
+ QuaZipFile inFile(zip);
+ if(!inFile.open(QIODevice::ReadOnly) || inFile.getZipError()!=UNZ_OK) return false;
+
+ // Controllo esistenza cartella file risultato
+ QDir().mkpath(QFileInfo(fileDest).absolutePath());
+
+ // Apro il file risultato
+ QFile outFile;
+ outFile.setFileName(fileDest);
+ if(!outFile.open(QIODevice::WriteOnly)) return false;
+
+ // Copio i dati
+ char c;
+ while(inFile.getChar(&c)) outFile.putChar(c);
+ if (inFile.getZipError()!=UNZ_OK) {
+ removeFile(QStringList(fileDest));
+ return false;
+ }
+
+ // Chiudo i file
+ inFile.close();
+ if (inFile.getZipError()!=UNZ_OK) {
+ removeFile(QStringList(fileDest));
+ return false;
+ }
+ outFile.close();
+
+ return true;
+}
+
+/**
+ * Rimuove i file il cui nome è specificato all'interno di listFile.
+ * Restituisce true se tutti i file sono stati cancellati correttamente, attenzione
+ * perchè può restituire false anche se alcuni file non esistevano e si è tentato
+ * di cancellarli.
+ */
+bool JlCompress::removeFile(QStringList listFile) {
+ bool ret = true;
+ // Per ogni file
+ for (int i=0; i<listFile.count(); i++) {
+ // Lo elimino
+ ret = ret && QFile::remove(listFile.at(i));
+ }
+ return ret;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+/**OK
+ * Comprime il file fileName nel file fileCompressed.
+ * Se la funzione fallisce restituisce false e cancella il file che si è tentato
+ * di creare.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * la compressione del file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+bool JlCompress::compressFile(QString fileCompressed, QString file) {
+ // Creo lo zip
+ QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+ QDir().mkpath(QFileInfo(fileCompressed).absolutePath());
+ if(!zip->open(QuaZip::mdCreate)) {
+ delete zip;
+ QFile::remove(fileCompressed);
+ return false;
+ }
+
+ // Aggiungo il file
+ if (!compressFile(zip,file,QFileInfo(file).fileName())) {
+ delete zip;
+ QFile::remove(fileCompressed);
+ return false;
+ }
+
+ // Chiudo il file zip
+ zip->close();
+ if(zip->getZipError()!=0) {
+ delete zip;
+ QFile::remove(fileCompressed);
+ return false;
+ }
+ delete zip;
+
+ return true;
+}
+
+/**OK
+ * Comprime i file specificati in files nel file fileCompressed.
+ * Se la funzione fallisce restituisce false e cancella il file che si è tentato
+ * di creare.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * la compressione di un file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+bool JlCompress::compressFiles(QString fileCompressed, QStringList files) {
+ // Creo lo zip
+ QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+ QDir().mkpath(QFileInfo(fileCompressed).absolutePath());
+ if(!zip->open(QuaZip::mdCreate)) {
+ delete zip;
+ QFile::remove(fileCompressed);
+ return false;
+ }
+
+ // Comprimo i file
+ QFileInfo info;
+ foreach (QString file, files) {
+ info.setFile(file);
+ if (!info.exists() || !compressFile(zip,file,info.fileName())) {
+ delete zip;
+ QFile::remove(fileCompressed);
+ return false;
+ }
+ }
+
+ // Chiudo il file zip
+ zip->close();
+ if(zip->getZipError()!=0) {
+ delete zip;
+ QFile::remove(fileCompressed);
+ return false;
+ }
+ delete zip;
+
+ return true;
+}
+
+/**OK
+ * Comprime la cartella dir nel file fileCompressed, se recursive è true allora
+ * comprime anche le sotto cartelle.
+ * Se la funzione fallisce restituisce false e cancella il file che si è tentato
+ * di creare.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * la compressione di un file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+bool JlCompress::compressDir(QString fileCompressed, QString dir, bool recursive) {
+ // Creo lo zip
+ QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+ QDir().mkpath(QFileInfo(fileCompressed).absolutePath());
+ if(!zip->open(QuaZip::mdCreate)) {
+ delete zip;
+ QFile::remove(fileCompressed);
+ return false;
+ }
+
+ // Aggiungo i file e le sotto cartelle
+ if (!compressSubDir(zip,dir,dir,recursive)<0) {
+ delete zip;
+ QFile::remove(fileCompressed);
+ return false;
+ }
+
+ // Chiudo il file zip
+ zip->close();
+ if(zip->getZipError()!=0) {
+ delete zip;
+ QFile::remove(fileCompressed);
+ return false;
+ }
+ delete zip;
+
+ return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+/**OK
+ * Estrae il file fileName, contenuto nel file fileCompressed, con il nome fileDest.
+ * Se fileDest = "" allora il file viene estratto con lo stesso nome con cui è
+ * stato compresso.
+ * Se la funzione fallisce cancella il file che si è tentato di estrarre.
+ * Restituisce il nome assoluto del file estratto.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * l'estrazione del file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+QString JlCompress::extractFile(QString fileCompressed, QString fileName, QString fileDest) {
+ // Apro lo zip
+ QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+ if(!zip->open(QuaZip::mdUnzip)) {
+ delete zip;
+ return QString();
+ }
+
+ // Estraggo il file
+ if (fileDest.isEmpty()) fileDest = fileName;
+ if (!extractFile(zip,fileName,fileDest)) {
+ delete zip;
+ return QString();
+ }
+
+ // Chiudo il file zip
+ zip->close();
+ if(zip->getZipError()!=0) {
+ removeFile(QStringList(fileDest));
+ return QString();
+ }
+ delete zip;
+
+ return QFileInfo(fileDest).absoluteFilePath();
+}
+
+/**OK
+ * Estrae i file specificati in files, contenuti nel file fileCompressed, nella
+ * cartella dir. La struttura a cartelle del file compresso viene rispettata.
+ * Se dir = "" allora il file viene estratto nella cartella corrente.
+ * Se la funzione fallisce cancella i file che si è tentato di estrarre.
+ * Restituisce i nomi assoluti dei file estratti.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * l'estrazione di un file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+QStringList JlCompress::extractFiles(QString fileCompressed, QStringList files, QString dir) {
+ // Creo lo zip
+ QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+ if(!zip->open(QuaZip::mdUnzip)) {
+ delete zip;
+ return QStringList();
+ }
+
+ // Estraggo i file
+ for (int i=0; i<files.count(); i++) {
+ if (!extractFile(zip, files.at(i), QDir(dir).absoluteFilePath(files.at(i)))) {
+ delete zip;
+ removeFile(files);
+ return QStringList();
+ }
+ files[i] = QDir(dir).absoluteFilePath(files.at(i));
+ }
+
+ // Chiudo il file zip
+ zip->close();
+ if(zip->getZipError()!=0) {
+ delete zip;
+ removeFile(files);
+ return QStringList();
+ }
+ delete zip;
+
+ return files;
+}
+
+/**OK
+ * Estrae il file fileCompressed nella cartella dir.
+ * Se dir = "" allora il file viene estratto nella cartella corrente.
+ * Se la funzione fallisce cancella i file che si è tentato di estrarre.
+ * Restituisce i nomi assoluti dei file estratti.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * la compressione di un file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+QStringList JlCompress::extractDir(QString fileCompressed, QString dir) {
+ // Apro lo zip
+ QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+ if(!zip->open(QuaZip::mdUnzip)) {
+ delete zip;
+ return QStringList();
+ }
+
+ // Estraggo i file
+ QStringList lst = getFileList(fileCompressed);
+
+ QDir directory(dir);
+ for (int i=0; i<lst.count(); i++) {
+ QString absFilePath = directory.absoluteFilePath(lst.at(i));
+ if (!extractFile(zip, lst.at(i), absFilePath)) {
+ delete zip;
+ removeFile(lst);
+ return QStringList();
+ }
+ lst[i] = absFilePath;
+ }
+
+ // Chiudo il file zip
+ zip->close();
+ if(zip->getZipError()!=0) {
+ delete zip;
+ removeFile(lst);
+ return QStringList();
+ }
+ delete zip;
+
+ return lst;
+}
+
+/**OK
+ * Restituisce la lista dei file resenti nel file compresso fileCompressed.
+ * Se la funzione fallisce, restituisce un elenco vuoto.
+ *
+ * La funzione fallisce se:
+ * * non si riesce ad aprire l'oggetto zip;
+ * * la richiesta di informazioni di un file fallisce;
+ * * non si riesce a chiudere l'oggetto zip;
+ */
+QStringList JlCompress::getFileList(QString fileCompressed) {
+ // Apro lo zip
+ QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
+ if(!zip->open(QuaZip::mdUnzip)) {
+ delete zip;
+ return QStringList();
+ }
+
+ // Estraggo i nomi dei file
+ QStringList lst;
+ QuaZipFileInfo info;
+ for(bool more=zip->goToFirstFile(); more; more=zip->goToNextFile()) {
+ if(!zip->getCurrentFileInfo(&info)) {
+ delete zip;
+ return QStringList();
+ }
+ lst << info.name;
+ //info.name.toLocal8Bit().constData()
+ }
+
+ // Chiudo il file zip
+ zip->close();
+ if(zip->getZipError()!=0) {
+ delete zip;
+ return QStringList();
+ }
+ delete zip;
+
+ return lst;
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/JlCompress.h Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,32 @@
+#ifndef JLCOMPRESSFOLDER_H_
+#define JLCOMPRESSFOLDER_H_
+
+#include "quazip.h"
+#include "quazipfile.h"
+#include "quazipfileinfo.h"
+#include <QString>
+#include <QDir>
+#include <QFileInfo>
+#include <QFile>
+
+class QUAZIP_EXPORT JlCompress {
+private:
+ static bool compressFile(QuaZip* zip, QString fileName, QString fileDest);
+ static bool compressSubDir(QuaZip* parentZip, QString dir, QString parentDir, bool recursive = true);
+ static bool extractFile(QuaZip* zip, QString fileName, QString fileDest);
+
+ static bool removeFile(QStringList listFile);
+
+public:
+ static bool compressFile(QString fileCompressed, QString file);
+ static bool compressFiles(QString fileCompressed, QStringList files);
+ static bool compressDir(QString fileCompressed, QString dir = QString(), bool recursive = true);
+
+public:
+ static QString extractFile(QString fileCompressed, QString file, QString fileDest = QString());
+ static QStringList extractFiles(QString fileCompressed, QStringList files, QString dir = QString());
+ static QStringList extractDir(QString fileCompressed, QString dir = QString());
+ static QStringList getFileList(QString fileCompressed);
+};
+
+#endif /* JLCOMPRESSFOLDER_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/crypt.h Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,135 @@
+/* crypt.h -- base code for crypt/uncrypt ZIPfile
+
+
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+
+ This code is a modified version of crypting code in Infozip distribution
+
+ The encryption/decryption parts of this source code (as opposed to the
+ non-echoing password parts) were originally written in Europe. The
+ whole source package can be freely distributed, including from the USA.
+ (Prior to January 2000, re-export from the US was a violation of US law.)
+
+ This encryption code is a direct transcription of the algorithm from
+ Roger Schlafly, described by Phil Katz in the file appnote.txt. This
+ file (appnote.txt) is distributed with the PKZIP program (even in the
+ version without encryption capabilities).
+
+ If you don't need crypting in your application, just define symbols
+ NOCRYPT and NOUNCRYPT.
+
+ This code support the "Traditional PKWARE Encryption".
+
+ The new AES encryption added on Zip format by Winzip (see the page
+ http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong
+ Encryption is not supported.
+*/
+
+#include "quazip_global.h"
+
+#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
+
+/***********************************************************************
+ * Return the next byte in the pseudo-random sequence
+ */
+static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab UNUSED)
+{
+ //(void) pcrc_32_tab; /* avoid "unused parameter" warning */
+ unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
+ * unpredictable manner on 16-bit systems; not a problem
+ * with any known compiler so far, though */
+
+ temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
+ return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
+}
+
+/***********************************************************************
+ * Update the encryption keys with the next byte of plain text
+ */
+static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
+{
+ (*(pkeys+0)) = CRC32((*(pkeys+0)), c);
+ (*(pkeys+1)) += (*(pkeys+0)) & 0xff;
+ (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
+ {
+ register int keyshift = (int)((*(pkeys+1)) >> 24);
+ (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
+ }
+ return c;
+}
+
+
+/***********************************************************************
+ * Initialize the encryption keys and the random header according to
+ * the given password.
+ */
+static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
+{
+ *(pkeys+0) = 305419896L;
+ *(pkeys+1) = 591751049L;
+ *(pkeys+2) = 878082192L;
+ while (*passwd != '\0') {
+ update_keys(pkeys,pcrc_32_tab,(int)*passwd);
+ passwd++;
+ }
+}
+
+#define zdecode(pkeys,pcrc_32_tab,c) \
+ (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
+
+#define zencode(pkeys,pcrc_32_tab,c,t) \
+ (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
+
+#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
+
+#define RAND_HEAD_LEN 12
+ /* "last resort" source for second part of crypt seed pattern */
+# ifndef ZCR_SEED2
+# define ZCR_SEED2 3141592654UL /* use PI as default pattern */
+# endif
+
+static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting)
+ const char *passwd; /* password string */
+ unsigned char *buf; /* where to write header */
+ int bufSize;
+ unsigned long* pkeys;
+ const unsigned long* pcrc_32_tab;
+ unsigned long crcForCrypting;
+{
+ int n; /* index in random header */
+ int t; /* temporary */
+ int c; /* random byte */
+ unsigned char header[RAND_HEAD_LEN-2]; /* random header */
+ static unsigned calls = 0; /* ensure different random header each time */
+
+ if (bufSize<RAND_HEAD_LEN)
+ return 0;
+
+ /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
+ * output of rand() to get less predictability, since rand() is
+ * often poorly implemented.
+ */
+ if (++calls == 1)
+ {
+ srand((unsigned)(time(NULL) ^ ZCR_SEED2));
+ }
+ init_keys(passwd, pkeys, pcrc_32_tab);
+ for (n = 0; n < RAND_HEAD_LEN-2; n++)
+ {
+ c = (rand() >> 7) & 0xff;
+ header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
+ }
+ /* Encrypt random header (last two bytes is high word of crc) */
+ init_keys(passwd, pkeys, pcrc_32_tab);
+ for (n = 0; n < RAND_HEAD_LEN-2; n++)
+ {
+ buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
+ }
+ buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
+ buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
+ return n;
+}
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/doc/faq.dox Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,30 @@
+/**
+ * \page faq QuaZip FAQ
+ *
+ * <!--
+ * \ref faq-GPL "Q. Is it possible to release an LGPL version of the QuaZip?"
+ *
+ * \ref faq-non-QIODevice "Q. Is there any way to use QuaZipFile in Qt where you are supposed to use normal (non-zipped) file, but not through QIODevice API?"
+ * -->
+ *
+ * \anchor faq-GPL Q. Is it possible to release an LGPL version of the
+ * QuaZip?
+ *
+ * A. I do not know much about licensing, so I can answer for sure, but
+ * QuaZip was developed using Open Source edition of Qt, so I see no
+ * way it could be released under anything except GPL.
+ *
+ * \anchor faq-non-QIODevice Q. Is there any way to use QuaZipFile in Qt
+ * where you are supposed to use normal (non-zipped) file, but not
+ * through QIODevice API?
+ *
+ * A. Usually not. For example, if you are passing file name to some
+ * database driver (like SQLite), Qt usually just passes this name down
+ * to the 3rd-party library, which is usually does not know anything
+ * about QIODevice and therefore there is no way to pass QuaZipFile as
+ * normal file. However, if we are talking about some place where you
+ * pass file name, and then indirectly use QFile to open it, then it is
+ * a good idea to make overloaded method, which accepts QIODevice
+ * pointer. Then you would be able to pass QuaZipFile as well as many
+ * other nice things such as QBuffer or QProcess.
+ **/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/doc/index.dox Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,192 @@
+/**
+ * \mainpage QuaZIP - Qt/C++ wrapper for ZIP/UNZIP package
+ *
+\htmlonly
+<a href="http://sourceforge.net"><img src="http://sourceforge.net/sflogo.php?group_id=142688&type=7" style="width:210; height:62; border:none; float:right;" alt="Powered by SourceForge.net" /></a>
+\endhtmlonly
+ * \section overview Overview
+ *
+ * QuaZIP is a simple C++ wrapper over <a
+ * href="http://www.winimage.com/zLibDll/unzip.html">Gilles Vollant's ZIP/UNZIP
+ * package</a> that can be used to access ZIP archives. It uses <a
+ * href="http://www.trolltech.com/products/qt/index.html">Trolltech's
+ * Qt toolkit</a>.
+ *
+ * If you do not know what Qt is, you have two options:
+ * - Just forget about QuaZIP.
+ * - Learn more about Qt by downloading it and/or reading excellent <a
+ * href="http://doc.trolltech.com/">official Qt documentation</a>
+ *
+ * The choice is yours, but if you are really interested in
+ * cross-platform (Windows/Linux/BSD/UNIX/Mac/Others) software
+ * development, I would definitely recommend you the second choice ^_^
+ *
+ * QuaZIP allows you to access files inside ZIP archives using QIODevice
+ * API, and - yes! - that means that you can also use QTextStream,
+ * QDataStream or whatever you would like to use on your zipped files.
+ *
+ * QuaZIP provides complete abstraction of the ZIP/UNZIP API, for both
+ * reading from and writing to ZIP archives.
+ *
+ * \section platforms Platforms supported
+ *
+ * QuaZIP has been currently tested with Qt 4.0.0 on the following
+ * platforms:
+ * - linux-g++
+ * - freebsd-g++
+ * - hpux-acc
+ * - win32-g++ (MinGW)
+ *
+ * No testing has been done on other systems. Of course, patches to
+ * make it work on any platform that it currently does not work on are
+ * always welcome!
+ *
+ * \section whats-new What is new in this version of QuaZIP?
+ *
+ * See NEWS file supplied with the distribution.
+ *
+ * \section getting Getting latest version of QuaZIP
+ *
+ * Check <a href="http://sourceforge.net/projects/quazip/">QuaZIP
+ * project's page at SourceForge.net</a>. Also, you may wish to read
+ * latest version documentation available at the <a
+ * href="http://quazip.sourceforge.net/">QuaZIP web site</a>.
+ *
+ * \section Requirements
+ *
+ * Just <a href="http://www.zlib.org/">zlib</a> and Qt 4. Well, Qt 4
+ * depends on zlib anyway.
+ *
+ * \section building Building, testing and installing
+ *
+ * \note Instructions given in this section assume that you are
+ * using some UNIX dialect, but the build process should be very similar
+ * on win32-g++ platform too. Sorry, but other platforms are
+ * undocumented. I do not think it is a big deal, though - it is
+ * standard usage of the Qt's qmake, so you most probably already know
+ * everything that is required.
+ *
+ * To build it on some UNIX dialect:
+\verbatim
+$ cd /wherever/quazip/source/is/quazip-x.y.z/quazip
+$ qmake [PREFIX=where-to-install]
+$ make
+\endverbatim
+ *
+ * Make sure that you have Qt 4 installed with all required headers and
+ * utilities (not just library) and that you run qmake utility of the Qt
+ * 4, not some other version you may have already installed (you may
+ * need to type full path to qmake like /usr/local/qt4/bin/qmake).
+ *
+ * To reconfigure (with another PREFIX, for example), just run qmake
+ * with appropriate arguments again.
+ *
+ * If you need to specify additional include path or libraries, use
+ * qmake features (see qmake reference in the Qt documentation). For
+ * example:
+ *
+\verbatim
+$ qmake LIBS+=-L/usr/local/zlib/lib INCLUDEPATH+=/usr/local/zlib/include
+\endverbatim
+ * (note abscence of "-I" before include path)
+ *
+ * To check if QuaZIP's basic features work ok on your platform, you may
+ * wish to compile simple test programs provided in test directory.
+ * Look in the sources of the tests to find out about their
+ * requirements. Typically, the test looks something like this:
+\verbatim
+$ cd /wherever/quazip/source/is/quazip-x.y.z/test/zip
+$ qmake
+$ make
+$ ./zip
+$ cd ../unzip
+$ cp ../zip/test.zip ./test.zip
+$ mkdir out
+$ qmake
+$ make
+$ ./unzip
+\endverbatim
+ *
+ * You should see the zip contents with details as the output of the
+ * "./unzip". Ignore message saying you should check the file name for
+ * testCase() if you do not want to test
+ * \link QuaZip::CaseSensitivity locale-aware case-insensitivity\endlink.
+ * Otherwise, see the sources. In any case, this message appearing means
+ * that everything else was fine. Otherwise, you will get some other error
+ * message instead. Investigate it or send bug report including message,
+ * platform and QuaZIP version used.
+ *
+ * To install compiled library:
+\verbatim
+$ make install
+\endverbatim
+ *
+ * By default, QuaZIP compiles as static library, but you have other
+ * options:
+ * - Just copy appropriate source files to your project and use them;
+ * - Compile QuaZIP as shared library by changing "staticlib" in
+ * quazip/quazip.pro to "dll".
+ *
+ * Latter is not recommended because future versions of QuaZIP most
+ * probably will be binary incompatible.
+ *
+ * \section using Using
+ *
+ * See \ref usage "usage page".
+ *
+ * \section bugs Bugs
+ *
+ * QuaZIP is currently at the initial development stage. Therefore,
+ * there are may be plenty of bugs and other bad things. Bug reports and
+ * patches are always welcome (see "contacts" below).
+ *
+ * \section contacts Authors and contacts
+ *
+ * This wrapper has been written by Sergey A. Tachenov, AKA Alqualos.
+ * This is my first open source project, so it may suck, but I did not
+ * find anything like that, so I just had no other choice but to write
+ * it.
+ *
+ * If you have anything to say to me about QuaZIP library, feel free to
+ * do so (read the \ref faq first, though). I can not promise,
+ * though, that I fix all the bugs you report in, add any features you
+ * want, or respond to your critics, or respond to your feedback at all.
+ * I may be busy, I may be tired of working on QuaZIP, I may be even
+ * dead already (you never know...). But regardless of this remark, any
+ * feedback is always welcome. This may seem like a paradox to you, but
+ * you do not have to understand it to write feedback.
+ *
+ * To report bugs or to post ideas about what should be done, use
+ * SourceForge.net's <a
+ * href="http://sourceforge.net/tracker/?group_id=142688">trackers</a>.
+ * If you want to send me a private message, use my e-mail address
+ * laerel at yandex dot ru (but do not you dare to put it somewhere on
+ * the Web or wherever).
+ *
+ * Do not use e-mail to report bugs, please. Reporting bugs and problems
+ * with the SourceForge.net's bug report system has that advantage that
+ * it is visible to public.
+ *
+ * \section other-projects My other projects
+ *
+ * As of this moment, I did not write any other useful open source
+ * software (well, I am too lazy to do it) except for one little thing:
+ *
+ * <a href="http://brededor.narod.ru/progs/arcanum50patch.htm">Arcanum
+ * universal cap remover</a>. Arcanum is the old but very good game,
+ * which has one stupid limit: your character maximum level is 50, which
+ * is too low for many players including me. So I wrote this simple
+ * patch to increase this stupid limit to something acceptable.
+ *
+ * Also, my first Web project, which can be of any interest to you only
+ * if you can read Russian and you are crazy ^_- This is a web site with
+ * the main topic of it being The Delirium. It is totally meaningless
+ * and it was purposely made to be such. Do not ask me why - I do not
+ * know either. I just did that. If you are interested, then welcome to
+ * <a href="http://brededor.narod.ru/">The Brededor</a>. It does not get
+ * updated lately because I have become even lazier than I ever was. But
+ * I do not plan to destroy The Brededor no matter what, because I think
+ * it is fun.
+ *
+ * Copyright (C) 2005-2007 Sergey A. Tachenov
+ **/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/doc/usage.dox Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,69 @@
+/** \page usage Usage
+ *
+ * This page provides general information on QuaZIP usage. See classes
+ * QuaZip and QuaZipFile for the detailed documentation on what can
+ * QuaZIP do and what can not. Also, reading comments in the zip.h and
+ * unzip.h files (taken from the original ZIP/UNZIP package) is always a
+ * good idea too. After all, QuaZIP is just a wrapper with a few
+ * convenience extensions and reimplementations.
+ *
+ * QuaZip is a class representing ZIP archive, QuaZipFile represents a
+ * file inside archive and subclasses QIODevice as well.
+ *
+ * \section terminology Terminology
+ *
+ * "QuaZIP" means whole this library, while "QuaZip" (not case
+ * difference) is just one class in it.
+ *
+ * "ZIP/UNZIP API" means the original API of the Gilles Vollant's
+ * ZIP/UNZIP package. I did not alter it in any way to make it easier to
+ * port to the future ZIP/UNZIP versions.
+ *
+ * "ZIP", "ZIP archive" or "ZIP file" means any ZIP archive. Typically
+ * this is a plain file with ".zip" (or ".ZIP") file name suffix.
+ *
+ * "A file inside archive", "a file inside ZIP" or something like that
+ * means file either being read or written from/to some ZIP archive.
+ *
+ * \section error-handling Error handling
+ *
+ * Almost any call to ZIP/UNZIP API return some error code. Most of the
+ * original API's error checking could be done in this wrapper as well,
+ * but it would cause unnecessary code bloating without any benefit. So,
+ * QuaZIP only checks for situations that ZIP/UNZIP API can not check
+ * for. For example, ZIP/UNZIP API has no "ZIP open mode" concept
+ * because read and write modes are completely separated. On the other
+ * hand, to avoid creating classes like "QuaZipReader", "QuaZipWriter"
+ * or something like that, QuaZIP introduces "ZIP open mode" concept
+ * instead, thus making it possible to use one class (QuaZip) for both
+ * reading and writing. But this leads to additional open mode checks
+ * which are not done in ZIP/UNZIP package.
+ *
+ * Therefore, error checking is two-level (QuaZIP's level and ZIP/UNZIP
+ * API level), which sometimes can be confusing, so here are some
+ * advices on how the error checking should be properly done:
+ *
+ * - Both QuaZip and QuaZipFile have getZipError() function, which return
+ * error code of the last ZIP/UNZIP API call. Most function calls
+ * reset error code to UNZ_OK on success and set error code on
+ * failure. Some functions do not reset error code. Most of them are
+ * \c const and do not access ZIP archive in any way. Some, on the
+ * other hand, \em do access ZIP archive, but do not reset or set
+ * error code. For example, QuaZipFile::pos() function. Such functions
+ * are explicitly marked in the documentation.
+ * - Most functions have its own way to report errors, by returning a
+ * null string, negative value or \c false. If such a function returns
+ * error value, call getZipError() to get more information about
+ * error. See "zip.h" and "unzip.h" of the ZIP/UNZIP package for error
+ * codes.
+ * - If the function returns error-stating value (like \c false), but
+ * getZipError() returns UNZ_OK, it means that you did something
+ * obviously wrong. For example, tried to write in the archive open
+ * for reading or not open at all. You better just do not do that!
+ * Most functions also issue a warning using qWarning() function in
+ * such cases. See documentation for a specific function for details
+ * on when it should not be called.
+ *
+ * I know that this is somewhat messy, but I could not find a better way
+ * to do all the error handling.
+ **/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/ioapi.h Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,77 @@
+/* ioapi.h -- IO base function header for compress/uncompress .zip
+ files using zlib + zip or unzip API
+
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+
+ Modified by Sergey A. Tachenov to integrate with Qt.
+*/
+
+#ifndef _ZLIBIOAPI_H
+#define _ZLIBIOAPI_H
+
+
+#define ZLIB_FILEFUNC_SEEK_CUR (1)
+#define ZLIB_FILEFUNC_SEEK_END (2)
+#define ZLIB_FILEFUNC_SEEK_SET (0)
+
+#define ZLIB_FILEFUNC_MODE_READ (1)
+#define ZLIB_FILEFUNC_MODE_WRITE (2)
+#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
+
+#define ZLIB_FILEFUNC_MODE_EXISTING (4)
+#define ZLIB_FILEFUNC_MODE_CREATE (8)
+
+
+#ifndef ZCALLBACK
+
+#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
+#define ZCALLBACK CALLBACK
+#else
+#define ZCALLBACK
+#endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, voidpf file, int mode));
+typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size));
+typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
+typedef uLong (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream));
+typedef int (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin));
+typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream));
+typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
+
+typedef struct zlib_filefunc_def_s
+{
+ open_file_func zopen_file;
+ read_file_func zread_file;
+ write_file_func zwrite_file;
+ tell_file_func ztell_file;
+ seek_file_func zseek_file;
+ close_file_func zclose_file;
+ testerror_file_func zerror_file;
+ voidpf opaque;
+} zlib_filefunc_def;
+
+
+
+void fill_qiodevice_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
+
+#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size))
+#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size))
+#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream))
+#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode))
+#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream))
+#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream))
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/qioapi.cpp Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,142 @@
+/* ioapi.c -- IO base function header for compress/uncompress .zip
+ files using zlib + zip or unzip API
+
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+
+ Modified by Sergey A. Tachenov to integrate with Qt.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "zlib.h"
+#include "ioapi.h"
+#include "quazip_global.h"
+#include <QIODevice>
+
+
+/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
+
+#ifndef SEEK_CUR
+#define SEEK_CUR 1
+#endif
+
+#ifndef SEEK_END
+#define SEEK_END 2
+#endif
+
+#ifndef SEEK_SET
+#define SEEK_SET 0
+#endif
+
+voidpf ZCALLBACK qiodevice_open_file_func (
+ voidpf opaque UNUSED,
+ voidpf file,
+ int mode)
+{
+ QIODevice *iodevice = reinterpret_cast<QIODevice*>(file);
+ if(iodevice->isSequential())
+ return NULL;
+ if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
+ iodevice->open(QIODevice::ReadOnly);
+ else
+ if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
+ iodevice->open(QIODevice::ReadWrite);
+ else
+ if (mode & ZLIB_FILEFUNC_MODE_CREATE)
+ iodevice->open(QIODevice::WriteOnly);
+
+ if(iodevice->isOpen())
+ return iodevice;
+ else
+ return NULL;
+}
+
+
+uLong ZCALLBACK qiodevice_read_file_func (
+ voidpf opaque UNUSED,
+ voidpf stream,
+ void* buf,
+ uLong size)
+{
+ uLong ret;
+ ret = (uLong)((QIODevice*)stream)->read((char*)buf,size);
+ return ret;
+}
+
+
+uLong ZCALLBACK qiodevice_write_file_func (
+ voidpf opaque UNUSED,
+ voidpf stream,
+ const void* buf,
+ uLong size)
+{
+ uLong ret;
+ ret = (uLong)((QIODevice*)stream)->write((char*)buf,size);
+ return ret;
+}
+
+uLong ZCALLBACK qiodevice_tell_file_func (
+ voidpf opaque UNUSED,
+ voidpf stream)
+{
+ uLong ret;
+ ret = ((QIODevice*)stream)->pos();
+ return ret;
+}
+
+int ZCALLBACK qiodevice_seek_file_func (
+ voidpf opaque UNUSED,
+ voidpf stream,
+ uLong offset,
+ int origin)
+{
+ uLong qiodevice_seek_result=0;
+ int ret;
+ switch (origin)
+ {
+ case ZLIB_FILEFUNC_SEEK_CUR :
+ qiodevice_seek_result = ((QIODevice*)stream)->pos() + offset;
+ break;
+ case ZLIB_FILEFUNC_SEEK_END :
+ qiodevice_seek_result = ((QIODevice*)stream)->size() - offset;
+ break;
+ case ZLIB_FILEFUNC_SEEK_SET :
+ qiodevice_seek_result = offset;
+ break;
+ default: return -1;
+ }
+ ret = !((QIODevice*)stream)->seek(qiodevice_seek_result);
+ return ret;
+}
+
+int ZCALLBACK qiodevice_close_file_func (
+ voidpf opaque UNUSED,
+ voidpf stream)
+{
+ ((QIODevice*)stream)->close();
+ return 0;
+}
+
+int ZCALLBACK qiodevice_error_file_func (
+ voidpf opaque UNUSED,
+ voidpf stream)
+{
+ return !((QIODevice*)stream)->errorString().isEmpty();
+}
+
+void fill_qiodevice_filefunc (
+ zlib_filefunc_def* pzlib_filefunc_def)
+{
+ pzlib_filefunc_def->zopen_file = qiodevice_open_file_func;
+ pzlib_filefunc_def->zread_file = qiodevice_read_file_func;
+ pzlib_filefunc_def->zwrite_file = qiodevice_write_file_func;
+ pzlib_filefunc_def->ztell_file = qiodevice_tell_file_func;
+ pzlib_filefunc_def->zseek_file = qiodevice_seek_file_func;
+ pzlib_filefunc_def->zclose_file = qiodevice_close_file_func;
+ pzlib_filefunc_def->zerror_file = qiodevice_error_file_func;
+ pzlib_filefunc_def->opaque = NULL;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quaadler32.cpp Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,28 @@
+#include "quaadler32.h"
+
+#include "zlib.h"
+
+QuaAdler32::QuaAdler32()
+{
+ reset();
+}
+
+quint32 QuaAdler32::calculate(const QByteArray &data)
+{
+ return adler32( adler32(0L, Z_NULL, 0), (const Bytef*)data.data(), data.size() );
+}
+
+void QuaAdler32::reset()
+{
+ checksum = adler32(0L, Z_NULL, 0);
+}
+
+void QuaAdler32::update(const QByteArray &buf)
+{
+ checksum = adler32( checksum, (const Bytef*)buf.data(), buf.size() );
+}
+
+quint32 QuaAdler32::value()
+{
+ return checksum;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quaadler32.h Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,29 @@
+#ifndef QUAADLER32_H
+#define QUAADLER32_H
+
+#include <QByteArray>
+
+#include "quachecksum32.h"
+
+/// Adler32 checksum
+/** \class QuaAdler32 quaadler32.h <quazip/quaadler32.h>
+ * This class wrappers the adler32 function with the QuaChecksum32 interface.
+ * See QuaChecksum32 for more info.
+ */
+class QuaAdler32 : public QuaChecksum32
+{
+
+public:
+ QuaAdler32();
+
+ quint32 calculate(const QByteArray &data);
+
+ void reset();
+ void update(const QByteArray &buf);
+ quint32 value();
+
+private:
+ quint32 checksum;
+};
+
+#endif //QUAADLER32_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quachecksum32.h Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,54 @@
+#ifndef QUACHECKSUM32_H
+#define QUACHECKSUM32_H
+
+#include <QByteArray>
+#include "quazip_global.h"
+
+/// Checksum interface.
+/** \class QuaChecksum32 quachecksum32.h <quazip/quachecksum32.h>
+ * This is an interface for 32 bit checksums.
+ * Classes implementing this interface can calcunate a certin
+ * checksum in a single step:
+ * \code
+ * QChecksum32 *crc32 = new QuaCrc32();
+ * rasoult = crc32->calculate(data);
+ * \endcode
+ * or by streaming the data:
+ * \code
+ * QChecksum32 *crc32 = new QuaCrc32();
+ * while(!fileA.atEnd())
+ * crc32->update(fileA.read(bufSize));
+ * resoultA = crc32->value();
+ * crc32->reset();
+ * while(!fileB.atEnd())
+ * crc32->update(fileB.read(bufSize));
+ * resoultB = crc32->value();
+ * \endcode
+ */
+class QUAZIP_EXPORT QuaChecksum32
+{
+
+public:
+ ///Calculates the checksum for data.
+ /** \a data source data
+ * \return data checksum
+ *
+ * This function has no efect on the value returned by value().
+ */
+ virtual quint32 calculate(const QByteArray &data) = 0;
+
+ ///Resets the calculation on a checksun for a stream.
+ virtual void reset() = 0;
+
+ ///Updates the calculated checksum for the stream
+ /** \a buf next portion of data from the stream
+ */
+ virtual void update(const QByteArray &buf) = 0;
+
+ ///Value of the checksum calculated for the stream passed throw update().
+ /** \return checksum
+ */
+ virtual quint32 value() = 0;
+};
+
+#endif //QUACHECKSUM32_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quacrc32.cpp Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,28 @@
+#include "quacrc32.h"
+
+#include "zlib.h"
+
+QuaCrc32::QuaCrc32()
+{
+ reset();
+}
+
+quint32 QuaCrc32::calculate(const QByteArray &data)
+{
+ return crc32( crc32(0L, Z_NULL, 0), (const Bytef*)data.data(), data.size() );
+}
+
+void QuaCrc32::reset()
+{
+ checksum = crc32(0L, Z_NULL, 0);
+}
+
+void QuaCrc32::update(const QByteArray &buf)
+{
+ checksum = crc32( checksum, (const Bytef*)buf.data(), buf.size() );
+}
+
+quint32 QuaCrc32::value()
+{
+ return checksum;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quacrc32.h Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,26 @@
+#ifndef QUACRC32_H
+#define QUACRC32_H
+
+#include "quachecksum32.h"
+
+///CRC32 checksum
+/** \class QuaCrc32 quacrc32.h <quazip/quacrc32.h>
+* This class wrappers the crc32 function with the QuaChecksum32 interface.
+* See QuaChecksum32 for more info.
+*/
+class QUAZIP_EXPORT QuaCrc32 : public QuaChecksum32 {
+
+public:
+ QuaCrc32();
+
+ quint32 calculate(const QByteArray &data);
+
+ void reset();
+ void update(const QByteArray &buf);
+ quint32 value();
+
+private:
+ quint32 checksum;
+};
+
+#endif //QUACRC32_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazip.cpp Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,427 @@
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser 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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser 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
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ **/
+
+#include <QFile>
+
+#include "quazip.h"
+
+class QuaZipPrivate {
+ friend class QuaZip;
+ private:
+ QTextCodec *fileNameCodec, *commentCodec;
+ QString zipName;
+ QIODevice *ioDevice;
+ QString comment;
+ QuaZip::Mode mode;
+ union {
+ unzFile unzFile_f;
+ zipFile zipFile_f;
+ };
+ bool hasCurrentFile_f;
+ int zipError;
+ inline QuaZipPrivate():
+ fileNameCodec(QTextCodec::codecForLocale()),
+ commentCodec(QTextCodec::codecForLocale()),
+ ioDevice(NULL),
+ mode(QuaZip::mdNotOpen),
+ hasCurrentFile_f(false),
+ zipError(UNZ_OK) {}
+ inline QuaZipPrivate(const QString &zipName):
+ fileNameCodec(QTextCodec::codecForLocale()),
+ commentCodec(QTextCodec::codecForLocale()),
+ zipName(zipName),
+ ioDevice(NULL),
+ mode(QuaZip::mdNotOpen),
+ hasCurrentFile_f(false),
+ zipError(UNZ_OK) {}
+ inline QuaZipPrivate(QIODevice *ioDevice):
+ fileNameCodec(QTextCodec::codecForLocale()),
+ commentCodec(QTextCodec::codecForLocale()),
+ ioDevice(ioDevice),
+ mode(QuaZip::mdNotOpen),
+ hasCurrentFile_f(false),
+ zipError(UNZ_OK) {}
+};
+
+QuaZip::QuaZip():
+ p(new QuaZipPrivate())
+{
+}
+
+QuaZip::QuaZip(const QString& zipName):
+ p(new QuaZipPrivate(zipName))
+{
+}
+
+QuaZip::QuaZip(QIODevice *ioDevice):
+ p(new QuaZipPrivate(ioDevice))
+{
+}
+
+QuaZip::~QuaZip()
+{
+ if(isOpen())
+ close();
+ delete p;
+}
+
+bool QuaZip::open(Mode mode, zlib_filefunc_def* ioApi)
+{
+ p->zipError=UNZ_OK;
+ if(isOpen()) {
+ qWarning("QuaZip::open(): ZIP already opened");
+ return false;
+ }
+ QIODevice *ioDevice = p->ioDevice;
+ if (ioDevice == NULL) {
+ if (p->zipName.isEmpty()) {
+ qWarning("QuaZip::open(): set either ZIP file name or IO device first");
+ return false;
+ } else {
+ ioDevice = new QFile(p->zipName);
+ }
+ }
+ switch(mode) {
+ case mdUnzip:
+ p->unzFile_f=unzOpen2(ioDevice, ioApi);
+ if(p->unzFile_f!=NULL) {
+ p->mode=mode;
+ p->ioDevice = ioDevice;
+ return true;
+ } else {
+ p->zipError=UNZ_OPENERROR;
+ if (!p->zipName.isEmpty())
+ delete ioDevice;
+ return false;
+ }
+ case mdCreate:
+ case mdAppend:
+ case mdAdd:
+ p->zipFile_f=zipOpen2(ioDevice,
+ mode==mdCreate?APPEND_STATUS_CREATE:
+ mode==mdAppend?APPEND_STATUS_CREATEAFTER:
+ APPEND_STATUS_ADDINZIP,
+ NULL,
+ ioApi);
+ if(p->zipFile_f!=NULL) {
+ p->mode=mode;
+ p->ioDevice = ioDevice;
+ return true;
+ } else {
+ p->zipError=UNZ_OPENERROR;
+ if (!p->zipName.isEmpty())
+ delete ioDevice;
+ return false;
+ }
+ default:
+ qWarning("QuaZip::open(): unknown mode: %d", (int)mode);
+ if (!p->zipName.isEmpty())
+ delete ioDevice;
+ return false;
+ break;
+ }
+}
+
+void QuaZip::close()
+{
+ p->zipError=UNZ_OK;
+ switch(p->mode) {
+ case mdNotOpen:
+ qWarning("QuaZip::close(): ZIP is not open");
+ return;
+ case mdUnzip:
+ p->zipError=unzClose(p->unzFile_f);
+ break;
+ case mdCreate:
+ case mdAppend:
+ case mdAdd:
+ p->zipError=zipClose(p->zipFile_f, p->commentCodec->fromUnicode(p->comment).constData());
+ break;
+ default:
+ qWarning("QuaZip::close(): unknown mode: %d", (int)p->mode);
+ return;
+ }
+ // opened by name, need to delete the internal IO device
+ if (!p->zipName.isEmpty())
+ delete p->ioDevice;
+ if(p->zipError==UNZ_OK)
+ p->mode=mdNotOpen;
+}
+
+void QuaZip::setZipName(const QString& zipName)
+{
+ if(isOpen()) {
+ qWarning("QuaZip::setZipName(): ZIP is already open!");
+ return;
+ }
+ p->zipName=zipName;
+ p->ioDevice = NULL;
+}
+
+void QuaZip::setIoDevice(QIODevice *ioDevice)
+{
+ if(isOpen()) {
+ qWarning("QuaZip::setIoDevice(): ZIP is already open!");
+ return;
+ }
+ p->ioDevice = ioDevice;
+ p->zipName = QString();
+}
+
+int QuaZip::getEntriesCount()const
+{
+ QuaZip *fakeThis=(QuaZip*)this; // non-const
+ fakeThis->p->zipError=UNZ_OK;
+ if(p->mode!=mdUnzip) {
+ qWarning("QuaZip::getEntriesCount(): ZIP is not open in mdUnzip mode");
+ return -1;
+ }
+ unz_global_info globalInfo;
+ if((fakeThis->p->zipError=unzGetGlobalInfo(p->unzFile_f, &globalInfo))!=UNZ_OK)
+ return p->zipError;
+ return (int)globalInfo.number_entry;
+}
+
+QString QuaZip::getComment()const
+{
+ QuaZip *fakeThis=(QuaZip*)this; // non-const
+ fakeThis->p->zipError=UNZ_OK;
+ if(p->mode!=mdUnzip) {
+ qWarning("QuaZip::getComment(): ZIP is not open in mdUnzip mode");
+ return QString();
+ }
+ unz_global_info globalInfo;
+ QByteArray comment;
+ if((fakeThis->p->zipError=unzGetGlobalInfo(p->unzFile_f, &globalInfo))!=UNZ_OK)
+ return QString();
+ comment.resize(globalInfo.size_comment);
+ if((fakeThis->p->zipError=unzGetGlobalComment(p->unzFile_f, comment.data(), comment.size())) < 0)
+ return QString();
+ fakeThis->p->zipError = UNZ_OK;
+ return p->commentCodec->toUnicode(comment);
+}
+
+bool QuaZip::setCurrentFile(const QString& fileName, CaseSensitivity cs)
+{
+ p->zipError=UNZ_OK;
+ if(p->mode!=mdUnzip) {
+ qWarning("QuaZip::setCurrentFile(): ZIP is not open in mdUnzip mode");
+ return false;
+ }
+ if(fileName.isEmpty()) {
+ p->hasCurrentFile_f=false;
+ return true;
+ }
+ // Unicode-aware reimplementation of the unzLocateFile function
+ if(p->unzFile_f==NULL) {
+ p->zipError=UNZ_PARAMERROR;
+ return false;
+ }
+ if(fileName.length()>MAX_FILE_NAME_LENGTH) {
+ p->zipError=UNZ_PARAMERROR;
+ return false;
+ }
+ bool sens;
+ if(cs==csDefault) {
+#ifdef Q_WS_WIN
+ sens=false;
+#else
+ sens=true;
+#endif
+ } else sens=cs==csSensitive;
+ QString lower, current;
+ if(!sens) lower=fileName.toLower();
+ p->hasCurrentFile_f=false;
+ for(bool more=goToFirstFile(); more; more=goToNextFile()) {
+ current=getCurrentFileName();
+ if(current.isEmpty()) return false;
+ if(sens) {
+ if(current==fileName) break;
+ } else {
+ if(current.toLower()==lower) break;
+ }
+ }
+ return p->hasCurrentFile_f;
+}
+
+bool QuaZip::goToFirstFile()
+{
+ p->zipError=UNZ_OK;
+ if(p->mode!=mdUnzip) {
+ qWarning("QuaZip::goToFirstFile(): ZIP is not open in mdUnzip mode");
+ return false;
+ }
+ p->zipError=unzGoToFirstFile(p->unzFile_f);
+ p->hasCurrentFile_f=p->zipError==UNZ_OK;
+ return p->hasCurrentFile_f;
+}
+
+bool QuaZip::goToNextFile()
+{
+ p->zipError=UNZ_OK;
+ if(p->mode!=mdUnzip) {
+ qWarning("QuaZip::goToFirstFile(): ZIP is not open in mdUnzip mode");
+ return false;
+ }
+ p->zipError=unzGoToNextFile(p->unzFile_f);
+ p->hasCurrentFile_f=p->zipError==UNZ_OK;
+ if(p->zipError==UNZ_END_OF_LIST_OF_FILE)
+ p->zipError=UNZ_OK;
+ return p->hasCurrentFile_f;
+}
+
+bool QuaZip::getCurrentFileInfo(QuaZipFileInfo *info)const
+{
+ QuaZip *fakeThis=(QuaZip*)this; // non-const
+ fakeThis->p->zipError=UNZ_OK;
+ if(p->mode!=mdUnzip) {
+ qWarning("QuaZip::getCurrentFileInfo(): ZIP is not open in mdUnzip mode");
+ return false;
+ }
+ unz_file_info info_z;
+ QByteArray fileName;
+ QByteArray extra;
+ QByteArray comment;
+ if(info==NULL) return false;
+ if(!isOpen()||!hasCurrentFile()) return false;
+ if((fakeThis->p->zipError=unzGetCurrentFileInfo(p->unzFile_f, &info_z, NULL, 0, NULL, 0, NULL, 0))!=UNZ_OK)
+ return false;
+ fileName.resize(info_z.size_filename);
+ extra.resize(info_z.size_file_extra);
+ comment.resize(info_z.size_file_comment);
+ if((fakeThis->p->zipError=unzGetCurrentFileInfo(p->unzFile_f, NULL,
+ fileName.data(), fileName.size(),
+ extra.data(), extra.size(),
+ comment.data(), comment.size()))!=UNZ_OK)
+ return false;
+ info->versionCreated=info_z.version;
+ info->versionNeeded=info_z.version_needed;
+ info->flags=info_z.flag;
+ info->method=info_z.compression_method;
+ info->crc=info_z.crc;
+ info->compressedSize=info_z.compressed_size;
+ info->uncompressedSize=info_z.uncompressed_size;
+ info->diskNumberStart=info_z.disk_num_start;
+ info->internalAttr=info_z.internal_fa;
+ info->externalAttr=info_z.external_fa;
+ info->name=p->fileNameCodec->toUnicode(fileName);
+ info->comment=p->commentCodec->toUnicode(comment);
+ info->extra=extra;
+ info->dateTime=QDateTime(
+ QDate(info_z.tmu_date.tm_year, info_z.tmu_date.tm_mon+1, info_z.tmu_date.tm_mday),
+ QTime(info_z.tmu_date.tm_hour, info_z.tmu_date.tm_min, info_z.tmu_date.tm_sec));
+ return true;
+}
+
+QString QuaZip::getCurrentFileName()const
+{
+ QuaZip *fakeThis=(QuaZip*)this; // non-const
+ fakeThis->p->zipError=UNZ_OK;
+ if(p->mode!=mdUnzip) {
+ qWarning("QuaZip::getCurrentFileName(): ZIP is not open in mdUnzip mode");
+ return QString();
+ }
+ if(!isOpen()||!hasCurrentFile()) return QString();
+ QByteArray fileName(MAX_FILE_NAME_LENGTH, 0);
+ if((fakeThis->p->zipError=unzGetCurrentFileInfo(p->unzFile_f, NULL, fileName.data(), fileName.size(),
+ NULL, 0, NULL, 0))!=UNZ_OK)
+ return QString();
+ return p->fileNameCodec->toUnicode(fileName.constData());
+}
+
+void QuaZip::setFileNameCodec(QTextCodec *fileNameCodec)
+{
+ p->fileNameCodec=fileNameCodec;
+}
+
+void QuaZip::setFileNameCodec(const char *fileNameCodecName)
+{
+ p->fileNameCodec=QTextCodec::codecForName(fileNameCodecName);
+}
+
+QTextCodec *QuaZip::getFileNameCodec()const
+{
+ return p->fileNameCodec;
+}
+
+void QuaZip::setCommentCodec(QTextCodec *commentCodec)
+{
+ p->commentCodec=commentCodec;
+}
+
+void QuaZip::setCommentCodec(const char *commentCodecName)
+{
+ p->commentCodec=QTextCodec::codecForName(commentCodecName);
+}
+
+QTextCodec *QuaZip::getCommentCodec()const
+{
+ return p->commentCodec;
+}
+
+QString QuaZip::getZipName() const
+{
+ return p->zipName;
+}
+
+QIODevice *QuaZip::getIoDevice() const
+{
+ if (!p->zipName.isEmpty()) // opened by name, using an internal QIODevice
+ return NULL;
+ return p->ioDevice;
+}
+
+QuaZip::Mode QuaZip::getMode()const
+{
+ return p->mode;
+}
+
+bool QuaZip::isOpen()const
+{
+ return p->mode!=mdNotOpen;
+}
+
+int QuaZip::getZipError() const
+{
+ return p->zipError;
+}
+
+void QuaZip::setComment(const QString& comment)
+{
+ p->comment=comment;
+}
+
+bool QuaZip::hasCurrentFile()const
+{
+ return p->hasCurrentFile_f;
+}
+
+unzFile QuaZip::getUnzFile()
+{
+ return p->unzFile_f;
+}
+
+zipFile QuaZip::getZipFile()
+{
+ return p->zipFile_f;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazip.h Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,359 @@
+#ifndef QUA_ZIP_H
+#define QUA_ZIP_H
+
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser 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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser 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
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ **/
+
+#include <QString>
+#include <QTextCodec>
+
+#include "zip.h"
+#include "unzip.h"
+
+#include "quazip_global.h"
+#include "quazipfileinfo.h"
+
+// just in case it will be defined in the later versions of the ZIP/UNZIP
+#ifndef UNZ_OPENERROR
+// define additional error code
+#define UNZ_OPENERROR -1000
+#endif
+
+class QuaZipPrivate;
+
+/// ZIP archive.
+/** \class QuaZip quazip.h <quazip/quazip.h>
+ * This class implements basic interface to the ZIP archive. It can be
+ * used to read table contents of the ZIP archive and retreiving
+ * information about the files inside it.
+ *
+ * You can also use this class to open files inside archive by passing
+ * pointer to the instance of this class to the constructor of the
+ * QuaZipFile class. But see QuaZipFile::QuaZipFile(QuaZip*, QObject*)
+ * for the possible pitfalls.
+ *
+ * This class is indended to provide interface to the ZIP subpackage of
+ * the ZIP/UNZIP package as well as to the UNZIP subpackage. But
+ * currently it supports only UNZIP.
+ *
+ * The use of this class is simple - just create instance using
+ * constructor, then set ZIP archive file name using setFile() function
+ * (if you did not passed the name to the constructor), then open() and
+ * then use different functions to work with it! Well, if you are
+ * paranoid, you may also wish to call close before destructing the
+ * instance, to check for errors on close.
+ *
+ * You may also use getUnzFile() and getZipFile() functions to get the
+ * ZIP archive handle and use it with ZIP/UNZIP package API directly.
+ *
+ * This class supports localized file names inside ZIP archive, but you
+ * have to set up proper codec with setCodec() function. By default,
+ * locale codec will be used, which is probably ok for UNIX systems, but
+ * will almost certainly fail with ZIP archives created in Windows. This
+ * is because Windows ZIP programs have strange habit of using DOS
+ * encoding for file names in ZIP archives. For example, ZIP archive
+ * with cyrillic names created in Windows will have file names in \c
+ * IBM866 encoding instead of \c WINDOWS-1251. I think that calling one
+ * function is not much trouble, but for true platform independency it
+ * would be nice to have some mechanism for file name encoding auto
+ * detection using locale information. Does anyone know a good way to do
+ * it?
+ **/
+class QUAZIP_EXPORT QuaZip {
+ friend class QuaZipPrivate;
+ public:
+ /// Useful constants.
+ enum Constants {
+ MAX_FILE_NAME_LENGTH=256 /**< Maximum file name length. Taken from
+ \c UNZ_MAXFILENAMEINZIP constant in
+ unzip.c. */
+ };
+ /// Open mode of the ZIP file.
+ enum Mode {
+ mdNotOpen, ///< ZIP file is not open. This is the initial mode.
+ mdUnzip, ///< ZIP file is open for reading files inside it.
+ mdCreate, ///< ZIP file was created with open() call.
+ mdAppend, /**< ZIP file was opened in append mode. This refers to
+ * \c APPEND_STATUS_CREATEAFTER mode in ZIP/UNZIP package
+ * and means that zip is appended to some existing file
+ * what is useful when that file contains
+ * self-extractor code. This is obviously \em not what
+ * you whant to use to add files to the existing ZIP
+ * archive.
+ **/
+ mdAdd ///< ZIP file was opened for adding files in the archive.
+ };
+ /// Case sensitivity for the file names.
+ /** This is what you specify when accessing files in the archive.
+ * Works perfectly fine with any characters thanks to Qt's great
+ * unicode support. This is different from ZIP/UNZIP API, where
+ * only US-ASCII characters was supported.
+ **/
+ enum CaseSensitivity {
+ csDefault=0, ///< Default for platform. Case sensitive for UNIX, not for Windows.
+ csSensitive=1, ///< Case sensitive.
+ csInsensitive=2 ///< Case insensitive.
+ };
+ private:
+ QuaZipPrivate *p;
+ // not (and will not be) implemented
+ QuaZip(const QuaZip& that);
+ // not (and will not be) implemented
+ QuaZip& operator=(const QuaZip& that);
+ public:
+ /// Constructs QuaZip object.
+ /** Call setName() before opening constructed object. */
+ QuaZip();
+ /// Constructs QuaZip object associated with ZIP file \a zipName.
+ QuaZip(const QString& zipName);
+ /// Constructs QuaZip object associated with ZIP file represented by \a ioDevice.
+ /** The IO device must be seekable, otherwise an error will occur when opening. */
+ QuaZip(QIODevice *ioDevice);
+ /// Destroys QuaZip object.
+ /** Calls close() if necessary. */
+ ~QuaZip();
+ /// Opens ZIP file.
+ /**
+ * Argument \a mode specifies open mode of the ZIP archive. See Mode
+ * for details. Note that there is zipOpen2() function in the
+ * ZIP/UNZIP API which accepts \a globalcomment argument, but it
+ * does not use it anywhere, so this open() function does not have this
+ * argument. See setComment() if you need to set global comment.
+ *
+ * If the ZIP file is accessed via explicitly set QIODevice, then
+ * this device is opened in the necessary mode. If the device was
+ * already opened by some other means, then the behaviour is defined by
+ * the device implementation, but generally it is not a very good
+ * idea. For example, QFile will at least issue a warning.
+ *
+ * \return \c true if successful, \c false otherwise.
+ *
+ * \note ZIP/UNZIP API open calls do not return error code - they
+ * just return \c NULL indicating an error. But to make things
+ * easier, quazip.h header defines additional error code \c
+ * UNZ_ERROROPEN and getZipError() will return it if the open call
+ * of the ZIP/UNZIP API returns \c NULL.
+ *
+ * Argument \a ioApi specifies IO function set for ZIP/UNZIP
+ * package to use. See unzip.h, zip.h and ioapi.h for details. Note
+ * that IO API for QuaZip is different from the original package.
+ * The file path argument was changed to be of type \c voidpf, and
+ * QuaZip passes a QIODevice pointer there. This QIODevice is either
+ * set explicitly via setIoDevice() or the QuaZip(QIODevice*)
+ * constructor, or it is created internally when opening the archive
+ * by its file name. The default API (qioapi.cpp) just delegates
+ * everything to the QIODevice API. Not only this allows to use a
+ * QIODevice instead of file name, but also has a nice side effect
+ * of raising the file size limit from 2G to 4G.
+ *
+ * In short: just forget about the \a ioApi argument and you'll be
+ * fine.
+ **/
+ bool open(Mode mode, zlib_filefunc_def *ioApi =NULL);
+ /// Closes ZIP file.
+ /** Call getZipError() to determine if the close was successful. The
+ * underlying QIODevice is also closed, regardless of whether it was
+ * set explicitly or not. */
+ void close();
+ /// Sets the codec used to encode/decode file names inside archive.
+ /** This is necessary to access files in the ZIP archive created
+ * under Windows with non-latin characters in file names. For
+ * example, file names with cyrillic letters will be in \c IBM866
+ * encoding.
+ **/
+ void setFileNameCodec(QTextCodec *fileNameCodec);
+ /// Sets the codec used to encode/decode file names inside archive.
+ /** \overload
+ * Equivalent to calling setFileNameCodec(QTextCodec::codecForName(codecName));
+ **/
+ void setFileNameCodec(const char *fileNameCodecName);
+ /// Returns the codec used to encode/decode comments inside archive.
+ QTextCodec* getFileNameCodec() const;
+ /// Sets the codec used to encode/decode comments inside archive.
+ /** This codec defaults to locale codec, which is probably ok.
+ **/
+ void setCommentCodec(QTextCodec *commentCodec);
+ /// Sets the codec used to encode/decode comments inside archive.
+ /** \overload
+ * Equivalent to calling setCommentCodec(QTextCodec::codecForName(codecName));
+ **/
+ void setCommentCodec(const char *commentCodecName);
+ /// Returns the codec used to encode/decode comments inside archive.
+ QTextCodec* getCommentCodec() const;
+ /// Returns the name of the ZIP file.
+ /** Returns null string if no ZIP file name has been set, for
+ * example when the QuaZip instance is set up to use a QIODevice
+ * instead.
+ * \sa setZipName(), setIoDevice(), getIoDevice()
+ **/
+ QString getZipName() const;
+ /// Sets the name of the ZIP file.
+ /** Does nothing if the ZIP file is open.
+ *
+ * Does not reset error code returned by getZipError().
+ * \sa setIoDevice(), getIoDevice(), getZipName()
+ **/
+ void setZipName(const QString& zipName);
+ /// Returns the device representing this ZIP file.
+ /** Returns null string if no device has been set explicitly, for
+ * example when opening a ZIP file by name.
+ * \sa setIoDevice(), getZipName(), setZipName()
+ **/
+ QIODevice *getIoDevice() const;
+ /// Sets the device representing the ZIP file.
+ /** Does nothing if the ZIP file is open.
+ *
+ * Does not reset error code returned by getZipError().
+ * \sa getIoDevice(), getZipName(), setZipName()
+ **/
+ void setIoDevice(QIODevice *ioDevice);
+ /// Returns the mode in which ZIP file was opened.
+ Mode getMode() const;
+ /// Returns \c true if ZIP file is open, \c false otherwise.
+ bool isOpen() const;
+ /// Returns the error code of the last operation.
+ /** Returns \c UNZ_OK if the last operation was successful.
+ *
+ * Error code resets to \c UNZ_OK every time you call any function
+ * that accesses something inside ZIP archive, even if it is \c
+ * const (like getEntriesCount()). open() and close() calls reset
+ * error code too. See documentation for the specific functions for
+ * details on error detection.
+ **/
+ int getZipError() const;
+ /// Returns number of the entries in the ZIP central directory.
+ /** Returns negative error code in the case of error. The same error
+ * code will be returned by subsequent getZipError() call.
+ **/
+ int getEntriesCount() const;
+ /// Returns global comment in the ZIP file.
+ QString getComment() const;
+ /// Sets global comment in the ZIP file.
+ /** Comment will be written to the archive on close operation.
+ *
+ * \sa open()
+ **/
+ void setComment(const QString& comment);
+ /// Sets the current file to the first file in the archive.
+ /** Returns \c true on success, \c false otherwise. Call
+ * getZipError() to get the error code.
+ **/
+ bool goToFirstFile();
+ /// Sets the current file to the next file in the archive.
+ /** Returns \c true on success, \c false otherwise. Call
+ * getZipError() to determine if there was an error.
+ *
+ * Should be used only in QuaZip::mdUnzip mode.
+ *
+ * \note If the end of file was reached, getZipError() will return
+ * \c UNZ_OK instead of \c UNZ_END_OF_LIST_OF_FILE. This is to make
+ * things like this easier:
+ * \code
+ * for(bool more=zip.goToFirstFile(); more; more=zip.goToNextFile()) {
+ * // do something
+ * }
+ * if(zip.getZipError()==UNZ_OK) {
+ * // ok, there was no error
+ * }
+ * \endcode
+ **/
+ bool goToNextFile();
+ /// Sets current file by its name.
+ /** Returns \c true if successful, \c false otherwise. Argument \a
+ * cs specifies case sensitivity of the file name. Call
+ * getZipError() in the case of a failure to get error code.
+ *
+ * This is not a wrapper to unzLocateFile() function. That is
+ * because I had to implement locale-specific case-insensitive
+ * comparison.
+ *
+ * Here are the differences from the original implementation:
+ *
+ * - If the file was not found, error code is \c UNZ_OK, not \c
+ * UNZ_END_OF_LIST_OF_FILE (see also goToNextFile()).
+ * - If this function fails, it unsets the current file rather than
+ * resetting it back to what it was before the call.
+ *
+ * If \a fileName is null string then this function unsets the
+ * current file and return \c true. Note that you should close the
+ * file first if it is open! See
+ * QuaZipFile::QuaZipFile(QuaZip*,QObject*) for the details.
+ *
+ * Should be used only in QuaZip::mdUnzip mode.
+ *
+ * \sa setFileNameCodec(), CaseSensitivity
+ **/
+ bool setCurrentFile(const QString& fileName, CaseSensitivity cs =csDefault);
+ /// Returns \c true if the current file has been set.
+ bool hasCurrentFile() const;
+ /// Retrieves information about the current file.
+ /** Fills the structure pointed by \a info. Returns \c true on
+ * success, \c false otherwise. In the latter case structure pointed
+ * by \a info remains untouched. If there was an error,
+ * getZipError() returns error code.
+ *
+ * Should be used only in QuaZip::mdUnzip mode.
+ *
+ * Does nothing and returns \c false in any of the following cases.
+ * - ZIP is not open;
+ * - ZIP does not have current file;
+ * - \a info is \c NULL;
+ *
+ * In all these cases getZipError() returns \c UNZ_OK since there
+ * is no ZIP/UNZIP API call.
+ **/
+ bool getCurrentFileInfo(QuaZipFileInfo* info)const;
+ /// Returns the current file name.
+ /** Equivalent to calling getCurrentFileInfo() and then getting \c
+ * name field of the QuaZipFileInfo structure, but faster and more
+ * convenient.
+ *
+ * Should be used only in QuaZip::mdUnzip mode.
+ **/
+ QString getCurrentFileName()const;
+ /// Returns \c unzFile handle.
+ /** You can use this handle to directly call UNZIP part of the
+ * ZIP/UNZIP package functions (see unzip.h).
+ *
+ * \warning When using the handle returned by this function, please
+ * keep in mind that QuaZip class is unable to detect any changes
+ * you make in the ZIP file state (e. g. changing current file, or
+ * closing the handle). So please do not do anything with this
+ * handle that is possible to do with the functions of this class.
+ * Or at least return the handle in the original state before
+ * calling some another function of this class (including implicit
+ * destructor calls and calls from the QuaZipFile objects that refer
+ * to this QuaZip instance!). So if you have changed the current
+ * file in the ZIP archive - then change it back or you may
+ * experience some strange behavior or even crashes.
+ **/
+ unzFile getUnzFile();
+ /// Returns \c zipFile handle.
+ /** You can use this handle to directly call ZIP part of the
+ * ZIP/UNZIP package functions (see zip.h). Warnings about the
+ * getUnzFile() function also apply to this function.
+ **/
+ zipFile getZipFile();
+};
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazip.pri Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,23 @@
+INCLUDEPATH += $$PWD
+DEPENDPATH += $$PWD
+HEADERS += $$PWD/crypt.h \
+ $$PWD/ioapi.h \
+ $$PWD/JlCompress.h \
+ $$PWD/quaadler32.h \
+ $$PWD/quachecksum32.h \
+ $$PWD/quacrc32.h \
+ $$PWD/quazip.h \
+ $$PWD/quazipfile.h \
+ $$PWD/quazipfileinfo.h \
+ $$PWD/quazipnewinfo.h \
+ $$PWD/unzip.h \
+ $$PWD/zip.h
+SOURCES += $$PWD/qioapi.cpp \
+ $$PWD/JlCompress.cpp \
+ $$PWD/quaadler32.cpp \
+ $$PWD/quacrc32.cpp \
+ $$PWD/quazip.cpp \
+ $$PWD/quazipfile.cpp \
+ $$PWD/quazipnewinfo.cpp \
+ $$PWD/unzip.c \
+ $$PWD/zip.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazip.pro Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,77 @@
+TEMPLATE = lib
+CONFIG += qt warn_on
+QT -= gui
+DEPENDPATH += .
+INCLUDEPATH += .
+
+# Input
+HEADERS += \
+ crypt.h\
+ ioapi.h\
+ JlCompress.h\
+ quaadler32.h\
+ quachecksum32.h\
+ quacrc32.h\
+ quazip.h\
+ quazipfile.h\
+ quazipfileinfo.h\
+ quazipnewinfo.h\
+ quazip_global.h\
+ unzip.h\
+ zip.h\
+
+SOURCES += *.c *.cpp
+
+unix:!symbian {
+ headers.path=$$PREFIX/include/quazip
+ headers.files=$$HEADERS
+ target.path=$$PREFIX/lib
+ INSTALLS += headers target
+
+ OBJECTS_DIR=.obj
+ MOC_DIR=.moc
+
+ LIBS += -lz
+}
+
+win32 {
+ headers.path=$$PREFIX/include/quazip
+ headers.files=$$HEADERS
+ target.path=$$PREFIX/lib
+ INSTALLS += headers target
+
+ *-g++*: LIBS += -lz.dll
+ *-msvc*: LIBS += -lzlib
+ *-msvc*: QMAKE_LFLAGS += /IMPLIB:$$DESTDIR\\quazip.lib
+}
+
+
+symbian {
+
+ # Note, on Symbian you may run into troubles with LGPL.
+ # The point is, if your application uses some version of QuaZip,
+ # and a newer binary compatible version of QuaZip is released, then
+ # the users of your application must be able to relink it with the
+ # new QuaZip version. For example, to take advantage of some QuaZip
+ # bug fixes.
+
+ # This is probably best achieved by building QuaZip as a static
+ # library and providing linkable object files of your application,
+ # so users can relink it.
+
+ CONFIG += staticlib
+ CONFIG += debug_and_release
+
+ LIBS += -lezip
+
+ #Export headers to SDK Epoc32/include directory
+ exportheaders.sources = $$HEADERS
+ exportheaders.path = quazip
+ for(header, exportheaders.sources) {
+ BLD_INF_RULES.prj_exports += "$$header $$exportheaders.path/$$basename(header)"
+ }
+}
+
+
+
+DEFINES += QUAZIP_BUILD
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazip_global.h Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,41 @@
+/**
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser 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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser 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
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ */
+
+#ifndef QUAZIP_GLOBAL_H
+#define QUAZIP_GLOBAL_H
+
+#include <QtCore/qglobal.h>
+/**
+ * When building the library with MSVC, QUAZIP_BUILD must be defined.
+ * qglobal.h takes care of defining Q_DECL_* correctly for msvc/gcc.
+ */
+
+#define QUAZIP_EXPORT
+
+#ifdef __GNUC__
+#define UNUSED __attribute__((__unused__))
+#else
+#define UNUSED
+#endif
+
+#endif // QUAZIP_GLOBAL_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazipfile.cpp Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,428 @@
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser 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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser 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
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ **/
+
+#include "quazipfile.h"
+
+using namespace std;
+
+class QuaZipFilePrivate {
+ friend class QuaZipFile;
+ private:
+ QuaZipFile *q;
+ QuaZip *zip;
+ QString fileName;
+ QuaZip::CaseSensitivity caseSensitivity;
+ bool raw;
+ qint64 writePos;
+ // these two are for writing raw files
+ ulong uncompressedSize;
+ quint32 crc;
+ bool internal;
+ int zipError;
+ inline void resetZipError() const {setZipError(UNZ_OK);}
+ // const, but sets zipError!
+ void setZipError(int zipError) const;
+ inline QuaZipFilePrivate(QuaZipFile *q):
+ q(q), zip(NULL), internal(true), zipError(UNZ_OK) {}
+ inline QuaZipFilePrivate(QuaZipFile *q, const QString &zipName):
+ q(q), internal(true), zipError(UNZ_OK)
+ {
+ zip=new QuaZip(zipName);
+ }
+ inline QuaZipFilePrivate(QuaZipFile *q, const QString &zipName, const QString &fileName,
+ QuaZip::CaseSensitivity cs):
+ q(q), internal(true), zipError(UNZ_OK)
+ {
+ zip=new QuaZip(zipName);
+ this->fileName=fileName;
+ this->caseSensitivity=cs;
+ }
+ inline QuaZipFilePrivate(QuaZipFile *q, QuaZip *zip):
+ q(q), zip(zip), internal(false), zipError(UNZ_OK) {}
+ inline ~QuaZipFilePrivate()
+ {
+ if (internal)
+ delete zip;
+ }
+};
+
+QuaZipFile::QuaZipFile():
+ p(new QuaZipFilePrivate(this))
+{
+}
+
+QuaZipFile::QuaZipFile(QObject *parent):
+ QIODevice(parent),
+ p(new QuaZipFilePrivate(this))
+{
+}
+
+QuaZipFile::QuaZipFile(const QString& zipName, QObject *parent):
+ QIODevice(parent),
+ p(new QuaZipFilePrivate(this, zipName))
+{
+}
+
+QuaZipFile::QuaZipFile(const QString& zipName, const QString& fileName,
+ QuaZip::CaseSensitivity cs, QObject *parent):
+ QIODevice(parent),
+ p(new QuaZipFilePrivate(this, zipName, fileName, cs))
+{
+}
+
+QuaZipFile::QuaZipFile(QuaZip *zip, QObject *parent):
+ QIODevice(parent),
+ p(new QuaZipFilePrivate(this, zip))
+{
+}
+
+QuaZipFile::~QuaZipFile()
+{
+ if (isOpen())
+ close();
+ delete p;
+}
+
+QString QuaZipFile::getZipName() const
+{
+ return p->zip==NULL ? QString() : p->zip->getZipName();
+}
+
+QString QuaZipFile::getActualFileName()const
+{
+ p->setZipError(UNZ_OK);
+ if (p->zip == NULL || (openMode() & WriteOnly))
+ return QString();
+ QString name=p->zip->getCurrentFileName();
+ if(name.isNull())
+ p->setZipError(p->zip->getZipError());
+ return name;
+}
+
+void QuaZipFile::setZipName(const QString& zipName)
+{
+ if(isOpen()) {
+ qWarning("QuaZipFile::setZipName(): file is already open - can not set ZIP name");
+ return;
+ }
+ if(p->zip!=NULL && p->internal)
+ delete p->zip;
+ p->zip=new QuaZip(zipName);
+ p->internal=true;
+}
+
+void QuaZipFile::setZip(QuaZip *zip)
+{
+ if(isOpen()) {
+ qWarning("QuaZipFile::setZip(): file is already open - can not set ZIP");
+ return;
+ }
+ if(p->zip!=NULL && p->internal)
+ delete p->zip;
+ p->zip=zip;
+ p->fileName=QString();
+ p->internal=false;
+}
+
+void QuaZipFile::setFileName(const QString& fileName, QuaZip::CaseSensitivity cs)
+{
+ if(p->zip==NULL) {
+ qWarning("QuaZipFile::setFileName(): call setZipName() first");
+ return;
+ }
+ if(!p->internal) {
+ qWarning("QuaZipFile::setFileName(): should not be used when not using internal QuaZip");
+ return;
+ }
+ if(isOpen()) {
+ qWarning("QuaZipFile::setFileName(): can not set file name for already opened file");
+ return;
+ }
+ p->fileName=fileName;
+ p->caseSensitivity=cs;
+}
+
+void QuaZipFilePrivate::setZipError(int zipError) const
+{
+ QuaZipFilePrivate *fakeThis = const_cast<QuaZipFilePrivate*>(this); // non-const
+ fakeThis->zipError=zipError;
+ if(zipError==UNZ_OK)
+ q->setErrorString(QString());
+ else
+ q->setErrorString(q->tr("ZIP/UNZIP API error %1").arg(zipError));
+}
+
+bool QuaZipFile::open(OpenMode mode)
+{
+ return open(mode, NULL);
+}
+
+bool QuaZipFile::open(OpenMode mode, int *method, int *level, bool raw, const char *password)
+{
+ p->resetZipError();
+ if(isOpen()) {
+ qWarning("QuaZipFile::open(): already opened");
+ return false;
+ }
+ if(mode&Unbuffered) {
+ qWarning("QuaZipFile::open(): Unbuffered mode is not supported");
+ return false;
+ }
+ if((mode&ReadOnly)&&!(mode&WriteOnly)) {
+ if(p->internal) {
+ if(!p->zip->open(QuaZip::mdUnzip)) {
+ p->setZipError(p->zip->getZipError());
+ return false;
+ }
+ if(!p->zip->setCurrentFile(p->fileName, p->caseSensitivity)) {
+ p->setZipError(p->zip->getZipError());
+ p->zip->close();
+ return false;
+ }
+ } else {
+ if(p->zip==NULL) {
+ qWarning("QuaZipFile::open(): zip is NULL");
+ return false;
+ }
+ if(p->zip->getMode()!=QuaZip::mdUnzip) {
+ qWarning("QuaZipFile::open(): file open mode %d incompatible with ZIP open mode %d",
+ (int)mode, (int)p->zip->getMode());
+ return false;
+ }
+ if(!p->zip->hasCurrentFile()) {
+ qWarning("QuaZipFile::open(): zip does not have current file");
+ return false;
+ }
+ }
+ p->setZipError(unzOpenCurrentFile3(p->zip->getUnzFile(), method, level, (int)raw, password));
+ if(p->zipError==UNZ_OK) {
+ setOpenMode(mode);
+ p->raw=raw;
+ return true;
+ } else
+ return false;
+ }
+ qWarning("QuaZipFile::open(): open mode %d not supported by this function", (int)mode);
+ return false;
+}
+
+bool QuaZipFile::open(OpenMode mode, const QuaZipNewInfo& info,
+ const char *password, quint32 crc,
+ int method, int level, bool raw,
+ int windowBits, int memLevel, int strategy)
+{
+ zip_fileinfo info_z;
+ p->resetZipError();
+ if(isOpen()) {
+ qWarning("QuaZipFile::open(): already opened");
+ return false;
+ }
+ if((mode&WriteOnly)&&!(mode&ReadOnly)) {
+ if(p->internal) {
+ qWarning("QuaZipFile::open(): write mode is incompatible with internal QuaZip approach");
+ return false;
+ }
+ if(p->zip==NULL) {
+ qWarning("QuaZipFile::open(): zip is NULL");
+ return false;
+ }
+ if(p->zip->getMode()!=QuaZip::mdCreate&&p->zip->getMode()!=QuaZip::mdAppend&&p->zip->getMode()!=QuaZip::mdAdd) {
+ qWarning("QuaZipFile::open(): file open mode %d incompatible with ZIP open mode %d",
+ (int)mode, (int)p->zip->getMode());
+ return false;
+ }
+ info_z.tmz_date.tm_year=info.dateTime.date().year();
+ info_z.tmz_date.tm_mon=info.dateTime.date().month() - 1;
+ info_z.tmz_date.tm_mday=info.dateTime.date().day();
+ info_z.tmz_date.tm_hour=info.dateTime.time().hour();
+ info_z.tmz_date.tm_min=info.dateTime.time().minute();
+ info_z.tmz_date.tm_sec=info.dateTime.time().second();
+ info_z.dosDate = 0;
+ info_z.internal_fa=(uLong)info.internalAttr;
+ info_z.external_fa=(uLong)info.externalAttr;
+ p->setZipError(zipOpenNewFileInZip3(p->zip->getZipFile(),
+ p->zip->getFileNameCodec()->fromUnicode(info.name).constData(), &info_z,
+ info.extraLocal.constData(), info.extraLocal.length(),
+ info.extraGlobal.constData(), info.extraGlobal.length(),
+ p->zip->getCommentCodec()->fromUnicode(info.comment).constData(),
+ method, level, (int)raw,
+ windowBits, memLevel, strategy,
+ password, (uLong)crc));
+ if(p->zipError==UNZ_OK) {
+ p->writePos=0;
+ setOpenMode(mode);
+ p->raw=raw;
+ if(raw) {
+ p->crc=crc;
+ p->uncompressedSize=info.uncompressedSize;
+ }
+ return true;
+ } else
+ return false;
+ }
+ qWarning("QuaZipFile::open(): open mode %d not supported by this function", (int)mode);
+ return false;
+}
+
+bool QuaZipFile::isSequential()const
+{
+ return true;
+}
+
+qint64 QuaZipFile::pos()const
+{
+ if(p->zip==NULL) {
+ qWarning("QuaZipFile::pos(): call setZipName() or setZip() first");
+ return -1;
+ }
+ if(!isOpen()) {
+ qWarning("QuaZipFile::pos(): file is not open");
+ return -1;
+ }
+ if(openMode()&ReadOnly)
+ return unztell(p->zip->getUnzFile());
+ else
+ return p->writePos;
+}
+
+bool QuaZipFile::atEnd()const
+{
+ if(p->zip==NULL) {
+ qWarning("QuaZipFile::atEnd(): call setZipName() or setZip() first");
+ return false;
+ }
+ if(!isOpen()) {
+ qWarning("QuaZipFile::atEnd(): file is not open");
+ return false;
+ }
+ if(openMode()&ReadOnly)
+ return unzeof(p->zip->getUnzFile())==1;
+ else
+ return true;
+}
+
+qint64 QuaZipFile::size()const
+{
+ if(!isOpen()) {
+ qWarning("QuaZipFile::atEnd(): file is not open");
+ return -1;
+ }
+ if(openMode()&ReadOnly)
+ return p->raw?csize():usize();
+ else
+ return p->writePos;
+}
+
+qint64 QuaZipFile::csize()const
+{
+ unz_file_info info_z;
+ p->setZipError(UNZ_OK);
+ if(p->zip==NULL||p->zip->getMode()!=QuaZip::mdUnzip) return -1;
+ p->setZipError(unzGetCurrentFileInfo(p->zip->getUnzFile(), &info_z, NULL, 0, NULL, 0, NULL, 0));
+ if(p->zipError!=UNZ_OK)
+ return -1;
+ return info_z.compressed_size;
+}
+
+qint64 QuaZipFile::usize()const
+{
+ unz_file_info info_z;
+ p->setZipError(UNZ_OK);
+ if(p->zip==NULL||p->zip->getMode()!=QuaZip::mdUnzip) return -1;
+ p->setZipError(unzGetCurrentFileInfo(p->zip->getUnzFile(), &info_z, NULL, 0, NULL, 0, NULL, 0));
+ if(p->zipError!=UNZ_OK)
+ return -1;
+ return info_z.uncompressed_size;
+}
+
+bool QuaZipFile::getFileInfo(QuaZipFileInfo *info)
+{
+ if(p->zip==NULL||p->zip->getMode()!=QuaZip::mdUnzip) return false;
+ p->zip->getCurrentFileInfo(info);
+ p->setZipError(p->zip->getZipError());
+ return p->zipError==UNZ_OK;
+}
+
+void QuaZipFile::close()
+{
+ p->resetZipError();
+ if(p->zip==NULL||!p->zip->isOpen()) return;
+ if(!isOpen()) {
+ qWarning("QuaZipFile::close(): file isn't open");
+ return;
+ }
+ if(openMode()&ReadOnly)
+ p->setZipError(unzCloseCurrentFile(p->zip->getUnzFile()));
+ else if(openMode()&WriteOnly)
+ if(isRaw()) p->setZipError(zipCloseFileInZipRaw(p->zip->getZipFile(), p->uncompressedSize, p->crc));
+ else p->setZipError(zipCloseFileInZip(p->zip->getZipFile()));
+ else {
+ qWarning("Wrong open mode: %d", (int)openMode());
+ return;
+ }
+ if(p->zipError==UNZ_OK) setOpenMode(QIODevice::NotOpen);
+ else return;
+ if(p->internal) {
+ p->zip->close();
+ p->setZipError(p->zip->getZipError());
+ }
+}
+
+qint64 QuaZipFile::readData(char *data, qint64 maxSize)
+{
+ p->setZipError(UNZ_OK);
+ qint64 bytesRead=unzReadCurrentFile(p->zip->getUnzFile(), data, (unsigned)maxSize);
+ if(bytesRead<0) p->setZipError((int)bytesRead);
+ return bytesRead;
+}
+
+qint64 QuaZipFile::writeData(const char* data, qint64 maxSize)
+{
+ p->setZipError(ZIP_OK);
+ p->setZipError(zipWriteInFileInZip(p->zip->getZipFile(), data, (uint)maxSize));
+ if(p->zipError!=ZIP_OK) return -1;
+ else {
+ p->writePos+=maxSize;
+ return maxSize;
+ }
+}
+
+QString QuaZipFile::getFileName() const
+{
+ return p->fileName;
+}
+
+QuaZip::CaseSensitivity QuaZipFile::getCaseSensitivity() const
+{
+ return p->caseSensitivity;
+}
+
+bool QuaZipFile::isRaw() const
+{
+ return p->raw;
+}
+
+int QuaZipFile::getZipError() const
+{
+ return p->zipError;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazipfile.h Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,433 @@
+#ifndef QUA_ZIPFILE_H
+#define QUA_ZIPFILE_H
+
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser 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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser 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
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ **/
+
+#include <QIODevice>
+
+#include "quazip_global.h"
+#include "quazip.h"
+#include "quazipnewinfo.h"
+
+class QuaZipFilePrivate;
+
+/// A file inside ZIP archive.
+/** \class QuaZipFile quazipfile.h <quazip/quazipfile.h>
+ * This is the most interesting class. Not only it provides C++
+ * interface to the ZIP/UNZIP package, but also integrates it with Qt by
+ * subclassing QIODevice. This makes possible to access files inside ZIP
+ * archive using QTextStream or QDataStream, for example. Actually, this
+ * is the main purpose of the whole QuaZIP library.
+ *
+ * You can either use existing QuaZip instance to create instance of
+ * this class or pass ZIP archive file name to this class, in which case
+ * it will create internal QuaZip object. See constructors' descriptions
+ * for details. Writing is only possible with the existing instance.
+ *
+ * Note that due to the underlying library's limitation it is not
+ * possible to use multiple QuaZipFile instances to open several files
+ * in the same archive at the same time. If you need to write to
+ * multiple files in parallel, then you should write to temporary files
+ * first, then pack them all at once when you have finished writing. If
+ * you need to read multiple files inside the same archive in parallel,
+ * you should extract them all into a temporary directory first.
+ *
+ * \section quazipfile-sequential Sequential or random-access?
+ *
+ * At the first thought, QuaZipFile has fixed size, the start and the
+ * end and should be therefore considered random-access device. But
+ * there is one major obstacle to making it random-access: ZIP/UNZIP API
+ * does not support seek() operation and the only way to implement it is
+ * through reopening the file and re-reading to the required position,
+ * but this is prohibitively slow.
+ *
+ * Therefore, QuaZipFile is considered to be a sequential device. This
+ * has advantage of availability of the ungetChar() operation (QIODevice
+ * does not implement it properly for non-sequential devices unless they
+ * support seek()). Disadvantage is a somewhat strange behaviour of the
+ * size() and pos() functions. This should be kept in mind while using
+ * this class.
+ *
+ **/
+class QUAZIP_EXPORT QuaZipFile: public QIODevice {
+ friend class QuaZipFilePrivate;
+ Q_OBJECT
+ private:
+ QuaZipFilePrivate *p;
+ // these are not supported nor implemented
+ QuaZipFile(const QuaZipFile& that);
+ QuaZipFile& operator=(const QuaZipFile& that);
+ protected:
+ /// Implementation of the QIODevice::readData().
+ qint64 readData(char *data, qint64 maxSize);
+ /// Implementation of the QIODevice::writeData().
+ qint64 writeData(const char *data, qint64 maxSize);
+ public:
+ /// Constructs a QuaZipFile instance.
+ /** You should use setZipName() and setFileName() or setZip() before
+ * trying to call open() on the constructed object.
+ **/
+ QuaZipFile();
+ /// Constructs a QuaZipFile instance.
+ /** \a parent argument specifies this object's parent object.
+ *
+ * You should use setZipName() and setFileName() or setZip() before
+ * trying to call open() on the constructed object.
+ **/
+ QuaZipFile(QObject *parent);
+ /// Constructs a QuaZipFile instance.
+ /** \a parent argument specifies this object's parent object and \a
+ * zipName specifies ZIP archive file name.
+ *
+ * You should use setFileName() before trying to call open() on the
+ * constructed object.
+ *
+ * QuaZipFile constructed by this constructor can be used for read
+ * only access. Use QuaZipFile(QuaZip*,QObject*) for writing.
+ **/
+ QuaZipFile(const QString& zipName, QObject *parent =NULL);
+ /// Constructs a QuaZipFile instance.
+ /** \a parent argument specifies this object's parent object, \a
+ * zipName specifies ZIP archive file name and \a fileName and \a cs
+ * specify a name of the file to open inside archive.
+ *
+ * QuaZipFile constructed by this constructor can be used for read
+ * only access. Use QuaZipFile(QuaZip*,QObject*) for writing.
+ *
+ * \sa QuaZip::setCurrentFile()
+ **/
+ QuaZipFile(const QString& zipName, const QString& fileName,
+ QuaZip::CaseSensitivity cs =QuaZip::csDefault, QObject *parent =NULL);
+ /// Constructs a QuaZipFile instance.
+ /** \a parent argument specifies this object's parent object.
+ *
+ * \a zip is the pointer to the existing QuaZip object. This
+ * QuaZipFile object then can be used to read current file in the
+ * \a zip or to write to the file inside it.
+ *
+ * \warning Using this constructor for reading current file can be
+ * tricky. Let's take the following example:
+ * \code
+ * QuaZip zip("archive.zip");
+ * zip.open(QuaZip::mdUnzip);
+ * zip.setCurrentFile("file-in-archive");
+ * QuaZipFile file(&zip);
+ * file.open(QIODevice::ReadOnly);
+ * // ok, now we can read from the file
+ * file.read(somewhere, some);
+ * zip.setCurrentFile("another-file-in-archive"); // oops...
+ * QuaZipFile anotherFile(&zip);
+ * anotherFile.open(QIODevice::ReadOnly);
+ * anotherFile.read(somewhere, some); // this is still ok...
+ * file.read(somewhere, some); // and this is NOT
+ * \endcode
+ * So, what exactly happens here? When we change current file in the
+ * \c zip archive, \c file that references it becomes invalid
+ * (actually, as far as I understand ZIP/UNZIP sources, it becomes
+ * closed, but QuaZipFile has no means to detect it).
+ *
+ * Summary: do not close \c zip object or change its current file as
+ * long as QuaZipFile is open. Even better - use another constructors
+ * which create internal QuaZip instances, one per object, and
+ * therefore do not cause unnecessary trouble. This constructor may
+ * be useful, though, if you already have a QuaZip instance and do
+ * not want to access several files at once. Good example:
+ * \code
+ * QuaZip zip("archive.zip");
+ * zip.open(QuaZip::mdUnzip);
+ * // first, we need some information about archive itself
+ * QByteArray comment=zip.getComment();
+ * // and now we are going to access files inside it
+ * QuaZipFile file(&zip);
+ * for(bool more=zip.goToFirstFile(); more; more=zip.goToNextFile()) {
+ * file.open(QIODevice::ReadOnly);
+ * // do something cool with file here
+ * file.close(); // do not forget to close!
+ * }
+ * zip.close();
+ * \endcode
+ **/
+ QuaZipFile(QuaZip *zip, QObject *parent =NULL);
+ /// Destroys a QuaZipFile instance.
+ /** Closes file if open, destructs internal QuaZip object (if it
+ * exists and \em is internal, of course).
+ **/
+ virtual ~QuaZipFile();
+ /// Returns the ZIP archive file name.
+ /** If this object was created by passing QuaZip pointer to the
+ * constructor, this function will return that QuaZip's file name
+ * (or null string if that object does not have file name yet).
+ *
+ * Otherwise, returns associated ZIP archive file name or null
+ * string if there are no name set yet.
+ *
+ * \sa setZipName() getFileName()
+ **/
+ QString getZipName()const;
+ /// Returns a pointer to the associated QuaZip object.
+ /** Returns \c NULL if there is no associated QuaZip or it is
+ * internal (so you will not mess with it).
+ **/
+ QuaZip* getZip()const;
+ /// Returns file name.
+ /** This function returns file name you passed to this object either
+ * by using
+ * QuaZipFile(const QString&,const QString&,QuaZip::CaseSensitivity,QObject*)
+ * or by calling setFileName(). Real name of the file may differ in
+ * case if you used case-insensitivity.
+ *
+ * Returns null string if there is no file name set yet. This is the
+ * case when this QuaZipFile operates on the existing QuaZip object
+ * (constructor QuaZipFile(QuaZip*,QObject*) or setZip() was used).
+ *
+ * \sa getActualFileName
+ **/
+ QString getFileName() const;
+ /// Returns case sensitivity of the file name.
+ /** This function returns case sensitivity argument you passed to
+ * this object either by using
+ * QuaZipFile(const QString&,const QString&,QuaZip::CaseSensitivity,QObject*)
+ * or by calling setFileName().
+ *
+ * Returns unpredictable value if getFileName() returns null string
+ * (this is the case when you did not used setFileName() or
+ * constructor above).
+ *
+ * \sa getFileName
+ **/
+ QuaZip::CaseSensitivity getCaseSensitivity() const;
+ /// Returns the actual file name in the archive.
+ /** This is \em not a ZIP archive file name, but a name of file inside
+ * archive. It is not necessary the same name that you have passed
+ * to the
+ * QuaZipFile(const QString&,const QString&,QuaZip::CaseSensitivity,QObject*),
+ * setFileName() or QuaZip::setCurrentFile() - this is the real file
+ * name inside archive, so it may differ in case if the file name
+ * search was case-insensitive.
+ *
+ * Equivalent to calling getCurrentFileName() on the associated
+ * QuaZip object. Returns null string if there is no associated
+ * QuaZip object or if it does not have a current file yet. And this
+ * is the case if you called setFileName() but did not open the
+ * file yet. So this is perfectly fine:
+ * \code
+ * QuaZipFile file("somezip.zip");
+ * file.setFileName("somefile");
+ * QString name=file.getName(); // name=="somefile"
+ * QString actual=file.getActualFileName(); // actual is null string
+ * file.open(QIODevice::ReadOnly);
+ * QString actual=file.getActualFileName(); // actual can be "SoMeFiLe" on Windows
+ * \endcode
+ *
+ * \sa getZipName(), getFileName(), QuaZip::CaseSensitivity
+ **/
+ QString getActualFileName()const;
+ /// Sets the ZIP archive file name.
+ /** Automatically creates internal QuaZip object and destroys
+ * previously created internal QuaZip object, if any.
+ *
+ * Will do nothing if this file is already open. You must close() it
+ * first.
+ **/
+ void setZipName(const QString& zipName);
+ /// Returns \c true if the file was opened in raw mode.
+ /** If the file is not open, the returned value is undefined.
+ *
+ * \sa open(OpenMode,int*,int*,bool,const char*)
+ **/
+ bool isRaw() const;
+ /// Binds to the existing QuaZip instance.
+ /** This function destroys internal QuaZip object, if any, and makes
+ * this QuaZipFile to use current file in the \a zip object for any
+ * further operations. See QuaZipFile(QuaZip*,QObject*) for the
+ * possible pitfalls.
+ *
+ * Will do nothing if the file is currently open. You must close()
+ * it first.
+ **/
+ void setZip(QuaZip *zip);
+ /// Sets the file name.
+ /** Will do nothing if at least one of the following conditions is
+ * met:
+ * - ZIP name has not been set yet (getZipName() returns null
+ * string).
+ * - This QuaZipFile is associated with external QuaZip. In this
+ * case you should call that QuaZip's setCurrentFile() function
+ * instead!
+ * - File is already open so setting the name is meaningless.
+ *
+ * \sa QuaZip::setCurrentFile
+ **/
+ void setFileName(const QString& fileName, QuaZip::CaseSensitivity cs =QuaZip::csDefault);
+ /// Opens a file for reading.
+ /** Returns \c true on success, \c false otherwise.
+ * Call getZipError() to get error code.
+ *
+ * \note Since ZIP/UNZIP API provides buffered reading only,
+ * QuaZipFile does not support unbuffered reading. So do not pass
+ * QIODevice::Unbuffered flag in \a mode, or open will fail.
+ **/
+ virtual bool open(OpenMode mode);
+ /// Opens a file for reading.
+ /** \overload
+ * Argument \a password specifies a password to decrypt the file. If
+ * it is NULL then this function behaves just like open(OpenMode).
+ **/
+ inline bool open(OpenMode mode, const char *password)
+ {return open(mode, NULL, NULL, false, password);}
+ /// Opens a file for reading.
+ /** \overload
+ * Argument \a password specifies a password to decrypt the file.
+ *
+ * An integers pointed by \a method and \a level will receive codes
+ * of the compression method and level used. See unzip.h.
+ *
+ * If raw is \c true then no decompression is performed.
+ *
+ * \a method should not be \c NULL. \a level can be \c NULL if you
+ * don't want to know the compression level.
+ **/
+ bool open(OpenMode mode, int *method, int *level, bool raw, const char *password =NULL);
+ /// Opens a file for writing.
+ /** \a info argument specifies information about file. It should at
+ * least specify a correct file name. Also, it is a good idea to
+ * specify correct timestamp (by default, current time will be
+ * used). See QuaZipNewInfo.
+ *
+ * Arguments \a password and \a crc provide necessary information
+ * for crypting. Note that you should specify both of them if you
+ * need crypting. If you do not, pass \c NULL as password, but you
+ * still need to specify \a crc if you are going to use raw mode
+ * (see below).
+ *
+ * Arguments \a method and \a level specify compression method and
+ * level.
+ *
+ * If \a raw is \c true, no compression is performed. In this case,
+ * \a crc and uncompressedSize field of the \a info are required.
+ *
+ * Arguments \a windowBits, \a memLevel, \a strategy provide zlib
+ * algorithms tuning. See deflateInit2() in zlib.
+ **/
+ bool open(OpenMode mode, const QuaZipNewInfo& info,
+ const char *password =NULL, quint32 crc =0,
+ int method =Z_DEFLATED, int level =Z_DEFAULT_COMPRESSION, bool raw =false,
+ int windowBits =-MAX_WBITS, int memLevel =DEF_MEM_LEVEL, int strategy =Z_DEFAULT_STRATEGY);
+ /// Returns \c true, but \ref quazipfile-sequential "beware"!
+ virtual bool isSequential()const;
+ /// Returns current position in the file.
+ /** Implementation of the QIODevice::pos(). When reading, this
+ * function is a wrapper to the ZIP/UNZIP unztell(), therefore it is
+ * unable to keep track of the ungetChar() calls (which is
+ * non-virtual and therefore is dangerous to reimplement). So if you
+ * are using ungetChar() feature of the QIODevice, this function
+ * reports incorrect value until you get back characters which you
+ * ungot.
+ *
+ * When writing, pos() returns number of bytes already written
+ * (uncompressed unless you use raw mode).
+ *
+ * \note Although
+ * \ref quazipfile-sequential "QuaZipFile is a sequential device"
+ * and therefore pos() should always return zero, it does not,
+ * because it would be misguiding. Keep this in mind.
+ *
+ * This function returns -1 if the file or archive is not open.
+ *
+ * Error code returned by getZipError() is not affected by this
+ * function call.
+ **/
+ virtual qint64 pos()const;
+ /// Returns \c true if the end of file was reached.
+ /** This function returns \c false in the case of error. This means
+ * that you called this function on either not open file, or a file
+ * in the not open archive or even on a QuaZipFile instance that
+ * does not even have QuaZip instance associated. Do not do that
+ * because there is no means to determine whether \c false is
+ * returned because of error or because end of file was reached.
+ * Well, on the other side you may interpret \c false return value
+ * as "there is no file open to check for end of file and there is
+ * no end of file therefore".
+ *
+ * When writing, this function always returns \c true (because you
+ * are always writing to the end of file).
+ *
+ * Error code returned by getZipError() is not affected by this
+ * function call.
+ **/
+ virtual bool atEnd()const;
+ /// Returns file size.
+ /** This function returns csize() if the file is open for reading in
+ * raw mode, usize() if it is open for reading in normal mode and
+ * pos() if it is open for writing.
+ *
+ * Returns -1 on error, call getZipError() to get error code.
+ *
+ * \note This function returns file size despite that
+ * \ref quazipfile-sequential "QuaZipFile is considered to be sequential device",
+ * for which size() should return bytesAvailable() instead. But its
+ * name would be very misguiding otherwise, so just keep in mind
+ * this inconsistence.
+ **/
+ virtual qint64 size()const;
+ /// Returns compressed file size.
+ /** Equivalent to calling getFileInfo() and then getting
+ * compressedSize field, but more convenient and faster.
+ *
+ * File must be open for reading before calling this function.
+ *
+ * Returns -1 on error, call getZipError() to get error code.
+ **/
+ qint64 csize()const;
+ /// Returns uncompressed file size.
+ /** Equivalent to calling getFileInfo() and then getting
+ * uncompressedSize field, but more convenient and faster. See
+ * getFileInfo() for a warning.
+ *
+ * File must be open for reading before calling this function.
+ *
+ * Returns -1 on error, call getZipError() to get error code.
+ **/
+ qint64 usize()const;
+ /// Gets information about current file.
+ /** This function does the same thing as calling
+ * QuaZip::getCurrentFileInfo() on the associated QuaZip object,
+ * but you can not call getCurrentFileInfo() if the associated
+ * QuaZip is internal (because you do not have access to it), while
+ * you still can call this function in that case.
+ *
+ * File must be open for reading before calling this function.
+ *
+ * Returns \c false in the case of an error.
+ **/
+ bool getFileInfo(QuaZipFileInfo *info);
+ /// Closes the file.
+ /** Call getZipError() to determine if the close was successful.
+ **/
+ virtual void close();
+ /// Returns the error code returned by the last ZIP/UNZIP API call.
+ int getZipError() const;
+};
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazipfileinfo.h Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,66 @@
+#ifndef QUA_ZIPFILEINFO_H
+#define QUA_ZIPFILEINFO_H
+
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser 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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser 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
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ **/
+
+#include <QByteArray>
+#include <QDateTime>
+
+#include "quazip_global.h"
+
+/// Information about a file inside archive.
+/** Call QuaZip::getCurrentFileInfo() or QuaZipFile::getFileInfo() to
+ * fill this structure. */
+struct QUAZIP_EXPORT QuaZipFileInfo {
+ /// File name.
+ QString name;
+ /// Version created by.
+ quint16 versionCreated;
+ /// Version needed to extract.
+ quint16 versionNeeded;
+ /// General purpose flags.
+ quint16 flags;
+ /// Compression method.
+ quint16 method;
+ /// Last modification date and time.
+ QDateTime dateTime;
+ /// CRC.
+ quint32 crc;
+ /// Compressed file size.
+ quint32 compressedSize;
+ /// Uncompressed file size.
+ quint32 uncompressedSize;
+ /// Disk number start.
+ quint16 diskNumberStart;
+ /// Internal file attributes.
+ quint16 internalAttr;
+ /// External file attributes.
+ quint32 externalAttr;
+ /// Comment.
+ QString comment;
+ /// Extra field.
+ QByteArray extra;
+};
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazipnewinfo.cpp Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,51 @@
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser 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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser 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
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+*/
+
+#include <QFileInfo>
+
+#include "quazipnewinfo.h"
+
+
+QuaZipNewInfo::QuaZipNewInfo(const QString& name):
+ name(name), dateTime(QDateTime::currentDateTime()), internalAttr(0), externalAttr(0)
+{
+}
+
+QuaZipNewInfo::QuaZipNewInfo(const QString& name, const QString& file):
+ name(name), internalAttr(0), externalAttr(0)
+{
+ QFileInfo info(file);
+ QDateTime lm = info.lastModified();
+ if (!info.exists())
+ dateTime = QDateTime::currentDateTime();
+ else
+ dateTime = lm;
+}
+
+void QuaZipNewInfo::setFileDateTime(const QString& file)
+{
+ QFileInfo info(file);
+ QDateTime lm = info.lastModified();
+ if (info.exists())
+ dateTime = lm;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/quazipnewinfo.h Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,102 @@
+#ifndef QUA_ZIPNEWINFO_H
+#define QUA_ZIPNEWINFO_H
+
+/*
+Copyright (C) 2005-2011 Sergey A. Tachenov
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser 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 Lesser
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser 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
+
+See COPYING file for the full LGPL text.
+
+Original ZIP package is copyrighted by Gilles Vollant, see
+quazip/(un)zip.h files for details, basically it's zlib license.
+ **/
+
+#include <QDateTime>
+#include <QString>
+
+#include "quazip_global.h"
+
+/// Information about a file to be created.
+/** This structure holds information about a file to be created inside
+ * ZIP archive. At least name should be set to something correct before
+ * passing this structure to
+ * QuaZipFile::open(OpenMode,const QuaZipNewInfo&,int,int,bool).
+ **/
+struct QUAZIP_EXPORT QuaZipNewInfo {
+ /// File name.
+ /** This field holds file name inside archive, including path relative
+ * to archive root.
+ **/
+ QString name;
+ /// File timestamp.
+ /** This is the last file modification date and time. Will be stored
+ * in the archive central directory. It is a good practice to set it
+ * to the source file timestamp instead of archive creating time. Use
+ * setFileDateTime() or QuaZipNewInfo(const QString&, const QString&).
+ **/
+ QDateTime dateTime;
+ /// File internal attributes.
+ quint16 internalAttr;
+ /// File external attributes.
+ quint32 externalAttr;
+ /// File comment.
+ /** Will be encoded using QuaZip::getCommentCodec().
+ **/
+ QString comment;
+ /// File local extra field.
+ QByteArray extraLocal;
+ /// File global extra field.
+ QByteArray extraGlobal;
+ /// Uncompressed file size.
+ /** This is only needed if you are using raw file zipping mode, i. e.
+ * adding precompressed file in the zip archive.
+ **/
+ ulong uncompressedSize;
+ /// Constructs QuaZipNewInfo instance.
+ /** Initializes name with \a name, dateTime with current date and
+ * time. Attributes are initialized with zeros, comment and extra
+ * field with null values.
+ **/
+ QuaZipNewInfo(const QString& name);
+ /// Constructs QuaZipNewInfo instance.
+ /** Initializes name with \a name and dateTime with timestamp of the
+ * file named \a file. If the \a file does not exists or its timestamp
+ * is inaccessible (e. g. you do not have read permission for the
+ * directory file in), uses current date and time. Attributes are
+ * initialized with zeros, comment and extra field with null values.
+ *
+ * \sa setFileDateTime()
+ **/
+ QuaZipNewInfo(const QString& name, const QString& file);
+ /// Sets the file timestamp from the existing file.
+ /** Use this function to set the file timestamp from the existing
+ * file. Use it like this:
+ * \code
+ * QuaZipFile zipFile(&zip);
+ * QFile file("file-to-add");
+ * file.open(QIODevice::ReadOnly);
+ * QuaZipNewInfo info("file-name-in-archive");
+ * info.setFileDateTime("file-to-add"); // take the timestamp from file
+ * zipFile.open(QIODevice::WriteOnly, info);
+ * \endcode
+ *
+ * This function does not change dateTime if some error occured (e. g.
+ * file is inaccessible).
+ **/
+ void setFileDateTime(const QString& file);
+};
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/unzip.c Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,1603 @@
+/* unzip.c -- IO for uncompress .zip files using zlib
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+
+ Read unzip.h for more info
+
+ Modified by Sergey A. Tachenov to integrate with Qt.
+*/
+
+/* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of
+compatibility with older software. The following is from the original crypt.c. Code
+woven in by Terry Thorsen 1/2003.
+*/
+/*
+ Copyright (c) 1990-2000 Info-ZIP. All rights reserved.
+
+ See the accompanying file LICENSE, version 2000-Apr-09 or later
+ (the contents of which are also included in zip.h) for terms of use.
+ If, for some reason, all these files are missing, the Info-ZIP license
+ also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
+*/
+/*
+ crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h]
+
+ The encryption/decryption parts of this source code (as opposed to the
+ non-echoing password parts) were originally written in Europe. The
+ whole source package can be freely distributed, including from the USA.
+ (Prior to January 2000, re-export from the US was a violation of US law.)
+ */
+
+/*
+ This encryption code is a direct transcription of the algorithm from
+ Roger Schlafly, described by Phil Katz in the file appnote.txt. This
+ file (appnote.txt) is distributed with the PKZIP program (even in the
+ version without encryption capabilities).
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "zlib.h"
+#include "unzip.h"
+
+#ifdef STDC
+# include <stddef.h>
+# include <string.h>
+# include <stdlib.h>
+#endif
+#ifdef NO_ERRNO_H
+ extern int errno;
+#else
+# include <errno.h>
+#endif
+
+
+#ifndef local
+# define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+
+#ifndef CASESENSITIVITYDEFAULT_NO
+# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
+# define CASESENSITIVITYDEFAULT_NO
+# endif
+#endif
+
+
+#ifndef UNZ_BUFSIZE
+#define UNZ_BUFSIZE (16384)
+#endif
+
+#ifndef UNZ_MAXFILENAMEINZIP
+#define UNZ_MAXFILENAMEINZIP (256)
+#endif
+
+#ifndef ALLOC
+# define ALLOC(size) (malloc(size))
+#endif
+#ifndef TRYFREE
+# define TRYFREE(p) {if (p) free(p);}
+#endif
+
+#define SIZECENTRALDIRITEM (0x2e)
+#define SIZEZIPLOCALHEADER (0x1e)
+
+
+
+
+const char unz_copyright[] =
+ " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
+
+/* unz_file_info_interntal contain internal info about a file in zipfile*/
+typedef struct unz_file_info_internal_s
+{
+ uLong offset_curfile;/* relative offset of local header 4 bytes */
+} unz_file_info_internal;
+
+
+/* file_in_zip_read_info_s contain internal information about a file in zipfile,
+ when reading and decompress it */
+typedef struct
+{
+ char *read_buffer; /* internal buffer for compressed data */
+ z_stream stream; /* zLib stream structure for inflate */
+
+ uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/
+ uLong stream_initialised; /* flag set if stream structure is initialised*/
+
+ uLong offset_local_extrafield;/* offset of the local extra field */
+ uInt size_local_extrafield;/* size of the local extra field */
+ uLong pos_local_extrafield; /* position in the local extra field in read*/
+
+ uLong crc32; /* crc32 of all data uncompressed */
+ uLong crc32_wait; /* crc32 we must obtain after decompress all */
+ uLong rest_read_compressed; /* number of byte to be decompressed */
+ uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/
+ zlib_filefunc_def z_filefunc;
+ voidpf filestream; /* io structore of the zipfile */
+ uLong compression_method; /* compression method (0==store) */
+ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+ int raw;
+} file_in_zip_read_info_s;
+
+
+/* unz_s contain internal information about the zipfile
+*/
+typedef struct
+{
+ zlib_filefunc_def z_filefunc;
+ voidpf filestream; /* io structore of the zipfile */
+ unz_global_info gi; /* public global information */
+ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+ uLong num_file; /* number of the current file in the zipfile*/
+ uLong pos_in_central_dir; /* pos of the current file in the central dir*/
+ uLong current_file_ok; /* flag about the usability of the current file*/
+ uLong central_pos; /* position of the beginning of the central dir*/
+
+ uLong size_central_dir; /* size of the central directory */
+ uLong offset_central_dir; /* offset of start of central directory with
+ respect to the starting disk number */
+
+ unz_file_info cur_file_info; /* public info about the current file in zip*/
+ unz_file_info_internal cur_file_info_internal; /* private info about it*/
+ file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current
+ file if we are decompressing it */
+ int encrypted;
+# ifndef NOUNCRYPT
+ unsigned long keys[3]; /* keys defining the pseudo-random sequence */
+ const unsigned long* pcrc_32_tab;
+# endif
+} unz_s;
+
+
+#ifndef NOUNCRYPT
+#include "crypt.h"
+#endif
+
+/* ===========================================================================
+ Read a byte from a gz_stream; update next_in and avail_in. Return EOF
+ for end of file.
+ IN assertion: the stream s has been sucessfully opened for reading.
+*/
+
+
+local int unzlocal_getByte OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream,
+ int *pi));
+
+local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+ int *pi;
+{
+ unsigned char c;
+ int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1);
+ if (err==1)
+ {
+ *pi = (int)c;
+ return UNZ_OK;
+ }
+ else
+ {
+ if (ZERROR(*pzlib_filefunc_def,filestream))
+ return UNZ_ERRNO;
+ else
+ return UNZ_EOF;
+ }
+}
+
+
+/* ===========================================================================
+ Reads a long in LSB order from the given gz_stream. Sets
+*/
+local int unzlocal_getShort OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream,
+ uLong *pX));
+
+local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+ uLong *pX;
+{
+ uLong x ;
+ int i;
+ int err;
+
+ err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x = (uLong)i;
+
+ if (err==UNZ_OK)
+ err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<8;
+
+ if (err==UNZ_OK)
+ *pX = x;
+ else
+ *pX = 0;
+ return err;
+}
+
+local int unzlocal_getLong OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream,
+ uLong *pX));
+
+local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+ uLong *pX;
+{
+ uLong x ;
+ int i;
+ int err;
+
+ err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x = (uLong)i;
+
+ if (err==UNZ_OK)
+ err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<8;
+
+ if (err==UNZ_OK)
+ err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<16;
+
+ if (err==UNZ_OK)
+ err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<24;
+
+ if (err==UNZ_OK)
+ *pX = x;
+ else
+ *pX = 0;
+ return err;
+}
+
+
+/* My own strcmpi / strcasecmp */
+local int strcmpcasenosensitive_internal (fileName1,fileName2)
+ const char* fileName1;
+ const char* fileName2;
+{
+ for (;;)
+ {
+ char c1=*(fileName1++);
+ char c2=*(fileName2++);
+ if ((c1>='a') && (c1<='z'))
+ c1 -= 0x20;
+ if ((c2>='a') && (c2<='z'))
+ c2 -= 0x20;
+ if (c1=='\0')
+ return ((c2=='\0') ? 0 : -1);
+ if (c2=='\0')
+ return 1;
+ if (c1<c2)
+ return -1;
+ if (c1>c2)
+ return 1;
+ }
+}
+
+
+#ifdef CASESENSITIVITYDEFAULT_NO
+#define CASESENSITIVITYDEFAULTVALUE 2
+#else
+#define CASESENSITIVITYDEFAULTVALUE 1
+#endif
+
+#ifndef STRCMPCASENOSENTIVEFUNCTION
+#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
+#endif
+
+/*
+ Compare two filename (fileName1,fileName2).
+ If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
+ If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
+ or strcasecmp)
+ If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
+ (like 1 on Unix, 2 on Windows)
+
+*/
+extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity)
+ const char* fileName1;
+ const char* fileName2;
+ int iCaseSensitivity;
+{
+ if (iCaseSensitivity==0)
+ iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
+
+ if (iCaseSensitivity==1)
+ return strcmp(fileName1,fileName2);
+
+ return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
+}
+
+#ifndef BUFREADCOMMENT
+#define BUFREADCOMMENT (0x400)
+#endif
+
+/*
+ Locate the Central directory of a zipfile (at the end, just before
+ the global comment)
+*/
+local uLong unzlocal_SearchCentralDir OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream));
+
+local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+{
+ unsigned char* buf;
+ uLong uSizeFile;
+ uLong uBackRead;
+ uLong uMaxBack=0xffff; /* maximum size of global comment */
+ uLong uPosFound=0;
+
+ if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
+ return 0;
+
+
+ uSizeFile = ZTELL(*pzlib_filefunc_def,filestream);
+
+ if (uMaxBack>uSizeFile)
+ uMaxBack = uSizeFile;
+
+ buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
+ if (buf==NULL)
+ return 0;
+
+ uBackRead = 4;
+ while (uBackRead<uMaxBack)
+ {
+ uLong uReadSize,uReadPos ;
+ int i;
+ if (uBackRead+BUFREADCOMMENT>uMaxBack)
+ uBackRead = uMaxBack;
+ else
+ uBackRead+=BUFREADCOMMENT;
+ uReadPos = uSizeFile-uBackRead ;
+
+ uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+ (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);
+ if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ break;
+
+ if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
+ break;
+
+ for (i=(int)uReadSize-3; (i--)>0;)
+ if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
+ ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
+ {
+ uPosFound = uReadPos+i;
+ break;
+ }
+
+ if (uPosFound!=0)
+ break;
+ }
+ TRYFREE(buf);
+ return uPosFound;
+}
+
+/*
+ Open a Zip file. path contain the full pathname (by example,
+ on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer
+ "zlib/zlib114.zip".
+ If the zipfile cannot be opened (file doesn't exist or in not valid), the
+ return value is NULL.
+ Else, the return value is a unzFile Handle, usable with other function
+ of this unzip package.
+*/
+extern unzFile ZEXPORT unzOpen2 (file, pzlib_filefunc_def)
+ voidpf file;
+ zlib_filefunc_def* pzlib_filefunc_def;
+{
+ unz_s us;
+ unz_s *s;
+ uLong central_pos,uL;
+
+ uLong number_disk; /* number of the current dist, used for
+ spaning ZIP, unsupported, always 0*/
+ uLong number_disk_with_CD; /* number the the disk with central dir, used
+ for spaning ZIP, unsupported, always 0*/
+ uLong number_entry_CD; /* total number of entries in
+ the central dir
+ (same than number_entry on nospan) */
+
+ int err=UNZ_OK;
+
+ if (unz_copyright[0]!=' ')
+ return NULL;
+
+ if (pzlib_filefunc_def==NULL)
+ fill_qiodevice_filefunc(&us.z_filefunc);
+ else
+ us.z_filefunc = *pzlib_filefunc_def;
+
+ us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque,
+ file,
+ ZLIB_FILEFUNC_MODE_READ |
+ ZLIB_FILEFUNC_MODE_EXISTING);
+ if (us.filestream==NULL)
+ return NULL;
+
+ central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream);
+ if (central_pos==0)
+ err=UNZ_ERRNO;
+
+ if (ZSEEK(us.z_filefunc, us.filestream,
+ central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err=UNZ_ERRNO;
+
+ /* the signature, already checked */
+ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* number of this disk */
+ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* number of the disk with the start of the central directory */
+ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* total number of entries in the central dir on this disk */
+ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* total number of entries in the central dir */
+ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if ((number_entry_CD!=us.gi.number_entry) ||
+ (number_disk_with_CD!=0) ||
+ (number_disk!=0))
+ err=UNZ_BADZIPFILE;
+
+ /* size of the central directory */
+ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* offset of start of central directory with respect to the
+ starting disk number */
+ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* zipfile comment length */
+ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
+ (err==UNZ_OK))
+ err=UNZ_BADZIPFILE;
+
+ if (err!=UNZ_OK)
+ {
+ ZCLOSE(us.z_filefunc, us.filestream);
+ return NULL;
+ }
+
+ us.byte_before_the_zipfile = central_pos -
+ (us.offset_central_dir+us.size_central_dir);
+ us.central_pos = central_pos;
+ us.pfile_in_zip_read = NULL;
+ us.encrypted = 0;
+
+
+ s=(unz_s*)ALLOC(sizeof(unz_s));
+ *s=us;
+ unzGoToFirstFile((unzFile)s);
+ return (unzFile)s;
+}
+
+
+extern unzFile ZEXPORT unzOpen (file)
+ voidpf file;
+{
+ return unzOpen2(file, NULL);
+}
+
+/*
+ Close a ZipFile opened with unzipOpen.
+ If there is files inside the .Zip opened with unzipOpenCurrentFile (see later),
+ these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
+ return UNZ_OK if there is no problem. */
+extern int ZEXPORT unzClose (file)
+ unzFile file;
+{
+ unz_s* s;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+
+ if (s->pfile_in_zip_read!=NULL)
+ unzCloseCurrentFile(file);
+
+ ZCLOSE(s->z_filefunc, s->filestream);
+ TRYFREE(s);
+ return UNZ_OK;
+}
+
+
+/*
+ Write info about the ZipFile in the *pglobal_info structure.
+ No preparation of the structure is needed
+ return UNZ_OK if there is no problem. */
+extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info)
+ unzFile file;
+ unz_global_info *pglobal_info;
+{
+ unz_s* s;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ *pglobal_info=s->gi;
+ return UNZ_OK;
+}
+
+
+/*
+ Translate date/time from Dos format to tm_unz (readable more easilty)
+*/
+local void unzlocal_DosDateToTmuDate (ulDosDate, ptm)
+ uLong ulDosDate;
+ tm_unz* ptm;
+{
+ uLong uDate;
+ uDate = (uLong)(ulDosDate>>16);
+ ptm->tm_mday = (uInt)(uDate&0x1f) ;
+ ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ;
+ ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;
+
+ ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);
+ ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ;
+ ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ;
+}
+
+/*
+ Get Info about the current file in the zipfile, with internal only info
+*/
+local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file,
+ unz_file_info *pfile_info,
+ unz_file_info_internal
+ *pfile_info_internal,
+ char *szFileName,
+ uLong fileNameBufferSize,
+ void *extraField,
+ uLong extraFieldBufferSize,
+ char *szComment,
+ uLong commentBufferSize));
+
+local int unzlocal_GetCurrentFileInfoInternal (file,
+ pfile_info,
+ pfile_info_internal,
+ szFileName, fileNameBufferSize,
+ extraField, extraFieldBufferSize,
+ szComment, commentBufferSize)
+ unzFile file;
+ unz_file_info *pfile_info;
+ unz_file_info_internal *pfile_info_internal;
+ char *szFileName;
+ uLong fileNameBufferSize;
+ void *extraField;
+ uLong extraFieldBufferSize;
+ char *szComment;
+ uLong commentBufferSize;
+{
+ unz_s* s;
+ unz_file_info file_info;
+ unz_file_info_internal file_info_internal;
+ int err=UNZ_OK;
+ uLong uMagic;
+ uLong uSeek=0;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ if (ZSEEK(s->z_filefunc, s->filestream,
+ s->pos_in_central_dir+s->byte_before_the_zipfile,
+ ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err=UNZ_ERRNO;
+
+
+ /* we check the magic */
+ if (err==UNZ_OK) {
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if (uMagic!=0x02014b50)
+ err=UNZ_BADZIPFILE;
+ }
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ uSeek+=file_info.size_filename;
+ if ((err==UNZ_OK) && (szFileName!=NULL))
+ {
+ uLong uSizeRead ;
+ if (file_info.size_filename<fileNameBufferSize)
+ {
+ *(szFileName+file_info.size_filename)='\0';
+ uSizeRead = file_info.size_filename;
+ }
+ else
+ uSizeRead = fileNameBufferSize;
+
+ if ((file_info.size_filename>0) && (fileNameBufferSize>0))
+ if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead)
+ err=UNZ_ERRNO;
+ uSeek -= uSizeRead;
+ }
+
+
+ if ((err==UNZ_OK) && (extraField!=NULL))
+ {
+ uLong uSizeRead ;
+ if (file_info.size_file_extra<extraFieldBufferSize)
+ uSizeRead = file_info.size_file_extra;
+ else
+ uSizeRead = extraFieldBufferSize;
+
+ if (uSeek!=0) {
+ if (ZSEEK(s->z_filefunc, s->filestream,uSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
+ uSeek=0;
+ else
+ err=UNZ_ERRNO;
+ }
+ if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
+ if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead)
+ err=UNZ_ERRNO;
+ uSeek += file_info.size_file_extra - uSizeRead;
+ }
+ else
+ uSeek+=file_info.size_file_extra;
+
+
+ if ((err==UNZ_OK) && (szComment!=NULL))
+ {
+ uLong uSizeRead ;
+ if (file_info.size_file_comment<commentBufferSize)
+ {
+ *(szComment+file_info.size_file_comment)='\0';
+ uSizeRead = file_info.size_file_comment;
+ }
+ else
+ uSizeRead = commentBufferSize;
+
+ if (uSeek!=0) {
+ if (ZSEEK(s->z_filefunc, s->filestream,uSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
+ uSeek=0;
+ else
+ err=UNZ_ERRNO;
+ }
+ if ((file_info.size_file_comment>0) && (commentBufferSize>0))
+ if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead)
+ err=UNZ_ERRNO;
+ uSeek+=file_info.size_file_comment - uSizeRead;
+ }
+ else
+ uSeek+=file_info.size_file_comment;
+
+ if ((err==UNZ_OK) && (pfile_info!=NULL))
+ *pfile_info=file_info;
+
+ if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
+ *pfile_info_internal=file_info_internal;
+
+ return err;
+}
+
+
+
+/*
+ Write info about the ZipFile in the *pglobal_info structure.
+ No preparation of the structure is needed
+ return UNZ_OK if there is no problem.
+*/
+extern int ZEXPORT unzGetCurrentFileInfo (file,
+ pfile_info,
+ szFileName, fileNameBufferSize,
+ extraField, extraFieldBufferSize,
+ szComment, commentBufferSize)
+ unzFile file;
+ unz_file_info *pfile_info;
+ char *szFileName;
+ uLong fileNameBufferSize;
+ void *extraField;
+ uLong extraFieldBufferSize;
+ char *szComment;
+ uLong commentBufferSize;
+{
+ return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL,
+ szFileName,fileNameBufferSize,
+ extraField,extraFieldBufferSize,
+ szComment,commentBufferSize);
+}
+
+/*
+ Set the current file of the zipfile to the first file.
+ return UNZ_OK if there is no problem
+*/
+extern int ZEXPORT unzGoToFirstFile (file)
+ unzFile file;
+{
+ int err=UNZ_OK;
+ unz_s* s;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ s->pos_in_central_dir=s->offset_central_dir;
+ s->num_file=0;
+ err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+ &s->cur_file_info_internal,
+ NULL,0,NULL,0,NULL,0);
+ s->current_file_ok = (err == UNZ_OK);
+ return err;
+}
+
+/*
+ Set the current file of the zipfile to the next file.
+ return UNZ_OK if there is no problem
+ return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
+*/
+extern int ZEXPORT unzGoToNextFile (file)
+ unzFile file;
+{
+ unz_s* s;
+ int err;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ if (!s->current_file_ok)
+ return UNZ_END_OF_LIST_OF_FILE;
+ if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */
+ if (s->num_file+1==s->gi.number_entry)
+ return UNZ_END_OF_LIST_OF_FILE;
+
+ s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
+ s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ;
+ s->num_file++;
+ err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+ &s->cur_file_info_internal,
+ NULL,0,NULL,0,NULL,0);
+ s->current_file_ok = (err == UNZ_OK);
+ return err;
+}
+
+
+/*
+ Try locate the file szFileName in the zipfile.
+ For the iCaseSensitivity signification, see unzipStringFileNameCompare
+
+ return value :
+ UNZ_OK if the file is found. It becomes the current file.
+ UNZ_END_OF_LIST_OF_FILE if the file is not found
+*/
+extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity)
+ unzFile file;
+ const char *szFileName;
+ int iCaseSensitivity;
+{
+ unz_s* s;
+ int err;
+
+ /* We remember the 'current' position in the file so that we can jump
+ * back there if we fail.
+ */
+ unz_file_info cur_file_infoSaved;
+ unz_file_info_internal cur_file_info_internalSaved;
+ uLong num_fileSaved;
+ uLong pos_in_central_dirSaved;
+
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+
+ if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)
+ return UNZ_PARAMERROR;
+
+ s=(unz_s*)file;
+ if (!s->current_file_ok)
+ return UNZ_END_OF_LIST_OF_FILE;
+
+ /* Save the current state */
+ num_fileSaved = s->num_file;
+ pos_in_central_dirSaved = s->pos_in_central_dir;
+ cur_file_infoSaved = s->cur_file_info;
+ cur_file_info_internalSaved = s->cur_file_info_internal;
+
+ err = unzGoToFirstFile(file);
+
+ while (err == UNZ_OK)
+ {
+ char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
+ err = unzGetCurrentFileInfo(file,NULL,
+ szCurrentFileName,sizeof(szCurrentFileName)-1,
+ NULL,0,NULL,0);
+ if (err == UNZ_OK)
+ {
+ if (unzStringFileNameCompare(szCurrentFileName,
+ szFileName,iCaseSensitivity)==0)
+ return UNZ_OK;
+ err = unzGoToNextFile(file);
+ }
+ }
+
+ /* We failed, so restore the state of the 'current file' to where we
+ * were.
+ */
+ s->num_file = num_fileSaved ;
+ s->pos_in_central_dir = pos_in_central_dirSaved ;
+ s->cur_file_info = cur_file_infoSaved;
+ s->cur_file_info_internal = cur_file_info_internalSaved;
+ return err;
+}
+
+
+/*
+///////////////////////////////////////////
+// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net)
+// I need random access
+//
+// Further optimization could be realized by adding an ability
+// to cache the directory in memory. The goal being a single
+// comprehensive file read to put the file I need in a memory.
+*/
+
+/*
+typedef struct unz_file_pos_s
+{
+ uLong pos_in_zip_directory; // offset in file
+ uLong num_of_file; // # of file
+} unz_file_pos;
+*/
+
+extern int ZEXPORT unzGetFilePos(file, file_pos)
+ unzFile file;
+ unz_file_pos* file_pos;
+{
+ unz_s* s;
+
+ if (file==NULL || file_pos==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ if (!s->current_file_ok)
+ return UNZ_END_OF_LIST_OF_FILE;
+
+ file_pos->pos_in_zip_directory = s->pos_in_central_dir;
+ file_pos->num_of_file = s->num_file;
+
+ return UNZ_OK;
+}
+
+extern int ZEXPORT unzGoToFilePos(file, file_pos)
+ unzFile file;
+ unz_file_pos* file_pos;
+{
+ unz_s* s;
+ int err;
+
+ if (file==NULL || file_pos==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+
+ /* jump to the right spot */
+ s->pos_in_central_dir = file_pos->pos_in_zip_directory;
+ s->num_file = file_pos->num_of_file;
+
+ /* set the current file */
+ err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+ &s->cur_file_info_internal,
+ NULL,0,NULL,0,NULL,0);
+ /* return results */
+ s->current_file_ok = (err == UNZ_OK);
+ return err;
+}
+
+/*
+// Unzip Helper Functions - should be here?
+///////////////////////////////////////////
+*/
+
+/*
+ Read the local header of the current zipfile
+ Check the coherency of the local header and info in the end of central
+ directory about this file
+ store in *piSizeVar the size of extra info in local header
+ (filename and size of extra field data)
+*/
+local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar,
+ poffset_local_extrafield,
+ psize_local_extrafield)
+ unz_s* s;
+ uInt* piSizeVar;
+ uLong *poffset_local_extrafield;
+ uInt *psize_local_extrafield;
+{
+ uLong uMagic,uData,uFlags;
+ uLong size_filename;
+ uLong size_extra_field;
+ int err=UNZ_OK;
+
+ *piSizeVar = 0;
+ *poffset_local_extrafield = 0;
+ *psize_local_extrafield = 0;
+
+ if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile +
+ s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return UNZ_ERRNO;
+
+
+ if (err==UNZ_OK) {
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if (uMagic!=0x04034b50)
+ err=UNZ_BADZIPFILE;
+ }
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
+ err=UNZ_ERRNO;
+/*
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion))
+ err=UNZ_BADZIPFILE;
+*/
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))
+ err=UNZ_BADZIPFILE;
+
+ if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) &&
+ (s->cur_file_info.compression_method!=Z_DEFLATED))
+ err=UNZ_BADZIPFILE;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) &&
+ ((uFlags & 8)==0))
+ err=UNZ_BADZIPFILE;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) &&
+ ((uFlags & 8)==0))
+ err=UNZ_BADZIPFILE;
+
+ if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) &&
+ ((uFlags & 8)==0))
+ err=UNZ_BADZIPFILE;
+
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))
+ err=UNZ_BADZIPFILE;
+
+ *piSizeVar += (uInt)size_filename;
+
+ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK)
+ err=UNZ_ERRNO;
+ *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +
+ SIZEZIPLOCALHEADER + size_filename;
+ *psize_local_extrafield = (uInt)size_extra_field;
+
+ *piSizeVar += (uInt)size_extra_field;
+
+ return err;
+}
+
+/*
+ Open for reading data the current file in the zipfile.
+ If there is no error and the file is opened, the return value is UNZ_OK.
+*/
+extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password)
+ unzFile file;
+ int* method;
+ int* level;
+ int raw;
+ const char* password;
+{
+ int err=UNZ_OK;
+ uInt iSizeVar;
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ uLong offset_local_extrafield; /* offset of the local extra field */
+ uInt size_local_extrafield; /* size of the local extra field */
+# ifndef NOUNCRYPT
+ char source[12];
+# else
+ if (password != NULL)
+ return UNZ_PARAMERROR;
+# endif
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ if (!s->current_file_ok)
+ return UNZ_PARAMERROR;
+
+ if (s->pfile_in_zip_read != NULL)
+ unzCloseCurrentFile(file);
+
+ if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar,
+ &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)
+ return UNZ_BADZIPFILE;
+
+ pfile_in_zip_read_info = (file_in_zip_read_info_s*)
+ ALLOC(sizeof(file_in_zip_read_info_s));
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_INTERNALERROR;
+
+ pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);
+ pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
+ pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
+ pfile_in_zip_read_info->pos_local_extrafield=0;
+ pfile_in_zip_read_info->raw=raw;
+
+ if (pfile_in_zip_read_info->read_buffer==NULL)
+ {
+ TRYFREE(pfile_in_zip_read_info);
+ return UNZ_INTERNALERROR;
+ }
+
+ pfile_in_zip_read_info->stream_initialised=0;
+
+ if (method!=NULL)
+ *method = (int)s->cur_file_info.compression_method;
+
+ if (level!=NULL)
+ {
+ *level = 6;
+ switch (s->cur_file_info.flag & 0x06)
+ {
+ case 6 : *level = 1; break;
+ case 4 : *level = 2; break;
+ case 2 : *level = 9; break;
+ }
+ }
+
+ if ((s->cur_file_info.compression_method!=0) &&
+ (s->cur_file_info.compression_method!=Z_DEFLATED))
+ err=UNZ_BADZIPFILE;
+
+ pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;
+ pfile_in_zip_read_info->crc32=0;
+ pfile_in_zip_read_info->compression_method =
+ s->cur_file_info.compression_method;
+ pfile_in_zip_read_info->filestream=s->filestream;
+ pfile_in_zip_read_info->z_filefunc=s->z_filefunc;
+ pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
+
+ pfile_in_zip_read_info->stream.total_out = 0;
+
+ if ((s->cur_file_info.compression_method==Z_DEFLATED) &&
+ (!raw))
+ {
+ pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
+ pfile_in_zip_read_info->stream.zfree = (free_func)0;
+ pfile_in_zip_read_info->stream.opaque = (voidpf)0;
+ pfile_in_zip_read_info->stream.next_in = (voidpf)0;
+ pfile_in_zip_read_info->stream.avail_in = 0;
+
+ err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
+ if (err == Z_OK)
+ pfile_in_zip_read_info->stream_initialised=1;
+ else
+ {
+ TRYFREE(pfile_in_zip_read_info);
+ return err;
+ }
+ /* windowBits is passed < 0 to tell that there is no zlib header.
+ * Note that in this case inflate *requires* an extra "dummy" byte
+ * after the compressed stream in order to complete decompression and
+ * return Z_STREAM_END.
+ * In unzip, i don't wait absolutely Z_STREAM_END because I known the
+ * size of both compressed and uncompressed data
+ */
+ }
+ pfile_in_zip_read_info->rest_read_compressed =
+ s->cur_file_info.compressed_size ;
+ pfile_in_zip_read_info->rest_read_uncompressed =
+ s->cur_file_info.uncompressed_size ;
+
+
+ pfile_in_zip_read_info->pos_in_zipfile =
+ s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +
+ iSizeVar;
+
+ pfile_in_zip_read_info->stream.avail_in = (uInt)0;
+
+ s->pfile_in_zip_read = pfile_in_zip_read_info;
+
+# ifndef NOUNCRYPT
+ if (password != NULL)
+ {
+ int i;
+ s->pcrc_32_tab = get_crc_table();
+ init_keys(password,s->keys,s->pcrc_32_tab);
+ if (ZSEEK(s->z_filefunc, s->filestream,
+ s->pfile_in_zip_read->pos_in_zipfile +
+ s->pfile_in_zip_read->byte_before_the_zipfile,
+ SEEK_SET)!=0)
+ return UNZ_INTERNALERROR;
+ if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12)
+ return UNZ_INTERNALERROR;
+
+ for (i = 0; i<12; i++)
+ zdecode(s->keys,s->pcrc_32_tab,source[i]);
+
+ s->pfile_in_zip_read->pos_in_zipfile+=12;
+ s->encrypted=1;
+ }
+# endif
+
+
+ return UNZ_OK;
+}
+
+extern int ZEXPORT unzOpenCurrentFile (file)
+ unzFile file;
+{
+ return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
+}
+
+extern int ZEXPORT unzOpenCurrentFilePassword (file, password)
+ unzFile file;
+ const char* password;
+{
+ return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
+}
+
+extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw)
+ unzFile file;
+ int* method;
+ int* level;
+ int raw;
+{
+ return unzOpenCurrentFile3(file, method, level, raw, NULL);
+}
+
+/*
+ Read bytes from the current file.
+ buf contain buffer where data must be copied
+ len the size of buf.
+
+ return the number of byte copied if somes bytes are copied
+ return 0 if the end of file was reached
+ return <0 with error code if there is an error
+ (UNZ_ERRNO for IO error, or zLib error for uncompress error)
+*/
+extern int ZEXPORT unzReadCurrentFile (file, buf, len)
+ unzFile file;
+ voidp buf;
+ unsigned len;
+{
+ int err=UNZ_OK;
+ uInt iRead = 0;
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+
+ if ((pfile_in_zip_read_info->read_buffer == NULL))
+ return UNZ_END_OF_LIST_OF_FILE;
+ if (len==0)
+ return 0;
+
+ pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;
+
+ pfile_in_zip_read_info->stream.avail_out = (uInt)len;
+
+ if ((len>pfile_in_zip_read_info->rest_read_uncompressed) &&
+ (!(pfile_in_zip_read_info->raw)))
+ pfile_in_zip_read_info->stream.avail_out =
+ (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
+
+ if ((len>pfile_in_zip_read_info->rest_read_compressed+
+ pfile_in_zip_read_info->stream.avail_in) &&
+ (pfile_in_zip_read_info->raw))
+ pfile_in_zip_read_info->stream.avail_out =
+ (uInt)pfile_in_zip_read_info->rest_read_compressed+
+ pfile_in_zip_read_info->stream.avail_in;
+
+ while (pfile_in_zip_read_info->stream.avail_out>0)
+ {
+ if ((pfile_in_zip_read_info->stream.avail_in==0) &&
+ (pfile_in_zip_read_info->rest_read_compressed>0))
+ {
+ uInt uReadThis = UNZ_BUFSIZE;
+ if (pfile_in_zip_read_info->rest_read_compressed<uReadThis)
+ uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;
+ if (uReadThis == 0)
+ return UNZ_EOF;
+ if (ZSEEK(pfile_in_zip_read_info->z_filefunc,
+ pfile_in_zip_read_info->filestream,
+ pfile_in_zip_read_info->pos_in_zipfile +
+ pfile_in_zip_read_info->byte_before_the_zipfile,
+ ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return UNZ_ERRNO;
+ if (ZREAD(pfile_in_zip_read_info->z_filefunc,
+ pfile_in_zip_read_info->filestream,
+ pfile_in_zip_read_info->read_buffer,
+ uReadThis)!=uReadThis)
+ return UNZ_ERRNO;
+
+
+# ifndef NOUNCRYPT
+ if(s->encrypted)
+ {
+ uInt i;
+ for(i=0;i<uReadThis;i++)
+ pfile_in_zip_read_info->read_buffer[i] =
+ zdecode(s->keys,s->pcrc_32_tab,
+ pfile_in_zip_read_info->read_buffer[i]);
+ }
+# endif
+
+
+ pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
+
+ pfile_in_zip_read_info->rest_read_compressed-=uReadThis;
+
+ pfile_in_zip_read_info->stream.next_in =
+ (Bytef*)pfile_in_zip_read_info->read_buffer;
+ pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
+ }
+
+ if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw))
+ {
+ uInt uDoCopy,i ;
+
+ if ((pfile_in_zip_read_info->stream.avail_in == 0) &&
+ (pfile_in_zip_read_info->rest_read_compressed == 0))
+ return (iRead==0) ? UNZ_EOF : iRead;
+
+ if (pfile_in_zip_read_info->stream.avail_out <
+ pfile_in_zip_read_info->stream.avail_in)
+ uDoCopy = pfile_in_zip_read_info->stream.avail_out ;
+ else
+ uDoCopy = pfile_in_zip_read_info->stream.avail_in ;
+
+ for (i=0;i<uDoCopy;i++)
+ *(pfile_in_zip_read_info->stream.next_out+i) =
+ *(pfile_in_zip_read_info->stream.next_in+i);
+
+ pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
+ pfile_in_zip_read_info->stream.next_out,
+ uDoCopy);
+ pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;
+ pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
+ pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
+ pfile_in_zip_read_info->stream.next_out += uDoCopy;
+ pfile_in_zip_read_info->stream.next_in += uDoCopy;
+ pfile_in_zip_read_info->stream.total_out += uDoCopy;
+ iRead += uDoCopy;
+ }
+ else
+ {
+ uLong uTotalOutBefore,uTotalOutAfter;
+ const Bytef *bufBefore;
+ uLong uOutThis;
+ int flush=Z_SYNC_FLUSH;
+
+ uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
+ bufBefore = pfile_in_zip_read_info->stream.next_out;
+
+ /*
+ if ((pfile_in_zip_read_info->rest_read_uncompressed ==
+ pfile_in_zip_read_info->stream.avail_out) &&
+ (pfile_in_zip_read_info->rest_read_compressed == 0))
+ flush = Z_FINISH;
+ */
+ err=inflate(&pfile_in_zip_read_info->stream,flush);
+
+ if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL))
+ err = Z_DATA_ERROR;
+
+ uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
+ uOutThis = uTotalOutAfter-uTotalOutBefore;
+
+ pfile_in_zip_read_info->crc32 =
+ crc32(pfile_in_zip_read_info->crc32,bufBefore,
+ (uInt)(uOutThis));
+
+ pfile_in_zip_read_info->rest_read_uncompressed -=
+ uOutThis;
+
+ iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
+
+ if (err==Z_STREAM_END)
+ return (iRead==0) ? UNZ_EOF : iRead;
+ if (err!=Z_OK)
+ break;
+ }
+ }
+
+ if (err==Z_OK)
+ return iRead;
+ return err;
+}
+
+
+/*
+ Give the current position in uncompressed data
+*/
+extern z_off_t ZEXPORT unztell (file)
+ unzFile file;
+{
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+ return (z_off_t)pfile_in_zip_read_info->stream.total_out;
+}
+
+
+/*
+ return 1 if the end of file was reached, 0 elsewhere
+*/
+extern int ZEXPORT unzeof (file)
+ unzFile file;
+{
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+ if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
+ return 1;
+ else
+ return 0;
+}
+
+
+
+/*
+ Read extra field from the current file (opened by unzOpenCurrentFile)
+ This is the local-header version of the extra field (sometimes, there is
+ more info in the local-header version than in the central-header)
+
+ if buf==NULL, it return the size of the local extra field that can be read
+
+ if buf!=NULL, len is the size of the buffer, the extra header is copied in
+ buf.
+ the return value is the number of bytes copied in buf, or (if <0)
+ the error code
+*/
+extern int ZEXPORT unzGetLocalExtrafield (file,buf,len)
+ unzFile file;
+ voidp buf;
+ unsigned len;
+{
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ uInt read_now;
+ uLong size_to_read;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+ size_to_read = (pfile_in_zip_read_info->size_local_extrafield -
+ pfile_in_zip_read_info->pos_local_extrafield);
+
+ if (buf==NULL)
+ return (int)size_to_read;
+
+ if (len>size_to_read)
+ read_now = (uInt)size_to_read;
+ else
+ read_now = (uInt)len ;
+
+ if (read_now==0)
+ return 0;
+
+ if (ZSEEK(pfile_in_zip_read_info->z_filefunc,
+ pfile_in_zip_read_info->filestream,
+ pfile_in_zip_read_info->offset_local_extrafield +
+ pfile_in_zip_read_info->pos_local_extrafield,
+ ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return UNZ_ERRNO;
+
+ if (ZREAD(pfile_in_zip_read_info->z_filefunc,
+ pfile_in_zip_read_info->filestream,
+ buf,read_now)!=read_now)
+ return UNZ_ERRNO;
+
+ return (int)read_now;
+}
+
+/*
+ Close the file in zip opened with unzipOpenCurrentFile
+ Return UNZ_CRCERROR if all the file was read but the CRC is not good
+*/
+extern int ZEXPORT unzCloseCurrentFile (file)
+ unzFile file;
+{
+ int err=UNZ_OK;
+
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+
+ if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&
+ (!pfile_in_zip_read_info->raw))
+ {
+ if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
+ err=UNZ_CRCERROR;
+ }
+
+
+ TRYFREE(pfile_in_zip_read_info->read_buffer);
+ pfile_in_zip_read_info->read_buffer = NULL;
+ if (pfile_in_zip_read_info->stream_initialised)
+ inflateEnd(&pfile_in_zip_read_info->stream);
+
+ pfile_in_zip_read_info->stream_initialised = 0;
+ TRYFREE(pfile_in_zip_read_info);
+
+ s->pfile_in_zip_read=NULL;
+
+ return err;
+}
+
+
+/*
+ Get the global comment string of the ZipFile, in the szComment buffer.
+ uSizeBuf is the size of the szComment buffer.
+ return the number of byte copied or an error code <0
+*/
+extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf)
+ unzFile file;
+ char *szComment;
+ uLong uSizeBuf;
+{
+ unz_s* s;
+ uLong uReadThis ;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+
+ uReadThis = uSizeBuf;
+ if (uReadThis>s->gi.size_comment)
+ uReadThis = s->gi.size_comment;
+
+ if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return UNZ_ERRNO;
+
+ if (uReadThis>0)
+ {
+ *szComment='\0';
+ if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis)
+ return UNZ_ERRNO;
+ }
+
+ if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))
+ *(szComment+s->gi.size_comment)='\0';
+ return (int)uReadThis;
+}
+
+/* Additions by RX '2004 */
+extern uLong ZEXPORT unzGetOffset (file)
+ unzFile file;
+{
+ unz_s* s;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ if (!s->current_file_ok)
+ return 0;
+ if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff)
+ if (s->num_file==s->gi.number_entry)
+ return 0;
+ return s->pos_in_central_dir;
+}
+
+extern int ZEXPORT unzSetOffset (file, pos)
+ unzFile file;
+ uLong pos;
+{
+ unz_s* s;
+ int err;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+
+ s->pos_in_central_dir = pos;
+ s->num_file = s->gi.number_entry; /* hack */
+ err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+ &s->cur_file_info_internal,
+ NULL,0,NULL,0,NULL,0);
+ s->current_file_ok = (err == UNZ_OK);
+ return err;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/unzip.h Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,356 @@
+/* unzip.h -- IO for uncompress .zip files using zlib
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+
+ This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g
+ WinZip, InfoZip tools and compatible.
+
+ Multi volume ZipFile (span) are not supported.
+ Encryption compatible with pkzip 2.04g only supported
+ Old compressions used by old PKZip 1.x are not supported
+
+
+ I WAIT FEEDBACK at mail info@winimage.com
+ Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution
+
+ Condition of use and distribution are the same than zlib :
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Modified by Sergey A. Tachenov to integrate with Qt.
+
+
+*/
+
+/* for more info about .ZIP format, see
+ http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip
+ http://www.info-zip.org/pub/infozip/doc/
+ PkWare has also a specification at :
+ ftp://ftp.pkware.com/probdesc.zip
+*/
+
+#ifndef _unz_H
+#define _unz_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _ZLIB_H
+#include "zlib.h"
+#endif
+
+#ifndef _ZLIBIOAPI_H
+#include "ioapi.h"
+#endif
+
+#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
+/* like the STRICT of WIN32, we define a pointer that cannot be converted
+ from (void*) without cast */
+typedef struct TagunzFile__ { int unused; } unzFile__;
+typedef unzFile__ *unzFile;
+#else
+typedef voidp unzFile;
+#endif
+
+
+#define UNZ_OK (0)
+#define UNZ_END_OF_LIST_OF_FILE (-100)
+#define UNZ_ERRNO (Z_ERRNO)
+#define UNZ_EOF (0)
+#define UNZ_PARAMERROR (-102)
+#define UNZ_BADZIPFILE (-103)
+#define UNZ_INTERNALERROR (-104)
+#define UNZ_CRCERROR (-105)
+
+/* tm_unz contain date/time info */
+typedef struct tm_unz_s
+{
+ uInt tm_sec; /* seconds after the minute - [0,59] */
+ uInt tm_min; /* minutes after the hour - [0,59] */
+ uInt tm_hour; /* hours since midnight - [0,23] */
+ uInt tm_mday; /* day of the month - [1,31] */
+ uInt tm_mon; /* months since January - [0,11] */
+ uInt tm_year; /* years - [1980..2044] */
+} tm_unz;
+
+/* unz_global_info structure contain global data about the ZIPfile
+ These data comes from the end of central dir */
+typedef struct unz_global_info_s
+{
+ uLong number_entry; /* total number of entries in
+ the central dir on this disk */
+ uLong size_comment; /* size of the global comment of the zipfile */
+} unz_global_info;
+
+
+/* unz_file_info contain information about a file in the zipfile */
+typedef struct unz_file_info_s
+{
+ uLong version; /* version made by 2 bytes */
+ uLong version_needed; /* version needed to extract 2 bytes */
+ uLong flag; /* general purpose bit flag 2 bytes */
+ uLong compression_method; /* compression method 2 bytes */
+ uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
+ uLong crc; /* crc-32 4 bytes */
+ uLong compressed_size; /* compressed size 4 bytes */
+ uLong uncompressed_size; /* uncompressed size 4 bytes */
+ uLong size_filename; /* filename length 2 bytes */
+ uLong size_file_extra; /* extra field length 2 bytes */
+ uLong size_file_comment; /* file comment length 2 bytes */
+
+ uLong disk_num_start; /* disk number start 2 bytes */
+ uLong internal_fa; /* internal file attributes 2 bytes */
+ uLong external_fa; /* external file attributes 4 bytes */
+
+ tm_unz tmu_date;
+} unz_file_info;
+
+extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
+ const char* fileName2,
+ int iCaseSensitivity));
+/*
+ Compare two filename (fileName1,fileName2).
+ If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
+ If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
+ or strcasecmp)
+ If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
+ (like 1 on Unix, 2 on Windows)
+*/
+
+
+extern unzFile ZEXPORT unzOpen OF((voidpf file));
+/*
+ Open a Zip file. path contain whatever zopen_file from the IO API
+ accepts. For Qt implementation it is a pointer to QIODevice, for
+ fopen() implementation it's a file name.
+ If the zipfile cannot be opened (file don't exist or in not valid), the
+ return value is NULL.
+ Else, the return value is a unzFile Handle, usable with other function
+ of this unzip package.
+*/
+
+extern unzFile ZEXPORT unzOpen2 OF((voidpf file,
+ zlib_filefunc_def* pzlib_filefunc_def));
+/*
+ Open a Zip file, like unzOpen, but provide a set of file low level API
+ for read/write the zip file (see ioapi.h)
+*/
+
+extern int ZEXPORT unzClose OF((unzFile file));
+/*
+ Close a ZipFile opened with unzipOpen.
+ If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
+ these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
+ return UNZ_OK if there is no problem. */
+
+extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
+ unz_global_info *pglobal_info));
+/*
+ Write info about the ZipFile in the *pglobal_info structure.
+ No preparation of the structure is needed
+ return UNZ_OK if there is no problem. */
+
+
+extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
+ char *szComment,
+ uLong uSizeBuf));
+/*
+ Get the global comment string of the ZipFile, in the szComment buffer.
+ uSizeBuf is the size of the szComment buffer.
+ return the number of byte copied or an error code <0
+*/
+
+
+/***************************************************************************/
+/* Unzip package allow you browse the directory of the zipfile */
+
+extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
+/*
+ Set the current file of the zipfile to the first file.
+ return UNZ_OK if there is no problem
+*/
+
+extern int ZEXPORT unzGoToNextFile OF((unzFile file));
+/*
+ Set the current file of the zipfile to the next file.
+ return UNZ_OK if there is no problem
+ return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
+*/
+
+extern int ZEXPORT unzLocateFile OF((unzFile file,
+ const char *szFileName,
+ int iCaseSensitivity));
+/*
+ Try locate the file szFileName in the zipfile.
+ For the iCaseSensitivity signification, see unzStringFileNameCompare
+
+ return value :
+ UNZ_OK if the file is found. It becomes the current file.
+ UNZ_END_OF_LIST_OF_FILE if the file is not found
+*/
+
+
+/* ****************************************** */
+/* Ryan supplied functions */
+/* unz_file_info contain information about a file in the zipfile */
+typedef struct unz_file_pos_s
+{
+ uLong pos_in_zip_directory; /* offset in zip file directory */
+ uLong num_of_file; /* # of file */
+} unz_file_pos;
+
+extern int ZEXPORT unzGetFilePos(
+ unzFile file,
+ unz_file_pos* file_pos);
+
+extern int ZEXPORT unzGoToFilePos(
+ unzFile file,
+ unz_file_pos* file_pos);
+
+/* ****************************************** */
+
+extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
+ unz_file_info *pfile_info,
+ char *szFileName,
+ uLong fileNameBufferSize,
+ void *extraField,
+ uLong extraFieldBufferSize,
+ char *szComment,
+ uLong commentBufferSize));
+/*
+ Get Info about the current file
+ if pfile_info!=NULL, the *pfile_info structure will contain somes info about
+ the current file
+ if szFileName!=NULL, the filemane string will be copied in szFileName
+ (fileNameBufferSize is the size of the buffer)
+ if extraField!=NULL, the extra field information will be copied in extraField
+ (extraFieldBufferSize is the size of the buffer).
+ This is the Central-header version of the extra field
+ if szComment!=NULL, the comment string of the file will be copied in szComment
+ (commentBufferSize is the size of the buffer)
+*/
+
+/***************************************************************************/
+/* for reading the content of the current zipfile, you can open it, read data
+ from it, and close it (you can close it before reading all the file)
+ */
+
+extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
+/*
+ Open for reading data the current file in the zipfile.
+ If there is no error, the return value is UNZ_OK.
+*/
+
+extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file,
+ const char* password));
+/*
+ Open for reading data the current file in the zipfile.
+ password is a crypting password
+ If there is no error, the return value is UNZ_OK.
+*/
+
+extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file,
+ int* method,
+ int* level,
+ int raw));
+/*
+ Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
+ if raw==1
+ *method will receive method of compression, *level will receive level of
+ compression
+ note : you can set level parameter as NULL (if you did not want known level,
+ but you CANNOT set method parameter as NULL
+*/
+
+extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file,
+ int* method,
+ int* level,
+ int raw,
+ const char* password));
+/*
+ Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
+ if raw==1
+ *method will receive method of compression, *level will receive level of
+ compression
+ note : you can set level parameter as NULL (if you did not want known level,
+ but you CANNOT set method parameter as NULL
+*/
+
+
+extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
+/*
+ Close the file in zip opened with unzOpenCurrentFile
+ Return UNZ_CRCERROR if all the file was read but the CRC is not good
+*/
+
+extern int ZEXPORT unzReadCurrentFile OF((unzFile file,
+ voidp buf,
+ unsigned len));
+/*
+ Read bytes from the current file (opened by unzOpenCurrentFile)
+ buf contain buffer where data must be copied
+ len the size of buf.
+
+ return the number of byte copied if somes bytes are copied
+ return 0 if the end of file was reached
+ return <0 with error code if there is an error
+ (UNZ_ERRNO for IO error, or zLib error for uncompress error)
+*/
+
+extern z_off_t ZEXPORT unztell OF((unzFile file));
+/*
+ Give the current position in uncompressed data
+*/
+
+extern int ZEXPORT unzeof OF((unzFile file));
+/*
+ return 1 if the end of file was reached, 0 elsewhere
+*/
+
+extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
+ voidp buf,
+ unsigned len));
+/*
+ Read extra field from the current file (opened by unzOpenCurrentFile)
+ This is the local-header version of the extra field (sometimes, there is
+ more info in the local-header version than in the central-header)
+
+ if buf==NULL, it return the size of the local extra field
+
+ if buf!=NULL, len is the size of the buffer, the extra header is copied in
+ buf.
+ the return value is the number of bytes copied in buf, or (if <0)
+ the error code
+*/
+
+/***************************************************************************/
+
+/* Get the current file offset */
+extern uLong ZEXPORT unzGetOffset (unzFile file);
+
+/* Set the current file offset */
+extern int ZEXPORT unzSetOffset (unzFile file, uLong pos);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _unz_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/zconf.h Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,332 @@
+/* zconf.h -- configuration of the zlib compression library
+ * Copyright (C) 1995-2005 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#ifndef ZCONF_H
+#define ZCONF_H
+
+/*
+ * If you *really* need a unique prefix for all types and library functions,
+ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
+ */
+#ifdef Z_PREFIX
+# define deflateInit_ z_deflateInit_
+# define deflate z_deflate
+# define deflateEnd z_deflateEnd
+# define inflateInit_ z_inflateInit_
+# define inflate z_inflate
+# define inflateEnd z_inflateEnd
+# define deflateInit2_ z_deflateInit2_
+# define deflateSetDictionary z_deflateSetDictionary
+# define deflateCopy z_deflateCopy
+# define deflateReset z_deflateReset
+# define deflateParams z_deflateParams
+# define deflateBound z_deflateBound
+# define deflatePrime z_deflatePrime
+# define inflateInit2_ z_inflateInit2_
+# define inflateSetDictionary z_inflateSetDictionary
+# define inflateSync z_inflateSync
+# define inflateSyncPoint z_inflateSyncPoint
+# define inflateCopy z_inflateCopy
+# define inflateReset z_inflateReset
+# define inflateBack z_inflateBack
+# define inflateBackEnd z_inflateBackEnd
+# define compress z_compress
+# define compress2 z_compress2
+# define compressBound z_compressBound
+# define uncompress z_uncompress
+# define adler32 z_adler32
+# define crc32 z_crc32
+# define get_crc_table z_get_crc_table
+# define zError z_zError
+
+# define alloc_func z_alloc_func
+# define free_func z_free_func
+# define in_func z_in_func
+# define out_func z_out_func
+# define Byte z_Byte
+# define uInt z_uInt
+# define uLong z_uLong
+# define Bytef z_Bytef
+# define charf z_charf
+# define intf z_intf
+# define uIntf z_uIntf
+# define uLongf z_uLongf
+# define voidpf z_voidpf
+# define voidp z_voidp
+#endif
+
+#if defined(__MSDOS__) && !defined(MSDOS)
+# define MSDOS
+#endif
+#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
+# define OS2
+#endif
+#if defined(_WINDOWS) && !defined(WINDOWS)
+# define WINDOWS
+#endif
+#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)
+# ifndef WIN32
+# define WIN32
+# endif
+#endif
+#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
+# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
+# ifndef SYS16BIT
+# define SYS16BIT
+# endif
+# endif
+#endif
+
+/*
+ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
+ * than 64k bytes at a time (needed on systems with 16-bit int).
+ */
+#ifdef SYS16BIT
+# define MAXSEG_64K
+#endif
+#ifdef MSDOS
+# define UNALIGNED_OK
+#endif
+
+#ifdef __STDC_VERSION__
+# ifndef STDC
+# define STDC
+# endif
+# if __STDC_VERSION__ >= 199901L
+# ifndef STDC99
+# define STDC99
+# endif
+# endif
+#endif
+#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
+# define STDC
+#endif
+
+#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
+# define STDC
+#endif
+
+#ifndef STDC
+# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
+# define const /* note: need a more gentle solution here */
+# endif
+#endif
+
+/* Some Mac compilers merge all .h files incorrectly: */
+#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)
+# define NO_DUMMY_DECL
+#endif
+
+/* Maximum value for memLevel in deflateInit2 */
+#ifndef MAX_MEM_LEVEL
+# ifdef MAXSEG_64K
+# define MAX_MEM_LEVEL 8
+# else
+# define MAX_MEM_LEVEL 9
+# endif
+#endif
+
+/* Maximum value for windowBits in deflateInit2 and inflateInit2.
+ * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
+ * created by gzip. (Files created by minigzip can still be extracted by
+ * gzip.)
+ */
+#ifndef MAX_WBITS
+# define MAX_WBITS 15 /* 32K LZ77 window */
+#endif
+
+/* The memory requirements for deflate are (in bytes):
+ (1 << (windowBits+2)) + (1 << (memLevel+9))
+ that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
+ plus a few kilobytes for small objects. For example, if you want to reduce
+ the default memory requirements from 256K to 128K, compile with
+ make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
+ Of course this will generally degrade compression (there's no free lunch).
+
+ The memory requirements for inflate are (in bytes) 1 << windowBits
+ that is, 32K for windowBits=15 (default value) plus a few kilobytes
+ for small objects.
+*/
+
+ /* Type declarations */
+
+#ifndef OF /* function prototypes */
+# ifdef STDC
+# define OF(args) args
+# else
+# define OF(args) ()
+# endif
+#endif
+
+/* The following definitions for FAR are needed only for MSDOS mixed
+ * model programming (small or medium model with some far allocations).
+ * This was tested only with MSC; for other MSDOS compilers you may have
+ * to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
+ * just define FAR to be empty.
+ */
+#ifdef SYS16BIT
+# if defined(M_I86SM) || defined(M_I86MM)
+ /* MSC small or medium model */
+# define SMALL_MEDIUM
+# ifdef _MSC_VER
+# define FAR _far
+# else
+# define FAR far
+# endif
+# endif
+# if (defined(__SMALL__) || defined(__MEDIUM__))
+ /* Turbo C small or medium model */
+# define SMALL_MEDIUM
+# ifdef __BORLANDC__
+# define FAR _far
+# else
+# define FAR far
+# endif
+# endif
+#endif
+
+#if defined(WINDOWS) || defined(WIN32)
+ /* If building or using zlib as a DLL, define ZLIB_DLL.
+ * This is not mandatory, but it offers a little performance increase.
+ */
+# ifdef ZLIB_DLL
+# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
+# ifdef ZLIB_INTERNAL
+# define ZEXTERN extern __declspec(dllexport)
+# else
+# define ZEXTERN extern __declspec(dllimport)
+# endif
+# endif
+# endif /* ZLIB_DLL */
+ /* If building or using zlib with the WINAPI/WINAPIV calling convention,
+ * define ZLIB_WINAPI.
+ * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
+ */
+# ifdef ZLIB_WINAPI
+# ifdef FAR
+# undef FAR
+# endif
+# include <windows.h>
+ /* No need for _export, use ZLIB.DEF instead. */
+ /* For complete Windows compatibility, use WINAPI, not __stdcall. */
+# define ZEXPORT WINAPI
+# ifdef WIN32
+# define ZEXPORTVA WINAPIV
+# else
+# define ZEXPORTVA FAR CDECL
+# endif
+# endif
+#endif
+
+#if defined (__BEOS__)
+# ifdef ZLIB_DLL
+# ifdef ZLIB_INTERNAL
+# define ZEXPORT __declspec(dllexport)
+# define ZEXPORTVA __declspec(dllexport)
+# else
+# define ZEXPORT __declspec(dllimport)
+# define ZEXPORTVA __declspec(dllimport)
+# endif
+# endif
+#endif
+
+#ifndef ZEXTERN
+# define ZEXTERN extern
+#endif
+#ifndef ZEXPORT
+# define ZEXPORT
+#endif
+#ifndef ZEXPORTVA
+# define ZEXPORTVA
+#endif
+
+#ifndef FAR
+# define FAR
+#endif
+
+#if !defined(__MACTYPES__)
+typedef unsigned char Byte; /* 8 bits */
+#endif
+typedef unsigned int uInt; /* 16 bits or more */
+typedef unsigned long uLong; /* 32 bits or more */
+
+#ifdef SMALL_MEDIUM
+ /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
+# define Bytef Byte FAR
+#else
+ typedef Byte FAR Bytef;
+#endif
+typedef char FAR charf;
+typedef int FAR intf;
+typedef uInt FAR uIntf;
+typedef uLong FAR uLongf;
+
+#ifdef STDC
+ typedef void const *voidpc;
+ typedef void FAR *voidpf;
+ typedef void *voidp;
+#else
+ typedef Byte const *voidpc;
+ typedef Byte FAR *voidpf;
+ typedef Byte *voidp;
+#endif
+
+#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */
+# include <sys/types.h> /* for off_t */
+# include <unistd.h> /* for SEEK_* and off_t */
+# ifdef VMS
+# include <unixio.h> /* for off_t */
+# endif
+# define z_off_t off_t
+#endif
+#ifndef SEEK_SET
+# define SEEK_SET 0 /* Seek from beginning of file. */
+# define SEEK_CUR 1 /* Seek from current position. */
+# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
+#endif
+#ifndef z_off_t
+# define z_off_t long
+#endif
+
+#if defined(__OS400__)
+# define NO_vsnprintf
+#endif
+
+#if defined(__MVS__)
+# define NO_vsnprintf
+# ifdef FAR
+# undef FAR
+# endif
+#endif
+
+/* MVS linker does not support external names larger than 8 bytes */
+#if defined(__MVS__)
+# pragma map(deflateInit_,"DEIN")
+# pragma map(deflateInit2_,"DEIN2")
+# pragma map(deflateEnd,"DEEND")
+# pragma map(deflateBound,"DEBND")
+# pragma map(inflateInit_,"ININ")
+# pragma map(inflateInit2_,"ININ2")
+# pragma map(inflateEnd,"INEND")
+# pragma map(inflateSync,"INSY")
+# pragma map(inflateSetDictionary,"INSEDI")
+# pragma map(compressBound,"CMBND")
+# pragma map(inflate_table,"INTABL")
+# pragma map(inflate_fast,"INFA")
+# pragma map(inflate_copyright,"INCOPY")
+#endif
+
+#endif /* ZCONF_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/zip.c Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,1243 @@
+/* zip.c -- IO on .zip files using zlib
+ Version 1.01e, February 12th, 2005
+
+ 27 Dec 2004 Rolf Kalbermatter
+ Modification to zipOpen2 to support globalComment retrieval.
+
+ Copyright (C) 1998-2005 Gilles Vollant
+
+ Read zip.h for more info
+
+ Modified by Sergey A. Tachenov to integrate with Qt.
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "zlib.h"
+#include "zip.h"
+#include "quazip_global.h"
+
+#ifdef STDC
+# include <stddef.h>
+# include <string.h>
+# include <stdlib.h>
+#endif
+#ifdef NO_ERRNO_H
+ extern int errno;
+#else
+# include <errno.h>
+#endif
+
+
+#ifndef local
+# define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+#ifndef VERSIONMADEBY
+# define VERSIONMADEBY (0x031e) /* best for standard pkware crypt */
+#endif
+
+#ifndef Z_BUFSIZE
+#define Z_BUFSIZE (16384)
+#endif
+
+#ifndef Z_MAXFILENAMEINZIP
+#define Z_MAXFILENAMEINZIP (256)
+#endif
+
+#ifndef ALLOC
+# define ALLOC(size) (malloc(size))
+#endif
+#ifndef TRYFREE
+# define TRYFREE(p) {if (p) free(p);}
+#endif
+
+/*
+#define SIZECENTRALDIRITEM (0x2e)
+#define SIZEZIPLOCALHEADER (0x1e)
+*/
+
+/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
+
+#ifndef SEEK_CUR
+#define SEEK_CUR 1
+#endif
+
+#ifndef SEEK_END
+#define SEEK_END 2
+#endif
+
+#ifndef SEEK_SET
+#define SEEK_SET 0
+#endif
+
+#ifndef DEF_MEM_LEVEL
+#if MAX_MEM_LEVEL >= 8
+# define DEF_MEM_LEVEL 8
+#else
+# define DEF_MEM_LEVEL MAX_MEM_LEVEL
+#endif
+#endif
+const char zip_copyright[] =
+ " zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
+
+
+#define SIZEDATA_INDATABLOCK (4096-(4*4))
+
+#define LOCALHEADERMAGIC (0x04034b50)
+#define DESCRIPTORHEADERMAGIC (0x08074b50)
+#define CENTRALHEADERMAGIC (0x02014b50)
+#define ENDHEADERMAGIC (0x06054b50)
+
+#define FLAG_LOCALHEADER_OFFSET (0x06)
+#define CRC_LOCALHEADER_OFFSET (0x0e)
+
+#define SIZECENTRALHEADER (0x2e) /* 46 */
+
+typedef struct linkedlist_datablock_internal_s
+{
+ struct linkedlist_datablock_internal_s* next_datablock;
+ uLong avail_in_this_block;
+ uLong filled_in_this_block;
+ uLong unused; /* for future use and alignement */
+ unsigned char data[SIZEDATA_INDATABLOCK];
+} linkedlist_datablock_internal;
+
+typedef struct linkedlist_data_s
+{
+ linkedlist_datablock_internal* first_block;
+ linkedlist_datablock_internal* last_block;
+} linkedlist_data;
+
+
+typedef struct
+{
+ z_stream stream; /* zLib stream structure for inflate */
+ int stream_initialised; /* 1 is stream is initialised */
+ uInt pos_in_buffered_data; /* last written byte in buffered_data */
+
+ uLong pos_local_header; /* offset of the local header of the file
+ currenty writing */
+ char* central_header; /* central header data for the current file */
+ uLong size_centralheader; /* size of the central header for cur file */
+ uLong flag; /* flag of the file currently writing */
+
+ int method; /* compression method of file currenty wr.*/
+ int raw; /* 1 for directly writing raw data */
+ Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/
+ uLong dosDate;
+ uLong crc32;
+ int encrypt;
+#ifndef NOCRYPT
+ unsigned long keys[3]; /* keys defining the pseudo-random sequence */
+ const unsigned long* pcrc_32_tab;
+ int crypt_header_size;
+#endif
+} curfile_info;
+
+typedef struct
+{
+ zlib_filefunc_def z_filefunc;
+ voidpf filestream; /* io structore of the zipfile */
+ linkedlist_data central_dir;/* datablock with central dir in construction*/
+ int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/
+ curfile_info ci; /* info on the file curretly writing */
+
+ uLong begin_pos; /* position of the beginning of the zipfile */
+ uLong add_position_when_writting_offset;
+ uLong number_entry;
+#ifndef NO_ADDFILEINEXISTINGZIP
+ char *globalcomment;
+#endif
+} zip_internal;
+
+
+
+#ifndef NOCRYPT
+#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED
+#include "crypt.h"
+#endif
+
+local linkedlist_datablock_internal* allocate_new_datablock()
+{
+ linkedlist_datablock_internal* ldi;
+ ldi = (linkedlist_datablock_internal*)
+ ALLOC(sizeof(linkedlist_datablock_internal));
+ if (ldi!=NULL)
+ {
+ ldi->next_datablock = NULL ;
+ ldi->filled_in_this_block = 0 ;
+ ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ;
+ }
+ return ldi;
+}
+
+local void free_datablock(ldi)
+ linkedlist_datablock_internal* ldi;
+{
+ while (ldi!=NULL)
+ {
+ linkedlist_datablock_internal* ldinext = ldi->next_datablock;
+ TRYFREE(ldi);
+ ldi = ldinext;
+ }
+}
+
+local void init_linkedlist(ll)
+ linkedlist_data* ll;
+{
+ ll->first_block = ll->last_block = NULL;
+}
+
+#if 0 // unused
+local void free_linkedlist(ll)
+ linkedlist_data* ll;
+{
+ free_datablock(ll->first_block);
+ ll->first_block = ll->last_block = NULL;
+}
+#endif
+
+local int add_data_in_datablock(ll,buf,len)
+ linkedlist_data* ll;
+ const void* buf;
+ uLong len;
+{
+ linkedlist_datablock_internal* ldi;
+ const unsigned char* from_copy;
+
+ if (ll==NULL)
+ return ZIP_INTERNALERROR;
+
+ if (ll->last_block == NULL)
+ {
+ ll->first_block = ll->last_block = allocate_new_datablock();
+ if (ll->first_block == NULL)
+ return ZIP_INTERNALERROR;
+ }
+
+ ldi = ll->last_block;
+ from_copy = (unsigned char*)buf;
+
+ while (len>0)
+ {
+ uInt copy_this;
+ uInt i;
+ unsigned char* to_copy;
+
+ if (ldi->avail_in_this_block==0)
+ {
+ ldi->next_datablock = allocate_new_datablock();
+ if (ldi->next_datablock == NULL)
+ return ZIP_INTERNALERROR;
+ ldi = ldi->next_datablock ;
+ ll->last_block = ldi;
+ }
+
+ if (ldi->avail_in_this_block < len)
+ copy_this = (uInt)ldi->avail_in_this_block;
+ else
+ copy_this = (uInt)len;
+
+ to_copy = &(ldi->data[ldi->filled_in_this_block]);
+
+ for (i=0;i<copy_this;i++)
+ *(to_copy+i)=*(from_copy+i);
+
+ ldi->filled_in_this_block += copy_this;
+ ldi->avail_in_this_block -= copy_this;
+ from_copy += copy_this ;
+ len -= copy_this;
+ }
+ return ZIP_OK;
+}
+
+
+
+/****************************************************************************/
+
+#ifndef NO_ADDFILEINEXISTINGZIP
+/* ===========================================================================
+ Inputs a long in LSB order to the given file
+ nbByte == 1, 2 or 4 (byte, short or long)
+*/
+
+local int ziplocal_putValue OF((const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream, uLong x, int nbByte));
+local int ziplocal_putValue (pzlib_filefunc_def, filestream, x, nbByte)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+ uLong x;
+ int nbByte;
+{
+ unsigned char buf[4];
+ int n;
+ for (n = 0; n < nbByte; n++)
+ {
+ buf[n] = (unsigned char)(x & 0xff);
+ x >>= 8;
+ }
+ if (x != 0)
+ { /* data overflow - hack for ZIP64 (X Roche) */
+ for (n = 0; n < nbByte; n++)
+ {
+ buf[n] = 0xff;
+ }
+ }
+
+ if (ZWRITE(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte)
+ return ZIP_ERRNO;
+ else
+ return ZIP_OK;
+}
+
+local void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte));
+local void ziplocal_putValue_inmemory (dest, x, nbByte)
+ void* dest;
+ uLong x;
+ int nbByte;
+{
+ unsigned char* buf=(unsigned char*)dest;
+ int n;
+ for (n = 0; n < nbByte; n++) {
+ buf[n] = (unsigned char)(x & 0xff);
+ x >>= 8;
+ }
+
+ if (x != 0)
+ { /* data overflow - hack for ZIP64 */
+ for (n = 0; n < nbByte; n++)
+ {
+ buf[n] = 0xff;
+ }
+ }
+}
+
+/****************************************************************************/
+
+
+local uLong ziplocal_TmzDateToDosDate(ptm,dosDate)
+ const tm_zip* ptm;
+ uLong dosDate UNUSED;
+{
+ uLong year = (uLong)ptm->tm_year;
+ if (year>1980)
+ year-=1980;
+ else if (year>80)
+ year-=80;
+ return
+ (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) |
+ ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour));
+}
+
+
+/****************************************************************************/
+
+local int ziplocal_getByte OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream,
+ int *pi));
+
+local int ziplocal_getByte(pzlib_filefunc_def,filestream,pi)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+ int *pi;
+{
+ unsigned char c;
+ int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1);
+ if (err==1)
+ {
+ *pi = (int)c;
+ return ZIP_OK;
+ }
+ else
+ {
+ if (ZERROR(*pzlib_filefunc_def,filestream))
+ return ZIP_ERRNO;
+ else
+ return ZIP_EOF;
+ }
+}
+
+
+/* ===========================================================================
+ Reads a long in LSB order from the given gz_stream. Sets
+*/
+local int ziplocal_getShort OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream,
+ uLong *pX));
+
+local int ziplocal_getShort (pzlib_filefunc_def,filestream,pX)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+ uLong *pX;
+{
+ uLong x ;
+ int i;
+ int err;
+
+ err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x = (uLong)i;
+
+ if (err==ZIP_OK)
+ err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<8;
+
+ if (err==ZIP_OK)
+ *pX = x;
+ else
+ *pX = 0;
+ return err;
+}
+
+local int ziplocal_getLong OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream,
+ uLong *pX));
+
+local int ziplocal_getLong (pzlib_filefunc_def,filestream,pX)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+ uLong *pX;
+{
+ uLong x ;
+ int i;
+ int err;
+
+ err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x = (uLong)i;
+
+ if (err==ZIP_OK)
+ err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<8;
+
+ if (err==ZIP_OK)
+ err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<16;
+
+ if (err==ZIP_OK)
+ err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<24;
+
+ if (err==ZIP_OK)
+ *pX = x;
+ else
+ *pX = 0;
+ return err;
+}
+
+#ifndef BUFREADCOMMENT
+#define BUFREADCOMMENT (0x400)
+#endif
+/*
+ Locate the Central directory of a zipfile (at the end, just before
+ the global comment)
+*/
+local uLong ziplocal_SearchCentralDir OF((
+ const zlib_filefunc_def* pzlib_filefunc_def,
+ voidpf filestream));
+
+local uLong ziplocal_SearchCentralDir(pzlib_filefunc_def,filestream)
+ const zlib_filefunc_def* pzlib_filefunc_def;
+ voidpf filestream;
+{
+ unsigned char* buf;
+ uLong uSizeFile;
+ uLong uBackRead;
+ uLong uMaxBack=0xffff; /* maximum size of global comment */
+ uLong uPosFound=0;
+
+ if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
+ return 0;
+
+
+ uSizeFile = ZTELL(*pzlib_filefunc_def,filestream);
+
+ if (uMaxBack>uSizeFile)
+ uMaxBack = uSizeFile;
+
+ buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
+ if (buf==NULL)
+ return 0;
+
+ uBackRead = 4;
+ while (uBackRead<uMaxBack)
+ {
+ uLong uReadSize,uReadPos ;
+ int i;
+ if (uBackRead+BUFREADCOMMENT>uMaxBack)
+ uBackRead = uMaxBack;
+ else
+ uBackRead+=BUFREADCOMMENT;
+ uReadPos = uSizeFile-uBackRead ;
+
+ uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+ (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);
+ if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ break;
+
+ if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
+ break;
+
+ for (i=(int)uReadSize-3; (i--)>0;)
+ if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
+ ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
+ {
+ uPosFound = uReadPos+i;
+ break;
+ }
+
+ if (uPosFound!=0)
+ break;
+ }
+ TRYFREE(buf);
+ return uPosFound;
+}
+#endif /* !NO_ADDFILEINEXISTINGZIP*/
+
+/************************************************************/
+extern zipFile ZEXPORT zipOpen2 (file, append, globalcomment, pzlib_filefunc_def)
+ voidpf file;
+ int append;
+ zipcharpc* globalcomment;
+ zlib_filefunc_def* pzlib_filefunc_def;
+{
+ zip_internal ziinit;
+ zip_internal* zi;
+ int err=ZIP_OK;
+
+
+ if (pzlib_filefunc_def==NULL)
+ fill_qiodevice_filefunc(&ziinit.z_filefunc);
+ else
+ ziinit.z_filefunc = *pzlib_filefunc_def;
+
+ ziinit.filestream = (*(ziinit.z_filefunc.zopen_file))
+ (ziinit.z_filefunc.opaque,
+ file,
+ (append == APPEND_STATUS_CREATE) ?
+ (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) :
+ (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING));
+
+ if (ziinit.filestream == NULL)
+ return NULL;
+ ziinit.begin_pos = ZTELL(ziinit.z_filefunc,ziinit.filestream);
+ ziinit.in_opened_file_inzip = 0;
+ ziinit.ci.stream_initialised = 0;
+ ziinit.number_entry = 0;
+ ziinit.add_position_when_writting_offset = 0;
+ init_linkedlist(&(ziinit.central_dir));
+
+
+ zi = (zip_internal*)ALLOC(sizeof(zip_internal));
+ if (zi==NULL)
+ {
+ ZCLOSE(ziinit.z_filefunc,ziinit.filestream);
+ return NULL;
+ }
+
+ /* now we add file in a zipfile */
+# ifndef NO_ADDFILEINEXISTINGZIP
+ ziinit.globalcomment = NULL;
+ if (append == APPEND_STATUS_ADDINZIP)
+ {
+ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+
+ uLong size_central_dir; /* size of the central directory */
+ uLong offset_central_dir; /* offset of start of central directory */
+ uLong central_pos,uL;
+
+ uLong number_disk; /* number of the current dist, used for
+ spaning ZIP, unsupported, always 0*/
+ uLong number_disk_with_CD; /* number the the disk with central dir, used
+ for spaning ZIP, unsupported, always 0*/
+ uLong number_entry;
+ uLong number_entry_CD; /* total number of entries in
+ the central dir
+ (same than number_entry on nospan) */
+ uLong size_comment;
+
+ central_pos = ziplocal_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream);
+ if (central_pos==0)
+ err=ZIP_ERRNO;
+
+ if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
+ central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err=ZIP_ERRNO;
+
+ /* the signature, already checked */
+ if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&uL)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* number of this disk */
+ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* number of the disk with the start of the central directory */
+ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk_with_CD)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* total number of entries in the central dir on this disk */
+ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* total number of entries in the central dir */
+ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry_CD)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ if ((number_entry_CD!=number_entry) ||
+ (number_disk_with_CD!=0) ||
+ (number_disk!=0))
+ err=ZIP_BADZIPFILE;
+
+ /* size of the central directory */
+ if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&size_central_dir)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* offset of start of central directory with respect to the
+ starting disk number */
+ if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* zipfile global comment length */
+ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ if ((central_pos<offset_central_dir+size_central_dir) &&
+ (err==ZIP_OK))
+ err=ZIP_BADZIPFILE;
+
+ if (err!=ZIP_OK)
+ {
+ ZCLOSE(ziinit.z_filefunc, ziinit.filestream);
+ return NULL;
+ }
+
+ if (size_comment>0)
+ {
+ ziinit.globalcomment = ALLOC(size_comment+1);
+ if (ziinit.globalcomment)
+ {
+ size_comment = ZREAD(ziinit.z_filefunc, ziinit.filestream,ziinit.globalcomment,size_comment);
+ ziinit.globalcomment[size_comment]=0;
+ }
+ }
+
+ byte_before_the_zipfile = central_pos -
+ (offset_central_dir+size_central_dir);
+ ziinit.add_position_when_writting_offset = byte_before_the_zipfile;
+
+ {
+ uLong size_central_dir_to_read = size_central_dir;
+ size_t buf_size = SIZEDATA_INDATABLOCK;
+ void* buf_read = (void*)ALLOC(buf_size);
+ if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
+ offset_central_dir + byte_before_the_zipfile,
+ ZLIB_FILEFUNC_SEEK_SET) != 0)
+ err=ZIP_ERRNO;
+
+ while ((size_central_dir_to_read>0) && (err==ZIP_OK))
+ {
+ uLong read_this = SIZEDATA_INDATABLOCK;
+ if (read_this > size_central_dir_to_read)
+ read_this = size_central_dir_to_read;
+ if (ZREAD(ziinit.z_filefunc, ziinit.filestream,buf_read,read_this) != read_this)
+ err=ZIP_ERRNO;
+
+ if (err==ZIP_OK)
+ err = add_data_in_datablock(&ziinit.central_dir,buf_read,
+ (uLong)read_this);
+ size_central_dir_to_read-=read_this;
+ }
+ TRYFREE(buf_read);
+ }
+ ziinit.begin_pos = byte_before_the_zipfile;
+ ziinit.number_entry = number_entry_CD;
+
+ if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
+ offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err=ZIP_ERRNO;
+ }
+
+ if (globalcomment)
+ {
+ *globalcomment = ziinit.globalcomment;
+ }
+# endif /* !NO_ADDFILEINEXISTINGZIP*/
+
+ if (err != ZIP_OK)
+ {
+# ifndef NO_ADDFILEINEXISTINGZIP
+ TRYFREE(ziinit.globalcomment);
+# endif /* !NO_ADDFILEINEXISTINGZIP*/
+ TRYFREE(zi);
+ return NULL;
+ }
+ else
+ {
+ *zi = ziinit;
+ return (zipFile)zi;
+ }
+}
+
+extern zipFile ZEXPORT zipOpen (file, append)
+ voidpf file;
+ int append;
+{
+ return zipOpen2(file,append,NULL,NULL);
+}
+
+extern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi,
+ extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global,
+ comment, method, level, raw,
+ windowBits, memLevel, strategy,
+ password, crcForCrypting)
+ zipFile file;
+ const char* filename;
+ const zip_fileinfo* zipfi;
+ const void* extrafield_local;
+ uInt size_extrafield_local;
+ const void* extrafield_global;
+ uInt size_extrafield_global;
+ const char* comment;
+ int method;
+ int level;
+ int raw;
+ int windowBits;
+ int memLevel;
+ int strategy;
+ const char* password;
+ uLong crcForCrypting;
+{
+ zip_internal* zi;
+ uInt size_filename;
+ uInt size_comment;
+ uInt i;
+ int err = ZIP_OK;
+
+# ifdef NOCRYPT
+ if (password != NULL)
+ return ZIP_PARAMERROR;
+# endif
+
+ if (file == NULL)
+ return ZIP_PARAMERROR;
+ if ((method!=0) && (method!=Z_DEFLATED))
+ return ZIP_PARAMERROR;
+
+ zi = (zip_internal*)file;
+
+ if (zi->in_opened_file_inzip == 1)
+ {
+ err = zipCloseFileInZip (file);
+ if (err != ZIP_OK)
+ return err;
+ }
+
+
+ if (filename==NULL)
+ filename="-";
+
+ if (comment==NULL)
+ size_comment = 0;
+ else
+ size_comment = (uInt)strlen(comment);
+
+ size_filename = (uInt)strlen(filename);
+
+ if (zipfi == NULL)
+ zi->ci.dosDate = 0;
+ else
+ {
+ if (zipfi->dosDate != 0)
+ zi->ci.dosDate = zipfi->dosDate;
+ else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate);
+ }
+
+ zi->ci.flag = 0;
+ if ((level==8) || (level==9))
+ zi->ci.flag |= 2;
+ if ((level==2))
+ zi->ci.flag |= 4;
+ if ((level==1))
+ zi->ci.flag |= 6;
+ if (password != NULL)
+ {
+ zi->ci.flag |= 1;
+ }
+ zi->ci.flag |= 8;
+ zi->ci.crc32 = 0;
+ zi->ci.method = method;
+ zi->ci.encrypt = 0;
+ zi->ci.stream_initialised = 0;
+ zi->ci.pos_in_buffered_data = 0;
+ zi->ci.raw = raw;
+ zi->ci.pos_local_header = ZTELL(zi->z_filefunc,zi->filestream) ;
+ zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename +
+ size_extrafield_global + size_comment;
+ zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader);
+
+ ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4);
+ /* version info */
+ ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4);
+ ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/
+ ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/
+ ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/
+ ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/
+
+ if (zipfi==NULL)
+ ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2);
+ else
+ ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2);
+
+ if (zipfi==NULL)
+ ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4);
+ else
+ ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4);
+
+ ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header- zi->add_position_when_writting_offset,4);
+
+ for (i=0;i<size_filename;i++)
+ *(zi->ci.central_header+SIZECENTRALHEADER+i) = *(filename+i);
+
+ for (i=0;i<size_extrafield_global;i++)
+ *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+i) =
+ *(((const char*)extrafield_global)+i);
+
+ for (i=0;i<size_comment;i++)
+ *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+
+ size_extrafield_global+i) = *(comment+i);
+ if (zi->ci.central_header == NULL)
+ return ZIP_INTERNALERROR;
+
+ /* write the local header */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC,4);
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2);
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2);
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4);
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2);
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield_local,2);
+
+ if ((err==ZIP_OK) && (size_filename>0))
+ if (ZWRITE(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename)
+ err = ZIP_ERRNO;
+
+ if ((err==ZIP_OK) && (size_extrafield_local>0))
+ if (ZWRITE(zi->z_filefunc,zi->filestream,extrafield_local,size_extrafield_local)
+ !=size_extrafield_local)
+ err = ZIP_ERRNO;
+
+ zi->ci.stream.avail_in = (uInt)0;
+ zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+ zi->ci.stream.next_out = zi->ci.buffered_data;
+ zi->ci.stream.total_in = 0;
+ zi->ci.stream.total_out = 0;
+
+ if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+ {
+ zi->ci.stream.zalloc = (alloc_func)0;
+ zi->ci.stream.zfree = (free_func)0;
+ zi->ci.stream.opaque = (voidpf)0;
+
+ if (windowBits>0)
+ windowBits = -windowBits;
+
+ err = deflateInit2(&zi->ci.stream, level,
+ Z_DEFLATED, windowBits, memLevel, strategy);
+
+ if (err==Z_OK)
+ zi->ci.stream_initialised = 1;
+ }
+# ifndef NOCRYPT
+ zi->ci.crypt_header_size = 0;
+ if ((err==Z_OK) && (password != NULL))
+ {
+ unsigned char bufHead[RAND_HEAD_LEN];
+ unsigned int sizeHead;
+ zi->ci.encrypt = 1;
+ zi->ci.pcrc_32_tab = get_crc_table();
+ /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/
+
+ crcForCrypting = (uLong)zi->ci.dosDate << 16; // ATTANTION! Without this row, you don't unpack your password protected archive in other app.
+
+ sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting);
+ zi->ci.crypt_header_size = sizeHead;
+
+ if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead)
+ err = ZIP_ERRNO;
+ }
+# endif
+
+ if (err==Z_OK)
+ zi->in_opened_file_inzip = 1;
+ return err;
+}
+
+extern int ZEXPORT zipOpenNewFileInZip2(file, filename, zipfi,
+ extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global,
+ comment, method, level, raw)
+ zipFile file;
+ const char* filename;
+ const zip_fileinfo* zipfi;
+ const void* extrafield_local;
+ uInt size_extrafield_local;
+ const void* extrafield_global;
+ uInt size_extrafield_global;
+ const char* comment;
+ int method;
+ int level;
+ int raw;
+{
+ return zipOpenNewFileInZip3 (file, filename, zipfi,
+ extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global,
+ comment, method, level, raw,
+ -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
+ NULL, 0);
+}
+
+extern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi,
+ extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global,
+ comment, method, level)
+ zipFile file;
+ const char* filename;
+ const zip_fileinfo* zipfi;
+ const void* extrafield_local;
+ uInt size_extrafield_local;
+ const void* extrafield_global;
+ uInt size_extrafield_global;
+ const char* comment;
+ int method;
+ int level;
+{
+ return zipOpenNewFileInZip2 (file, filename, zipfi,
+ extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global,
+ comment, method, level, 0);
+}
+
+local int zipFlushWriteBuffer(zi)
+ zip_internal* zi;
+{
+ int err=ZIP_OK;
+
+ if (zi->ci.encrypt != 0)
+ {
+#ifndef NOCRYPT
+ uInt i;
+ int t;
+ for (i=0;i<zi->ci.pos_in_buffered_data;i++)
+ zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab,
+ zi->ci.buffered_data[i],t);
+#endif
+ }
+ if (ZWRITE(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data)
+ !=zi->ci.pos_in_buffered_data)
+ err = ZIP_ERRNO;
+ zi->ci.pos_in_buffered_data = 0;
+ return err;
+}
+
+extern int ZEXPORT zipWriteInFileInZip (file, buf, len)
+ zipFile file;
+ const void* buf;
+ unsigned len;
+{
+ zip_internal* zi;
+ int err=ZIP_OK;
+
+ if (file == NULL)
+ return ZIP_PARAMERROR;
+ zi = (zip_internal*)file;
+
+ if (zi->in_opened_file_inzip == 0)
+ return ZIP_PARAMERROR;
+
+ zi->ci.stream.next_in = (void*)buf;
+ zi->ci.stream.avail_in = len;
+ zi->ci.crc32 = crc32(zi->ci.crc32,buf,len);
+
+ while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0))
+ {
+ if (zi->ci.stream.avail_out == 0)
+ {
+ if (zipFlushWriteBuffer(zi) == ZIP_ERRNO)
+ err = ZIP_ERRNO;
+ zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+ zi->ci.stream.next_out = zi->ci.buffered_data;
+ }
+
+
+ if(err != ZIP_OK)
+ break;
+
+ if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+ {
+ uLong uTotalOutBefore = zi->ci.stream.total_out;
+ err=deflate(&zi->ci.stream, Z_NO_FLUSH);
+ zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
+
+ }
+ else
+ {
+ uInt copy_this,i;
+ if (zi->ci.stream.avail_in < zi->ci.stream.avail_out)
+ copy_this = zi->ci.stream.avail_in;
+ else
+ copy_this = zi->ci.stream.avail_out;
+ for (i=0;i<copy_this;i++)
+ *(((char*)zi->ci.stream.next_out)+i) =
+ *(((const char*)zi->ci.stream.next_in)+i);
+ {
+ zi->ci.stream.avail_in -= copy_this;
+ zi->ci.stream.avail_out-= copy_this;
+ zi->ci.stream.next_in+= copy_this;
+ zi->ci.stream.next_out+= copy_this;
+ zi->ci.stream.total_in+= copy_this;
+ zi->ci.stream.total_out+= copy_this;
+ zi->ci.pos_in_buffered_data += copy_this;
+ }
+ }
+ }
+
+ return err;
+}
+
+extern int ZEXPORT zipCloseFileInZipRaw (file, uncompressed_size, crc32)
+ zipFile file;
+ uLong uncompressed_size;
+ uLong crc32;
+{
+ zip_internal* zi;
+ uLong compressed_size;
+ int err=ZIP_OK;
+
+ if (file == NULL)
+ return ZIP_PARAMERROR;
+ zi = (zip_internal*)file;
+
+ if (zi->in_opened_file_inzip == 0)
+ return ZIP_PARAMERROR;
+ zi->ci.stream.avail_in = 0;
+
+ if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+ while (err==ZIP_OK)
+ {
+ uLong uTotalOutBefore;
+ if (zi->ci.stream.avail_out == 0)
+ {
+ if (zipFlushWriteBuffer(zi) == ZIP_ERRNO)
+ err = ZIP_ERRNO;
+ zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+ zi->ci.stream.next_out = zi->ci.buffered_data;
+ }
+ uTotalOutBefore = zi->ci.stream.total_out;
+ err=deflate(&zi->ci.stream, Z_FINISH);
+ zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
+ }
+
+ if (err==Z_STREAM_END)
+ err=ZIP_OK; /* this is normal */
+
+ if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK))
+ if (zipFlushWriteBuffer(zi)==ZIP_ERRNO)
+ err = ZIP_ERRNO;
+
+ if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+ {
+ err=deflateEnd(&zi->ci.stream);
+ zi->ci.stream_initialised = 0;
+ }
+
+ if (!zi->ci.raw)
+ {
+ crc32 = (uLong)zi->ci.crc32;
+ uncompressed_size = (uLong)zi->ci.stream.total_in;
+ }
+ compressed_size = (uLong)zi->ci.stream.total_out;
+# ifndef NOCRYPT
+ compressed_size += zi->ci.crypt_header_size;
+# endif
+
+ ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/
+ ziplocal_putValue_inmemory(zi->ci.central_header+20,
+ compressed_size,4); /*compr size*/
+ if (zi->ci.stream.data_type == Z_ASCII)
+ ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+24,
+ uncompressed_size,4); /*uncompr size*/
+
+ if (err==ZIP_OK)
+ err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header,
+ (uLong)zi->ci.size_centralheader);
+ free(zi->ci.central_header);
+
+ if (err==ZIP_OK)
+ {
+ uLong cur_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream);
+ if (ZSEEK(zi->z_filefunc,zi->filestream,
+ zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err = ZIP_ERRNO;
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */
+
+ if (err==ZIP_OK) /* compressed size, unknown */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4);
+
+ if (err==ZIP_OK) /* uncompressed size, unknown */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4);
+
+ if (ZSEEK(zi->z_filefunc,zi->filestream,
+ cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err = ZIP_ERRNO;
+
+ /* Write local Descriptor after file data */
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)DESCRIPTORHEADERMAGIC,4);
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */
+
+ if (err==ZIP_OK) /* compressed size, unknown */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4);
+
+ if (err==ZIP_OK) /* uncompressed size, unknown */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4);
+
+
+ }
+
+ zi->number_entry ++;
+ zi->in_opened_file_inzip = 0;
+
+ return err;
+}
+
+extern int ZEXPORT zipCloseFileInZip (file)
+ zipFile file;
+{
+ return zipCloseFileInZipRaw (file,0,0);
+}
+
+extern int ZEXPORT zipClose (file, global_comment)
+ zipFile file;
+ const char* global_comment;
+{
+ zip_internal* zi;
+ int err = 0;
+ uLong size_centraldir = 0;
+ uLong centraldir_pos_inzip;
+ uInt size_global_comment;
+ if (file == NULL)
+ return ZIP_PARAMERROR;
+ zi = (zip_internal*)file;
+
+ if (zi->in_opened_file_inzip == 1)
+ {
+ err = zipCloseFileInZip (file);
+ }
+
+#ifndef NO_ADDFILEINEXISTINGZIP
+ if (global_comment==NULL)
+ global_comment = zi->globalcomment;
+#endif
+ if (global_comment==NULL)
+ size_global_comment = 0;
+ else
+ size_global_comment = (uInt)strlen(global_comment);
+
+ centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream);
+ if (err==ZIP_OK)
+ {
+ linkedlist_datablock_internal* ldi = zi->central_dir.first_block ;
+ while (ldi!=NULL)
+ {
+ if ((err==ZIP_OK) && (ldi->filled_in_this_block>0))
+ if (ZWRITE(zi->z_filefunc,zi->filestream,
+ ldi->data,ldi->filled_in_this_block)
+ !=ldi->filled_in_this_block )
+ err = ZIP_ERRNO;
+
+ size_centraldir += ldi->filled_in_this_block;
+ ldi = ldi->next_datablock;
+ }
+ }
+ free_datablock(zi->central_dir.first_block);
+
+ if (err==ZIP_OK) /* Magic End */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4);
+
+ if (err==ZIP_OK) /* number of this disk */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);
+
+ if (err==ZIP_OK) /* number of the disk with the start of the central directory */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);
+
+ if (err==ZIP_OK) /* total number of entries in the central dir on this disk */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);
+
+ if (err==ZIP_OK) /* total number of entries in the central dir */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);
+
+ if (err==ZIP_OK) /* size of the central directory */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4);
+
+ if (err==ZIP_OK) /* offset of start of central directory with respect to the
+ starting disk number */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,
+ (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4);
+
+ if (err==ZIP_OK) /* zipfile comment length */
+ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2);
+
+ if ((err==ZIP_OK) && (size_global_comment>0))
+ if (ZWRITE(zi->z_filefunc,zi->filestream,
+ global_comment,size_global_comment) != size_global_comment)
+ err = ZIP_ERRNO;
+
+ if (ZCLOSE(zi->z_filefunc,zi->filestream) != 0)
+ if (err == ZIP_OK)
+ err = ZIP_ERRNO;
+
+#ifndef NO_ADDFILEINEXISTINGZIP
+ TRYFREE(zi->globalcomment);
+#endif
+ TRYFREE(zi);
+
+ return err;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/zip.h Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,237 @@
+/* zip.h -- IO for compress .zip files using zlib
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+
+ This unzip package allow creates .ZIP file, compatible with PKZip 2.04g
+ WinZip, InfoZip tools and compatible.
+ Multi volume ZipFile (span) are not supported.
+ Encryption compatible with pkzip 2.04g only supported
+ Old compressions used by old PKZip 1.x are not supported
+
+ For uncompress .zip file, look at unzip.h
+
+
+ I WAIT FEEDBACK at mail info@winimage.com
+ Visit also http://www.winimage.com/zLibDll/unzip.html for evolution
+
+ Condition of use and distribution are the same than zlib :
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Modified by Sergey A. Tachenov to integrate with Qt.
+
+
+*/
+
+/* for more info about .ZIP format, see
+ http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip
+ http://www.info-zip.org/pub/infozip/doc/
+ PkWare has also a specification at :
+ ftp://ftp.pkware.com/probdesc.zip
+*/
+
+#ifndef _zip_H
+#define _zip_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _ZLIB_H
+#include "zlib.h"
+#endif
+
+#ifndef _ZLIBIOAPI_H
+#include "ioapi.h"
+#endif
+
+#if defined(STRICTZIP) || defined(STRICTZIPUNZIP)
+/* like the STRICT of WIN32, we define a pointer that cannot be converted
+ from (void*) without cast */
+typedef struct TagzipFile__ { int unused; } zipFile__;
+typedef zipFile__ *zipFile;
+#else
+typedef voidp zipFile;
+#endif
+
+#define ZIP_OK (0)
+#define ZIP_EOF (0)
+#define ZIP_ERRNO (Z_ERRNO)
+#define ZIP_PARAMERROR (-102)
+#define ZIP_BADZIPFILE (-103)
+#define ZIP_INTERNALERROR (-104)
+
+#ifndef DEF_MEM_LEVEL
+# if MAX_MEM_LEVEL >= 8
+# define DEF_MEM_LEVEL 8
+# else
+# define DEF_MEM_LEVEL MAX_MEM_LEVEL
+# endif
+#endif
+/* default memLevel */
+
+/* tm_zip contain date/time info */
+typedef struct tm_zip_s
+{
+ uInt tm_sec; /* seconds after the minute - [0,59] */
+ uInt tm_min; /* minutes after the hour - [0,59] */
+ uInt tm_hour; /* hours since midnight - [0,23] */
+ uInt tm_mday; /* day of the month - [1,31] */
+ uInt tm_mon; /* months since January - [0,11] */
+ uInt tm_year; /* years - [1980..2044] */
+} tm_zip;
+
+typedef struct
+{
+ tm_zip tmz_date; /* date in understandable format */
+ uLong dosDate; /* if dos_date == 0, tmu_date is used */
+/* uLong flag; */ /* general purpose bit flag 2 bytes */
+
+ uLong internal_fa; /* internal file attributes 2 bytes */
+ uLong external_fa; /* external file attributes 4 bytes */
+} zip_fileinfo;
+
+typedef const char* zipcharpc;
+
+
+#define APPEND_STATUS_CREATE (0)
+#define APPEND_STATUS_CREATEAFTER (1)
+#define APPEND_STATUS_ADDINZIP (2)
+
+extern zipFile ZEXPORT zipOpen OF((voidpf file, int append));
+/*
+ Create a zipfile.
+ file is whatever the IO API accepts. For Qt IO API it's a pointer to
+ QIODevice. For fopen() IO API it's a file name (const char*).
+ if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip
+ will be created at the end of the file.
+ (useful if the file contain a self extractor code)
+ if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will
+ add files in existing zip (be sure you don't add file that doesn't exist)
+ If the zipfile cannot be opened, the return value is NULL.
+ Else, the return value is a zipFile Handle, usable with other function
+ of this zip package.
+*/
+
+/* Note : there is no delete function into a zipfile.
+ If you want delete file into a zipfile, you must open a zipfile, and create another
+ Of couse, you can use RAW reading and writing to copy the file you did not want delte
+*/
+
+extern zipFile ZEXPORT zipOpen2 OF((voidpf file,
+ int append,
+ zipcharpc* globalcomment,
+ zlib_filefunc_def* pzlib_filefunc_def));
+
+extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file,
+ const char* filename,
+ const zip_fileinfo* zipfi,
+ const void* extrafield_local,
+ uInt size_extrafield_local,
+ const void* extrafield_global,
+ uInt size_extrafield_global,
+ const char* comment,
+ int method,
+ int level));
+/*
+ Open a file in the ZIP for writing.
+ filename : the filename in zip (if NULL, '-' without quote will be used
+ *zipfi contain supplemental information
+ if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local
+ contains the extrafield data the the local header
+ if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global
+ contains the extrafield data the the local header
+ if comment != NULL, comment contain the comment string
+ method contain the compression method (0 for store, Z_DEFLATED for deflate)
+ level contain the level of compression (can be Z_DEFAULT_COMPRESSION)
+*/
+
+
+extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file,
+ const char* filename,
+ const zip_fileinfo* zipfi,
+ const void* extrafield_local,
+ uInt size_extrafield_local,
+ const void* extrafield_global,
+ uInt size_extrafield_global,
+ const char* comment,
+ int method,
+ int level,
+ int raw));
+
+/*
+ Same than zipOpenNewFileInZip, except if raw=1, we write raw file
+ */
+
+extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file,
+ const char* filename,
+ const zip_fileinfo* zipfi,
+ const void* extrafield_local,
+ uInt size_extrafield_local,
+ const void* extrafield_global,
+ uInt size_extrafield_global,
+ const char* comment,
+ int method,
+ int level,
+ int raw,
+ int windowBits,
+ int memLevel,
+ int strategy,
+ const char* password,
+ uLong crcForCtypting));
+
+/*
+ Same than zipOpenNewFileInZip2, except
+ windowBits,memLevel,,strategy : see parameter strategy in deflateInit2
+ password : crypting password (NULL for no crypting)
+ crcForCtypting : crc of file to compress (needed for crypting)
+ */
+
+
+extern int ZEXPORT zipWriteInFileInZip OF((zipFile file,
+ const void* buf,
+ unsigned len));
+/*
+ Write data in the zipfile
+*/
+
+extern int ZEXPORT zipCloseFileInZip OF((zipFile file));
+/*
+ Close the current file in the zipfile
+*/
+
+extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file,
+ uLong uncompressed_size,
+ uLong crc32));
+/*
+ Close the current file in the zipfile, for fiel opened with
+ parameter raw=1 in zipOpenNewFileInZip2
+ uncompressed_size and crc32 are value for the uncompressed size
+*/
+
+extern int ZEXPORT zipClose OF((zipFile file,
+ const char* global_comment));
+/*
+ Close the zipfile
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _zip_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/quazip/zlib.h Sat Oct 08 16:45:52 2011 +0200
@@ -0,0 +1,1368 @@
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+ version 1.2.3, July 18th, 2005
+
+ Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+
+ The data format used by the zlib library is described by RFCs (Request for
+ Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt
+ (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
+*/
+
+#ifndef ZLIB_H
+#define ZLIB_H
+
+#include "zconf.h"
+#include "qconfig.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ZLIB_VERSION "1.2.3"
+#define ZLIB_VERNUM 0x1230
+
+#if defined(QT_VISIBILITY_AVAILABLE)
+# define Q_ZEXPORT __attribute__((visibility("default")))
+#else
+# ifdef QT_MAKEDLL
+# define Q_ZEXPORT __declspec(dllexport)
+# else
+# define Q_ZEXPORT ZEXPORT
+# endif
+#endif
+
+/*
+ The 'zlib' compression library provides in-memory compression and
+ decompression functions, including integrity checks of the uncompressed
+ data. This version of the library supports only one compression method
+ (deflation) but other algorithms will be added later and will have the same
+ stream interface.
+
+ Compression can be done in a single step if the buffers are large
+ enough (for example if an input file is mmap'ed), or can be done by
+ repeated calls of the compression function. In the latter case, the
+ application must provide more input and/or consume the output
+ (providing more output space) before each call.
+
+ The compressed data format used by default by the in-memory functions is
+ the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped
+ around a deflate stream, which is itself documented in RFC 1951.
+
+ The library also supports reading and writing files in gzip (.gz) format
+ with an interface similar to that of stdio using the functions that start
+ with "gz". The gzip format is different from the zlib format. gzip is a
+ gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.
+
+ This library can optionally read and write gzip streams in memory as well.
+
+ The zlib format was designed to be compact and fast for use in memory
+ and on communications channels. The gzip format was designed for single-
+ file compression on file systems, has a larger header than zlib to maintain
+ directory information, and uses a different, slower check method than zlib.
+
+ The library does not install any signal handler. The decoder checks
+ the consistency of the compressed data, so the library should never
+ crash even in case of corrupted input.
+*/
+
+typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
+typedef void (*free_func) OF((voidpf opaque, voidpf address));
+
+struct internal_state;
+
+typedef struct z_stream_s {
+ Bytef *next_in; /* next input byte */
+ uInt avail_in; /* number of bytes available at next_in */
+ uLong total_in; /* total nb of input bytes read so far */
+
+ Bytef *next_out; /* next output byte should be put there */
+ uInt avail_out; /* remaining free space at next_out */
+ uLong total_out; /* total nb of bytes output so far */
+
+ char *msg; /* last error message, NULL if no error */
+ struct internal_state FAR *state; /* not visible by applications */
+
+ alloc_func zalloc; /* used to allocate the internal state */
+ free_func zfree; /* used to free the internal state */
+ voidpf opaque; /* private data object passed to zalloc and zfree */
+
+ int data_type; /* best guess about the data type: binary or text */
+ uLong adler; /* adler32 value of the uncompressed data */
+ uLong reserved; /* reserved for future use */
+} z_stream;
+
+typedef z_stream FAR *z_streamp;
+
+/*
+ gzip header information passed to and from zlib routines. See RFC 1952
+ for more details on the meanings of these fields.
+*/
+typedef struct gz_header_s {
+ int text; /* true if compressed data believed to be text */
+ uLong time; /* modification time */
+ int xflags; /* extra flags (not used when writing a gzip file) */
+ int os; /* operating system */
+ Bytef *extra; /* pointer to extra field or Z_NULL if none */
+ uInt extra_len; /* extra field length (valid if extra != Z_NULL) */
+ uInt extra_max; /* space at extra (only when reading header) */
+ Bytef *name; /* pointer to zero-terminated file name or Z_NULL */
+ uInt name_max; /* space at name (only when reading header) */
+ Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */
+ uInt comm_max; /* space at comment (only when reading header) */
+ int hcrc; /* true if there was or will be a header crc */
+ int done; /* true when done reading gzip header (not used
+ when writing a gzip file) */
+} gz_header;
+
+typedef gz_header FAR *gz_headerp;
+
+/*
+ The application must update next_in and avail_in when avail_in has
+ dropped to zero. It must update next_out and avail_out when avail_out
+ has dropped to zero. The application must initialize zalloc, zfree and
+ opaque before calling the init function. All other fields are set by the
+ compression library and must not be updated by the application.
+
+ The opaque value provided by the application will be passed as the first
+ parameter for calls of zalloc and zfree. This can be useful for custom
+ memory management. The compression library attaches no meaning to the
+ opaque value.
+
+ zalloc must return Z_NULL if there is not enough memory for the object.
+ If zlib is used in a multi-threaded application, zalloc and zfree must be
+ thread safe.
+
+ On 16-bit systems, the functions zalloc and zfree must be able to allocate
+ exactly 65536 bytes, but will not be required to allocate more than this
+ if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
+ pointers returned by zalloc for objects of exactly 65536 bytes *must*
+ have their offset normalized to zero. The default allocation function
+ provided by this library ensures this (see zutil.c). To reduce memory
+ requirements and avoid any allocation of 64K objects, at the expense of
+ compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
+
+ The fields total_in and total_out can be used for statistics or
+ progress reports. After compression, total_in holds the total size of
+ the uncompressed data and may be saved for use in the decompressor
+ (particularly if the decompressor wants to decompress everything in
+ a single step).
+*/
+
+ /* constants */
+
+#define Z_NO_FLUSH 0
+#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
+#define Z_SYNC_FLUSH 2
+#define Z_FULL_FLUSH 3
+#define Z_FINISH 4
+#define Z_BLOCK 5
+/* Allowed flush values; see deflate() and inflate() below for details */
+
+#define Z_OK 0
+#define Z_STREAM_END 1
+#define Z_NEED_DICT 2
+#define Z_ERRNO (-1)
+#define Z_STREAM_ERROR (-2)
+#define Z_DATA_ERROR (-3)
+#define Z_MEM_ERROR (-4)
+#define Z_BUF_ERROR (-5)
+#define Z_VERSION_ERROR (-6)
+/* Return codes for the compression/decompression functions. Negative
+ * values are errors, positive values are used for special but normal events.
+ */
+
+#define Z_NO_COMPRESSION 0
+#define Z_BEST_SPEED 1
+#define Z_BEST_COMPRESSION 9
+#define Z_DEFAULT_COMPRESSION (-1)
+/* compression levels */
+
+#define Z_FILTERED 1
+#define Z_HUFFMAN_ONLY 2
+#define Z_RLE 3
+#define Z_FIXED 4
+#define Z_DEFAULT_STRATEGY 0
+/* compression strategy; see deflateInit2() below for details */
+
+#define Z_BINARY 0
+#define Z_TEXT 1
+#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */
+#define Z_UNKNOWN 2
+/* Possible values of the data_type field (though see inflate()) */
+
+#define Z_DEFLATED 8
+/* The deflate compression method (the only one supported in this version) */
+
+#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */
+
+#define zlib_version zlibVersion()
+/* for compatibility with versions < 1.0.2 */
+
+ /* basic functions */
+
+ZEXTERN Q_ZEXPORT const char * zlibVersion OF((void));
+/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
+ If the first character differs, the library code actually used is
+ not compatible with the zlib.h header file used by the application.
+ This check is automatically made by deflateInit and inflateInit.
+ */
+
+/*
+ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
+
+ Initializes the internal stream state for compression. The fields
+ zalloc, zfree and opaque must be initialized before by the caller.
+ If zalloc and zfree are set to Z_NULL, deflateInit updates them to
+ use default allocation functions.
+
+ The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
+ 1 gives best speed, 9 gives best compression, 0 gives no compression at
+ all (the input data is simply copied a block at a time).
+ Z_DEFAULT_COMPRESSION requests a default compromise between speed and
+ compression (currently equivalent to level 6).
+
+ deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if level is not a valid compression level,
+ Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
+ with the version assumed by the caller (ZLIB_VERSION).
+ msg is set to null if there is no error message. deflateInit does not
+ perform any compression: this will be done by deflate().
+*/
+
+
+ZEXTERN int Q_ZEXPORT deflate OF((z_streamp strm, int flush));
+/*
+ deflate compresses as much data as possible, and stops when the input
+ buffer becomes empty or the output buffer becomes full. It may introduce some
+ output latency (reading input without producing any output) except when
+ forced to flush.
+
+ The detailed semantics are as follows. deflate performs one or both of the
+ following actions:
+
+ - Compress more input starting at next_in and update next_in and avail_in
+ accordingly. If not all input can be processed (because there is not
+ enough room in the output buffer), next_in and avail_in are updated and
+ processing will resume at this point for the next call of deflate().
+
+ - Provide more output starting at next_out and update next_out and avail_out
+ accordingly. This action is forced if the parameter flush is non zero.
+ Forcing flush frequently degrades the compression ratio, so this parameter
+ should be set only when necessary (in interactive applications).
+ Some output may be provided even if flush is not set.
+
+ Before the call of deflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming
+ more output, and updating avail_in or avail_out accordingly; avail_out
+ should never be zero before the call. The application can consume the
+ compressed output when it wants, for example when the output buffer is full
+ (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK
+ and with zero avail_out, it must be called again after making room in the
+ output buffer because there might be more output pending.
+
+ Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to
+ decide how much data to accumualte before producing output, in order to
+ maximize compression.
+
+ If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
+ flushed to the output buffer and the output is aligned on a byte boundary, so
+ that the decompressor can get all input data available so far. (In particular
+ avail_in is zero after the call if enough output space has been provided
+ before the call.) Flushing may degrade compression for some compression
+ algorithms and so it should be used only when necessary.
+
+ If flush is set to Z_FULL_FLUSH, all output is flushed as with
+ Z_SYNC_FLUSH, and the compression state is reset so that decompression can
+ restart from this point if previous compressed data has been damaged or if
+ random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
+ compression.
+
+ If deflate returns with avail_out == 0, this function must be called again
+ with the same value of the flush parameter and more output space (updated
+ avail_out), until the flush is complete (deflate returns with non-zero
+ avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that
+ avail_out is greater than six to avoid repeated flush markers due to
+ avail_out == 0 on return.
+
+ If the parameter flush is set to Z_FINISH, pending input is processed,
+ pending output is flushed and deflate returns with Z_STREAM_END if there
+ was enough output space; if deflate returns with Z_OK, this function must be
+ called again with Z_FINISH and more output space (updated avail_out) but no
+ more input data, until it returns with Z_STREAM_END or an error. After
+ deflate has returned Z_STREAM_END, the only possible operations on the
+ stream are deflateReset or deflateEnd.
+
+ Z_FINISH can be used immediately after deflateInit if all the compression
+ is to be done in a single step. In this case, avail_out must be at least
+ the value returned by deflateBound (see below). If deflate does not return
+ Z_STREAM_END, then it must be called again as described above.
+
+ deflate() sets strm->adler to the adler32 checksum of all input read
+ so far (that is, total_in bytes).
+
+ deflate() may update strm->data_type if it can make a good guess about
+ the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered
+ binary. This field is only for information purposes and does not affect
+ the compression algorithm in any manner.
+
+ deflate() returns Z_OK if some progress has been made (more input
+ processed or more output produced), Z_STREAM_END if all input has been
+ consumed and all output has been produced (only when flush is set to
+ Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
+ if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible
+ (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not
+ fatal, and deflate() can be called again with more input and more output
+ space to continue compressing.
+*/
+
+
+ZEXTERN int Q_ZEXPORT deflateEnd OF((z_streamp strm));
+/*
+ All dynamically allocated data structures for this stream are freed.
+ This function discards any unprocessed input and does not flush any
+ pending output.
+
+ deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
+ stream state was inconsistent, Z_DATA_ERROR if the stream was freed
+ prematurely (some input or output was discarded). In the error case,
+ msg may be set but then points to a static string (which must not be
+ deallocated).
+*/
+
+
+/*
+ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
+
+ Initializes the internal stream state for decompression. The fields
+ next_in, avail_in, zalloc, zfree and opaque must be initialized before by
+ the caller. If next_in is not Z_NULL and avail_in is large enough (the exact
+ value depends on the compression method), inflateInit determines the
+ compression method from the zlib header and allocates all data structures
+ accordingly; otherwise the allocation will be deferred to the first call of
+ inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to
+ use default allocation functions.
+
+ inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
+ version assumed by the caller. msg is set to null if there is no error
+ message. inflateInit does not perform any decompression apart from reading
+ the zlib header if present: this will be done by inflate(). (So next_in and
+ avail_in may be modified, but next_out and avail_out are unchanged.)
+*/
+
+
+ZEXTERN int Q_ZEXPORT inflate OF((z_streamp strm, int flush));
+/*
+ inflate decompresses as much data as possible, and stops when the input
+ buffer becomes empty or the output buffer becomes full. It may introduce
+ some output latency (reading input without producing any output) except when
+ forced to flush.
+
+ The detailed semantics are as follows. inflate performs one or both of the
+ following actions:
+
+ - Decompress more input starting at next_in and update next_in and avail_in
+ accordingly. If not all input can be processed (because there is not
+ enough room in the output buffer), next_in is updated and processing
+ will resume at this point for the next call of inflate().
+
+ - Provide more output starting at next_out and update next_out and avail_out
+ accordingly. inflate() provides as much output as possible, until there
+ is no more input data or no more space in the output buffer (see below
+ about the flush parameter).
+
+ Before the call of inflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming
+ more output, and updating the next_* and avail_* values accordingly.
+ The application can consume the uncompressed output when it wants, for
+ example when the output buffer is full (avail_out == 0), or after each
+ call of inflate(). If inflate returns Z_OK and with zero avail_out, it
+ must be called again after making room in the output buffer because there
+ might be more output pending.
+
+ The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH,
+ Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much
+ output as possible to the output buffer. Z_BLOCK requests that inflate() stop
+ if and when it gets to the next deflate block boundary. When decoding the
+ zlib or gzip format, this will cause inflate() to return immediately after
+ the header and before the first block. When doing a raw inflate, inflate()
+ will go ahead and process the first block, and will return when it gets to
+ the end of that block, or when it runs out of data.
+
+ The Z_BLOCK option assists in appending to or combining deflate streams.
+ Also to assist in this, on return inflate() will set strm->data_type to the
+ number of unused bits in the last byte taken from strm->next_in, plus 64
+ if inflate() is currently decoding the last block in the deflate stream,
+ plus 128 if inflate() returned immediately after decoding an end-of-block
+ code or decoding the complete header up to just before the first byte of the
+ deflate stream. The end-of-block will not be indicated until all of the
+ uncompressed data from that block has been written to strm->next_out. The
+ number of unused bits may in general be greater than seven, except when
+ bit 7 of data_type is set, in which case the number of unused bits will be
+ less than eight.
+
+ inflate() should normally be called until it returns Z_STREAM_END or an
+ error. However if all decompression is to be performed in a single step
+ (a single call of inflate), the parameter flush should be set to
+ Z_FINISH. In this case all pending input is processed and all pending
+ output is flushed; avail_out must be large enough to hold all the
+ uncompressed data. (The size of the uncompressed data may have been saved
+ by the compressor for this purpose.) The next operation on this stream must
+ be inflateEnd to deallocate the decompression state. The use of Z_FINISH
+ is never required, but can be used to inform inflate that a faster approach
+ may be used for the single inflate() call.
+
+ In this implementation, inflate() always flushes as much output as
+ possible to the output buffer, and always uses the faster approach on the
+ first call. So the only effect of the flush parameter in this implementation
+ is on the return value of inflate(), as noted below, or when it returns early
+ because Z_BLOCK is used.
+
+ If a preset dictionary is needed after this call (see inflateSetDictionary
+ below), inflate sets strm->adler to the adler32 checksum of the dictionary
+ chosen by the compressor and returns Z_NEED_DICT; otherwise it sets
+ strm->adler to the adler32 checksum of all output produced so far (that is,
+ total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described
+ below. At the end of the stream, inflate() checks that its computed adler32
+ checksum is equal to that saved by the compressor and returns Z_STREAM_END
+ only if the checksum is correct.
+
+ inflate() will decompress and check either zlib-wrapped or gzip-wrapped
+ deflate data. The header type is detected automatically. Any information
+ contained in the gzip header is not retained, so applications that need that
+ information should instead use raw inflate, see inflateInit2() below, or
+ inflateBack() and perform their own processing of the gzip header and
+ trailer.
+
+ inflate() returns Z_OK if some progress has been made (more input processed
+ or more output produced), Z_STREAM_END if the end of the compressed data has
+ been reached and all uncompressed output has been produced, Z_NEED_DICT if a
+ preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
+ corrupted (input stream not conforming to the zlib format or incorrect check
+ value), Z_STREAM_ERROR if the stream structure was inconsistent (for example
+ if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory,
+ Z_BUF_ERROR if no progress is possible or if there was not enough room in the
+ output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and
+ inflate() can be called again with more input and more output space to
+ continue decompressing. If Z_DATA_ERROR is returned, the application may then
+ call inflateSync() to look for a good compression block if a partial recovery
+ of the data is desired.
+*/
+
+
+ZEXTERN int Q_ZEXPORT inflateEnd OF((z_streamp strm));
+/*
+ All dynamically allocated data structures for this stream are freed.
+ This function discards any unprocessed input and does not flush any
+ pending output.
+
+ inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
+ was inconsistent. In the error case, msg may be set but then points to a
+ static string (which must not be deallocated).
+*/
+
+ /* Advanced functions */
+
+/*
+ The following functions are needed only in some special applications.
+*/
+
+/*
+ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
+ int level,
+ int method,
+ int windowBits,
+ int memLevel,
+ int strategy));
+
+ This is another version of deflateInit with more compression options. The
+ fields next_in, zalloc, zfree and opaque must be initialized before by
+ the caller.
+
+ The method parameter is the compression method. It must be Z_DEFLATED in
+ this version of the library.
+
+ The windowBits parameter is the base two logarithm of the window size
+ (the size of the history buffer). It should be in the range 8..15 for this
+ version of the library. Larger values of this parameter result in better
+ compression at the expense of memory usage. The default value is 15 if
+ deflateInit is used instead.
+
+ windowBits can also be -8..-15 for raw deflate. In this case, -windowBits
+ determines the window size. deflate() will then generate raw deflate data
+ with no zlib header or trailer, and will not compute an adler32 check value.
+
+ windowBits can also be greater than 15 for optional gzip encoding. Add
+ 16 to windowBits to write a simple gzip header and trailer around the
+ compressed data instead of a zlib wrapper. The gzip header will have no
+ file name, no extra data, no comment, no modification time (set to zero),
+ no header crc, and the operating system will be set to 255 (unknown). If a
+ gzip stream is being written, strm->adler is a crc32 instead of an adler32.
+
+ The memLevel parameter specifies how much memory should be allocated
+ for the internal compression state. memLevel=1 uses minimum memory but
+ is slow and reduces compression ratio; memLevel=9 uses maximum memory
+ for optimal speed. The default value is 8. See zconf.h for total memory
+ usage as a function of windowBits and memLevel.
+
+ The strategy parameter is used to tune the compression algorithm. Use the
+ value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
+ filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no
+ string match), or Z_RLE to limit match distances to one (run-length
+ encoding). Filtered data consists mostly of small values with a somewhat
+ random distribution. In this case, the compression algorithm is tuned to
+ compress them better. The effect of Z_FILTERED is to force more Huffman
+ coding and less string matching; it is somewhat intermediate between
+ Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as
+ Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy
+ parameter only affects the compression ratio but not the correctness of the
+ compressed output even if it is not set appropriately. Z_FIXED prevents the
+ use of dynamic Huffman codes, allowing for a simpler decoder for special
+ applications.
+
+ deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid
+ method). msg is set to null if there is no error message. deflateInit2 does
+ not perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int Q_ZEXPORT deflateSetDictionary OF((z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength));
+/*
+ Initializes the compression dictionary from the given byte sequence
+ without producing any compressed output. This function must be called
+ immediately after deflateInit, deflateInit2 or deflateReset, before any
+ call of deflate. The compressor and decompressor must use exactly the same
+ dictionary (see inflateSetDictionary).
+
+ The dictionary should consist of strings (byte sequences) that are likely
+ to be encountered later in the data to be compressed, with the most commonly
+ used strings preferably put towards the end of the dictionary. Using a
+ dictionary is most useful when the data to be compressed is short and can be
+ predicted with good accuracy; the data can then be compressed better than
+ with the default empty dictionary.
+
+ Depending on the size of the compression data structures selected by
+ deflateInit or deflateInit2, a part of the dictionary may in effect be
+ discarded, for example if the dictionary is larger than the window size in
+ deflate or deflate2. Thus the strings most likely to be useful should be
+ put at the end of the dictionary, not at the front. In addition, the
+ current implementation of deflate will use at most the window size minus
+ 262 bytes of the provided dictionary.
+
+ Upon return of this function, strm->adler is set to the adler32 value
+ of the dictionary; the decompressor may later use this value to determine
+ which dictionary has been used by the compressor. (The adler32 value
+ applies to the whole dictionary even if only a subset of the dictionary is
+ actually used by the compressor.) If a raw deflate was requested, then the
+ adler32 value is not computed and strm->adler is not set.
+
+ deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
+ parameter is invalid (such as NULL dictionary) or the stream state is
+ inconsistent (for example if deflate has already been called for this stream
+ or if the compression method is bsort). deflateSetDictionary does not
+ perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int Q_ZEXPORT deflateCopy OF((z_streamp dest,
+ z_streamp source));
+/*
+ Sets the destination stream as a complete copy of the source stream.
+
+ This function can be useful when several compression strategies will be
+ tried, for example when there are several ways of pre-processing the input
+ data with a filter. The streams that will be discarded should then be freed
+ by calling deflateEnd. Note that deflateCopy duplicates the internal
+ compression state which can be quite large, so this strategy is slow and
+ can consume lots of memory.
+
+ deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+ (such as zalloc being NULL). msg is left unchanged in both source and
+ destination.
+*/
+
+ZEXTERN int Q_ZEXPORT deflateReset OF((z_streamp strm));
+/*
+ This function is equivalent to deflateEnd followed by deflateInit,
+ but does not free and reallocate all the internal compression state.
+ The stream will keep the same compression level and any other attributes
+ that may have been set by deflateInit2.
+
+ deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+ZEXTERN int Q_ZEXPORT deflateParams OF((z_streamp strm,
+ int level,
+ int strategy));
+/*
+ Dynamically update the compression level and compression strategy. The
+ interpretation of level and strategy is as in deflateInit2. This can be
+ used to switch between compression and straight copy of the input data, or
+ to switch to a different kind of input data requiring a different
+ strategy. If the compression level is changed, the input available so far
+ is compressed with the old level (and may be flushed); the new level will
+ take effect only at the next call of deflate().
+
+ Before the call of deflateParams, the stream state must be set as for
+ a call of deflate(), since the currently available input may have to
+ be compressed and flushed. In particular, strm->avail_out must be non-zero.
+
+ deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
+ stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR
+ if strm->avail_out was zero.
+*/
+
+ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,
+ int good_length,
+ int max_lazy,
+ int nice_length,
+ int max_chain));
+/*
+ Fine tune deflate's internal compression parameters. This should only be
+ used by someone who understands the algorithm used by zlib's deflate for
+ searching for the best matching string, and even then only by the most
+ fanatic optimizer trying to squeeze out the last compressed bit for their
+ specific input data. Read the deflate.c source code for the meaning of the
+ max_lazy, good_length, nice_length, and max_chain parameters.
+
+ deflateTune() can be called after deflateInit() or deflateInit2(), and
+ returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.
+ */
+
+ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,
+ uLong sourceLen));
+/*
+ deflateBound() returns an upper bound on the compressed size after
+ deflation of sourceLen bytes. It must be called after deflateInit()
+ or deflateInit2(). This would be used to allocate an output buffer
+ for deflation in a single pass, and so would be called before deflate().
+*/
+
+ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
+ int bits,
+ int value));
+/*
+ deflatePrime() inserts bits in the deflate output stream. The intent
+ is that this function is used to start off the deflate output with the
+ bits leftover from a previous deflate stream when appending to it. As such,
+ this function can only be used for raw deflate, and must be used before the
+ first deflate() call after a deflateInit2() or deflateReset(). bits must be
+ less than or equal to 16, and that many of the least significant bits of
+ value will be inserted in the output.
+
+ deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
+ gz_headerp head));
+/*
+ deflateSetHeader() provides gzip header information for when a gzip
+ stream is requested by deflateInit2(). deflateSetHeader() may be called
+ after deflateInit2() or deflateReset() and before the first call of
+ deflate(). The text, time, os, extra field, name, and comment information
+ in the provided gz_header structure are written to the gzip header (xflag is
+ ignored -- the extra flags are set according to the compression level). The
+ caller must assure that, if not Z_NULL, name and comment are terminated with
+ a zero byte, and that if extra is not Z_NULL, that extra_len bytes are
+ available there. If hcrc is true, a gzip header crc is included. Note that
+ the current versions of the command-line version of gzip (up through version
+ 1.3.x) do not support header crc's, and will report that it is a "multi-part
+ gzip file" and give up.
+
+ If deflateSetHeader is not used, the default gzip header has text false,
+ the time set to zero, and os set to 255, with no extra, name, or comment
+ fields. The gzip header is returned to the default state by deflateReset().
+
+ deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
+ int windowBits));
+
+ This is another version of inflateInit with an extra parameter. The
+ fields next_in, avail_in, zalloc, zfree and opaque must be initialized
+ before by the caller.
+
+ The windowBits parameter is the base two logarithm of the maximum window
+ size (the size of the history buffer). It should be in the range 8..15 for
+ this version of the library. The default value is 15 if inflateInit is used
+ instead. windowBits must be greater than or equal to the windowBits value
+ provided to deflateInit2() while compressing, or it must be equal to 15 if
+ deflateInit2() was not used. If a compressed stream with a larger window
+ size is given as input, inflate() will return with the error code
+ Z_DATA_ERROR instead of trying to allocate a larger window.
+
+ windowBits can also be -8..-15 for raw inflate. In this case, -windowBits
+ determines the window size. inflate() will then process raw deflate data,
+ not looking for a zlib or gzip header, not generating a check value, and not
+ looking for any check values for comparison at the end of the stream. This
+ is for use with other formats that use the deflate compressed data format
+ such as zip. Those formats provide their own check values. If a custom
+ format is developed using the raw deflate format for compressed data, it is
+ recommended that a check value such as an adler32 or a crc32 be applied to
+ the uncompressed data as is done in the zlib, gzip, and zip formats. For
+ most applications, the zlib format should be used as is. Note that comments
+ above on the use in deflateInit2() applies to the magnitude of windowBits.
+
+ windowBits can also be greater than 15 for optional gzip decoding. Add
+ 32 to windowBits to enable zlib and gzip decoding with automatic header
+ detection, or add 16 to decode only the gzip format (the zlib format will
+ return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is
+ a crc32 instead of an adler32.
+
+ inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg
+ is set to null if there is no error message. inflateInit2 does not perform
+ any decompression apart from reading the zlib header if present: this will
+ be done by inflate(). (So next_in and avail_in may be modified, but next_out
+ and avail_out are unchanged.)
+*/
+
+ZEXTERN int Q_ZEXPORT inflateSetDictionary OF((z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength));
+/*
+ Initializes the decompression dictionary from the given uncompressed byte
+ sequence. This function must be called immediately after a call of inflate,
+ if that call returned Z_NEED_DICT. The dictionary chosen by the compressor
+ can be determined from the adler32 value returned by that call of inflate.
+ The compressor and decompressor must use exactly the same dictionary (see
+ deflateSetDictionary). For raw inflate, this function can be called
+ immediately after inflateInit2() or inflateReset() and before any call of
+ inflate() to set the dictionary. The application must insure that the
+ dictionary that was used for compression is provided.
+
+ inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
+ parameter is invalid (such as NULL dictionary) or the stream state is
+ inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
+ expected one (incorrect adler32 value). inflateSetDictionary does not
+ perform any decompression: this will be done by subsequent calls of
+ inflate().
+*/
+
+ZEXTERN int Q_ZEXPORT inflateSync OF((z_streamp strm));
+/*
+ Skips invalid compressed data until a full flush point (see above the
+ description of deflate with Z_FULL_FLUSH) can be found, or until all
+ available input is skipped. No output is provided.
+
+ inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
+ if no more input was provided, Z_DATA_ERROR if no flush point has been found,
+ or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
+ case, the application may save the current current value of total_in which
+ indicates where valid compressed data was found. In the error case, the
+ application may repeatedly call inflateSync, providing more input each time,
+ until success or end of the input data.
+*/
+
+ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
+ z_streamp source));
+/*
+ Sets the destination stream as a complete copy of the source stream.
+
+ This function can be useful when randomly accessing a large stream. The
+ first pass through the stream can periodically record the inflate state,
+ allowing restarting inflate at those points when randomly accessing the
+ stream.
+
+ inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+ (such as zalloc being NULL). msg is left unchanged in both source and
+ destination.
+*/
+
+ZEXTERN int Q_ZEXPORT inflateReset OF((z_streamp strm));
+/*
+ This function is equivalent to inflateEnd followed by inflateInit,
+ but does not free and reallocate all the internal decompression state.
+ The stream will keep attributes that may have been set by inflateInit2.
+
+ inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
+ int bits,
+ int value));
+/*
+ This function inserts bits in the inflate input stream. The intent is
+ that this function is used to start inflating at a bit position in the
+ middle of a byte. The provided bits will be used before any bytes are used
+ from next_in. This function should only be used with raw inflate, and
+ should be used before the first inflate() call after inflateInit2() or
+ inflateReset(). bits must be less than or equal to 16, and that many of the
+ least significant bits of value will be inserted in the input.
+
+ inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
+ gz_headerp head));
+/*
+ inflateGetHeader() requests that gzip header information be stored in the
+ provided gz_header structure. inflateGetHeader() may be called after
+ inflateInit2() or inflateReset(), and before the first call of inflate().
+ As inflate() processes the gzip stream, head->done is zero until the header
+ is completed, at which time head->done is set to one. If a zlib stream is
+ being decoded, then head->done is set to -1 to indicate that there will be
+ no gzip header information forthcoming. Note that Z_BLOCK can be used to
+ force inflate() to return immediately after header processing is complete
+ and before any actual data is decompressed.
+
+ The text, time, xflags, and os fields are filled in with the gzip header
+ contents. hcrc is set to true if there is a header CRC. (The header CRC
+ was valid if done is set to one.) If extra is not Z_NULL, then extra_max
+ contains the maximum number of bytes to write to extra. Once done is true,
+ extra_len contains the actual extra field length, and extra contains the
+ extra field, or that field truncated if extra_max is less than extra_len.
+ If name is not Z_NULL, then up to name_max characters are written there,
+ terminated with a zero unless the length is greater than name_max. If
+ comment is not Z_NULL, then up to comm_max characters are written there,
+ terminated with a zero unless the length is greater than comm_max. When
+ any of extra, name, or comment are not Z_NULL and the respective field is
+ not present in the header, then that field is set to Z_NULL to signal its
+ absence. This allows the use of deflateSetHeader() with the returned
+ structure to duplicate the header. However if those fields are set to
+ allocated memory, then the application will need to save those pointers
+ elsewhere so that they can be eventually freed.
+
+ If inflateGetHeader is not used, then the header information is simply
+ discarded. The header is always checked for validity, including the header
+ CRC if present. inflateReset() will reset the process to discard the header
+ information. The application would need to call inflateGetHeader() again to
+ retrieve the header from the next gzip stream.
+
+ inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
+ unsigned char FAR *window));
+
+ Initialize the internal stream state for decompression using inflateBack()
+ calls. The fields zalloc, zfree and opaque in strm must be initialized
+ before the call. If zalloc and zfree are Z_NULL, then the default library-
+ derived memory allocation routines are used. windowBits is the base two
+ logarithm of the window size, in the range 8..15. window is a caller
+ supplied buffer of that size. Except for special applications where it is
+ assured that deflate was used with small window sizes, windowBits must be 15
+ and a 32K byte window must be supplied to be able to decompress general
+ deflate streams.
+
+ See inflateBack() for the usage of these routines.
+
+ inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of
+ the paramaters are invalid, Z_MEM_ERROR if the internal state could not
+ be allocated, or Z_VERSION_ERROR if the version of the library does not
+ match the version of the header file.
+*/
+
+typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *));
+typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
+
+ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
+ in_func in, void FAR *in_desc,
+ out_func out, void FAR *out_desc));
+/*
+ inflateBack() does a raw inflate with a single call using a call-back
+ interface for input and output. This is more efficient than inflate() for
+ file i/o applications in that it avoids copying between the output and the
+ sliding window by simply making the window itself the output buffer. This
+ function trusts the application to not change the output buffer passed by
+ the output function, at least until inflateBack() returns.
+
+ inflateBackInit() must be called first to allocate the internal state
+ and to initialize the state with the user-provided window buffer.
+ inflateBack() may then be used multiple times to inflate a complete, raw
+ deflate stream with each call. inflateBackEnd() is then called to free
+ the allocated state.
+
+ A raw deflate stream is one with no zlib or gzip header or trailer.
+ This routine would normally be used in a utility that reads zip or gzip
+ files and writes out uncompressed files. The utility would decode the
+ header and process the trailer on its own, hence this routine expects
+ only the raw deflate stream to decompress. This is different from the
+ normal behavior of inflate(), which expects either a zlib or gzip header and
+ trailer around the deflate stream.
+
+ inflateBack() uses two subroutines supplied by the caller that are then
+ called by inflateBack() for input and output. inflateBack() calls those
+ routines until it reads a complete deflate stream and writes out all of the
+ uncompressed data, or until it encounters an error. The function's
+ parameters and return types are defined above in the in_func and out_func
+ typedefs. inflateBack() will call in(in_desc, &buf) which should return the
+ number of bytes of provided input, and a pointer to that input in buf. If
+ there is no input available, in() must return zero--buf is ignored in that
+ case--and inflateBack() will return a buffer error. inflateBack() will call
+ out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out()
+ should return zero on success, or non-zero on failure. If out() returns
+ non-zero, inflateBack() will return with an error. Neither in() nor out()
+ are permitted to change the contents of the window provided to
+ inflateBackInit(), which is also the buffer that out() uses to write from.
+ The length written by out() will be at most the window size. Any non-zero
+ amount of input may be provided by in().
+
+ For convenience, inflateBack() can be provided input on the first call by
+ setting strm->next_in and strm->avail_in. If that input is exhausted, then
+ in() will be called. Therefore strm->next_in must be initialized before
+ calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called
+ immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in
+ must also be initialized, and then if strm->avail_in is not zero, input will
+ initially be taken from strm->next_in[0 .. strm->avail_in - 1].
+
+ The in_desc and out_desc parameters of inflateBack() is passed as the
+ first parameter of in() and out() respectively when they are called. These
+ descriptors can be optionally used to pass any information that the caller-
+ supplied in() and out() functions need to do their job.
+
+ On return, inflateBack() will set strm->next_in and strm->avail_in to
+ pass back any unused input that was provided by the last in() call. The
+ return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR
+ if in() or out() returned an error, Z_DATA_ERROR if there was a format
+ error in the deflate stream (in which case strm->msg is set to indicate the
+ nature of the error), or Z_STREAM_ERROR if the stream was not properly
+ initialized. In the case of Z_BUF_ERROR, an input or output error can be
+ distinguished using strm->next_in which will be Z_NULL only if in() returned
+ an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to
+ out() returning non-zero. (in() will always be called before out(), so
+ strm->next_in is assured to be defined if out() returns non-zero.) Note
+ that inflateBack() cannot return Z_OK.
+*/
+
+ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));
+/*
+ All memory allocated by inflateBackInit() is freed.
+
+ inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream
+ state was inconsistent.
+*/
+
+ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
+/* Return flags indicating compile-time options.
+
+ Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:
+ 1.0: size of uInt
+ 3.2: size of uLong
+ 5.4: size of voidpf (pointer)
+ 7.6: size of z_off_t
+
+ Compiler, assembler, and debug options:
+ 8: DEBUG
+ 9: ASMV or ASMINF -- use ASM code
+ 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention
+ 11: 0 (reserved)
+
+ One-time table building (smaller code, but not thread-safe if true):
+ 12: BUILDFIXED -- build static block decoding tables when needed
+ 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed
+ 14,15: 0 (reserved)
+
+ Library content (indicates missing functionality):
+ 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking
+ deflate code when not needed)
+ 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect
+ and decode gzip streams (to avoid linking crc code)
+ 18-19: 0 (reserved)
+
+ Operation variations (changes in library functionality):
+ 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate
+ 21: FASTEST -- deflate algorithm with only one, lowest compression level
+ 22,23: 0 (reserved)
+
+ The sprintf variant used by gzprintf (zero is best):
+ 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format
+ 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure!
+ 26: 0 = returns value, 1 = void -- 1 means inferred string length returned
+
+ Remainder:
+ 27-31: 0 (reserved)
+ */
+
+
+ /* utility functions */
+
+/*
+ The following utility functions are implemented on top of the
+ basic stream-oriented functions. To simplify the interface, some
+ default options are assumed (compression level and memory usage,
+ standard memory allocation functions). The source code of these
+ utility functions can easily be modified if you need special options.
+*/
+
+ZEXTERN int Q_ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen));
+/*
+ Compresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total
+ size of the destination buffer, which must be at least the value returned
+ by compressBound(sourceLen). Upon exit, destLen is the actual size of the
+ compressed buffer.
+ This function can be used to compress a whole file at once if the
+ input file is mmap'ed.
+ compress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer.
+*/
+
+ZEXTERN int Q_ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen,
+ int level));
+/*
+ Compresses the source buffer into the destination buffer. The level
+ parameter has the same meaning as in deflateInit. sourceLen is the byte
+ length of the source buffer. Upon entry, destLen is the total size of the
+ destination buffer, which must be at least the value returned by
+ compressBound(sourceLen). Upon exit, destLen is the actual size of the
+ compressed buffer.
+
+ compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_BUF_ERROR if there was not enough room in the output buffer,
+ Z_STREAM_ERROR if the level parameter is invalid.
+*/
+
+ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));
+/*
+ compressBound() returns an upper bound on the compressed size after
+ compress() or compress2() on sourceLen bytes. It would be used before
+ a compress() or compress2() call to allocate the destination buffer.
+*/
+
+ZEXTERN int Q_ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen));
+/*
+ Decompresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total
+ size of the destination buffer, which must be large enough to hold the
+ entire uncompressed data. (The size of the uncompressed data must have
+ been saved previously by the compressor and transmitted to the decompressor
+ by some mechanism outside the scope of this compression library.)
+ Upon exit, destLen is the actual size of the compressed buffer.
+ This function can be used to decompress a whole file at once if the
+ input file is mmap'ed.
+
+ uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete.
+*/
+
+
+typedef voidp gzFile;
+
+ZEXTERN gzFile Q_ZEXPORT gzopen OF((const char *path, const char *mode));
+/*
+ Opens a gzip (.gz) file for reading or writing. The mode parameter
+ is as in fopen ("rb" or "wb") but can also include a compression level
+ ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for
+ Huffman only compression as in "wb1h", or 'R' for run-length encoding
+ as in "wb1R". (See the description of deflateInit2 for more information
+ about the strategy parameter.)
+
+ gzopen can be used to read a file which is not in gzip format; in this
+ case gzread will directly read from the file without decompression.
+
+ gzopen returns NULL if the file could not be opened or if there was
+ insufficient memory to allocate the (de)compression state; errno
+ can be checked to distinguish the two cases (if errno is zero, the
+ zlib error is Z_MEM_ERROR). */
+
+ZEXTERN gzFile Q_ZEXPORT gzdopen OF((int fd, const char *mode));
+/*
+ gzdopen() associates a gzFile with the file descriptor fd. File
+ descriptors are obtained from calls like open, dup, creat, pipe or
+ fileno (in the file has been previously opened with fopen).
+ The mode parameter is as in gzopen.
+ The next call of gzclose on the returned gzFile will also close the
+ file descriptor fd, just like fclose(fdopen(fd), mode) closes the file
+ descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).
+ gzdopen returns NULL if there was insufficient memory to allocate
+ the (de)compression state.
+*/
+
+ZEXTERN int Q_ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
+/*
+ Dynamically update the compression level or strategy. See the description
+ of deflateInit2 for the meaning of these parameters.
+ gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
+ opened for writing.
+*/
+
+ZEXTERN int Q_ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
+/*
+ Reads the given number of uncompressed bytes from the compressed file.
+ If the input file was not in gzip format, gzread copies the given number
+ of bytes into the buffer.
+ gzread returns the number of uncompressed bytes actually read (0 for
+ end of file, -1 for error). */
+
+ZEXTERN int Q_ZEXPORT gzwrite OF((gzFile file,
+ voidpc buf, unsigned len));
+/*
+ Writes the given number of uncompressed bytes into the compressed file.
+ gzwrite returns the number of uncompressed bytes actually written
+ (0 in case of error).
+*/
+
+ZEXTERN int Q_ZEXPORT gzprintf OF((gzFile file, const char *format, ...));
+/*
+ Converts, formats, and writes the args to the compressed file under
+ control of the format string, as in fprintf. gzprintf returns the number of
+ uncompressed bytes actually written (0 in case of error). The number of
+ uncompressed bytes written is limited to 4095. The caller should assure that
+ this limit is not exceeded. If it is exceeded, then gzprintf() will return
+ return an error (0) with nothing written. In this case, there may also be a
+ buffer overflow with unpredictable consequences, which is possible only if
+ zlib was compiled with the insecure functions sprintf() or vsprintf()
+ because the secure snprintf() or vsnprintf() functions were not available.
+*/
+
+ZEXTERN int Q_ZEXPORT gzputs OF((gzFile file, const char *s));
+/*
+ Writes the given null-terminated string to the compressed file, excluding
+ the terminating null character.
+ gzputs returns the number of characters written, or -1 in case of error.
+*/
+
+ZEXTERN Q_ZEXPORT char * gzgets OF((gzFile file, char *buf, int len));
+/*
+ Reads bytes from the compressed file until len-1 characters are read, or
+ a newline character is read and transferred to buf, or an end-of-file
+ condition is encountered. The string is then terminated with a null
+ character.
+ gzgets returns buf, or Z_NULL in case of error.
+*/
+
+ZEXTERN int Q_ZEXPORT gzputc OF((gzFile file, int c));
+/*
+ Writes c, converted to an unsigned char, into the compressed file.
+ gzputc returns the value that was written, or -1 in case of error.
+*/
+
+ZEXTERN int Q_ZEXPORT gzgetc OF((gzFile file));
+/*
+ Reads one byte from the compressed file. gzgetc returns this byte
+ or -1 in case of end of file or error.
+*/
+
+ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
+/*
+ Push one character back onto the stream to be read again later.
+ Only one character of push-back is allowed. gzungetc() returns the
+ character pushed, or -1 on failure. gzungetc() will fail if a
+ character has been pushed but not read yet, or if c is -1. The pushed
+ character will be discarded if the stream is repositioned with gzseek()
+ or gzrewind().
+*/
+
+ZEXTERN int Q_ZEXPORT gzflush OF((gzFile file, int flush));
+/*
+ Flushes all pending output into the compressed file. The parameter
+ flush is as in the deflate() function. The return value is the zlib
+ error number (see function gzerror below). gzflush returns Z_OK if
+ the flush parameter is Z_FINISH and all output could be flushed.
+ gzflush should be called only when strictly necessary because it can
+ degrade compression.
+*/
+
+ZEXTERN z_off_t Q_ZEXPORT gzseek OF((gzFile file,
+ z_off_t offset, int whence));
+/*
+ Sets the starting position for the next gzread or gzwrite on the
+ given compressed file. The offset represents a number of bytes in the
+ uncompressed data stream. The whence parameter is defined as in lseek(2);
+ the value SEEK_END is not supported.
+ If the file is opened for reading, this function is emulated but can be
+ extremely slow. If the file is opened for writing, only forward seeks are
+ supported; gzseek then compresses a sequence of zeroes up to the new
+ starting position.
+
+ gzseek returns the resulting offset location as measured in bytes from
+ the beginning of the uncompressed stream, or -1 in case of error, in
+ particular if the file is opened for writing and the new starting position
+ would be before the current position.
+*/
+
+ZEXTERN int Q_ZEXPORT gzrewind OF((gzFile file));
+/*
+ Rewinds the given file. This function is supported only for reading.
+
+ gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
+*/
+
+ZEXTERN z_off_t Q_ZEXPORT gztell OF((gzFile file));
+/*
+ Returns the starting position for the next gzread or gzwrite on the
+ given compressed file. This position represents a number of bytes in the
+ uncompressed data stream.
+
+ gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
+*/
+
+ZEXTERN int Q_ZEXPORT gzeof OF((gzFile file));
+/*
+ Returns 1 when EOF has previously been detected reading the given
+ input stream, otherwise zero.
+*/
+
+ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
+/*
+ Returns 1 if file is being read directly without decompression, otherwise
+ zero.
+*/
+
+ZEXTERN int Q_ZEXPORT gzclose OF((gzFile file));
+/*
+ Flushes all pending output if necessary, closes the compressed file
+ and deallocates all the (de)compression state. The return value is the zlib
+ error number (see function gzerror below).
+*/
+
+ZEXTERN Q_ZEXPORT const char * gzerror OF((gzFile file, int *errnum));
+/*
+ Returns the error message for the last error which occurred on the
+ given compressed file. errnum is set to zlib error number. If an
+ error occurred in the file system and not in the compression library,
+ errnum is set to Z_ERRNO and the application may consult errno
+ to get the exact error code.
+*/
+
+ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
+/*
+ Clears the error and end-of-file flags for file. This is analogous to the
+ clearerr() function in stdio. This is useful for continuing to read a gzip
+ file that is being written concurrently.
+*/
+
+ /* checksum functions */
+
+/*
+ These functions are not related to compression but are exported
+ anyway because they might be useful in applications using the
+ compression library.
+*/
+
+ZEXTERN uLong Q_ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
+/*
+ Update a running Adler-32 checksum with the bytes buf[0..len-1] and
+ return the updated checksum. If buf is NULL, this function returns
+ the required initial value for the checksum.
+ An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
+ much faster. Usage example:
+
+ uLong adler = adler32(0L, Z_NULL, 0);
+
+ while (read_buffer(buffer, length) != EOF) {
+ adler = adler32(adler, buffer, length);
+ }
+ if (adler != original_adler) error();
+*/
+
+ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
+ z_off_t len2));
+/*
+ Combine two Adler-32 checksums into one. For two sequences of bytes, seq1
+ and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
+ each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of
+ seq1 and seq2 concatenated, requiring only adler1, adler2, and len2.
+*/
+
+ZEXTERN uLong Q_ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
+/*
+ Update a running CRC-32 with the bytes buf[0..len-1] and return the
+ updated CRC-32. If buf is NULL, this function returns the required initial
+ value for the for the crc. Pre- and post-conditioning (one's complement) is
+ performed within this function so it shouldn't be done by the application.
+ Usage example:
+
+ uLong crc = crc32(0L, Z_NULL, 0);
+
+ while (read_buffer(buffer, length) != EOF) {
+ crc = crc32(crc, buffer, length);
+ }
+ if (crc != original_crc) error();
+*/
+
+ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));
+
+/*
+ Combine two CRC-32 check values into one. For two sequences of bytes,
+ seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
+ calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32
+ check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and
+ len2.
+*/
+
+
+ /* various hacks, don't look :) */
+
+/* deflateInit and inflateInit are macros to allow checking the zlib version
+ * and the compiler's view of z_stream:
+ */
+ZEXTERN int Q_ZEXPORT deflateInit_ OF((z_streamp strm, int level,
+ const char *version, int stream_size));
+ZEXTERN int Q_ZEXPORT inflateInit_ OF((z_streamp strm,
+ const char *version, int stream_size));
+ZEXTERN int Q_ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
+ int windowBits, int memLevel,
+ int strategy, const char *version,
+ int stream_size));
+ZEXTERN int Q_ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
+ unsigned char FAR *window,
+ const char *version,
+ int stream_size));
+#define deflateInit(strm, level) \
+ deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit(strm) \
+ inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream))
+#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
+ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
+ (strategy), ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit2(strm, windowBits) \
+ inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
+#define inflateBackInit(strm, windowBits, window) \
+ inflateBackInit_((strm), (windowBits), (window), \
+ ZLIB_VERSION, sizeof(z_stream))
+
+
+#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL)
+ struct internal_state {int dummy;}; /* hack for buggy compilers */
+#endif
+
+ZEXTERN Q_ZEXPORT const char * zError OF((int));
+ZEXTERN int Q_ZEXPORT inflateSyncPoint OF((z_streamp z));
+ZEXTERN Q_ZEXPORT const uLongf * get_crc_table OF((void));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ZLIB_H */
--- a/project_files/hedgewars.pro Thu Sep 08 00:34:57 2011 +0200
+++ b/project_files/hedgewars.pro Sat Oct 08 16:45:52 2011 +0200
@@ -4,6 +4,7 @@
INCLUDEPATH += ../QTfrontend/
INCLUDEPATH += /usr/local/include/SDL
INCLUDEPATH += /usr/include/SDL
+INCLUDEPATH += ../misc/quazip/
DESTDIR = .
@@ -64,7 +65,8 @@
../QTfrontend/pagegamestats.h \
../QTfrontend/HWApplication.h \
../QTfrontend/AbstractPage.h \
- ../QTfrontend/themesmodel.h
+ ../QTfrontend/themesmodel.h \
+ ../QTfrontend/databrowser.h
SOURCES += ../QTfrontend/SDLs.cpp ../QTfrontend/SquareLabel.cpp \
../QTfrontend/about.cpp ../QTfrontend/ammoSchemeModel.cpp \
@@ -115,7 +117,8 @@
../QTfrontend/pagegamestats.cpp \
../QTfrontend/pageplayrecord.cpp \
../QTfrontend/HWApplication.cpp \
- ../QTfrontend/themesmodel.cpp
+ ../QTfrontend/themesmodel.cpp \
+ ../QTfrontend/databrowser.cpp
win32 {
SOURCES += ../QTfrontend/xfire.cpp
@@ -148,6 +151,8 @@
RESOURCES += ../QTfrontend/hedgewars.qrc
+LIBS += -L../misc/quazip -lquazip
+
!macx {
LIBS += -lSDL -lSDL_mixer
} else {
Binary file share/hedgewars/Data/Graphics/Flags/libya.png has changed
Binary file share/hedgewars/Data/Graphics/Flags/south_sudan.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Balrog.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Blanka.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/BlankaToothless.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/BlueCap.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/BlueHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Bob.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/BrainSlug.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/BrainSlugMouth.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Bub.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Bunny.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Chunli.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Cororon.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Deer.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Falcon.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Gasmask.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Geordi.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/GreenCap.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/GreenHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/GreyHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Guile.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Honda.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Ken.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/KirbyMask.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Kululun.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Ladle.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Luigi.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Mario.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Moose.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/OrangeHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Pig.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/PinkHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/PrincessDaisy.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/PrincessPeach.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Pumpkin_Hat.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/PurpleHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/RedCap.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/RedHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Ryu.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Samus.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/SauceBoatSilver.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Sonic.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Teacup.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/TeamCap.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/TeamHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Teapot.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Toad.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Vega.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/Wario.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/YellowCap.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/YellowHair.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/apple.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/ash.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/banana.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bb_bob.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bb_bub.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bb_cororon.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bb_kululun.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/beaver.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bobby.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bobby2v.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/bushhider.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cap_blue.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cap_green.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cap_junior.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cap_red.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cap_team.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cap_yellow.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/charmander.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/chikorita.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/chuckl.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cyborg.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cyborg1.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/cyborg2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/darthvader.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/diglett.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/dish_Ladle.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/dish_SauceBoatSilver.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/dish_Teacup.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/dish_Teapot.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/fr_apple.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/fr_banana.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/fr_lemon.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/fr_orange.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/fr_pumpkin.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_blue.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_green.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_grey.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_orange.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_pink.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_purple.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_red.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_team.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hair_yellow.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/hogpharoah.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/jigglypuff.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/junior.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/lemon.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/link.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/lugia.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/metalband.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/mexicansunbrero.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/mudkip.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/mv_Spidey.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/mv_Venom.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/ntd_Falcon.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/ntd_Kirby.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/ntd_Link.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/ntd_Samus.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/orange.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/pikachu.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_ash.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_charmander.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_chikorita.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_diglett.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_jigglypuff.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_lugia.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_mudkip.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_pikachu.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_slowpoke.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_squirtle.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/poke_voltorb.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/porkey.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_2001O.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_2001Y.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_BrainSlug.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_BrainSlug2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_Geordi.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_SparkssHelmet.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_swDarthvader.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/scif_swStormtrooper.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_Guilie.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_Honda.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_Ryu.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_balrog.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_blanka.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_blankatoothless.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_chunli.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_ken.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sf_vega.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sheep.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/slowpoke.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sm_daisy.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sm_luigi.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sm_mario.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sm_peach.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sm_toad.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sm_wario.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/snowhog.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/spcartman.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/spidey.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/spkenny.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/spkyle.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/spstan.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/squirtle.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/sth_SonicClassic.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/stormtrooper.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/swordsmensquire.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/touhou_chen.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/touhou_marisa.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/touhou_patchouli.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/touhou_remelia.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/touhou_suwako.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/touhou_yukari.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/vampirichog.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/venom.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/voltorb.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_britmedic.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_britpthhelmet.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_britsapper.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertgrenadier1.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertgrenadier2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertgrenadier4.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertgrenadier5.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertmedic.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertofficer.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertsapper1.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_desertsapper2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_frenchww1gasmask.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_frenchww1helmet.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_germanww1helmet2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_germanww1tankhelm.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_germanww2medic.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_germanww2pith.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_grenadier1.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_plainpith.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_sovietcomrade1.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_sovietcomrade2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_trenchgrenadier1.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_trenchgrenadier2.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/war_trenchgrenadier3.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Bat.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Beaver.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Bunny.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Deer.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Hedgehog.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Moose.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Pig.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Porkey.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_Sheep.png has changed
--- a/share/hedgewars/Data/Locale/hedgewars_pl.ts Thu Sep 08 00:34:57 2011 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_pl.ts Sat Oct 08 16:45:52 2011 +0200
@@ -16,15 +16,15 @@
<name>DrawMapWidget</name>
<message>
<source>File error</source>
- <translation type="unfinished">Błąd pliku</translation>
+ <translation>Błąd pliku</translation>
</message>
<message>
<source>Cannot open file '%1' for writing</source>
- <translation type="unfinished">Nie można otworzyć '%1' do zapisu</translation>
+ <translation>Nie można otworzyć '%1' do zapisu</translation>
</message>
<message>
<source>Cannot read file '%1'</source>
- <translation type="unfinished">Nie można odczytać pliku '%1'</translation>
+ <translation>Nie można odczytać pliku '%1'</translation>
</message>
</context>
<context>
@@ -128,6 +128,14 @@
<comment>File Types</comment>
<translation>Zapisana gra</translation>
</message>
+ <message>
+ <source>Demo name</source>
+ <translation type="unfinished">Nazwa demo</translation>
+ </message>
+ <message>
+ <source>Demo name:</source>
+ <translation type="unfinished">Nazwa demo:</translation>
+ </message>
</context>
<context>
<name>HWGame</name>
@@ -298,14 +306,17 @@
</message>
<message>
<source>Nickname</source>
- <translation type="unfinished">Nick</translation>
+ <translation>Nick</translation>
</message>
<message>
<source>Some one already uses
your nickname %1
on the server.
Please pick another nickname:</source>
- <translation type="unfinished"></translation>
+ <translation>Ktoś właśnie używa
+tego nicku %1
+na serwerze.
+Przoszę wybrać nowy nick:</translation>
</message>
</context>
<context>
@@ -362,7 +373,7 @@
</message>
<message>
<source>Cancel</source>
- <translation type="unfinished">Anuluj</translation>
+ <translation>Anuluj</translation>
</message>
</context>
<context>
@@ -516,7 +527,7 @@
<message>
<source>Some weapons might do only low damage but they can be a lot more devastating in the right situation. Try to use the Desert Eagle to knock multiple hedgehogs into the water.</source>
<comment>Tips</comment>
- <translation>Niektóre z broni zadają mało punktów obrażeń jednak użyte w odpowiednim momencie mogą pokazać swój pazur. Na przykład spróbuj użyć pistoletu do strącania swoich przeciwników do wody.</translation>
+ <translation type="unfinished">Niektóre z broni zadają mało punktów obrażeń jednak użyte w odpowiednim momencie mogą pokazać pazur. Na przykład spróbuj użyć pistoletu by strącić swoich przeciwników do wody.</translation>
</message>
<message>
<source>If you're unsure what to do and don't want to waste ammo, skip one round. But don't let too much time pass as there will be Sudden Death!</source>
@@ -561,17 +572,17 @@
<message>
<source>From time to time there will be official tournaments. Upcoming events will be announced at http://www.hedgewars.org/ some days in advance.</source>
<comment>Tips</comment>
- <translation>Od czasu do czasu będą organizowane mistrzostwa. Będą one ogłaszane z wyprzedzeniem na http://www.hedgewars.org/ .</translation>
+ <translation type="unfinished">Od czasu do czasu będą organizowane mistrzostwa. Będą one ogłaszane z wyprzedzeniem na http://www.hedgewars.org/ .</translation>
</message>
<message>
<source>Hedgewars is available in many languages. If the translation in your language seems to be missing or outdated, feel free to contact us!</source>
<comment>Tips</comment>
- <translation>Hedgewars jest dostępne w wielu językach. Jeśli brakuje tłumaczenia w twoim języku bądź jest ono wybrakowane, nie bój się z nami skontaktować!</translation>
+ <translation type="unfinished">Hedgewars jest dostępne w wielu językach. Jeśli brakuje tłumaczenia w twoim języku bądź jest ono niekompletne, nie bój się z nami skontaktować!</translation>
</message>
<message>
<source>Hedgewars can be run on lots of different operating systems including Microsoft Windows, Mac OS X and Linux.</source>
<comment>Tips</comment>
- <translation>Hedgewars może być uruchomione na różnych systemach operacyjnych takich jak Microsoft Windows, MacOS X oraz Linux.</translation>
+ <translation type="unfinished">Hedgewars może być uruchomione na różnych systemach operacyjnych takich jak Microsoft Windows, MacOS X, FreeBSD oraz Linux.</translation>
</message>
<message>
<source>Always remember you're able to set up your own games in local and network/online play. You're not restricted to the 'Simple Game' option.</source>
@@ -606,7 +617,7 @@
<message>
<source>Especially while playing online be polite and always remember there might be some minors playing with or against you as well!</source>
<comment>Tips</comment>
- <translation>Bądź kulturalny grając w internecie oraz pamiętaj o tym, że w Hedgewars mogą grać także młodsze osoby!</translation>
+ <translation type="unfinished">Bądź kulturalny grając przez internet. Pamiętaj o tym, że w Hedgewars mogą grać także młodsze osoby!</translation>
</message>
<message>
<source>Special game modes such as 'Vampirism' or 'Karma' allow you to develop completely new tactics. Try them in a custom game!</source>
@@ -646,7 +657,7 @@
<message>
<source>Connect one or more gamepads before starting the game to be able to assign their controls to your teams.</source>
<comment>Tips</comment>
- <translation>Jeśli podłączysz jeden lub więcej gamepadów przed włączeniem gry, będziesz miał możliwość przypisania klawiszy by sterować swoimi jeżami.</translation>
+ <translation type="unfinished">Jeśli podłączysz jeden lub więcej gamepadów przed włączeniem gry będziesz miał możliwość przypisania klawiszy by sterować swoimi jeżami.</translation>
</message>
<message>
<source>Create an account on %1 to keep others from using your most favourite nickname while playing on the official server.</source>
@@ -761,12 +772,12 @@
<message>
<source>You're able to associate Hedgewars related files (savegames and demo recordings) with the game to launch them right from your favorite file or internet browser.</source>
<comment>Tips</comment>
- <translation>Możesz powiązać typy plików związane z Hedgewars (zapisy gier i dema) by móc je uruchamiać potem bezpośrednio z ulubionego menedżera plików bądź przeglądarki internetowej.</translation>
+ <translation type="unfinished">Możesz powiązać typy plików związane z Hedgewars (zapisy gier i dema) by móc je uruchamiać bezpośrednio z ulubionego menedżera plików bądź przeglądarki internetowej.</translation>
</message>
<message>
<source>Want to save ropes? Release the rope in mid air and then shoot again. As long as you don't touch the ground you'll reuse your rope without wasting ammo!</source>
<comment>Tips</comment>
- <translation>Chcesz zaoszczędzić liny? Odłącz ją będąc w powietrzu, a potem wypuść ją ponownie. Tak długo jak nie dotkniesz ziemi, będziesz używał pojedynczego naboju!</translation>
+ <translation type="unfinished">Chcesz zaoszczędzić liny? Odłącz ją będąc w powietrzu, a potem wypuść ją ponownie. Dopóki nie dotkniesz ziemi, będziesz używał pojedynczego naboju!</translation>
</message>
<message>
<source>You can find your Hedgewars configuration files under "Library/Application Support/Hedgewars" in your home directory. Create backups or take the files with you, but don't edit them by hand.</source>
@@ -781,17 +792,21 @@
<message>
<source>The Windows version of Hedgewars supports Xfire. Make sure to add Hedgewars to its game list so your friends can see you playing.</source>
<comment>Tips</comment>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Wersja Hedgewars dla systemu Windows wspiera XFire. Upewnij się, że dodałeś Hedgewars do listy gier by Twoi znajomi mogli zobaczyć Ciebie w czasie gry.</translation>
</message>
<message>
<source>Use the Molotov or Flame Thrower to temporary keep hedgehogs from passing terrain such as tunnels or platforms.</source>
<comment>Tips</comment>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Użyj koktajlu Mołotowa lub Miotacza ognia by powstrzymać przeciwnika przed przedostaniem się przez tunele lub platformy.</translation>
</message>
<message>
<source>The Homing Bee can be tricky to use. Its turn radius depends on its velocity, so try to not use full power.</source>
<comment>Tips</comment>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Pszczoła potrafi być ciężka w użyciu. Jej promień skrętu zależy od prędkości lotu, więc nie staraj się nie używać pełnej mocy podczas strzału.</translation>
+ </message>
+ <message>
+ <source>Downloadable Content</source>
+ <translation type="unfinished">Dodatki do pobrania</translation>
</message>
</context>
<context>
@@ -820,15 +835,15 @@
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Błąd</translation>
+ <translation>Błąd</translation>
</message>
<message>
<source>Please enter room name</source>
- <translation type="unfinished">Wprowadź nazwę pokoju</translation>
+ <translation>Wprowadź nazwę pokoju</translation>
</message>
<message>
<source>OK</source>
- <translation type="unfinished">OK</translation>
+ <translation>OK</translation>
</message>
</context>
<context>
@@ -1050,10 +1065,10 @@
</message>
<message numerus="yes">
<source>%1 players online</source>
- <translation type="unfinished">
- <numerusform></numerusform>
- <numerusform></numerusform>
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%1 gracz online</numerusform>
+ <numerusform>%1 graczy online</numerusform>
+ <numerusform>%1 graczy online</numerusform>
</translation>
</message>
</context>
@@ -1081,7 +1096,7 @@
</message>
<message>
<source>Add an indestructable border around the terrain</source>
- <translation>Dodaje niezniszczalną ramkę dookoła terenu</translation>
+ <translation type="obsolete">Dodaje niezniszczalną ramkę dookoła terenu</translation>
</message>
<message>
<source>Lower gravity</source>
@@ -1177,7 +1192,15 @@
</message>
<message>
<source>Teams in each clan take successive turns sharing their turn time.</source>
- <translation type="unfinished"></translation>
+ <translation>Zespoły wykonują swoje tury po kolei dzieląc czas pomiędzy siebie.</translation>
+ </message>
+ <message>
+ <source>Add an indestructible border around the terrain</source>
+ <translation type="unfinished">Dodaje niezniszczalną ramkę dookoła terenu</translation>
+ </message>
+ <message>
+ <source>Add an indestructible border along the bottom</source>
+ <translation type="unfinished">Dodaje na dole niezniszczalną ramkę</translation>
</message>
</context>
<context>
@@ -1274,7 +1297,7 @@
</message>
<message>
<source>Update</source>
- <translation type="unfinished">Odśwież</translation>
+ <translation>Zmień</translation>
</message>
</context>
<context>
@@ -1416,67 +1439,67 @@
</message>
<message>
<source>Disabled</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Wyłączone</translation>
</message>
<message>
<source>Red/Cyan</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Czerwone/Błękitne</translation>
</message>
<message>
<source>Cyan/Red</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Błękitne/Czerwone</translation>
</message>
<message>
<source>Red/Blue</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Czerwone/Niebieskie</translation>
</message>
<message>
<source>Blue/Red</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Niebieskie/Czerwone</translation>
</message>
<message>
<source>Red/Green</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Czerwone/Zielone</translation>
</message>
<message>
<source>Green/Red</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Zielone/Czerwone</translation>
</message>
<message>
<source>Side-by-side</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Obok siebie</translation>
</message>
<message>
<source>Top-Bottom</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Góra-dół</translation>
</message>
<message>
<source>Wiggle</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Trzęsący się obraz</translation>
</message>
<message>
<source>Red/Cyan grayscale</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Czer/Błęk w odc. szar</translation>
</message>
<message>
<source>Cyan/Red grayscale</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Błęk/Czer w odc. szar</translation>
</message>
<message>
<source>Red/Blue grayscale</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Czer/Nieb w odc. szar</translation>
</message>
<message>
<source>Blue/Red grayscale</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Nieb/Czer w odc. szar</translation>
</message>
<message>
<source>Red/Green grayscale</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Czer/Ziel w odc. szar</translation>
</message>
<message>
<source>Green/Red grayscale</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Ziel/Czer w odc. szar</translation>
</message>
</context>
<context>
@@ -1726,19 +1749,19 @@
</message>
<message>
<source>Stereo rendering</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Wyświetlanie w 3D</translation>
</message>
<message>
<source>Game Options</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Opcje</translation>
</message>
<message>
<source>Style</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Tryb gry</translation>
</message>
<message>
<source>Scheme</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Schemat</translation>
</message>
<message>
<source>Password</source>
@@ -1746,7 +1769,7 @@
</message>
<message>
<source>% Get Away Time</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Czas na ucieczkę w %</translation>
</message>
</context>
<context>
@@ -2113,7 +2136,11 @@
</message>
<message>
<source>Tag Team</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Zespół</translation>
+ </message>
+ <message>
+ <source>Add Bottom Border</source>
+ <translation type="unfinished">Ddoaj ramkę na dole</translation>
</message>
</context>
<context>
--- a/share/hedgewars/Data/Locale/pl.lua Thu Sep 08 00:34:57 2011 +0200
+++ b/share/hedgewars/Data/Locale/pl.lua Sat Oct 08 16:45:52 2011 +0200
@@ -1,29 +1,29 @@
locale = {
[":("] = ":(",
["!!!"] = "!!!",
--- ["..."] = "",
--- ["Accuracy Bonus!"] = "",
--- ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
+ ["..."] = "...",
+ ["Accuracy Bonus!"] = "Bonus za celność",
+ ["a Hedgewars mini-game"] = "Mini gra", -- Space_Invasion, The_Specialists
["Aiming Practice"] = "Potrenuj celność",
--- ["Ammo"] = "",
--- ["Ammo Depleted!"] = "",
--- ["Ammo Maniac!"] = "",
--- ["Available points remaining: "] = "",
+ ["Ammo"] = "Amunicja",
+ ["Ammo Depleted!"] = "Koniec amunicji!",
+ ["Ammo Maniac!"] = "Nabojowy Maniak!",
+ ["Available points remaining: "] = "Pozostały następujące punkty: ",
["Bat balls at your enemies and|push them into the sea!"] = "Uderzaj piłkami w swoich przeciwników|i strącaj ich do wody!",
["Bat your opponents through the|baskets and out of the map!"] = "Uderzaj swoich przekiwników|wyrzucając przez kosz, poza mapę!",
["Bazooka Training"] = "Trening bazooki",
["Best laps per team: "] = "Najszybsze okrążenie drużyny: ",
--- ["Best Team Times: "] = "",
+ ["Best Team Times: "] = "Najlepszy czas zespołów",
["Bloody Rookies"] = "Żółtodzioby",
--- ["BOOM!"] = "",
+ ["BOOM!"] = "BUM!",
["Boom!"] = "BUM!",
--- ["Boss defeated!"] = "",
--- ["Boss Slayer!"] = "",
+ ["Boss defeated!"] = "Boss pokonany!",
+ ["Boss Slayer!"] = "Pogromca bossów",
["CAPTURE THE FLAG"] = "PRZECHWYĆ FLAGĘ",
--- ["Careless"] = "",
--- ["Clumsy"] = "",
+ ["Careless"] = "Nieostrożny",
+ ["Clumsy"] = "Fajtłapa",
["Codename: Teamwork"] = "Kryptonim: Praca zespołowa",
--- ["Complete the track as fast as you can!"] = "",
+ ["Complete the track as fast as you can!"] = "Ukończ trasę tak szybko jak tylko potrafisz!",
["Congratulations!"] = "Gratulacje",
["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Gratulacje! Zniszczyłeś wszystkie cele przed upłynięciem czasu.",
["Control pillars to score points."] = "Kontroluj filary by zdobyć punkty",
@@ -33,143 +33,143 @@
["Dangerous Ducklings"] = "Niebezpieczne Kaczory",
-- ["Deadweight"] = "",
-- ["Depleted Kamikaze!"] = "",
--- ["Destroy invaders to score points."] = "",
--- ["Drone Hunter!"] = "",
+ ["Destroy invaders to score points."] = "Zabijaj najeźdźców by zdobyć punkty.",
+ ["Drone Hunter!"] = "Łowca dronów",
-- ["Drowner"] = "",
--- ["Each turn you get 1-3 random weapons"] = "",
--- ["Each turn you get one random weapon"] = "",
+ ["Each turn you get 1-3 random weapons"] = "Z każdą turą dostaniesz 1-3 bronie",
+ ["Each turn you get one random weapon"] = "Z każdą turą dostaniesz losową broń",
["Eliminate all enemies"] = "Wyeliminuj wszystkich przeciwników",
["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Zniszcz wszystkie cele zanim upłynie czas.|W tej misji masz nieskończoną ilość amunicji.",
["Eliminate Poison before the time runs out"] = "Zabij Truciciela zanim skończy się czas",
["Eliminate the Blue Team"] = "Zniszcz niebieską drużynę",
--- ["Eliminate the enemy specialists."] = "",
- ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "Rozwal Jednostkę 3378 | Twoja drużyna musi przetrwać",
+ ["Eliminate the enemy specialists."] = "Weliminuj specjalistów wroga.",
+ ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- Rozwal Jednostkę 3378 |- Twoja drużyna musi przetrwać",
["Enjoy the swim..."] = "Popływaj trochę...",
--- ["[Enter]"] = "",
+ ["[Enter]"] = "[Enter]",
["Fastest lap: "] = "Najszybsze okrążenie: ",
["Feeble Resistance"] = "Ruch Oporu",
--- ["Fire"] = "",
+ ["Fire"] = "Ogień",
["Flag captured!"] = "Flaga przechwycona!",
["Flag respawned!"] = "Flaga przywrócona!",
["Flag returned!"] = "Flaga odzyskana!",
--- ["Flags, and their home base will be placed where each team ends their first turn."] = "",
--- ["GAME BEGUN!!!"] = "",
--- ["Game Modifiers: "] = "",
+ ["Flags, and their home base will be placed where each team ends their first turn."] = "Flagi i baza zostaną umieszzcone tam gdzie zespół zakończy swą pierwszą turę.",
+ ["GAME BEGUN!!!"] = "GRA ROZPOCZĘTA!!!",
+ ["Game Modifiers: "] = "Modyfikatory: ",
["GAME OVER!"] = "KONIEC GRY!",
["Game Started!"] = "Gra Rozpoczęta",
["Get on over there and take him out!"] = "Dostań się tam i go wykończ!",
--- ["Goal"] = "",
+ ["Goal"] = "Gol",
["GO! GO! GO!"] = "RUCHY! RUCHY! RUCHY!",
["Good birdy......"] = "Dooobry ptaszek...",
["Good luck out there!"] = "Powodzenia!",
--- ["GOTCHA!"] = "",
--- ["Hahahaha!"] = "",
--- ["Haha, now THAT would be something!"] = "",
--- ["Hapless Hogs"] = "",
--- [" Hapless Hogs left!"] = "",
+ ["GOTCHA!"] = "MAM CIĘ!",
+ ["Hahahaha!"] = "Hahahaha!",
+ ["Haha, now THAT would be something!"] = "Haha, to było by COŚ",
+ ["Hapless Hogs"] = "Nieszczęsne Jeże",
+ [" Hapless Hogs left!"] = " Nieszczęsne Jeże pozostały",
-- ["Heavy"] = "",
["Hedgewars-Basketball"] = "Hedgewars-Koszykówka",
["Hedgewars-Knockball"] = "Hedgewars-Knockball",
--- ["Heh, it's not that bad."] = "",
--- ["Hit Combo!"] = "",
+ ["Heh, it's not that bad."] = "Heh, nie jest aż tak źle.",
+ ["Hit Combo!"] = "Combo!",
["Hmmm..."] = "Hmmmm...",
["Hooray!"] = "Hurraaa!",
["Hunter"] = "Strzelec",
["Instructor"] = "Instruktor",
--- ["invaders destroyed"] = "",
--- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
--- ["Jumping is disabled"] = "",
+ ["invaders destroyed"] = "najeźdzców zniszczonych",
+ ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Jak to dobrze, że Nagła Śmierć jest dopiero za 99 tur...",
+ ["Jumping is disabled"] = "Skakanie jest niemożliwe",
-- ["Kamikaze Expert!"] = "",
--- ["KILLS"] = "",
--- ["[Left Shift]"] = "",
+ ["KILLS"] = "Zabicia",
+ ["[Left Shift]"] = "[Lewy Shift]",
["Listen up, maggot!!"] = "Słuchaj mnie, gnido!",
["|- Mines Time:"] = "|- Czas detonacji min:",
["MISSION FAILED"] = "MISJA ZAKOŃCZONA NIEPOWODZENIEM",
--- ["MISSION SUCCESS"] = "",
+ ["MISSION SUCCESS"] = "MISJA ZAKOŃCZONA SUKCESEM",
["MISSION SUCCESSFUL"] = "MISJA POWIODŁA SIĘ",
--- ["Movement: [Up], [Down], [Left], [Right]"] = "",
--- ["Multi-shot!"] = "",
--- ["Nameless Heroes"] = "",
--- ["NEW CLAN RECORD: "] = "",
+ ["Movement: [Up], [Down], [Left], [Right]"] = "Poruszanie się: [Góra], [Dół], [Lewo], [Prawo]",
+ ["Multi-shot!"] = "Wielokrotny strzał",
+ ["Nameless Heroes"] = "Bezimienni Bohaterowie",
+ ["NEW CLAN RECORD: "] = "NOWY REKORD ZESPOŁU: ",
["NEW fastest lap: "] = "NOWE najszybsze okrążenie: ",
--- ["NEW RACE RECORD: "] = "",
--- ["NOT ENOUGH WAYPOINTS"] = "",
+ ["NEW RACE RECORD: "] = "NOWY REKORD WYŚCIGU: ",
+ ["NOT ENOUGH WAYPOINTS"] = "BRAK PUNKTÓW ORIENTACYJNYCH",
["Not So Friendly Match"] = "Mecz Nie-Do-Końca Towarzyski",
["Oh no! Just try again!"] = "Ojojoj! Spróbuj jeszcze raz!",
["Oh no! Time's up! Just try again."] = "Ajajaj! Koniec czasu! Spróbuj jeszcze raz.",
["Operation Diver"] = "Operacja Nurek",
["Opposing Team: "] = "Przeciwna drużyna",
["Pathetic Hog #%d"] = "Załosny Jeż #%d",
--- ["Per-Hog Ammo"] = "",
--- ["Place more waypoints using [ENTER]"] = "",
--- ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
+ ["Per-Hog Ammo"] = "Oddzielna amunicja dla jeży",
+ ["Place more waypoints using [ENTER]"] = "Postaw więcej punktów orientacyjnych za pomocą [Entera]",
+ ["points"] = "punkty", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
["Poison"] = "Truciciel",
--- ["Power Remaining"] = "",
--- ["Press [Precise] to skip intro"] = "",
+ ["Power Remaining"] = "pkt. energii pozostało",
+ ["Press [Precise] to skip intro"] = "Naciśnij [Precyzyjne celowanie] by pominąć intro",
-- ["Race complexity limit reached."] = "",
[" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Przynieś flagę wroga do swojej bazy by zdobyć punkt | - Pierwszy kto zrobi to 3 razy, wygrywa | - Punkt zdobywasz tylko gdy twoja flaga znajduje się w bazie | - Jeże upuszczą flagę gdy zostaną zabite bądź utopione | - Upuszczona flaga może być przywrócona lub przechwycona ponownie | - Jeże odradzają się po śmierci",
--- ["Round Limit"] = "",
--- ["Rounds Complete"] = "",
+ ["Round Limit"] = "Ilość rund",
+ ["Rounds Complete"] = "Koniec",
["RULES OF THE GAME [Press ESC to view]"] = "ZASADY GRY [Naciśnij ESC by zobaczyć]",
--- ["s|"] = "",
--- ["Save as many hapless hogs as possible!"] = "",
--- ["SCORE"] = "",
+ ["s|"] = "s|",
+ ["Save as many hapless hogs as possible!"] = "Uratuj jak najwięcej nieszczęsnych jeży",
+ ["SCORE"] = "PUNKTY",
["sec"] = "sek",
["See ya!"] = "Do zobaczenia!",
--- ["s"] = "", -- GaudyRacer, Space_Invasion
--- ["Shield boosted! +30 power"] = "",
--- ["Shield Depleted"] = "",
--- ["Shield is fully recharged!"] = "",
--- ["Shield Master!"] = "",
--- ["Shield Miser!"] = "",
--- ["Shield OFF:"] = "",
--- ["Shield ON:"] = "",
--- ["Shield Seeker!"] = "",
+ ["s"] = "s", -- GaudyRacer, Space_Invasion
+ ["Shield boosted! +30 power"] = "Osłona ulepszona: +30 energii",
+ ["Shield Depleted"] = "Straciłeś Osłonę",
+ ["Shield is fully recharged!"] = "Osłona całkowicie naładowana",
+ ["Shield Master!"] = "Mistrz Osłony!",
+ ["Shield Miser!"] = "Osłonowy skąpiec!",
+ ["Shield OFF:"] = "Osłona WYŁĄCZONA:",
+ ["Shield ON:"] = "Osłona WŁĄCZONA:",
+ ["Shield Seeker!"] = "Zdobywca osłon!",
["Shotgun Team"] = "Strzelcy",
["Shotgun Training"] = "Trening strzelecki",
--- ["Shots Left: "] = "", -- GaudyRacer, Tumbler
--- ["Silly"] = "",
+ ["Shots Left: "] = "Pozostało strzałów: ", -- GaudyRacer, Tumbler
+ ["Silly"] = "Głuptas",
-- ["Sinky"] = "",
["%s is out and Team %d|scored a penalty!| |Score:"] = "%s utonął i drużyna %d|dostała punkt karny!| |Punktacja:",
["%s is out and Team %d|scored a point!| |Score:"] = "%s utonął i drużyna %d|zdobyła punkt!| |Punktacja:",
["Sniper Training"] = "Trening Snajperski",
["Sniperz"] = "Snajperzy",
--- ["Sponge"] = "",
+ ["Sponge"] = "Gąbka",
["Spooky Tree"] = "Straszne drzewo",
--- ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion
--- ["Switched to "] = "",
+ ["STATUS UPDATE"] = "WYNIKI", -- GaudyRacer, Space_Invasion
+ ["Switched to "] = "Przełączono na ",
["Team %d: "] = "Drużyna %d: ",
--- ["Team Scores"] = "", -- Control, Space_Invasion
+ ["Team Scores"] = "Punktacja(?)", -- Control, Space_Invasion
-- ["That Sinking Feeling"] = "",
["That was pointless."] = "To było bezcelowe",
["The enemy is hiding out on yonder ducky!"] = "Na tamtej kaczce ukrywa się nasz przeciwnik!",
["The flag will respawn next round."] = "Flaga pojawi się ponownie przy następnej rundzie.",
--- ["The Nameless One"] = "",
--- ["THE SPECIALISTS"] = "",
+ ["The Nameless One"] = "Bezimienny",
+ ["THE SPECIALISTS"] = "SPECJALIŚCI",
-- ["This rain is really something..."] = "",
--- ["TIME: "] = "",
+ ["TIME: "] = "CZAS: ",
-- ["Timed Kamikaze!"] = "",
--- ["Time Extended!"] = "",
--- ["Time Left: "] = "",
--- ["Toggle Shield"] = "",
+ ["Time Extended!"] = "Dodatkowy Czas!",
+ ["Time Left: "] = "Pozostały czas: ",
+ ["Toggle Shield"] = "Wł/Wył Osłonę",
["Toxic Team"] = "Toksyczny zespół",
--- ["TRACK COMPLETED"] = "",
--- ["Track Time: "] = "",
+ ["TRACK COMPLETED"] = "UKOŃCZONO TRASĘ",
+ ["Track Time: "] = "Czas: ",
["TrophyRace"] = "TrophyRace",
["T_T"] = "T_T",
--- ["Turn Time"] = "",
+ ["Turn Time"] = "Długość Tury",
["Unit 3378"] = "Jednostka 3378",
-- ["Unlimited Attacks"] = "",
-- ["User Challenge"] = "",
["Use your rope to get from start to finish as fast as you can!"] = "Użyj liny by jak najszybciej dotrzec od startu do mety",
--- ["v.06"] = "",
+ ["v.06"] = "v.06",
["Victory for the "] = "Zwycięstwo przypadło",
--- ["Waypoint placed."] = "",
--- ["Weapons Reset"] = "",
--- ["WINNING TIME: "] = "",
--- ["You'd almost swear the water was rising!"] = "",
+ ["Waypoint placed."] = "Postawiono punkt orientacyjny",
+ ["Weapons Reset"] = "Bronie odnawiają się",
+ ["WINNING TIME: "] = "ZWYCIĘSKI CZAS: ",
+ ["You'd almost swear the water was rising!"] = "Przysiągłbym, że woda zdaje się podnosić!",
["You have SCORED!!"] = "Zdobyłeś PUNKT",
--- ["You saved"] = "",
+ ["You saved"] = "Uratowałeś",
["You've failed. Try again."] = "Przegrałeś. Spróbuj jeszcze raz",
["You've reached the goal!| |Time: "] = "Dotarłeś do celu!| |Czas: ",
["'Zooka Team"] = "Bazookinierzy",
--- a/share/hedgewars/Data/Locale/pl.txt Thu Sep 08 00:34:57 2011 +0200
+++ b/share/hedgewars/Data/Locale/pl.txt Sat Oct 08 16:45:52 2011 +0200
@@ -52,10 +52,10 @@
00:49=Wskrzeszacz
00:50=Wiertniczy nalot
00:51=Kula błotna
-00:52=Nie wybrano broń
+00:52=Nie wybrano broni
00:53=TARDIS
-00:54=Struktura
-00:55=Land Spray
+00:54=Budynek
+00:55=Miotacz błota
01:00=Walczmy!
01:01=Remis
@@ -72,6 +72,12 @@
01:12=To już ostatnia runda przed Nagłą Śmiercią!
01:13=Zostało %1 rund do Nagłej Śmierci!
01:14=Bądź gotów, %1!
+01:15=Delikatne
+01:16=Słabe
+01:17=Normalne
+01:18=Duże
+01:19=Ekstremalne
+01:20=%1 odbicie
; Event messages
; Hog (%1) died
@@ -469,12 +475,11 @@
02:10=To było odlotowe!
; Hog (%1) has to leave (team is gone)
-02:11=%1 musi iść do łóżka!
-02:11=%1 wydaje się zbyt zajęty, by grać
-02:11=Zostałeś zajęty zamrozić dla jeża, %1
-02:11=Źłe gry przestała, albo nie działa.
-02:11=%1 awaria z gracza
-02:11=Belka go, Szkot!
+02:11=%1 musi iść spać!
+02:11=%1 ma ważniejsze sprawy na głowie
+02:11=Żegnamy Cię, %1
+02:11=KSZSZ, KSZZ. Jest tam ktoś po drugiej stronie?
+02:11=%1 nie ma zamiaru dłużej grać
02:11=%1 musi odejść
; Weapon Categories
@@ -532,7 +537,8 @@
03:51=Znalezione na ziemi
03:52=UNUSED
03:53=Typ 40
-03:54=Zbudować coś
+03:54=Zbuduj coś przydatnego
+03:55=Narzędzie
; Weapon Descriptions (use | as line breaks)
04:00=Atakuj przeciwników zwykłym granatem.|Wybuchnie kiedy zapalnik skończy odliczanie.|1-5: Ustawia zapalnik|Atak: Przytrzymaj by rzucić z większą siłą
@@ -582,9 +588,15 @@
04:44=To nie jest zwykły ser. To broń biologiczna!|Wybuch z pewnością nie będzie potężny, ale gdy|licznik dojdzie do zera, chmura gazu zatruje|każdego nieszczęśnika który będzie w pobliżu|1-5: Ustawia zapalnik|Atak: Przytrzymaj by rzucić z większą siłą
04:45=Wszystkie lekcje fizyki w końcu się opłaciły!|Wystrzel niszczącą sinusoidalną falę|która przechodzi przez teren i uderza|w twoich przeciwników|Uważaj! Ta broń ma kopa!|Atak: Strzelaj
04:46=Pokrywa twoich wrogów ognistą powłoką.|Czy ktoś zamawiał pieczonego jeża?|Atak: Aktywuj|Góra/Dół: Celowanie|Lewo/Prawo: Ustaw prędkość wystrzeliwania
-04:47=Podwójna zabawa z podwójną ilością lepkich min.|Spróbuj wywołać reakcję łańcuchową lub chroń|samego siebie (albo zrób obydwie rzeczy na raz!)|Atak: Przytrzymaj by rzucić z większą siłą (dwa razy)
+04:47=Podwój zabawę z pomocą 2 lepkich min.|Spróbuj wywołać reakcję łańcuchową lub chroń|samego siebie (albo zrób obydwie rzeczy na raz!)|Atak: Przytrzymaj by rzucić z większą siłą (dwa razy)
04:48=Czyż walenie jeży po głowach nie|jest zabawne? Dobre uderzenie|z młotka zabierze 1/3 życia|przeciwnika i wkopie go w podłoże|Atak: Uderz
04:49=Wskrześ swoich przyjaciół!|Jednakże uważaj byś nie pomógł swojemu wrogowi.|Atak: Przytrzymaj by powoli przywracać życie|Góra: Przyspiesz wskrzeszanie
+04:50=Wezwij szwadron śmiercionośnych wierteł|by wykurzyć kogoś z kryjówki. Po użyciu|zostanie zrzuconych 6 wiertniczych bomb|wkręcających się w podłoże|Lewo/Prawo: Określ kierunek ataku|Kursor: Wybierz miejsce zrzutu
+04:51=Obrzuć kogoś błotem! Broń ta nie zadaje dużych|obrażeń ale może gogoś zepchnąć z krawędzi!|Atak: Przytrzymaj by strzelić z większą siłą
+04:52=UNUSED
+04:53=Wybierz się na podróż w czasie i przestrzeni|zostawiając innne jeże na polu walki.|Bądź przygotowany na powrót w dowolnym momencie.|Gdy rozpocznie się|Nagła Śmierć lub większość jeży zostanie wybita.|Uwaga. Nie zadziała podczas Nagłej Śmierci,|gdy jesteś sam, lub jeśli jesteś Królem.
+04:54=INCOMPLETE
+04:55=Wystrzel strumień kleistej mazi.|Buduj mosty, zasypuj wrogów, ztykaj tunele.|Uważaj by nie zasypać samego siebie!
; Game goal strings
05:00=Ustawienia gry
@@ -608,4 +620,4 @@
05:18=Tura nie kończy się po wykonaniu ataku
05:19=Uzbrojenie zostaje przywrócone przy kolejnej turze
05:20=Każdy z jeży ma oddzielne uzbrojenie
-05:21=Zespół Tag: Zespoły w klanie na kolejnych kolejkach|Wspólna Godzina: Drużyny w akcji raz z kolei klanu
+05:21=Zespół: Zespoły w klanie wykonują tury po kolei|Wspólny czas: Czas jest wspólny dla każdej drużyny w zespole
--- a/share/hedgewars/Data/Locale/ru.txt Thu Sep 08 00:34:57 2011 +0200
+++ b/share/hedgewars/Data/Locale/ru.txt Sat Oct 08 16:45:52 2011 +0200
@@ -53,7 +53,7 @@
00:50=Сверлящий удар
00:51=Комок грязи
00:52=Оружие не выбрано
-00:53=Машина времени и пространства
+00:53=Ограничитель времени
00:54=Структура
00:55=Земляной распылитель
@@ -176,7 +176,7 @@
02:01=%1 пошел посмотреть аквариум
02:01=%1 нашёл потерянный город Атлантиды
02:01=%1 стремится к главной роли в игре Bioshock 3
-02:01=Твое плаванье по-сабачьи принесло мало пользы, %1
+02:01=Твое плаванье по-собачьи принесло мало пользы, %1
02:01=%1 забыл взять гидроцикл
02:01=%1 не любит водный спорт
02:01=%1 всегда пускает пузыри
@@ -448,6 +448,7 @@
03:52=Не используется
03:53=Модель 40
03:54=Построй что нибудь
+03:55=Полезная вещь
; Weapon Descriptions (use | as line breaks)
04:00=Атакуй своих врагов обычной гранатой.|Она взорвется сразу, как только таймер|достигнет нуля.|1-5: Установить таймер гранаты|Атака: Удерживай для более дальнего броска
--- a/share/hedgewars/Data/Names/clown.txt Thu Sep 08 00:34:57 2011 +0200
+++ b/share/hedgewars/Data/Names/clown.txt Sat Oct 08 16:45:52 2011 +0200
@@ -1,5 +1,5 @@
Binky
-Bobo
+bb_bobo
Bozo
Buttons
Chocko
--- a/share/hedgewars/Data/Names/cowboy.txt Thu Sep 08 00:34:57 2011 +0200
+++ b/share/hedgewars/Data/Names/cowboy.txt Sat Oct 08 16:45:52 2011 +0200
@@ -7,7 +7,7 @@
Tom
Ernesto
Douglas
-Mario
+sm_mario
Jose
Francisco
Brian
--- a/share/hedgewars/Data/Names/ninja.txt Thu Sep 08 00:34:57 2011 +0200
+++ b/share/hedgewars/Data/Names/ninja.txt Sat Oct 08 16:45:52 2011 +0200
@@ -6,4 +6,4 @@
Arashi
Bushi
Itami
-Kenshi
+sf_kenshi
--- a/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua Thu Sep 08 00:34:57 2011 +0200
+++ b/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua Sat Oct 08 16:45:52 2011 +0200
@@ -79,7 +79,7 @@
if z == 1 then
SetHogName(hhs[i],"Soldier")
- SetHogHat(hhs[i], "Vega")
+ SetHogHat(hhs[i], "sf_vega")
SetHealth(hhs[i],200)
elseif z == 2 then