From 9635f198600eac7d13f05aef2217a15d0780ec83 Mon Sep 17 00:00:00 2001 From: Enris Nogare von Tein <ent13@inf.ufpr.br> Date: Thu, 30 Jun 2016 11:54:40 -0300 Subject: [PATCH] Properly documented the last bits of code and added a debug define that activates debugging output. Signed-off-by: Enris Nogare von Tein <ent13@inf.ufpr.br> --- useful/stg312/.size.out | 2 +- useful/stg312/.upid.out | 2 +- useful/stg312/openslx_gui | Bin 95098 -> 99073 bytes useful/stg312/openslx_gui.c | 75 +++++++-- useful/stg312/openslx_gui.h | 2 + useful/stg312/openslx_gui_v01.glade | 2 +- useful/stg312/stg4.c | 57 ++++++- useful/stg312/stg4.h | 1 - useful/stg312/upload | Bin 37918 -> 37874 bytes useful/stg312/upload-utils.c | 253 ++++++++++++++++++++-------- useful/stg312/upload-utils.h | 1 - useful/stg312/upload.c | 127 ++++++++++---- useful/stg312/utils.c | 133 +++++++++++---- useful/stg312/utils.h | 18 -- 14 files changed, 491 insertions(+), 182 deletions(-) diff --git a/useful/stg312/.size.out b/useful/stg312/.size.out index 0d998574..00ab0c33 100644 --- a/useful/stg312/.size.out +++ b/useful/stg312/.size.out @@ -1 +1 @@ -1729704 teste-versao-comentada.r1.tar.gz +1729732 teste-libs-inuteis.r1.tar.gz diff --git a/useful/stg312/.upid.out b/useful/stg312/.upid.out index bc0a8da6..c18e0703 100644 --- a/useful/stg312/.upid.out +++ b/useful/stg312/.upid.out @@ -1 +1 @@ -{"uploadid":"SKwGngE2ZgVnuqkUUMZrASSGPktr5iWQQeb","status":"ok","code":"003","msg":"New upload succesful"} \ No newline at end of file +{"uploadid":"xKo1qTyEi3RtsCyZow6VoeOHVF2sJfzSdtP","status":"ok","code":"003","msg":"New upload succesful"} \ No newline at end of file diff --git a/useful/stg312/openslx_gui b/useful/stg312/openslx_gui index a60e4435be36a17ef973b96338014689d38f500b..6bcb70548ab041c18e438a225b8f37ddeb7cd7ae 100755 GIT binary patch delta 41010 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 delta 39065 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 HiBTT_UJo-s diff --git a/useful/stg312/openslx_gui.c b/useful/stg312/openslx_gui.c index d3520483..4da53e66 100644 --- a/useful/stg312/openslx_gui.c +++ b/useful/stg312/openslx_gui.c @@ -6,7 +6,6 @@ #include <sys/wait.h> #include "utils.h" #include "stg4.h" -#include <X11/Xlib.h> #include <gdk/gdkkeysyms.h> #include <unistd.h> #include <locale.h> @@ -18,12 +17,18 @@ //FUnção que mostra a tela de upload antigo, caso ele exista void tela_upload_antigo(GtkWidget *w,gpointer p){ + GtkWidget *window_upload_antigo, *janela_ant, *button_continua_upload, *button_nao_continua, *label_nome_imagem, *label_parte_upload; GtkBuilder *builder; FILE *upload_in_progress; char *old_upload; old_upload = malloc(255*sizeof(char)); + #ifdef DEBUG + puts("Entrou na tela de upload antigo"); + puts(""); + #endif /*DEBUG*/ + dados *data_ant = p; //Pega os dados recebidos pela chamada da função janela_ant = (GtkWidget*) data_ant->dado1; //Pega a janela antiga que chamou essa nova janela @@ -36,6 +41,11 @@ void tela_upload_antigo(GtkWidget *w,gpointer p){ label_nome_imagem = GTK_WIDGET(gtk_builder_get_object(builder, "label_nome_imagem")); label_parte_upload = GTK_WIDGET(gtk_builder_get_object(builder, "label_parte_upload")); + #ifdef DEBUG + puts("Vai abrir o arquivo de upload antigo"); + puts(""); + #endif /*DEBUG*/ + upload_in_progress = fopen(".progress.out", "a+"); //Abre o arquivo para ler os dados do upload antigo, abre com a+ para poder dar rewind printf("Linha %d\n", __LINE__); rewind(upload_in_progress); @@ -59,13 +69,24 @@ void tela_upload_antigo(GtkWidget *w,gpointer p){ //tela principal do programa, chamada após o login void tela_principal(GtkWidget *w,gpointer p){ + GtkWidget *janela_principal, *janela_ant, *button_stg4, *button_ajuda_tela_principal, *button_stg4_update, *label_greeting; GtkBuilder *builder; int status; + #ifdef DEBUG + puts("Entrou na tela principal"); + puts(""); + #endif /*DEBUG*/ + //Se não encontrou o arquivo .speed.out, calcula a velocidade de upload do usuário. if((access(".speed.out", F_OK) == -1)){ - puts("Entrou no if"); + + #ifdef DEBUG + puts("Entrou no if"); + puts(""); + #endif /*DEBUG*/ + g_spawn_command_line_sync("speedtest-cli --bytes --simple > .speed.out", NULL, NULL, &status, NULL); // Executa o script } @@ -89,11 +110,26 @@ void tela_principal(GtkWidget *w,gpointer p){ gtk_widget_hide(janela_ant); //Esconde a janela anterior } + #ifdef DEBUG + puts("Vai pegar dados do usuário"); + puts(""); + #endif /*DEBUG*/ + pega_dados_do_usuario(&dados_do_user); //Pega os dados do usuário recebidos no login - puts(dados_do_user.name); - puts(dados_do_user.login); - puts(dados_do_user.email); - puts(dados_do_user.city); + + #ifdef DEBUG + puts(dados_do_user.name); + puts(dados_do_user.login); + puts(dados_do_user.email); + puts(dados_do_user.city); + puts(""); + #endif /*DEBUG*/ + + #ifdef DEBUG + puts("Vai gerar arquivo de dados do usuário"); + puts(""); + #endif /*DEBUG*/ + gera_arquivo_dados_usuario(); //Cria o user_data.info strcpy(greeting_text, dados_do_user.name); strcat(greeting_text, "!"); @@ -125,23 +161,24 @@ void tela_principal(GtkWidget *w,gpointer p){ //Função que mostra a tela de login para o usuario void tela_login(){ + #ifdef DEBUG + puts("tela de login"); + puts(""); + #endif /*DEBUG*/ GtkWidget *window_login, *button_login, *entry_login, *entry_passwd, *label_login_erro; GtkBuilder *builder; builder = gtk_builder_new(); //Cria um novo Builder gtk gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets - printf("Linha %d\n", __LINE__); window_login = GTK_WIDGET(gtk_builder_get_object(builder, "window_login")); g_signal_connect(window_login, "destroy", G_CALLBACK(sair), NULL); - printf("Linha %d\n", __LINE__); button_login = GTK_WIDGET(gtk_builder_get_object(builder, "button_login")); label_login_erro = GTK_WIDGET(gtk_builder_get_object(builder, "label_login_erro")); entry_login = GTK_WIDGET(gtk_builder_get_object(builder, "entry_login")); entry_passwd = GTK_WIDGET(gtk_builder_get_object(builder, "entry_passwd")); - printf("Linha %d\n", __LINE__); struct dados *data = malloc(sizeof(*data)); data->dado1 = window_login; @@ -151,21 +188,28 @@ void tela_login(){ data->dado4 = entry_passwd; data->dado5 = label_login_erro; - printf("Linha %d\n", __LINE__); g_signal_connect (G_OBJECT (window_login), "key_press_event", G_CALLBACK (on_key_press), data); - printf("Linha %d\n", __LINE__); g_signal_connect(entry_passwd, "activate", G_CALLBACK(faz_login), data); g_signal_connect(button_login, "clicked", G_CALLBACK(faz_login), data); //Caso ele aperte enter com o foco no password - printf("Linha %d\n", __LINE__); gtk_widget_show_all(window_login); } // Main int main(int argc, char *argv[]){ - XInitThreads(); + + #ifdef DEBUG + puts("Vai iniciar o GTK"); + puts(""); + #endif /*DEBUG*/ + gtk_init(&argc, &argv); //Inicia o GTK + + #ifdef DEBUG + puts("Vai informar os locales para a tradução"); + puts(""); + #endif /*DEBUG*/ setlocale(LC_ALL, ""); bindtextdomain("openslx_gui_v01", "/usr/share/locale"); textdomain("openslx_gui_v01"); @@ -180,6 +224,11 @@ int main(int argc, char *argv[]){ GdkScreen *screen; GFile *css; + #ifdef DEBUG + puts("vai carregar os estilos css"); + puts(""); + #endif /*DEBUG*/ + css = g_file_new_for_path("./styles.css"); provider = gtk_css_provider_new(); diff --git a/useful/stg312/openslx_gui.h b/useful/stg312/openslx_gui.h index ddadd400..76bf7b06 100644 --- a/useful/stg312/openslx_gui.h +++ b/useful/stg312/openslx_gui.h @@ -7,6 +7,8 @@ #include <curl/curl.h> #include <curl/easy.h> +#define DEBUG //Comment this for release version + // Using http://www.digip.org/jansson/ for dealing with Json packages for Login/upload. All code was found in their tutorials. // Using https://curl.haxx.se/libcurl/c/example.html for doing http requests for Login/upload, // the documenting and debugging of this library is a hellhole, i STRONGLY recommend coding this with the one responsible for the site API next to you diff --git a/useful/stg312/openslx_gui_v01.glade b/useful/stg312/openslx_gui_v01.glade index 9dab03a9..43f2e439 100644 --- a/useful/stg312/openslx_gui_v01.glade +++ b/useful/stg312/openslx_gui_v01.glade @@ -637,7 +637,7 @@ e clique em Gerenciamento de Imagens. Edite as configurações do sistema que fez upload e ele estará pronta para uso! Caso o navegador não abra, entre no site: -http://slxbox.dev.c3sl.br +http://slxboxdev.c3sl.br </property> </object> </child> diff --git a/useful/stg312/stg4.c b/useful/stg312/stg4.c index da1ab36e..4a75aed3 100644 --- a/useful/stg312/stg4.c +++ b/useful/stg312/stg4.c @@ -5,7 +5,7 @@ #include <stdlib.h> #include <string.h> #include <errno.h> -#include <sys/wait.h> +//#include <sys/wait.h> #include "utils.h" #include "upload-utils.h" #include <gdk/gdkkeysyms.h> @@ -14,12 +14,20 @@ //Ultima tela do sistema, mostra ao usuario o que ele deve fazer para ter a imagem habilitada void stg4_tela_confirmacao_upload(GPid pid, gint status,gpointer p){ + #ifdef DEBUG + puts("stg4_tela_confirmação_upload"); + puts(""); + #endif /*DEBUG*/ GtkWidget *window_stg4_upload_confirm, *janela_ant, *button_return_upload_confirm, *button_site; GtkBuilder *builder; dados *data_ant = p; //Pega os dados recebidos pela chamada da função + #ifdef DEBUG + puts("Vai fechar o processo de upload"); + puts(""); + #endif /*DEBUG*/ GtkWidget *loading; loading = data_ant->dado6; pid = data_ant->pid; @@ -90,6 +98,11 @@ void stg4_tela_img_select(GtkWidget *w,gpointer p){ // // A função que exibe a 2a tela do programa, a tela de upload void stg4_2a_tela(GPid pid, gint status,gpointer p){ + #ifdef DEBUG + puts("stg4_2a_tela"); + puts(""); + #endif /*DEBUG*/ + GtkWidget *window_stg4_final, *button_stg4_final_sair, *janela_ant, *button_help_4at, *button_stg4_upload, *label_tempo_upload; GtkBuilder *builder; char *texto_tempo_upload, *temp; @@ -102,7 +115,10 @@ void stg4_2a_tela(GPid pid, gint status,gpointer p){ builder = gtk_builder_new(); //Cria um novo Builder gtk gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets - + #ifdef DEBUG + puts("Vai fechar o processo de clonagem de imagem"); + puts(""); + #endif /*DEBUG*/ GtkWidget *loading; loading = data_ant->dado6; pid = data_ant->pid; @@ -120,6 +136,12 @@ void stg4_2a_tela(GPid pid, gint status,gpointer p){ button_stg4_upload = GTK_WIDGET(gtk_builder_get_object(builder, "button_stg4_upload")); label_tempo_upload = GTK_WIDGET(gtk_builder_get_object(builder, "label_tempo_upload")); + + #ifdef DEBUG + puts("Vai calcular o tempo de upload estimado"); + puts(""); + #endif /*DEBUG*/ + strcpy(texto_tempo_upload, "Tempo estimado de upload: "); sprintf(temp, "%d",calcula_tempo_upload() ); //Estima o tempo de upload de imagem strcat(texto_tempo_upload, temp); @@ -148,6 +170,10 @@ void stg4_2a_tela(GPid pid, gint status,gpointer p){ //Função que chama o script que gera a imagem do usuario. void stg4_clique_2a_tela(GtkWidget *w,gpointer p){ + #ifdef DEBUG + puts("stg4_clique_2a_tela"); + puts(""); + #endif /*DEBUG*/ GPid pid; GChildWatchFunc handler; @@ -177,6 +203,11 @@ void stg4_clique_2a_tela(GtkWidget *w,gpointer p){ struct dados *data = malloc(sizeof(*data)); + #ifdef DEBUG + puts("Vai popular os parametros do script de clonagem da imagem"); + puts(""); + #endif /*DEBUG*/ + acha_tm_scripts(tmscripts); //Acha a pasta tm_scripts no sistema strcpy(version, gtk_entry_get_text(GTK_ENTRY(data_ant->dado4))); //Pega o nome da imagem que o usuario informou strcat(version, ".r1"); //versão será lidada pela api depois, por isso é a versão .r1 @@ -203,6 +234,11 @@ void stg4_clique_2a_tela(GtkWidget *w,gpointer p){ argv[8] = NULL;//ESSE ULTIMO PARAMETRO DEVE SER NULO, ele é o sentinela e informa o g_spawn onde acabam os parametros de invocação + #ifdef DEBUG + puts("Vai spawnar o processo com o script de clonagem de imagem"); + puts(""); + #endif /*DEBUG*/ + g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL);//NAO USE FORK PARA SPAWNAR SCRIPTS, use essa função. Documentação em: https://developer.gnome.org/glib/stable/glib-Spawning-Processes.html#g-spawn-sync data->dado6 = loading_screen; @@ -215,6 +251,10 @@ void stg4_clique_2a_tela(GtkWidget *w,gpointer p){ handler = stg4_2a_tela; //Função que será chamada quando o g_spawn sair + #ifdef DEBUG + puts("Vai adicionar o processo ao child watch"); + puts(""); + #endif /*DEBUG*/ g_child_watch_add(pid, handler, data); //Chama o handler quando o spawn acabar @@ -223,6 +263,12 @@ void stg4_clique_2a_tela(GtkWidget *w,gpointer p){ // Função que exibe a segunda tela, pedindo os dados necessários ao usuário void stg4_clique_1a_tela(GtkWidget *w,gpointer p){ + + #ifdef DEBUG + puts("stg4_clique_1a_tela"); + puts(""); + #endif /*DEBUG*/ + GtkWidget *window_stg4_escolha, *janela_ant, *button_clonar, *entry_imagem, *file_chooser_local, *button_help_2at, *check_button_remove; GtkBuilder *builder; @@ -262,6 +308,11 @@ void stg4_clique_1a_tela(GtkWidget *w,gpointer p){ //função que exibe a primeira tela do processo de clonagem, informando o usuário que ele deve instalar os pacotes desejados void stg4_inicio(GtkWidget *w,gpointer p){ + #ifdef DEBUG + puts("stg4_inicio"); + puts(""); + #endif /*DEBUG*/ + GtkWidget *window_stg4_inic, *janela_ant, *button_geren, *button_stg4_proximo, *button_help_1at; GtkBuilder *builder; @@ -273,8 +324,6 @@ void stg4_inicio(GtkWidget *w,gpointer p){ button_stg4_proximo = GTK_WIDGET(gtk_builder_get_object(builder, "button_stg4_proximo")); window_stg4_inic = GTK_WIDGET(gtk_builder_get_object(builder, "window_stg4_inic")); button_geren = GTK_WIDGET(gtk_builder_get_object(builder, "button_geren")); - //button_shell = GTK_WIDGET(gtk_builder_get_object(builder, "button_shell")); - g_signal_connect(window_stg4_inic, "destroy", G_CALLBACK(chama_tela_principal), NULL); //Chama a tela principal ao destruir essa janela diff --git a/useful/stg312/stg4.h b/useful/stg312/stg4.h index 2a866f0f..acbab847 100644 --- a/useful/stg312/stg4.h +++ b/useful/stg312/stg4.h @@ -5,7 +5,6 @@ #include <stdlib.h> #include <string.h> #include <errno.h> -#include <sys/wait.h> //void stg4_tela_confirmacao_upload(GtkWidget *w,gpointer p); diff --git a/useful/stg312/upload b/useful/stg312/upload index 9c8adf2445df5c7a787c79480e14a9610f0dd17f..59c5cd22ecb28a43be4f8372bec1cd8958ecfd72 100755 GIT binary patch delta 8714 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 E0ItppLjV8( delta 8476 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 V!QIEx$vNIg&q&X7^YjVP%mAIK#vuRz diff --git a/useful/stg312/upload-utils.c b/useful/stg312/upload-utils.c index b6abb937..31ac060e 100644 --- a/useful/stg312/upload-utils.c +++ b/useful/stg312/upload-utils.c @@ -4,7 +4,7 @@ #include <stdlib.h> #include <string.h> #include <errno.h> -#include <sys/wait.h> +//#include <sys/wait.h> #include <gdk/gdkkeysyms.h> #include <gdk/gdk.h> #include <glib.h> @@ -13,13 +13,18 @@ #include <curl/easy.h> #include <jansson.h> #include <time.h> -#include <gcrypt.h> +//#include <gcrypt.h> #include <sys/types.h> #include <signal.h> //Função que faz logout do sistema void logout(){ + #ifdef DEBUG + puts("logout"); + puts(""); + #endif /*DEBUG*/ + CURL *curl; @@ -39,6 +44,11 @@ void logout(){ curl_easy_setopt(curl, CURLOPT_URL, API_URL); curl_easy_setopt(curl, CURLOPT_POST, 1); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "request=logout"); + + #ifdef DEBUG + puts("Vai fazer o logout com o curl"); + puts(""); + #endif /*DEBUG*/ curl_easy_perform(curl); //faz logout } @@ -47,10 +57,21 @@ void logout(){ //Checa se existe algum upload antigo em progresso int checa_upload_antigo(){ + #ifdef DEBUG + puts("checa_upload_antigo"); + puts(""); + #endif /*DEBUG*/ + FILE *upload_in_progress; char *old_upload; old_upload = malloc(255*sizeof(char)); + + #ifdef DEBUG + puts("Vai abrir arquivo de upload em progresso"); + puts(""); + #endif /*DEBUG*/ + upload_in_progress = fopen(".progress.out", "a+"); //Abre o arquivo que contem os dados do upload antigo printf("Linha %d\n", __LINE__); rewind(upload_in_progress); @@ -67,7 +88,18 @@ int checa_upload_antigo(){ //Estima o tempo de upload, não faz a estimativa correta, mas só deus sabe como fazer essa joça realmente. O curl faz muita coisa que demora mais que só o upload, eu assumo int calcula_tempo_upload(){ + #ifdef DEBUG + puts("Calcula_tempo_upload"); + puts(""); + #endif /*DEBUG*/ + FILE *velocidade_upload; + + #ifdef DEBUG + puts("Vai abrir arquivo contendo a velocidade de upload"); + puts(""); + #endif /*DEBUG*/ + velocidade_upload = fopen(".speed.out", "r"); char *velocidade; @@ -75,25 +107,14 @@ int calcula_tempo_upload(){ int velocidade_f; fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora - puts(velocidade); fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora - puts(velocidade); fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora - puts(velocidade); fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora - puts(velocidade); fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora - puts(velocidade); fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora - puts(velocidade); fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora - puts(velocidade); fscanf(velocidade_upload, "%s", velocidade); //Le a velocidade de upload - puts(velocidade); - puts("vai calcular"); velocidade_f = atoi(velocidade); //Transforma em float - puts("calculou"); - puts("chegou aqui"); return((1953)/velocidade_f*3); // *3 para levar em conta problemas de rede. } @@ -101,9 +122,20 @@ int calcula_tempo_upload(){ // sera submetido junto à imagem quando o upload for feito. void gera_arquivo_dados_usuario(){ + #ifdef DEBUG + puts("gera_arquivo_dados_usuario"); + puts(""); + #endif /*DEBUG*/ + user_info dados_do_user; //Estrutura definida em openslx_gui.h para guardar os dados do usuario pega_dados_do_usuario(&dados_do_user); //Abre o arquivo gerado no Login e coloca os dados do usuario na estrutura dados_do_user FILE *user_data_file; + + #ifdef DEBUG + puts("Abre o arquivo de dados do usuario para sobrescrever"); + puts(""); + #endif /*DEBUG*/ + user_data_file = fopen("user_data.info", "wr"); //Arquivo com os dados do usuario que será feito o upload fputs("Nome do criador da imagem: ", user_data_file); @@ -115,96 +147,116 @@ void gera_arquivo_dados_usuario(){ fputs("\nCidade do criador da imagem: ", user_data_file); fputs(dados_do_user.city, user_data_file); + #ifdef DEBUG + puts("Vai pegar o tempo do sistema"); + puts(""); + #endif /*DEBUG*/ + time_t timer; time(&timer); //pega o tempo de criação da imagem fputs("\nData da criação da imagem: ", user_data_file); fputs(ctime(&timer), user_data_file); //Coloca o tempo de criação da imagem no arquivo + #ifdef DEBUG + puts("Vai pegar os dados do sistema rodando o software"); + puts(""); + #endif /*DEBUG*/ + fclose(user_data_file); system("uname -a >> user_data.info"); //Coloca informações sobre o usuario no arquivo system("lsb_release -a >> user_data.info"); //Coloca informações sobre o sistema no arquivo - - } //Função que checa o arquivo .login.out para verificar o suceso do login. int checa_sucesso_do_login(){ + #ifdef DEBUG + puts("checa_sucesso_do_login"); + puts(""); + #endif /*DEBUG*/ + FILE *login; char *user_data_str; + + #ifdef DEBUG + puts("Vai abrir o arquivo com o resultado do login"); + puts(""); + #endif /*DEBUG*/ + login = fopen(".login.out", "r"); //Arquivo que contem a resposta do login user_data_str = malloc(2550*sizeof(char)); fgets(user_data_str,2550*sizeof(char), login ); - printf("%zu tamanho da string\n", strlen(user_data_str)); - puts(user_data_str); + #ifdef DEBUG + puts("Dados lidos do pacote:"); + puts(user_data_str); + puts("Vai ler o pacote json recebido pelo servidor"); + puts(""); + #endif /*DEBUG*/ json_t *root; json_error_t error; root = json_loads(user_data_str,0, &error); //Pega os dados do arquivo em formato json - printf("Linha %d\n", __LINE__); if(!root){ //Caso não tenha conseguido carregar os dados - puts("erro ao carregar dados!"); - //exit(0); + puts("Erro ao carregar dados!"); } - printf("Linha %d\n", __LINE__); if(!json_is_object(root)) { fprintf(stderr, "Dados não estão em formato Json\n"); json_decref(root); } - printf("Linha %d\n", __LINE__); json_t *sha; - printf("Linha %d\n", __LINE__); const char *message_text; - printf("Linha %d\n", __LINE__); sha = json_object_get(root, "status"); //Pega o Status da resposta - printf("Linha %d\n", __LINE__); if(json_is_string(sha)) { - printf("Linha %d\n", __LINE__); message_text = json_string_value(sha); //coloca o valor de status na string - printf("Linha %d\n", __LINE__); - puts(message_text); - printf("Linha %d\n", __LINE__); }else{ - printf("Linha %d\n", __LINE__); - puts("error, not string"); + puts("Erro, o valor lido não é uma string"); return 0; - printf("Linha %d\n", __LINE__); } if(!(strcmp("ok", message_text))){ //Caso o status seja diferente de OK - printf("Linha %d\n", __LINE__); - puts(message_text); return 1; } - printf("Linha %d\n", __LINE__); return 0; - - } //Função que utiliza o arquivo gerado pela chamada Curl com os dados do usuario e coloca eles na estrutura user_info *dados void pega_dados_do_usuario(user_info *dados){ + #ifdef DEBUG + puts("pega_dados_do_usuario"); + puts(""); + #endif /*DEBUG*/ + FILE *user_data; char *user_data_str; user_data_str = malloc(2550*sizeof(char)); + + #ifdef DEBUG + puts("Vai abrir o arquivo com os dados do usuário"); + puts(""); + #endif /*DEBUG*/ + user_data = fopen(".data.out", "r"); //Abre arquivo contendo os dados do usuário fgets(user_data_str,2550*sizeof(char), user_data ); - puts("User data: "); - puts(user_data_str); - puts("User data end "); + + #ifdef DEBUG + puts("Dados lidos do pacote:"); + puts(user_data_str); + puts("Vai ler o pacote json recebido pelo servidor"); + puts(""); + #endif /*DEBUG*/ json_t *root; json_error_t error; @@ -230,7 +282,7 @@ void pega_dados_do_usuario(user_info *dados){ strcpy(dados->name, message_text); }else{ dados->name[0] = '\0'; //Caso o campo seja nulo no banco de dados - puts("error, not string"); + puts("Erro! O dado lido não é uma String."); } sha = json_object_get(root, "login"); //Pega nome @@ -242,7 +294,7 @@ void pega_dados_do_usuario(user_info *dados){ }else{ dados->login[0] = '\0'; //Caso o campo seja nulo no banco de dados - puts("error, not string"); + puts("Erro! O dado lido não é uma String."); } sha = json_object_get(root, "email"); //Pega nome @@ -254,7 +306,7 @@ void pega_dados_do_usuario(user_info *dados){ }else{ dados->email[0] = '\0'; //Caso o campo seja nulo no banco de dados - puts("error, not string"); + puts("Erro! O dado lido não é uma String."); } sha = json_object_get(root, "city"); //Pega nome @@ -266,20 +318,35 @@ void pega_dados_do_usuario(user_info *dados){ }else{ dados->city[0] = '\0'; //Caso o campo seja nulo no banco de dados - puts("error, not string"); + puts("Erro! O dado lido não é uma String."); } } int checa_sucesso_get_info(){ + #ifdef DEBUG + puts("checa_sucesso_get_info"); + puts(""); + #endif /*DEBUG*/ + FILE *user_data; char *user_data_str; user_data_str = malloc(2550*sizeof(char)); + + #ifdef DEBUG + puts("Vai abrir o arquivo que contem os dados do usuário recebido."); + puts(""); + #endif /*DEBUG*/ + user_data = fopen(".data.out", "r"); //Arquivo que contém o retorno do get info e os dados do usuário fgets(user_data_str,2550*sizeof(char), user_data ); - puts("User data: "); - puts(user_data_str); - puts("User data end "); + + #ifdef DEBUG + puts("Dados lidos do pacote:"); + puts(user_data_str); + puts("Vai ler o pacote json recebido pelo servidor"); + puts(""); + #endif /*DEBUG*/ json_t *root; json_error_t error; @@ -315,14 +382,13 @@ int checa_sucesso_get_info(){ } //Função que faz o Login do usuario no sistema. Utiliza a biblioteca Libcurlc para realizar as requisições http. // Guarda as saidas em arquivos para uso posterior. Guarda o cookie para uso posterior tbm -int faz_login_dummy(GtkWidget *w, gpointer p){ - dados *data_ant = p; //Pega os dados recebidos pela chamada da função - tela_principal(NULL, data_ant); - return 1; -} - int faz_login(GtkWidget *w, gpointer p){ + #ifdef DEBUG + puts("faz_login"); + puts(""); + #endif /*DEBUG*/ + dados *data_ant = p; //Pega os dados recebidos pela chamada da função CURL *curl; char *data = malloc(255*sizeof(char)); @@ -330,19 +396,28 @@ int faz_login(GtkWidget *w, gpointer p){ char * resp; FILE *dados_do_user, *login_out; resp = malloc(255*sizeof(char)); - puts("teste"); - puts(gtk_entry_get_text(GTK_ENTRY(data_ant->dado3))); + strcat(data, gtk_entry_get_text(GTK_ENTRY(data_ant->dado3))); //Login do usuario strcat(data, "&passwd="); strcat(data, gtk_entry_get_text(GTK_ENTRY(data_ant->dado4))); //Senha do usuario strcat(data, "&request=login"); - puts(data); + + #ifdef DEBUG + puts("Vai abrir os arquivos de dados do usuário e de resultado do login"); + puts(""); + #endif /*DEBUG*/ dados_do_user = fopen(".data.out", "wr"); login_out = fopen(".login.out", "wr"); curl = curl_easy_init(); + + #ifdef DEBUG + puts("Vai iniciar os processos de login com o curl"); + puts(""); + #endif /*DEBUG*/ + if(curl) { //para entender melhor o que é cada opção do Curl, leia: https://curl.haxx.se/libcurl/c/libcurl-tutorial.html @@ -358,12 +433,19 @@ int faz_login(GtkWidget *w, gpointer p){ curl_easy_setopt(curl, CURLOPT_URL, API_URL); curl_easy_setopt(curl, CURLOPT_POST, 1); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); - puts("Fazendo login."); + + #ifdef DEBUG + puts("Fazendo login."); + puts(""); + #endif /*DEBUG*/ curl_easy_perform(curl); //Faz login - puts("teste 2"); fclose(login_out); - printf("Linha antes checagem %d\n", __LINE__); + + #ifdef DEBUG + puts("Vai checar o sucesso do login"); + puts(""); + #endif /*DEBUG*/ if(checa_sucesso_do_login()){ //Se o login foi bem sucedido, pega as informações do usuário printf("Linha %d\n", __LINE__); @@ -373,8 +455,11 @@ int faz_login(GtkWidget *w, gpointer p){ curl_easy_setopt(curl, CURLOPT_VERBOSE, 0); curl_easy_setopt(curl, CURLOPT_HEADER, 0); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data2); - printf("Linha %d\n", __LINE__); - puts("pegando informação."); + + #ifdef DEBUG + puts("Pegando informaçes do usuário."); + puts(""); + #endif /*DEBUG*/ curl_easy_perform(curl); //Pega informações fclose(dados_do_user); if(!(checa_sucesso_get_info())){ //nao conseguiu pegar informações @@ -391,6 +476,10 @@ int faz_login(GtkWidget *w, gpointer p){ puts("Nao pegou dados"); curl_easy_cleanup(curl); + #ifdef DEBUG + puts("Vai checar se tem um upload em progresso."); + puts(""); + #endif /*DEBUG*/ if(checa_upload_antigo()){ //Verifica se existe um upload antigo nessa máquina tela_upload_antigo(NULL, data_ant); //Se tiver, chama a tela de uplaod antigo }else{ @@ -398,11 +487,11 @@ int faz_login(GtkWidget *w, gpointer p){ } return 1; } - printf("Linha %d\n", __LINE__); + } - printf("Linha %d\n", __LINE__); + gtk_label_set_text(GTK_LABEL(data_ant->dado5), "Login nao encontrado!"); //O login não foi bem sucedido - printf("Linha %d\n", __LINE__); + return 0; } @@ -411,6 +500,11 @@ int faz_login(GtkWidget *w, gpointer p){ //função de teste que faz upload da imagem teste.r1 void faz_upload_teste(GtkWidget *w, gpointer p){ + #ifdef DEBUG + puts("faz_upload_teste"); + puts(""); + #endif /*DEBUG*/ + GtkWidget *loading; GtkBuilder *builder; dados *data_ant = p; //Pega os dados recebidos pela chamada da função @@ -444,7 +538,11 @@ void faz_upload_teste(GtkWidget *w, gpointer p){ void faz_upload(GtkWidget *w, gpointer p){ - printf("Linha faz upload %d\n", __LINE__); + #ifdef DEBUG + puts("faz_upload"); + puts(""); + #endif /*DEBUG*/ + GtkWidget *loading; dados *data_ant = p; //Pega os dados recebidos pela chamada da função GtkBuilder *builder; @@ -457,31 +555,40 @@ void faz_upload(GtkWidget *w, gpointer p){ for (i=0; i < 10; i++){ argv[i] = malloc(255*sizeof(char)); } - printf("Linha %d\n", __LINE__); builder = gtk_builder_new(); //Cria um novo Builder gtk gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets loading = GTK_WIDGET(gtk_builder_get_object(builder, "loading_screen")); - - printf("Linha %d\n", __LINE__); - gtk_widget_show_all(loading); - printf("Linha %d\n", __LINE__); + + #ifdef DEBUG + puts("Vai popular o vetor de argumentos para o script de upload."); + puts(""); + #endif /*DEBUG*/ strcpy(argv[0], "./upload"); //Comando a ser invocado pelo shell strcpy(argv[1], gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data_ant->dado4))); //Caminho para a imagem criada pelo usuario strcpy(argv[2], gtk_entry_get_text(GTK_ENTRY(data_ant->dado3))); //Nome da imagem strcpy(argv[3], ".r1"); //versão, isso será depois lidado pela api, por isso o .r1 argv[4] = NULL; //ESSE ULTIMO PARAMETRO DEVE SER NULO, ele é o sentinela e informa o g_spawn onde acabam os parametros de invocação - printf("Linha %d\n", __LINE__); + + #ifdef DEBUG + puts("Vai spawnar o processo de upload."); + puts(""); + #endif /*DEBUG*/ g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL); //NAO USE FORK PARA SPAWNAR SCRIPTS, use essa função. Documentação em: https://developer.gnome.org/glib/stable/glib-Spawning-Processes.html#g-spawn-sync - printf("Linha %d\n", __LINE__); + handler = stg4_tela_confirmacao_upload; //Função a ser chamada quando o g_spawn sair data->dado6 = loading; data->dado1 = data_ant->dado1; data->pid = pid; - printf("Linha %d\n", __LINE__); + + + #ifdef DEBUG + puts("Vai adicionar o processo ao child watch"); + puts(""); + #endif /*DEBUG*/ g_child_watch_add(pid, handler, data); //Chamará a função apontada por handler ao sair do processo criado pelo g_spawn } diff --git a/useful/stg312/upload-utils.h b/useful/stg312/upload-utils.h index 1dd972c4..234b0cdd 100644 --- a/useful/stg312/upload-utils.h +++ b/useful/stg312/upload-utils.h @@ -4,7 +4,6 @@ #include <stdlib.h> #include <string.h> #include <errno.h> -#include <sys/wait.h> //Aviso a quem vai editar esse código. Boa sorte com a libcurl, a documentação é muito escassa e mal explicada, nada faz sentido // a opção de debug não indica nada importante e as soluções são extremamente Cripticas se vc não tem um conhecimento grande de diff --git a/useful/stg312/upload.c b/useful/stg312/upload.c index a1487308..a3e1f1c4 100644 --- a/useful/stg312/upload.c +++ b/useful/stg312/upload.c @@ -3,7 +3,7 @@ #include <stdlib.h> #include <string.h> #include <errno.h> -#include <sys/wait.h> +//#include <sys/wait.h> #include <gdk/gdkkeysyms.h> #include <gdk/gdk.h> #include <glib.h> @@ -12,7 +12,7 @@ #include <curl/easy.h> #include <jansson.h> #include <time.h> -#include <gcrypt.h> +//#include <gcrypt.h> #include <sys/types.h> #include <signal.h> #include "upload-utils.h" @@ -20,15 +20,28 @@ //Função que checa o sucesso do upload feito; int checa_sucesso_upload(){ + #ifdef DEBUG + puts("checa_sucesso_upload"); + puts(""); + #endif /*DEBUG*/ + FILE *user_data; char *user_data_str; user_data_str = malloc(2550*sizeof(char)); + + #ifdef DEBUG + puts("Vai abrir arquivo com a resposta do upload."); + puts(""); + #endif /*DEBUG*/ user_data = fopen(".upload.out", "r"); //Abre arquivo contendo a resposta do servidor - system("cat .upload.out"); //Para debug + fgets(user_data_str,2550*sizeof(char), user_data ); - puts("User data: "); - puts(user_data_str); - puts("User data end "); + #ifdef DEBUG + puts("Dados lidos do pacote:"); + system("cat .upload.out"); //Para debug + puts("Vai ler o pacote json recebido pelo servidor"); + puts(""); + #endif /*DEBUG*/ json_t *root; json_error_t error; @@ -54,7 +67,7 @@ int checa_sucesso_upload(){ message_text = json_string_value(sha); //Coloca o status no string puts(message_text); }else{ - puts("error, not string"); //Status não é um string + puts("Erro! O dado lido não é uma String."); //Status não é um string } @@ -68,12 +81,16 @@ int checa_sucesso_upload(){ message_text = json_string_value(sha); //Coloca o codigo em uma string puts(message_text); }else{ - puts("error, not string"); //O código não é uma string + puts("Erro! O dado lido não é uma String."); //O código não é uma string return 116; } //Para entender que erro é o que verifique documentação da API que está no Redmine (https://redmine.c3sl.ufpr.br/projects/openslx-dnbd3/files arquivo api_webservice_report) ou Taiga - puts("Irá procurar o erro."); + + #ifdef DEBUG + puts("Irá procurar o erro."); + puts(""); + #endif /*DEBUG*/ if(!(strcmp(message_text, "109"))){ puts("Erro 109: Uploadid nao informado, caso esteja vendo esse erro repita todo o processo de criação de imagem."); return 0; @@ -121,14 +138,28 @@ int checa_sucesso_upload(){ //Função que vai pegar o upload ip fornecido pela api int pega_upload_id(char *id){ + #ifdef DEBUG + puts("pega_uplaod_id"); + puts(""); + #endif /*DEBUG*/ + FILE *user_data; char *user_data_str; user_data_str = malloc(2550*sizeof(char)); + + #ifdef DEBUG + puts("Vai abrir o arquivo contendo o upload id"); + puts(""); + #endif /*DEBUG*/ user_data = fopen(".upid.out", "r"); //Abre o arquivo que contém o upload id fgets(user_data_str,2550*sizeof(char), user_data ); - puts("User data: "); - puts(user_data_str); - puts("User data end "); + + #ifdef DEBUG + puts("Dados lidos do pacote:"); + puts(user_data_str); + puts("Vai ler o pacote json recebido pelo servidor"); + puts(""); + #endif /*DEBUG*/ json_t *root; json_error_t error; @@ -153,7 +184,7 @@ int pega_upload_id(char *id){ message_text = json_string_value(sha); puts(message_text); }else{ - puts("error, not string"); + puts("Erro! O dado lido não é uma String."); } if(!(strcmp(message_text, "ok"))){ //Se o status estiver OK, continua @@ -163,7 +194,7 @@ int pega_upload_id(char *id){ message_text = json_string_value(sha); puts(message_text); }else{ - puts("error, not string"); + puts("Erro! O dado lido não é uma String."); } strcpy(id, message_text); //copia o uploadid pra id @@ -176,7 +207,7 @@ int pega_upload_id(char *id){ message_text = json_string_value(sha); puts(message_text); }else{ - puts("error, not string"); + puts("Erro! O dado lido não é uma String."); } if(!(strcmp(message_text, "108"))){ @@ -188,6 +219,11 @@ int pega_upload_id(char *id){ int main(int argc, char *argv[]){ + #ifdef DEBUG + puts("main do upload.c"); + puts(""); + #endif /*DEBUG*/ + system("echo n > .result.out"); //Inicia o arquivo de sucesso com falha CURL *curl; @@ -205,6 +241,11 @@ int main(int argc, char *argv[]){ //strcpy(version, ARQUIVO_TESTE); FILE *upid, *sha_calc, *upload_output, *upload_in_progress; + + #ifdef DEBUG + puts("Vai abrir o arquivo para o upload id"); + puts(""); + #endif /*DEBUG*/ upid = fopen(".upid.out", "wr"); curl = curl_easy_init(); @@ -221,14 +262,12 @@ int main(int argc, char *argv[]){ curl_easy_setopt(curl, CURLOPT_POST, 1); upload_in_progress = fopen(".progress.out", "a+"); //Abre o arquivo com o possível upload antigo em progresso. - printf("Linha %d\n", __LINE__); rewind(upload_in_progress); fscanf(upload_in_progress, "%s", old_upload); - printf("Linha %d\n", __LINE__); i = 0; - puts(old_upload); + if(!(strcmp(old_upload, "Upload"))){ //Verifica se existe um upload antigo puts("Achou um upload antigo, continuando ele"); fscanf(upload_in_progress, "%s", old_upload); @@ -250,15 +289,22 @@ int main(int argc, char *argv[]){ strcat(upload_name, "&version="); strcat(upload_name, argv[3]); - puts("Upload_name: "); - puts(upload_name); + + #ifdef DEBUG + puts("Upload_name: "); + puts(upload_name); + puts(""); + #endif /*DEBUG*/ curl_easy_setopt(curl, CURLOPT_POSTFIELDS, upload_name); curl_easy_setopt(curl, CURLOPT_WRITEDATA, upid); - puts("Pegando UploadId."); + + #ifdef DEBUG + puts("Pegando UploadId."); + puts(""); + #endif /*DEBUG*/ curl_easy_perform(curl); //Pega o uploadid - printf("Linha %d\n", __LINE__); fclose(upid); if(!(pega_upload_id(uploadid))){ @@ -272,26 +318,26 @@ int main(int argc, char *argv[]){ fclose(upload_in_progress); // Vai preparar pra fazer o upload. - - printf("Linha %d\n", __LINE__); char *calculated_sha = malloc(255*sizeof(char)); char *sha_command_line = malloc(255*sizeof(char)); - printf("Linha %d\n", __LINE__); + curl_easy_setopt(curl, CURLOPT_POST, 0); struct curl_slist *list = NULL; list = curl_slist_append(list, "Expect: "); curl_easy_setopt(curl,CURLOPT_HTTPHEADER,list); curl_formadd(&formpost,&lastptr,CURLFORM_COPYNAME, "request", CURLFORM_COPYCONTENTS,"upload",CURLFORM_END); - printf("Linha %d\n", __LINE__); curl_formadd(&formpost,&lastptr,CURLFORM_COPYNAME, "uploadid", CURLFORM_COPYCONTENTS, uploadid,CURLFORM_END); //começa a fazer o upload for(; i < NUMBER_OF_PARTS; ++i){ - puts(version); strcpy(upload_name, version); strcat(upload_name, part_suffix); + #ifdef DEBUG + puts("Vai abrir o arquivo que irá conter o upload antigo."); + puts(""); + #endif /*DEBUG*/ upload_output = fopen(".upload.out", "wr"); strcpy(sha_command_line, "openssl dgst -sha1 "); //calcula o sha do arquivo @@ -304,19 +350,30 @@ int main(int argc, char *argv[]){ curl_formadd(&formpost,&lastptr,CURLFORM_COPYNAME, "sha1", CURLFORM_COPYCONTENTS,calculated_sha,CURLFORM_END); curl_easy_setopt(curl, CURLOPT_WRITEDATA, upload_output); curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); - puts("Fazendo Upload de:"); - puts(part_suffix); + + #ifdef DEBUG + puts("Fazendo Upload de:"); + puts(part_suffix); + puts(""); + #endif /*DEBUG*/ upload_in_progress = fopen(".progress.out", "wr"); //Abre o arquivo que conterá os dados necessários para continuar o upload caso esse falhe fprintf(upload_in_progress, "Upload\n%s\n%s\n%s\n%d\n%s", uploadid, upload_name, part_suffix, i, version); //Insere os dados necessários para continuar o upload em caso de falha fclose(upload_in_progress); //fecha o arquivo, obriga um sync dele + #ifdef DEBUG + puts("Vai fazer o upload usando o curl."); + puts(""); + #endif /*DEBUG*/ curl_easy_perform(curl); //Faz o upload propriamente dito fclose(upload_output); - printf("Linha %d\n", __LINE__); + + #ifdef DEBUG + puts("Vai checar o sucesos do upload:"); + puts(""); + #endif /*DEBUG*/ check_response = checa_sucesso_upload(); //Checa se o upload foi feito com sucesso - printf("Linha %d\n", __LINE__); if(check_response == 1){ puts("Parte enviada para o servidor com suceso."); part_suffix[9]++; @@ -338,14 +395,14 @@ int main(int argc, char *argv[]){ --i; } } - printf("Linha %d\n", __LINE__); + } //Fez o upload, vai atualizar o arquivo de upload em progresso - printf("Linha %d\n", __LINE__); + upload_in_progress = fopen(".progress.out", "wr"); - printf("Linha %d\n", __LINE__); + fprintf(upload_in_progress, "Nothing to see here, move along now"); - printf("Linha %d\n", __LINE__); + curl_easy_cleanup(curl); } system("echo s > .result.out"); //Terminou tudo corretamente, atualiza o arquivo de checagem de sucesso! diff --git a/useful/stg312/utils.c b/useful/stg312/utils.c index 9c279842..cea7ff9d 100644 --- a/useful/stg312/utils.c +++ b/useful/stg312/utils.c @@ -5,7 +5,7 @@ #include <stdlib.h> #include <string.h> #include <errno.h> -#include <sys/wait.h> +//#include <sys/wait.h> #include <gdk/gdkkeysyms.h> #include <gdk/gdk.h> #include <glib.h> @@ -14,35 +14,40 @@ #include <curl/easy.h> #include <jansson.h> #include <time.h> -#include <gcrypt.h> +//#include <gcrypt.h> #include <sys/types.h> #include <signal.h> //FUnção que acha o caminho para o tm-scripts, utilizada no arquivo clone_stage4.sh void acha_tm_scripts(char *path){ - - char *cam_tm_scripts; - char *first_p; - char paths[1024]; - getcwd(paths, sizeof(paths)); // Pega o current working directory - cam_tm_scripts = strstr(paths, "tm-scripts"); //Acha onde esta escrito tm-scripts - puts(cam_tm_scripts); - first_p = strchr(cam_tm_scripts, 'p');//acha o primeiro 'p' em tm scripts - first_p += 3; //anda o ponteiro - *first_p = '\0'; //termina a string, sim, tem um leak de memoria. - strcpy(path, paths); - + #ifdef DEBUG + puts("acha_tm_scripts"); + puts(""); + #endif /*DEBUG*/ + + char *cam_tm_scripts; + char *first_p; + char paths[1024]; + getcwd(paths, sizeof(paths)); // Pega o current working directory + cam_tm_scripts = strstr(paths, "tm-scripts"); //Acha onde esta escrito tm-scripts + puts(cam_tm_scripts); + first_p = strchr(cam_tm_scripts, 'p');//acha o primeiro 'p' em tm scripts + first_p += 3; //anda o ponteiro + *first_p = '\0'; //termina a string, sim, tem um leak de memoria. + strcpy(path, paths); } //função que lida com os inputs do teclado. Ver https://git.gnome.org/browse/gtk+/plain/gdk/gdkkeysyms.h para uma lista completa das Macros de teclas. gboolean on_key_press (GtkWidget *w, GdkEventKey *event, gpointer p){ - + #ifdef DEBUG + puts("on_key_press"); + puts(""); + #endif /*DEBUG*/ gpointer window, button; window = w; dados *data_ant = p; //Pega os dados recebidos pela chamada da função button = data_ant->dado2; //Botão que da continuidade ao software, dado->2 por comodidade. - puts(gtk_widget_get_name(w)); switch (event->keyval){ @@ -51,8 +56,15 @@ gboolean on_key_press (GtkWidget *w, GdkEventKey *event, gpointer p){ break; case GDK_KEY_F6: //Apertou f6 - if(!strcmp(gtk_widget_get_name(w), "instal_window")) + + + if(!strcmp(gtk_widget_get_name(w), "instal_window")){ + #ifdef DEBUG + puts("Vai abrir o shell"); + puts(""); + #endif /*DEBUG*/ abre_shell(NULL, NULL); + } break; case GDK_KEY_Escape: //Apertou esc, destroi a janela @@ -73,7 +85,11 @@ return FALSE; //Função que abre o software center do sistema void abre_software_center(GtkWidget *w, gpointer p){ - + #ifdef DEBUG + puts("abre_software_center"); + puts("Vai abrir o synaptic."); + puts(""); + #endif /*DEBUG*/ int status; g_spawn_command_line_sync("synaptic", NULL, NULL, &status, NULL); //Abre o synaptic. Quando melhorarem o software center usar o software center @@ -81,18 +97,24 @@ void abre_software_center(GtkWidget *w, gpointer p){ //Função que abre um shell para instalar os pacotes. void abre_shell(GtkWidget *w, gpointer p){ - + #ifdef DEBUG + puts("abre_shell"); + puts("Vai abrir o shell."); + puts(""); + #endif /*DEBUG*/ int status; - g_spawn_command_line_sync("x-terminal-emulator", NULL, NULL, &status, NULL); // Abre o shell } void abre_site(GtkWidget *w, gpointer p){ - + #ifdef DEBUG + puts("abre_site"); + puts("Vai abrir o site do openslx."); + puts(""); + #endif /*DEBUG*/ int status; - g_spawn_command_line_sync("xdg-open http://slxboxdev.c3sl.ufpr.br", NULL, NULL, &status, NULL); // Abre o site. @@ -100,16 +122,23 @@ void abre_site(GtkWidget *w, gpointer p){ //Função que sai do programa, fazendo logout antes void sair(GtkWidget *w, gpointer p){ - + #ifdef DEBUG + puts("sair"); + puts("Vai fazer o logout."); + puts(""); + #endif /*DEBUG*/ logout(); gtk_main_quit(); } -// Função que checa se os scripts foram rodados com sucesso. Ela é utilizada tanto na tela 2 quanto na tela 3. +// Função que checa se os scripts foram rodados com sucesso. int checa_sucesso(){ - + #ifdef DEBUG + puts("checa_sucesso"); + puts(""); + #endif /*DEBUG*/ FILE *resultado; // Arquivo utilizado para ler o resultado do script. char controle; @@ -121,11 +150,19 @@ int checa_sucesso(){ dialogo = GTK_WIDGET(gtk_builder_get_object(builder, "error_dialog")); //Carrega o dialogo de erro + #ifdef DEBUG + puts("Vai abrir o arquivo contendo o resultdo da operação"); + puts(""); + #endif /*DEBUG*/ resultado = fopen(".result.out", "r"); // .result.out é o arquivo que armazena se o script foi executado corretamente ou não if(resultado != NULL){ fread(&controle, sizeof(char), 1, resultado); //Lê a saida do script - printf("Controle = %c\n", controle); + + #ifdef DEBUG + printf("Controle = %c\n", controle); + puts(""); + #endif /*DEBUG*/ if(controle == 's'){ //Caso o script não tenha sido executado com sucesso o programa informa o usuário por meio de uma janela de dialogo do GTK system("rm .result.out"); @@ -154,6 +191,11 @@ return(0); // Função que verifica se o usuário inseriu um nome com espaços no campo nome da imagem void stg4_clique_2a_tela_caller(GtkWidget *w, gpointer p){ + + #ifdef DEBUG + puts("stg4_clique_2a_tela_caller"); + puts(""); + #endif /*DEBUG*/ GtkWidget *entry; dados *data_ant = p; //Pega os dados recebidos pela chamada da função @@ -178,6 +220,11 @@ void stg4_clique_2a_tela_caller(GtkWidget *w, gpointer p){ //Altera o texto da janela de ajuda void altera_texto_help(GtkWidget *w, gpointer p){ + #ifdef DEBUG + puts("altera_texto_help"); + puts(""); + #endif /*DEBUG*/ + const char *nome; int nome_int; GtkWidget *label; @@ -217,6 +264,11 @@ void altera_texto_help(GtkWidget *w, gpointer p){ //Janela de ajuda void help_screen(GtkWidget *w, gpointer p){ + + #ifdef DEBUG + puts("help_screen"); + puts(""); + #endif /*DEBUG*/ GtkWidget *window_help, *button_help_inicio, *button_help_2a_tela, *button_help_3a_tela, *button_help_4a_tela, *button_help_5a_tela, *label_help_info; GtkBuilder *builder; @@ -251,12 +303,21 @@ void help_screen(GtkWidget *w, gpointer p){ //Sai do script chamado, verificando o sucesso void sai_do_script(GPid pid, gint status, gpointer p){ + #ifdef DEBUG + puts("sai_do_script"); + puts(""); + #endif /*DEBUG*/ + GtkWidget *loading; dados *data_ant = p; //Pega os dados recebidos pela chamada da função loading = data_ant->dado6; pid = data_ant->pid; gtk_widget_hide(loading); //Esconde a tela de loading - //gtk_widget_show(window); + + #ifdef DEBUG + puts("Vai checar o sucesso do script"); + puts(""); + #endif /*DEBUG*/ checa_sucesso(); //Checa se o script foi executdo corretamente g_spawn_close_pid(pid); //Mata o processo do script @@ -264,20 +325,24 @@ void sai_do_script(GPid pid, gint status, gpointer p){ //Fecha a janela que chama essa função e mostra a janela principal void mata_janela_e_chama_tela_principal(GtkWidget *w, gpointer p){ + + #ifdef DEBUG + puts("mata_janela_e_chama_tela_principal"); + puts(""); + #endif /*DEBUG*/ dados *data_ant = p; //Pega os dados recebidos pela chamada da função - puts("teste3"); GtkWidget *janela_ant; - puts("teste2"); janela_ant = data_ant->dado1; - puts("teste"); - gtk_widget_hide(janela_ant); //Esconde a janela anterior//Nao achou isso, nao cuspiu teste 4 - puts("teste4"); - g_signal_emit_by_name(janela_ant, "destroy"); - puts("teste5"); + gtk_widget_hide(janela_ant); //Esconde a janela anterior + g_signal_emit_by_name(janela_ant, "destroy"); //Emite o sinal de destroy pra janela pra fazer certo as coisas quando fechar } //Chama a tela principal void chama_tela_principal(GtkWidget *w, gpointer p){ + #ifdef DEBUG + puts("chama_tela_principal"); + puts(""); + #endif /*DEBUG*/ struct dados *data = malloc(sizeof(*data)); data->dado1 = NULL; tela_principal(NULL,data); diff --git a/useful/stg312/utils.h b/useful/stg312/utils.h index 01713a92..9ed1ac75 100644 --- a/useful/stg312/utils.h +++ b/useful/stg312/utils.h @@ -5,7 +5,6 @@ #include <stdlib.h> #include <string.h> #include <errno.h> -#include <sys/wait.h> #include "openslx_gui.h" #include "stg4.h" #include "upload-utils.h" @@ -17,23 +16,6 @@ static const int NUMBER_OF_PARTS = 10; // static const char CLONE_STG4_SCRIPT[] = "./clone_stage4.sh"; static const char CLONE_STG4_SCRIPT_DUMMY[] = "./clone_stage4-dummy.sh"; static const char ARQUIVO_TESTE[] = "/home/ent13/Desktop/pasta-teste/teste.r1"; -/* -int calcula_tempo_upload(); - -void pega_dados_do_usuario(user_info *dados); - -void gera_arquivo_dados_usuario(); - -int faz_login_dummy(GtkWidget *w, gpointer p); - -int faz_login(GtkWidget *w, gpointer p); - -void faz_upload_dummy(GtkWidget *w, gpointer p); - -void faz_upload_teste(GtkWidget *w, gpointer p); - -void faz_upload(GtkWidget *w, gpointer p); -*/ void stg4_clique_2a_tela_caller(GtkWidget *w, gpointer p); -- GitLab