Modified xmlrpc to send irreco version in correct format.
[irreco.git] / irreco / src / core / irreco_theme_upload_dlg.c
blob1caf82ea7f3e09dc6d86ee7184656af0d2b8f6a5
1 /*
2 * irreco - Ir Remote Control
3 * Copyright (C) 2007 Arto Karppinen (arto.karppinen@iki.fi)
4 * 2008 Joni Kokko (t5kojo01@students.oamk.fi)
5 * 2008 Harri Vattulainen (t5vaha01@students.oamk.fi)
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 #include "irreco_theme_upload_dlg.h"
23 #include "irreco_button_browser_dlg.h"
24 #include <hildon/hildon-banner.h>
27 /**
28 * @addtogroup IrrecoThemeUploadDlg
29 * @ingroup Irreco
31 * Allow user to set theme settings and upload it.
33 * @{
36 /**
37 * @file
38 * Source file of @ref IrrecoThemeUploadDlg.
43 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
44 /* Datatypes */
45 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
47 #define IRRECO_THEME_UPLOAD_PREVIEW_WIDHT (IRRECO_SCREEN_WIDTH / 6)
48 #define IRRECO_THEME_UPLOAD_PREVIEW_HEIGHT (IRRECO_SCREEN_HEIGHT / 6)
50 /** Loader states. */
51 enum
53 LOADER_STATE_INIT,
54 LOADER_STATE_THEME,
55 LOADER_STATE_BUTTONS,
56 LOADER_STATE_BACKGROUNDS,
57 LOADER_STATE_END
60 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
61 /* Prototypes */
62 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
63 static gboolean _texts_ok(IrrecoThemeUploadDlg *self);
64 static gboolean _send_theme(IrrecoThemeUploadDlg *self);
65 static void _update_preview(IrrecoThemeUploadDlg *self);
66 static void _run_button_browser_dlg(GtkWidget *widget,
67 GdkEventButton *event,
68 IrrecoThemeUploadDlg *self);
69 static gboolean _get_image_data_and_hash(gchar* img_path,
70 guchar **img_data,
71 gchar **img_sha,
72 gint *img_data_len,
73 gsize buffer_size,
74 gchar **error_msg);
75 static void _hide_banner(IrrecoThemeUploadDlg *self);
76 static void _set_banner(IrrecoThemeUploadDlg *self,
77 const gchar *text,
78 gdouble fraction);
79 static void _loader_start(IrrecoThemeUploadDlg *self);
80 static void _loader_stop(IrrecoThemeUploadDlg *self);
81 #if 0
82 static gboolean _upload_button(IrrecoThemeUploadDlg* self,
83 gint themeindex,
84 IrrecoWebdbClient *client,
85 gsize buffer_size);
86 static gboolean _upload_background(IrrecoThemeUploadDlg* self,
87 gint themeindex,
88 IrrecoWebdbClient *client,
89 gsize buffer_size);
90 #endif
92 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
93 /* Construction & Destruction */
94 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
96 /**
97 * @name Construction & Destruction
98 * @{
101 G_DEFINE_TYPE(IrrecoThemeUploadDlg, irreco_theme_upload_dlg,
102 IRRECO_TYPE_INTERNAL_DLG)
104 static void irreco_theme_upload_dlg_constructed(GObject *object)
106 IrrecoThemeUploadDlg *self;
108 GtkWidget *hbox_lr;
109 GtkWidget *vbox_preview;
110 GtkWidget *label_name;
111 GtkWidget *label_comments;
112 GtkWidget *label_preview;
113 GtkWidget *scrolled_comments;
114 GtkWidget *table;
115 GtkWidget *frame_comments;
116 GtkWidget *frame_preview;
118 IRRECO_ENTER
120 G_OBJECT_CLASS(irreco_theme_upload_dlg_parent_class)->constructed(object);
121 self = IRRECO_THEME_UPLOAD_DLG(object);
123 self->comments = NULL;
125 /* Construct dialog. */
126 gtk_window_set_title(GTK_WINDOW(self), _("Upload theme"));
127 gtk_window_set_modal(GTK_WINDOW(self), TRUE);
128 gtk_window_set_destroy_with_parent(GTK_WINDOW(self), TRUE);
129 gtk_dialog_set_has_separator(GTK_DIALOG(self), FALSE);
130 gtk_dialog_add_buttons(GTK_DIALOG(self),
131 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
132 GTK_STOCK_OK, GTK_RESPONSE_OK,
133 NULL);
135 /* Create widgets. */
136 hbox_lr = gtk_hbox_new(FALSE, 10);
137 vbox_preview = gtk_vbox_new(FALSE, 0);
138 label_name = gtk_label_new("Theme name:");
139 label_comments = gtk_label_new("Comments:");
140 label_preview = gtk_label_new("Select\npreview image:");
141 self->entry_name = gtk_entry_new();
142 self->textview_comments = gtk_text_view_new();
143 frame_comments = gtk_frame_new(NULL);
145 /* preview */
146 self->preview_image = gtk_image_new();
147 gtk_image_set_from_file(GTK_IMAGE(self->preview_image), NULL);
148 frame_preview = gtk_frame_new(NULL);
149 self->preview_event_box = gtk_event_box_new();
150 gtk_container_add(GTK_CONTAINER(frame_preview), self->preview_image);
151 gtk_container_add(GTK_CONTAINER(self->preview_event_box), frame_preview);
152 gtk_widget_set_size_request(frame_preview, 200,200);
155 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(self->textview_comments),
156 GTK_WRAP_WORD_CHAR);
157 gtk_widget_set_size_request(self->textview_comments, 400, 150);
158 scrolled_comments = gtk_scrolled_window_new(NULL, NULL);
159 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_comments),
160 GTK_POLICY_NEVER,
161 GTK_POLICY_AUTOMATIC);
162 table = gtk_table_new(4, 2, FALSE);
164 /* Build dialog. */
165 gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(self)->vbox),
166 hbox_lr);
167 gtk_box_pack_start_defaults(GTK_BOX(hbox_lr), table);
168 gtk_box_pack_end_defaults(GTK_BOX(hbox_lr), vbox_preview);
169 gtk_box_pack_start_defaults(GTK_BOX(vbox_preview), label_preview);
170 gtk_box_pack_end_defaults(GTK_BOX(vbox_preview),
171 self->preview_event_box);
172 gtk_container_add(GTK_CONTAINER(scrolled_comments),
173 self->textview_comments);
174 gtk_container_add(GTK_CONTAINER (frame_comments),
175 scrolled_comments);
176 gtk_table_attach_defaults(GTK_TABLE(table),
177 label_name, 0, 1, 0, 1);
178 gtk_table_attach_defaults(GTK_TABLE(table),
179 self->entry_name, 1, 2, 0, 1);
180 gtk_table_attach_defaults(GTK_TABLE(table),
181 label_comments, 0, 1, 1, 2);
182 gtk_table_attach_defaults(GTK_TABLE(table),
183 frame_comments, 0, 2, 2, 3);
185 /* Connect preview eventbox and start dialog from there */
186 g_signal_connect(G_OBJECT(self->preview_event_box),
187 "button-release-event",
188 G_CALLBACK(_run_button_browser_dlg),
189 IRRECO_THEME_UPLOAD_DLG(self));
191 gtk_widget_show_all(GTK_WIDGET(self));
192 IRRECO_RETURN
195 static void irreco_theme_upload_dlg_init(IrrecoThemeUploadDlg *self)
197 IRRECO_ENTER
198 /*self->theme_name = g_string_new(NULL);
199 self->author = g_string_new(NULL);
200 self->comments = g_string_new(NULL);*/
201 IRRECO_RETURN
204 static void irreco_theme_upload_dlg_finalize(GObject *object)
206 IrrecoThemeUploadDlg *self;
207 IRRECO_ENTER
209 self = IRRECO_THEME_UPLOAD_DLG(object);
210 /*g_string_free(self->theme_name, TRUE);
211 self->theme_name = NULL;
212 g_string_free(self->author, TRUE);
213 self->author = NULL;
214 g_string_free(self->comments, TRUE);
215 self->comments = NULL;*/
217 G_OBJECT_CLASS(irreco_theme_upload_dlg_parent_class)->finalize(object);
218 IRRECO_RETURN
221 static void irreco_theme_upload_dlg_class_init(IrrecoThemeUploadDlgClass *klass)
223 GObjectClass* object_class = G_OBJECT_CLASS (klass);
224 /* IrrecoDlgClass* parent_class = IRRECO_DLG_CLASS (klass); */
226 object_class->finalize = irreco_theme_upload_dlg_finalize;
227 object_class->constructed = irreco_theme_upload_dlg_constructed;
230 GtkWidget *irreco_theme_upload_dlg_new(IrrecoData *irreco_data,
231 GtkWindow *parent_window)
233 IrrecoThemeUploadDlg *self;
234 IRRECO_ENTER
236 self = g_object_new(IRRECO_TYPE_THEME_UPLOAD_DLG,
237 "irreco-data", irreco_data,
238 NULL);
239 irreco_dlg_set_parent(IRRECO_DLG(self), parent_window);
240 IRRECO_RETURN_PTR(self);
244 * @deprecated
245 * @todo Replace calls to irreco_theme_upload_dlg_create() with
246 * irreco_theme_upload_dlg_new().
248 IrrecoThemeUploadDlg *irreco_theme_upload_dlg_create(IrrecoData *irreco_data,
249 GtkWindow *parent_window)
251 IRRECO_ENTER
252 IRRECO_RETURN_PTR(irreco_theme_upload_dlg_new(
253 irreco_data, parent_window));
257 * @deprecated
258 * @todo Replace calls to irreco_theme_upload_dlg_destroy() with
259 * gtk_widget_destroy().
261 void irreco_theme_upload_dlg_destroy(IrrecoThemeUploadDlg * self)
263 IRRECO_ENTER
264 gtk_widget_destroy(GTK_WIDGET(self));
265 if(self->comments != NULL) {
266 g_free(self->comments);
267 self->comments = NULL;
269 IRRECO_RETURN
272 /** @} */
276 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
277 /* Private Functions */
278 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
280 * @name Private Functions
281 * @{
285 * Show hildon progressbar banner.
287 * This function will create a new banner if one has not been created yet,
288 * if banner already exists, it's properties will be changed.
290 * @param text Text to show.
291 * @param fraction Value of progress.
293 static void _set_banner(IrrecoThemeUploadDlg *self,
294 const gchar *text,
295 gdouble fraction)
297 IRRECO_ENTER
299 if (self->banner == NULL) {
300 self->banner = hildon_banner_show_progress(
301 GTK_WIDGET(self), NULL, "");
304 hildon_banner_set_text(HILDON_BANNER(self->banner), text);
305 hildon_banner_set_fraction(HILDON_BANNER(self->banner), fraction);
307 IRRECO_RETURN
311 * Destroy banner, if it exists.
313 static void _hide_banner(IrrecoThemeUploadDlg *self)
315 IRRECO_ENTER
317 if (self->banner) {
318 gtk_widget_destroy(self->banner);
319 self->banner = NULL;
322 IRRECO_RETURN
326 * Start a loader state machine if one is not running already.
328 static void _loader_start(IrrecoThemeUploadDlg *self)
330 IRRECO_ENTER
332 if (self->loader_func_id == 0) {
333 self->loader_func_id = g_idle_add((GSourceFunc)_send_theme, self);
336 IRRECO_RETURN
340 * Stop and cleanup loader if a loader is running.
342 static void _loader_stop(IrrecoThemeUploadDlg *self)
344 IRRECO_ENTER
345 _hide_banner(self);
346 if (self->loader_func_id != 0) {
347 g_source_remove(self->loader_func_id);
348 self->loader_func_id = 0;
349 self->loader_state = 0;
351 IRRECO_RETURN
354 /* Check textfields, return TRUE if everythings fine */
355 static gboolean _texts_ok(IrrecoThemeUploadDlg *self)
357 gboolean rvalue = TRUE;
358 GtkTextIter startiter;
359 GtkTextIter enditer;
360 /*GtkTextBuffer *buffer_comments;*/
362 IRRECO_ENTER
364 if (self->comments != NULL) g_free(self->comments);
366 self->theme_name = gtk_entry_get_text(GTK_ENTRY(self->entry_name));
367 IRRECO_DEBUG("Theme name len:%d\n",
368 (gint)g_utf8_strlen(self->theme_name, -1));
369 if((gint)g_utf8_strlen(self->theme_name, -1) == 0) {
370 rvalue = FALSE;
371 irreco_error_dlg(GTK_WINDOW(self),
372 "Too short theme name.\n"
373 "Name must be at least 1 character.");
376 gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER(self->buffer_comments),
377 &startiter);
378 gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(self->buffer_comments),
379 &enditer);
380 self->comments = gtk_text_buffer_get_text(
381 GTK_TEXT_BUFFER(self->buffer_comments),
382 &startiter,
383 &enditer,
384 FALSE);
385 IRRECO_DEBUG("theme comments: %s\n", self->comments);
386 IRRECO_DEBUG("theme name: %s\n", self->theme_name);
388 IRRECO_RETURN_BOOL(rvalue);
391 /* Upload theme confs and images, return TRUE if everything went fine */
392 static gboolean _send_theme(IrrecoThemeUploadDlg *self)
394 IRRECO_ENTER
396 switch (self->loader_state) {
398 case LOADER_STATE_INIT:
400 IRRECO_DEBUG("Loader state init\n");
402 self->uploading_errors = FALSE;
403 self->client = irreco_webdb_client_new();
404 self->buffer_size =
405 irreco_webdb_client_get_max_image_size(self->client);
406 self->banner_max = irreco_string_table_lenght(
407 self->theme->buttons);
408 self->banner_max += irreco_string_table_lenght(
409 self->theme->backgrounds);
410 self->strtablesize = irreco_string_table_lenght(
411 self->theme->buttons);
412 self->strtableindex = 0;
413 _set_banner(self, _("Uploading theme..."), 0);
414 self->loader_state = LOADER_STATE_THEME;
416 IRRECO_RETURN_BOOL(TRUE);
418 case LOADER_STATE_THEME: {
420 gchar *parsedpath;
422 IRRECO_DEBUG("Loader state theme\n");
424 /* Parse folder out from theme path */
425 parsedpath = g_utf8_strrchr(self->theme->path->str,
427 G_DIR_SEPARATOR);
428 parsedpath = g_utf8_find_next_char(parsedpath, NULL);
429 /* Create new theme */
430 self->themeindex = irreco_webdb_client_create_theme(
431 self->client,
432 self->theme_name,
433 self->comments,
434 self->theme->preview_button_name->str,
435 parsedpath,
436 self->user,
437 self->password);
439 /* Abort if theme creation fails */
440 if(self->themeindex == 0) {
441 irreco_error_dlg(GTK_WINDOW(self),
442 "Failed to create theme");
443 self->uploading_errors = TRUE;
444 _loader_stop(self);
445 IRRECO_RETURN_BOOL(FALSE);
448 self->loader_state = LOADER_STATE_BUTTONS;
450 IRRECO_RETURN_BOOL(TRUE);
453 case LOADER_STATE_BUTTONS: {
455 guchar *img_up_data = g_malloc0(self->buffer_size);
456 guchar *img_down_data = g_malloc0(self->buffer_size);
457 gchar *img_up_sha; /* SHAs */
458 gchar *img_down_sha;
459 gchar *img_up_name; /* filenames */
460 gchar *img_down_name;
461 gint img_up_len; /* img data lengths */
462 gint img_down_len;
463 GString *img_folder = g_string_new(NULL); /* folder of button */
464 gint button_index;
465 gchar *error_msg = NULL;
466 const gchar *key;
467 IrrecoThemeButton *button;
468 gfloat banner;
470 IRRECO_DEBUG("Loader state buttons\n");
472 irreco_string_table_index(self->theme->buttons,
473 self->strtableindex, &key,
474 (gpointer *) &button);
476 banner = (gfloat) self->strtableindex/(gfloat) self->banner_max;
478 self->strtableindex++;
480 _set_banner(self,
481 "Uploading buttons...",
482 banner);
484 IRRECO_DEBUG("Current button: %s\n", button->name->str);
486 /* button up sizecheck */
487 if(irreco_file_length(button->image_up->str) >=
488 self->buffer_size) {
489 img_up_data = NULL;
490 img_up_sha = NULL;
491 img_up_name = NULL;
492 irreco_error_dlg(GTK_WINDOW(self),
493 g_strdup_printf(
494 "Button %s image too large\n"
495 "Max allowed size: %d KiB",
496 button->name->str,
497 self->buffer_size/1024));
498 self->uploading_errors = TRUE;
499 goto cleanup_button;
502 /* button up */
503 if(_get_image_data_and_hash(button->image_up->str,
504 &img_up_data,
505 &img_up_sha,
506 &img_up_len,
507 self->buffer_size,
508 &error_msg)) {
510 /* Parse folder out from theme img */
511 img_up_name = g_utf8_strrchr(button->image_up->str,
513 G_DIR_SEPARATOR);
514 img_up_name = g_utf8_find_next_char(img_up_name, NULL);
515 } else {
516 img_up_data = NULL;
517 img_up_sha = NULL;
518 img_up_name = NULL;
519 irreco_error_dlg(GTK_WINDOW(self), error_msg);
520 self->uploading_errors = TRUE;
521 goto cleanup_button;
524 /* button down sizecheck */
525 if(irreco_file_length(button->image_down->str) >=
526 self->buffer_size) {
527 img_down_data = NULL;
528 img_down_sha = NULL;
529 img_down_name = NULL;
530 irreco_error_dlg(GTK_WINDOW(self),
531 g_strdup_printf(
532 "Button %s image too large\n"
533 "Max allowed size: %d KiB",
534 button->name->str,
535 self->buffer_size/1024));
536 self->uploading_errors = TRUE;
537 goto cleanup_button;
540 /* button down */
541 if(_get_image_data_and_hash(button->image_down->str,
542 &img_down_data,
543 &img_down_sha,
544 &img_down_len,
545 self->buffer_size,
546 &error_msg)) {
547 /* Parse folder out from theme img */
548 img_down_name = g_utf8_strrchr(button->image_down->str,
550 G_DIR_SEPARATOR);
551 img_down_name = g_utf8_find_next_char(img_down_name,
552 NULL);
553 } else {
554 img_down_data = NULL;
555 img_down_sha = NULL;
556 img_down_name = NULL;
557 IRRECO_DEBUG("No optional down button\n");
560 /* Copy whole path+button name */
561 g_string_printf(img_folder, "%s", button->image_down->str);
562 /* Remove everything past and including rightmost folder char */
563 img_folder = g_string_erase(img_folder,
564 strlen(button->image_down->str) -
565 strlen(g_utf8_strrchr(
566 button->image_down->str,
568 G_DIR_SEPARATOR)),
569 -1);
570 /* Remove everything prior rightmost folder character */
571 g_string_printf(img_folder, "%s", g_utf8_strrchr(img_folder->str,
573 G_DIR_SEPARATOR));
574 /* Remove starting folder character */
575 img_folder = g_string_erase(img_folder, 0, 1);
577 /* Upload button */
578 button_index = irreco_webdb_client_add_button_to_theme(
579 self->client,
580 button->name->str,
581 button->allow_text,
582 button->text_format_up->str,
583 button->text_format_down->str,
584 button->text_padding,
585 img_up_sha,
586 img_up_name,
587 img_up_data,
588 img_up_len,
589 img_down_sha,
590 img_down_name,
591 img_down_data,
592 img_down_len,
593 img_folder->str,
594 self->themeindex,
595 self->user,
596 self->password);
598 if(button_index == 0) {
599 irreco_error_dlg(GTK_WINDOW(self),
600 g_strdup_printf(
601 "Button %s uploading failed",
602 button->name->str));
603 self->uploading_errors = TRUE;
606 cleanup_button:
607 /* Free resources */
608 g_free(img_up_data);
609 img_up_data = NULL;
610 g_free(img_down_data);
611 img_down_data = NULL;
612 g_string_free(img_folder, TRUE);
613 img_folder = NULL;
615 if(self->strtablesize == self->strtableindex) {
616 self->strtablesize = irreco_string_table_lenght(self->theme->backgrounds);
617 self->strtableindex = 0;
618 self->loader_state = LOADER_STATE_BACKGROUNDS;
619 IRRECO_DEBUG("Next loader state backgrounds\n");
622 IRRECO_RETURN_BOOL(TRUE);
627 case LOADER_STATE_BACKGROUNDS: {
628 GString *img_folder = g_string_new(NULL);
629 guchar *img_data = g_malloc0(self->buffer_size);
630 gchar *img_sha;
631 gchar *img_name;
632 gint img_len;
633 gint bg_index;
634 gchar *error_msg;
635 const gchar *key;
636 IrrecoThemeBg *bg;
637 gfloat banner;
639 irreco_string_table_index(self->theme->backgrounds,
640 self->strtableindex, &key,
641 (gpointer *) &bg);
643 banner = (gfloat) (self->banner_max -
644 self->strtablesize + self->strtableindex) /
645 (gfloat) self->banner_max;
647 self->strtableindex++;
649 _set_banner(self, "Uploading backgrounds...", banner);
651 IRRECO_DEBUG("Current bg: %s\n", bg->image_name->str);
653 /* backgrounds image sizecheck */
654 if(irreco_file_length(bg->image_path->str) >=
655 self->buffer_size) {
656 img_data = NULL;
657 img_sha = NULL;
658 img_name = NULL;
659 irreco_error_dlg(GTK_WINDOW(self),
660 g_strdup_printf(
661 "Background %s image too large\n"
662 "Max allowed size: %d KiB",
663 bg->image_name->str,
664 self->buffer_size/1024));
665 self->uploading_errors = TRUE;
666 goto cleanup_bg;
668 if(_get_image_data_and_hash(bg->image_path->str,
669 &img_data,
670 &img_sha,
671 &img_len,
672 self->buffer_size,
673 &error_msg)) {
675 /* Parse folder out from bg img path */
676 img_name = g_utf8_strrchr(bg->image_path->str,
678 G_DIR_SEPARATOR);
679 img_name = g_utf8_find_next_char(img_name, NULL);
680 } else {
681 img_data = NULL;
682 img_sha = NULL;
683 img_name = NULL;
684 irreco_error_dlg(GTK_WINDOW(self), error_msg);
685 self->uploading_errors = TRUE;
686 goto cleanup_bg;
689 /* Copy whole path+bg name */
690 g_string_printf(img_folder, "%s", bg->image_path->str);
691 /* Remove everything past and including rightmost folder char */
692 img_folder = g_string_erase(img_folder,
693 strlen(bg->image_path->str) -
694 strlen(g_utf8_strrchr(
695 bg->image_path->str,
697 G_DIR_SEPARATOR)),
698 -1);
699 /* Remove everything prior rightmost folder character */
700 g_string_printf(img_folder, "%s", g_utf8_strrchr(img_folder->str,
702 G_DIR_SEPARATOR));
703 /* Remove starting folder character */
704 img_folder = g_string_erase(img_folder, 0, 1);
706 if(img_len >= self->buffer_size) {
707 irreco_error_dlg(GTK_WINDOW(self),
708 g_strdup_printf(
709 "Bg %s image too large",
710 bg->image_name->str));
711 self->uploading_errors = TRUE;
712 goto cleanup_bg;
715 bg_index = irreco_webdb_client_add_bg_to_theme(
716 self->client,
717 bg->image_name->str,
718 img_sha,
719 img_name,
720 img_data,
721 img_len,
722 img_folder->str,
723 self->themeindex,
724 self->user,
725 self->password);
726 if(bg_index == 0) {
727 irreco_error_dlg(GTK_WINDOW(self),
728 g_strdup_printf(
729 "Bg %s uploading failed",
730 bg->image_name->str));
731 self->uploading_errors = TRUE;
734 cleanup_bg:
735 g_free(img_data);
736 img_data = NULL;
737 g_string_free(img_folder, TRUE);
738 img_folder = NULL;
740 if(self->strtablesize == self->strtableindex) {
741 /*self->strtablesize = irreco_string_table_lenght(self->theme->backgrounds);
742 self->strtableindex = 0;*/
743 self->loader_state = LOADER_STATE_END;
744 IRRECO_DEBUG("Next loader state end\n");
747 IRRECO_RETURN_BOOL(TRUE);
750 case LOADER_STATE_END:
752 _hide_banner(self);
753 if(!self->uploading_errors) {
754 irreco_info_dlg(GTK_WINDOW(self),
755 "Theme uploaded successfully");
756 } else {
757 irreco_info_dlg(GTK_WINDOW(self),
758 "Theme uploaded done,"
759 "some errors occured");
761 self->uploading_started = FALSE;
762 gtk_dialog_response(GTK_DIALOG(self), GTK_RESPONSE_CLOSE);
764 /*irreco_theme_upload_dlg_destroy(self);*/
765 /*irreco_theme_upload_dlg_destroy(self);*/
767 IRRECO_RETURN_BOOL(FALSE);
770 IRRECO_RETURN_BOOL(FALSE);
773 static gboolean _get_image_data_and_hash(gchar *img_path,
774 guchar **img_data,
775 gchar **img_sha,
776 gint *img_data_len,
777 gsize buffer_size,
778 gchar **error_msg)
780 gboolean rvalue = TRUE;
782 IRRECO_ENTER
784 if(irreco_file_exists(img_path)) {
785 if(irreco_read_binary_file(img_path,
786 *img_data,
787 buffer_size,
788 img_data_len)) {
789 *img_sha = sha_compute_checksum_for_data(
790 G_CHECKSUM_SHA1,
791 *img_data,
792 *img_data_len);
793 } else {
794 IRRECO_DEBUG("File read failed\n");
795 *error_msg = "File read failed\n";
796 rvalue = FALSE;
798 } else {
799 IRRECO_DEBUG("No such file\n");
800 *error_msg = "No such file\n";
801 rvalue = FALSE;
804 IRRECO_RETURN_BOOL(rvalue)
808 static void _update_preview(IrrecoThemeUploadDlg *self)
810 IRRECO_ENTER
812 /* if theme contains preview image, use it, else get some button */
813 if(!self->preview_name) {
814 const gchar *key;
816 IRRECO_DEBUG("No preview set, get first button\n");
817 irreco_string_table_index(self->theme->buttons,
818 0, &key,
819 (gpointer *) &self->preview_button);
820 if(self->preview_button) {
821 self->preview_name = self->preview_button->image_up->str;
824 IRRECO_DEBUG("preview path: %s\n", self->preview_name);
826 gtk_image_set_from_file(GTK_IMAGE(self->preview_image),
827 self->preview_name);
829 gtk_widget_show_all(GTK_WIDGET(self));
831 IRRECO_RETURN
835 /** @} */
839 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
840 /* Public Functions */
841 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
844 * Show dialog, and ask user for input.
847 gboolean irreco_theme_upload_dlg_run(GtkWindow *parent_window,
848 IrrecoData *irreco_data,
849 IrrecoTheme * irreco_theme)
851 IrrecoThemeUploadDlg *self;
852 gint response;
853 gboolean loop = TRUE;
855 IRRECO_ENTER
857 if(irreco_theme == NULL) { IRRECO_RETURN_BOOL(FALSE); }
859 self = irreco_theme_upload_dlg_create(irreco_data, parent_window);
861 self->parent_window = GTK_WINDOW(self);
862 self->irreco_data = irreco_data;
863 self->theme = irreco_theme;
864 self->preview_name = NULL;
865 self->uploading_started = FALSE;
866 self->loader_func_id = 0;
868 /* set things to dialog, cause theme & data wasn't set @ _constructed */
869 gtk_entry_set_text(GTK_ENTRY(self->entry_name), self->theme->name->str);
870 self->buffer_comments = gtk_text_view_get_buffer(
871 GTK_TEXT_VIEW(self->textview_comments));
872 gtk_text_buffer_set_text(GTK_TEXT_BUFFER(self->buffer_comments),
873 self->theme->comment->str,
874 -1);
875 _update_preview(self);
877 do {
878 response = gtk_dialog_run(GTK_DIALOG(self));
879 switch (response) {
880 case GTK_RESPONSE_OK:
881 IRRECO_DEBUG("GTK_RESPONSE_OK\n");
883 if(self->uploading_started) {
884 IRRECO_DEBUG("Already uploading theme\n");
885 break;
888 /* Check themename length and get texts */
889 if(!_texts_ok(self)) {
890 IRRECO_DEBUG("Input failure\n");
891 break;
894 /* Show login/reg dialog */
895 if(!irreco_show_login_dlg(irreco_data,
896 parent_window,
897 &self->user,
898 &self->password)) {
899 IRRECO_DEBUG("Failed login\n\n");
900 break;
903 /* set new info to theme */
904 irreco_theme_set_author(self->theme, self->user);
905 /* TODO add functionality to set new name for theme */
906 irreco_theme_set_comment(self->theme, self->comments);
907 irreco_theme_set_preview_button(self->theme,
908 self->preview_button->name->str);
910 self->uploading_started = TRUE;
911 self->loader_state = LOADER_STATE_INIT;
912 IRRECO_DEBUG("Start loader\n");
913 _loader_start(self);
915 break;
917 case GTK_RESPONSE_CANCEL:
918 IRRECO_DEBUG("GTK_RESPONSE_CANCEL\n");
919 _loader_stop(self);
920 if(self->uploading_started) {
921 irreco_info_dlg(GTK_WINDOW(self),
922 "Theme uploading aborted");
924 loop = FALSE;
925 break;
927 case GTK_RESPONSE_CLOSE:
928 IRRECO_DEBUG("GTK_RESPONSE_CLOSE\n");
929 _loader_stop(self);
930 loop = FALSE;
931 break;
933 default:
934 IRRECO_DEBUG("Something went horribly wrong\n");
935 IRRECO_PAUSE
936 break;
939 } while (loop);
941 irreco_theme_upload_dlg_destroy(self);
943 IRRECO_RETURN_BOOL(FALSE);
946 /** @} */
950 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
951 /* Events and Callbacks */
952 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
955 * @name Events and Callbacks
956 * @{
959 static void _run_button_browser_dlg(GtkWidget *widget,
960 GdkEventButton *event,
961 IrrecoThemeUploadDlg *self)
963 IrrecoThemeButton *preview_theme_button = NULL;
965 IRRECO_ENTER
967 preview_theme_button = irreco_button_browser_dlg_run(
968 GTK_WINDOW(IRRECO_THEME_UPLOAD_DLG(self)->parent_window),
969 self->irreco_data,
970 self->theme);
972 if(preview_theme_button) {
973 IRRECO_DEBUG("Set preview button to theme and self->\n");
974 self->preview_name = preview_theme_button->image_up->str;
975 self->preview_button = preview_theme_button;
976 _update_preview(self);
979 IRRECO_RETURN
982 /** @} */
986 /** @} */