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
);
97 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
98 /* Private Functions */
99 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
102 * Release of RPC results and errors.
104 static void irreco_webdb_client_reset_env(IrrecoWebdbClient
*self
)
107 if (irreco_webdb_client_check_error(self
)) {
108 xmlrpc_env_clean(self
->error_env
);
109 xmlrpc_env_init(self
->error_env
);
115 * Check if the previous call to XMLRPC-C succeeded.
117 * @return TRUE if error occured, FALSE otherwise.
119 static gboolean
irreco_webdb_client_check_error(IrrecoWebdbClient
*self
)
122 if(self
->error_env
->fault_occurred
) {
123 IRRECO_ERROR("%d: %s\n", self
->error_env
->fault_code
,
124 self
->error_env
->fault_string
);
125 IRRECO_RETURN_BOOL(TRUE
);
127 IRRECO_RETURN_BOOL(FALSE
);
132 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
134 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
139 * @param msg GString object to recieve the error message.
141 void irreco_webdb_client_get_error_msg(IrrecoWebdbClient
*self
, GString
*msg
)
144 g_string_printf(msg
, "%d: %s\n",
145 self
->error_env
->fault_code
,
146 self
->error_env
->fault_string
);
151 * Ask WebDB to sum two numbers.
153 * @param num_a First number.
154 * @param num_b Second number.
155 * @param sum Variable to recieve the result.
156 * @return TRUE on successfull XML-RPC call, FALSE otherwise.
158 gboolean
irreco_webdb_client_sum(IrrecoWebdbClient
*self
,
163 gboolean rvalue
= FALSE
;
164 xmlrpc_value
*response
= NULL
;
167 irreco_webdb_client_reset_env(self
);
168 response
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
170 (xmlrpc_int32
) num_a
,
171 (xmlrpc_int32
) num_b
);
172 if (irreco_webdb_client_check_error(self
)) {
177 xmlrpc_read_int(self
->error_env
, response
, sum
);
178 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
180 /* No error occured. */
184 if (response
) xmlrpc_DECREF(response
);
185 IRRECO_RETURN_BOOL(rvalue
);
192 gboolean
irreco_webdb_client_add_user(IrrecoWebdbClient
*self
,
197 gboolean rvalue
= TRUE
;
198 xmlrpc_value
*response
= NULL
;
202 irreco_webdb_client_reset_env(self
);
204 /* Execute XML-RPC call. */
205 response
= xmlrpc_client_call_server(self
->error_env
,
213 if (irreco_webdb_client_check_error(self
)) {
218 /* Parse response and set to user_exists */
219 xmlrpc_read_bool(self
->error_env
, response
, &rvalue
);
221 if (irreco_webdb_client_check_error(self
)) {
227 if (response
) xmlrpc_DECREF(response
);
228 IRRECO_RETURN_BOOL(rvalue
);
231 gboolean
irreco_webdb_client_upload_configuration(IrrecoWebdbClient
*self
,
232 const gchar
*backend
,
233 const gchar
*category
,
234 const gchar
*file_hash
,
235 const gchar
*file_name
,
236 const gchar
*manufacturer
,
238 const gchar
*password
,
242 gboolean rvalue
= FALSE
;
243 xmlrpc_value
*response
= NULL
;
246 irreco_webdb_client_reset_env(self
);
248 /* Execute XML-RPC call. */
249 response
= xmlrpc_client_call_server(self
->error_env
,
251 /* For testing purposes only */
252 "uploadConfiguration",
264 if (irreco_webdb_client_check_error(self
)) {
269 /* No error occured. */
273 if (response
) xmlrpc_DECREF(response
);
275 IRRECO_RETURN_BOOL(rvalue
);
278 gboolean
irreco_webdb_client_get_categories(IrrecoWebdbClient
*self
,
279 IrrecoStringTable
**category_list
)
283 gboolean rvalue
= FALSE
;
284 xmlrpc_value
*response
= NULL
;
285 xmlrpc_value
*category_xml
= NULL
;
286 const gchar
*category_str
= NULL
;
289 *category_list
= NULL
;
290 irreco_webdb_client_reset_env(self
);
292 /* Execute XML-RPC call. */
293 response
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
294 "getCategories", "()");
295 if (irreco_webdb_client_check_error(self
)) {
300 /* Get size responce of array. */
301 array_size
= xmlrpc_array_size(self
->error_env
, response
);
302 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
305 *category_list
= irreco_string_table_new(
306 (GDestroyNotify
) irreco_string_table_free
, NULL
);
307 for(i
= 0; i
< array_size
; i
++) {
308 xmlrpc_array_read_item(self
->error_env
, response
,
310 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
312 xmlrpc_read_string(self
->error_env
, category_xml
,
314 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
316 IRRECO_DEBUG("Category: %s\n", category_str
);
317 irreco_string_table_add(*category_list
, category_str
, NULL
);
318 xmlrpc_DECREF(category_xml
);
321 /* No error occured. */
325 if (response
) xmlrpc_DECREF(response
);
326 if (category_xml
) xmlrpc_DECREF(category_xml
);
327 if (rvalue
== FALSE
&& *category_list
!= NULL
) {
328 irreco_string_table_free(*category_list
);
330 IRRECO_RETURN_BOOL(rvalue
);
333 gboolean
irreco_webdb_client_get_all_categories(IrrecoWebdbClient
*self
,
334 IrrecoStringTable
**category_list
)
338 gboolean rvalue
= FALSE
;
339 xmlrpc_value
*response
= NULL
;
340 xmlrpc_value
*category_xml
= NULL
;
341 const gchar
*category_str
= NULL
;
344 *category_list
= NULL
;
345 irreco_webdb_client_reset_env(self
);
347 /* Execute XML-RPC call. */
348 response
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
349 "getAllCategories", "()");
350 if (irreco_webdb_client_check_error(self
)) {
355 /* Get size responce of array. */
356 array_size
= xmlrpc_array_size(self
->error_env
, response
);
357 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
360 *category_list
= irreco_string_table_new(
361 (GDestroyNotify
) irreco_string_table_free
, NULL
);
362 for(i
= 0; i
< array_size
; i
++) {
363 xmlrpc_array_read_item(self
->error_env
, response
,
365 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
367 xmlrpc_read_string(self
->error_env
, category_xml
,
369 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
371 IRRECO_DEBUG("Category: %s\n", category_str
);
372 irreco_string_table_add(*category_list
, category_str
, NULL
);
373 xmlrpc_DECREF(category_xml
);
376 /* No error occured. */
380 if (response
) xmlrpc_DECREF(response
);
381 if (category_xml
) xmlrpc_DECREF(category_xml
);
382 if (rvalue
== FALSE
&& *category_list
!= NULL
) {
383 irreco_string_table_free(*category_list
);
385 IRRECO_RETURN_BOOL(rvalue
);
387 gboolean
irreco_webdb_client_get_manufacturers(IrrecoWebdbClient
*self
,
388 const gchar
*category
,
389 IrrecoStringTable
**manufacturer_list
)
393 gboolean rvalue
= FALSE
;
394 xmlrpc_value
*response
= NULL
;
395 xmlrpc_value
*manufacturer_xml
= NULL
;
396 const gchar
*manufacturer_str
= NULL
;
399 *manufacturer_list
= NULL
;
400 irreco_webdb_client_reset_env(self
);
402 /* Execute XML-RPC call. */
403 response
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
404 "getManufacturers", "(s)",
406 if (irreco_webdb_client_check_error(self
)) {
411 /* Get size responce of array. */
412 array_size
= xmlrpc_array_size(self
->error_env
, response
);
413 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
416 *manufacturer_list
= irreco_string_table_new(
417 (GDestroyNotify
) irreco_string_table_free
, NULL
);
418 for(i
= 0; i
< array_size
; i
++) {
419 xmlrpc_array_read_item(self
->error_env
, response
,
420 i
, &manufacturer_xml
);
421 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
423 xmlrpc_read_string(self
->error_env
, manufacturer_xml
,
425 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
427 IRRECO_DEBUG("Manufacturer: %s\n", manufacturer_str
);
428 irreco_string_table_add(*manufacturer_list
,
429 manufacturer_str
, NULL
);
430 xmlrpc_DECREF(manufacturer_xml
);
433 /* No error occured. */
437 if (response
) xmlrpc_DECREF(response
);
438 if (manufacturer_xml
) xmlrpc_DECREF(manufacturer_xml
);
439 if (rvalue
== FALSE
&& *manufacturer_list
!= NULL
) {
440 irreco_string_table_free(*manufacturer_list
);
442 IRRECO_RETURN_BOOL(rvalue
);
445 gboolean
irreco_webdb_client_get_all_manufacturers(IrrecoWebdbClient
*self
,
446 IrrecoStringTable
**manufacturer_list
)
450 gboolean rvalue
= FALSE
;
451 xmlrpc_value
*response
= NULL
;
452 xmlrpc_value
*manufacturer_xml
= NULL
;
453 const gchar
*manufacturer_str
= NULL
;
456 *manufacturer_list
= NULL
;
457 irreco_webdb_client_reset_env(self
);
459 /* Execute XML-RPC call. */
460 response
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
461 "getAllManufacturers", "()");
462 if (irreco_webdb_client_check_error(self
)) {
467 /* Get size response of array. */
468 array_size
= xmlrpc_array_size(self
->error_env
, response
);
469 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
472 *manufacturer_list
= irreco_string_table_new(
473 (GDestroyNotify
) irreco_string_table_free
, NULL
);
474 for(i
= 0; i
< array_size
; i
++) {
475 xmlrpc_array_read_item(self
->error_env
, response
,
476 i
, &manufacturer_xml
);
477 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
479 xmlrpc_read_string(self
->error_env
, manufacturer_xml
,
481 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
483 IRRECO_DEBUG("Manufacturer: %s\n", manufacturer_str
);
484 irreco_string_table_add(*manufacturer_list
,
485 manufacturer_str
, NULL
);
486 xmlrpc_DECREF(manufacturer_xml
);
489 /* No error occured. */
493 if (response
) xmlrpc_DECREF(response
);
494 if (manufacturer_xml
) xmlrpc_DECREF(manufacturer_xml
);
495 if (rvalue
== FALSE
&& *manufacturer_list
!= NULL
) {
496 irreco_string_table_free(*manufacturer_list
);
498 IRRECO_RETURN_BOOL(rvalue
);
501 gboolean
irreco_webdb_client_get_models(IrrecoWebdbClient
*self
,
502 const gchar
*category
,
503 const gchar
*manufacturer
,
504 IrrecoStringTable
**model_list
)
508 gboolean rvalue
= FALSE
;
509 xmlrpc_value
*response
= NULL
;
510 xmlrpc_value
*model_xml
= NULL
;
511 const gchar
*model_str
= NULL
;
515 irreco_webdb_client_reset_env(self
);
517 /* Execute XML-RPC call. */
518 response
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
520 category
,manufacturer
);
521 if (irreco_webdb_client_check_error(self
)) {
526 /* Get size responce of array. */
527 array_size
= xmlrpc_array_size(self
->error_env
, response
);
528 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
531 *model_list
= irreco_string_table_new(
532 (GDestroyNotify
) irreco_string_table_free
, NULL
);
533 for(i
= 0; i
< array_size
; i
++) {
534 xmlrpc_array_read_item(self
->error_env
, response
,
536 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
538 xmlrpc_read_string(self
->error_env
, model_xml
,
540 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
542 IRRECO_DEBUG("Model: %s\n", model_str
);
543 irreco_string_table_add(*model_list
,
545 xmlrpc_DECREF(model_xml
);
548 /* No error occured. */
552 if (response
) xmlrpc_DECREF(response
);
553 if (model_xml
) xmlrpc_DECREF(model_xml
);
554 if (rvalue
== FALSE
&& *model_list
!= NULL
) {
555 irreco_string_table_free(*model_list
);
557 IRRECO_RETURN_BOOL(rvalue
);
561 gboolean
irreco_webdb_client_get_configs(IrrecoWebdbClient
*self
,
562 const gchar
*category
,
563 const gchar
*manufacturer
,
565 IrrecoStringTable
**config_list
)
569 gboolean rvalue
= FALSE
;
570 xmlrpc_value
*response
= NULL
;
571 xmlrpc_value
*config_xml
= NULL
;
572 const gchar
*config_str
= NULL
;
576 irreco_webdb_client_reset_env(self
);
578 /* Execute XML-RPC call. */
579 response
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
580 "getConfigurations", "(ss)",
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
;
641 *configuration
= irreco_webdb_conf_new();
643 irreco_webdb_client_reset_env(self
);
645 /* Execute XML-RPC call. */
646 response
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
647 "getConfigurationById", "(i)", id
);
648 if (irreco_webdb_client_check_error(self
)) {
653 /* Get size responce of array. */
655 xmlrpc_struct_find_value(self
->error_env
, response
, "user", &_xml
);
656 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
657 xmlrpc_read_string(self
->error_env
, _xml
, &user
);
659 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
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
);
665 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
667 xmlrpc_struct_find_value(self
->error_env
, response
, "category", &_xml
);
668 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
669 xmlrpc_read_string(self
->error_env
, _xml
, &category
);
671 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
673 xmlrpc_struct_find_value(self
->error_env
, response
, "manufacturer",
675 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
676 xmlrpc_read_string(self
->error_env
, _xml
, &manufacturer
);
678 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
680 xmlrpc_struct_find_value(self
->error_env
, response
, "model", &_xml
);
681 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
682 xmlrpc_read_string(self
->error_env
, _xml
, &model
);
684 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
686 xmlrpc_struct_find_value(self
->error_env
, response
, "file_hash", &_xml
);
687 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
688 xmlrpc_read_string(self
->error_env
, _xml
, &file_hash
);
690 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
692 xmlrpc_struct_find_value(self
->error_env
, response
, "file_name", &_xml
);
693 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
694 xmlrpc_read_string(self
->error_env
, _xml
, &file_name
);
696 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
698 xmlrpc_struct_find_value(self
->error_env
, response
, "uploaded", &_xml
);
699 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
700 xmlrpc_read_string(self
->error_env
, _xml
, &uploaded
);
702 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
704 xmlrpc_struct_find_value(self
->error_env
, response
,
705 "download_count", &_xml
);
706 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
707 xmlrpc_read_string(self
->error_env
, _xml
, &download_count
);
709 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
711 IRRECO_DEBUG("Configuration: %d %s %s %s %s %s %s %s %s %s\n",
712 id
, user
, backend
, category
, manufacturer
,
713 model
, file_hash
, file_name
, uploaded
, download_count
);
715 irreco_webdb_conf_set(*configuration
, id
, user
, backend
, category
,
716 manufacturer
, model
, file_hash
, file_name
,
717 uploaded
, download_count
);
719 /* No error occured. */
723 if (response
) xmlrpc_DECREF(response
);
724 if (_xml
) xmlrpc_DECREF(_xml
);
726 IRRECO_RETURN_BOOL(rvalue
);
729 gboolean
irreco_webdb_client_get_file(IrrecoWebdbClient
*self
,
730 const gchar
*file_hash
,
731 const gchar
*file_name
,
734 gboolean rvalue
= FALSE
;
735 xmlrpc_value
*response
= NULL
;
736 xmlrpc_value
*_xml
= NULL
;
737 const gchar
*data
= NULL
;
741 irreco_webdb_client_reset_env(self
);
745 /* Execute XML-RPC call. */
746 response
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
748 file_hash
, file_name
);
749 if (irreco_webdb_client_check_error(self
)) {
754 /* Get size responce of array. */
756 xmlrpc_struct_find_value(self
->error_env
, response
, "data", &_xml
);
757 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
758 xmlrpc_read_string(self
->error_env
, _xml
, &data
);
761 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
763 IRRECO_DEBUG("File: %s\n", data
);
765 *file_data
= g_string_new (data
);
767 /* No error occured. */
771 if (response
) xmlrpc_DECREF(response
);
772 if (_xml
) xmlrpc_DECREF(_xml
);
774 IRRECO_RETURN_BOOL(rvalue
);
777 gboolean
irreco_webdb_client_get_user_exists(IrrecoWebdbClient
*self
,
779 gboolean
*user_exists
)
781 gboolean rvalue
= FALSE
;
782 xmlrpc_value
*response
= NULL
;
786 irreco_webdb_client_reset_env(self
);
788 /* Execute XML-RPC call. */
789 response
= xmlrpc_client_call_server(self
->error_env
,
795 if (irreco_webdb_client_check_error(self
)) {
800 /* Parse response and set to user_exists */
801 xmlrpc_read_bool(self
->error_env
, response
, user_exists
);
803 if (irreco_webdb_client_check_error(self
)) goto cleanup
;
808 if (response
) xmlrpc_DECREF(response
);
810 IRRECO_RETURN_BOOL(rvalue
);
818 gboolean
irreco_webdb_client_get_category_list(GHashTable
**category_list
)
823 *category_list
= NULL
;
825 /* Execute XML-RPC call. */
826 irreco_webdb_client_reset_env();
827 self
->result
= xmlrpc_client_call_server(self
->error_env
, self
->server
,
828 "getCategoryList", "()");
829 if (!irreco_webdb_client_is_ok()) IRRECO_RETURN_BOOL(FALSE
);
831 /* Get structure size. */
832 i
= xmlrpc_struct_size(self
->error_env
, self
->result
);
833 if (!irreco_webdb_client_is_ok()) IRRECO_RETURN_BOOL(FALSE
);
835 /* Create hashtable. */
836 *category_list
= g_hash_table_new_full(g_int_hash
, g_int_equal
,
839 /* Parse structure. */
841 xmlrpc_value
*xml_key
;
842 xmlrpc_value
*xml_value
;
843 const gchar
* str_key
;
844 const gchar
* str_value
;
846 xmlrpc_struct_read_member(self
->error_env
, self
->result
, i
,
847 &xml_key
, &xml_value
);
848 if (!irreco_webdb_client_is_ok()) goto error
;
850 xmlrpc_read_string(self
->error_env
, xml_key
, &str_key
);
851 if (!irreco_webdb_client_is_ok()) goto error
;
853 xmlrpc_read_string(self
->error_env
, xml_value
, &str_value
);
854 if (!irreco_webdb_client_is_ok()) goto error
;
856 IRRECO_PRINTF("Key: %s, Val: %s\n", str_key
, str_value
);
857 /*g_hash_table_add();*/
859 xmlrpc_DECREF(xml_key
);
860 xmlrpc_DECREF(xml_value
);
863 IRRECO_RETURN_BOOL(TRUE
);
866 g_hash_table_destroy(*category_list
);
867 *category_list
= NULL
;
868 IRRECO_RETURN_BOOL(FALSE
);
873 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
874 /* Events and Callbacks */
875 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/