2 * irreco - Ir Remote Control
3 * Copyright (C) 2007,2008 Arto Karppinen (arto.karppinen@iki.fi),
4 * Joni Kokko (t5kojo01@students.oamk.fi),
5 * Sami Mäki (kasmra@xob.kapsi.fi),
6 * Harri Vattulainen (t5vaha01@students.oamk.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_webdb_client.h"
27 * @addtogroup IrrecoWebdbClient
28 * @ingroup IrrecoWebdb
30 * Irreco Web Database API implementation. These functions connect to the
31 * IrrecoWebdbClient trough XML-RPC connection, pass arguments, and decode
39 * Source file of @ref IrrecoWebdbClient.
42 static const char *const value_type
[] = {
54 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
56 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
58 static void irreco_webdb_client_reset_env();
59 static gboolean
do_xmlrpc (IrrecoWebdbClient
*self
, const char *method
, GValue
*retval
, ...);
61 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
62 /* Construction & Destruction */
63 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
66 * @name Construction & Destruction
71 * Create new IrrecoWebdbClient Object
73 IrrecoWebdbClient
*irreco_webdb_client_new()
75 IrrecoWebdbClient
*self
;
78 self
= g_slice_new0(IrrecoWebdbClient
);
80 self
->error_msg
= g_string_new(NULL
);
82 IRRECO_RETURN_PTR(self
);
85 void irreco_webdb_client_free(IrrecoWebdbClient
*self
)
89 g_assert(self
!= NULL
);
91 /* Free self->error_msg resource */
92 g_string_free(self
->error_msg
, TRUE
);
93 self
->error_msg
= NULL
;
95 g_slice_free(IrrecoWebdbClient
, self
);
103 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
104 /* Private Functions */
105 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
108 * @name Private Functions
113 * Release of RPC results and errors.
115 static void irreco_webdb_client_reset_env(IrrecoWebdbClient
*self
)
119 self
->error_msg
= g_string_erase(self
->error_msg
, 0, -1);
124 static gboolean
check_xmlrpc (GValue
*value
, GType type
, ...)
130 if (!G_VALUE_HOLDS (value
, type
)) {
131 g_printf ( "ERROR: could not parse response\n");
132 g_value_unset (value
);
133 IRRECO_RETURN_BOOL(FALSE
);
136 va_start (args
, type
);
137 SOUP_VALUE_GETV (value
, type
, args
);
140 IRRECO_RETURN_BOOL(TRUE
);
144 SoupSession
*soup_session_new (GType type
, ...)
147 const char *propname
;
148 SoupSession
*session
;
152 va_start (args
, type
);
153 propname
= va_arg (args
, const char *);
154 session
= (SoupSession
*)g_object_new_valist (type
, propname
, args
);
157 IRRECO_RETURN_PTR(session
);
160 void soup_session_abort_unref (SoupSession
*session
)
164 g_object_add_weak_pointer (G_OBJECT (session
), (gpointer
*)&session
);
166 soup_session_abort (session
);
167 g_object_unref (session
);
170 g_printf ("leaked SoupSession!\n");
171 g_object_remove_weak_pointer (G_OBJECT (session
), (gpointer
*)&session
);
180 * @param method Methodname
181 * @param retval Returned value
182 * @param ... Parameters to send
184 static gboolean
do_xmlrpc (IrrecoWebdbClient
*self
, const char *method
, GValue
*retval
, ...)
191 static SoupSession
*session
;
192 SoupLogger
*souplogger
;
196 session
= soup_session_new (SOUP_TYPE_SESSION_SYNC
, NULL
);
198 souplogger
= soup_logger_new(SOUP_LOGGER_LOG_BODY
, -1);
199 soup_logger_attach(souplogger
, session
);
201 va_start (args
, retval
);
202 params
= soup_value_array_from_args (args
);
205 /*IRRECO_DEBUG("metodi: %s, param num: %d\n", method, params->n_values);*/
206 body
= soup_xmlrpc_build_method_call (method
, params
->values
,
208 /*IRRECO_DEBUG("body: %s\n", body);*/
209 g_value_array_free (params
);
212 IRRECO_RETURN_BOOL(FALSE
);
214 msg
= soup_message_new ("POST", IRRECO_WEBDB_URL
);
216 soup_message_set_request (msg
, "text/xml", SOUP_MEMORY_TAKE
,
217 body
, strlen (body
));
219 soup_message_headers_append(msg
->request_headers
, "User-Agent", PACKAGE_NAME
"/" VERSION
);
221 soup_session_send_message (session
, msg
);
223 soup_session_abort_unref (session
);
225 if (!SOUP_STATUS_IS_SUCCESSFUL (msg
->status_code
)) {
226 g_printf ( "ERROR: %d %s\n", msg
->status_code
,
228 g_string_printf(self
->error_msg
, "%s", msg
->reason_phrase
);
229 g_object_unref (msg
);
230 IRRECO_RETURN_BOOL(FALSE
);
233 if (!soup_xmlrpc_parse_method_response (msg
->response_body
->data
,
234 msg
->response_body
->length
, retval
, &err
)) {
236 g_print("FAULT:\ncode: %d\nmessage: %s\n", err
->code
, err
->message
);
237 g_string_printf(self
->error_msg
, "%s", err
->message
);
239 g_object_unref (msg
);
240 IRRECO_RETURN_BOOL(FALSE
);
242 g_printf ("ERROR: could not parse response\n");
243 g_string_printf(self
->error_msg
, "ERROR: could not parse response");
244 g_object_unref (msg
);
245 IRRECO_RETURN_BOOL(FALSE
);
248 g_object_unref (msg
);
250 IRRECO_RETURN_BOOL(TRUE
);
256 * @param msg GString object to recieve the error message.
258 void irreco_webdb_client_get_error_msg(IrrecoWebdbClient
*self
, GString
*msg
)
262 /* Clear and set msg */
263 msg
= g_string_erase(msg
, 0, -1);
264 msg
= g_string_insert(msg
, 0, self
->error_msg
->str
);
272 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
274 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
277 * @name Public Functions
282 * Ask WebDB to sum two numbers.
284 * @param num_a First number.
285 * @param num_b Second number.
286 * @param sum Variable to receive the result.
287 * @return TRUE on successfull XML-RPC call, FALSE otherwise.
289 gboolean
irreco_webdb_client_sum(IrrecoWebdbClient
*self
,
298 irreco_webdb_client_reset_env(self
);
300 if(do_xmlrpc (self
, "sum", &retval
, G_TYPE_INT
, num_a
, G_TYPE_INT
, num_b
, G_TYPE_INVALID
)) {
301 if(check_xmlrpc (&retval
, G_TYPE_INT
, sum
)) {
302 IRRECO_RETURN_BOOL(TRUE
);
304 IRRECO_RETURN_BOOL(FALSE
);
307 IRRECO_RETURN_BOOL(FALSE
);
311 gboolean
irreco_webdb_client_upload_configuration(IrrecoWebdbClient
*self
,
312 const gchar
*backend
,
313 const gchar
*category
,
314 const gchar
*file_hash
,
315 const gchar
*file_name
,
316 const gchar
*manufacturer
,
318 const gchar
*password
,
327 irreco_webdb_client_reset_env(self
);
329 if(do_xmlrpc (self
, "uploadConfiguration", &retval
, G_TYPE_STRING
, backend
, G_TYPE_STRING
, category
,
330 G_TYPE_STRING
, manufacturer
, G_TYPE_STRING
, model
, G_TYPE_STRING
, user
, G_TYPE_STRING
, password
,
331 G_TYPE_STRING
, file_hash
, G_TYPE_STRING
, file_name
, G_TYPE_STRING
, data
, G_TYPE_INVALID
)) {
332 if(check_xmlrpc (&retval
, G_TYPE_STRING
, &msg
)) {
333 IRRECO_RETURN_BOOL(TRUE
);
335 IRRECO_RETURN_BOOL(FALSE
);
338 IRRECO_RETURN_BOOL(FALSE
);
343 gboolean
irreco_webdb_client_get_categories(IrrecoWebdbClient
*self
,
344 IrrecoStringTable
**category_list
)
352 irreco_webdb_client_reset_env(self
);
353 *category_list
= irreco_string_table_new(NULL
, NULL
);
355 if(do_xmlrpc (self
, "getCategories", &retval
, G_TYPE_INVALID
)) {
356 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
357 for(i
= 0; i
< array
->n_values
; i
++) {
358 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
359 g_value_array_get_nth(array
, i
)));
360 irreco_string_table_add(*category_list
,
362 g_value_array_get_nth(array
, i
)),
365 IRRECO_RETURN_BOOL(TRUE
);
367 IRRECO_RETURN_BOOL(FALSE
);
370 IRRECO_RETURN_BOOL(FALSE
);
374 gboolean
irreco_webdb_client_get_all_categories(IrrecoWebdbClient
*self
,
375 IrrecoStringTable
**category_list
)
383 irreco_webdb_client_reset_env(self
);
384 *category_list
= irreco_string_table_new(NULL
, NULL
);
386 if(do_xmlrpc (self
, "getAllCategories", &retval
, G_TYPE_INVALID
)) {
387 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
388 for(i
= 0; i
< array
->n_values
; i
++) {
389 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
390 g_value_array_get_nth(array
, i
)));
391 irreco_string_table_add(*category_list
,
393 g_value_array_get_nth(array
, i
)),
396 IRRECO_RETURN_BOOL(TRUE
);
398 IRRECO_RETURN_BOOL(FALSE
);
401 IRRECO_RETURN_BOOL(FALSE
);
404 gboolean
irreco_webdb_client_get_manufacturers(IrrecoWebdbClient
*self
,
405 const gchar
*category
,
406 IrrecoStringTable
**manufacturer_list
)
414 irreco_webdb_client_reset_env(self
);
415 *manufacturer_list
= irreco_string_table_new(NULL
, NULL
);
417 if(do_xmlrpc (self
, "getManufacturers", &retval
, G_TYPE_STRING
, category
, G_TYPE_INVALID
)) {
418 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
419 for(i
= 0; i
< array
->n_values
; i
++) {
420 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
421 g_value_array_get_nth(array
, i
)));
422 irreco_string_table_add(*manufacturer_list
,
424 g_value_array_get_nth(array
, i
)),
427 IRRECO_RETURN_BOOL(TRUE
);
429 IRRECO_RETURN_BOOL(FALSE
);
432 IRRECO_RETURN_BOOL(FALSE
);
436 gboolean
irreco_webdb_client_get_all_manufacturers(IrrecoWebdbClient
*self
,
437 IrrecoStringTable
**manufacturer_list
)
445 irreco_webdb_client_reset_env(self
);
446 *manufacturer_list
= irreco_string_table_new(NULL
, NULL
);
448 if(do_xmlrpc (self
, "getAllManufacturers", &retval
, G_TYPE_INVALID
)) {
449 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
450 for(i
= 0; i
< array
->n_values
; i
++) {
451 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
452 g_value_array_get_nth(array
, i
)));
453 irreco_string_table_add(*manufacturer_list
,
455 g_value_array_get_nth(array
, i
)),
458 IRRECO_RETURN_BOOL(TRUE
);
460 IRRECO_RETURN_BOOL(FALSE
);
463 IRRECO_RETURN_BOOL(FALSE
);
467 gboolean
irreco_webdb_client_get_models(IrrecoWebdbClient
*self
,
468 const gchar
*category
,
469 const gchar
*manufacturer
,
470 IrrecoStringTable
**model_list
)
478 irreco_webdb_client_reset_env(self
);
479 *model_list
= irreco_string_table_new(NULL
, NULL
);
481 if(do_xmlrpc (self
, "getModels", &retval
, G_TYPE_STRING
, category
, G_TYPE_STRING
, manufacturer
, G_TYPE_INVALID
)) {
482 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
483 for(i
= 0; i
< array
->n_values
; i
++) {
484 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
485 g_value_array_get_nth(array
, i
)));
486 irreco_string_table_add(*model_list
,
488 g_value_array_get_nth(array
, i
)),
491 IRRECO_RETURN_BOOL(TRUE
);
493 IRRECO_RETURN_BOOL(FALSE
);
496 IRRECO_RETURN_BOOL(FALSE
);
500 gboolean
irreco_webdb_client_get_configs(IrrecoWebdbClient
*self
,
501 const gchar
*manufacturer
,
503 IrrecoStringTable
**config_list
)
511 irreco_webdb_client_reset_env(self
);
512 *config_list
= irreco_string_table_new(NULL
, NULL
);
514 if(do_xmlrpc (self
, "getConfigurations", &retval
, G_TYPE_STRING
, manufacturer
,
515 G_TYPE_STRING
, model
, G_TYPE_INVALID
)) {
516 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
517 for(i
= 0; i
< array
->n_values
; i
++) {
518 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
519 g_value_array_get_nth(array
, i
)));
520 irreco_string_table_add(*config_list
,
522 g_value_array_get_nth(array
, i
)),
525 IRRECO_RETURN_BOOL(TRUE
);
527 IRRECO_RETURN_BOOL(FALSE
);
530 IRRECO_RETURN_BOOL(FALSE
);
535 gboolean
irreco_webdb_client_get_configuration(IrrecoWebdbClient
*self
,
537 IrrecoWebdbConf
**configuration
)
540 const gchar
*user
= NULL
;
541 const gchar
*backend
;
542 const gchar
*category
;
543 const gchar
*manufacturer
;
545 const gchar
*file_hash
;
546 const gchar
*file_name
;
547 const gchar
*uploaded
;
548 const gchar
*download_count
;
553 irreco_webdb_client_reset_env(self
);
555 if(do_xmlrpc (self
, "getConfigurationById", &retval
, G_TYPE_INT
, id
, G_TYPE_INVALID
)) {
556 if(check_xmlrpc (&retval
, G_TYPE_HASH_TABLE
, &htable
)) {
558 tmp
= g_hash_table_lookup (htable
, "user");
559 user
= g_value_get_string(tmp
);
560 tmp
= g_hash_table_lookup (htable
, "backend");
561 backend
= g_value_get_string(tmp
);
562 tmp
= g_hash_table_lookup (htable
, "category");
563 category
= g_value_get_string(tmp
);
564 tmp
= g_hash_table_lookup (htable
, "manufacturer");
565 manufacturer
= g_value_get_string(tmp
);
566 tmp
= g_hash_table_lookup (htable
, "model");
567 model
= g_value_get_string(tmp
);
568 tmp
= g_hash_table_lookup (htable
, "file_hash");
569 file_hash
= g_value_get_string(tmp
);
570 tmp
= g_hash_table_lookup (htable
, "file_name");
571 file_name
= g_value_get_string(tmp
);
572 tmp
= g_hash_table_lookup (htable
, "uploaded");
573 uploaded
= g_value_get_string(tmp
);
574 tmp
= g_hash_table_lookup (htable
, "download_count");
575 download_count
= g_value_get_string(tmp
);
577 IRRECO_DEBUG("Configuration: %d %s %s %s %s %s %s %s %s %s\n",
578 id
, user
, backend
, category
, manufacturer
,
579 model
, file_hash
, file_name
, uploaded
, download_count
);
580 irreco_webdb_conf_set(*configuration
, id
, user
, backend
,
581 category
, manufacturer
, model
,
582 file_hash
, file_name
, uploaded
,
584 IRRECO_RETURN_BOOL(TRUE
);
586 IRRECO_RETURN_BOOL(FALSE
);
589 IRRECO_RETURN_BOOL(FALSE
);
593 gint
irreco_webdb_client_get_config_id_by_file_hash_and_file_name(
594 IrrecoWebdbClient
*self
,
595 const gchar
*file_hash
,
596 const gchar
*file_name
)
603 irreco_webdb_client_reset_env(self
);
605 if(do_xmlrpc (self
, "getConfigIdByFilehashAndFilename", &retval
, G_TYPE_STRING
, file_hash
,
606 G_TYPE_STRING
, file_name
, G_TYPE_INVALID
)) {
607 if(check_xmlrpc (&retval
, G_TYPE_INT
, &msg
)) {
608 IRRECO_RETURN_INT(msg
);
610 IRRECO_RETURN_INT(0);
613 IRRECO_RETURN_INT(0);
617 gboolean
irreco_webdb_client_get_file(IrrecoWebdbClient
*self
,
618 const gchar
*file_hash
,
619 const gchar
*file_name
,
628 irreco_webdb_client_reset_env(self
);
630 if(do_xmlrpc (self
, "getFile", &retval
, G_TYPE_STRING
, file_hash
, G_TYPE_STRING
, file_name
, G_TYPE_INVALID
)) {
631 if(check_xmlrpc (&retval
, G_TYPE_HASH_TABLE
, &htable
)) {
633 tmp
= g_hash_table_lookup (htable
, "data");
634 ret
= g_value_get_string(tmp
);
635 *file_data
= g_string_new(ret
);
636 g_hash_table_destroy (htable
);
637 IRRECO_RETURN_BOOL(TRUE
)
639 IRRECO_RETURN_BOOL(FALSE
);
642 IRRECO_RETURN_BOOL(FALSE
);
647 gboolean
irreco_webdb_client_get_user_exists(IrrecoWebdbClient
*self
,
649 gboolean
*user_exists
)
656 irreco_webdb_client_reset_env(self
);
658 if(do_xmlrpc (self
, "getUserExists", &retval
, G_TYPE_STRING
, name
, G_TYPE_INVALID
)) {
659 if(check_xmlrpc (&retval
, G_TYPE_BOOLEAN
, &tmp
)) {
661 IRRECO_RETURN_BOOL(TRUE
);
663 IRRECO_RETURN_BOOL(FALSE
);
666 IRRECO_RETURN_BOOL(FALSE
);
670 gint
irreco_webdb_client_get_max_image_size(IrrecoWebdbClient
*self
)
677 irreco_webdb_client_reset_env(self
);
679 if(do_xmlrpc (self
, "getMaxImageSize", &retval
, G_TYPE_INVALID
)) {
680 if(check_xmlrpc (&retval
, G_TYPE_INT
, &max_image_size
)) {
681 IRRECO_RETURN_INT(max_image_size
);
683 IRRECO_RETURN_INT(0);
686 IRRECO_RETURN_INT(0);
690 gint
irreco_webdb_client_create_theme(IrrecoWebdbClient
*self
,
692 const gchar
*comment
,
693 const gchar
*preview_button
,
696 const gchar
*password
)
703 irreco_webdb_client_reset_env(self
);
705 if(do_xmlrpc (self
, "createNewTheme", &retval
, G_TYPE_STRING
, name
, G_TYPE_STRING
, comment
,
706 G_TYPE_STRING
, preview_button
, G_TYPE_STRING
, folder
,
707 G_TYPE_STRING
, user
, G_TYPE_STRING
, password
, G_TYPE_INVALID
)) {
708 if(check_xmlrpc (&retval
, G_TYPE_INT
, &msg
)) {
709 IRRECO_RETURN_INT(msg
);
711 IRRECO_RETURN_INT(0);
714 IRRECO_RETURN_INT(0);
718 gboolean
irreco_webdb_client_set_theme_downloadable(IrrecoWebdbClient
*self
,
720 gboolean downloadable
,
722 const gchar
*password
)
729 irreco_webdb_client_reset_env(self
);
731 if(do_xmlrpc (self
, "setThemeDownloadable", &retval
, G_TYPE_INT
, id
,
732 G_TYPE_BOOLEAN
, downloadable
, G_TYPE_STRING
, user
, G_TYPE_STRING
, password
, G_TYPE_INVALID
)) {
733 if(check_xmlrpc (&retval
, G_TYPE_BOOLEAN
, &msg
)) {
734 IRRECO_RETURN_BOOL(msg
);
736 IRRECO_RETURN_BOOL(FALSE
);
739 IRRECO_RETURN_BOOL(FALSE
);
743 gboolean
irreco_webdb_client_get_themes(IrrecoWebdbClient
*self
,
744 IrrecoStringTable
**theme_list
)
752 irreco_webdb_client_reset_env(self
);
753 *theme_list
= irreco_string_table_new(NULL
, NULL
);
755 if(do_xmlrpc (self
, "getThemes", &retval
, G_TYPE_INVALID
)) {
756 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
757 for(i
= 0; i
< array
->n_values
; i
++) {
758 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
759 g_value_array_get_nth(array
, i
)));
760 /*g_print("value: %s\n", g_value_get_string(
761 g_value_array_get_nth(array, i)));*/
762 irreco_string_table_add(*theme_list
,
764 g_value_array_get_nth(array
, i
)),
767 IRRECO_RETURN_BOOL(TRUE
);
769 IRRECO_RETURN_BOOL(FALSE
); /* Failed check_xmlrpc */
772 IRRECO_RETURN_BOOL(FALSE
); /* Failed do_xmlrpc */
776 gboolean
irreco_webdb_client_get_theme_by_id(IrrecoWebdbClient
*self
,
778 IrrecoWebdbTheme
**theme
)
782 const gchar
*name
= NULL
;
783 const gchar
*user
= NULL
;
784 const gchar
*comment
= NULL
;
785 const gchar
*preview_button
= NULL
;
786 const gchar
*folder
= NULL
;
787 const gchar
*uploaded
= NULL
;
788 const gchar
*modified
= NULL
;
789 const gchar
*downloaded
= NULL
;
794 irreco_webdb_client_reset_env(self
);
796 if(do_xmlrpc (self
, "getThemeById", &retval
, G_TYPE_INT
, theme_id
, G_TYPE_INVALID
)) {
797 if(check_xmlrpc (&retval
, G_TYPE_HASH_TABLE
, &htable
)) {
799 tmp
= g_hash_table_lookup (htable
, "name");
800 name
= g_value_get_string(tmp
);
801 tmp
= g_hash_table_lookup (htable
, "user");
802 user
= g_value_get_string(tmp
);
803 tmp
= g_hash_table_lookup (htable
, "comment");
804 comment
= g_value_get_string(tmp
);
805 tmp
= g_hash_table_lookup (htable
, "preview_button");
806 preview_button
= g_value_get_string(tmp
);
807 tmp
= g_hash_table_lookup (htable
, "folder");
808 folder
= g_value_get_string(tmp
);
809 tmp
= g_hash_table_lookup (htable
, "uploaded");
810 uploaded
= g_value_get_string(tmp
);
811 tmp
= g_hash_table_lookup (htable
, "modified");
812 modified
= g_value_get_string(tmp
);
813 tmp
= g_hash_table_lookup (htable
, "downloaded");
814 downloaded
= g_value_get_string(tmp
);
815 tmp
= g_hash_table_lookup (htable
, "download_count");
816 download_count
= g_value_get_int(tmp
);
817 tmp
= g_hash_table_lookup (htable
, "modified");
818 modified
= g_value_get_string(tmp
);
819 tmp
= g_hash_table_lookup (htable
, "downloaded");
820 downloaded
= g_value_get_string(tmp
);
821 tmp
= g_hash_table_lookup (htable
, "download_count");
822 download_count
= g_value_get_int(tmp
);
824 *theme
= irreco_webdb_theme_new();
826 irreco_webdb_theme_set(*theme
, theme_id
, name
, user
, comment
,
827 preview_button
, NULL
, folder
, uploaded
, modified
,
828 downloaded
, download_count
);
830 irreco_webdb_client_get_theme_versions_by_name(self
, name
, &(*theme
)->versions
);
832 /* Get dates for versions */
833 if ((*theme
)->versions
!= NULL
)
835 IRRECO_STRING_TABLE_FOREACH_KEY((*theme
)->versions
, key
)
836 gchar
*date
= irreco_webdb_client_get_theme_date_by_id(
838 irreco_string_table_change_data ((*theme
)->versions
,
839 key
, (gpointer
) date
);
840 IRRECO_STRING_TABLE_FOREACH_END
843 if (name
!= NULL
) g_free((gchar
*)name
);
844 if (user
!= NULL
) g_free((gchar
*)user
);
845 if (comment
!= NULL
) g_free((gchar
*)comment
);
846 if (preview_button
!= NULL
) g_free((gchar
*)preview_button
);
847 if (folder
!= NULL
) g_free((gchar
*)folder
);
848 if (uploaded
!= NULL
) g_free((gchar
*)uploaded
);
849 if (modified
!= NULL
) g_free((gchar
*)modified
);
850 if (downloaded
!= NULL
) g_free((gchar
*)downloaded
);
852 IRRECO_RETURN_BOOL(TRUE
);
854 IRRECO_RETURN_BOOL(FALSE
);
857 IRRECO_RETURN_BOOL(FALSE
);
861 gboolean
irreco_webdb_client_get_theme_versions_by_name(IrrecoWebdbClient
*self
,
863 IrrecoStringTable
**theme_list
)
871 irreco_webdb_client_reset_env(self
);
872 *theme_list
= irreco_string_table_new(NULL
, NULL
);
874 if(do_xmlrpc (self
, "getThemeVersionsByName", &retval
, G_TYPE_STRING
, name
, G_TYPE_INVALID
)) {
875 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
876 for(i
= 0; i
< array
->n_values
; i
++) {
877 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
878 g_value_array_get_nth(array
, i
)));
879 /*g_print("value: %s\n", g_value_get_string(
880 g_value_array_get_nth(array, i)));*/
881 irreco_string_table_add(*theme_list
,
883 g_value_array_get_nth(array
, i
)),
886 IRRECO_RETURN_BOOL(TRUE
);
888 IRRECO_RETURN_BOOL(FALSE
);
891 IRRECO_RETURN_BOOL(FALSE
);
895 gchar
*irreco_webdb_client_get_theme_date_by_id(IrrecoWebdbClient
*self
,
903 irreco_webdb_client_reset_env(self
);
905 if(do_xmlrpc (self
, "getThemeDateById", &retval
, G_TYPE_INT
, theme_id
, G_TYPE_INVALID
)) {
906 g_print("tyyppinen: %s\n", G_VALUE_TYPE_NAME(&retval
));
907 if(check_xmlrpc (&retval
, G_TYPE_STRING
, &date
)) {
908 IRRECO_RETURN_PTR(date
);
910 IRRECO_RETURN_PTR(date
);
913 IRRECO_RETURN_PTR(date
);
917 gint
irreco_webdb_client_get_theme_id_by_name_and_date(IrrecoWebdbClient
*self
,
926 irreco_webdb_client_reset_env(self
);
928 if(do_xmlrpc (self
, "getThemeIdByNameAndDate", &retval
, G_TYPE_STRING
, name
,
929 G_TYPE_STRING
, date
, G_TYPE_INVALID
)) {
930 if(check_xmlrpc (&retval
, G_TYPE_INT
, &msg
)) {
931 IRRECO_RETURN_INT(msg
);
933 IRRECO_RETURN_INT(0);
936 IRRECO_RETURN_INT(0);
940 gint
irreco_webdb_client_add_bg_to_theme(IrrecoWebdbClient
*self
,
942 const gchar
*image_hash
,
943 const gchar
*image_name
,
949 const gchar
*password
)
957 irreco_webdb_client_reset_env(self
);
959 base64_image
= g_base64_encode(image
, image_len
);
961 if(do_xmlrpc (self
, "addBgToTheme", &retval
, G_TYPE_STRING
, name
, G_TYPE_STRING
, image_hash
,
962 G_TYPE_STRING
, image_name
, G_TYPE_STRING
, base64_image
, G_TYPE_STRING
, folder
,
963 G_TYPE_INT
, theme_id
, G_TYPE_STRING
, user
, G_TYPE_STRING
, password
, G_TYPE_INVALID
)) {
964 if(check_xmlrpc (&retval
, G_TYPE_INT
, &msg
)) {
965 IRRECO_RETURN_INT(msg
);
967 IRRECO_RETURN_INT(0);
970 IRRECO_RETURN_INT(0);
974 gboolean
irreco_webdb_client_get_backgrounds(IrrecoWebdbClient
*self
,
976 IrrecoStringTable
**bg_list
)
984 irreco_webdb_client_reset_env(self
);
985 *bg_list
= irreco_string_table_new(NULL
, NULL
);
987 if(do_xmlrpc (self
, "getBackgrounds", &retval
, G_TYPE_INT
, theme_id
, G_TYPE_INVALID
)) {
988 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
989 for(i
= 0; i
< array
->n_values
; i
++) {
990 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
991 g_value_array_get_nth(array
, i
)));
992 /*g_print("value: %s\n", g_value_get_string(
993 g_value_array_get_nth(array, i)));*/
994 irreco_string_table_add(*bg_list
,
995 g_strdup_printf("%d", g_value_get_int(
996 g_value_array_get_nth(array
, i
))),
999 IRRECO_RETURN_BOOL(TRUE
);
1001 IRRECO_RETURN_BOOL(FALSE
);
1004 IRRECO_RETURN_BOOL(FALSE
);
1009 gboolean
irreco_webdb_client_get_bg_by_id(IrrecoWebdbClient
*self
,
1011 const char *theme_bg_dir
)
1016 gchar
*image_hash
= NULL
;
1017 gchar
*image_name
= NULL
;
1018 gchar
*image_data
= NULL
;
1019 gchar
*folder
= NULL
;
1020 gchar
*base64_image
= NULL
;
1021 GString
*image_path
= g_string_new(theme_bg_dir
);
1022 GString
*keyfile_path
= g_string_new(theme_bg_dir
);
1023 GKeyFile
*keyfile
= g_key_file_new();
1028 irreco_webdb_client_reset_env(self
);
1030 if(do_xmlrpc (self
, "getBgById", &retval
, G_TYPE_INT
, bg_id
, G_TYPE_INVALID
)) {
1031 if(check_xmlrpc (&retval
, G_TYPE_HASH_TABLE
, &htable
)) {
1033 tmp
= g_hash_table_lookup (htable
, "name");
1034 name
= (gchar
*) g_value_get_string(tmp
);
1035 tmp
= g_hash_table_lookup (htable
, "image_hash");
1036 image_hash
= (gchar
*) g_value_get_string(tmp
);
1037 tmp
= g_hash_table_lookup (htable
, "image_name");
1038 image_name
= (gchar
*) g_value_get_string(tmp
);
1039 tmp
= g_hash_table_lookup (htable
, "image_data");
1040 base64_image
= (gchar
*) g_value_get_string(tmp
);
1041 tmp
= g_hash_table_lookup (htable
, "folder");
1042 folder
= (gchar
*) g_value_get_string(tmp
);
1045 g_string_append_printf(image_path
, "/%s", folder
);
1046 IRRECO_DEBUG("mkdir %s\n",image_path
->str
);
1047 g_mkdir(image_path
->str
, 0777);
1049 /* Save image to folder */
1050 image_data
= (gchar
*) g_base64_decode(base64_image
, &base64_len
);
1051 g_string_append_printf(image_path
, "/%s", image_name
);
1052 irreco_write_file(image_path
->str
, image_data
, base64_len
);
1054 /* Create keyfile and save it to folder*/
1055 irreco_gkeyfile_set_string(keyfile
, "theme-bg" , "name", name
);
1056 irreco_gkeyfile_set_string(keyfile
, "theme-bg", "image", image_name
);
1057 g_string_append_printf(keyfile_path
, "/%s/bg.conf", folder
);
1058 irreco_write_keyfile(keyfile
, keyfile_path
->str
);
1060 if (name
!= NULL
) g_free(name
);
1061 if (image_hash
!= NULL
) g_free(image_hash
);
1062 if (image_name
!= NULL
) g_free(image_name
);
1063 if (image_data
!= NULL
) g_free(image_data
);
1064 if (base64_image
!= NULL
) g_free(base64_image
);
1065 if (folder
!= NULL
) g_free(folder
);
1067 g_key_file_free(keyfile
);
1068 g_string_free(keyfile_path
, TRUE
);
1069 g_string_free(image_path
, TRUE
);
1070 IRRECO_RETURN_BOOL(TRUE
);
1072 g_key_file_free(keyfile
);
1073 g_string_free(keyfile_path
, TRUE
);
1074 g_string_free(image_path
, TRUE
);
1075 IRRECO_RETURN_BOOL(FALSE
);
1078 g_key_file_free(keyfile
);
1079 g_string_free(keyfile_path
, TRUE
);
1080 g_string_free(image_path
, TRUE
);
1081 IRRECO_RETURN_BOOL(FALSE
);
1085 gint
irreco_webdb_client_add_button_to_theme(IrrecoWebdbClient
*self
,
1087 gboolean allow_text
,
1088 const gchar
*text_format_up
,
1089 const gchar
*text_format_down
,
1091 gfloat text_h_align
,
1092 gfloat text_v_align
,
1093 const gchar
*image_up_hash
,
1094 const gchar
*image_up_name
,
1095 const guchar
*image_up
,
1097 const gchar
*image_down_hash
,
1098 const gchar
*image_down_name
,
1099 const guchar
*image_down
,
1100 gint image_down_len
,
1101 const gchar
*folder
,
1104 const gchar
*password
)
1108 gchar
*base64_image_up
;
1109 gchar
*base64_image_down
;
1113 base64_image_up
= g_base64_encode(image_up
, image_up_len
);
1114 base64_image_down
= g_base64_encode(image_down
, image_down_len
);
1116 irreco_webdb_client_reset_env(self
);
1118 if(do_xmlrpc (self
, "addButtonToTheme", &retval
, G_TYPE_STRING
, name
, G_TYPE_BOOLEAN
, allow_text
,
1119 G_TYPE_STRING
, text_format_up
, G_TYPE_STRING
, text_format_down
, G_TYPE_INT
, text_padding
,
1120 G_TYPE_DOUBLE
, text_h_align
, G_TYPE_DOUBLE
, text_v_align
, G_TYPE_STRING
, image_up_hash
,
1121 G_TYPE_STRING
, image_up_name
, G_TYPE_STRING
, base64_image_up
, G_TYPE_STRING
, image_down_hash
,
1122 G_TYPE_STRING
, image_down_name
, G_TYPE_STRING
, base64_image_down
, G_TYPE_STRING
, folder
,
1123 G_TYPE_INT
, theme_id
, G_TYPE_STRING
, user
, G_TYPE_STRING
, password
, G_TYPE_INVALID
)) {
1124 if(check_xmlrpc (&retval
, G_TYPE_INT
, &msg
)) {
1125 g_free(base64_image_up
);
1126 g_free(base64_image_down
);
1127 IRRECO_RETURN_INT(msg
);
1129 g_free(base64_image_up
);
1130 g_free(base64_image_down
);
1131 IRRECO_RETURN_INT(0);
1134 g_free(base64_image_up
);
1135 g_free(base64_image_down
);
1136 IRRECO_RETURN_INT(0);
1140 gboolean
irreco_webdb_client_get_buttons(IrrecoWebdbClient
*self
,
1142 IrrecoStringTable
**button_list
)
1151 irreco_webdb_client_reset_env(self
);
1152 *button_list
= irreco_string_table_new(NULL
, NULL
);
1154 if(do_xmlrpc (self
, "getButtons", &retval
, G_TYPE_INT
, theme_id
, G_TYPE_INVALID
)) {
1155 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
1156 for(i
= 0; i
< array
->n_values
; i
++) {
1157 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
1158 g_value_array_get_nth(array
, i
)));
1159 /*g_print("value: %s\n", g_value_get_string(
1160 g_value_array_get_nth(array, i)));*/
1161 irreco_string_table_add(*button_list
,
1162 g_strdup_printf("%d", g_value_get_int(
1163 g_value_array_get_nth(array
, i
))),
1166 IRRECO_RETURN_INT(msg
);
1168 IRRECO_RETURN_INT(0);
1171 IRRECO_RETURN_INT(0);
1176 gboolean
irreco_webdb_client_get_button_by_id(IrrecoWebdbClient
*self
,
1178 const char *theme_button_dir
)
1183 gboolean allow_text
= FALSE
;
1184 gchar
*text_format_up
= NULL
;
1185 gchar
*text_format_down
= NULL
;
1187 gdouble text_h_align
;
1188 gdouble text_v_align
;
1189 gchar
*image_up_hash
= NULL
;
1190 gchar
*image_up_name
= NULL
;
1191 gchar
*image_up
= NULL
;
1192 gchar
*base64_image_up
= NULL
;
1193 gchar
*image_down_hash
= NULL
;
1194 gchar
*image_down_name
= NULL
;
1195 gchar
*image_down
= NULL
;
1196 gchar
*base64_image_down
= NULL
;
1197 gchar
*folder
= NULL
;
1198 gchar
*image_down_hash_tmp
= NULL
;
1199 GString
*file_path
= g_string_new("");
1200 GKeyFile
*keyfile
= g_key_file_new();
1201 gsize image_down_len
;
1206 irreco_webdb_client_reset_env(self
);
1208 if(do_xmlrpc (self
, "getButtonById", &retval
, G_TYPE_INT
, button_id
, G_TYPE_INVALID
)) {
1209 if(check_xmlrpc (&retval
, G_TYPE_HASH_TABLE
, &htable
)) {
1211 tmp
= g_hash_table_lookup (htable
, "name");
1212 name
= (gchar
*) g_value_get_string(tmp
);
1213 tmp
= g_hash_table_lookup (htable
, "allow_text");
1214 allow_text
= g_value_get_boolean(tmp
);
1215 tmp
= g_hash_table_lookup (htable
, "text_format_up");
1216 text_format_up
= (gchar
*) g_value_get_string(tmp
);
1217 tmp
= g_hash_table_lookup (htable
, "text_format_down");
1218 text_format_down
= (gchar
*) g_value_get_string(tmp
);
1219 tmp
= g_hash_table_lookup (htable
, "text_padding");
1220 text_padding
= g_value_get_int(tmp
);
1221 tmp
= g_hash_table_lookup (htable
, "text_h_align");
1222 text_h_align
= g_value_get_double(tmp
);
1223 tmp
= g_hash_table_lookup (htable
, "text_v_align");
1224 text_v_align
= g_value_get_double(tmp
);
1225 tmp
= g_hash_table_lookup (htable
, "image_up_hash");
1226 image_up_hash
= (gchar
*) g_value_get_string(tmp
);
1227 tmp
= g_hash_table_lookup (htable
, "image_up_name");
1228 image_up_name
= (gchar
*) g_value_get_string(tmp
);
1229 tmp
= g_hash_table_lookup (htable
, "image_up");
1230 base64_image_up
= (gchar
*) g_value_get_string(tmp
);
1231 tmp
= g_hash_table_lookup (htable
, "image_down_hash");
1232 image_down_hash
= (gchar
*) g_value_get_string(tmp
);
1233 tmp
= g_hash_table_lookup (htable
, "image_down_name");
1234 image_down_name
= (gchar
*) g_value_get_string(tmp
);
1235 tmp
= g_hash_table_lookup (htable
, "image_down");
1236 base64_image_down
= (gchar
*) g_value_get_string(tmp
);
1237 tmp
= g_hash_table_lookup (htable
, "folder");
1238 folder
= (gchar
*) g_value_get_string(tmp
);
1241 g_string_printf(file_path
, "%s/%s", theme_button_dir
, folder
);
1242 IRRECO_DEBUG("mkdir %s\n",file_path
->str
);
1243 g_mkdir(file_path
->str
, 0777);
1245 /* Save image_up to folder */
1246 g_string_printf(file_path
, "%s/%s/%s", theme_button_dir
, folder
,
1248 image_up
= (gchar
*) g_base64_decode(base64_image_up
, &image_up_len
);
1249 irreco_write_file(file_path
->str
, image_up
, image_up_len
);
1251 /* Save image_down to folder */
1252 g_string_printf(file_path
, "%s/%s/%s", theme_button_dir
, folder
,
1255 /*Check image hash data*/
1256 image_down
= (gchar
*) g_base64_decode(base64_image_down
,
1258 irreco_write_file(file_path
->str
, image_down
, image_down_len
);
1259 image_down_hash_tmp
= g_compute_checksum_for_string(G_CHECKSUM_SHA1
,
1260 image_down
, image_down_len
);
1262 /* Create keyfile and save it to folder*/
1263 irreco_gkeyfile_set_string(keyfile
, "theme-button" , "name", name
);
1266 irreco_gkeyfile_set_string(keyfile
, "theme-button",
1267 "allow-text", "true");
1269 irreco_gkeyfile_set_string(keyfile
, "theme-button",
1270 "allow-text", "false");
1273 irreco_gkeyfile_set_string(keyfile
, "theme-button",
1274 "up", image_up_name
);
1276 irreco_gkeyfile_set_string(keyfile
, "theme-button",
1277 "down", image_down_name
);
1279 if (text_format_up
!= NULL
&& strlen(text_format_up
) > 0) {
1280 irreco_gkeyfile_set_string(keyfile
, "theme-button",
1281 "text-format-up", text_format_up
);
1284 if (text_format_down
!= NULL
&& strlen(text_format_down
) > 0) {
1285 irreco_gkeyfile_set_string(keyfile
, "theme-button",
1286 "text-format-down", text_format_down
);
1289 irreco_gkeyfile_set_glong(keyfile
, "theme-button",
1290 "text-padding", (glong
)text_padding
);
1292 irreco_gkeyfile_set_gfloat(keyfile
, "theme-button",
1293 "text-h-align", (gfloat
) text_h_align
);
1295 irreco_gkeyfile_set_gfloat(keyfile
, "theme-button",
1296 "text-v-align", (gfloat
) text_v_align
);
1298 g_string_printf(file_path
, "%s/%s/button.conf",
1299 theme_button_dir
, folder
);
1300 irreco_write_keyfile(keyfile
, file_path
->str
);
1302 if (name
!= NULL
) g_free(name
);
1303 if (text_format_up
!= NULL
) g_free(text_format_up
);
1304 if (text_format_down
!= NULL
) g_free(text_format_down
);
1305 if (image_up_hash
!= NULL
) g_free(image_up_hash
);
1306 if (image_up_name
!= NULL
) g_free(image_up_name
);
1307 if (image_up
!= NULL
) g_free(image_up
);
1308 if (base64_image_up
!= NULL
) g_free(base64_image_up
);
1309 if (image_down_hash
!= NULL
) g_free(image_down_hash
);
1310 if (image_down_name
!= NULL
) g_free(image_down_name
);
1311 if (image_down
!= NULL
) g_free(image_down
);
1312 if (image_down_hash_tmp
!= NULL
) g_free(image_down_hash_tmp
);
1313 if (base64_image_down
!= NULL
) g_free(base64_image_down
);
1314 if (folder
!= NULL
) g_free(folder
);
1316 g_key_file_free(keyfile
);
1317 g_string_free(file_path
, TRUE
);
1319 IRRECO_RETURN_BOOL(TRUE
);
1321 if (name
!= NULL
) g_free(name
);
1322 if (text_format_up
!= NULL
) g_free(text_format_up
);
1323 if (text_format_down
!= NULL
) g_free(text_format_down
);
1324 if (image_up_hash
!= NULL
) g_free(image_up_hash
);
1325 if (image_up_name
!= NULL
) g_free(image_up_name
);
1326 if (image_up
!= NULL
) g_free(image_up
);
1327 if (base64_image_up
!= NULL
) g_free(base64_image_up
);
1328 if (image_down_hash
!= NULL
) g_free(image_down_hash
);
1329 if (image_down_name
!= NULL
) g_free(image_down_name
);
1330 if (image_down
!= NULL
) g_free(image_down
);
1331 if (image_down_hash_tmp
!= NULL
) g_free(image_down_hash_tmp
);
1332 if (base64_image_down
!= NULL
) g_free(base64_image_down
);
1333 if (folder
!= NULL
) g_free(folder
);
1335 g_key_file_free(keyfile
);
1336 g_string_free(file_path
, TRUE
);
1337 IRRECO_RETURN_BOOL(FALSE
);
1340 IRRECO_RETURN_BOOL(FALSE
);
1344 gboolean
irreco_webdb_client_get_preview_button(IrrecoWebdbClient
*self
,
1346 GdkPixbuf
**preview_button
)
1349 gchar
*base64_data
= NULL
;
1352 GdkPixbufLoader
*pl
;
1353 GError
*error
= NULL
;
1357 irreco_webdb_client_reset_env(self
);
1359 if(do_xmlrpc (self
, "getPreviewButton", &retval
, G_TYPE_INT
, theme_id
, G_TYPE_INVALID
)) {
1360 if(check_xmlrpc (&retval
, G_TYPE_STRING
, &base64_data
)) {
1361 data
= g_base64_decode(base64_data
, &len
);
1362 pl
= gdk_pixbuf_loader_new();
1363 gdk_pixbuf_loader_write(pl
, data
, len
, &error
);
1367 /*g_string_printf(self->error_msg, "ERROR: %s", error->message);*/
1368 IRRECO_DEBUG("%s\n", error
->message
);
1369 if (base64_data
!= NULL
) g_free(base64_data
);
1370 IRRECO_RETURN_BOOL(FALSE
);
1373 gdk_pixbuf_loader_close(pl
, NULL
);
1374 *preview_button
= gdk_pixbuf_loader_get_pixbuf(pl
);
1376 if (base64_data
!= NULL
) g_free(base64_data
);
1378 IRRECO_RETURN_BOOL(TRUE
);
1380 IRRECO_RETURN_BOOL(FALSE
);
1383 IRRECO_RETURN_BOOL(FALSE
);
1387 gboolean
irreco_webdb_client_add_user(IrrecoWebdbClient
*self
,
1390 const gchar
*passwd
)
1397 irreco_webdb_client_reset_env(self
);
1399 if(do_xmlrpc (self
, "addUser", &retval
, G_TYPE_STRING
, name
, G_TYPE_STRING
, email
,
1400 G_TYPE_STRING
, passwd
, G_TYPE_INVALID
)) {
1401 if(check_xmlrpc (&retval
, G_TYPE_BOOLEAN
, &msg
)) {
1402 IRRECO_RETURN_BOOL(msg
);
1404 IRRECO_RETURN_BOOL(FALSE
);
1407 IRRECO_RETURN_BOOL(FALSE
);
1412 * Login user to WebDB.
1415 gboolean
irreco_webdb_client_login(IrrecoWebdbClient
*self
,
1417 const gchar
*password
)
1424 irreco_webdb_client_reset_env(self
);
1426 if(do_xmlrpc (self
, "loginToDB", &retval
, G_TYPE_STRING
, user
, G_TYPE_STRING
, password
, G_TYPE_INVALID
)) {
1427 if(check_xmlrpc (&retval
, G_TYPE_BOOLEAN
, &msg
)) {
1428 IRRECO_RETURN_BOOL(msg
);
1430 IRRECO_RETURN_BOOL(FALSE
);
1433 IRRECO_RETURN_BOOL(FALSE
);
1437 gint
irreco_webdb_client_create_new_remote(IrrecoWebdbClient
*self
,
1438 const gchar
*comment
,
1439 const gchar
*category
,
1440 const gchar
*manufacturer
,
1442 const gchar
*file_name
,
1443 const gchar
*file_data
,
1445 const gchar
*password
)
1453 irreco_webdb_client_reset_env(self
);
1454 file_hash
= g_compute_checksum_for_string(G_CHECKSUM_SHA1
, file_data
, -1);
1456 if(do_xmlrpc (self
, "createNewRemote", &retval
, G_TYPE_STRING
, comment
, G_TYPE_STRING
, category
,
1457 G_TYPE_STRING
, manufacturer
, G_TYPE_STRING
, model
, G_TYPE_STRING
, file_hash
,
1458 G_TYPE_STRING
, file_name
, G_TYPE_STRING
, file_data
, G_TYPE_STRING
, user
,
1459 G_TYPE_STRING
, password
, G_TYPE_INVALID
)) {
1460 if(check_xmlrpc (&retval
, G_TYPE_INT
, &msg
)) {
1461 IRRECO_RETURN_INT(msg
);
1463 IRRECO_RETURN_INT(0);
1466 IRRECO_RETURN_INT(0);
1470 gboolean
irreco_webdb_client_set_remote_downloadable(IrrecoWebdbClient
*self
,
1472 gboolean downloadable
,
1474 const gchar
*password
)
1481 irreco_webdb_client_reset_env(self
);
1483 if(do_xmlrpc (self
, "setRemoteDownloadable", &retval
, G_TYPE_INT
, id
,
1484 G_TYPE_BOOLEAN
, downloadable
, G_TYPE_STRING
, user
, G_TYPE_STRING
, password
, G_TYPE_INVALID
)) {
1485 if(check_xmlrpc (&retval
, G_TYPE_BOOLEAN
, &msg
)) {
1486 IRRECO_RETURN_BOOL(msg
);
1488 IRRECO_RETURN_BOOL(FALSE
);
1491 IRRECO_RETURN_BOOL(FALSE
);
1495 gboolean
irreco_webdb_client_add_configuration_to_remote(
1496 IrrecoWebdbClient
*self
,
1498 gint configuration_id
,
1500 const gchar
*password
)
1507 irreco_webdb_client_reset_env(self
);
1509 if(do_xmlrpc (self
, "addConfigurationToRemote", &retval
, G_TYPE_INT
, remote_id
,
1510 G_TYPE_INT
, configuration_id
, G_TYPE_STRING
, user
, G_TYPE_STRING
, password
, G_TYPE_INVALID
)) {
1511 if(check_xmlrpc (&retval
, G_TYPE_BOOLEAN
, &msg
)) {
1512 IRRECO_RETURN_BOOL(msg
);
1514 IRRECO_RETURN_BOOL(FALSE
);
1517 IRRECO_RETURN_BOOL(FALSE
);
1521 gboolean
irreco_webdb_client_add_theme_to_remote(IrrecoWebdbClient
*self
,
1525 const gchar
*password
)
1532 irreco_webdb_client_reset_env(self
);
1534 if(do_xmlrpc (self
, "addThemeToRemote", &retval
, G_TYPE_INT
, remote_id
,
1535 G_TYPE_INT
, theme_id
, G_TYPE_STRING
, user
, G_TYPE_STRING
, password
, G_TYPE_INVALID
)) {
1536 if(check_xmlrpc (&retval
, G_TYPE_BOOLEAN
, &msg
)) {
1537 IRRECO_RETURN_BOOL(msg
);
1539 IRRECO_RETURN_BOOL(FALSE
);
1542 IRRECO_RETURN_BOOL(FALSE
);
1546 gboolean
irreco_webdb_client_get_remote_categories(IrrecoWebdbClient
*self
,
1547 IrrecoStringTable
**category_list
)
1555 irreco_webdb_client_reset_env(self
);
1556 *category_list
= irreco_string_table_new(NULL
, NULL
);
1558 if(do_xmlrpc (self
, "getRemoteCategories", &retval
, G_TYPE_INVALID
)) {
1559 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
1560 for(i
= 0; i
< array
->n_values
; i
++) {
1561 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
1562 g_value_array_get_nth(array
, i
)));
1563 /*g_print("value: %s\n", g_value_get_string(
1564 g_value_array_get_nth(array, i)));*/
1565 irreco_string_table_add(*category_list
,
1567 g_value_array_get_nth(array
, i
)),
1570 IRRECO_RETURN_BOOL(TRUE
);
1572 IRRECO_RETURN_BOOL(FALSE
); /* Failed check_xmlrpc */
1575 IRRECO_RETURN_BOOL(FALSE
); /* Failed do_xmlrpc */
1579 gboolean
irreco_webdb_client_get_remote_manufacturers(IrrecoWebdbClient
*self
,
1580 const gchar
*category
,
1581 IrrecoStringTable
**manufacturer_list
)
1589 irreco_webdb_client_reset_env(self
);
1590 *manufacturer_list
= irreco_string_table_new(NULL
, NULL
);
1592 if(do_xmlrpc (self
, "getRemoteManufacturers", &retval
, G_TYPE_STRING
, category
, G_TYPE_INVALID
)) {
1593 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
1594 for(i
= 0; i
< array
->n_values
; i
++) {
1595 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
1596 g_value_array_get_nth(array
, i
)));
1597 /*g_print("value: %s\n", g_value_get_string(
1598 g_value_array_get_nth(array, i)));*/
1599 irreco_string_table_add(*manufacturer_list
,
1601 g_value_array_get_nth(array
, i
)),
1604 IRRECO_RETURN_BOOL(TRUE
);
1606 IRRECO_RETURN_BOOL(FALSE
); /* Failed check_xmlrpc */
1609 IRRECO_RETURN_BOOL(FALSE
); /* Failed do_xmlrpc */
1613 gboolean
irreco_webdb_client_get_remote_models(IrrecoWebdbClient
*self
,
1614 const gchar
*category
,
1615 const gchar
*manufacturer
,
1616 IrrecoStringTable
**model_list
)
1624 irreco_webdb_client_reset_env(self
);
1625 *model_list
= irreco_string_table_new(NULL
, NULL
);
1627 if(do_xmlrpc (self
, "getRemoteModels", &retval
, G_TYPE_STRING
, category
,
1628 G_TYPE_STRING
, manufacturer
, G_TYPE_INVALID
)) {
1629 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
1630 for(i
= 0; i
< array
->n_values
; i
++) {
1631 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
1632 g_value_array_get_nth(array
, i
)));
1633 /*g_print("value: %s\n", g_value_get_string(
1634 g_value_array_get_nth(array, i)));*/
1635 irreco_string_table_add(*model_list
,
1637 g_value_array_get_nth(array
, i
)),
1640 IRRECO_RETURN_BOOL(TRUE
);
1642 IRRECO_RETURN_BOOL(FALSE
); /* Failed check_xmlrpc */
1645 IRRECO_RETURN_BOOL(FALSE
); /* Failed do_xmlrpc */
1649 gboolean
irreco_webdb_client_get_remote_creators(IrrecoWebdbClient
*self
,
1650 const gchar
*category
,
1651 const gchar
*manufacturer
,
1653 IrrecoStringTable
**creators
)
1661 irreco_webdb_client_reset_env(self
);
1662 *creators
= irreco_string_table_new(NULL
, NULL
);
1664 if(do_xmlrpc (self
, "getRemoteCreators", &retval
, G_TYPE_STRING
, category
,
1665 G_TYPE_STRING
, manufacturer
, G_TYPE_STRING
, model
, G_TYPE_INVALID
)) {
1666 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
1667 for(i
= 0; i
< array
->n_values
; i
++) {
1668 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
1669 g_value_array_get_nth(array
, i
)));
1670 /*g_print("value: %s\n", g_value_get_string(
1671 g_value_array_get_nth(array, i)));*/
1672 irreco_string_table_add(*creators
,
1674 g_value_array_get_nth(array
, i
)),
1677 IRRECO_RETURN_BOOL(TRUE
);
1679 IRRECO_RETURN_BOOL(FALSE
); /* Failed check_xmlrpc */
1682 IRRECO_RETURN_BOOL(FALSE
); /* Failed do_xmlrpc */
1686 gboolean
irreco_webdb_client_get_remotes(IrrecoWebdbClient
*self
,
1687 const gchar
*category
,
1688 const gchar
*manufacturer
,
1690 const gchar
*creator
,
1691 GList
**remote_list
)
1699 irreco_webdb_client_reset_env(self
);
1700 *remote_list
= NULL
;
1702 if(do_xmlrpc (self
, "getRemotes", &retval
, G_TYPE_STRING
, category
, G_TYPE_STRING
,
1703 manufacturer
, G_TYPE_STRING
, model
, G_TYPE_STRING
, creator
, G_TYPE_INVALID
)) {
1704 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
1705 for(i
= 0; i
< array
->n_values
; i
++) {
1706 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
1707 g_value_array_get_nth(array
, i
)));
1708 g_print("value: %d\n", g_value_get_int(
1709 g_value_array_get_nth(array
, i
)));
1710 *remote_list
= g_list_append(*remote_list
,
1711 GINT_TO_POINTER(g_value_get_int(
1712 g_value_array_get_nth(array
, i
))));
1715 *remote_list
= g_list_first(*remote_list
);
1716 IRRECO_RETURN_BOOL(TRUE
);
1718 IRRECO_RETURN_BOOL(FALSE
); /* Failed check_xmlrpc */
1721 IRRECO_RETURN_BOOL(FALSE
); /* Failed do_xmlrpc */
1725 gboolean
irreco_webdb_client_get_remote_by_id(IrrecoWebdbClient
*self
,
1727 IrrecoWebdbRemote
**remote
)
1730 const gchar
*user
= NULL
;
1731 const gchar
*comment
= NULL
;
1732 const gchar
*category
= NULL
;
1733 const gchar
*manufacturer
= NULL
;
1734 const gchar
*model
= NULL
;
1735 const gchar
*file_hash
= NULL
;
1736 const gchar
*file_name
= NULL
;
1737 const gchar
*uploaded
= NULL
;
1738 const gchar
*modified
= NULL
;
1739 const gchar
*downloaded
= NULL
;
1740 gint download_count
;
1745 irreco_webdb_client_reset_env(self
);
1747 if(do_xmlrpc (self
, "getRemoteById", &retval
, G_TYPE_INT
, id
, G_TYPE_INVALID
)) {
1748 if(check_xmlrpc (&retval
, G_TYPE_HASH_TABLE
, &htable
)) {
1750 tmp
= g_hash_table_lookup (htable
, "user");
1751 user
= g_value_get_string(tmp
);
1752 tmp
= g_hash_table_lookup (htable
, "comment");
1753 comment
= g_value_get_string(tmp
);
1754 tmp
= g_hash_table_lookup (htable
, "category");
1755 category
= g_value_get_string(tmp
);
1756 tmp
= g_hash_table_lookup (htable
, "manufacturer");
1757 manufacturer
= g_value_get_string(tmp
);
1758 tmp
= g_hash_table_lookup (htable
, "model");
1759 model
= g_value_get_string(tmp
);
1760 tmp
= g_hash_table_lookup (htable
, "file_hash");
1761 file_hash
= g_value_get_string(tmp
);
1762 tmp
= g_hash_table_lookup (htable
, "file_name");
1763 file_name
= g_value_get_string(tmp
);
1764 tmp
= g_hash_table_lookup (htable
, "uploaded");
1765 uploaded
= g_value_get_string(tmp
);
1766 tmp
= g_hash_table_lookup (htable
, "modified");
1767 modified
= g_value_get_string(tmp
);
1768 tmp
= g_hash_table_lookup (htable
, "downloaded");
1769 downloaded
= g_value_get_string(tmp
);
1770 tmp
= g_hash_table_lookup (htable
, "download_count");
1771 download_count
= g_value_get_int(tmp
);
1773 /* g_print("blbbi: %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %d", user, comment, category,
1774 manufacturer, model, file_hash, file_name, uploaded, modified, downloaded, download_count);*/
1776 *remote
= irreco_webdb_remote_new();
1777 irreco_webdb_remote_set(*remote
, id
, user
, comment
, category
,
1778 manufacturer
, model
, file_hash
, file_name
,
1779 uploaded
, modified
, downloaded
, download_count
);
1781 if (user
!= NULL
) g_free((gchar
*)user
);
1782 if (comment
!= NULL
) g_free((gchar
*)comment
);
1783 if (category
!= NULL
) g_free((gchar
*)category
);
1784 if (manufacturer
!= NULL
) g_free((gchar
*)manufacturer
);
1785 if (model
!= NULL
) g_free((gchar
*)model
);
1786 if (file_hash
!= NULL
) g_free((gchar
*)file_hash
);
1787 if (file_name
!= NULL
) g_free((gchar
*)file_name
);
1788 if (uploaded
!= NULL
) g_free((gchar
*)uploaded
);
1789 if (modified
!= NULL
) g_free((gchar
*)modified
);
1790 if (downloaded
!= NULL
) g_free((gchar
*)downloaded
);
1792 IRRECO_RETURN_BOOL(TRUE
);
1795 IRRECO_RETURN_BOOL(FALSE
);
1798 IRRECO_RETURN_BOOL(FALSE
);
1803 gboolean
irreco_webdb_client_get_themes_of_remote(IrrecoWebdbClient
*self
,
1813 irreco_webdb_client_reset_env(self
);
1816 if(do_xmlrpc (self
, "getThemesOfRemote", &retval
, G_TYPE_INT
, remote_id
, G_TYPE_INVALID
)) {
1817 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
1818 for(i
= 0; i
< array
->n_values
; i
++) {
1819 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
1820 g_value_array_get_nth(array
, i
)));
1821 g_print("value: %d\n", g_value_get_int(
1822 g_value_array_get_nth(array
, i
)));
1823 *themes
= g_list_append(*themes
,
1824 GINT_TO_POINTER(g_value_get_int(
1825 g_value_array_get_nth(array
, i
))));
1828 *themes
= g_list_first(*themes
);
1829 IRRECO_RETURN_BOOL(TRUE
);
1831 IRRECO_RETURN_BOOL(FALSE
); /* Failed check_xmlrpc */
1834 IRRECO_RETURN_BOOL(FALSE
); /* Failed do_xmlrpc */
1839 gboolean
irreco_webdb_client_get_configurations_of_remote(
1840 IrrecoWebdbClient
*self
,
1850 irreco_webdb_client_reset_env(self
);
1853 if(do_xmlrpc (self
, "getConfigurationsOfRemote", &retval
, G_TYPE_INT
, remote_id
, G_TYPE_INVALID
)) {
1854 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
1855 for(i
= 0; i
< array
->n_values
; i
++) {
1856 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
1857 g_value_array_get_nth(array
, i
)));
1858 g_print("value: %d\n", g_value_get_int(
1859 g_value_array_get_nth(array
, i
)));
1860 *configs
= g_list_append(*configs
,
1861 GINT_TO_POINTER(g_value_get_int(
1862 g_value_array_get_nth(array
, i
))));
1865 *configs
= g_list_first(*configs
);
1866 IRRECO_RETURN_BOOL(TRUE
);
1868 IRRECO_RETURN_BOOL(FALSE
); /* Failed check_xmlrpc */
1871 IRRECO_RETURN_BOOL(FALSE
); /* Failed do_xmlrpc */
1875 gboolean
irreco_webdb_client_get_remote_data(IrrecoWebdbClient
*self
,
1878 {/* #define IRRECO_WEBDB_URL "http://localhost/irreco/webdb/" */
1885 irreco_webdb_client_reset_env(self
);
1887 if(do_xmlrpc (self
, "getRemoteData", &retval
, G_TYPE_INT
, remote_id
, G_TYPE_INVALID
)) {
1888 if(check_xmlrpc (&retval
, G_TYPE_HASH_TABLE
, &htable
)) {
1890 tmp
= g_hash_table_lookup (htable
, "data");
1891 *file_data
= (gchar
*) g_value_get_string(tmp
);
1892 IRRECO_RETURN_BOOL(TRUE
);
1894 IRRECO_RETURN_BOOL(FALSE
);
1897 IRRECO_RETURN_BOOL(FALSE
);
1901 gboolean
irreco_webdb_client_get_lirc_dirs(IrrecoWebdbClient
*self
,
1902 IrrecoStringTable
**dir_list
)
1910 irreco_webdb_client_reset_env(self
);
1911 *dir_list
= irreco_string_table_new(NULL
, NULL
);
1913 if(do_xmlrpc (self
, "getLircDirs", &retval
, G_TYPE_INVALID
)) {
1914 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
1915 for(i
= 0; i
< array
->n_values
; i
++) {
1916 g_print("%d value type is: %s\n", i
, G_VALUE_TYPE_NAME(
1917 g_value_array_get_nth(array
, i
)));
1918 irreco_string_table_add(*dir_list
,
1920 g_value_array_get_nth(array
, i
)),
1923 IRRECO_RETURN_BOOL(TRUE
);
1925 IRRECO_RETURN_BOOL(FALSE
);
1928 IRRECO_RETURN_BOOL(FALSE
);
1932 gboolean
irreco_webdb_client_get_lirc_manufacturers(IrrecoWebdbClient
*self
,
1934 IrrecoStringTable
**manufacturer_list
)
1942 irreco_webdb_client_reset_env(self
);
1943 *manufacturer_list
= irreco_string_table_new(NULL
, NULL
);
1945 if(do_xmlrpc (self
, "getLircManufacturers", &retval
, G_TYPE_STRING
, range
, G_TYPE_INVALID
)) {
1946 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
1947 for(i
= 0; i
< array
->n_values
; i
++) {
1948 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
1949 g_value_array_get_nth(array
, i
)));
1950 irreco_string_table_add(*manufacturer_list
,
1952 g_value_array_get_nth(array
, i
)),
1955 IRRECO_RETURN_BOOL(TRUE
);
1957 IRRECO_RETURN_BOOL(FALSE
);
1960 IRRECO_RETURN_BOOL(FALSE
);
1964 gboolean
irreco_webdb_client_get_lirc_models(IrrecoWebdbClient
*self
,
1965 const gchar
*manufacturer
,
1966 IrrecoStringTable
**model_list
)
1974 irreco_webdb_client_reset_env(self
);
1975 *model_list
= irreco_string_table_new(NULL
, NULL
);
1977 if(do_xmlrpc (self
, "getLircModels", &retval
, G_TYPE_STRING
, manufacturer
, G_TYPE_INVALID
)) {
1978 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
1979 for(i
= 0; i
< array
->n_values
; i
++) {
1980 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
1981 g_value_array_get_nth(array
, i
)));
1982 irreco_string_table_add(*model_list
,
1984 g_value_array_get_nth(array
, i
)),
1987 IRRECO_RETURN_BOOL(TRUE
);
1989 IRRECO_RETURN_BOOL(FALSE
);
1992 IRRECO_RETURN_BOOL(FALSE
);
1996 gboolean
irreco_webdb_client_get_lirc_file(IrrecoWebdbClient
*self
,
1998 IrrecoStringTable
**file
)
2006 irreco_webdb_client_reset_env(self
);
2007 *file
= irreco_string_table_new(NULL
, NULL
);
2009 if(do_xmlrpc (self
, "getLircFile", &retval
, G_TYPE_STRING
, model
, G_TYPE_INVALID
)) {
2010 if(check_xmlrpc (&retval
, G_TYPE_VALUE_ARRAY
, &array
)) {
2011 for(i
= 0; i
< array
->n_values
; i
++) {
2012 g_print("%d value is: %s\n", i
, G_VALUE_TYPE_NAME(
2013 g_value_array_get_nth(array
, i
)));
2014 irreco_string_table_add(*file
,
2016 g_value_array_get_nth(array
, i
)),
2019 IRRECO_RETURN_BOOL(TRUE
);
2021 IRRECO_RETURN_BOOL(FALSE
);
2024 IRRECO_RETURN_BOOL(FALSE
);
2031 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
2032 /* Events and Callbacks */
2033 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/