1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
9 * Copyright (C) 2007 by Dominik Wenger
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
20 #include "installzip.h"
23 #include "zip/unzip.h"
25 ZipInstaller::ZipInstaller(QObject
* parent
): QObject(parent
)
32 void ZipInstaller::install(ProgressloggerInterface
*dp
)
34 qDebug() << "install(ProgressloggerInterface*)";
37 connect(this, SIGNAL(cont()), this, SLOT(installContinue()));
38 m_url
= m_urllist
.at(runner
);
39 m_logsection
= m_loglist
.at(runner
);
40 m_logver
= m_verlist
.at(runner
);
46 void ZipInstaller::installContinue()
48 qDebug() << "installContinue()";
50 runner
++; // this gets called when a install finished, so increase first.
51 qDebug() << "runner is now at" << runner
<< "size is" << m_urllist
.size();
52 if(runner
< m_urllist
.size()) {
53 qDebug() << "==> runner at" << runner
;
54 m_dp
->addItem(tr("done."), LOGOK
);
55 m_url
= m_urllist
.at(runner
);
56 m_logsection
= m_loglist
.at(runner
);
57 if(runner
< m_verlist
.size()) m_logver
= m_verlist
.at(runner
);
62 m_dp
->addItem(tr("Installation finished successfully."),LOGOK
);
72 void ZipInstaller::installStart()
74 qDebug() << "installStart()";
76 m_dp
->addItem(tr("Downloading file %1.%2")
77 .arg(QFileInfo(m_url
).baseName(), QFileInfo(m_url
).completeSuffix()),LOGINFO
);
79 // temporary file needs to be opened to get the filename
80 // make sure to get a fresh one on each run.
81 // making this a parent of the temporary file ensures the file gets deleted
82 // after the class object gets destroyed.
83 downloadFile
= new QTemporaryFile(this);
85 m_file
= downloadFile
->fileName();
86 downloadFile
->close();
88 getter
= new HttpGet(this);
89 getter
->setProxy(m_proxy
);
90 if(m_cache
.exists()) {
91 getter
->setCache(m_cache
);
92 qDebug() << "installzip: setting cache to" << m_cache
;
94 getter
->setFile(downloadFile
);
95 getter
->getFile(QUrl(m_url
));
97 connect(getter
, SIGNAL(done(bool)), this, SLOT(downloadDone(bool)));
98 connect(getter
, SIGNAL(downloadDone(int, bool)), this, SLOT(downloadRequestFinished(int, bool)));
99 connect(getter
, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int)));
100 connect(m_dp
, SIGNAL(aborted()), getter
, SLOT(abort()));
104 void ZipInstaller::downloadRequestFinished(int id
, bool error
)
106 qDebug() << "Install::downloadRequestFinished" << id
<< error
;
107 qDebug() << "error:" << getter
->errorString();
113 void ZipInstaller::downloadDone(bool error
)
115 qDebug() << "Install::downloadDone, error:" << error
;
116 QStringList zipContents
; // needed later
117 // update progress bar
119 int max
= m_dp
->getProgressMax();
122 m_dp
->setProgressMax(max
);
124 m_dp
->setProgressValue(max
);
125 if(getter
->httpResponse() != 200 && !getter
->isCached()) {
126 m_dp
->addItem(tr("Download error: received HTTP error %1.").arg(getter
->httpResponse()),LOGERROR
);
131 if(getter
->isCached()) m_dp
->addItem(tr("Cached file used."), LOGINFO
);
133 m_dp
->addItem(tr("Download error: %1").arg(getter
->errorString()),LOGERROR
);
138 else m_dp
->addItem(tr("Download finished."),LOGOK
);
139 QApplication::processEvents();
141 // unzip downloaded file
142 qDebug() << "about to unzip the downloaded file" << m_file
<< "to" << m_mountpoint
;
144 m_dp
->addItem(tr("Extracting file."),LOGINFO
);
145 QApplication::processEvents();
147 qDebug() << "file to unzip: " << m_file
;
150 ec
= uz
.openArchive(m_file
);
151 if(ec
!= UnZip::Ok
) {
152 m_dp
->addItem(tr("Opening archive failed: %1.")
153 .arg(uz
.formatError(ec
)),LOGERROR
);
159 ec
= uz
.extractAll(m_mountpoint
);
160 if(ec
!= UnZip::Ok
) {
161 m_dp
->addItem(tr("Extracting failed: %1.")
162 .arg(uz
.formatError(ec
)),LOGERROR
);
167 // prepare file list for log
168 zipContents
= uz
.fileList();
171 // only copy the downloaded file to the output location / name
172 m_dp
->addItem(tr("Installing file."), LOGINFO
);
173 qDebug() << "saving downloaded file (no extraction)";
175 downloadFile
->open(); // copy fails if file is not opened (filename issue?)
176 // make sure the required path is existing
177 QString path
= QFileInfo(m_mountpoint
+ m_target
).absolutePath();
180 // QFile::copy() doesn't overwrite files, so remove old one first
181 QFile(m_mountpoint
+ m_target
).remove();
182 if(!downloadFile
->copy(m_mountpoint
+ m_target
)) {
183 m_dp
->addItem(tr("Installing file failed."), LOGERROR
);
190 zipContents
.append( m_target
);
193 m_dp
->addItem(tr("Creating installation log"),LOGINFO
);
194 QSettings
installlog(m_mountpoint
+ "/.rockbox/rbutil.log", QSettings::IniFormat
, 0);
196 installlog
.beginGroup(m_logsection
);
197 for(int i
= 0; i
< zipContents
.size(); i
++)
199 installlog
.setValue(zipContents
.at(i
), m_logver
);
201 installlog
.endGroup();
207 void ZipInstaller::updateDataReadProgress(int read
, int total
)
209 m_dp
->setProgressMax(total
);
210 m_dp
->setProgressValue(read
);
211 //qDebug() << "progress:" << read << "/" << total;