static void infc_request_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec) { InfcRequest* request; InfcRequestPrivate* priv; request = INFC_REQUEST(object); priv = INFC_REQUEST_PRIVATE(request); switch(prop_id) { case PROP_SEQ: priv->seq = g_value_get_uint(value); break; case PROP_NAME: g_free(priv->name); priv->name = g_value_dup_string(value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } }
static void infc_request_init(GTypeInstance* instance, gpointer g_class) { InfcRequest* request; InfcRequestPrivate* priv; request = INFC_REQUEST(instance); priv = INFC_REQUEST_PRIVATE(request); priv->seq = 0; priv->name = NULL; }
static void infc_request_finalize(GObject* object) { InfcRequest* request; InfcRequestPrivate* priv; request = INFC_REQUEST(object); priv = INFC_REQUEST_PRIVATE(request); g_free(priv->name); if(parent_class->finalize != NULL) parent_class->finalize(object); }
/** * infc_request_manager_get_request_by_seq: * @manager: A #InfcRequestManager. * @seq: The sequence number to which the request should be retrieved. * * Returns a previously-added request that has the given seq. * * Return Value: The request with the given seq, or %NULL if there is no such * request. **/ InfcRequest* infc_request_manager_get_request_by_seq(InfcRequestManager* manager, guint seq) { InfcRequestManagerPrivate* priv; g_return_val_if_fail(INFC_IS_REQUEST_MANAGER(manager), NULL); priv = INFC_REQUEST_MANAGER_PRIVATE(manager); return INFC_REQUEST( g_hash_table_lookup(priv->requests, GUINT_TO_POINTER(seq)) ); }
/** * infc_session_proxy_join_user: * @proxy: A #InfcSessionProxy. * @params: Construction properties for the InfUser (or derived) object. * @n_params: Number of parameters. * @error: Location to store error information. * * Requests a user join for a user with the given properties (which must not * include ID and status since these are initially set by the server). * * Return Value: A #InfcUserRequest object that may be used to get notified * when the request succeeds or fails. **/ InfcUserRequest* infc_session_proxy_join_user(InfcSessionProxy* proxy, const GParameter* params, guint n_params, GError** error) { InfcSessionProxyPrivate* priv; InfSessionClass* session_class; InfSessionStatus status; InfcRequest* request; xmlNodePtr xml; g_return_val_if_fail(INFC_IS_SESSION_PROXY(proxy), NULL); g_return_val_if_fail(params != NULL || n_params == 0, NULL); priv = INFC_SESSION_PROXY_PRIVATE(proxy); g_return_val_if_fail(priv->session != NULL, NULL); session_class = INF_SESSION_GET_CLASS(priv->session); /* Make sure we are subscribed */ g_object_get(G_OBJECT(priv->session), "status", &status, NULL); g_return_val_if_fail(status == INF_SESSION_RUNNING, NULL); g_return_val_if_fail(priv->connection != NULL, NULL); /* TODO: Check params locally */ request = infc_request_manager_add_request( priv->request_manager, INFC_TYPE_USER_REQUEST, "user-join", NULL ); xml = infc_session_proxy_request_to_xml(INFC_REQUEST(request)); g_assert(session_class->set_xml_user_props != NULL); session_class->set_xml_user_props(priv->session, params, n_params, xml); inf_connection_manager_group_send_to_connection( priv->subscription_group, priv->connection, xml ); return INFC_USER_REQUEST(request); }
static void infc_request_manager_foreach_request_func(gpointer key, gpointer value, gpointer user_data) { InfcRequest* request; InfcRequestManagerForeachData* foreach_data; request = INFC_REQUEST(value); foreach_data = (InfcRequestManagerForeachData*)user_data; if(foreach_data->name == NULL || strcmp(foreach_data->name, infc_request_get_name(request)) == 0) { foreach_data->func(request, foreach_data->user_data); } }
/** * infc_request_manager_add_request_valist: * @manager: A #InfcRequestManager. * @request_type: The type of request to add, such as %INFC_TYPE_NODE_REQUEST. * @request_name: The name of the request, such as "explore-node" or * "subscribe-session" * @first_property_name: The first property name apart from name and seq to * set for the new request. * @arglist: The value of the first property, followed optionally by more * name/value pairs, followed by %NULL. * * Adds a request to the request manager. * * Return Value: The generated #InfcRequest (actually of type @request_type). */ InfcRequest* infc_request_manager_add_request_valist(InfcRequestManager* manager, GType request_type, const gchar* request_name, const gchar* first_property_name, va_list arglist) { InfcRequestManagerPrivate* priv; GObjectClass* request_class; InfcRequest* request; GParameter* params; const gchar* prop_name; gsize param_size; gsize param_alloc; guint seq; gchar* error; GParamSpec* pspec; guint i; g_return_val_if_fail(INFC_IS_REQUEST_MANAGER(manager), NULL); g_return_val_if_fail(request_name != NULL, NULL); request_class = g_type_class_ref(request_type); g_return_val_if_fail(request_class != NULL, NULL); priv = INFC_REQUEST_MANAGER_PRIVATE(manager); seq = priv->seq_counter; g_assert( g_hash_table_lookup(priv->requests, GUINT_TO_POINTER(seq)) == NULL ); param_size = 0; param_alloc = 16; params = g_malloc0(param_alloc * sizeof(GParameter)); params[param_size].name = "name"; g_value_init(¶ms[param_size].value, G_TYPE_STRING); g_value_set_static_string(¶ms[param_size].value, request_name); ++ param_size; params[param_size].name = "seq"; g_value_init(¶ms[param_size].value, G_TYPE_UINT); g_value_set_uint(¶ms[param_size].value, seq); ++ param_size; prop_name = first_property_name; error = NULL; while(prop_name != NULL) { pspec = g_object_class_find_property(request_class, prop_name); if(pspec == NULL) { g_warning( "%s: object class `%s' has no attribute named `%s'", G_STRFUNC, g_type_name(request_type), prop_name ); break; } if(param_size >= param_alloc) { param_alloc += 16; params = g_realloc(params, param_alloc * sizeof(GParameter)); } params[param_size].name = prop_name; g_value_init(¶ms[param_size].value, G_PARAM_SPEC_VALUE_TYPE(pspec)); G_VALUE_COLLECT(¶ms[param_size].value, arglist, 0, &error); if(error != NULL) { g_warning("%s: %s", G_STRFUNC, error); g_value_unset(¶ms[param_size].value); g_free(error); break; } ++ param_size; prop_name = va_arg(arglist, const gchar*); } if(prop_name == NULL) { request = INFC_REQUEST(g_object_newv(request_type, param_size, params)); g_hash_table_insert(priv->requests, GUINT_TO_POINTER(seq), request); ++ priv->seq_counter; } else { /* An error occured. We do not use GError here tough, because this is a * most likely a bug in someone's code (if not, it is one in infinote's * code). */ request = NULL; } for(i = 0; i < param_size; ++ i) g_value_unset(¶ms[i].value); g_free(params); g_type_class_unref(request_class); return request; }