sgcIndy en cinq minutes

sgcIndy est une version maintenue d'Indy, pas un fork aux noms changés. Les noms d'unités, les noms de classes et les pages de la palette de composants sont ceux que tu utilises déjà, le démarrage rapide n'est donc pas « écris ce code », c'est « installe, recompile, puis définis une nouvelle propriété ».

Mêmes noms d'unités et de classes qu'Indy
OpenSSL 1.0, 1.1 et 3.0, avec TLS 1.3
Delphi, C++Builder, FreePascal et Lazarus

Le fait qui détermine tout le reste

Il n'y a pas de préfixe sgcId. Pas une unité, pas une classe. Ton code existant compile sans modification.

Noms d'unités

Les noms Indy d'origine. IdTCPClient, IdHTTP, IdSSLOpenSSL, et environ quatre cents autres. Aucune unité de la bibliothèque n'est nommée avec un préfixe sgc.

Noms de classes

Les noms Indy d'origine également : TIdTCPClient, TIdHTTP, TIdSSLIOHandlerSocketOpenSSL, TIdSSHClient, TIdSFTPClient.

Pages de palette

Les mêmes cinq : Indy Clients, Indy Servers, Indy Intercepts, Indy I/O Handlers et Indy Misc. Environ 166 composants répartis entre elles, aux endroits où tu regardes déjà.

Alors, qu'est-ce qui change

L'installeur change les packages que l'IDE charge et réécrit le chemin de recherche. Ton projet ne change pas. La différence visible est une nouvelle propriété, SSLOptions.APIVersion, et les corrections en dessous.

Prérequis et éditions

sgcIndy n'a pas de niveaux de fonctionnalités. Les niveaux de licence changent ce qui est dans la boîte, pas ce que le code peut faire.

Quoi Valeur
IDE Delphi 7 jusqu'à RAD Studio 13, et C++Builder 2007 jusqu'à 13. Des groupes de packages sont livrés pour chacun.
Clause uses Inchangée. Tout ce que ton projet écrit déjà continue de fonctionner, car les noms d'unités sont identiques à ceux d'Indy standard.
Version de base d'Indy La bibliothèque se présente comme Indy 10.6.3.12. Les modifications sgc sont signalées par des commentaires et des defines conditionnels dans les unités d'origine, et non en les renommant.
Éditions Aucun niveau de fonctionnalités. L'indicateur d'édition est injecté à la compilation et n'a que deux consommateurs, la boîte À propos et l'écran de démarrage de l'IDE. Rien dans la bibliothèque n'est conditionné par lui. Ce que les niveaux changent réellement, c'est le packaging : les versions Community et Basic livrent des binaires compilés sans les fichiers .pas et .inc, alors que la version avec sources les inclut.
FreePascal et Lazarus Pris en charge. Un package Lazarus est livré, avec les squelettes de packages FreePascal et les fichiers de compilation, et l'échelle de compilateurs couvre FPC 2.2.2 jusqu'à 3.3.1. Une réserve : le mode Delphi est volontairement désactivé pour Lazarus, donc une unité qui le suppose devra être adaptée.
Plateformes Windows, Linux, macOS, FreeBSD, iOS et Android ont chacun leurs propres blocs conditionnels. Sous iOS, OpenSSL doit être lié statiquement.

Ce qu'il y a de plus utile à savoir avant de commencer : comme les noms d'unités entrent en collision avec l'Indy livré dans RAD Studio, l'installeur gère l'échange pour toi. Il désenregistre les packages de conception Indy intégrés, enregistre les siens et réécrit les chemins de recherche de l'IDE.

Installer et confirmer l'échange

L'installeur fait le travail. Ce qui compte, c'est de confirmer ensuite que l'IDE charge bien sgcIndy.

1. Lancer l'installeur

Lance le programme d'installation téléchargé et coche les versions de RAD Studio et les plateformes voulues. Il copie la bibliothèque et, pour les packages Community et Basic, omet les fichiers source.

2. Le laisser échanger les packages

