static GError* infc_session_proxy_translate_error_impl(InfcSessionProxy* proxy, GQuark domain, guint code) { GError* error; const gchar* error_msg; if(domain == inf_request_error_quark()) error_msg = inf_request_strerror(code); else if(domain == inf_user_error_quark()) error_msg = inf_user_strerror(code); else error_msg = NULL; error = NULL; if(error_msg != NULL) { g_set_error(&error, domain, code, "%s", error_msg); } else { /* TODO: Check whether a human-readable error string was sent (that * we cannot translate then, of course). */ g_set_error( &error, inf_request_error_quark(), INF_REQUEST_ERROR_UNKNOWN_DOMAIN, _("Error comes from unknown error domain '%s' (code %u)"), g_quark_to_string(domain), (guint)code ); } return error; }
void Gobby::UserJoin::attempt_user_join() { // Check if there is already a local user, for example for a // synced-in document. InfSession* session; g_object_get(G_OBJECT(m_proxy), "session", &session, NULL); InfUserTable* user_table = inf_session_get_user_table(session); InfUser* user = NULL; inf_user_table_foreach_local_user(user_table, retr_local_user_func, &user); g_object_unref(session); if(user != NULL) { user_join_complete(user, NULL); return; } // Next, check whether we are allowed to join a user if(m_node.get_browser() && m_node.get_browser_iter()) { InfBrowser* browser = m_node.get_browser(); const InfBrowserIter* iter = m_node.get_browser_iter(); const InfAclAccount* account = inf_browser_get_acl_local_account(browser); const InfAclAccountId acc_id = (account != NULL) ? account->id : 0; InfAclMask msk; inf_acl_mask_set1(&msk, INF_ACL_CAN_JOIN_USER); if(!inf_browser_check_acl(browser, iter, acc_id, &msk, NULL)) { GError* error = NULL; g_set_error( &error, inf_request_error_quark(), INF_REQUEST_ERROR_NOT_AUTHORIZED, "%s", inf_request_strerror( INF_REQUEST_ERROR_NOT_AUTHORIZED)); user_join_complete(NULL, error); g_error_free(error); return; } } // We are allowed, so attempt to join the user now. std::vector<GParameter> params = m_param_provider->get_user_join_parameters(); std::vector<GParameter>::iterator name_index = find_name_param(params); const gchar* name = g_value_get_string(&name_index->value); if(m_retry_index > 1) { gchar* new_name = g_strdup_printf( "%s %u", name, m_retry_index); g_value_take_string(&name_index->value, new_name); } GError* error = NULL; InfRequest* request = inf_session_proxy_join_user( m_proxy, params.size(), ¶ms[0], on_user_join_finished_static, this); for(unsigned int i = 0; i < params.size(); ++i) g_value_unset(¶ms[i].value); if(request != NULL) { m_request = request; g_object_ref(m_request); } }