Move error message generation out of irivertools.cpp to make it independent from the GUI. First step to improve code reuse later.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17614 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Dominik Riebeling 2008-05-23 19:05:20 +00:00
parent 3de96af125
commit 9c3bbc3bf9
3 changed files with 106 additions and 75 deletions

View file

@ -312,7 +312,7 @@ void BootloaderInstaller::gigabeatPrepare()
QString url = m_bootloaderUrlBase + "/gigabeat/" + m_bootloadername; QString url = m_bootloaderUrlBase + "/gigabeat/" + m_bootloadername;
m_dp->addItem(tr("Downloading file %1.%2") m_dp->addItem(tr("Downloading file %1.%2")
.arg(QFileInfo(url).baseName(), QFileInfo(url).completeSuffix()),LOGINFO); .arg(QFileInfo(url).baseName(), QFileInfo(url).completeSuffix()),LOGINFO);
// temporary file needs to be opened to get the filename // temporary file needs to be opened to get the filename
downloadFile.open(); downloadFile.open();
@ -325,11 +325,11 @@ void BootloaderInstaller::gigabeatPrepare()
connect(getter, SIGNAL(done(bool)), this, SLOT(downloadDone(bool))); connect(getter, SIGNAL(done(bool)), this, SLOT(downloadDone(bool)));
connect(getter, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int))); connect(getter, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int)));
connect(m_dp, SIGNAL(aborted()), getter, SLOT(abort())); connect(m_dp, SIGNAL(aborted()), getter, SLOT(abort()));
getter->getFile(QUrl(url)); getter->getFile(QUrl(url));
} }
else //UnInstallation else //UnInstallation
{ {
QString firmware; QString firmware;
firmware = resolvePathCase(m_mountpoint + "/GBSYSTEM/FWIMG/FWIMG01.DAT"); firmware = resolvePathCase(m_mountpoint + "/GBSYSTEM/FWIMG/FWIMG01.DAT");
QString firmwareOrig = resolvePathCase(firmware.append(".ORIG")); QString firmwareOrig = resolvePathCase(firmware.append(".ORIG"));
@ -339,7 +339,7 @@ void BootloaderInstaller::gigabeatPrepare()
// check if original firmware exists // check if original firmware exists
if(!firmwareOrigFI.exists()) if(!firmwareOrigFI.exists())
{ {
m_dp->addItem(tr("Could not find the Original Firmware at: %1") m_dp->addItem(tr("Could not find the Original Firmware at: %1")
.arg(firmwareOrig),LOGERROR); .arg(firmwareOrig),LOGERROR);
emit done(true); emit done(true);
return; return;
@ -351,7 +351,7 @@ void BootloaderInstaller::gigabeatPrepare()
//remove modified firmware //remove modified firmware
if(!firmwareFile.remove()) if(!firmwareFile.remove())
{ {
m_dp->addItem(tr("Could not remove the Firmware at: %1") m_dp->addItem(tr("Could not remove the Firmware at: %1")
.arg(firmware),LOGERROR); .arg(firmware),LOGERROR);
emit done(true); emit done(true);
return; return;
@ -360,7 +360,7 @@ void BootloaderInstaller::gigabeatPrepare()
// rename original firmware back // rename original firmware back
if(!firmwareOrigFile.rename(firmware)) if(!firmwareOrigFile.rename(firmware))
{ {
m_dp->addItem(tr("Could not copy the Firmware from: %1 to %2") m_dp->addItem(tr("Could not copy the Firmware from: %1 to %2")
.arg(firmwareOrig,firmware),LOGERROR); .arg(firmwareOrig,firmware),LOGERROR);
emit done(true); emit done(true);
return; return;
@ -369,7 +369,7 @@ void BootloaderInstaller::gigabeatPrepare()
removeInstallLog(); removeInstallLog();
emit done(false); //success emit done(false); //success
} }
} }
@ -1330,9 +1330,22 @@ void BootloaderInstaller::iriverFinish()
newHex.close(); newHex.close();
// iriver decode // iriver decode
if (iriver_decode(m_origfirmware, firmwareBinName, FALSE, STRIP_NONE,m_dp) == -1) int result;
if ((result = iriver_decode(m_origfirmware, firmwareBinName, FALSE, STRIP_NONE)) < 0)
{ {
m_dp->addItem(tr("Error in descramble"),LOGERROR); QString error;
switch(result) {
case -1: error = tr("Can't open input file"); break;
case -2: error = tr("Can't open output file"); break;
case -3: error = tr("invalid file: header length wrong"); break;
case -4: error = tr("invalid file: unrecognized header"); break;
case -5: error = tr("invalid file: \"length\" field wrong"); break;
case -6: error = tr("invalid file: \"length2\" field wrong"); break;
case -7: error = tr("invalid file: internal checksum error"); break;
case -8: error = tr("invalid file: \"length3\" field wrong"); break;
default: error = tr("unknown"); break;
}
m_dp->addItem(tr("Error in descramble: %1").arg(error), LOGERROR);
firmwareBin.remove(); firmwareBin.remove();
newBin.remove(); newBin.remove();
newHex.remove(); newHex.remove();
@ -1340,9 +1353,20 @@ void BootloaderInstaller::iriverFinish()
return; return;
} }
// mkboot // mkboot
if (!mkboot(firmwareBinName, newBinName, m_tempfilename, origin,m_dp)) if((result = mkboot(firmwareBinName, newBinName, m_tempfilename, origin)) < 0)
{ {
m_dp->addItem(tr("Error in patching"),LOGERROR); QString error;
switch(result) {
case -1: error = tr("could not open input file"); break;
case -2: error = tr("reading header failed"); break;
case -3: error = tr("reading firmware failed"); break;
case -4: error = tr("can't open bootloader file"); break;
case -5: error = tr("reading bootloader file failed"); break;
case -6: error = tr("can't open output file"); break;
case -7: error = tr("writing output file failed"); break;
}
m_dp->addItem(tr("Error in patching: %1").arg(error), LOGERROR);
firmwareBin.remove(); firmwareBin.remove();
newBin.remove(); newBin.remove();
newHex.remove(); newHex.remove();
@ -1350,9 +1374,22 @@ void BootloaderInstaller::iriverFinish()
return; return;
} }
// iriver_encode // iriver_encode
if (iriver_encode(newBinName, newHexName, FALSE,m_dp) == -1) if((result = iriver_encode(newBinName, newHexName, FALSE)) < 0)
{ {
m_dp->addItem(tr("Error in scramble"),LOGERROR); QString error;
switch(result) {
case -1: error = tr("Can't open input file"); break;
case -2: error = tr("Can't open output file"); break;
case -3: error = tr("invalid file: header length wrong"); break;
case -4: error = tr("invalid file: unrecognized header"); break;
case -5: error = tr("invalid file: \"length\" field wrong"); break;
case -6: error = tr("invalid file: \"length2\" field wrong"); break;
case -7: error = tr("invalid file: internal checksum error"); break;
case -8: error = tr("invalid file: \"length3\" field wrong"); break;
default: error = tr("unknown"); break;
}
m_dp->addItem(tr("Error in scramble: %1").arg(error), LOGERROR);
firmwareBin.remove(); firmwareBin.remove();
newBin.remove(); newBin.remove();
newHex.remove(); newHex.remove();

View file

@ -18,9 +18,9 @@
* *
****************************************************************************/ ****************************************************************************/
#include <QtCore>
#include "irivertools.h" #include "irivertools.h"
const unsigned char munge[] = { const unsigned char munge[] = {
0x7a, 0x36, 0xc4, 0x43, 0x49, 0x6b, 0x35, 0x4e, 0xa3, 0x46, 0x25, 0x84, 0x7a, 0x36, 0xc4, 0x43, 0x49, 0x6b, 0x35, 0x4e, 0xa3, 0x46, 0x25, 0x84,
0x4d, 0x73, 0x74, 0x61 0x4d, 0x73, 0x74, 0x61
@ -47,7 +47,7 @@ const unsigned char header[][16] = {
/* begin mkboot.c excerpt */ /* begin mkboot.c excerpt */
unsigned char image[0x400000 + 0x220 + 0x400000/0x200]; unsigned char image[0x400000 + 0x220 + 0x400000/0x200];
bool mkboot(QString infile, QString outfile,QString bootloader,int origin,ProgressloggerInterface* dp) int mkboot(QString infile, QString outfile, QString bootloader, int origin)
{ {
int i; int i;
int len,bllen; int len,bllen;
@ -59,13 +59,13 @@ bool mkboot(QString infile, QString outfile,QString bootloader,int origin,Progre
QFile f(infile); QFile f(infile);
if(!f.open(QIODevice::ReadOnly)) if(!f.open(QIODevice::ReadOnly))
{ {
dp->addItem("Could not open: %1" + infile,LOGERROR); // can't open input file
return false; return -1;
} }
i = f.read((char*)image,16); i = f.read((char*)image,16);
if(i < 16) { if(i < 16) {
dp->addItem("reading header failed",LOGERROR); // reading header failed
return false; return -2;
} }
/* This is the length of the binary image without the scrambling /* This is the length of the binary image without the scrambling
@ -77,8 +77,8 @@ bool mkboot(QString infile, QString outfile,QString bootloader,int origin,Progre
len = binary_length+0x200-16; len = binary_length+0x200-16;
i = f.read((char*)image+16, len); i = f.read((char*)image+16, len);
if(i < len) { if(i < len) {
dp->addItem("reading firmware failed",LOGERROR); // reading firmware failed
return false; return -3;
} }
f.close(); f.close();
@ -86,24 +86,24 @@ bool mkboot(QString infile, QString outfile,QString bootloader,int origin,Progre
f.setFileName(bootloader); f.setFileName(bootloader);
if(!f.open(QIODevice::ReadOnly)) if(!f.open(QIODevice::ReadOnly))
{ {
dp->addItem("Could not open: %1" + bootloader,LOGERROR); // can't open bootloader file
return false; return -4;
} }
bllen = f.size(); bllen = f.size();
i = f.read((char*)image+0x220 + origin, bllen); i = f.read((char*)image+0x220 + origin, bllen);
if(i < bllen) { if(i < bllen) {
dp->addItem("reading bootloader failed",LOGERROR); // reading bootloader file failed
return false; return -5;
} }
f.close(); f.close();
f.setFileName(outfile); f.setFileName(outfile);
if(!f.open(QIODevice::WriteOnly)) if(!f.open(QIODevice::WriteOnly))
{ {
dp->addItem("Could not open: %1" + outfile,LOGERROR); // can't open output file
return false; return -6;
} }
/* Patch the reset vector to start the boot loader */ /* Patch the reset vector to start the boot loader */
@ -154,13 +154,13 @@ bool mkboot(QString infile, QString outfile,QString bootloader,int origin,Progre
i = f.write((char*)image,total_length); i = f.write((char*)image,total_length);
if(i < total_length) { if(i < total_length) {
dp->addItem("writing bootloader failed",LOGERROR); // writing bootloader file failed
return false; return -7;
} }
f.close(); f.close();
return true; return 0;
} }
/* end mkboot.c excerpt */ /* end mkboot.c excerpt */
@ -208,7 +208,7 @@ static void modifyheader( unsigned char * data )
}; };
int iriver_decode(QString infile_name, QString outfile_name, unsigned int modify, int iriver_decode(QString infile_name, QString outfile_name, unsigned int modify,
enum striptype stripmode,ProgressloggerInterface* dp ) enum striptype stripmode)
{ {
QFile infile(infile_name); QFile infile(infile_name);
QFile outfile(outfile_name); QFile outfile(outfile_name);
@ -226,32 +226,30 @@ int iriver_decode(QString infile_name, QString outfile_name, unsigned int modify
if(!infile.open(QIODevice::ReadOnly)) if(!infile.open(QIODevice::ReadOnly))
{ {
dp->addItem("Could not open: %1" + infile_name,LOGERROR); // can't open input file
return -1; return -1;
} }
if(!outfile.open(QIODevice::WriteOnly)) if(!outfile.open(QIODevice::WriteOnly))
{ {
dp->addItem("Could not open: %1" + outfile_name,LOGERROR); // can't open output file
return -1; return -2;
} }
lenread = infile.read( (char*)headerdata, 512); lenread = infile.read( (char*)headerdata, 512);
if( lenread != 512 ) if( lenread != 512 )
{ {
dp->addItem("This doesn't look like a valid encrypted iHP" // header length doesn't match
"firmware - reason: header length.",LOGERROR);
infile.close(); infile.close();
outfile.close(); outfile.close();
return -1; return -3;
}; };
i = testheader( headerdata ); i = testheader( headerdata );
if( i == -1 ) if( i == -1 )
{ {
dp->addItem("This firmware is for an unknown model, or is not" // header unknown
" a valid encrypted iHP firmware.",LOGERROR);
infile.close(); infile.close();
outfile.close(); outfile.close();
return -1; return -4;
}; };
fprintf( stderr, "Model %s\n", models[ i ] ); fprintf( stderr, "Model %s\n", models[ i ] );
@ -270,11 +268,10 @@ int iriver_decode(QString infile_name, QString outfile_name, unsigned int modify
dwLength2>>9 != dwLength3 || dwLength2>>9 != dwLength3 ||
dwLength2+dwLength3+512 != dwLength1 ) dwLength2+dwLength3+512 != dwLength1 )
{ {
dp->addItem("This doesn't look like a valid encrypted " // file 'length' data is wrong
"iHP firmware - reason: file 'length' data.",LOGERROR);
infile.close(); infile.close();
outfile.close(); outfile.close();
return -1; return -5;
}; };
pChecksums = ppChecksums = (unsigned char *)( malloc( dwLength3 ) ); pChecksums = ppChecksums = (unsigned char *)( malloc( dwLength3 ) );
@ -332,11 +329,10 @@ int iriver_decode(QString infile_name, QString outfile_name, unsigned int modify
if( fp != dwLength2 ) if( fp != dwLength2 )
{ {
dp->addItem("This doesn't look like a valid encrypted " // 'length2' field mismatch
"iHP firmware - reason: 'length2' mismatch.",LOGERROR);
infile.close(); infile.close();
outfile.close(); outfile.close();
return -1; return -6;
}; };
fp = 0; fp = 0;
@ -349,22 +345,20 @@ int iriver_decode(QString infile_name, QString outfile_name, unsigned int modify
outfile.write((char*) blockdata, lenread ); outfile.write((char*) blockdata, lenread );
if( memcmp( ppChecksums, blockdata, lenread ) != 0 ) if( memcmp( ppChecksums, blockdata, lenread ) != 0 )
{ {
dp->addItem("This doesn't look like a valid encrypted " // file checksum wrong
"iHP firmware - reason: Checksum mismatch!",LOGERROR);
infile.close(); infile.close();
outfile.close(); outfile.close();
return -1; return -7;
}; };
ppChecksums += lenread; ppChecksums += lenread;
}; };
if( fp != dwLength3 ) if( fp != dwLength3 )
{ {
dp->addItem("This doesn't look like a valid encrypted " // 'length3' field mismatch
"iHP firmware - reason: 'length3' mismatch.",LOGERROR);
infile.close(); infile.close();
outfile.close(); outfile.close();
return -1; return -8;
}; };
@ -392,7 +386,7 @@ int iriver_decode(QString infile_name, QString outfile_name, unsigned int modify
}; };
int iriver_encode(QString infile_name, QString outfile_name, unsigned int modify,ProgressloggerInterface* dp ) int iriver_encode(QString infile_name, QString outfile_name, unsigned int modify)
{ {
QFile infile(infile_name); QFile infile(infile_name);
QFile outfile(outfile_name); QFile outfile(outfile_name);
@ -409,22 +403,23 @@ int iriver_encode(QString infile_name, QString outfile_name, unsigned int modify
if(!infile.open(QIODevice::ReadOnly)) if(!infile.open(QIODevice::ReadOnly))
{ {
dp->addItem("Could not open: %1" + infile_name,LOGERROR); // can't open input file
return -1; return -1;
} }
if(!outfile.open(QIODevice::WriteOnly)) if(!outfile.open(QIODevice::WriteOnly))
{ {
dp->addItem("Could not open: %1" + outfile_name,LOGERROR); // can't open output file
return -1; infile.close();
return -2;
} }
lenread = infile.read((char*) headerdata, 512 ); lenread = infile.read((char*) headerdata, 512 );
if( lenread != 512 ) if( lenread != 512 )
{ {
dp->addItem("This doesn't look like a valid decoded " // header length error
"iHP firmware - reason: header length.",LOGERROR);
infile.close(); infile.close();
outfile.close(); outfile.close();
return -3;
}; };
if( modify ) if( modify )
@ -435,10 +430,10 @@ int iriver_encode(QString infile_name, QString outfile_name, unsigned int modify
i = testheader( headerdata ); i = testheader( headerdata );
if( i == -1 ) if( i == -1 )
{ {
dp->addItem("This firmware is for an unknown model, or is not" // header verification error
" a valid decoded iHP firmware.",LOGERROR);
infile.close(); infile.close();
outfile.close(); outfile.close();
return -4;
}; };
fprintf( stderr, "Model %s\n", models[ i ] ); fprintf( stderr, "Model %s\n", models[ i ] );
@ -456,10 +451,10 @@ int iriver_encode(QString infile_name, QString outfile_name, unsigned int modify
dwLength3 > dwLength1 || dwLength3 > dwLength1 ||
dwLength2+dwLength3+512 != dwLength1 ) dwLength2+dwLength3+512 != dwLength1 )
{ {
dp->addItem("This doesn't look like a valid decoded " // file 'length' error
"iHP firmware - reason:file 'length' data.",LOGERROR);
infile.close(); infile.close();
outfile.close(); outfile.close();
return -5;
}; };
pChecksums = ppChecksums = (unsigned char *)( malloc( dwLength3 ) ); pChecksums = ppChecksums = (unsigned char *)( malloc( dwLength3 ) );
@ -494,10 +489,10 @@ int iriver_encode(QString infile_name, QString outfile_name, unsigned int modify
if( fp != dwLength2 ) if( fp != dwLength2 )
{ {
dp->addItem("This doesn't look like a valid decoded " // file 'length1' mismatch
"iHP firmware - reason: 'length1' mismatch.",LOGERROR);
infile.close(); infile.close();
outfile.close(); outfile.close();
return -6;
}; };
/* write out remainder w/out applying descrambler */ /* write out remainder w/out applying descrambler */
@ -514,10 +509,10 @@ int iriver_encode(QString infile_name, QString outfile_name, unsigned int modify
if( fp != dwLength3 ) if( fp != dwLength3 )
{ {
dp->addItem("This doesn't look like a valid decoded " // 'length2' field mismatch
"iHP firmware - 'length2' mismatch.",LOGERROR);
infile.close(); infile.close();
outfile.close(); outfile.close();
return -8;
}; };
fprintf( stderr, "File encoded successfully and checksum table built!\n" ); fprintf( stderr, "File encoded successfully and checksum table built!\n" );

View file

@ -25,7 +25,6 @@
#include <QtCore> #include <QtCore>
#include "md5sum.h" #include "md5sum.h"
#include "progressloggerinterface.h"
#define ESTF_SIZE 32 #define ESTF_SIZE 32
@ -37,18 +36,18 @@ struct sumpairs {
enum striptype enum striptype
{ {
STRIP_NONE, STRIP_NONE,
STRIP_HEADER_CHECKSUM, STRIP_HEADER_CHECKSUM,
STRIP_HEADER_CHECKSUM_ESTF STRIP_HEADER_CHECKSUM_ESTF
}; };
/* protos for iriver.c */ /* protos for iriver.c */
int intable(char *md5, struct sumpairs *table, int len); int intable(char *md5, struct sumpairs *table, int len);
bool mkboot(QString infile, QString outfile,QString bootloader,int origin,ProgressloggerInterface* dp); int mkboot(QString infile, QString outfile,QString bootloader,int origin);
int iriver_decode(QString infile_name, QString outfile_name, unsigned int modify, int iriver_decode(QString infile_name, QString outfile_name, unsigned int modify,
enum striptype stripmode,ProgressloggerInterface* dp ); enum striptype stripmode);
int iriver_encode(QString infile_name, QString outfile_name, unsigned int modify,ProgressloggerInterface* dp); int iriver_encode(QString infile_name, QString outfile_name, unsigned int modify);
#endif // IRIVERTOOLS_H_INCLUDED #endif // IRIVERTOOLS_H_INCLUDED