wiiqt/nand_dump/nusdownloader.h
giantpune@gmail.com b0db7bf382 * add wad packing to NUS tool
* add more "known updates" to the NUS class.  now your can specify "3.4u" or similar instead of a TID and it will try to download all the titles that would have been in that update.    the lists of titles were taken from wiimpersonator logs and when those were missing, from disc update partitions.  thanks to markhemus and rduke for helping make the lists
* NUS tool will now make sure there is a valid setting.txt in the nand after it is done installing titles to it
2010-12-08 18:07:57 +00:00

205 lines
6.9 KiB
C++

#ifndef NUSDOWNLOADER_H
#define NUSDOWNLOADER_H
#include "includes.h"
#include "tiktmd.h"
#define SHOPPING_USER_AGENT "Opera/9.00 (Nintendo Wii; U; ; 1038-58; Wii Shop Channel/1.0; en)"
#define UPDATING_USER_AGENT "wii libnup/1.0"
#define VIRTUAL_CONSOLE_USER_AGENT "libec-3.0.7.06111123"
#define WIICONNECT24_USER_AGENT "WiiConnect24/1.0FC4plus1 (build 061114161108)"
#define NUS_BASE_URL "http://ccs.shop.wii.com/ccs/download/"
#define TITLE_LATEST_VERSION 0xffff
enum
{
IDX_CETK = 0x9000,
IDX_TMD
};
//struct used to keep all the data about a NUS request together
//when a finished job is returned, the data list will be the TMD, then the ticket, then all the contents
struct NusJob
{
quint64 tid;
quint16 version;
bool decrypt;
QList<QByteArray> data;
};
struct downloadJob
{
QString tid;
QString name;
quint16 index;
QByteArray data;
};
//class to download titles from nintendo update servers
class NusDownloader : public QObject
{
Q_OBJECT
public:
explicit NusDownloader( QObject *parent = 0, const QString &cPath = QString() );
//set the path used to cache files
void SetCachePath( const QString &cPath = QString() );
//get a title from NUS. if version is 0, get the latest one
void GetTitle( NusJob job );
void GetTitles( QList<NusJob> jobs );
void Get( quint64 tid, bool decrypt, quint16 version = TITLE_LATEST_VERSION );
//TODO! this function is far from complete
//starts getting all the titles involved for a given update
//expects strings like "4.2u" and "3.4e" ( any of the updates listed below should be working )
//returns false if it doesnt know the IOS for the given string
// The boot2 update is not uncluded in this. ask for it separately if you want it
bool GetUpdate( const QString & upd, bool decrypt = true );
//get a list of titles for a given update
//if a title is not available on NUS, a substitute is given instead ( a later version of the same title )
//to keep people from bulk DLing and installing and messing something up, any boot2 upudate will not be included
//in the list, ask for it specifically
//lists are created from wiimpersonator logs when available. otherwise they come from examining game update partitions
static QMap< quint64, quint16 > List20u();
static QMap< quint64, quint16 > List30u();
static QMap< quint64, quint16 > List31u();
static QMap< quint64, quint16 > List32u();
static QMap< quint64, quint16 > List33u();
static QMap< quint64, quint16 > List34u();
static QMap< quint64, quint16 > List40u();
static QMap< quint64, quint16 > List41u();
static QMap< quint64, quint16 > List42u();
static QMap< quint64, quint16 > List43u();
static QMap< quint64, quint16 > List21e();
static QMap< quint64, quint16 > List30e();
static QMap< quint64, quint16 > List31e();
//static QMap< quint64, quint16 > List32e();
//static QMap< quint64, quint16 > List33e();
static QMap< quint64, quint16 > List34e();
static QMap< quint64, quint16 > List40e();
static QMap< quint64, quint16 > List41e();
static QMap< quint64, quint16 > List42e();
static QMap< quint64, quint16 > List43e();
static QMap< quint64, quint16 > List35k();
static QMap< quint64, quint16 > List41k();
static QMap< quint64, quint16 > List42k();
static QMap< quint64, quint16 > List43k();
static QMap< quint64, quint16 > List20j();
//static QMap< quint64, quint16 > List30j();
static QMap< quint64, quint16 > List31j();
//static QMap< quint64, quint16 > List32j();
//static QMap< quint64, quint16 > List33j();
static QMap< quint64, quint16 > List34j();
static QMap< quint64, quint16 > List40j();
static QMap< quint64, quint16 > List41j();
static QMap< quint64, quint16 > List42j();
static QMap< quint64, quint16 > List43j();
private:
//helper function to create a job
downloadJob CreateJob( QString name, quint16 index );
//path on the PC to try and get files from and save to to avoid downloading deplicates from NUS
QString cachePath;
//get data from the cache and put it in the job's data
//uses the version from currentJob
QByteArray GetDataFromCache( downloadJob job );
//saves downloaded data to the HDD for later use
bool SaveDataToCache( const QString &path, const QByteArray &stuff );
//check the tmd and try to ticket
void ReadTmdAndGetTicket( QByteArray ba );
bool DecryptCheckHashAndAppendData( const QByteArray &encData, quint16 idx );
//triggered when a file is done downloading
void FileIsFinishedDownloading( downloadJob job );
//send a fail message about the current job and skip to the next
void CurrentJobErrored( const QString &str );
//print info about a job to qDebug()
void DbgJoB( NusJob job );
//get the path for a file in the local cache
QString GetCachePath( quint32 idx );
//list of stuff to do
QList<NusJob>jobList;
//variables to keep track of the current downloading title
NusJob currentJob;
Tmd curTmd;
//variables for actually downloading something from the interwebz
QNetworkAccessManager manager;
QQueue< downloadJob > downloadQueue;
QNetworkReply *currentDownload;
QTime downloadTime;
QString currentJobText;
downloadJob dlJob;
//should be true if this object is busy getting a title and false if all work is done, or a fatal error
bool running;
//used to help in sending the overall progress done, should be reset on fatal error or when all jobs are done
quint32 totalJobs;
//used to help in sending the progress for the current title
quint32 totalTitleSize;
quint32 TitleSizeDownloaded();
QByteArray decKey;
signals:
void SendError( const QString &message, NusJob job );//send an errer and the title the error is about
//send an errer and the title the error is about, no more jobs will be done, and the SendDone signal will not be emited
void SendFatalErrorError( const QString &message, NusJob job );
void SendDone();//message that all jobs are done
//send progress about the currently downloading job
void SendDownloadProgress( int );
//send progress about the overall progress
void SendTotalProgress( int );
//send progress info about the current title
void SendTitleProgress( int );
//sends a completed job to whoever is listening
void SendData( NusJob );
//a file is done downloading
void finished();
//send pretty text about what is happening
void SendText( QString );
//maybe this one is redundant
//void SendJobFinished( downloadJob );
public slots:
void StartNextJob();
void GetNextItemForCurrentTitle();
//slots for actually downloading something from online
void StartDownload();
void downloadProgress( qint64 bytesReceived, qint64 bytesTotal );
void downloadFinished();
void downloadReadyRead();
};
#endif // NUSDOWNLOADER_H