static void
infinoted_plugin_document_stream_subscribe_done(
  InfinotedPluginDocumentStreamStream* stream,
  InfSessionProxy* proxy)
{
  InfSession* session;
  GParameter params[2] = {
    { "name", { 0 } },
    { "status", { 0 } }
  };

  g_assert(stream->proxy == NULL);
  stream->proxy = proxy;
  g_object_ref(proxy);

  g_object_get(G_OBJECT(proxy), "session", &session, NULL);

  /* User join via document stream only works for chat sessions
   * at the moment. */
  if(stream->username == NULL || *stream->username == '\0' ||
     INF_TEXT_IS_SESSION(session))
  {
    infinoted_plugin_document_stream_start(stream);
  }
  else if(INF_IS_CHAT_SESSION(session))
  {
    g_value_init(&params[0].value, G_TYPE_STRING);
    g_value_set_static_string(&params[0].value, stream->username);

    g_value_init(&params[1].value, INF_TYPE_USER_STATUS);
    g_value_set_enum(&params[1].value, INF_USER_ACTIVE);

    /* Join a user */
    stream->user_request = inf_session_proxy_join_user(
      INF_SESSION_PROXY(proxy),
      2,
      params,
      infinoted_plugin_document_stream_user_join_func,
      stream
    );
  }
  else
  {
    g_assert_not_reached();
  }

  g_object_unref(session);
}
static void
inf_test_mass_join_join_user(InfTestMassJoiner* joiner)
{
    InfSession* session;
    InfAdoptedStateVector* v;
    GParameter params[3] = {
        { "name", { 0 } },
        { "vector", { 0 } },
        { "caret-position", { 0 } }
    };

    g_value_init(&params[0].value, G_TYPE_STRING);
    g_value_init(&params[1].value, INF_ADOPTED_TYPE_STATE_VECTOR);
    g_value_init(&params[2].value, G_TYPE_UINT);

    g_value_set_static_string(&params[0].value, joiner->username);

    g_object_get(G_OBJECT(joiner->session), "session", &session, NULL);
    v = inf_adopted_algorithm_get_current(
            inf_adopted_session_get_algorithm(INF_ADOPTED_SESSION(session))
        );
    g_object_unref(session);

    g_value_set_boxed(&params[1].value, v);
    g_value_set_uint(&params[2].value, 0u);

    inf_session_proxy_join_user(
        INF_SESSION_PROXY(joiner->session),
        3,
        params,
        inf_test_mass_join_user_join_finished_cb,
        joiner
    );

    g_value_unset(&params[2].value);
    g_value_unset(&params[1].value);
    g_value_unset(&params[0].value);
}
Beispiel #3
0
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(), &params[0],
		on_user_join_finished_static, this);

	for(unsigned int i = 0; i < params.size(); ++i)
		g_value_unset(&params[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(&params[0].value, G_TYPE_STRING);
	g_value_init(&params[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(&params[0].value, name);
	}
	else
	{
		g_value_set_static_string(
			&params[0].value, pref_name.c_str());
	}

	if(m_folder.get_current_document() == &m_view)
		g_value_set_enum(&params[1].value, INF_USER_ACTIVE);
	else
		g_value_set_enum(&params[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(), &params[0],
		on_user_join_finished_static, this);

	for(unsigned int i = 0; i < params.size(); ++i)
		g_value_unset(&params[i].value);

	if(request != NULL)
	{
		m_request = request;
		g_object_ref(m_request);
		m_view.set_info(_("User Join in progress..."), false);
	}
}