L'installeur désenregistre les packages de conception Indy intégrés à l'IDE et enregistre les siens à leur place. C'est ce qui fait que les mêmes noms d'unités pointent vers sgcIndy.

3. Le laisser corriger le chemin de recherche

Il place les dossiers de sgcIndy en tête des chemins de recherche de l'IDE pour chaque plateforme, et supprime les entrées obsolètes d'une installation précédente.

4. Confirmer à l'écran de démarrage

Redémarre l'IDE. L'écran de démarrage mentionne sgcIndy, et la boîte À propos d'Indy aussi. C'est la vérification que l'échange a bien eu lieu.

5. Recompiler ton projet

Ouvre ton projet Indy existant et recompile-le. Ne touche pas à la clause uses. S'il compilait avec Indy standard, il compile avec celui-ci.

Recompiler, puis atteindre TLS 1.3

Le premier onglet montre à quoi ressemble déjà ton projet existant. Le deuxième est la seule nouvelle ligne à ajouter. Le troisième prouve que tu utilises sgcIndy et non Indy standard.

FHttpClient.pas
// This is a shipped sgcIndy demo's uses clause.
// Read it twice: there is not one sgc prefix in it.
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL,
  IdSSLOpenSSL, IdSSLOpenSSLHeaders, StdCtrls;

Ton projet existant ressemble déjà à cela, c'est tout l'intérêt. Il n'y a pas de sgcIdTCPClient ni de TsgcIdSSLIOHandlerSocketOpenSSL, car aucune unité et aucune classe de la bibliothèque ne porte de préfixe sgc. Installe, recompile, c'est fini.

FHttpClient.pas
procedure TFRMHttpClient.btnGoToClick(Sender: TObject);
var
  oStream: TStringStream;
begin
  // Two separate settings. APIVersion picks which generation of the
  // OpenSSL API to call, Method picks the TLS version. TLS 1.3 needs
  // the 3.0 API, so both lines change together.
  IdSSLIOHandlerSocketOpenSSL1.SSLOptions.APIVersion := sslvAPI_3_0;
  IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1_3;

  oStream := TStringStream.Create('');
  try
    IdHTTP1.Get(txtURL.Text, oStream);
  finally
    FreeAndNil(oStream);
  end;
end;

TIdSSLAPIVersion a pour membres sslvAPIDefault, sslvAPI_1_0, sslvAPI_1_1 et sslvAPI_3_0. Ni le type ni la propriété n'existent dans Indy standard, ce qui fait de cet extrait une preuve à la compilation de la bibliothèque avec laquelle tu compiles.

fTcpClient.pas
procedure TfrmTCPClient.btnConnectClick(Sender: TObject);
begin
  IdSSLIOHandlerSocketOpenSSL1.SSLOptions.APIVersion := sslvAPI_3_0;
  IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1_3;

  IdTCPClient1.Host := txtHost.Text;
  IdTCPClient1.Port := StrToInt(txtPort.Text);
  IdSSLIOHandlerSocketOpenSSL1.PassThrough := False;

  IdTCPClient1.Connect;
end;

procedure TfrmTCPClient.btnDisconnectClick(Sender: TObject);
begin
  IdTCPClient1.Disconnect;
end;

Mêmes composants, mêmes propriétés, même page de palette. PassThrough := False transforme le socket simple en socket TLS, exactement comme dans Indy standard. La lecture se fait avec IdTCPClient1.IOHandler.ReadLn, l'écriture avec IOHandler.Write, sans changement.

Les deux premiers onglets proviennent de la démo livrée Demos\HttpClient\FHttpClient.pas, avec la liste déroulante remplacée par un littéral. Dix-huit démos sont livrées au total, dont des clients SSH et SFTP, un client FTP, des clients de messagerie, un serveur TCP et une paire UDP.

Prouver que tu utilises sgcIndy

Comme les noms d'unités sont identiques, tu ne peux pas le savoir d'après ton propre code source. Voici trois vérifications sans ambiguïté.

L'écran de démarrage

