Informations système Mise en situation On désire faire un application C++ en mode console qui permet d’afficher des informations sur le système Linux sur lequel s’exécute le programme. Il existe déjà une commande — nommée uname — qui fait cela : pi@rpi-defrance:~ $ uname -a Linux rpi-defrance 5.10.17-v7+ #1414 SMP Fri Apr 30 13:18:35 BST 2021 armv7l GNU/Linux Cependant, on désire obtenir un affichage différent, semblable à celui-ci: pi@rpi-defrance:~ $ ./myuname Nom hôte : rpi-defrance OS : Linux 5.10.17-v7+ Type CPU : armv7l Bye ! Le diagramme de classes envisagé pour cette application est le suivant : ✎ Travail n° 1 Analyse du modèle Analyser le diagramme UML : Identifier les différents types de relation entre les classes du diagramme (→ relations de dépendance, de composition, d'inclusion/ancrage/emboîtement) Une relation de dépendance entre 2 classes est moins “forte” qu’une association. Une dépendance implique généralement (mais pas toujours) qu’un objet accepte un autre objet comme paramètre de méthode, instancie ou utilise un autre objet dans une méthode. La relation d’inclusion/ancrage/emboîtement (→ inner/anchor/nesting relation ou namespace owned element association) entre classes est obsolète dans les versions récentes des spécifications UML (≥ v2.0 ). Cependant, elle est encore valide dans les diagrammes de package. Identifier le rôle UML (→ _term) présent sur la relation de composition. Celui-ci se traduira dans le code C++ comme un attribut de type AnsiTerm dans la classe App 🖮 Travail n° 2 Création du répertoire projet Créer le répertoire projet et y copier la classe AnsiTerm codée dans les activités précédentes (→ ansiterm.h et ansiterm.cpp) 🖮 Travail n° 3 Codage/Test de la classe Hostinfo Déclarer la classe HosInfo dans un fichier hostinfo.h Consignes/Indices : la structure standard C utsname est déclarée dans l’entête <sys/utsname.h> Coder le constructeur de la classe HostInfo dans le fichier hostinfo.cpp Consignes/Indices : Le constructeur devra appeler la fonction C standard int uname(struct utsname *buf); (→ voir page de manuel : man 2 uname) pour renseigner la structure _info la variable pointée par l’argument du constructeur (→ ok de type bool *) indiquera le status d’exécution de la fonction uname() (→ true si OK, false si NOK) Coder l’ensemble des méthodes de la classe HostInfo. Consignes/Indices : getCPUArch() doit retourner une chaîne C++ (→ string) contenant l’architecture du CPU présent sur la machine. Cette information est présente — sous forme de chaîne C (→ char * ou char []) — dans le membre machine de la structure _info (après appel du constructeur de la classe Hostname). Pour convertir une chaîne C (→ char * ou char []) en chaîne C++ (→ string), il suffit de faire appel au constructeur de la classe string en lui passant la chaîne C en argument. #include <string> using namespace std; char helloC[] = "Bonjour"; string helloCpp = string(helloC); getHostname() doit retourner une chaîne C++ contenant le nom de l’hôte. Cette information est présente — sous forme de chaîne C — dans le membre nodename de la structure _info. getOSType() doit retourner une chaine C++ contenant le type de l’OS suivi de sa version. Ces informations sont présentes sous forme de chaîne C dans les membres sysname et release de la structure _info. Il faudra donc concaténer les 2 informations dans la chaîne C++ retournée. Tester la classe HostInfo Consignes/Indices : créer un un fichier test.cpp qui instancie statiquement la classe HostInfo dans un objet que vous nommerez host. tester le résultat de l’instanciation (→ valeur de la variable booléenne passée en argument au contructeur) puis… … en cas de réussite (→ variable à true), appeler successivement les 3 méthodes de la classe HostInfo et afficher les chaînes C++ retournées avec cout (→ déclaré dans l’entête standard <ìostream>) … en cas d’échec (→ variable à false), afficher une message d’erreur "Echec instanciation de ’HostInfo'" avec cout compiler et exécuter le programme Résultat attendu : pi@rpi-defrance:~/Documents/hostinfo $ ./test CPU : armv7l Hôte : rpi-defrance OS : Linux 5.10.17-v7+ Faire constater le résultat au professeur 🖮 Travail n° 4 Codage/Test de la classe App Déclarer la classe App (→ app.h) conformément au modèle UML. Consignes/Indices : Penser à déclarer l’attribut _term Coder la méthode exec() de manière à utiliser les méthodes de la classe Ansiterm pour réaliser l’affichage Consignes/Indices : Le constructeur se contente d’effacer l’écran (→ clearScreen()) La méthode exec() doit instancier dynamiquement la classe HostInfo La méthode exec() doit afficher un message d’erreur en rouge si l’instanciation échoue Les informations retournées par les méthodes de la classe HostInfo seront affichées avec la couleur Cyan. Tester la classe App depuis un fichier main.cpp Consignes/Indices : La classe App doit être instanciée dynamiquement le nom de l’exécutable sera myuname L’exécution du programme doit mener à l’affichage suivant : Faire constater le résultat au professeur 🖮 Travail n° 5 Évolution Proposer une évolution du modèle UML pour permettre à l’utilisateur de passer en argument au constructeur de la classe App une option permettant d’afficher les informations d’une façon différente. Par exemple, lancer ./myuname avec l’option csv devrait mener à l’affichage suivant (→ csv pour comma separated values est un format reconnu par Excel) : pi@rpi-defrance:~ $ ./myuname csv Nom hôte,OS,Type CPU rpi-defrance,Linux 5.10.17-v7+,armv7l Procéder au codage de cette évolution 🞄 🞄 🞄 Jeu du Devin Mise en situation