Aller au contenu
Concours du mois de Juin 2018 : Carte Amazon 15 €
Sgt Fatality

tutoriel [Théorie] Un updater en C++ avec la librairie Qt

Messages recommandés

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

Partager ce message


Lien à poster
Partager sur d’autres 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 :

Contenu Masqué

    Répondez au message pour visualiser le contenu
)

 

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

Partager ce message


Lien à poster
Partager sur d’autres 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 :

Contenu Masqué

    Répondez au message pour visualiser le contenu
)

 

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

 

Des images de decord si tu préfaire

Partager ce message


Lien à poster
Partager sur d’autres 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

Partager ce message


Lien à poster
Partager sur d’autres 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 ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×

Information importante

By using this site, you agree to our Conditions d’utilisation.