Redémarre l'IDE après l'installation. L'écran de démarrage mentionne sgcIndy. C'est la vérification que l'échange de packages a eu lieu, et c'est la plus rapide.

La boîte À propos

La boîte de dialogue À propos d'Indy indique eSeGeCe au lieu du texte standard, et mentionne Community Edition sur le package gratuit.

Une ligne qui ne compile pas avec Indy standard

SSLOptions.APIVersion := sslvAPI_3_0;. Le type TIdSSLAPIVersion n'existe pas dans Indy standard, donc si cette ligne compile, tu utilises sgcIndy.

Ton propre projet

Recompile-le sans toucher à la clause uses. Il doit compiler exactement comme avant, car les noms d'unités et de classes sont identiques.

Ce qui se passe généralement mal la première fois

Six problèmes expliquent presque toutes les migrations.

Tu es parti chercher des unités sgcId

Il n'y en a aucune. Zéro unité et zéro classe de la bibliothèque ne porte de préfixe sgc. Si tu réécris ta clause uses en sgcIdTCPClient, le projet ne compilera pas, car cette unité n'existe pas.

L'IDE charge toujours Indy standard

L'installeur gère l'échange de packages, cela signifie donc généralement que l'installation ne s'est pas terminée ou qu'une entrée manuelle du chemin de recherche prend le dessus. Vérifie l'écran de démarrage, qui mentionne sgcIndy quand l'échange a eu lieu.

TLS 1.3 ne négocie pas

Définis les deux propriétés. SSLOptions.APIVersion sélectionne la génération d'API OpenSSL à utiliser, et SSLOptions.Method sélectionne la version du protocole. TLS 1.3 nécessite l'API 3.0, donc les deux lignes doivent changer ensemble.

Les DLL OpenSSL sont absentes

Chaque dossier de démo livre l'ensemble dont il a besoin à côté de l'exécutable. Pour l'API 3.0, ce sont libcrypto-3.dll et libssl-3.dll. Pour les anciennes API, les noms sont différents, et copier la mauvaise paire est une cause fréquente de poignée de main qui échoue avant de commencer.

Une unité échoue sous Lazarus

Le mode Delphi est volontairement désactivé pour les versions Lazarus dans les defines du compilateur, avec un commentaire indiquant qu'il y échoue. Le code qui repose sur la sémantique du mode Delphi doit être adapté.

Les fichiers source ne sont pas dans le package

Les installeurs Community et Basic livrent des binaires compilés et excluent les fichiers .pas et .inc. Si tu as besoin d'entrer dans la bibliothèque pas à pas, il te faut le package qui inclut les sources.

Ce que sgcIndy ajoute à Indy

Quatre choses à connaître une fois la recompilation terminée.

OpenSSL moderne, et TLS 1.3

Indy standard 10.6.2 est antérieur aux changements d'API d'OpenSSL 1.1 et 3.0. SSLOptions.APIVersion sélectionne la génération, et sslvTLSv1_3 devient accessible avec l'API 3.0.

Fonctionnalités de sgcIndy

SSH et SFTP

TIdSSHClient et TIdSFTPClient ne figurent pas du tout dans Indy standard. Des démos sont livrées pour les deux.

Client SSH et client SFTP

Des serveurs hautes performances

Les gestionnaires d'E/S IOCP et epoll remplacent le modèle d'un thread par connexion sous Windows et Linux, ce qui change la forme d'un serveur sous charge réelle.

Comparaison

Authentification moderne pour le courrier

La prise en charge de XOAUTH2 permet à un client SMTP ou IMAP de s'authentifier auprès des fournisseurs qui ont abandonné l'authentification basique.

XOAUTH2 dans sgcIndy

Référence, démos et documentation

Dix-huit projets de démo sont livrés dans le téléchargement, d'un client d'écho à SSH et SFTP.

Fonctionnalités de sgcIndy Ce que cette version corrige et ajoute à Indy 10.6.3.
Comparaison sgcIndy face à Indy standard, fonctionnalité par fonctionnalité.
Télécharger Le package Community est gratuit.
Commander Les packages qui incluent le code source complet.
Aperçu du produit Ce qu'est sgcIndy, et à qui il s'adresse.
Tous les produits Les tarifs de chaque bibliothèque eSeGeCe dans un seul tableau.

