2008-09-28 17:02:36 +00:00
|
|
|
/***************************************************************************
|
|
|
|
* __________ __ ___.
|
|
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
|
|
* \/ \/ \/ \/ \/
|
|
|
|
*
|
|
|
|
* Copyright (C) 2008 by Dominik Riebeling
|
|
|
|
*
|
|
|
|
* All files in this archive are subject to the GNU General Public License.
|
|
|
|
* See the file COPYING in the source tree root for full license agreement.
|
|
|
|
*
|
|
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
|
|
* KIND, either express or implied.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#include <QtCore>
|
|
|
|
#include "bootloaderinstallbase.h"
|
|
|
|
#include "bootloaderinstallipod.h"
|
|
|
|
|
|
|
|
#include "../ipodpatcher/ipodpatcher.h"
|
2011-07-17 08:08:58 +00:00
|
|
|
#include "utils.h"
|
2013-11-03 10:08:18 +00:00
|
|
|
#include "Logger.h"
|
2008-09-28 17:02:36 +00:00
|
|
|
|
|
|
|
|
|
|
|
BootloaderInstallIpod::BootloaderInstallIpod(QObject *parent)
|
|
|
|
: BootloaderInstallBase(parent)
|
|
|
|
{
|
|
|
|
(void)parent;
|
2012-12-23 22:30:57 +00:00
|
|
|
// initialize sector buffer. The sector buffer is part of the ipod_t
|
|
|
|
// structure, so a second instance of this class will have its own buffer.
|
|
|
|
ipod_alloc_buffer(&ipod, BUFFER_SIZE);
|
2008-09-28 17:02:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BootloaderInstallIpod::~BootloaderInstallIpod()
|
|
|
|
{
|
2012-12-23 22:30:57 +00:00
|
|
|
if(ipod.sectorbuf) {
|
2013-01-01 10:04:21 +00:00
|
|
|
ipod_dealloc_buffer(&ipod);
|
2009-05-01 21:35:06 +00:00
|
|
|
}
|
2008-09-28 17:02:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool BootloaderInstallIpod::install(void)
|
|
|
|
{
|
2012-12-23 22:30:57 +00:00
|
|
|
if(ipod.sectorbuf == NULL) {
|
2008-09-28 17:02:36 +00:00
|
|
|
emit logItem(tr("Error: can't allocate buffer memory!"), LOGERROR);
|
|
|
|
emit done(true);
|
|
|
|
return false;
|
|
|
|
}
|
2012-12-23 22:30:57 +00:00
|
|
|
// save buffer pointer before cleaning up ipod_t structure
|
|
|
|
unsigned char* sb = ipod.sectorbuf;
|
2009-12-17 21:54:07 +00:00
|
|
|
memset(&ipod, 0, sizeof(struct ipod_t));
|
2012-12-23 22:30:57 +00:00
|
|
|
ipod.sectorbuf = sb;
|
2008-09-28 17:02:36 +00:00
|
|
|
|
2009-12-17 21:54:07 +00:00
|
|
|
if(!ipodInitialize(&ipod)) {
|
|
|
|
emit done(true);
|
|
|
|
return false;
|
|
|
|
}
|
2008-09-28 17:02:36 +00:00
|
|
|
|
2009-12-17 21:54:07 +00:00
|
|
|
if(ipod.nimages <= 0) {
|
|
|
|
emit logItem(tr("Failed to read firmware directory"), LOGERROR);
|
2008-09-28 17:02:36 +00:00
|
|
|
emit done(true);
|
|
|
|
return false;
|
|
|
|
}
|
2009-12-17 21:54:07 +00:00
|
|
|
if(getmodel(&ipod,(ipod.ipod_directory[ipod.ososimage].vers>>8)) < 0) {
|
|
|
|
emit logItem(tr("Unknown version number in firmware (%1)").arg(
|
2012-07-01 09:50:36 +00:00
|
|
|
ipod.ipod_directory[ipod.ososimage].vers), LOGERROR);
|
2008-09-28 17:02:36 +00:00
|
|
|
emit done(true);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if(ipod.macpod) {
|
2009-11-22 14:37:31 +00:00
|
|
|
emit logItem(tr("Warning: This is a MacPod, Rockbox only runs on WinPods. \n"
|
2008-09-28 17:02:36 +00:00
|
|
|
"See http://www.rockbox.org/wiki/IpodConversionToFAT32"), LOGERROR);
|
|
|
|
emit done(true);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
emit logItem(tr("Downloading bootloader file"), LOGINFO);
|
|
|
|
|
|
|
|
downloadBlStart(m_blurl);
|
|
|
|
connect(this, SIGNAL(downloadDone()), this, SLOT(installStage2()));
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void BootloaderInstallIpod::installStage2(void)
|
|
|
|
{
|
2009-01-08 17:16:53 +00:00
|
|
|
emit logItem(tr("Installing Rockbox bootloader"), LOGINFO);
|
|
|
|
QCoreApplication::processEvents();
|
2008-09-28 17:02:36 +00:00
|
|
|
|
|
|
|
if(ipod_reopen_rw(&ipod) < 0) {
|
|
|
|
emit logItem(tr("Could not open Ipod in R/W mode"), LOGERROR);
|
|
|
|
emit done(true);
|
|
|
|
return;
|
|
|
|
}
|
2009-12-17 21:54:07 +00:00
|
|
|
QCoreApplication::processEvents();
|
2008-09-28 17:02:36 +00:00
|
|
|
|
|
|
|
m_tempfile.open();
|
|
|
|
QString blfile = m_tempfile.fileName();
|
|
|
|
m_tempfile.close();
|
|
|
|
if(add_bootloader(&ipod, blfile.toLatin1().data(), FILETYPE_DOT_IPOD) == 0) {
|
|
|
|
emit logItem(tr("Successfull added bootloader"), LOGOK);
|
|
|
|
ipod_close(&ipod);
|
2009-11-22 22:13:25 +00:00
|
|
|
#if defined(Q_OS_MACX)
|
|
|
|
m_remountDevice = ipod.diskname;
|
|
|
|
connect(this, SIGNAL(remounted(bool)), this, SLOT(installStage3(bool)));
|
|
|
|
waitRemount();
|
|
|
|
#else
|
|
|
|
installStage3(true);
|
|
|
|
#endif
|
2008-09-28 17:02:36 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
emit logItem(tr("Failed to add bootloader"), LOGERROR);
|
|
|
|
ipod_close(&ipod);
|
|
|
|
emit done(true);
|
|
|
|
return;
|
|
|
|
}
|
2009-11-22 22:13:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void BootloaderInstallIpod::installStage3(bool mounted)
|
|
|
|
{
|
|
|
|
if(mounted) {
|
|
|
|
logInstall(LogAdd);
|
2010-01-10 17:13:32 +00:00
|
|
|
emit logItem(tr("Bootloader Installation complete."), LOGINFO);
|
2009-11-22 22:13:25 +00:00
|
|
|
emit done(false);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
emit logItem(tr("Writing log aborted"), LOGERROR);
|
|
|
|
emit done(true);
|
|
|
|
}
|
2013-11-03 10:08:18 +00:00
|
|
|
LOG_INFO() << "version installed:"
|
|
|
|
<< m_blversion.toString(Qt::ISODate);
|
2008-09-28 17:02:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool BootloaderInstallIpod::uninstall(void)
|
|
|
|
{
|
2009-01-08 17:16:53 +00:00
|
|
|
emit logItem(tr("Uninstalling bootloader"), LOGINFO);
|
|
|
|
QCoreApplication::processEvents();
|
2008-09-28 17:02:36 +00:00
|
|
|
|
|
|
|
if(!ipodInitialize(&ipod)) {
|
|
|
|
emit done(true);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ipod.nimages <= 0) {
|
|
|
|
emit logItem(tr("Failed to read firmware directory"),LOGERROR);
|
|
|
|
emit done(true);
|
|
|
|
return false;
|
|
|
|
}
|
2012-07-01 09:50:36 +00:00
|
|
|
if (getmodel(&ipod,(ipod.ipod_directory[ipod.ososimage].vers>>8)) < 0) {
|
2008-09-28 17:02:36 +00:00
|
|
|
emit logItem(tr("Unknown version number in firmware (%1)").arg(
|
2012-07-01 09:50:36 +00:00
|
|
|
ipod.ipod_directory[ipod.ososimage].vers), LOGERROR);
|
2008-09-28 17:02:36 +00:00
|
|
|
emit done(true);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ipod_reopen_rw(&ipod) < 0) {
|
2008-12-14 12:36:35 +00:00
|
|
|
emit logItem(tr("Could not open Ipod in R/W mode"), LOGERROR);
|
2008-09-28 17:02:36 +00:00
|
|
|
emit done(true);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2012-07-01 10:29:47 +00:00
|
|
|
if (ipod_has_bootloader(&ipod) == 0) {
|
2008-09-28 17:02:36 +00:00
|
|
|
emit logItem(tr("No bootloader detected."), LOGERROR);
|
|
|
|
emit done(true);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (delete_bootloader(&ipod)==0) {
|
2008-12-14 12:36:35 +00:00
|
|
|
emit logItem(tr("Successfully removed bootloader"), LOGOK);
|
2008-09-28 17:02:36 +00:00
|
|
|
logInstall(LogRemove);
|
2016-01-09 03:40:53 +00:00
|
|
|
emit logProgress(1, 1);
|
2008-09-28 17:02:36 +00:00
|
|
|
emit done(false);
|
|
|
|
ipod_close(&ipod);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else {
|
2008-12-14 12:36:35 +00:00
|
|
|
emit logItem(tr("Removing bootloader failed."), LOGERROR);
|
2008-09-28 17:02:36 +00:00
|
|
|
emit done(true);
|
|
|
|
ipod_close(&ipod);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BootloaderInstallBase::BootloaderType BootloaderInstallIpod::installed(void)
|
|
|
|
{
|
|
|
|
BootloaderInstallBase::BootloaderType result = BootloaderRockbox;
|
|
|
|
|
|
|
|
if(!ipodInitialize(&ipod)) {
|
2013-11-03 10:08:18 +00:00
|
|
|
LOG_INFO() << "installed: BootloaderUnknown";
|
2008-09-28 17:02:36 +00:00
|
|
|
result = BootloaderUnknown;
|
|
|
|
}
|
2009-04-05 09:22:22 +00:00
|
|
|
else {
|
2009-04-30 19:14:24 +00:00
|
|
|
read_directory(&ipod);
|
2012-07-01 10:29:47 +00:00
|
|
|
getmodel(&ipod,(ipod.ipod_directory[ipod.ososimage].vers>>8));
|
|
|
|
if(!ipod_has_bootloader(&ipod)) {
|
2009-04-30 19:14:24 +00:00
|
|
|
result = BootloaderOther;
|
|
|
|
}
|
|
|
|
else {
|
2013-11-03 10:08:18 +00:00
|
|
|
LOG_INFO() << "installed: BootloaderRockbox";
|
2009-04-30 19:14:24 +00:00
|
|
|
}
|
2009-04-05 09:22:22 +00:00
|
|
|
}
|
2008-09-28 17:02:36 +00:00
|
|
|
ipod_close(&ipod);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BootloaderInstallBase::Capabilities BootloaderInstallIpod::capabilities(void)
|
|
|
|
{
|
|
|
|
return (Install | Uninstall | IsRaw);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-02-11 22:19:34 +00:00
|
|
|
/** @initialize Ipod by opening its file handle and checking if its an ipod.
|
|
|
|
* Note: the caller has to make sure the file handle gets closed!
|
|
|
|
*/
|
2008-09-28 17:02:36 +00:00
|
|
|
bool BootloaderInstallIpod::ipodInitialize(struct ipod_t *ipod)
|
|
|
|
{
|
2009-04-30 19:14:24 +00:00
|
|
|
if(!m_blfile.isEmpty()) {
|
2011-07-17 08:08:58 +00:00
|
|
|
QString devicename = Utils::resolveDevicename(m_blfile);
|
2010-04-27 21:43:14 +00:00
|
|
|
if(devicename.isEmpty()) {
|
|
|
|
emit logItem(tr("Error: could not retrieve device name"), LOGERROR);
|
|
|
|
return false;
|
|
|
|
}
|
2009-04-30 19:14:24 +00:00
|
|
|
#if defined(Q_OS_WIN32)
|
2010-05-05 19:35:37 +00:00
|
|
|
sprintf(ipod->diskname, "\\\\.\\PhysicalDrive%i", devicename.toInt());
|
2009-04-30 19:14:24 +00:00
|
|
|
#elif defined(Q_OS_MACX)
|
2009-11-22 14:37:31 +00:00
|
|
|
sprintf(ipod->diskname, "%s",
|
2010-04-27 21:43:14 +00:00
|
|
|
qPrintable(devicename.remove(QRegExp("s[0-9]+$"))));
|
2009-04-30 19:14:24 +00:00
|
|
|
#else
|
2009-11-22 14:37:31 +00:00
|
|
|
sprintf(ipod->diskname, "%s",
|
2010-04-27 21:43:14 +00:00
|
|
|
qPrintable(devicename.remove(QRegExp("[0-9]+$"))));
|
2009-04-30 19:14:24 +00:00
|
|
|
#endif
|
2013-11-03 10:08:18 +00:00
|
|
|
LOG_INFO() << "ipodpatcher: overriding scan, using"
|
|
|
|
<< ipod->diskname;
|
2009-04-30 19:14:24 +00:00
|
|
|
}
|
|
|
|
else {
|
2009-12-17 21:54:07 +00:00
|
|
|
emit logItem(tr("Error: no mountpoint specified!"), LOGERROR);
|
2013-11-03 10:08:18 +00:00
|
|
|
LOG_ERROR() << "no mountpoint specified!";
|
2009-12-17 21:54:07 +00:00
|
|
|
}
|
|
|
|
int result = ipod_open(ipod, 1);
|
|
|
|
if(result == -2) {
|
|
|
|
emit logItem(tr("Could not open Ipod: permission denied"), LOGERROR);
|
|
|
|
return false;
|
2009-04-30 19:14:24 +00:00
|
|
|
}
|
2009-12-17 21:54:07 +00:00
|
|
|
else if(result < 0) {
|
2008-09-28 17:02:36 +00:00
|
|
|
emit logItem(tr("Could not open Ipod"), LOGERROR);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2009-12-17 21:54:07 +00:00
|
|
|
if(read_partinfo(ipod, 1) < 0) {
|
2009-04-30 19:14:24 +00:00
|
|
|
emit logItem(tr("Error reading partition table - possibly not an Ipod"), LOGERROR);
|
|
|
|
ipod_close(ipod);
|
2008-09-28 17:02:36 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(ipod->pinfo[0].start == 0) {
|
|
|
|
emit logItem(tr("No firmware partition on disk"), LOGERROR);
|
2009-04-30 19:14:24 +00:00
|
|
|
ipod_close(ipod);
|
2008-09-28 17:02:36 +00:00
|
|
|
return false;
|
|
|
|
}
|
2009-12-17 21:54:07 +00:00
|
|
|
read_directory(ipod);
|
2008-09-28 17:02:36 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|