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)
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_webdb_dlg.h"
23 #include <hildon/hildon-banner.h>
24 #include "irreco_webdb_register_dlg.h"
25 #include "irreco_select_instance_dlg.h"
26 #include "irreco_config.h"
27 #include <hildon/hildon-gtk.h>
28 #include <hildon/hildon-pannable-area.h>
32 * @addtogroup IrrecoWebdbDlg
35 * @todo PURPOCE OF CLASS.
42 * Source file of @ref IrrecoWebdbDlg.
46 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
48 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
49 static void irreco_webdb_dlg_clean_details(IrrecoWebdbDlg
*self
);
50 static gboolean
irreco_webdb_dlg_loader_categ(IrrecoWebdbDlg
*self
);
51 static gboolean
irreco_webdb_dlg_loader_manuf(IrrecoWebdbDlg
*self
);
52 static gboolean
irreco_webdb_dlg_loader_model(IrrecoWebdbDlg
*self
);
53 static gboolean
irreco_webdb_dlg_loader_config(IrrecoWebdbDlg
*self
);
54 static gboolean
irreco_webdb_dlg_display_config_detail(IrrecoWebdbDlg
*self
,
56 static gboolean
irreco_webdb_dlg_load_file(IrrecoWebdbDlg
*self
);
58 static gboolean
irreco_show_webdb_dlg_map_event(IrrecoWebdbDlg
*self
,
61 static void irreco_show_webdb_dlg_destroy_event(IrrecoWebdbDlg
*self
,
63 static void irreco_show_webdb_dlg_row_activated_event(GtkTreeView
*tree_view
,
65 GtkTreeViewColumn
*column
,
66 IrrecoWebdbDlg
*self
);
67 static void irreco_show_webdb_dlg_row_expanded_event(GtkTreeView
*tree_view
,
70 IrrecoWebdbDlg
*self
);
71 static void irreco_show_webdb_dlg_row_collapsed_event(GtkTreeView
*tree_view
,
74 IrrecoWebdbDlg
*self
);
75 static void irreco_show_webdb_dlg_row_selected_event(GtkTreeSelection
*sel
,
76 IrrecoWebdbDlg
*self
);
81 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
83 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
85 /** Button responce codes. */
90 /** GtkTreeStore colums. */
111 ROW_CHILDREN_LOADED
= 1 << 1,
112 ROW_TYPE_CATEGORY
= 1 << 2,
113 ROW_TYPE_MANUFACTURER
= 1 << 3,
114 ROW_TYPE_MODEL
= 1 << 4,
115 ROW_TYPE_CONFIG
= 1 << 5,
116 ROW_TYPE_LOADING
= 1 << 6
121 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
122 /* Construction & Destruction */
123 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
126 * @name Construction & Destruction
130 G_DEFINE_TYPE(IrrecoWebdbDlg
, irreco_webdb_dlg
, IRRECO_TYPE_DLG
)
132 static void irreco_webdb_dlg_finalize(GObject
*object
)
134 if (G_OBJECT_CLASS(irreco_webdb_dlg_parent_class
)->finalize
)
135 G_OBJECT_CLASS(irreco_webdb_dlg_parent_class
)->finalize(object
);
138 static void irreco_webdb_dlg_class_init(IrrecoWebdbDlgClass
*klass
)
140 GObjectClass
*object_class
= G_OBJECT_CLASS(klass
);
141 object_class
->finalize
= irreco_webdb_dlg_finalize
;
144 static void irreco_webdb_dlg_init(IrrecoWebdbDlg
*self
)
146 GtkTreeViewColumn
*column
;
147 GtkCellRenderer
*renderer
;
148 GtkTreeSelection
*select
;
149 GtkWidget
*label_user
;
150 GtkWidget
*label_backend
;
151 GtkWidget
*label_category
;
152 GtkWidget
*label_manuf
;
153 GtkWidget
*label_model
;
154 GtkWidget
*label_file_uploaded
;
155 GtkWidget
*label_file_download_count
;
156 GtkWidget
*config_info_alignment
;
157 GtkWidget
*config_info_frame
;
158 GtkWidget
*tree_view_frame
;
159 GtkWidget
*tree_view_hbox
;
160 PangoFontDescription
*initial_font
;
161 /* GtkWidget *pannablearea;*/
165 /* Construct dialog. */
166 gtk_window_set_title(GTK_WINDOW(self
),
167 _("Download device from IrrecoDB"));
168 gtk_window_set_modal(GTK_WINDOW(self
), TRUE
);
169 gtk_window_set_destroy_with_parent(GTK_WINDOW(self
), TRUE
);
170 gtk_dialog_set_has_separator(GTK_DIALOG(self
), FALSE
);
171 gtk_dialog_add_buttons(GTK_DIALOG(self
),
172 GTK_STOCK_REFRESH
, IRRECO_DEVICE_REFRESH
,
173 GTK_STOCK_OK
, GTK_RESPONSE_OK
,
176 self
->hbox
= g_object_new(GTK_TYPE_HBOX
, NULL
);
177 gtk_box_set_spacing(GTK_BOX(self
->hbox
), 8);
178 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(self
)->vbox
),
179 irreco_gtk_align(GTK_WIDGET(self
->hbox
),
180 0, 0, 1, 1, 8, 8, 8, 8));
181 /* Create tree_view_hbox */
182 tree_view_hbox
= g_object_new(GTK_TYPE_HBOX
, NULL
);
184 /* Create Treeview */
185 self
->tree_store
= gtk_tree_store_new(
186 N_COLUMNS
, G_TYPE_STRING
, G_TYPE_INT
, G_TYPE_POINTER
);
187 /* self->tree_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(
188 GTK_TREE_MODEL(self->tree_store)));*/
189 self
->tree_view
= hildon_gtk_tree_view_new_with_model(
190 HILDON_UI_MODE_NORMAL
,
191 GTK_TREE_MODEL(self
->tree_store
));
193 renderer
= gtk_cell_renderer_text_new();
194 column
= gtk_tree_view_column_new_with_attributes(
195 NULL
, renderer
, "text", TEXT_COL
, NULL
);
196 gtk_tree_view_append_column(GTK_TREE_VIEW(self
->tree_view
), column
);
198 /* Treeview to pannablearea */
200 gtk_box_pack_start(GTK_BOX(tree_view_hbox
), GTK_WIDGET(self
->tree_view
),
203 /* Create scrollbar for Treeview */
204 /*self->scrollbar = gtk_vscrollbar_new(gtk_tree_view_get_vadjustment(
205 GTK_TREE_VIEW(self->tree_view)));
206 gtk_box_pack_start(GTK_BOX(tree_view_hbox), GTK_WIDGET(self->scrollbar),
207 FALSE, TRUE, 0);TODO rm*/
209 /* Create Frame for Treeview */
210 tree_view_frame
= gtk_frame_new("");
211 gtk_frame_set_label_widget(GTK_FRAME(tree_view_frame
),
212 irreco_gtk_label_bold("Devices", 0, 0, 0, 0, 0, 0));
214 /* pannablearea = hildon_pannable_area_new();
215 hildon_pannable_area_add_with_viewport(HILDON_PANNABLE_AREA(pannablearea), tree_view_hbox);*/
217 gtk_container_add(GTK_CONTAINER(tree_view_frame
),
218 GTK_WIDGET(tree_view_hbox
));
220 gtk_box_pack_start(GTK_BOX(self
->hbox
), GTK_WIDGET(tree_view_frame
),
223 /* Create config_info */
224 self
->config_info
= gtk_table_new(7, 2, FALSE
);
225 gtk_table_set_row_spacings(GTK_TABLE(self
->config_info
), 4);
227 label_user
= gtk_label_new("Creator: ");
228 gtk_misc_set_alignment(GTK_MISC(label_user
), 0, 0.5);
229 gtk_table_attach_defaults(GTK_TABLE(self
->config_info
),
230 label_user
, 0, 1, 0, 1);
232 label_backend
= gtk_label_new("Backend: ");
233 gtk_misc_set_alignment(GTK_MISC(label_backend
), 0, 0.5);
234 gtk_table_attach_defaults(GTK_TABLE(self
->config_info
),
235 label_backend
, 0, 1, 1, 2);
237 label_category
= gtk_label_new("Category: ");
238 gtk_misc_set_alignment(GTK_MISC(label_category
), 0, 0.5);
239 gtk_table_attach_defaults(GTK_TABLE(self
->config_info
),
240 label_category
, 0, 1, 2, 3);
242 label_manuf
= gtk_label_new("Manufacturer: ");
243 gtk_misc_set_alignment(GTK_MISC(label_manuf
), 0, 0.5);
244 gtk_table_attach_defaults(GTK_TABLE(self
->config_info
),
245 label_manuf
, 0, 1, 3, 4);
247 label_model
= gtk_label_new("Model: ");
248 gtk_misc_set_alignment(GTK_MISC(label_model
), 0, 0.5);
249 gtk_table_attach_defaults(GTK_TABLE(self
->config_info
),
250 label_model
, 0, 1, 4, 5);
252 label_file_uploaded
= gtk_label_new("Created: ");
253 gtk_misc_set_alignment(GTK_MISC(label_file_uploaded
), 0, 0.5);
254 gtk_table_attach_defaults(GTK_TABLE(self
->config_info
),
255 label_file_uploaded
, 0, 1, 5, 6);
257 label_file_download_count
= gtk_label_new("Downloaded: ");
258 gtk_misc_set_alignment(GTK_MISC(label_file_download_count
), 0, 0.5);
259 gtk_table_attach_defaults(GTK_TABLE(self
->config_info
),
260 label_file_download_count
, 0, 1, 6, 7);
262 self
->config_user
= gtk_label_new("-");
263 gtk_misc_set_alignment(GTK_MISC(self
->config_user
), 0, 0.5);
264 gtk_table_attach(GTK_TABLE(self
->config_info
), self
->config_user
,
265 1, 2, 0, 1, GTK_FILL
, GTK_FILL
, 0, 0);
267 self
->config_backend
= gtk_label_new("-");
268 gtk_misc_set_alignment(GTK_MISC(self
->config_backend
), 0, 0.5);
269 gtk_table_attach(GTK_TABLE(self
->config_info
), self
->config_backend
,
270 1, 2, 1, 2, GTK_FILL
, GTK_FILL
, 0, 0);
272 self
->config_category
= gtk_label_new("-");
273 gtk_misc_set_alignment(GTK_MISC(self
->config_category
), 0, 0.5);
274 gtk_table_attach(GTK_TABLE(self
->config_info
), self
->config_category
,
275 1, 2, 2, 3, GTK_FILL
, GTK_FILL
, 0, 0);
277 self
->config_manuf
= gtk_label_new("-");
278 gtk_misc_set_alignment(GTK_MISC(self
->config_manuf
), 0, 0.5);
279 gtk_table_attach(GTK_TABLE(self
->config_info
), self
->config_manuf
,
280 1, 2, 3, 4, GTK_FILL
, GTK_FILL
, 0, 0);
282 self
->config_model
= gtk_label_new("-");
283 gtk_misc_set_alignment(GTK_MISC(self
->config_model
), 0, 0.5);
284 gtk_table_attach(GTK_TABLE(self
->config_info
), self
->config_model
,
285 1, 2, 4, 5, GTK_FILL
, GTK_FILL
, 0, 0);
287 self
->config_uploaded
= gtk_label_new("-");
288 gtk_misc_set_alignment(GTK_MISC(self
->config_uploaded
), 0, 0.5);
289 gtk_table_attach(GTK_TABLE(self
->config_info
),
290 self
->config_uploaded
,
291 1, 2, 5, 6, GTK_FILL
, GTK_FILL
, 0, 0);
293 self
->config_download_count
= gtk_label_new("-");
294 gtk_misc_set_alignment(GTK_MISC(self
->config_download_count
), 0, 0.5);
295 gtk_table_attach(GTK_TABLE(self
->config_info
),
296 self
->config_download_count
,
297 1, 2, 6, 7, GTK_FILL
, GTK_FILL
, 0, 0);
300 initial_font
= pango_font_description_from_string ("Sans 9");
301 gtk_widget_modify_font (label_user
, initial_font
);
302 gtk_widget_modify_font (label_backend
, initial_font
);
303 gtk_widget_modify_font (label_category
, initial_font
);
304 gtk_widget_modify_font (label_manuf
, initial_font
);
305 gtk_widget_modify_font (label_model
, initial_font
);
306 gtk_widget_modify_font (label_file_uploaded
, initial_font
);
307 gtk_widget_modify_font (label_file_download_count
, initial_font
);
308 gtk_widget_modify_font (self
->config_user
, initial_font
);
309 gtk_widget_modify_font (self
->config_backend
, initial_font
);
310 gtk_widget_modify_font (self
->config_category
, initial_font
);
311 gtk_widget_modify_font (self
->config_manuf
, initial_font
);
312 gtk_widget_modify_font (self
->config_model
, initial_font
);
313 gtk_widget_modify_font (self
->config_uploaded
, initial_font
);
314 gtk_widget_modify_font (self
->config_download_count
, initial_font
);
317 /* Create frame for config_info */
318 config_info_frame
= gtk_frame_new("");
319 gtk_frame_set_label_widget(GTK_FRAME(config_info_frame
),
320 irreco_gtk_label_bold("Details", 0, 0, 0, 0, 0, 0));
322 gtk_box_pack_start(GTK_BOX(self
->hbox
),
323 GTK_WIDGET(config_info_frame
),
326 config_info_alignment
= gtk_alignment_new(0, 0, 0, 0);
327 gtk_alignment_set_padding(GTK_ALIGNMENT(config_info_alignment
),
329 gtk_container_add(GTK_CONTAINER(config_info_frame
),
330 GTK_WIDGET(config_info_alignment
));
332 gtk_container_add(GTK_CONTAINER(config_info_alignment
),
333 GTK_WIDGET(self
->config_info
));
335 /* Setup the selection handler for TREE */
336 select
= gtk_tree_view_get_selection(GTK_TREE_VIEW(self
->tree_view
));
337 gtk_tree_selection_set_mode(select
, GTK_SELECTION_SINGLE
);
339 /* Signal handlers. */
340 g_signal_connect(G_OBJECT(self
), "map-event",
341 G_CALLBACK(irreco_show_webdb_dlg_map_event
), NULL
);
342 g_signal_connect(G_OBJECT(self
), "destroy",
343 G_CALLBACK(irreco_show_webdb_dlg_destroy_event
), NULL
);
344 g_signal_connect(G_OBJECT(self
->tree_view
), "row-activated",
345 G_CALLBACK(irreco_show_webdb_dlg_row_activated_event
),
347 g_signal_connect(G_OBJECT(self
->tree_view
), "row-expanded",
348 G_CALLBACK(irreco_show_webdb_dlg_row_expanded_event
),
350 g_signal_connect(G_OBJECT(self
->tree_view
), "row-collapsed",
351 G_CALLBACK(irreco_show_webdb_dlg_row_collapsed_event
),
353 g_signal_connect(G_OBJECT (select
), "changed",
354 G_CALLBACK (irreco_show_webdb_dlg_row_selected_event
),
358 gtk_tree_view_set_enable_tree_lines(GTK_TREE_VIEW(self
->tree_view
), TRUE
);
359 g_object_set (G_OBJECT (self
->tree_view
), "show-expanders", TRUE
, NULL
);
360 g_object_set (G_OBJECT (self
->tree_view
), "level-indentation", 0, NULL
);
361 gtk_tree_view_set_rubber_banding(GTK_TREE_VIEW(self
->tree_view
), FALSE
);
363 gtk_widget_set_size_request(GTK_WIDGET(self
), -1, 335);
364 gtk_widget_show_all(GTK_WIDGET(self
));
368 GtkWidget
*irreco_webdb_dlg_new(IrrecoData
*irreco_data
,
371 IrrecoWebdbDlg
*self
;
374 self
= g_object_new(IRRECO_TYPE_WEBDB_DLG
, NULL
);
375 irreco_dlg_set_parent(IRRECO_DLG(self
), parent
);
376 irreco_webdb_dlg_set_irreco_data(self
, irreco_data
);
377 IRRECO_RETURN_PTR(self
);
384 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
385 /* Private Functions */
386 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
389 * @name Private Functions
397 static void irreco_webdb_dlg_clean_details(IrrecoWebdbDlg
*self
)
403 GTK_LABEL(self
->config_user
), "-");
405 GTK_LABEL(self
->config_backend
), "-");
407 GTK_LABEL(self
->config_category
), "-");
409 GTK_LABEL(self
->config_manuf
), "-");
411 GTK_LABEL(self
->config_model
), "-");
413 GTK_LABEL(self
->config_uploaded
), "-");
415 GTK_LABEL(self
->config_download_count
), "-");
421 * Have the childern of this item been loaded.
423 * @return TRUE if children have been loade, FALSE otherwise.
425 static gboolean
irreco_webdb_dlg_row_is_loaded(IrrecoWebdbDlg
*self
,
431 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
432 iter
, FLAG_COL
, &i
, -1);
433 if (i
& ROW_CHILDREN_LOADED
) IRRECO_RETURN_BOOL(TRUE
);
434 IRRECO_RETURN_BOOL(FALSE
);
438 * Enable / Disable ROW_CHILDREN_LOADED flag from a row.
440 * @param value If set, ROW_CHILDREN_LOADED will be enabled.
442 static void irreco_webdb_dlg_row_set_loaded(IrrecoWebdbDlg
*self
,
449 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
450 iter
, FLAG_COL
, &i
, -1);
452 i
= i
| ROW_CHILDREN_LOADED
;
454 i
= i
& ~ROW_CHILDREN_LOADED
;
456 gtk_tree_store_set(self
->tree_store
, iter
, FLAG_COL
, i
, -1);
464 static gint
irreco_webdb_dlg_row_get_type(IrrecoWebdbDlg
*self
,
470 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
471 iter
, FLAG_COL
, &i
, -1);
472 if (i
& ROW_TYPE_CATEGORY
)
473 IRRECO_RETURN_ENUM(ROW_TYPE_CATEGORY
);
474 if (i
& ROW_TYPE_MANUFACTURER
)
475 IRRECO_RETURN_ENUM(ROW_TYPE_MANUFACTURER
);
476 if (i
& ROW_TYPE_MODEL
)
477 IRRECO_RETURN_ENUM(ROW_TYPE_MODEL
);
478 if (i
& ROW_TYPE_CONFIG
)
479 IRRECO_RETURN_ENUM(ROW_TYPE_CONFIG
);
480 if (i
& ROW_TYPE_LOADING
)
481 IRRECO_RETURN_ENUM(ROW_TYPE_LOADING
);
482 IRRECO_RETURN_INT(0);
486 * Show hildon progressbar banner.
488 * This function will create a new banner if one has not been created yet,
489 * if banner already exists, it's properties will be changed.
491 * @param text Text to show.
492 * @param fraction Value of progress.
494 static void irreco_webdb_dlg_set_banner(IrrecoWebdbDlg
*self
,
499 if (self
->banner
== NULL
) {
500 self
->banner
= hildon_banner_show_progress(
501 GTK_WIDGET(self
), NULL
, "");
504 hildon_banner_set_text(HILDON_BANNER(self
->banner
), text
);
505 hildon_banner_set_fraction(HILDON_BANNER(self
->banner
), fraction
);
510 * Destroy banner, if it exists.
512 static void irreco_webdb_dlg_hide_banner(IrrecoWebdbDlg
*self
)
516 gtk_widget_destroy(self
->banner
);
523 * Start a loader state machine if one is not running already.
525 static void irreco_webdb_dlg_loader_start(IrrecoWebdbDlg
*self
,
526 GSourceFunc function
,
527 GtkTreeIter
*parent_iter
)
531 if (self
->loader_func_id
== 0) {
533 self
->loader_parent_iter
= gtk_tree_iter_copy(
538 self
->loader_func_id
= g_idle_add(function
, self
);
540 IRRECO_ERROR("Loader function pointer not given.\n");
548 * Stop and cleanup loader if a loader is running.
550 static void irreco_webdb_dlg_loader_stop(IrrecoWebdbDlg
*self
)
553 if (self
->loader_func_id
!= 0) {
554 g_source_remove(self
->loader_func_id
);
555 self
->loader_func_id
= 0;
556 self
->loader_state
= 0;
557 if (self
->loader_parent_iter
) {
558 gtk_tree_iter_free(self
->loader_parent_iter
);
560 self
->loader_parent_iter
= NULL
;
566 * Web Database Category loader.
568 * This loader will request a list of categories from the Web Database and
569 * update the TreeView accordingly. Every category row created by this loader
570 * will have row type ROW_TYPE_CATEGORY.
572 static gboolean
irreco_webdb_dlg_loader_categ(IrrecoWebdbDlg
*self
)
576 switch (self
->loader_state
) {
577 case LOADER_STATE_INIT
:
578 irreco_webdb_dlg_set_banner(self
, _("Loading ..."), 0);
579 self
->loader_state
= LOADER_STATE_LOOP
;
580 irreco_webdb_dlg_clean_details(self
);
581 IRRECO_RETURN_BOOL(TRUE
);
583 case LOADER_STATE_LOOP
: {
585 GtkTreeIter iter_loading
;
586 IrrecoStringTable
*categories
= NULL
;
587 IrrecoWebdbCache
*webdb_cache
= NULL
;
589 webdb_cache
= irreco_data_get_webdb_cache(self
->irreco_data
,
591 if(irreco_webdb_cache_get_categories(webdb_cache
, &categories
)){
592 IRRECO_STRING_TABLE_FOREACH_KEY(categories
, key
)
594 /* Append categogy. */
595 gtk_tree_store_append(self
->tree_store
,
597 gtk_tree_store_set(self
->tree_store
,
598 &iter
, TEXT_COL
, key
,
599 FLAG_COL
, ROW_TYPE_CATEGORY
,
602 /* Add loading item into category. */
603 gtk_tree_store_append(self
->tree_store
,
604 &iter_loading
, &iter
);
605 gtk_tree_store_set(self
->tree_store
,
607 TEXT_COL
, _("Loading ..."),
608 FLAG_COL
, ROW_TYPE_LOADING
,
610 IRRECO_STRING_TABLE_FOREACH_END
612 irreco_error_dlg(GTK_WINDOW(self
),
613 irreco_webdb_cache_get_error(
617 irreco_webdb_dlg_set_banner(self
, _("Loading ..."), 1);
618 self
->loader_state
= LOADER_STATE_END
;
619 IRRECO_RETURN_BOOL(TRUE
);
622 case LOADER_STATE_END
:
623 irreco_webdb_dlg_hide_banner(self
);
624 irreco_webdb_dlg_loader_stop(self
);
627 IRRECO_RETURN_BOOL(FALSE
);
631 * Web Database Manufacturer loader.
635 static gboolean
irreco_webdb_dlg_loader_manuf(IrrecoWebdbDlg
*self
)
639 switch (self
->loader_state
) {
640 case LOADER_STATE_INIT
:
641 irreco_webdb_dlg_set_banner(self
, _("Loading ..."), 0);
642 self
->loader_state
= LOADER_STATE_LOOP
;
643 IRRECO_RETURN_BOOL(TRUE
);
645 case LOADER_STATE_LOOP
: {
647 GtkTreeIter iter_loading
;
648 IrrecoStringTable
*manufacturers
= NULL
;
649 IrrecoWebdbCache
*webdb_cache
= NULL
;
652 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
653 self
->loader_parent_iter
,
654 TEXT_COL
, &category
, -1);
656 webdb_cache
= irreco_data_get_webdb_cache(self
->irreco_data
,
659 if(irreco_webdb_cache_get_manufacturers(webdb_cache
,
663 IRRECO_STRING_TABLE_FOREACH_KEY(manufacturers
, key
)
665 /* Add manufacturer item into category. */
666 gtk_tree_store_append(self
->tree_store
,
667 &iter
, self
->loader_parent_iter
);
668 gtk_tree_store_set(self
->tree_store
,
671 FLAG_COL
, ROW_TYPE_MANUFACTURER
,
674 /* Add loading item into manufacturer. */
675 gtk_tree_store_append(self
->tree_store
,
676 &iter_loading
, &iter
);
677 gtk_tree_store_set(self
->tree_store
,
679 TEXT_COL
, _("Loading ..."),
680 FLAG_COL
, ROW_TYPE_LOADING
,
683 IRRECO_STRING_TABLE_FOREACH_END
685 irreco_error_dlg(GTK_WINDOW(self
),
686 irreco_webdb_cache_get_error(
692 /* Delete loading item from category. */
693 gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(self
->tree_store
),
694 &iter
,self
->loader_parent_iter
,0);
695 if(irreco_webdb_dlg_row_get_type(self
,
696 &iter
) == ROW_TYPE_LOADING
) {
697 gtk_tree_store_remove(self
->tree_store
,&iter
);
699 irreco_webdb_dlg_set_banner(self
, _("Loading ..."), 1);
700 self
->loader_state
= LOADER_STATE_END
;
701 IRRECO_RETURN_BOOL(TRUE
);
704 case LOADER_STATE_END
:
705 irreco_webdb_dlg_row_set_loaded(self
, self
->loader_parent_iter
,
707 irreco_webdb_dlg_hide_banner(self
);
708 irreco_webdb_dlg_loader_stop(self
);
711 IRRECO_RETURN_BOOL(FALSE
);
715 * Web Database Model loader.
719 static gboolean
irreco_webdb_dlg_loader_model(IrrecoWebdbDlg
*self
)
723 switch (self
->loader_state
) {
724 case LOADER_STATE_INIT
:
725 irreco_webdb_dlg_set_banner(self
, _("Loading ..."), 0);
726 self
->loader_state
= LOADER_STATE_LOOP
;
727 IRRECO_RETURN_BOOL(TRUE
);
729 case LOADER_STATE_LOOP
: {
731 GtkTreeIter iter_loading
;
732 GtkTreeIter category_iter
;
733 IrrecoStringTable
*models
= NULL
;
734 IrrecoWebdbCache
*webdb_cache
= NULL
;
738 /*Get category and manufacturer*/
740 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
741 self
->loader_parent_iter
,
742 TEXT_COL
, &manufacturer
, -1);
744 gtk_tree_model_iter_parent(GTK_TREE_MODEL(self
->tree_store
),
746 self
->loader_parent_iter
);
748 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
750 TEXT_COL
, &category
, -1);
752 webdb_cache
= irreco_data_get_webdb_cache(self
->irreco_data
,
755 if(irreco_webdb_cache_get_models(webdb_cache
, category
,
756 manufacturer
, &models
)){
758 IRRECO_STRING_TABLE_FOREACH_KEY(models
, key
)
760 /* Add model item into manufacturer. */
761 gtk_tree_store_append(self
->tree_store
,
762 &iter
, self
->loader_parent_iter
);
763 gtk_tree_store_set(self
->tree_store
,
766 FLAG_COL
, ROW_TYPE_MODEL
,
769 /* Add loading item into model. */
770 gtk_tree_store_append(self
->tree_store
,
771 &iter_loading
, &iter
);
772 gtk_tree_store_set(self
->tree_store
,
774 TEXT_COL
, _("Loading ..."),
775 FLAG_COL
, ROW_TYPE_LOADING
,
778 IRRECO_STRING_TABLE_FOREACH_END
780 irreco_error_dlg(GTK_WINDOW(self
),
781 irreco_webdb_cache_get_error(
785 g_free (manufacturer
);
787 /* Delete loading item from manufacturer. */
788 gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(self
->tree_store
),
789 &iter
, self
->loader_parent_iter
,
791 if(irreco_webdb_dlg_row_get_type(self
,
792 &iter
) == ROW_TYPE_LOADING
) {
793 gtk_tree_store_remove(self
->tree_store
, &iter
);
796 irreco_webdb_dlg_set_banner(self
, _("Loading ..."), 1);
797 self
->loader_state
= LOADER_STATE_END
;
799 IRRECO_RETURN_BOOL(TRUE
);
801 case LOADER_STATE_END
:
802 irreco_webdb_dlg_row_set_loaded(self
, self
->loader_parent_iter
,
804 irreco_webdb_dlg_hide_banner(self
);
805 irreco_webdb_dlg_loader_stop(self
);
808 IRRECO_RETURN_BOOL(FALSE
);
812 * Web Database Config loader.
816 static gboolean
irreco_webdb_dlg_loader_config(IrrecoWebdbDlg
*self
)
820 switch (self
->loader_state
) {
821 case LOADER_STATE_INIT
:
822 irreco_webdb_dlg_set_banner(self
, _("Loading ..."), 0);
823 self
->loader_state
= LOADER_STATE_LOOP
;
824 self
->loader_pos
= 0;
825 IRRECO_RETURN_BOOL(TRUE
);
827 case LOADER_STATE_LOOP
: {
829 GtkTreeIter manufacturer_iter
;
830 GtkTreeIter category_iter
;
831 IrrecoWebdbConf
*config
= NULL
;
832 IrrecoStringTable
*configs
= NULL
;
833 IrrecoWebdbCache
*webdb_cache
= NULL
;
834 const gchar
*config_id
= NULL
;
842 /*Get manufacturer_iter and category_iter */
844 gtk_tree_model_iter_parent(GTK_TREE_MODEL(self
->tree_store
),
846 self
->loader_parent_iter
);
848 gtk_tree_model_iter_parent(GTK_TREE_MODEL(self
->tree_store
),
852 /*Get category, manufacturer and model*/
854 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
856 TEXT_COL
, &category
, -1);
858 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
860 TEXT_COL
, &manufacturer
, -1);
862 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
863 self
->loader_parent_iter
,
864 TEXT_COL
, &model
, -1);
867 webdb_cache
= irreco_data_get_webdb_cache(self
->irreco_data
,
870 if(irreco_webdb_cache_get_configs(webdb_cache
,
871 category
, manufacturer
, model
, &configs
)){
873 irreco_string_table_index(configs
, self
->loader_pos
,
874 &config_id
, &id_data
);
875 id
= atoi(config_id
);
876 if(irreco_webdb_cache_get_configuration(webdb_cache
,
879 /* Add config item into model. */
880 gtk_tree_store_append(self
->tree_store
,
881 &iter
, self
->loader_parent_iter
);
882 gtk_tree_store_set(self
->tree_store
,
884 TEXT_COL
, config
->user
->str
,
885 FLAG_COL
, ROW_TYPE_CONFIG
,
886 DATA_COL
, config_id
, -1);
888 irreco_error_dlg(GTK_WINDOW(self
),
889 irreco_webdb_cache_get_error(
894 irreco_error_dlg(GTK_WINDOW(self
),
895 irreco_webdb_cache_get_error(
899 g_free (manufacturer
);
903 /* Delete loading item from model. */
904 gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(self
->tree_store
),
905 &iter
, self
->loader_parent_iter
,
907 if(irreco_webdb_dlg_row_get_type(self
,
908 &iter
) == ROW_TYPE_LOADING
) {
909 gtk_tree_store_remove(self
->tree_store
, &iter
);
912 config_count
= irreco_string_table_lenght(configs
);
914 banner
= ((float) self
->loader_pos
+ 1) / (float) config_count
;
915 irreco_webdb_dlg_set_banner(self
, _("Loading ..."), banner
);
917 if (self
->loader_pos
+ 1 >= config_count
) {
918 self
->loader_state
= LOADER_STATE_END
;
919 IRRECO_RETURN_BOOL(TRUE
);
922 IRRECO_RETURN_BOOL(TRUE
);
926 IRRECO_RETURN_BOOL(TRUE
);
928 case LOADER_STATE_END
:
929 irreco_webdb_dlg_row_set_loaded(self
, self
->loader_parent_iter
,
931 irreco_webdb_dlg_hide_banner(self
);
932 irreco_webdb_dlg_loader_stop(self
);
935 IRRECO_RETURN_BOOL(FALSE
);
939 * Web Database Configuration details loader.
943 static gboolean
irreco_webdb_dlg_display_config_detail(IrrecoWebdbDlg
*self
,
946 IrrecoWebdbCache
*webdb_cache
= NULL
;
947 const gchar
*config_id
= NULL
;
948 GString
*download_count
= g_string_new("");
952 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
953 iter
, DATA_COL
, &config_id
, -1);
955 config_id_int
= atoi(config_id
);
957 webdb_cache
= irreco_data_get_webdb_cache(self
->irreco_data
,
960 irreco_webdb_cache_get_configuration(webdb_cache
,
961 config_id_int
, &self
->config
);
963 gtk_label_set_text(GTK_LABEL(self
->config_user
),
964 self
->config
->user
->str
);
965 gtk_label_set_text(GTK_LABEL(self
->config_backend
),
966 self
->config
->backend
->str
);
967 gtk_label_set_text(GTK_LABEL(self
->config_category
),
968 self
->config
->category
->str
);
969 gtk_label_set_text(GTK_LABEL(self
->config_manuf
),
970 self
->config
->manufacturer
->str
);
971 gtk_label_set_text(GTK_LABEL(self
->config_model
),
972 self
->config
->model
->str
);
973 gtk_label_set_text(GTK_LABEL(self
->config_uploaded
),
974 self
->config
->file_uploaded
->str
);
976 g_string_printf(download_count
, "%s times",
977 self
->config
->file_download_count
->str
);
978 gtk_label_set_text(GTK_LABEL(self
->config_download_count
),
979 download_count
->str
);
980 g_string_free(download_count
, TRUE
);
982 IRRECO_RETURN_BOOL(TRUE
);
987 * Web Database File loader.
991 static gboolean
irreco_webdb_dlg_load_file(IrrecoWebdbDlg
*self
)
993 IrrecoWebdbCache
*webdb_cache
= NULL
;
994 IrrecoBackendInstance
*inst
= NULL
;
995 GString
*error_msg
= g_string_new("");
996 IrrecoBackendManager
*manager
;
997 IrrecoBackendFileContainer
*file_container
;
1000 gboolean success
= TRUE
;
1001 gboolean new_instance
= FALSE
;
1005 if(self
->config
== NULL
) {
1006 g_string_printf(error_msg
, "Select configuration first");
1011 webdb_cache
= irreco_data_get_webdb_cache(self
->irreco_data
, FALSE
);
1012 if (!irreco_webdb_cache_get_file(webdb_cache
,
1013 self
->config
->file_hash
->str
,
1014 self
->config
->file_name
->str
,
1016 g_string_printf(error_msg
, irreco_webdb_cache_get_error(
1021 sha1
= g_compute_checksum_for_string(G_CHECKSUM_SHA1
,
1022 file_data
->str
, -1);
1024 if (g_utf8_collate(self
->config
->file_hash
->str
, sha1
) != 0) {
1025 g_string_printf(error_msg
, "sha1 checksum failed.");
1030 /* Search backend */
1031 manager
= self
->irreco_data
->irreco_backend_manager
;
1032 IRRECO_BACKEND_MANAGER_FOREACH_LIB(manager
, lib
)
1033 if (g_utf8_collate(lib
->name
, self
->config
->backend
->str
) != 0){
1036 if (!(lib
->api
->flags
& IRRECO_BACKEND_EDITABLE_DEVICES
)) {
1037 g_string_printf(error_msg
,
1038 "\"%s\" backend is not editable...",
1039 self
->config
->backend
->str
);
1042 else if (!(lib
->api
->flags
&
1043 IRRECO_BACKEND_CONFIGURATION_EXPORT
)) {
1044 g_string_printf(error_msg
,
1045 "\"%s\" backend doesn't support "
1046 "exporting its configuration...",
1047 self
->config
->backend
->str
);
1050 /* Check if many instances */
1052 IRRECO_BACKEND_MANAGER_FOREACH_INSTANCE(manager
, instance
)
1053 irreco_backend_instance_get_description(instance
);
1054 if (g_utf8_collate(instance
->lib
->name
,
1055 self
->config
->backend
->str
) == 0) {
1058 /*if there is only one instance, then use it */
1061 IRRECO_STRING_TABLE_FOREACH_END
1062 IRRECO_DEBUG("INSTACES: %d\n",instances
);
1064 /* Create new instance if it comes to the crunch */
1065 if (instances
== 0 || lib
->api
->flags
&
1066 IRRECO_BACKEND_NEW_INST_ON_CONF_IMPORT
) {
1067 inst
= irreco_backend_manager_create_instance(
1068 manager
, lib
, NULL
, NULL
);
1069 new_instance
= TRUE
;
1073 /* Select instace */
1074 if (instances
> 1) {
1075 if (!irreco_show_select_instance_dlg(
1076 self
->irreco_data
, GTK_WINDOW(self
),
1077 self
->config
->backend
->str
, &inst
)) {
1078 g_string_printf(error_msg
,
1079 "Operation aborted by user...");
1083 goto instance_ready
;
1084 IRRECO_STRING_TABLE_FOREACH_END
1087 g_string_printf(error_msg
, "\"%s\" backend is not installed...",
1088 self
->config
->backend
->str
);
1092 irreco_backend_instance_configure(inst
, GTK_WINDOW(self
));
1093 irreco_backend_instance_save_to_conf(inst
);
1094 irreco_config_save_backends(manager
);
1097 file_container
= irreco_backend_file_container_new();
1098 irreco_backend_file_container_set(file_container
,
1100 self
->config
->category
->str
,
1101 self
->config
->manufacturer
->str
,
1102 self
->config
->model
->str
,
1103 self
->config
->file_name
->str
,
1106 if (irreco_backend_instance_check_conf(inst
, file_container
)) {
1107 GString
*question
= g_string_new("");
1108 g_string_printf(question
, "\"%s\" backend already contains\n"
1110 "Do you want to overwrite?",
1111 inst
->lib
->name
,self
->config
->model
->str
);
1112 success
= irreco_yes_no_dlg(GTK_WINDOW(self
), question
->str
);
1113 g_string_free(question
, TRUE
);
1115 if(success
== FALSE
) {
1120 /* Send file_data for backend */
1121 if(irreco_backend_instance_import_conf(inst
, file_container
)) {
1122 irreco_info_dlg(GTK_WINDOW(self
),
1123 "Configuration downloaded successfully!");
1124 irreco_backend_manager_get_devcmd_lists(
1125 self
->irreco_data
->irreco_backend_manager
);
1127 g_string_printf(error_msg
, "Backend error");
1130 irreco_backend_manager_destroy_instance(manager
, inst
);
1136 if(error_msg
->len
> 0) {
1137 irreco_error_dlg(GTK_WINDOW(self
), error_msg
->str
);
1140 g_string_free(error_msg
, TRUE
);
1141 if (sha1
!= NULL
) g_free(sha1
);
1142 IRRECO_RETURN_BOOL(success
);
1149 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
1151 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
1154 * @name Public Functions
1158 void irreco_webdb_dlg_set_irreco_data(IrrecoWebdbDlg
*self
,
1159 IrrecoData
*irreco_data
)
1162 self
->irreco_data
= irreco_data
;
1166 void irreco_show_webdb_dlg(IrrecoData
*irreco_data
, GtkWindow
*parent
)
1168 IrrecoWebdbDlg
*self
;
1170 gboolean loop
= TRUE
;
1173 self
= IRRECO_WEBDB_DLG(irreco_webdb_dlg_new(irreco_data
, parent
));
1176 response
= gtk_dialog_run(GTK_DIALOG(self
));
1178 case IRRECO_DEVICE_REFRESH
:
1179 IRRECO_DEBUG("IRRECO_DEVICE_REFRESH\n");
1180 gtk_tree_store_clear(self
->tree_store
);
1181 irreco_data_get_webdb_cache(self
->irreco_data
, TRUE
);
1182 irreco_webdb_dlg_loader_start(self
,
1183 G_SOURCEFUNC(irreco_webdb_dlg_loader_categ
),
1187 case GTK_RESPONSE_DELETE_EVENT
:
1188 IRRECO_DEBUG("GTK_RESPONSE_DELETE_EVENT\n");
1192 case GTK_RESPONSE_OK
:
1193 IRRECO_DEBUG("GTK_RESPONSE_OK\n");
1194 loop
= !irreco_webdb_dlg_load_file(self
);
1200 gtk_widget_destroy(GTK_WIDGET(self
));
1208 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
1209 /* Events and Callbacks */
1210 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
1213 * @name Events and Callbacks
1217 static gboolean
irreco_show_webdb_dlg_map_event(IrrecoWebdbDlg
*self
,
1222 irreco_webdb_dlg_loader_start(
1223 self
, G_SOURCEFUNC(irreco_webdb_dlg_loader_categ
), NULL
);
1224 IRRECO_RETURN_BOOL(FALSE
);
1227 static void irreco_show_webdb_dlg_destroy_event(IrrecoWebdbDlg
*self
,
1231 irreco_webdb_dlg_loader_stop(self
);
1235 static void irreco_show_webdb_dlg_row_activated_event(GtkTreeView
*tree_view
,
1237 GtkTreeViewColumn
*column
,
1238 IrrecoWebdbDlg
*self
)
1242 if (gtk_tree_view_row_expanded(tree_view
, path
)) {
1243 gtk_tree_view_expand_row(tree_view
, path
, FALSE
);
1245 gtk_tree_view_collapse_row(tree_view
, path
);
1250 static void irreco_show_webdb_dlg_row_expanded_event(GtkTreeView
*tree_view
,
1253 IrrecoWebdbDlg
*self
)
1257 irreco_webdb_dlg_clean_details(self
);
1259 if (self
->loader_func_id
!= 0) {
1260 gtk_tree_view_collapse_row(tree_view
, path
);
1263 if (!irreco_webdb_dlg_row_is_loaded(self
, iter
)) {
1264 switch (irreco_webdb_dlg_row_get_type(self
, iter
)) {
1265 case ROW_TYPE_CATEGORY
:
1266 irreco_webdb_dlg_loader_start(self
,
1267 G_SOURCEFUNC(irreco_webdb_dlg_loader_manuf
),
1271 case ROW_TYPE_MANUFACTURER
:
1272 irreco_webdb_dlg_loader_start(self
,
1273 G_SOURCEFUNC(irreco_webdb_dlg_loader_model
),
1277 case ROW_TYPE_MODEL
:
1278 irreco_webdb_dlg_loader_start(self
,
1279 G_SOURCEFUNC(irreco_webdb_dlg_loader_config
),
1288 static void irreco_show_webdb_dlg_row_collapsed_event(GtkTreeView
*tree_view
,
1291 IrrecoWebdbDlg
*self
)
1295 irreco_webdb_dlg_clean_details(self
);
1300 static void irreco_show_webdb_dlg_row_selected_event(GtkTreeSelection
*sel
,
1301 IrrecoWebdbDlg
*self
)
1304 GtkTreeModel
*model
;
1308 if (gtk_tree_selection_get_selected (sel
, &model
, &iter
))
1310 switch (irreco_webdb_dlg_row_get_type(self
, &iter
)) {
1312 case ROW_TYPE_CONFIG
:
1313 IRRECO_DEBUG("ROW_TYPE_CONFIG\n");
1314 irreco_webdb_dlg_display_config_detail(self
, &iter
);
1318 irreco_webdb_dlg_clean_details(self
);