Vous devez être connecté et donner une réaction ( Like ) au sujet pour débloquer les liens de téléchargements...
Sgt Fatality

Sujet à réécrire : QT C++ - KC - [Théorie] Un updater en C++ avec la librairie Qt

Recommended Posts

Bonjour à toutes et à tous,

 

Voici un petit tutoriel "théorique" sur la réalisation d'un updater en C++ avec la librairie Qt.

 

Sommaire :

 

  • Choix de l'utilisation du XML
  • Réalisation du XML
  • Téléchargement du fichier XML
  • Récupération du hash (SHA1) du client
  • Récupération de la version actuelle et de la version du client

 

Aller, c'est parti ! :)

 

Choix de l'utilisation du XML :

J'ai choisi d'utiliser le XML car ça me permet d'avoir premièrement, un fichier clair et précis, compréhensible rien quand le lisant directement et deuxièmement car ça permet une certaine souplesse.

 

Réalisation du XML :

Le fichier XML est réalisé à la main et suis cette logique :








 

On retrouve la version actuelle de notre programme :

Et on a la liste des updates dans qui contient pour chaque update : la version, le hash (SHA1) et le lien (pour télécharger l'update "suivant").

 

Voilà, ce n'est qu'un exemple, vous pouvez imaginer un XML totalement différent :)

 

PS: A vous de vous débrouillez pour récupérer le hash de votre programme (PHP, Qt, etc...)

 

Téléchargement du fichier XML

Le téléchargement du fichier XML ce fait en 2 fonctions (2 fonctions pour que ce soit plus clair, mais on aurait très bien pu le faire en 1 seule fonction ;)) :

 

1) Le téléchargement

2) La sauvegarde

 

Je vous donne le code des fonctions directement, mais regarder quand même attentivement ce qu'il fait, surtout qu'il est commenté !

 

La fonction de téléchargement : void DownloadXML()

const QUrl url = QUrl("http://votresite.com/updatelist.xml"); // Url directe vers votre fichier XML
const QNetworkRequest request(url); // Construction de la requête
QNetworkAccessManager *m = new QNetworkAccessManager;
QNetworkReply *r = m->get(requete); // Envoi de la requête

connect(r, SIGNAL(finished()), this, SLOT(SaveXML())); // Connexion du signal finished() (téléchargement terminé) à la fonction "SaveXML"

 

La fonction de sauvegarde, qui est lancée lorsque le téléchargement est terminé :

 

QNetworkReply *r = qobject_cast(sender()); // Récupération le pointeur du retour de notre requête
QFile f("update.xml");
f.open(QIODevice::WriteOnly); // Ouverture du fichier en écriture seule
f.write(r->readAll()); // Ecriture du contenu de la requête (donc notre fichier XML) dans le fichier local
f.close(); // Fermeture du fichier
r->deleteLater(); // Suppression du pointeur

 

Récupération du hash (SHA1) du client :

Nous allons maintenant récupérer le hash du client pour savoir quelle version du logiciel il a actuellement, fonction "QByteArray getHash()" :

QFile file("votreprogramme.exe");
// Il faudrait que vous vérifiez si le fichier est bien disponible et bien dans le bon dossier, je vous laisse le faire 
return QCryptographicHash::hash(file.readAll(), QCryptographicHash::Sha1);

 

Récupération de la version actuelle et de la version du client :

Maintenant il ne nous reste plus qu'à récupérer la version actuelle du programme et la version du client puis de les comparer !

 

Fonction "void LoadXML()" :

QFile xml_doc("update.xml"); // Récupération de notre fichier XML
// 

QString ClientHash(getHash()); // Le hash du client
QString ActualVersion; // La version actuelle du programme (dernière version disponible)
QString ClientVersion; // La version du client
QString DownloadLink; // Le lien pour télécharger la mise à jour

QXmlStreamReader xml(&xml_doc);

while(!xml.atEnd())
{
xml.readNext();

if (xml.isStartElement())
{
	QXmlStreamAttributes attributes = xml.attributes();

	if(xml.name() == "ActualVersion") // Récupération de la version actuelle du programme
		ActualVersion = attributes.value("version").toString();
	else if (xml.name() == "ClientVersion")
	{
		if(attributes.value("hash").toString() == ClientHash) { // On trouve la version du client et le lien de la mise à jour grâce au hash
			ClientVersion = attributes.value("version").toString();
			DownloadLink = attributes.value("link").toString();
		}
	}

}
}

// Il ne vous reste plus qu'à comparer si la version du client est différente de celle du serveur :
if(ClientVersion != ActualVersion)
// Télécharger la mise à jour
else
// Client à jour

 

Voilà, je crois que je n'ai rien oublié ! Bien évidemment c'est un tutoriel théorique, après à vous de mettre tout ceci en place et d'expérimenter ! :P

 

Cordialement,

Sgt Fatality

Share this post


Link to post
Share on other sites

Petite question : Comment savoir le hash ? Il faut l'apprendre par coeur ? Ou il y a comme une 'propriété' ?

 

Le hash peut-être récupérer via la fonction getHash() de l'updater, mais tu peux le récupérer via un script PHP ou bien un autre langage. ( Infos sur le SHA1 : http://fr.wikipedia.org/wiki/SHA-1 )

 

J'ai pas compris pour l'histoire du "style" ^^

Share this post


Link to post
Share on other sites

Petite question : Comment savoir le hash ? Il faut l'apprendre par coeur ? Ou il y a comme une 'propriété' ?

 

Le hash peut-être récupérer via la fonction getHash() de l'updater, mais tu peux le récupérer via un script PHP ou bien un autre langage. ( Infos sur le SHA1 : http://fr.wikipedia.org/wiki/SHA-1 )

 

J'ai pas compris pour l'histoire du "style" ^^

 

Des images de decord si tu préfaire

Share this post


Link to post
Share on other sites

j'aimerais préciser que l'on peut aussi faire ceci avec du c++ mais .net via la librairie de microsoft >> msdn

Share this post


Link to post
Share on other sites

j'aimerais préciser que l'on peut aussi faire ceci avec du c++ mais .net via la librairie de microsoft >> msdn

 

avec la puissance et la compatibilité mac / linux en moins

Share this post


Link to post
Share on other sites

j'aimerais préciser que l'on peut aussi faire ceci avec du c++ mais .net via la librairie de microsoft >> msdn

 

avec la puissance et la compatibilité mac / linux en moins

 

+1 ;)

Share this post


Link to post
Share on other sites

Bonjour,

 

Le partage / tutoriel ici présent doit être réécrit. Le lien de téléchargement est probablement mort... Message automatique de masse...

 

Cordialement,

ASIKOO

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.