static GObject* inf_adopted_session_constructor(GType type, guint n_construct_properties, GObjectConstructParam* construct_properties) { GObject* object; InfAdoptedSession* session; InfAdoptedSessionPrivate* priv; InfSessionStatus status; InfUserTable* user_table; object = G_OBJECT_CLASS(parent_class)->constructor( type, n_construct_properties, construct_properties ); session = INF_ADOPTED_SESSION(object); priv = INF_ADOPTED_SESSION_PRIVATE(session); g_assert(priv->io != NULL); g_object_get(G_OBJECT(session), "status", &status, NULL); user_table = inf_session_get_user_table(INF_SESSION(session)); g_signal_connect( G_OBJECT(user_table), "add-local-user", G_CALLBACK(inf_adopted_session_add_local_user_cb), session ); g_signal_connect( G_OBJECT(user_table), "remove-local-user", G_CALLBACK(inf_adopted_session_remove_local_user_cb), session ); switch(status) { case INF_SESSION_PRESYNC: case INF_SESSION_SYNCHRONIZING: /* algorithm is created during initial synchronization when parameters * like initial vector time, max total log size etc. are known. */ break; case INF_SESSION_RUNNING: g_assert(inf_session_get_buffer(INF_SESSION(session)) != NULL); inf_adopted_session_create_algorithm(session); break; case INF_SESSION_CLOSED: /* Session should not be initially closed */ default: g_assert_not_reached(); break; } /* Add initial local users. Note that this requires the algorithm to exist, * though in synchronizing state no local users can exist. */ inf_user_table_foreach_local_user( user_table, inf_adopted_session_constructor_foreach_local_user_func, session ); return object; }
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); } }
void Gobby::UserJoinCommands::UserJoinInfo::attempt_user_join() { const Preferences& preferences = m_commands.m_preferences; // 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); 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); InfAclMask msk; inf_acl_mask_set1(&msk, INF_ACL_CAN_JOIN_USER); if(!inf_browser_check_acl(browser, iter, account, &msk, NULL)) { set_permission_denied_text(m_view); finish(); return; } } // We are allowed, so attempt to join the user now. std::vector<GParameter> params; const GParameter name_param = { "name", { 0 } }; params.push_back(name_param); const GParameter status_param = { "status", { 0 } }; params.push_back(status_param); g_value_init(¶ms[0].value, G_TYPE_STRING); g_value_init(¶ms[1].value, INF_TYPE_USER_STATUS); const Glib::ustring& pref_name = preferences.user.name; if(m_retry_index > 1) { gchar* name = g_strdup_printf( "%s %u", pref_name.c_str(), m_retry_index); g_value_take_string(¶ms[0].value, name); } else { g_value_set_static_string( ¶ms[0].value, pref_name.c_str()); } if(m_folder.get_current_document() == &m_view) g_value_set_enum(¶ms[1].value, INF_USER_ACTIVE); else g_value_set_enum(¶ms[1].value, INF_USER_INACTIVE); // Extra properties for text session: TextSessionView* text_view = dynamic_cast<TextSessionView*>(&m_view); if(text_view) add_text_user_properties(params, *text_view); 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); m_view.set_info(_("User Join in progress..."), false); } }