gboolean inf_xml_util_get_attribute_double_required(xmlNodePtr xml, const gchar* attribute, gdouble* result, GError** error) { xmlChar* value; gboolean retval; value = inf_xml_util_get_attribute_required(xml, attribute, error); if(value == NULL) return FALSE; retval = inf_xml_util_string_to_double(attribute, value, result, error); xmlFree(value); return retval; }
static gboolean infc_session_proxy_handle_request_failed(InfcSessionProxy* proxy, InfXmlConnection* connection, xmlNodePtr xml, GError** error) { InfcSessionProxyPrivate* priv; InfcSessionProxyClass* proxy_class; xmlChar* domain; gboolean has_code; guint code; GError* req_error; InfcRequest* request; priv = INFC_SESSION_PROXY_PRIVATE(proxy); proxy_class = INFC_SESSION_PROXY_GET_CLASS(proxy); has_code = inf_xml_util_get_attribute_uint_required( xml, "code", &code, error ); if(has_code == FALSE) return FALSE; domain = inf_xml_util_get_attribute_required(xml, "domain", error); if(domain == NULL) return FALSE; req_error = NULL; request = infc_request_manager_get_request_by_xml_required( priv->request_manager, NULL, xml, error ); if(request == NULL) return FALSE; g_assert(proxy_class->translate_error != NULL); /* TODO: Add a GError* paramater to translate_error so that an error * can be reported if the error could not be translated. */ req_error = proxy_class->translate_error( proxy, g_quark_from_string((const gchar*)domain), code ); infc_request_manager_fail_request( priv->request_manager, request, req_error ); g_error_free(req_error); xmlFree(domain); return TRUE; }
/** * inf_adopted_session_read_request_info: * @session: A #InfAdoptedSession. * @xml: The XML to read the data from. * @diff_vec: The reference vector of the time vector of the request, or * %NULL. * @user: Location to store the user of the request, or %NULL. * @time: Location to store the state the request was made, or %NULL. * @operation: Location to store the operation of the request, or %NULL. * @error: Location to place an error, if any. * * This function reads common information such as the state vector the request * was made and the user that made the request from XML. It is most likely to * be used by implementations of the xml_to_request virtual function. * * Returns: %TRUE if the data could be read successfully, %FALSE if the XML * request does not contain valid request data, in which case @error is set. */ gboolean inf_adopted_session_read_request_info(InfAdoptedSession* session, xmlNodePtr xml, InfAdoptedStateVector* diff_vec, InfAdoptedUser** user, InfAdoptedStateVector** time, xmlNodePtr* operation, GError** error) { xmlChar* attr; xmlNodePtr child; if(user != NULL) { *user = inf_adopted_session_user_from_request_xml(session, xml, error); if(*user == NULL) return FALSE; } if(time != NULL) { attr = inf_xml_util_get_attribute_required(xml, "time", error); if(attr == NULL) return FALSE; if(diff_vec == NULL) { *time = inf_adopted_state_vector_from_string((const gchar*)attr, error); } else { *time = inf_adopted_state_vector_from_string_diff( (const gchar*)attr, diff_vec, error ); } xmlFree(attr); if(*time == NULL) return FALSE; } if(operation != NULL) { /* Get first child element */ child = xml->children; while(child != NULL && child->type != XML_ELEMENT_NODE) child = child->next; if(child == NULL) { g_set_error( error, inf_adopted_session_error_quark, INF_ADOPTED_SESSION_ERROR_MISSING_OPERATION, "%s", _("Operation for request missing") ); if(time) inf_adopted_state_vector_free(*time); return FALSE; } *operation = child; } return TRUE; }
static gboolean infd_note_plugin_text_read_user(InfUserTable* user_table, xmlNodePtr node, GError** error) { guint id; gdouble hue; xmlChar* name; gboolean result; InfUser* user; if(!inf_xml_util_get_attribute_uint_required(node, "id", &id, error)) return FALSE; if(!inf_xml_util_get_attribute_double_required(node, "hue", &hue, error)) return FALSE; name = inf_xml_util_get_attribute_required(node, "name", error); if(name == NULL) return FALSE; if(inf_user_table_lookup_user_by_id(user_table, id) != NULL) { g_set_error( error, g_quark_from_static_string("INF_NOTE_PLUGIN_TEXT_ERROR"), INFD_NOTE_PLUGIN_TEXT_ERROR_USER_EXISTS, "User with ID %u exists already", id ); result = FALSE; } else { if(inf_user_table_lookup_user_by_name(user_table, (const gchar*)name)) { g_set_error( error, g_quark_from_static_string("INF_NOTE_PLUGIN_TEXT_ERROR"), INFD_NOTE_PLUGIN_TEXT_ERROR_USER_EXISTS, "User with name `%s' exists already", (const gchar*)name ); result = FALSE; } else { user = INF_USER( g_object_new( INF_TEXT_TYPE_USER, "id", id, "name", name, "hue", hue, NULL ) ); inf_user_table_add_user(user_table, user); g_object_unref(user); result = TRUE; } } xmlFree(name); return result; }