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 (t5masa02@students.oamk.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"
25 /* #define IRRECO_WEBDB_URL "http://mercury.wipsl.com/irreco/webdb/" */
26 #define IRRECO_WEBDB_URL "http://127.0.0.1/irreco/webdb/"
30 svn co svn+irreco:///irreco/irreco/database/trunk/php /var/www/irreco/webdb
35 * @typedef IrrecoWebdbClient
37 * Irreco Web Database API implementation. These functions connect to the
38 * IrrecoWebdbClient trough XML-RPC connection, pass arguments, and decode return
44 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
46 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
48 static gboolean
irreco_webdb_client_check_error();
49 static void irreco_webdb_client_reset_env();
53 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
54 /* Construction & Destruction */
55 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
58 * Create new IrrecoWebdbClient Object
60 IrrecoWebdbClient
*irreco_webdb_client_new()
62 IrrecoWebdbClient
*self
;
65 self
= g_slice_new0(IrrecoWebdbClient
);
66 self
->error_env
= g_slice_new0(xmlrpc_env
);
67 xmlrpc_env_init(self
->error_env
);
68 self
->server
= xmlrpc_server_info_new(self
->error_env
,
70 if (irreco_webdb_client_check_error(self
)) {
72 irreco_webdb_client_free(self
);
73 IRRECO_RETURN_PTR(NULL
);
75 IRRECO_RETURN_PTR(self
);
78 void irreco_webdb_client_free(IrrecoWebdbClient
*self
)
82 g_assert(self
!= NULL
);
84 if (self
->server
) xmlrpc_server_info_free(self
->server
);
85 xmlrpc_env_clean(self
->error_env
);
87 g_slice_free(xmlrpc_env
, self
->error_env
);
88 self
->error_env
= NULL
;
90 g_slice_free(IrrecoWebdbClient
, self
);
98 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
99 /* Private Functions */
100 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
103 * Release of RPC results and errors.
105 static void irreco_webdb_client_reset_env(IrrecoWebdbClient
*self
)
108 if (irreco_webdb_client_check_error(self
)) {
109 xmlrpc_env_clean(self
->error_env
);
110 xmlrpc_env_init(self
->error_env
);
116 * Check if the previous call to XMLRPC-C succeeded.
118 * @return TRUE if error occured, FALSE otherwise.
120 static gboolean
irreco_webdb_client_check_error(IrrecoWebdbClient
*self
)
123 if(self
->error_env
->fault_occurred
) {
124 IRRECO_ERROR("%d: %s\n", self
->error_env
->fault_code
,
125 self
->error_env
->fault_string
);
126 IRRECO_RETURN_BOOL(TRUE
);
128 IRRECO_RETURN_BOOL(FALSE
);
133 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
135 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
140 * @param msg GString object to recieve the error message.
142 void irreco_webdb_client_get_error_msg(IrrecoWebdbClient
*self
, GString
*msg
)
145 g_string_printf(msg
, "%d: %s\n",
146 self
->error_env
->fault_code
,
147 self
->error_env
->fault_string
);
152 * Ask WebDB to sum two numbers.
154 * @param num_a First number.
155 * @param num_b Second number.
156 * @param sum Variable to recieve the result.
157 * @return TRUE on successfull XML-RPC call, FALSE otherwise.
159 gboolean
irreco_webdb_client_sum(IrrecoWebdbClient
*self
,
164 gboolean rvalue
= FALSE
;
165 xmlrpc_value
*response
= NULL
;
168 irreco_webdb_client_reset_env(self
);
169 response
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
171 (xmlrpc_int32
) num_a
,
172 (xmlrpc_int32
) num_b
);
173 if (irreco_webdb_client_check_error(self
)) {
178 xmlrpc_read_int(self
->error_env
, response
, sum
);
179 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
181 /* No error occured. */
185 if (response
) xmlrpc_DECREF(response
);
186 IRRECO_RETURN_BOOL(rvalue
);
193 gboolean
irreco_webdb_client_add_user(IrrecoWebdbClient
*self
,
198 gboolean rvalue
= FALSE
;
199 xmlrpc_value
*response
= NULL
;
203 irreco_webdb_client_reset_env(self
);
205 /* Execute XML-RPC call. */
206 response
= xmlrpc_client_call_server(self
->error_env
,
214 if (irreco_webdb_client_check_error(self
)) {
216 if (response
) xmlrpc_DECREF(response
);
217 IRRECO_RETURN_BOOL(FALSE
);
220 /* Parse response and set to user_exists */
221 xmlrpc_read_bool(self
->error_env
, response
, &rvalue
);
223 if (irreco_webdb_client_check_error(self
)) {
225 if (response
) xmlrpc_DECREF(response
);
226 IRRECO_RETURN_BOOL(FALSE
);
229 IRRECO_RETURN_BOOL(rvalue
);
232 gboolean
irreco_webdb_client_upload_configuration(IrrecoWebdbClient
*self
,
233 const gchar
*backend
,
234 const gchar
*category
,
235 const gchar
*file_hash
,
236 const gchar
*file_name
,
237 const gchar
*manufacturer
,
239 const gchar
*password
,
243 gboolean rvalue
= FALSE
;
244 xmlrpc_value
*response
= NULL
;
247 irreco_webdb_client_reset_env(self
);
249 /* Execute XML-RPC call. */
250 response
= xmlrpc_client_call_server(self
->error_env
,
252 /* For testing purposes only */
253 "uploadConfiguration",
265 if (irreco_webdb_client_check_error(self
)) {
270 /* No error occured. */
274 if (response
) xmlrpc_DECREF(response
);
276 IRRECO_RETURN_BOOL(rvalue
);
279 gboolean
irreco_webdb_client_get_categories(IrrecoWebdbClient
*self
,
280 IrrecoStringTable
**category_list
)
284 gboolean rvalue
= FALSE
;
285 xmlrpc_value
*response
= NULL
;
286 xmlrpc_value
*category_xml
= NULL
;
287 const gchar
*category_str
= NULL
;
290 *category_list
= NULL
;
291 irreco_webdb_client_reset_env(self
);
293 /* Execute XML-RPC call. */
294 response
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
295 "getCategories", "()");
296 if (irreco_webdb_client_check_error(self
)) {
301 /* Get size responce of array. */
302 array_size
= xmlrpc_array_size(self
->error_env
, response
);
303 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
306 *category_list
= irreco_string_table_new(
307 (GDestroyNotify
) irreco_string_table_free
, NULL
);
308 for(i
= 0; i
< array_size
; i
++) {
309 xmlrpc_array_read_item(self
->error_env
, response
,
311 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
313 xmlrpc_read_string(self
->error_env
, category_xml
,
315 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
317 IRRECO_DEBUG("Category: %s\n", category_str
);
318 irreco_string_table_add(*category_list
, category_str
, NULL
);
319 xmlrpc_DECREF(category_xml
);
322 /* No error occured. */
326 if (response
) xmlrpc_DECREF(response
);
327 if (category_xml
) xmlrpc_DECREF(category_xml
);
328 if (rvalue
== FALSE
&& *category_list
!= NULL
) {
329 irreco_string_table_free(*category_list
);
331 IRRECO_RETURN_BOOL(rvalue
);
334 gboolean
irreco_webdb_client_get_all_categories(IrrecoWebdbClient
*self
,
335 IrrecoStringTable
**category_list
)
339 gboolean rvalue
= FALSE
;
340 xmlrpc_value
*response
= NULL
;
341 xmlrpc_value
*category_xml
= NULL
;
342 const gchar
*category_str
= NULL
;
345 *category_list
= NULL
;
346 irreco_webdb_client_reset_env(self
);
348 /* Execute XML-RPC call. */
349 response
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
350 "getAllCategories", "()");
351 if (irreco_webdb_client_check_error(self
)) {
356 /* Get size responce of array. */
357 array_size
= xmlrpc_array_size(self
->error_env
, response
);
358 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
361 *category_list
= irreco_string_table_new(
362 (GDestroyNotify
) irreco_string_table_free
, NULL
);
363 for(i
= 0; i
< array_size
; i
++) {
364 xmlrpc_array_read_item(self
->error_env
, response
,
366 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
368 xmlrpc_read_string(self
->error_env
, category_xml
,
370 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
372 IRRECO_DEBUG("Category: %s\n", category_str
);
373 irreco_string_table_add(*category_list
, category_str
, NULL
);
374 xmlrpc_DECREF(category_xml
);
377 /* No error occured. */
381 if (response
) xmlrpc_DECREF(response
);
382 if (category_xml
) xmlrpc_DECREF(category_xml
);
383 if (rvalue
== FALSE
&& *category_list
!= NULL
) {
384 irreco_string_table_free(*category_list
);
386 IRRECO_RETURN_BOOL(rvalue
);
388 gboolean
irreco_webdb_client_get_manufacturers(IrrecoWebdbClient
*self
,
389 const gchar
*category
,
390 IrrecoStringTable
**manufacturer_list
)
394 gboolean rvalue
= FALSE
;
395 xmlrpc_value
*response
= NULL
;
396 xmlrpc_value
*manufacturer_xml
= NULL
;
397 const gchar
*manufacturer_str
= NULL
;
400 *manufacturer_list
= NULL
;
401 irreco_webdb_client_reset_env(self
);
403 /* Execute XML-RPC call. */
404 response
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
405 "getManufacturers", "(s)",
407 if (irreco_webdb_client_check_error(self
)) {
412 /* Get size responce of array. */
413 array_size
= xmlrpc_array_size(self
->error_env
, response
);
414 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
417 *manufacturer_list
= irreco_string_table_new(
418 (GDestroyNotify
) irreco_string_table_free
, NULL
);
419 for(i
= 0; i
< array_size
; i
++) {
420 xmlrpc_array_read_item(self
->error_env
, response
,
421 i
, &manufacturer_xml
);
422 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
424 xmlrpc_read_string(self
->error_env
, manufacturer_xml
,
426 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
428 IRRECO_DEBUG("Manufacturer: %s\n", manufacturer_str
);
429 irreco_string_table_add(*manufacturer_list
,
430 manufacturer_str
, NULL
);
431 xmlrpc_DECREF(manufacturer_xml
);
434 /* No error occured. */
438 if (response
) xmlrpc_DECREF(response
);
439 if (manufacturer_xml
) xmlrpc_DECREF(manufacturer_xml
);
440 if (rvalue
== FALSE
&& *manufacturer_list
!= NULL
) {
441 irreco_string_table_free(*manufacturer_list
);
443 IRRECO_RETURN_BOOL(rvalue
);
446 gboolean
irreco_webdb_client_get_all_manufacturers(IrrecoWebdbClient
*self
,
447 IrrecoStringTable
**manufacturer_list
)
451 gboolean rvalue
= FALSE
;
452 xmlrpc_value
*response
= NULL
;
453 xmlrpc_value
*manufacturer_xml
= NULL
;
454 const gchar
*manufacturer_str
= NULL
;
457 *manufacturer_list
= NULL
;
458 irreco_webdb_client_reset_env(self
);
460 /* Execute XML-RPC call. */
461 response
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
462 "getAllManufacturers", "()");
463 if (irreco_webdb_client_check_error(self
)) {
468 /* Get size response of array. */
469 array_size
= xmlrpc_array_size(self
->error_env
, response
);
470 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
473 *manufacturer_list
= irreco_string_table_new(
474 (GDestroyNotify
) irreco_string_table_free
, NULL
);
475 for(i
= 0; i
< array_size
; i
++) {
476 xmlrpc_array_read_item(self
->error_env
, response
,
477 i
, &manufacturer_xml
);
478 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
480 xmlrpc_read_string(self
->error_env
, manufacturer_xml
,
482 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
484 IRRECO_DEBUG("Manufacturer: %s\n", manufacturer_str
);
485 irreco_string_table_add(*manufacturer_list
,
486 manufacturer_str
, NULL
);
487 xmlrpc_DECREF(manufacturer_xml
);
490 /* No error occured. */
494 if (response
) xmlrpc_DECREF(response
);
495 if (manufacturer_xml
) xmlrpc_DECREF(manufacturer_xml
);
496 if (rvalue
== FALSE
&& *manufacturer_list
!= NULL
) {
497 irreco_string_table_free(*manufacturer_list
);
499 IRRECO_RETURN_BOOL(rvalue
);
502 gboolean
irreco_webdb_client_get_models(IrrecoWebdbClient
*self
,
503 const gchar
*category
,
504 const gchar
*manufacturer
,
505 IrrecoStringTable
**model_list
)
509 gboolean rvalue
= FALSE
;
510 xmlrpc_value
*response
= NULL
;
511 xmlrpc_value
*model_xml
= NULL
;
512 const gchar
*model_str
= NULL
;
516 irreco_webdb_client_reset_env(self
);
518 /* Execute XML-RPC call. */
519 response
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
521 category
,manufacturer
);
522 if (irreco_webdb_client_check_error(self
)) {
527 /* Get size responce of array. */
528 array_size
= xmlrpc_array_size(self
->error_env
, response
);
529 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
532 *model_list
= irreco_string_table_new(
533 (GDestroyNotify
) irreco_string_table_free
, NULL
);
534 for(i
= 0; i
< array_size
; i
++) {
535 xmlrpc_array_read_item(self
->error_env
, response
,
537 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
539 xmlrpc_read_string(self
->error_env
, model_xml
,
541 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
543 IRRECO_DEBUG("Model: %s\n", model_str
);
544 irreco_string_table_add(*model_list
,
546 xmlrpc_DECREF(model_xml
);
549 /* No error occured. */
553 if (response
) xmlrpc_DECREF(response
);
554 if (model_xml
) xmlrpc_DECREF(model_xml
);
555 if (rvalue
== FALSE
&& *model_list
!= NULL
) {
556 irreco_string_table_free(*model_list
);
558 IRRECO_RETURN_BOOL(rvalue
);
562 gboolean
irreco_webdb_client_get_configs(IrrecoWebdbClient
*self
,
563 const gchar
*category
,
564 const gchar
*manufacturer
,
566 IrrecoStringTable
**config_list
)
570 gboolean rvalue
= FALSE
;
571 xmlrpc_value
*response
= NULL
;
572 xmlrpc_value
*config_xml
= NULL
;
573 const gchar
*config_str
= NULL
;
577 irreco_webdb_client_reset_env(self
);
579 /* Execute XML-RPC call. */
580 response
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
583 if (irreco_webdb_client_check_error(self
)) {
588 /* Get size responce of array. */
589 array_size
= xmlrpc_array_size(self
->error_env
, response
);
590 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
593 *config_list
= irreco_string_table_new(NULL
, NULL
);
594 for(i
= 0; i
< array_size
; i
++) {
596 xmlrpc_array_read_item(self
->error_env
, response
,
598 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
600 xmlrpc_read_string(self
->error_env
, config_xml
,
603 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
605 IRRECO_DEBUG("Config: %s\n", config_str
);
606 irreco_string_table_add(*config_list
, config_str
, NULL
);
607 xmlrpc_DECREF(config_xml
);
610 /* No error occured. */
614 if (response
) xmlrpc_DECREF(response
);
615 if (config_xml
) xmlrpc_DECREF(config_xml
);
616 if (rvalue
== FALSE
&& *config_list
!= NULL
) {
617 irreco_string_table_free(*config_list
);
619 IRRECO_RETURN_BOOL(rvalue
);
623 gboolean
irreco_webdb_client_get_configuration(IrrecoWebdbClient
*self
,
625 IrrecoWebdbConf
**configuration
)
627 gboolean rvalue
= FALSE
;
628 xmlrpc_value
*response
= NULL
;
629 xmlrpc_value
*_xml
= NULL
;
631 const gchar
*backend
;
632 const gchar
*category
;
633 const gchar
*manufacturer
;
635 const gchar
*file_hash
;
636 const gchar
*file_name
;
637 const gchar
*uploaded
;
638 const gchar
*download_count
;
642 *configuration
= irreco_webdb_conf_new();
644 irreco_webdb_client_reset_env(self
);
646 /* Execute XML-RPC call. */
647 response
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
648 "getConfiguration", "(s)", id
);
649 if (irreco_webdb_client_check_error(self
)) {
654 /* Get size responce of array. */
656 xmlrpc_struct_find_value(self
->error_env
, response
, "user", &_xml
);
657 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
658 xmlrpc_read_string(self
->error_env
, _xml
, &user
);
661 xmlrpc_struct_find_value(self
->error_env
, response
, "backend", &_xml
);
662 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
663 xmlrpc_read_string(self
->error_env
, _xml
, &backend
);
666 xmlrpc_struct_find_value(self
->error_env
, response
, "category", &_xml
);
667 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
668 xmlrpc_read_string(self
->error_env
, _xml
, &category
);
671 xmlrpc_struct_find_value(self
->error_env
, response
, "manufacturer",
673 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
674 xmlrpc_read_string(self
->error_env
, _xml
, &manufacturer
);
677 xmlrpc_struct_find_value(self
->error_env
, response
, "model", &_xml
);
678 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
679 xmlrpc_read_string(self
->error_env
, _xml
, &model
);
682 xmlrpc_struct_find_value(self
->error_env
, response
, "file_hash", &_xml
);
683 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
684 xmlrpc_read_string(self
->error_env
, _xml
, &file_hash
);
687 xmlrpc_struct_find_value(self
->error_env
, response
, "file_name", &_xml
);
688 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
689 xmlrpc_read_string(self
->error_env
, _xml
, &file_name
);
692 xmlrpc_struct_find_value(self
->error_env
, response
, "uploaded", &_xml
);
693 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
694 xmlrpc_read_string(self
->error_env
, _xml
, &uploaded
);
697 xmlrpc_struct_find_value(self
->error_env
, response
,
698 "download_count", &_xml
);
699 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
700 xmlrpc_read_string(self
->error_env
, _xml
, &download_count
);
703 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
705 IRRECO_DEBUG("Configuration: %d %s %s %s %s %s %s %s %s %s\n",
706 (gint
)id
, user
, backend
, category
, manufacturer
,
707 model
, file_hash
, file_name
, uploaded
, download_count
);
709 irreco_webdb_conf_set(*configuration
, (gint
)id
, user
, backend
, category
,
710 manufacturer
, model
, file_hash
, file_name
,
711 uploaded
, download_count
);
713 /* No error occured. */
717 if (response
) xmlrpc_DECREF(response
);
718 if (_xml
) xmlrpc_DECREF(_xml
);
720 IRRECO_RETURN_BOOL(rvalue
);
723 gboolean
irreco_webdb_client_get_file(IrrecoWebdbClient
*self
,
724 const gchar
*file_hash
,
725 const gchar
*file_name
,
728 gboolean rvalue
= FALSE
;
729 xmlrpc_value
*response
= NULL
;
730 xmlrpc_value
*_xml
= NULL
;
731 const gchar
*data
= NULL
;
735 irreco_webdb_client_reset_env(self
);
739 /* Execute XML-RPC call. */
740 response
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
742 file_hash
, file_name
);
743 if (irreco_webdb_client_check_error(self
)) {
748 /* Get size responce of array. */
750 xmlrpc_struct_find_value(self
->error_env
, response
, "data", &_xml
);
751 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
752 xmlrpc_read_string(self
->error_env
, _xml
, &data
);
755 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
757 IRRECO_DEBUG("File: %s\n", data
);
759 *file_data
= g_string_new (data
);
761 /* No error occured. */
765 if (response
) xmlrpc_DECREF(response
);
766 if (_xml
) xmlrpc_DECREF(_xml
);
768 IRRECO_RETURN_BOOL(rvalue
);
771 gboolean
irreco_webdb_client_get_user_exists(IrrecoWebdbClient
*self
,
773 gboolean
*user_exists
)
775 gboolean rvalue
= FALSE
;
776 xmlrpc_value
*response
= NULL
;
780 irreco_webdb_client_reset_env(self
);
782 /* Execute XML-RPC call. */
783 response
= xmlrpc_client_call_server(self
->error_env
,
789 if (irreco_webdb_client_check_error(self
)) {
794 /* Parse response and set to user_exists */
795 xmlrpc_read_bool(self
->error_env
, response
, user_exists
);
797 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
802 if (response
) xmlrpc_DECREF(response
);
804 IRRECO_RETURN_BOOL(rvalue
);
812 gboolean
irreco_webdb_client_get_category_list(GHashTable
**category_list
)
817 *category_list
= NULL
;
819 /* Execute XML-RPC call. */
820 irreco_webdb_client_reset_env();
821 self
->result
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
822 "getCategoryList", "()");
823 if (!irreco_webdb_client_is_ok()) IRRECO_RETURN_BOOL(FALSE
);
825 /* Get structure size. */
826 i
= xmlrpc_struct_size(self
->error_env
, self
->result
);
827 if (!irreco_webdb_client_is_ok()) IRRECO_RETURN_BOOL(FALSE
);
829 /* Create hashtable. */
830 *category_list
= g_hash_table_new_full(g_int_hash
, g_int_equal
,
833 /* Parse structure. */
835 xmlrpc_value
*xml_key
;
836 xmlrpc_value
*xml_value
;
837 const gchar
* str_key
;
838 const gchar
* str_value
;
840 xmlrpc_struct_read_member(self
->error_env
, self
->result
, i
,
841 &xml_key
, &xml_value
);
842 if (!irreco_webdb_client_is_ok()) goto error
;
844 xmlrpc_read_string(self
->error_env
, xml_key
, &str_key
);
845 if (!irreco_webdb_client_is_ok()) goto error
;
847 xmlrpc_read_string(self
->error_env
, xml_value
, &str_value
);
848 if (!irreco_webdb_client_is_ok()) goto error
;
850 IRRECO_PRINTF("Key: %s, Val: %s\n", str_key
, str_value
);
851 /*g_hash_table_add();*/
853 xmlrpc_DECREF(xml_key
);
854 xmlrpc_DECREF(xml_value
);
857 IRRECO_RETURN_BOOL(TRUE
);
860 g_hash_table_destroy(*category_list
);
861 *category_list
= NULL
;
862 IRRECO_RETURN_BOOL(FALSE
);
867 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
868 /* Events and Callbacks */
869 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/