2 * irreco - Ir Remote Control
3 * Copyright (C) 2007,2008 Arto Karppinen (arto.karppinen@iki.fi),
4 * Joni Kokko (t5kojo01@students.oamk.fi),
5 * Harri Vattulainen (t5vaha01@students.oamk.fi)
6 * Sami Mäki (kasmra@xob.kapsi.fi)
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software Foundation,
20 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23 #include "irreco_lircdb_dlg.h"
24 #include <hildon/hildon-banner.h>
25 #include "irreco_webdb_register_dlg.h"
26 #include "irreco_select_instance_dlg.h"
27 #include "irreco_config.h"
28 #include <hildon/hildon-gtk.h>
29 #include <hildon/hildon-pannable-area.h>
33 * @addtogroup IrrecoLircdbDlg
36 * @todo PURPOSE OF CLASS.
43 * Source file of @ref IrrecoLircdbDlg.
47 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
49 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
50 static void irreco_lircdb_dlg_clean_details(IrrecoLircdbDlg
*self
);
51 static gboolean
irreco_lircdb_dlg_loader_dirs(IrrecoLircdbDlg
*self
);
52 static gboolean
irreco_lircdb_dlg_loader_manuf(IrrecoLircdbDlg
*self
);
53 static gboolean
irreco_lircdb_dlg_loader_models(IrrecoLircdbDlg
*self
);
54 static gboolean
irreco_lircdb_dlg_ready_to_dl(IrrecoLircdbDlg
*self
,
56 static gboolean
irreco_lircdb_dlg_load_file(IrrecoLircdbDlg
*self
);
58 static gboolean
irreco_show_lircdb_dlg_map_event(IrrecoLircdbDlg
*self
,
61 static void irreco_show_lircdb_dlg_destroy_event(IrrecoLircdbDlg
*self
,
63 static void irreco_show_lircdb_dlg_row_activated_event(GtkTreeView
*tree_view
,
65 GtkTreeViewColumn
*column
,
66 IrrecoLircdbDlg
*self
);
67 static void irreco_show_lircdb_dlg_row_expanded_event(GtkTreeView
*tree_view
,
70 IrrecoLircdbDlg
*self
);
71 static void irreco_show_lircdb_dlg_row_collapsed_event(GtkTreeView
*tree_view
,
74 IrrecoLircdbDlg
*self
);
75 static void irreco_show_lircdb_dlg_row_selected_event(GtkTreeSelection
*sel
,
76 IrrecoLircdbDlg
*self
);
81 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
83 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
85 /** Button response codes. */
90 /** GtkTreeStore colums. */
111 ROW_CHILDREN_LOADED
= 1 << 1,
112 ROW_TYPE_DIR
= 1 << 2,
113 ROW_TYPE_MANUFACTURER
= 1 << 3,
114 ROW_TYPE_MODEL
= 1 << 4,
115 ROW_TYPE_LOADING
= 1 << 5
120 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
121 /* Construction & Destruction */
122 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
125 * @name Construction & Destruction
129 G_DEFINE_TYPE(IrrecoLircdbDlg
, irreco_lircdb_dlg
, IRRECO_TYPE_DLG
)
131 static void irreco_lircdb_dlg_finalize(GObject
*object
)
133 if (G_OBJECT_CLASS(irreco_lircdb_dlg_parent_class
)->finalize
)
134 G_OBJECT_CLASS(irreco_lircdb_dlg_parent_class
)->finalize(object
);
137 static void irreco_lircdb_dlg_class_init(IrrecoLircdbDlgClass
*klass
)
139 GObjectClass
*object_class
= G_OBJECT_CLASS(klass
);
140 object_class
->finalize
= irreco_lircdb_dlg_finalize
;
143 static void irreco_lircdb_dlg_init(IrrecoLircdbDlg
*self
)
145 GtkTreeViewColumn
*column
;
146 GtkCellRenderer
*renderer
;
147 GtkTreeSelection
*select
;
148 GtkWidget
*tree_view_frame
;
149 GtkWidget
*tree_view_pannable
;
154 self
->download_button
= gtk_button_new_with_label("Download");
156 /* Construct dialog. */
157 gtk_window_set_title(GTK_WINDOW(self
),
158 _("Download device from LircDB"));
159 gtk_window_set_modal(GTK_WINDOW(self
), TRUE
);
160 gtk_window_set_destroy_with_parent(GTK_WINDOW(self
), TRUE
);
161 gtk_dialog_set_has_separator(GTK_DIALOG(self
), FALSE
);
163 self
->download_button
= gtk_dialog_add_button(GTK_DIALOG(self
),
164 _("Download"), GTK_RESPONSE_OK
);
166 self
->hbox
= g_object_new(GTK_TYPE_HBOX
, NULL
);
167 gtk_box_set_spacing(GTK_BOX(self
->hbox
), 8);
168 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(self
)->vbox
),
169 irreco_gtk_align(GTK_WIDGET(self
->hbox
),
170 0, 0, 1, 1, 8, 8, 8, 8));
171 /* Create tree_view_hbox */
172 tree_box
= gtk_hbox_new(FALSE
, 2);
173 tree_view_pannable
= hildon_pannable_area_new();
175 /* Create Treeview */
176 self
->tree_store
= gtk_tree_store_new(
177 N_COLUMNS
, G_TYPE_STRING
, G_TYPE_INT
, G_TYPE_POINTER
);
178 self
->tree_view
= GTK_TREE_VIEW(hildon_gtk_tree_view_new_with_model(1,
179 GTK_TREE_MODEL(self
->tree_store
)));
181 renderer
= gtk_cell_renderer_text_new();
182 column
= gtk_tree_view_column_new_with_attributes(
183 NULL
, renderer
, "text", TEXT_COL
, NULL
);
184 gtk_tree_view_append_column(self
->tree_view
, column
);
186 gtk_box_pack_start(GTK_BOX(tree_box
), GTK_WIDGET(self
->tree_view
),
189 hildon_pannable_area_add_with_viewport(HILDON_PANNABLE_AREA(tree_view_pannable
),
190 GTK_WIDGET(tree_box
));
192 /* Create Frame for Treeview */
193 tree_view_frame
= gtk_frame_new("");
194 gtk_frame_set_label_widget(GTK_FRAME(tree_view_frame
),
195 irreco_gtk_label_bold("Devices", 0, 0, 0, 0, 0, 0));
197 gtk_container_add(GTK_CONTAINER(tree_view_frame
),
198 GTK_WIDGET(tree_view_pannable
));
200 gtk_box_pack_start(GTK_BOX(self
->hbox
), GTK_WIDGET(tree_view_frame
),
203 /* Setup the selection handler for TREE */
204 select
= gtk_tree_view_get_selection(self
->tree_view
);
205 gtk_tree_selection_set_mode(select
, GTK_SELECTION_SINGLE
);
207 /* Signal handlers. */
208 g_signal_connect(G_OBJECT(self
), "map-event",
209 G_CALLBACK(irreco_show_lircdb_dlg_map_event
), NULL
);
210 g_signal_connect(G_OBJECT(self
), "destroy",
211 G_CALLBACK(irreco_show_lircdb_dlg_destroy_event
), NULL
);
212 g_signal_connect(G_OBJECT(self
->tree_view
), "row-activated",
213 G_CALLBACK(irreco_show_lircdb_dlg_row_activated_event
),
215 g_signal_connect(G_OBJECT(self
->tree_view
), "row-expanded",
216 G_CALLBACK(irreco_show_lircdb_dlg_row_expanded_event
),
218 g_signal_connect(G_OBJECT(self
->tree_view
), "row-collapsed",
219 G_CALLBACK(irreco_show_lircdb_dlg_row_collapsed_event
),
221 g_signal_connect(G_OBJECT (select
), "changed",
222 G_CALLBACK (irreco_show_lircdb_dlg_row_selected_event
),
226 gtk_tree_view_set_enable_tree_lines(self
->tree_view
, TRUE
);
227 g_object_set (G_OBJECT (self
->tree_view
), "show-expanders", TRUE
, NULL
);
228 /*g_object_set (G_OBJECT (self->tree_view), "level-indentation", 0, NULL);
229 gtk_tree_view_set_rubber_banding(self->tree_view, FALSE);*/
231 gtk_widget_set_size_request(GTK_WIDGET(self
), -1, 335);
232 gtk_widget_show_all(GTK_WIDGET(self
));
233 gtk_widget_hide(self
->download_button
);
237 GtkWidget
*irreco_lircdb_dlg_new(IrrecoData
*irreco_data
,
240 IrrecoLircdbDlg
*self
;
243 self
= g_object_new(IRRECO_TYPE_LIRCDB_DLG
, NULL
);
244 irreco_dlg_set_parent(IRRECO_DLG(self
), parent
);
245 irreco_lircdb_dlg_set_irreco_data(self
, irreco_data
);
246 IRRECO_RETURN_PTR(self
);
253 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
254 /* Private Functions */
255 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
258 * @name Private Functions
266 static void irreco_lircdb_dlg_clean_details(IrrecoLircdbDlg
*self
)
272 gtk_widget_hide(self
->download_button
);
278 * Have the childern of this item been loaded.
280 * @return TRUE if children have been loade, FALSE otherwise.
282 static gboolean
irreco_lircdb_dlg_row_is_loaded(IrrecoLircdbDlg
*self
,
288 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
289 iter
, FLAG_COL
, &i
, -1);
290 if (i
& ROW_CHILDREN_LOADED
) IRRECO_RETURN_BOOL(TRUE
);
291 IRRECO_RETURN_BOOL(FALSE
);
295 * Enable / Disable ROW_CHILDREN_LOADED flag from a row.
297 * @param value If set, ROW_CHILDREN_LOADED will be enabled.
299 static void irreco_lircdb_dlg_row_set_loaded(IrrecoLircdbDlg
*self
,
306 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
307 iter
, FLAG_COL
, &i
, -1);
309 i
= i
| ROW_CHILDREN_LOADED
;
311 i
= i
& ~ROW_CHILDREN_LOADED
;
313 gtk_tree_store_set(self
->tree_store
, iter
, FLAG_COL
, i
, -1);
321 static gint
irreco_lircdb_dlg_row_get_type(IrrecoLircdbDlg
*self
,
327 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
328 iter
, FLAG_COL
, &i
, -1);
329 if (i
& ROW_TYPE_DIR
)
330 IRRECO_RETURN_ENUM(ROW_TYPE_DIR
);
331 if (i
& ROW_TYPE_MANUFACTURER
)
332 IRRECO_RETURN_ENUM(ROW_TYPE_MANUFACTURER
);
333 if (i
& ROW_TYPE_MODEL
)
334 IRRECO_RETURN_ENUM(ROW_TYPE_MODEL
);
335 if (i
& ROW_TYPE_LOADING
)
336 IRRECO_RETURN_ENUM(ROW_TYPE_LOADING
);
337 IRRECO_RETURN_INT(0);
341 * Show hildon progressbar banner.
343 * This function will create a new banner if one has not been created yet,
344 * if banner already exists, it's properties will be changed.
346 * @param text Text to show.
347 * @param fraction Value of progress.
349 static void irreco_lircdb_dlg_set_banner(IrrecoLircdbDlg
*self
,
354 if (self
->banner
== NULL
) {
355 self
->banner
= hildon_banner_show_progress(
356 GTK_WIDGET(self
), NULL
, "");
359 hildon_banner_set_text(HILDON_BANNER(self
->banner
), text
);
360 hildon_banner_set_fraction(HILDON_BANNER(self
->banner
), fraction
);
365 * Destroy banner, if it exists.
367 static void irreco_lircdb_dlg_hide_banner(IrrecoLircdbDlg
*self
)
371 gtk_widget_destroy(self
->banner
);
378 * Start a loader state machine if one is not running already.
380 static void irreco_lircdb_dlg_loader_start(IrrecoLircdbDlg
*self
,
381 GSourceFunc function
,
382 GtkTreeIter
*parent_iter
)
386 if (self
->loader_func_id
== 0) {
388 self
->loader_parent_iter
= gtk_tree_iter_copy(
393 self
->loader_func_id
= g_idle_add(function
, self
);
395 IRRECO_ERROR("Loader function pointer not given.\n");
403 * Stop and cleanup loader if a loader is running.
405 static void irreco_lircdb_dlg_loader_stop(IrrecoLircdbDlg
*self
)
408 if (self
->loader_func_id
!= 0) {
409 g_source_remove(self
->loader_func_id
);
410 self
->loader_func_id
= 0;
411 self
->loader_state
= 0;
412 if (self
->loader_parent_iter
) {
413 gtk_tree_iter_free(self
->loader_parent_iter
);
415 self
->loader_parent_iter
= NULL
;
421 * Load Lircdb directories.
423 * This loader will request a list of directories from the Lircdb server and
424 * update the TreeView accordingly. Every directory row created by this loader
425 * will have row type ROW_TYPE_DIR.
427 static gboolean
irreco_lircdb_dlg_loader_dirs(IrrecoLircdbDlg
*self
)
431 switch (self
->loader_state
) {
432 case LOADER_STATE_INIT
:
433 irreco_lircdb_dlg_set_banner(self
, _("Loading ..."), 0);
434 self
->loader_state
= LOADER_STATE_LOOP
;
435 irreco_lircdb_dlg_clean_details(self
);
436 IRRECO_RETURN_BOOL(TRUE
);
438 case LOADER_STATE_LOOP
: {
440 GtkTreeIter iter_loading
;
441 IrrecoStringTable
*dirs
= NULL
;
442 IrrecoWebdbCache
*webdb_cache
= NULL
;
444 gtk_widget_hide(self
->download_button
);
446 webdb_cache
= irreco_data_get_webdb_cache(self
->irreco_data
,
448 if(irreco_webdb_cache_get_lirc_dirs(webdb_cache
, &dirs
)){
449 IRRECO_STRING_TABLE_FOREACH_KEY(dirs
, key
)
451 /* Append directory */
452 gtk_tree_store_append(self
->tree_store
,
454 gtk_tree_store_set(self
->tree_store
,
455 &iter
, TEXT_COL
, key
,
456 FLAG_COL
, ROW_TYPE_DIR
,
459 /* Add loading item into directory */
460 gtk_tree_store_append(self
->tree_store
,
461 &iter_loading
, &iter
);
462 gtk_tree_store_set(self
->tree_store
,
464 TEXT_COL
, _("Loading ..."),
465 FLAG_COL
, ROW_TYPE_LOADING
,
467 IRRECO_STRING_TABLE_FOREACH_END
469 irreco_error_dlg(GTK_WINDOW(self
),
470 irreco_webdb_cache_get_error(
474 irreco_lircdb_dlg_set_banner(self
, _("Loading ..."), 1);
475 self
->loader_state
= LOADER_STATE_END
;
476 IRRECO_RETURN_BOOL(TRUE
);
479 case LOADER_STATE_END
:
480 irreco_lircdb_dlg_hide_banner(self
);
481 irreco_lircdb_dlg_loader_stop(self
);
484 IRRECO_RETURN_BOOL(FALSE
);
488 * Load Lircdb manufacturers
492 static gboolean
irreco_lircdb_dlg_loader_manuf(IrrecoLircdbDlg
*self
)
496 switch (self
->loader_state
) {
497 case LOADER_STATE_INIT
:
498 irreco_lircdb_dlg_set_banner(self
, _("Loading ..."), 0);
499 self
->loader_state
= LOADER_STATE_LOOP
;
500 IRRECO_RETURN_BOOL(TRUE
);
502 case LOADER_STATE_LOOP
: {
504 GtkTreeIter iter_loading
;
505 IrrecoStringTable
*manufacturers
= NULL
;
506 IrrecoWebdbCache
*webdb_cache
= NULL
;
508 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
509 self
->loader_parent_iter
,
510 TEXT_COL
, &self
->dir
, -1);
512 webdb_cache
= irreco_data_get_webdb_cache(self
->irreco_data
,
515 if(irreco_webdb_cache_get_lirc_manufacturers(webdb_cache
,
519 IRRECO_STRING_TABLE_FOREACH_KEY(manufacturers
, key
)
521 /* Add manufacturer item into directory. */
522 gtk_tree_store_append(self
->tree_store
,
523 &iter
, self
->loader_parent_iter
);
524 gtk_tree_store_set(self
->tree_store
,
527 FLAG_COL
, ROW_TYPE_MANUFACTURER
,
530 /* Add loading item into manufacturer. */
531 gtk_tree_store_append(self
->tree_store
,
532 &iter_loading
, &iter
);
533 gtk_tree_store_set(self
->tree_store
,
535 TEXT_COL
, _("Loading ..."),
536 FLAG_COL
, ROW_TYPE_LOADING
,
539 IRRECO_STRING_TABLE_FOREACH_END
541 irreco_error_dlg(GTK_WINDOW(self
),
542 irreco_webdb_cache_get_error(
546 /* Delete loading item from directory. */
547 gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(self
->tree_store
),
548 &iter
,self
->loader_parent_iter
,0);
549 if(irreco_lircdb_dlg_row_get_type(self
,
550 &iter
) == ROW_TYPE_LOADING
) {
551 gtk_tree_store_remove(self
->tree_store
,&iter
);
553 irreco_lircdb_dlg_set_banner(self
, _("Loading ..."), 1);
554 self
->loader_state
= LOADER_STATE_END
;
555 IRRECO_RETURN_BOOL(TRUE
);
558 case LOADER_STATE_END
:
559 irreco_lircdb_dlg_row_set_loaded(self
, self
->loader_parent_iter
,
561 irreco_lircdb_dlg_hide_banner(self
);
562 irreco_lircdb_dlg_loader_stop(self
);
565 IRRECO_RETURN_BOOL(FALSE
);
573 static gboolean
irreco_lircdb_dlg_loader_models(IrrecoLircdbDlg
*self
)
577 switch (self
->loader_state
) {
578 case LOADER_STATE_INIT
:
579 irreco_lircdb_dlg_set_banner(self
, _("Loading ..."), 0);
580 self
->loader_state
= LOADER_STATE_LOOP
;
581 IRRECO_RETURN_BOOL(TRUE
);
583 case LOADER_STATE_LOOP
: {
585 GtkTreeIter dir_iter
;
586 IrrecoStringTable
*models
= NULL
;
587 IrrecoWebdbCache
*webdb_cache
= NULL
;
589 /*Get directory and manufacturer*/
591 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
592 self
->loader_parent_iter
,
593 TEXT_COL
, &self
->manufacturer
, -1);
595 gtk_tree_model_iter_parent(GTK_TREE_MODEL(self
->tree_store
),
597 self
->loader_parent_iter
);
599 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
601 TEXT_COL
, &self
->dir
, -1);
603 webdb_cache
= irreco_data_get_webdb_cache(self
->irreco_data
,
606 self
->file_path
= g_strdup_printf("%s/%s/", self
->dir
,
609 if(irreco_webdb_cache_get_lirc_models(webdb_cache
, self
->file_path
,
612 IRRECO_STRING_TABLE_FOREACH_KEY(models
, key
)
614 /* Add model item into manufacturer. */
615 gtk_tree_store_append(self
->tree_store
,
616 &iter
, self
->loader_parent_iter
);
617 gtk_tree_store_set(self
->tree_store
,
620 FLAG_COL
, ROW_TYPE_MODEL
,
623 IRRECO_STRING_TABLE_FOREACH_END
625 irreco_error_dlg(GTK_WINDOW(self
),
626 irreco_webdb_cache_get_error(
630 /* Delete loading item from manufacturer. */
631 gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(self
->tree_store
),
632 &iter
, self
->loader_parent_iter
,
634 if(irreco_lircdb_dlg_row_get_type(self
,
635 &iter
) == ROW_TYPE_LOADING
) {
636 gtk_tree_store_remove(self
->tree_store
, &iter
);
639 irreco_lircdb_dlg_set_banner(self
, _("Loading ..."), 1);
640 self
->loader_state
= LOADER_STATE_END
;
642 IRRECO_RETURN_BOOL(TRUE
);
644 case LOADER_STATE_END
:
645 irreco_lircdb_dlg_row_set_loaded(self
, self
->loader_parent_iter
,
647 irreco_lircdb_dlg_hide_banner(self
);
648 irreco_lircdb_dlg_loader_stop(self
);
651 IRRECO_RETURN_BOOL(FALSE
);
655 * Get filepath and show D/L button.
659 static gboolean
irreco_lircdb_dlg_ready_to_dl(IrrecoLircdbDlg
*self
,
664 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
665 iter
, TEXT_COL
, &self
->model
, -1);
667 self
->file_path
= g_strdup_printf("%s/%s/%s", self
->dir
,
668 self
->manufacturer
, self
->model
);
670 gtk_widget_show(self
->download_button
);
672 IRRECO_RETURN_BOOL(TRUE
);
677 * Load config file from Lircdb.
681 static gboolean
irreco_lircdb_dlg_load_file(IrrecoLircdbDlg
*self
)
683 IrrecoWebdbCache
*webdb_cache
= NULL
;
684 IrrecoBackendInstance
*inst
= NULL
;
685 GString
*error_msg
= g_string_new("");
686 IrrecoBackendManager
*manager
;
687 IrrecoBackendFileContainer
*file_container
;
688 IrrecoStringTable
*file
= NULL
;
689 gboolean success
= TRUE
;
690 gboolean new_instance
= FALSE
;
692 gchar
*backend
= "Internal Lirc";
693 gchar
*file_contents
= NULL
;
696 webdb_cache
= irreco_data_get_webdb_cache(self
->irreco_data
,
699 if(irreco_webdb_cache_get_lirc_file(webdb_cache
, self
->file_path
, &file
)) {
700 IRRECO_STRING_TABLE_FOREACH_KEY(file
, key
)
701 if(file_contents
== NULL
) {
702 file_contents
= g_strdup_printf("%s", key
);
704 file_contents
= g_strdup_printf(
705 "%s%s", file_contents
, key
);
707 IRRECO_STRING_TABLE_FOREACH_END
715 manager
= self
->irreco_data
->irreco_backend_manager
;
716 IRRECO_BACKEND_MANAGER_FOREACH_LIB(manager
, lib
)
717 if (g_utf8_collate(lib
->name
, backend
) != 0){
720 if (!(lib
->api
->flags
& IRRECO_BACKEND_EDITABLE_DEVICES
)) {
721 g_string_printf(error_msg
,
722 "\"%s\" backend is not editable...",
726 else if (!(lib
->api
->flags
&
727 IRRECO_BACKEND_CONFIGURATION_EXPORT
)) {
728 g_string_printf(error_msg
,
729 "\"%s\" backend doesn't support "
730 "exporting its configuration...",
734 /* Check if many instances */
736 IRRECO_BACKEND_MANAGER_FOREACH_INSTANCE(manager
, instance
)
737 irreco_backend_instance_get_description(instance
);
738 if (g_utf8_collate(instance
->lib
->name
,
742 /*if there is only one instance, then use it */
745 IRRECO_STRING_TABLE_FOREACH_END
746 IRRECO_DEBUG("INSTANCES: %d\n",instances
);
748 /* Create new instance if it comes to the crunch */
749 if (instances
== 0 || lib
->api
->flags
&
750 IRRECO_BACKEND_NEW_INST_ON_CONF_IMPORT
) {
751 inst
= irreco_backend_manager_create_instance(
752 manager
, lib
, NULL
, NULL
);
759 if (!irreco_show_select_instance_dlg(
760 self
->irreco_data
, GTK_WINDOW(self
),
762 g_string_printf(error_msg
,
763 "Operation aborted by user...");
768 IRRECO_STRING_TABLE_FOREACH_END
771 g_string_printf(error_msg
, "\"%s\" backend is not installed...",
776 irreco_backend_instance_configure(inst
, GTK_WINDOW(self
));
777 irreco_backend_instance_save_to_conf(inst
);
778 irreco_config_save_backends(manager
);
781 g_print("instance_ready: \n");
783 file_container
= irreco_backend_file_container_new();
784 irreco_backend_file_container_set(file_container
,
792 if (irreco_backend_instance_check_conf(inst
, file_container
)) {
793 GString
*question
= g_string_new("");
794 g_string_printf(question
, "\"%s\" backend already contains\n"
796 "Do you want to overwrite?",
797 inst
->lib
->name
,self
->model
);
798 success
= irreco_yes_no_dlg(GTK_WINDOW(self
), question
->str
);
799 g_string_free(question
, TRUE
);
801 if(success
== FALSE
) {
806 /* Send file_data for backend */
807 if(irreco_backend_instance_import_conf(inst
, file_container
)) {
808 irreco_info_dlg(GTK_WINDOW(self
),
809 "Configuration downloaded successfully!");
810 irreco_backend_manager_get_devcmd_lists(
811 self
->irreco_data
->irreco_backend_manager
);
813 g_string_printf(error_msg
, "Backend error");
816 irreco_backend_manager_destroy_instance(manager
, inst
);
822 if(error_msg
->len
> 0) {
823 irreco_error_dlg(GTK_WINDOW(self
), error_msg
->str
);
827 g_free(file_contents
);
828 g_string_free(error_msg
, TRUE
);
829 IRRECO_RETURN_BOOL(success
);
836 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
838 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
841 * @name Public Functions
845 void irreco_lircdb_dlg_set_irreco_data(IrrecoLircdbDlg
*self
,
846 IrrecoData
*irreco_data
)
849 self
->irreco_data
= irreco_data
;
853 void irreco_show_lircdb_dlg(IrrecoData
*irreco_data
, GtkWindow
*parent
)
855 IrrecoLircdbDlg
*self
;
857 gboolean loop
= TRUE
;
860 self
= IRRECO_LIRCDB_DLG(irreco_lircdb_dlg_new(irreco_data
, parent
));
863 response
= gtk_dialog_run(GTK_DIALOG(self
));
865 case IRRECO_DEVICE_REFRESH
:
866 IRRECO_DEBUG("IRRECO_DEVICE_REFRESH\n");
867 gtk_tree_store_clear(self
->tree_store
);
868 irreco_data_get_webdb_cache(self
->irreco_data
, TRUE
);
869 irreco_lircdb_dlg_loader_start(self
,
870 G_SOURCEFUNC(irreco_lircdb_dlg_loader_dirs
),
874 case GTK_RESPONSE_DELETE_EVENT
:
875 IRRECO_DEBUG("GTK_RESPONSE_DELETE_EVENT\n");
879 case GTK_RESPONSE_OK
:
880 IRRECO_DEBUG("GTK_RESPONSE_OK\n");
881 loop
= !irreco_lircdb_dlg_load_file(self
);
887 gtk_widget_destroy(GTK_WIDGET(self
));
895 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
896 /* Events and Callbacks */
897 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
900 * @name Events and Callbacks
904 static gboolean
irreco_show_lircdb_dlg_map_event(IrrecoLircdbDlg
*self
,
909 irreco_lircdb_dlg_loader_start(
910 self
, G_SOURCEFUNC(irreco_lircdb_dlg_loader_dirs
), NULL
);
911 IRRECO_RETURN_BOOL(FALSE
);
914 static void irreco_show_lircdb_dlg_destroy_event(IrrecoLircdbDlg
*self
,
918 irreco_lircdb_dlg_loader_stop(self
);
922 static void irreco_show_lircdb_dlg_row_activated_event(GtkTreeView
*tree_view
,
924 GtkTreeViewColumn
*column
,
925 IrrecoLircdbDlg
*self
)
929 if (gtk_tree_view_row_expanded(tree_view
, path
)) {
930 g_print("was expanded\n");
931 gtk_tree_view_expand_row(tree_view
, path
, FALSE
);
932 g_print("tried expand row\n");
934 g_print("was not expanded\n");
935 gtk_tree_view_collapse_row(tree_view
, path
);
936 g_print("tried collapsing row\n");
941 static void irreco_show_lircdb_dlg_row_expanded_event(GtkTreeView
*tree_view
,
944 IrrecoLircdbDlg
*self
)
948 irreco_lircdb_dlg_clean_details(self
);
950 if (self
->loader_func_id
!= 0) {
951 gtk_tree_view_collapse_row(tree_view
, path
);
954 if (!irreco_lircdb_dlg_row_is_loaded(self
, iter
)) {
955 switch (irreco_lircdb_dlg_row_get_type(self
, iter
)) {
957 irreco_lircdb_dlg_loader_start(self
,
958 G_SOURCEFUNC(irreco_lircdb_dlg_loader_manuf
),
960 gtk_widget_hide(self
->download_button
);
963 case ROW_TYPE_MANUFACTURER
:
964 irreco_lircdb_dlg_loader_start(self
,
965 G_SOURCEFUNC(irreco_lircdb_dlg_loader_models
),
967 gtk_widget_hide(self
->download_button
);
975 static void irreco_show_lircdb_dlg_row_collapsed_event(GtkTreeView
*tree_view
,
978 IrrecoLircdbDlg
*self
)
982 irreco_lircdb_dlg_clean_details(self
);
987 static void irreco_show_lircdb_dlg_row_selected_event(GtkTreeSelection
*sel
,
988 IrrecoLircdbDlg
*self
)
995 if (gtk_tree_selection_get_selected (sel
, &model
, &iter
))
997 switch (irreco_lircdb_dlg_row_get_type(self
, &iter
)) {
1000 IRRECO_DEBUG("ROW_TYPE_MODEL\n");
1001 irreco_lircdb_dlg_ready_to_dl(self
, &iter
);
1005 irreco_lircdb_dlg_clean_details(self
);