Skip to content

Instantly share code, notes, and snippets.

@lkmandy
Last active February 27, 2021 08:53
Show Gist options
  • Select an option

  • Save lkmandy/0b8f73138ec2473c8b50c1a758472df8 to your computer and use it in GitHub Desktop.

Select an option

Save lkmandy/0b8f73138ec2473c8b50c1a758472df8 to your computer and use it in GitHub Desktop.
Create a gtk spinner in C
/*
* "Upload file" dialog
*
*/
void
gtr_upload_file_dialog (GtkAction * action, GtrWindow * window)
{
GtrTab *tab;
GtrPo *po;
GtkWidget *dialog, *success_dialog;
GtkDialogFlags flags = GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL;
GMappedFile *mapped;
GError *error = NULL;
GtrProfileManager *pmanager = NULL;
GtrNotebook *active_notebook;
GtrProfile *profile;
GtrHeader *header;
g_autoptr (SoupMessage) msg = NULL;
g_autoptr (SoupMultipart) mpart = NULL;
g_autoptr (SoupBuffer) buffer = NULL;
g_autoptr (SoupSession) session = NULL;
const gchar *content = NULL;
g_autofree gchar *mime_type = NULL;
g_autofree gchar *filename = NULL;
g_autofree gchar *upload_endpoint = NULL;
const char *auth_token = NULL;
g_autofree char *auth = NULL;
gsize size;
const gchar *selected_team;
const gchar *selected_module;
const gchar *selected_branch;
const gchar *selected_domain;
GtkWidget *spinner;
GtkWidget *spinner_dialog;
GtkWidget *dialog_area;
GtkWidget *vbox;
GtkWidget *fixed;
spinner_dialog = gtk_dialog_new_with_buttons (_("Uploading to DL..."),
GTK_WINDOW(window),
GTK_DIALOG_DESTROY_WITH_PARENT,
_("_Cancel"),
GTK_RESPONSE_REJECT,
NULL);
dialog_area = gtk_dialog_get_content_area (GTK_DIALOG (spinner_dialog));
g_signal_connect (spinner_dialog,
"response",
G_CALLBACK (gtk_widget_destroy),
spinner_dialog);
g_signal_connect (spinner_dialog,
"destroy",
G_CALLBACK (gtk_widget_destroyed),
&spinner_dialog);
gtk_window_set_resizable (GTK_WINDOW (spinner_dialog), FALSE);
gtk_widget_set_size_request (spinner_dialog, 300, 200);
vbox = gtk_box_new (FALSE, 5);
gtk_box_pack_start (GTK_BOX (dialog_area), vbox, TRUE, TRUE, 0);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
spinner = gtk_spinner_new();
fixed = gtk_fixed_new();
gtk_container_add (GTK_CONTAINER (vbox), fixed);
gtk_fixed_put (GTK_FIXED (fixed), spinner, 150, 100);
gtk_spinner_start (GTK_SPINNER (spinner));
gtk_widget_show_all (spinner_dialog);
gtk_dialog_run (GTK_DIALOG (spinner_dialog));
/* Get file content */
tab = gtr_window_get_active_tab (window);
po = gtr_tab_get_po (tab);
filename = g_file_get_path (gtr_po_get_location (po));
mapped = g_mapped_file_new (filename, FALSE, &error);
if (error != NULL) {
g_warning ("Error opening file %s: %s", filename, (error)->message);
}
content = g_mapped_file_get_contents (mapped);
size = g_mapped_file_get_length (mapped);
active_notebook = gtr_window_get_notebook (window);
header = gtr_po_get_header (po);
/* Check mimetype */
mime_type = g_strdup (g_content_type_get_mime_type(content));
/* Get the authentication token from the user profile */
pmanager = gtr_profile_manager_get_default ();
profile = gtr_profile_manager_get_active_profile (pmanager);
auth_token = gtr_profile_get_auth_token (profile);
auth = g_strconcat ("Bearer ", auth_token, NULL);
selected_module = gtr_po_get_dl_module (po);
if (selected_module == NULL)
selected_module = gtr_header_get_dl_module (header);
selected_branch = gtr_po_get_dl_branch (po);
if (selected_branch == NULL)
selected_branch = gtr_header_get_dl_branch (header);
selected_domain = gtr_po_get_dl_domain (po);
if (selected_domain == NULL)
selected_domain = gtr_header_get_dl_domain (header);
selected_team = gtr_po_get_dl_team (po);
if (selected_team == NULL)
selected_team = gtr_header_get_dl_team (header);
/* API endpoint: modules/[module]/branches/[branch]/domains/[domain]/languages/[team]/upload */
upload_endpoint = g_strconcat((const gchar *)API_URL,
"modules/", selected_module,
"/branches/", selected_branch,
"/domains/", selected_domain,
"/languages/", selected_team,
"/upload", NULL);
/* Init multipart container */
mpart = soup_multipart_new (SOUP_FORM_MIME_TYPE_MULTIPART);
buffer = soup_buffer_new (SOUP_MEMORY_COPY, content, size);
soup_multipart_append_form_string (mpart, "file", "txt");
soup_multipart_append_form_file (mpart, "file", filename,
mime_type, buffer);
/* Get the associated message */
msg = soup_form_request_new_from_multipart (upload_endpoint, mpart);
/* Append the authentication header*/
soup_message_headers_append (msg->request_headers, "Authentication", auth);
session = soup_session_new ();
soup_session_send_message (session, msg);
if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code))
{
gtk_widget_destroy (spinner_dialog);
dialog = gtk_message_dialog_new (GTK_WINDOW (window),
flags,
GTK_MESSAGE_WARNING,
GTK_BUTTONS_CLOSE,
_("An error occurred while uploading the file: %s"),
soup_status_get_phrase (msg->status_code));
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
return;
}
success_dialog = gtk_message_dialog_new (GTK_WINDOW (window),
flags,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
_("The file '%s.%s.%s.%s' has been uploaded!"),
selected_module,
selected_branch,
selected_team,
selected_domain);
gtk_widget_destroy (spinner_dialog);
gtk_dialog_run (GTK_DIALOG (success_dialog));
gtk_widget_destroy (success_dialog);
gtr_notebook_enable_upload (active_notebook, FALSE);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment