Afficher une image Gravatar

Dans cet article, nous allons voir comment afficher une image Gravatar dans une application conçue avec C++Builder.

Tout d’abord, il faut créer un projet FireMonkey dans lequel il faut ajouter un composant TEdit, un TButton et un TImage.

Ensuite, il faut ajouter les fichiers d’en-têtes suivants:

#include <System.Hash.hpp>
#include <IPPeerClient.hpp>
#include <REST.Client.hpp>

Par la suite, vous pouvez ajouter ce code dans l’évènement OnClick du bouton:

String LUrl = Edit1->Text.Trim().LowerCase();
LUrl= System::Hash::THashMD5::GetHashString(LUrl);
LUrl = "http://www.gravatar.com/avatar/" + LUrl + "?s=80";
 
System::Classes::TMemoryStream* LStream = NULL;
try
{
    LStream = new System::Classes::TMemoryStream();
    Rest::Client::TDownloadURL::DownloadRawBytes(LUrl, LStream);
    Image1->Bitmap->LoadFromStream(LStream);
}
__finally
{
    delete LStream;
}

Le fonctionnement est simple: vous devez entrer une adresse de courrier électronique dans la zone de texte et cliquer sur le bouton par la suite. Le Gravatar correspondant à l’adresse va être téléchargé et affiché dans le composant TImage. S’il n’y a pas d’image liées à l’adresse, alors une image par défaut sera chargée.

Dans l’URL qui correspond à l’image à télécharger, on peut spécifier la grandeur de l’image à l’aide du paramètre s= ou size=. Par défaut, la grandeur est de 80 pixels par 80 pixels si elle n’est pas spécifiée. La grandeur peut être de 1 pixel jusqu’à 2048 pixels.

Je vous laisse avec un exemple de ce que à quoi pourrait ressembler l’application:

Gravatar

MD5 et SHA1 avec l’unité System::Hash

Dans un article précédent, j’avais montré comment calculer un hachage MD5 et SHA1 avec Indy. Je me suis rendu compte cette semaine qu’il existait depuis C++Builder XE8 une manière d’effectuer ces mêmes calculs sans avoir de dépendance sur la bibliothèque de communication Indy.

Tout d’abord, il faut ajouter le fichier d’en-tête suivant:

#include <System.Hash.hpp>

Pour MD5, il faut ce code:

String __fastcall TForm1::GetHashMD5(const String AFileName)
{
    System::Hash::THashMD5 LMd5 = System::Hash::THashMD5::Create();
    System::Classes::TFileStream* LFileStream = NULL;
    try
    {
        LFileStream = new System::Classes::TFileStream(AFileName,
            fmOpenRead | fmShareDenyWrite);
        System::DynamicArray<System::Byte> Buffer;
        Buffer.Length = LFileStream->Size;
        LFileStream->Read(&Buffer[0], Buffer.Length);
        LMd5.Update(Buffer);
    }
    __finally
    {
        delete LFileStream;
    }
    return LMd5.HashAsString().UpperCase();
}

Pour SHA1, on utilise ce code:

String __fastcall TForm1::GetHashSHA1(const String AFileName)
{
    System::Hash::THashSHA1 LSha1 = System::Hash::THashSHA1::Create();
    System::Classes::TFileStream* LFileStream = NULL;
    try
    {
        LFileStream = new System::Classes::TFileStream(AFileName,
            fmOpenRead | fmShareDenyWrite);
        System::DynamicArray<System::Byte> Buffer;
        Buffer.Length = LFileStream->Size;
        LFileStream->Read(&Buffer[0], Buffer.Length);
        LSha1.Update(Buffer);
    }
    __finally
    {
        delete LFileStream;
    }
    return LSha1.HashAsString().UpperCase();
}

Une nouvelle version de l’IDE, C++Builder 10 Seattle, est maintenant disponible. L’unité System::Hash a un nouveau membre. Il s’agit de THashSHA2. Il implémente la famille de fonctions de hachage SHA-2:

enum DECLSPEC_DENUM TSHA2Version : unsigned char { SHA224, SHA256, SHA384, SHA512, SHA512_224, SHA512_256 };