voici
main.cpp
#include "usb_boot.h"
int main(int argc, char*argv[])
{
if(std::experimental::filesystem::exists("/mnt/usb")){
system("sudo umount /mnt/usb");
std::experimental::filesystem::remove("/mnt/usb");
}
if(std::experimental::filesystem::exists("/mnt/win")){
system("sudo umount /mnt/win");
std::experimental::filesystem::remove("/mnt/win");
}
if(std::experimental::filesystem::exists("usb.txt")){
std::experimental::filesystem::remove("usb.txt");
}
Gtk::Main app(argc, argv);
usb_boot usbKey;
Gtk::Main::run(usbKey);
return 0;
}
usb_boot.cpp
#include "usb_boot.h"
usb_boot::usb_boot():
boiteH(true, 10), boiteV(true, 10),
boutonQ(Gtk::Stock::QUIT), boutonOk(Gtk::Stock::OK), ouvrirFichier("Fichier iso"),
groupe(), fat32(groupe, "fat32"), ntfs(groupe, "NTFS"), ext4(groupe, "ext4"),
listeDeroulante()
{
resize(320,220);
set_border_width(10);
set_title("Création clef usb_bootable");
set_position(Gtk::WIN_POS_CENTER);
/*
listeDeroulante.append("usb1");
listeDeroulante.append("usb2");
listeDeroulante.append("usb3");
*/
if ("usb.txt"){
std::remove("usb.txt");
}
system ("lsblk -dPo tran,label,model,size,path | grep usb | awk '/sd/' | sed 's/\"//g'>> usb.txt");
std::string usbFile("usb.txt"), ligneTemp;
std::vector <std::string> usb;
int i = 0;
listeDeroulante.append("Choisir une clé usb");
std::ifstream file(usbFile.c_str(), std::ios::in);
if(file){
while (getline(file, ligneTemp)){
usb.push_back(ligneTemp);
std::cout << i+1 << " " << usb[i] << std::endl;
listeDeroulante.append(usb[i]);
i++;
}
}
else {
std::cout << "Fichier usb.txt fermé" << std::endl;
}
//listeDeroulante.set_active_text("Choisir une clé usb"); //Modifier le texte présentement vu.
if(std::experimental::filesystem::is_empty("usb.txt")){
listeDeroulante.append("Pas de clé usb");
listeDeroulante.set_active(1);
}
else{
listeDeroulante.set_active(0);
listeDeroulante.signal_changed().connect(sigc::mem_fun(*this, &usb_boot::afficher));
}
fat32.set_active(true);
fat32.signal_clicked().connect(sigc::mem_fun(*this, &usb_boot::format));
ntfs.signal_clicked().connect(sigc::mem_fun(*this, &usb_boot::format));
ext4.signal_clicked().connect(sigc::mem_fun(*this, &usb_boot::format));
boutonQ.set_can_focus(false);
boutonQ.signal_clicked().connect(sigc::ptr_fun(&Gtk::Main::quit));
boutonQ.signal_clicked().connect(sigc::mem_fun(*this, &usb_boot::fin));
ouvrirFichier.set_can_focus(true);
ouvrirFichier.signal_clicked().connect(sigc::mem_fun(*this, &usb_boot::ouvrir_fichier));
boutonOk.signal_clicked().connect(sigc::mem_fun(*this, &usb_boot::creation));
boiteV.pack_start(listeDeroulante);
boiteV.pack_start(fat32);
boiteV.pack_start(ext4);
boiteV.pack_start(ntfs);
boiteH.pack_start(ouvrirFichier);
boiteH.pack_start(boutonOk);
boiteH.pack_start(boutonQ);
boiteV.pack_start(boiteH);
add(boiteV);
//add(listeDeroulante);
//listeDeroulante.show();
show_all();
}
void usb_boot::afficher(){
chemin = "";
var = listeDeroulante.get_active_text();
varNum = listeDeroulante.get_active_row_number();
Gtk::MessageDialog *dialogue = new Gtk::MessageDialog("Afficher", true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK);
dialogue->set_title("Clé USB");
std::stringstream ss;
ss << "<span weight='bold'>" << "Clef USB actuellement sélectionnée" << "</span>";
dialogue->set_message(ss.str().c_str(), true);
ss.str("");
ss << "<span foreground='blue' weight='bold'>" << varNum << " " << var << "</span>";
dialogue->set_secondary_text(ss.str().c_str(), true);
/*
Gtk::MessageDialog dialogue(*this, listeDeroulante.get_active_text());
dialogue.set_secondary_text("clef usb actuellement sélectionnée");
*/
int result = dialogue->run();
varGlobal = varNum + " " + var;
std::cout << "Vous avez choisi la clé :\n" << varGlobal << std::endl;
std::string::iterator ptr(varGlobal.end()-8);
for(ptr; ptr != varGlobal.end(); ptr++){
chemin += *ptr;
}
std::cout << "chemin = " << chemin << std::endl;
if(Gtk::RESPONSE_OK){
delete dialogue;
}
//std::cout << listeDeroulante.get_active_text() << std::endl;
//std::cout << listeDeroulante.get_active_row_number() << std::endl;
}
void usb_boot::creation(){
if(type == ""){
type = "vfat";
}
//Gtk::MessageDialog dialogue(*this, listeDeroulante.get_active_text());
std::string message("Type de formatage : " + type), type1, chemin1;
Gtk::MessageDialog *dialogue = new Gtk::MessageDialog("Résumé", true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO);
dialogue->set_title("Résumé");
//dialogue->set_message("<span weight='bold'>message</span>",true);
dialogue->set_border_width(10);
std::stringstream ss;
ss << "<span weight='bold'>" << listeDeroulante.get_active_text() << "</span>";
dialogue->set_message(ss.str().c_str(),true);
//dialogue->set_secondary_text("<b>listeDeroulante.get_active_text()</b>", true);
//std::stringstream ss1;
ss.str("");
//ss.clear();
ss << "<span weight='bold'>" << message << "</span>";
dialogue->set_secondary_text(ss.str().c_str(),true);
dialogue->set_default_response(Gtk::RESPONSE_YES);
int result = dialogue->run();
switch(result){
case(Gtk::RESPONSE_NO):{
std::cout << "RESPONSE_NO doit détruire la boîte de message" << std::endl;
delete dialogue;
break;
}
case(Gtk::RESPONSE_YES):{
delete dialogue;
std::cout << "Lance la création de la clé bootable" << std::endl;
chemin1 = "chaine=" + chemin + "1"; //ex chemin1="chaine=/dev/sdf1"
char c[chemin1.size() + 1];
strcpy(c, chemin1.c_str());
putenv(c);
type1 = "type=" + type; //ex type1="type=vfat"
char typeSys[type1.size() + 1];
strcpy(typeSys, type1.c_str());
putenv(typeSys);
//formatage
system("sudo umount $chaine");
if(type == "vfat"){
std::cout << "Formate la clé usb en fat32(vfat)" << std::endl;
system("sudo mkfs.$type -n usb_boot $chaine");
}
if(type == "ntfs"){
std::cout << "Formate la clé usb en " << type << std::endl;
system("sudo mkfs.$type -f -L usb_boot $chaine");
}
if(type == "ext4"){
std::cout << "Formate la clé usb en " << type << std::endl;
system("sudo mkfs.$type -L usb_boot $chaine");
}
//copie des fichiers
if(std::experimental::filesystem::exists("/mnt/usb")){
std::cout << "Le dossier usb existe déjà.\nPas besoin de le créer" << std::endl;
}
else{
std::cout << "Création du dossier usb" << std::endl;
std::experimental::filesystem::create_directory("/mnt/usb");
}
if(std::experimental::filesystem::exists("/mnt/win")){
std::cout << "Le dossier win existe déjà.\nPas besoin de le créer" << std::endl;
}
else{
std::cout << "Création du dossier win" << std::endl;
std::experimental::filesystem::create_directory("/mnt/win");
}
std::string filenamePath;
system("echo chaine= $chaine");
system("sudo mount $chaine /mnt/usb/");
//usb_boot().close();
break;
}
default:{
std::cout << "Mauvais clic" << std::endl;
break;
}
}
//FIN
fin();
}
void usb_boot::format()
{
if(fat32.get_active()){
std::cout << "fat32 sélectionné" << std::endl;
type = "vfat";
}
if(ntfs.get_active()){
std::cout << "ntfs sélectionné" << std::endl;
type = "ntfs";
}
if(ext4.get_active()){
std::cout << "ext4 sélectionné" << std::endl;
type = "ext4";
}
}
void usb_boot::ouvrir_fichier()
{
Gtk::FileChooserDialog dialog("Choisir un fichier", Gtk::FILE_CHOOSER_ACTION_OPEN);
dialog.set_transient_for(*this);
//Add response buttons the the dialog:
dialog.add_button("_Annuler", Gtk::RESPONSE_CANCEL);
dialog.add_button("_Ouvrir", Gtk::RESPONSE_OK);
//Add filters, so that only certain file types can be selected:
auto filter_iso = Gtk::FileFilter::create();
filter_iso->set_name("iso files");
filter_iso->add_mime_type("application/x-cd-image");
dialog.add_filter(filter_iso);
auto filter_text = Gtk::FileFilter::create();
filter_text->set_name("Text files");
filter_text->add_mime_type("text/plain");
dialog.add_filter(filter_text);
auto filter_cpp = Gtk::FileFilter::create();
filter_cpp->set_name("C/C++ files");
filter_cpp->add_mime_type("text/x-c");
filter_cpp->add_mime_type("text/x-c++");
filter_cpp->add_mime_type("text/x-c-header");
dialog.add_filter(filter_cpp);
auto filter_any = Gtk::FileFilter::create();
filter_any->set_name("Any files");
filter_any->add_pattern("*");
dialog.add_filter(filter_any);
//Show the dialog and wait for a user response:
int result = dialog.run();
//Handle the response:
switch(result)
{
case(Gtk::RESPONSE_OK):
{
std::cout << "Clic sur ouvrir" << std::endl;
//Notice that this is a std::string, not a Glib::ustring.
filename = dialog.get_filename();
std::cout << "Fichier sélectionné : " << filename << std::endl;
break;
}
case(Gtk::RESPONSE_CANCEL):
{
std::cout << "Clic sur annuler" << std::endl;
break;
}
default:
{
std::cout << "Mauvais clic" << std::endl;
break;
}
}
}
void usb_boot::fin(){
std::cout << "Fin de l'opération" << std::endl;
if(std::experimental::filesystem::exists("/mnt/usb")){
system("sudo umount /mnt/usb");
std::experimental::filesystem::remove("/mnt/usb");
}
if(std::experimental::filesystem::exists("/mnt/win")){
system("sudo umount /mnt/win");
std::experimental::filesystem::remove("/mnt/win");
}
if(std::experimental::filesystem::exists("usb.txt")){
std::experimental::filesystem::remove("usb.txt");
}
}
/*
usb_boot::type_signal_var usb_boot::signal_var(){
return m_signal_var;
}
*/
et usb_boot.h
#ifndef USB_BOOT_H
#define USB_BOOT_H
#include <iostream>
#include <gtkmm/main.h>
#include <gtkmm-3.0/gtkmm/window.h>
#include <gtkmm-3.0/gtkmm/radiobutton.h>
#include <gtkmm-3.0/gtkmm/comboboxtext.h>
#include <gtkmm-3.0/gtkmm/messagedialog.h>
#include <gtkmm-3.0/gtkmm/button.h>
#include <gtkmm-3.0/gtkmm/box.h>
#include <gtkmm-3.0/gtkmm/stock.h>
#include <gtkmm-3.0/gtkmm/filechooserdialog.h>
#include <fstream>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cstring>
#include <experimental/filesystem>
class usb_boot : public Gtk::Window{
public:
usb_boot();
void afficher();
void ouvrir_fichier();
void format();
void creation();
void fin();
std::string var, varGlobal, chemin, type, filename;
int varNum;
//typedef sigc::signal<void> type_signal_var;
//type_signal_var signal_var();
protected:
//type_signal_var m_signal_var;
private:
Gtk::RadioButtonGroup groupe;
Gtk::RadioButton fat32, ntfs, ext4;
Gtk::Button boutonQ, boutonOk, ouvrirFichier;
Gtk::HBox boiteH;
Gtk::VBox boiteV;
Gtk::ComboBoxText listeDeroulante;
};
#endif // USB_BOOT_H