Signez la pétition demandant le retrait de l'ordre du jour parlementaire du projet de loi DADVSI !
Déjà plus de signatures depuis le 2 décembre 2005 !
Les articles:
Easy Sauvegarde
Voici une source d'un logiciel créé pour la plate forme "Linux" !!!! Elle permet de montrer comment utiliser GTK+ ! Une librairie qui permet de créer une interface graphique portable . GTK+ permet de faire des programmes tournant sous Linux, Mac et Windows (en installant les dlls ) !!!!
Ce code devrait se compiler aussi facilement sur les trois plate formes...
Ce logiciel a été créé dans le but de faciliter la sauvegarde de votre configuration matérielle de votre distribution Linux. Ainisi donc, lors d'une nouvelle installation, reconfigurer en un clique votre nouvelle monture. Par contre, votre distribution doit être basée sur une Debian.
1. //Inclusion des librairies
2. #include <stdio.h>
3. #include <string.h>
4. #include <gtk/gtk.h>
5. #include <stdlib.h>
6.
7. //Déclaration des constantes des noms des fichiers
8. #define CHEMIN_XORG "/etc/X11/xorg.conf"
9. #define CHEMIN_ENVIRONMENT "/etc/environment"
10. #define CHEMIN_LOCAL "/etc/locale.gen"
11. #define CHEMIN_SOURCES "/etc/apt/sources.list"
12.
13. //Déclaration des différents textes présent dans le programme
14. #define TEXTE_1 TEXTE_7" vous permettra de sauvegarder,\nen un clique, toute la configuration de votre installation\nUbuntu et, ainsi, la restaurer lors d'une prochaine\nréinstallation."
15. #define TEXTE_2 "Cet utilitaire,developpé en C/Gtk, permet d'exporter la configuration systeme de votre ordinateur afin de la restaurer lorsque vous le réinstallerez.\n\nVoici la listes des fichiers sauvegardés:\n1) "CHEMIN_XORG"\n2) "CHEMIN_ENVIRONMENT"\n3) "CHEMIN_LOCAL"\n4) "CHEMIN_SOURCES"\n\nVersion: 0.0.2\nDate: 06/01/06"
16. #define TEXTE_3 "Où voulez-vous sauvegarder votre configuration ?"
17. #define TEXTE_4 "Sauvegarder"
18. #define TEXTE_5 "Restaurer"
19. #define TEXTE_6 "À propos"
20. #define TEXTE_7 "Easy-Sauvegarde"
21. #define TEXTE_8 "La sauvegarde s'est corretement déroulée"
22. #define TEXTE_9 "Ouvrez le dossier où se trouve la sauvegarde..."
23. #define TEXTE_10 "La restauration de votre configuration s'est bien déroulée.\n\nUne copie des fichiés originaux a été faite dans leurs répertoires."
24.
25. #define NOM_FICHIER_SAUVEGARDE "ConfigSauvegarde"
26.
27. #define ERREUR_1 "Impossible d'ouvrir le fichier. Vérifiez que vous êtes bien en administrateur."
28. #define ERREUR_2 "Attention:\nLe fichier de sauvegarde ne peut être réutilisé car il comporte des erreurs. Il a sans doute du être modifié entre temps."
29. #define ERREUR_3 "Attention:\nUn des fichiers n'a pas été trouvé sur votre ordinateur. La sauvegarde ne peut pas être faite."
30. #define ERREUR_4 "Attention:\nAucun fichier correspondant n'a été trouvé dans ce répertoire.\n\nLe fichier ce nomme "NOM_FICHIER_SAUVEGARDE"."
31.
32.
33.
34. //Déclaration des procédures
35. void sauvegarde();
36. void restauration();
37. void a_propos();
38. void erreur(int erreur);
39.
40.
41. ////////////////////////////////////////////////////////////////////////////////
42. //Fonction principale
43. int main(int argc, char **argv)
44. {
45. //Déclaration des Widget
46. GtkWidget *pWindow;
47. GtkWidget *pVBox;
48. GtkWidget *pHBox;
49. GtkWidget *pLabel;
50. GtkWidget *pButton[2];
51. GtkWidget *pFrame;
52.
53. //Initiation de GTK
54. gtk_init(&argc,&argv);
55.
56. //Création de notre fenêtre principale
57. pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
58. gtk_window_set_title(GTK_WINDOW(pWindow), TEXTE_7 );
59. gtk_window_set_default_size(GTK_WINDOW(pWindow), 385, 160);
60. gtk_window_set_position(GTK_WINDOW(pWindow), GTK_WIN_POS_CENTER);
61. g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
62. gtk_container_set_border_width(GTK_CONTAINER (pWindow), 10);
63.
64. //Déclaration des labels
65. pLabel = gtk_label_new( TEXTE_1 );
66.
67. //Déclaration des bouttons
68. pButton[0] = gtk_button_new_with_label( TEXTE_4 );
69. pButton[1] = gtk_button_new_with_label( TEXTE_5 );
70. pButton[2] = gtk_button_new_with_label( TEXTE_6 );
71.
72. //Association des actions aux boutons
73. g_signal_connect(G_OBJECT( pButton[0] ), "clicked", sauvegarde, NULL);
74. g_signal_connect(G_OBJECT( pButton[1] ), "clicked", restauration, NULL);
75. g_signal_connect(G_OBJECT( pButton[2] ), "clicked", a_propos, NULL);
76.
77. //Construction des conteneurs
78. pVBox = gtk_vbox_new(FALSE, 0);
79. pHBox = gtk_hbox_new(FALSE, 3);
80.
81. //Construction des frames
82. pFrame = gtk_frame_new("Avant propos:");
83.
84. //Ajout dans les conteneurs
85. gtk_container_add(GTK_CONTAINER(pWindow), pVBox);
86.
87. gtk_box_pack_start(GTK_BOX(pVBox), pFrame, false, false, 0);
88. gtk_container_add(GTK_CONTAINER( pFrame ), pLabel );
89. gtk_box_pack_end(GTK_BOX(pVBox), pHBox, false, false, 0);
90.
91. gtk_box_pack_start(GTK_BOX(pHBox), pButton[0], false, false, 10);
92. gtk_box_pack_start(GTK_BOX(pHBox), pButton[1], false, false, 10);
93. gtk_box_pack_end(GTK_BOX(pHBox), pButton[2], false, false, 10);
94.
95. //Affichage de notre fenêtre
96. gtk_widget_show_all(pWindow);
97.
98. //Lancement de notre boucle
99. gtk_main();
100.
101.
102. return 0;
103. }
104.
105.
106. ////////////////////////////////////////////////////////////////////////////////
107. //Fonction de sauvegarde
108. void sauvegarde(){
109.
110. //Déclaration des Widget et des variables
111. GtkWidget *pFileSelection;
112. GtkWidget *pDialog;
113. gchar *sChemin;
114. char adresse[512];
115. char buffer;
116. int resultat_choix;
117.
118.
119.
120. //Création de la fenêtre du choix de l'emplacement pour la sauvegarde
121. pFileSelection = gtk_file_chooser_dialog_new( TEXTE_3 ,
122. GTK_WINDOW(NULL),
123. GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
124. GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
125. GTK_STOCK_OPEN, GTK_RESPONSE_OK,
126. NULL);
127.
128. //Affichage de la fenêtre
129. resultat_choix = gtk_dialog_run(GTK_DIALOG(pFileSelection));
130.
131. //Traitement du retour
132. if( resultat_choix == GTK_RESPONSE_OK ){
133.
134. //Récupération du chemin
135. sChemin = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection));
136.
137.
138. //Déclaration des pointeurs FILE
139. FILE *fichier_destination;
140. FILE *fichier_lecture;
141.
142. //Création de l'adresse complète
143. strcpy(adresse,sChemin);
144. strcat(adresse,"/"NOM_FICHIER_SAUVEGARDE);
145.
146. //Libération de la mémoire aloué pour sChemin
147. g_free(sChemin);
148.
149. //Ouverture du fichier de destination
150. fichier_destination = fopen(adresse,"w");
151.
152. //Ouverture de xorg en simple lecture
153. fichier_lecture = fopen(CHEMIN_XORG,"r");
154.
155. //Vérification d'aucune erreur
156. if( fichier_destination == false || fichier_lecture == false){ fclose(fichier_destination);
157. remove(adresse);
158. erreur(3) ; }
159.
160. //Ecriture premières lignes pour les informations
161. if( fputs("Ce fichier a été généré par \""TEXTE_7"\".\n",fichier_destination) == EOF ){ erreur(1) ; }
162. if( fputs("Ne surtout pas le modifier. Cela pourrait abimer votre configuration\n\n\n",fichier_destination) == EOF ){ erreur(1) ; }
163.
164. if( fputs("==============================================================================\n",fichier_destination) == EOF ){ erreur(1) ; }
165. if( fputs(CHEMIN_XORG,fichier_destination) == EOF ){ erreur(1) ; }
166. if( fputs("\n==============================================================================\n",fichier_destination) == EOF ){ erreur(1) ; }
167.
168. //Copie du fichier xorg
169. while( ( buffer = (char)getc(fichier_lecture) ) != EOF ){ if( putc(buffer,fichier_destination) == EOF ){ erreur(1) ; } }
170.
171. //Changement du fichier en lecture
172. fclose(fichier_lecture);
173. fichier_lecture = fopen( CHEMIN_ENVIRONMENT ,"r");
174.
175. //Vérification d'aucune erreur
176. if( fichier_lecture == false){ fclose(fichier_destination);
177. remove(adresse);
178. erreur(3) ; }
179.
180. //Indication de changement de fichier
181. if( fputs("==============================================================================\n",fichier_destination) == EOF ){ erreur(1) ; }
182. if( fputs( CHEMIN_ENVIRONMENT ,fichier_destination) == EOF ){ erreur(1) ; }
183. if( fputs("\n==============================================================================\n",fichier_destination) == EOF ){ erreur(1) ; }
184.
185. //Copie du fichier ENVIRONMENT
186. while( ( buffer = (char)getc(fichier_lecture) ) != EOF ){ if( putc(buffer,fichier_destination) == EOF ){ erreur(1) ; } }
187.
188. //Changement du fichier en lecture
189. fclose(fichier_lecture);
190. fichier_lecture = fopen( CHEMIN_LOCAL ,"r");
191.
192. //Vérification d'aucune erreur
193. if( fichier_lecture == false){ fclose(fichier_destination);
194. remove(adresse);
195. erreur(3) ; }
196.
197.
198. //Indication de changement de fichier
199. if( fputs("==============================================================================\n",fichier_destination) == EOF ){ erreur(1) ; }
200. if( fputs( CHEMIN_LOCAL ,fichier_destination) == EOF ){ erreur(1) ; }
201. if( fputs("\n==============================================================================\n",fichier_destination) == EOF ){ erreur(1) ; }
202.
203.
204. //Copie du fichier ENVIRONMENT
205. while( ( buffer = (char)getc(fichier_lecture) ) != EOF ){ if( putc(buffer,fichier_destination) == EOF ){ erreur(1) ; } }
206.
207. //Changement du fichier en lecture
208. fclose(fichier_lecture);
209. fichier_lecture = fopen( CHEMIN_SOURCES ,"r");
210.
211. //Vérification d'aucune erreur
212. if( fichier_lecture == false){ fclose(fichier_destination);
213. remove(adresse);
214. erreur(3) ; }
215.
216. //Indication de changement de fichier
217. if( fputs("==============================================================================\n",fichier_destination) == EOF ){ erreur(1) ; }
218. if( fputs( CHEMIN_SOURCES ,fichier_destination) == EOF ){ erreur(1) ; }
219. if( fputs("\n==============================================================================\n",fichier_destination) == EOF ){ erreur(1) ; }
220.
221. //Copie du fichier SOURCES
222. while( ( buffer = (char)getc(fichier_lecture) ) != EOF ){ if( putc(buffer,fichier_destination) == EOF ){ erreur(1) ; } }
223.
224. //Indication de la fin de la sauvegarde
225. if( fputs("==============================================================================\n",fichier_destination) == EOF ){ erreur(1) ; }
226. if( fputs("Fin\n",fichier_destination) == EOF ){ erreur(1) ; }
227. if( fputs("==============================================================================\n",fichier_destination) == EOF ){ erreur(1) ; }
228.
229.
230. //Suppresion des pointeurs FILE
231. fclose(fichier_destination);
232. fclose(fichier_lecture);
233.
234. //Affichage du message de confirmation
235. pDialog = gtk_message_dialog_new(GTK_WINDOW(pFileSelection),
236. GTK_DIALOG_MODAL,
237. GTK_MESSAGE_INFO,
238. GTK_BUTTONS_OK,
239. TEXTE_8 );
240. gtk_dialog_run(GTK_DIALOG(pDialog));
241. gtk_widget_destroy(pDialog);
242.
243. }
244.
245. //Destruction de la fenêtre
246. gtk_widget_destroy(pFileSelection);
247.
248. return;
249. }
250.
251. ////////////////////////////////////////////////////////////////////////////////
252. //Fonction A propos
253. void restauration(){
254.
255. //Déclaration des Widget et des variables
256. GtkWidget *pFileSelection;
257. GtkWidget *pDialog;
258. gchar *sChemin;
259. char adresse[512];
260. char buffer;
261. int resultat_choix;
262. int compteur = 0;
263. char *memoire;
264. char *debut;
265. char *fin;
266.
267.
268. //Création de la fenêtre du choix de l'emplacement pour la sauvegarde
269. pFileSelection = gtk_file_chooser_dialog_new( TEXTE_9 ,
270. GTK_WINDOW(NULL),
271. GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
272. GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
273. GTK_STOCK_OPEN, GTK_RESPONSE_OK,
274. NULL);
275.
276. //Affichage de la fenêtre
277. resultat_choix = gtk_dialog_run(GTK_DIALOG(pFileSelection));
278.
279. //Traitement du retour
280. if( resultat_choix == GTK_RESPONSE_OK ){
281.
282. //Récupération du chemin
283. sChemin = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection));
284.
285.
286. //Déclaration des pointeurs FILE
287. FILE *fichier;
288.
289. //Création de l'adresse complète
290. strcpy(adresse,sChemin);
291. strcat(adresse,"/"NOM_FICHIER_SAUVEGARDE);
292.
293. //Libération de la mémoire aloué pour sChemin
294. g_free(sChemin);
295.
296. //Ouverture du fichier en lecture
297. fichier = fopen( adresse , "r" );
298.
299. //Vérification d'aucune erreur
300. if( fichier == false){ erreur(4) ; }
301.
302. //Récupération de la taille du fichier afin de le charger en mémoire
303. while( getc( fichier ) != EOF ){ compteur++ ; }
304.
305. //Rembobinage du fichier
306. rewind(fichier);
307.
308. //Allocation de la mémoire nécessaire
309. memoire = (char*)malloc(compteur + 1);
310.
311. //On charge le fichier en mémoire
312. compteur = 0;
313. while( ( buffer = (char)getc( fichier ) ) != EOF ){
314.
315. *(memoire + compteur ) = buffer;
316. compteur++;
317.
318. }
319.
320.
321. //Fermeture du fichier_lecture
322. fclose( fichier );
323.
324. //Sauvegarde des fichiers avant installation
325. if( 0 != rename(CHEMIN_LOCAL, CHEMIN_LOCAL".bak") ){ erreur(1) ; }
326. if( 0 != rename(CHEMIN_ENVIRONMENT, CHEMIN_ENVIRONMENT".bak") ){ erreur(1) ; }
327. if( 0 != rename(CHEMIN_XORG, CHEMIN_XORG".bak") ){ erreur(1) ; }
328. if( 0 != rename(CHEMIN_SOURCES, CHEMIN_SOURCES".bak") ){ erreur(1) ; }
329.
330.
331. ////////////////////////////////////////////////////////////////////////////////
332. //Restauration du fichier sources.list
333.
334. //Récupération du fichier CHEMIN_SOURCES
335. debut = strstr( memoire, "==============================================================================\n"CHEMIN_SOURCES"\n==============================================================================\n");
336. fin = strstr( memoire, "==============================================================================\nFin\n==============================================================================\n");
337. *fin = '\0';
338.
339. //Vérification rapide (pas optimisé) de l'intégrité des données
340. if( debut == NULL || fin == NULL ){ erreur(2) ; }
341.
342. //Ecriture du fichier CHEMIN_SOURCES
343. compteur = strlen("==============================================================================\n"CHEMIN_SOURCES"\n==============================================================================\n");
344. debut = debut + compteur;
345. fichier = fopen( CHEMIN_SOURCES, "w" );
346. fputs( debut, fichier );
347. fclose(fichier);
348.
349. ////////////////////////////////////////////////////////////////////////////////
350. //Restauration du fichier locale.gen
351.
352. //Récupération du fichier CHEMIN_LOCAL
353. debut = strstr( memoire, "==============================================================================\n"CHEMIN_LOCAL"\n==============================================================================\n");
354. fin = strstr( memoire, "==============================================================================\n"CHEMIN_SOURCES"\n==============================================================================\n");
355. *fin = '\0';
356.
357. //Vérification rapide (pas optimisé) de l'intégrité des données
358. if( debut == NULL || fin == NULL ){ erreur(2) ; }
359.
360. //Ecriture du fichier CHEMIN_LOCAL
361. compteur = strlen("==============================================================================\n"CHEMIN_LOCAL"\n==============================================================================\n");
362. debut = debut + compteur;
363. fichier = fopen( CHEMIN_LOCAL, "w" );
364. fputs( debut, fichier );
365. fclose(fichier);
366.
367. ////////////////////////////////////////////////////////////////////////////////
368. //Restauration du fichier environment
369.
370. //Récupération du fichier CHEMIN_ENVIRONMENT
371. debut = strstr( memoire, "==============================================================================\n"CHEMIN_ENVIRONMENT"\n==============================================================================\n");
372. fin = strstr( memoire, "==============================================================================\n"CHEMIN_LOCAL"\n==============================================================================\n");
373. *fin = '\0';
374.
375. //Vérification rapide (pas optimisé) de l'intégrité des données
376. if( debut == NULL || fin == NULL ){ erreur(2) ; }
377.
378. //Ecriture du fichier CHEMIN_ENVIRONMENT
379. compteur = strlen("==============================================================================\n"CHEMIN_ENVIRONMENT"\n==============================================================================\n");
380. debut = debut + compteur;
381. fichier = fopen( CHEMIN_ENVIRONMENT, "w" );
382. fputs( debut, fichier );
383. fclose(fichier);
384.
385. ////////////////////////////////////////////////////////////////////////////////
386. //Restauration du fichier xorg.conf
387.
388. //Récupération du fichier CHEMIN_XORG
389. debut = strstr( memoire, "==============================================================================\n"CHEMIN_XORG"\n==============================================================================\n");
390. fin = strstr( memoire, "==============================================================================\n"CHEMIN_ENVIRONMENT"\n==============================================================================\n");
391. *fin = '\0';
392.
393. //Vérification rapide (pas optimisé) de l'intégrité des données
394. if( debut == NULL || fin == NULL ){ erreur(2) ; }
395.
396. //Ecriture du fichier CHEMIN_XORG
397. compteur = strlen("==============================================================================\n"CHEMIN_XORG"\n==============================================================================\n");
398. debut = debut + compteur;
399. fichier = fopen( CHEMIN_XORG, "w" );
400. fputs( debut, fichier );
401. fclose(fichier);
402.
403. ////////////////////////////////////////////////////////////////////////////////
404.
405. //Libération de la mémoire
406. free(memoire);
407.
408. //Affichage du message de confirmation
409. pDialog = gtk_message_dialog_new(GTK_WINDOW(pFileSelection),
410. GTK_DIALOG_MODAL,
411. GTK_MESSAGE_INFO,
412. GTK_BUTTONS_OK,
413. TEXTE_10);
414. gtk_dialog_run(GTK_DIALOG(pDialog));
415. gtk_widget_destroy(pDialog);
416.
417.
418. }
419.
420. //Destruction de la fenêtre
421. gtk_widget_destroy(pFileSelection);
422.
423.
424. }
425.
426. ////////////////////////////////////////////////////////////////////////////////
427. //Fonction A propos
428. void a_propos(){
429.
430. //Déclaration des Widget
431. GtkWidget *pDialog;
432.
433. //Affichage puis destruction de la fenêtre
434. pDialog = gtk_message_dialog_new(GTK_WINDOW(NULL),
435. GTK_DIALOG_MODAL,
436. GTK_MESSAGE_INFO,
437. GTK_BUTTONS_OK,
438. TEXTE_2);
439. gtk_dialog_run(GTK_DIALOG(pDialog));
440. gtk_widget_destroy(pDialog);
441.
442. }
443. ////////////////////////////////////////////////////////////////////////////////
444. //Fonction Gestion des erreurs
445. void erreur(int erreur){
446.
447. GtkWidget *pDialog;
448. char message[256];
449.
450. //Chargement du message d'erreur
451. switch(erreur) {
452. case 1: strcpy(message, ERREUR_1); break;
453. case 2: strcpy(message, ERREUR_2); break;
454. case 3: strcpy(message, ERREUR_2); break;
455. default: strcpy(message, ERREUR_4); break;
456. }
457.
458. //Affichage puis destruction de la fenêtre
459. pDialog = gtk_message_dialog_new(GTK_WINDOW(NULL),
460. GTK_DIALOG_MODAL,
461. GTK_MESSAGE_INFO,
462. GTK_BUTTONS_OK,
463. message );
464. gtk_dialog_run(GTK_DIALOG(pDialog));
465. gtk_widget_destroy(pDialog);
466.
467. //On quitte le programme
468. exit(1);
469. }