Lectures associées : OpenSSL 3.0 avec Indy, le serveur IOCP, le client SSH et les dernières notes de version. Chaque produit a son propre démarrage rapide, listé sur la page de prise en main.

Questions sur le démarrage rapide de sgcIndy

Non, et c'est la chose la plus importante à propos de sgcIndy. Chaque unité conserve son nom Indy d'origine, IdTCPClient, IdHTTP, IdSSLOpenSSL et les autres, et chaque classe conserve son nom d'origine, TIdTCPClient, TIdHTTP, TIdSSLIOHandlerSocketOpenSSL. Il n'y a aucune unité ni aucune classe dans la bibliothèque qui porte un préfixe sgc. Installe-le, recompile, et ton projet utilise sgcIndy.
L'installeur les échange. Il désenregistre les packages de conception Indy intégrés de l'IDE, enregistre ceux de sgcIndy à leur place, et place les dossiers de sgcIndy en tête des chemins de recherche. Comme les noms d'unités sont identiques, c'est cela qui doit changer plutôt que ton code.
Trois vérifications. L'écran de démarrage de l'IDE mentionne sgcIndy au lancement. La boîte À propos d'Indy aussi. Et il existe une preuve à la compilation : SSLOptions.APIVersion n'existe que dans cette version, donc une ligne qui lui affecte sslvAPI_3_0 compile ici et échoue avec Indy standard.
Deux propriétés, définies ensemble. SSLOptions.APIVersion := sslvAPI_3_0 sélectionne la génération d'API OpenSSL 3.0, et SSLOptions.Method := sslvTLSv1_3 sélectionne le protocole. Le type TIdSSLAPIVersion a pour membres sslvAPIDefault, sslvAPI_1_0, sslvAPI_1_1 et sslvAPI_3_0, et TIdSSLVersion a gagné sslvTLSv1_3. Livre ensuite libcrypto-3.dll et libssl-3.dll à côté de ton exécutable, comme le font les démos.
La bibliothèque se présente comme Indy 10.6.3.12. Les modifications sgc sont faites à l'intérieur des fichiers d'origine, signalées par des commentaires et protégées par des defines conditionnels, ce qui explique précisément pourquoi les noms d'unités ont pu rester identiques.
Aucune, car aucune fonctionnalité n'est conditionnée par l'édition. L'indicateur d'édition est injecté à la compilation et n'a que deux consommateurs dans toute la bibliothèque, tous deux cosmétiques : le titre de la boîte À propos et le texte de l'écran de démarrage de l'IDE. Ce que les niveaux changent réellement, c'est le packaging, car les installeurs Community et Basic livrent des binaires compilés et excluent les fichiers .pas et .inc, alors que le package avec sources les inclut.
Oui. Un package Lazarus est livré, avec les squelettes de packages FreePascal et les fichiers de compilation, et l'échelle de compilateurs couvre FPC 2.2.2 jusqu'à 3.3.1. Il y a une réserve à connaître avant de commencer : le mode Delphi est volontairement désactivé pour Lazarus dans les defines du compilateur, avec un commentaire indiquant qu'il y échoue, donc une unité qui dépend de la sémantique du mode Delphi devra être adaptée.
Windows, Linux, macOS, FreeBSD, iOS et Android ont chacun leurs propres blocs conditionnels dans les defines du compilateur. Les cibles Unix utilisent OpenSSL et l'unité zlib incluse. iOS est celle qui a une vraie contrainte : OpenSSL doit y être lié statiquement plutôt que chargé à l'exécution.
Meilleur rapport qualité-prix : All-AccessTous les produits eSeGeCe, Support Premium inclus, à partir de €1,059/an.
Voir les tarifs All-Access

Prêt à quitter Indy standard ?

Le package Community est gratuit. Installe-le, recompile, et vérifie l'écran de démarrage.