Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.61 KB | None | 0 0
  1. #include <time.h>
  2. #include <stdlib.h>
  3. #include <gtk/gtk.h>
  4. #include <curl/curl.h>
  5. typedef struct connectParam
  6. {
  7.     GtkBuilder gtkBuilder;
  8.     int isConnected;
  9. }connectParam;
  10. // GTK Callbacks
  11. void getFood(GtkWidget *widget,gpointer gtkBuilder);
  12. void checkLogin(GtkWidget *widget,gpointer pData);
  13. void clearList(GtkWidget *widget, gpointer gtkBuilder);
  14.  
  15. // Functions
  16. GtkBuilder *initGtkBuilder(char *cFileName);
  17. void get_page(const char* url, const char* file_name);
  18. char* searchInJson(char* word,char* file_name);
  19. void launchMainWindow();
  20. void showError(GtkWindow *window,char *message);
  21.  
  22. void clearList(GtkWidget *widget, gpointer gtkBuilder){
  23.     GtkBox *foodList = GTK_BOX(gtk_builder_get_object(gtkBuilder,"foodList"));
  24.     GList *children, *iter;
  25.  
  26.     children = gtk_container_get_children(GTK_CONTAINER(foodList));
  27.     for(iter = children; iter != NULL; iter = g_list_next(iter))
  28.         gtk_widget_destroy(GTK_WIDGET(iter->data));
  29.     g_list_free(children);
  30.  
  31.     FILE *file = fopen("api.json","r");
  32.     char *code;
  33.  
  34.     size_t n = 0;
  35.     int c;
  36.  
  37.     code = malloc(1000);
  38.  
  39.     while ((c = fgetc(file)) != '[')
  40.     {
  41.         code[n++] = (char) c;
  42.     }
  43.  
  44.     // don't forget to terminate with the null character
  45.     code[n] = '\0';
  46.  
  47.     fclose(file);
  48.  
  49.     remove("api.json");
  50.  
  51.     file = fopen("api.json","w+");
  52.     fprintf(file,"%s[",code);
  53.     fclose(file);
  54.  
  55. }
  56. void showError(GtkWindow *window,char *message){
  57.     GtkWidget *message_dialog =
  58.             gtk_message_dialog_new (
  59.                     window,
  60.                     GTK_DIALOG_MODAL,
  61.                     GTK_MESSAGE_ERROR,
  62.                     GTK_BUTTONS_NONE,
  63.                     message);
  64.     gtk_widget_show_all (message_dialog);
  65. }
  66.  
  67. void sendJson(GtkWidget *widget, gpointer gtkBuilder){
  68.     FILE *api = fopen("api.json","a");
  69.  
  70.     fprintf(api,"]}");
  71.  
  72.     fclose(api);
  73.     // Envoyer en curl
  74.  
  75.     printf("\n ENVOI DU JSON\n");
  76. }
  77.  
  78. void getFood(GtkWidget *widget,gpointer gtkBuilder){
  79.     // On récupère le code barre
  80.     GtkEntry *barCodeEntry = GTK_ENTRY(gtk_builder_get_object(GTK_BUILDER(gtkBuilder),"barCode"));
  81.     const gchar *barCodeTxt = gtk_entry_get_text(barCodeEntry);
  82.  
  83.     // Si le code barre est vide on affiche une erreur
  84.     if(strcmp(barCodeTxt,"") == 0){
  85.  
  86.     }else{
  87.         // Si le code barre n'est pas vide on vient attaquer l'API
  88.         // URL de l'API
  89.         char url[500] = "https://world.openfoodfacts.org/api/v0/product/";
  90.         // Pour rajouter l'extension après le barcode
  91.         char extension[6];
  92.         sprintf(extension,".json");
  93.         // On concatène le tout pour avoir l'URL
  94.         strcat(url,barCodeTxt);
  95.         strcat(url,extension);
  96.         // On get le résultat dans un fichier
  97.         char *jsonName = "tempFood.json";
  98.         get_page(url,jsonName);
  99.         // Si on l'API nous dit qu'elle a trouvé le produit
  100.         if (strcmp(searchInJson("status_verbose",jsonName),"product found") == 0){
  101.             // On vient chercher les paramètres qui nous intéréssent dans le json
  102.             char *code = searchInJson("code",jsonName);
  103.             char *quantity = searchInJson("quantity",jsonName);
  104.             char *product_name = searchInJson("product_name",jsonName);
  105.             char *image_url = searchInJson("image_url",jsonName);
  106.             char *ingredients_text = searchInJson("ingredients_text",jsonName);
  107.             char *brands = searchInJson("brands",jsonName);
  108.  
  109.             // On récupère la quantité saisie au passage
  110.             const gchar *quantityTxt = gtk_entry_get_text(GTK_ENTRY(gtk_builder_get_object(gtkBuilder,"quantityEntry")));
  111.  
  112.             // Si aucune quantité n'a été saisie par défaut on laisse x1
  113.             if (strcmp(quantityTxt,"") == 0){
  114.                 quantityTxt = "1";
  115.             }
  116.  
  117.             // On rajoute le produit et sa quantité dans le fichier qui sera envoyé à l'API
  118.             FILE *api;
  119.             api = fopen("api.json","a");
  120.             fprintf(api,"{\n\"code\":\"%s\",\n",code);
  121.             fprintf(api,"\"product_name\":\"%s\",\n",product_name);
  122.             fprintf(api,"\"ingredients_text\":\"%s\",\n",ingredients_text);
  123.             fprintf(api,"\"quantity\":\"%s\",\n",quantity);
  124.             fprintf(api,"\"brands\":\"%s\",\n",brands);
  125.             fprintf(api,"\"image_url\":\"%s\",\n",image_url);
  126.             fprintf(api,"\"quantity_nbr\":\"%s\"\n},\n",quantityTxt);
  127.  
  128.             fclose(api);
  129.  
  130.             // On le rajoute maintenant dans l'interface graphique
  131.             GtkBox *foodList = GTK_BOX(gtk_builder_get_object(gtkBuilder,"foodList"));
  132.  
  133.             // On crée un GtkLabel qui contiendra la quantité le nom et la marque
  134.             char foodTxt[1000] = "";
  135.             sprintf(foodTxt,"x%s - %s - %s",quantityTxt,brands,product_name);
  136.             GtkLabel *label = GTK_LABEL(gtk_label_new("food"));
  137.             gtk_label_set_text(label,foodTxt);
  138.  
  139.             // On ajoute le label au container et on affiche le tout
  140.             gtk_container_add(GTK_CONTAINER(foodList),GTK_WIDGET(label));
  141.             gtk_widget_show_all(GTK_WIDGET(foodList));
  142.  
  143.             // On reset les deux champs de saisie pour pouvoir saisir un nouvel objet
  144.             gtk_entry_set_text(barCodeEntry,"");
  145.             gtk_entry_set_text(GTK_ENTRY(gtk_builder_get_object(gtkBuilder,"quantityEntry")),"");
  146.         }else{
  147.  
  148.             GtkWindow *parent = GTK_WINDOW(gtk_builder_get_object(gtkBuilder,"mainWindow"));
  149.  
  150.             printf("Produit non trouvé\n");
  151.         }
  152.         remove(jsonName);
  153.     }
  154. }
  155. void launchMainWindow(){
  156.     // On initialise un nouveau builder avec la fenêtre principale
  157.     GtkBuilder *gtkBuilder;
  158.     GtkWindow *mainWindow;
  159.  
  160.     gtkBuilder = GTK_BUILDER(initGtkBuilder("mainWindow.glade"));
  161.  
  162.     mainWindow = GTK_WINDOW(gtk_builder_get_object(GTK_BUILDER(gtkBuilder), "mainWindow"));
  163.     gtk_widget_show(GTK_WIDGET(mainWindow));
  164.  
  165.     // On récupère les boutons pour leur affecter un signal
  166.     GtkButton *submitBtn = GTK_BUTTON(gtk_builder_get_object(GTK_BUILDER(gtkBuilder), "barCodeSubmit"));
  167.     GtkButton *validateBtn = GTK_BUTTON(gtk_builder_get_object(GTK_BUILDER(gtkBuilder), "btnValidate"));
  168.     GtkButton *clearBtn = GTK_BUTTON(gtk_builder_get_object(GTK_BUILDER(gtkBuilder),"cancelAll"));
  169.     // On affecte les signaux
  170.  
  171.     g_signal_connect(submitBtn, "clicked", G_CALLBACK(getFood), gtkBuilder);
  172.     g_signal_connect(validateBtn,"clicked",G_CALLBACK(sendJson),gtkBuilder);
  173.     g_signal_connect(clearBtn,"clicked",G_CALLBACK(clearList),gtkBuilder);
  174. }
  175. void checkLogin(GtkWidget *widget,gpointer pData){
  176.     struct connectParam *ptest = pData;
  177.  
  178.     GtkBuilder *gtkBuilder = &ptest->gtkBuilder;
  179.  
  180.     const gchar *passwordTxt,*emailTxt;
  181.     GtkEntry *passwordEntry,*emailEntry;
  182.  
  183.     emailEntry = GTK_ENTRY(gtk_builder_get_object(gtkBuilder,"email"));
  184.     passwordEntry = GTK_ENTRY(gtk_builder_get_object(gtkBuilder,"password"));
  185.  
  186.     emailTxt = gtk_entry_get_text(emailEntry);
  187.     passwordTxt = gtk_entry_get_text(passwordEntry);
  188.  
  189.     // On va venir cURLer l'API de connexion avec nos paramètres
  190.     CURL *curl;
  191.  
  192.     curl_global_init(CURL_GLOBAL_ALL);
  193.     curl = curl_easy_init();
  194.     if(curl) {
  195.         // On crée un fichier qui contiendra le résultat de la connexion
  196.         FILE* file = fopen("connect_result.txt", "w+");
  197.  
  198.         // On crée la chaîne de caractères qui contiendra les paramètres à passer en post
  199.         char postParameters[1000];
  200.  
  201.         // On prépare la chaîne pour les paramètres en post en y ajoutant l'email et le password rentrés
  202.         sprintf(postParameters,"_username=%s&_password=%s",emailTxt,passwordTxt);
  203.  
  204.         // On set l'URL à CURL et on lui passe les paramètres et le fichier de sortie
  205.         curl_easy_setopt(curl, CURLOPT_URL, "https://ffw-pmv.com/api/user/connect");
  206.         curl_easy_setopt(curl, CURLOPT_POSTFIELDS,postParameters);
  207.         curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
  208.  
  209.         // On éxécute la requête et on la termine proprement
  210.         curl_easy_perform(curl);
  211.         curl_easy_cleanup(curl);
  212.  
  213.         // On revient au début du fichier pour pouvoir le lire
  214.         rewind(file);
  215.  
  216.         // On récupère le résultat de la connexion qui est stocké dans le fichier
  217.         char result[6] = "";
  218.         fgets(result,6,file);
  219.  
  220.         // On ferme le fichier et on le supprime car on en a plus besoin
  221.         fclose(file);
  222.         remove("connect_result.txt");
  223.  
  224.         // On teste si le résultat est true ou pas
  225.         if(strcmp(result,"true") != 0){
  226.             ptest->isConnected = 1;
  227.             printf("Connexion réussie \n");
  228.             // On récupère la fenêtre active
  229.             GtkWindow *activeWindow;
  230.             activeWindow = GTK_WINDOW(gtk_builder_get_object(GTK_BUILDER(gtkBuilder), "loginWindow"));
  231.             // On ferme la fenêtre active
  232.             gtk_window_close(activeWindow);
  233.  
  234.             // On vient créer un JSON qui contiendra les informations de l'utilisateur qu'on
  235.             // enverra plus tard à l'API Web avec les produits
  236.             FILE *json;
  237.             json = fopen("api.json","w+");
  238.  
  239.             fprintf(json,"{\n");
  240.             fprintf(json,"\"email\":\"%s\",\n",emailTxt);
  241.             fprintf(json,"\"password\":\"%s\",\n",passwordTxt);
  242.             fprintf(json,"\"articles\":[\n");
  243.  
  244.             fclose(json);
  245.  
  246.             launchMainWindow();
  247.         }else{
  248.             printf("Connexion échouée\n");
  249.         }
  250.     }
  251.     curl_global_cleanup();
  252. }
  253. void get_page(const char* url, const char* file_name){
  254.     CURL *curl;
  255.     CURLcode res;
  256.  
  257.     curl_global_init(CURL_GLOBAL_ALL);
  258.     curl = curl_easy_init();
  259.     if(curl) {
  260.         FILE* file = fopen(file_name, "w");
  261.         curl_easy_setopt(curl, CURLOPT_URL, url);
  262.         curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
  263.  
  264.         //curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=daniel&project=curl");
  265.  
  266.         curl_easy_perform(curl);
  267.         curl_easy_cleanup(curl);
  268.  
  269.         fclose(file);
  270.     }
  271.     curl_global_cleanup();
  272. }
  273. char* searchInJson(char* word,char* file_name){
  274.     FILE *file =fopen(file_name,"r");
  275.     int open = 0,next = 0,returnOk = 0;
  276.  
  277.     char c;
  278.     char storedWord[5000] = "";
  279.     do
  280.     {
  281.         c = fgetc(file);
  282.         if (c == '"'){
  283.             if(open == 0){
  284.                 open = 1;
  285.             }else{
  286.                 open = 0;
  287.                 if(next == 1){
  288.                     returnOk = 1;
  289.                     break;
  290.                 }
  291.                 if(strcmp(storedWord,word) == 0){
  292.                     next = 1;
  293.                 }
  294.                 strcpy(storedWord, "");
  295.             }
  296.         }else{
  297.             if(open != 0){
  298.                 char temp[2];
  299.                 temp[0] = c;
  300.                 temp[1] = '\0';
  301.                 strcat(storedWord,temp);
  302.             }
  303.         }
  304.     } while(c != EOF);
  305.     if(returnOk == 1){
  306.         char *string = malloc(strlen(storedWord));
  307.         strcpy(string,storedWord);
  308.         return string;
  309.     }else{
  310.         return 0;
  311.     }
  312. }
  313. GtkBuilder *initGtkBuilder(char *cFileName){
  314.  
  315.     GtkBuilder *builder = NULL;
  316.     GError *error = NULL;
  317.  
  318.     gchar *gFileName;
  319.  
  320.     //Ouverture du fichier .glade
  321.     if((builder = gtk_builder_new())==NULL){
  322.         return NULL;
  323.     }
  324.     if((gFileName = g_build_filename (cFileName, NULL))==NULL){
  325.         return NULL;
  326.     }
  327.     gtk_builder_get_translation_domain (builder);
  328.     //Chargement du fichier .glade
  329.     if(gtk_builder_add_from_file (builder, gFileName, &error)){
  330.         if(error!=NULL){
  331.             g_error_free(error);
  332.         }
  333.         g_free (gFileName);
  334.         return builder;
  335.     }
  336.     g_free (gFileName);
  337.     return NULL;
  338. }
  339. int main(int argc,char **argv)
  340. {
  341.     // Initialisation de GTK
  342.     gtk_init(&argc, &argv);
  343.     GtkWidget *loginWindow;
  344.  
  345.     char *barCodeTxt;
  346.     // On ouvre le fichier Glade du projet
  347.     GtkBuilder *gtkBuilder = initGtkBuilder("loginWindow.glade");
  348.  
  349.     // On récupère la fenêtre principale
  350.     loginWindow = GTK_WIDGET(gtk_builder_get_object(gtkBuilder,"loginWindow"));
  351.  
  352.     // On lance la fenêtre principale
  353.     gtk_widget_show(GTK_WIDGET(loginWindow));
  354.  
  355.     // On récupère notre input et notre bouton
  356.     GtkButton *btnConnect = GTK_BUTTON(gtk_builder_get_object(gtkBuilder,"btnConnect"));
  357.  
  358.     // On crée une structure pour pouvoir envoyer notre builder et savoir si l'utilisateur est connecté
  359.     connectParam connectParam;
  360.     connectParam.gtkBuilder = *gtkBuilder;
  361.     connectParam.isConnected = 0;
  362.  
  363.     g_signal_connect(btnConnect,"clicked",G_CALLBACK(checkLogin),&connectParam);
  364.     // Pour ne pas que GTK se ferme
  365.     gtk_main();
  366.  
  367.     return EXIT_SUCCESS;
  368. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement