Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions libinfgtk/inf-gtk-browser-store.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,13 @@ inf_gtk_browser_store_node_added_cb(InfBrowser* browser,
InfRequest* request,
gpointer user_data);

static void
inf_gtk_browser_store_node_renamed_cb(InfBrowser* browser,
InfBrowserIter* iter,
InfRequest* request,
gpointer user_data,
const gchar* new_name);

static void
inf_gtk_browser_store_node_removed_cb(InfBrowser* browser,
InfBrowserIter* iter,
Expand Down Expand Up @@ -761,6 +768,16 @@ inf_gtk_browser_store_node_added_cb(InfBrowser* browser,
}
}

static void
inf_gtk_browser_store_node_renamed_cb(InfBrowser* browser,
InfBrowserIter* iter,
InfRequest* request,
gpointer user_data,
const gchar* new_name)
{
/* TODO: Update the renamed node in the tree */
}

static void
inf_gtk_browser_store_node_removed_cb(InfBrowser* browser,
InfBrowserIter* iter,
Expand Down Expand Up @@ -1966,6 +1983,12 @@ inf_gtk_browser_store_browser_model_set_browser(InfGtkBrowserModel* model,
model
);

inf_signal_handlers_disconnect_by_func(
G_OBJECT(item->browser),
G_CALLBACK(inf_gtk_browser_store_node_renamed_cb),
model
);

inf_signal_handlers_disconnect_by_func(
G_OBJECT(item->browser),
G_CALLBACK(inf_gtk_browser_store_node_removed_cb),
Expand Down Expand Up @@ -2026,6 +2049,13 @@ inf_gtk_browser_store_browser_model_set_browser(InfGtkBrowserModel* model,
model
);

g_signal_connect_after(
G_OBJECT(item->browser),
"node-renamed",
G_CALLBACK(inf_gtk_browser_store_node_renamed_cb),
model
);

g_signal_connect_after(
G_OBJECT(item->browser),
"node-removed",
Expand Down
142 changes: 142 additions & 0 deletions libinfinity/client/infc-browser.c
Original file line number Diff line number Diff line change
Expand Up @@ -624,6 +624,19 @@ infc_browser_session_remove_child_sessions(InfcBrowser* browser,
}
}

static void
infc_browser_node_rename(InfcBrowser* browser,
InfcBrowserNode* node,
InfcRequest* request,
const gchar* new_name)
{
InfBrowserIter iter;
iter.node_id = node->id;
iter.node = node;

inf_browser_node_renamed(INF_BROWSER(browser), &iter, INF_REQUEST(request), new_name);
}

static void
infc_browser_node_register(InfcBrowser* browser,
InfcBrowserNode* node,
Expand Down Expand Up @@ -1240,6 +1253,7 @@ infc_browser_session_notify_subscription_group_cb(InfSession* session,
const GParamSpec* spec,
gpointer user_data)
{
return;
InfcBrowser* browser;
InfcBrowserPrivate* priv;
InfBrowserIter* iter;
Expand Down Expand Up @@ -3512,6 +3526,71 @@ infc_browser_handle_sync_in(InfcBrowser* browser,
return result;
}

static gboolean
infc_browser_handle_rename_node(InfcBrowser* browser,
InfXmlConnection* connection,
xmlNodePtr xml,
GError** error)
{
InfcBrowserPrivate* priv;
InfcBrowserNode* node;
InfSession* session;
InfcSessionProxy* proxy;
InfcRequest* request;
InfBrowserIter iter;
xmlChar* new_name;

if((new_name = inf_xml_util_get_attribute_required(xml, "new_name", error)) == NULL) return FALSE;

priv = INFC_BROWSER_PRIVATE(browser);
node = infc_browser_get_node_from_xml(browser, xml, "id", error);
if(node == NULL)
{
xmlFree(new_name);
return FALSE;
}

if(node->type == INFC_BROWSER_NODE_NOTE_KNOWN &&
node->shared.known.session)
{
proxy = node->shared.known.session;
g_object_get(G_OBJECT(proxy), "session", &session, NULL);

// TODO: g_signal_emit notify::rename on session right here?
}

request = infc_request_manager_get_request_by_xml(
priv->request_manager,
"rename-node",
xml,
NULL
);

if(request != NULL)
{
g_object_ref(request);

iter.node_id = node->id;
iter.node = node;

infc_request_manager_finish_request(
priv->request_manager,
request,
inf_request_result_make_rename_node(INF_BROWSER(browser), &iter, new_name)
);
}

/* Apply new name to node */
free(node->name);
node->name = g_strdup(new_name);
free(new_name);

if(request != NULL)
g_object_unref(request);

return TRUE;
}

static gboolean
infc_browser_handle_remove_node(InfcBrowser* browser,
InfXmlConnection* connection,
Expand Down Expand Up @@ -4746,6 +4825,15 @@ infc_browser_communication_object_received(InfCommunicationObject* object,
&local_error
);
}
else if(strcmp((const gchar*)node->name, "rename-node") == 0)
{
infc_browser_handle_rename_node(
browser,
connection,
node,
&local_error
);
}
else if(strcmp((const gchar*)node->name, "remove-node") == 0)
{
infc_browser_handle_remove_node(
Expand Down Expand Up @@ -5615,6 +5703,59 @@ infc_browser_browser_add_subdirectory(InfBrowser* infbrowser,
return INF_REQUEST(request);
}

static InfRequest*
infc_browser_browser_rename_node(InfBrowser* infbrowser,
const InfBrowserIter* iter,
const char* new_name,
InfRequestFunc func,
gpointer user_data)
{
InfcBrowser* browser;
InfcBrowserPrivate* priv;
InfcBrowserNode* node;
InfcRequest* request;
xmlNodePtr xml;

g_return_val_if_fail(INFC_IS_BROWSER(infbrowser), NULL);
browser = INFC_BROWSER(infbrowser);
infc_browser_return_val_if_iter_fail(browser, iter, NULL);

priv = INFC_BROWSER_PRIVATE(browser);
node = (InfcBrowserNode*)iter->node;

/* The root node cannot be renamed */
g_return_val_if_fail(node->parent != NULL, NULL);

/* TODO: Check that there is not a rename-node request already enqueued. */

g_return_val_if_fail(priv->connection != NULL, NULL);
g_return_val_if_fail(priv->status == INF_BROWSER_OPEN, NULL);

request = infc_request_manager_add_request(
priv->request_manager,
INFC_TYPE_REQUEST,
"rename-node",
G_CALLBACK(func),
user_data,
"node-id", iter->node_id,
NULL
);

inf_browser_begin_request(INF_BROWSER(browser), iter, INF_REQUEST(request));

xml = infc_browser_request_to_xml(request);
inf_xml_util_set_attribute_uint(xml, "id", node->id);
inf_xml_util_set_attribute(xml, "new_name", new_name);

inf_communication_group_send_message(
INF_COMMUNICATION_GROUP(priv->group),
priv->connection,
xml
);

return INF_REQUEST(request);
}

static InfRequest*
infc_browser_browser_remove_node(InfBrowser* infbrowser,
const InfBrowserIter* iter,
Expand Down Expand Up @@ -6322,6 +6463,7 @@ infc_browser_browser_init(gpointer g_iface,
iface->is_subdirectory = infc_browser_browser_is_subdirectory;
iface->add_note = infc_browser_browser_add_note;
iface->add_subdirectory = infc_browser_browser_add_subdirectory;
iface->rename_node = infc_browser_browser_rename_node;
iface->remove_node = infc_browser_browser_remove_node;
iface->get_node_name = infc_browser_browser_get_node_name;
iface->get_node_type = infc_browser_browser_get_node_type;
Expand Down
89 changes: 89 additions & 0 deletions libinfinity/common/inf-browser.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
enum {
ERROR_,
NODE_ADDED,
NODE_RENAMED,
NODE_REMOVED,
SUBSCRIBE_SESSION,
UNSUBSCRIBE_SESSION,
Expand Down Expand Up @@ -131,6 +132,29 @@ inf_browser_base_init(gpointer g_class)
INF_TYPE_REQUEST
);

/**
* InfBrowser::node-renamed:
* @browser: The #InfBrowser object emitting the signal.
* @iter: An iterator pointing to the node being renamed.
* @request: The request that lead to the node being renamed, or %NULL.
*
* This signal is emitted just before a node is being renamed.
* The iterator is still valid and can be used to access the
* node which will be renamed.
*/
browser_signals[NODE_RENAMED] = g_signal_new(
"node-renamed",
INF_TYPE_BROWSER,
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET(InfBrowserIface, node_renamed),
NULL, NULL,
inf_marshal_VOID__BOXED_OBJECT,
G_TYPE_NONE,
2,
INF_TYPE_BROWSER_ITER | G_SIGNAL_TYPE_STATIC_SCOPE,
INF_TYPE_REQUEST
);

/**
* InfBrowser::node-removed:
* @browser: The #InfBrowser object emitting the signal.
Expand Down Expand Up @@ -864,6 +888,42 @@ inf_browser_add_subdirectory(InfBrowser* browser,
return iface->add_subdirectory(browser, iter, name, acl, func, user_data);
}

/**
* inf_browser_rename_node:
* @browser: A #InfBrowser.
* @iter: A #InfBrowserIter pointing to a node inside @browser.
* @func: The function to be called when the request finishes, or %NULL.
* @user_data: Additional data to pass to @func.
*
* Requests to rename the node @iter points to.
*
* The request might either finish during the call to this function, in which
* case @func will be called and %NULL being returned. If the request does not
* finish within the function call, a #InfRequest object is returned,
* where @func has been installed for the #InfRequest::finished signal,
* so that it is called as soon as the request finishes.
*
* Returns: A #InfRequest which can be used to get notified when the
* request finishes.
*/
InfRequest*
inf_browser_rename_node(InfBrowser* browser,
const InfBrowserIter* iter,
const char* new_name,
InfRequestFunc func,
gpointer user_data)
{
InfBrowserIface* iface;

g_return_val_if_fail(INF_IS_BROWSER(browser), NULL);
g_return_val_if_fail(iter != NULL, NULL);

iface = INF_BROWSER_GET_IFACE(browser);
g_return_val_if_fail(iface->rename_node != NULL, NULL);

return iface->rename_node(browser, iter, new_name, func, user_data);
}

/**
* inf_browser_remove_node:
* @browser: A #InfBrowser.
Expand Down Expand Up @@ -1653,6 +1713,35 @@ inf_browser_node_added(InfBrowser* browser,
);
}

/**
* inf_browser_node_renamed:
* @browser: A #InfBrowser.
* @iter: A #InfBrowserIter pointing to the node to be renamed.
* @request: The #InfRequest that was used to rename the node, or %NULL.
*
* This function emits the #InfBrowser::node-renamed signal on @browser. It
* is meant to be used by interface implementations only.
*/
void
inf_browser_node_renamed(InfBrowser* browser,
const InfBrowserIter* iter,
InfRequest* request,
const gchar* new_name)
{
g_return_if_fail(INF_IS_BROWSER(browser));
g_return_if_fail(iter != NULL);
g_return_if_fail(request == NULL || INF_IS_REQUEST(request));

g_signal_emit(
browser,
browser_signals[NODE_RENAMED],
0,
iter,
request,
new_name
);
}

/**
* inf_browser_node_removed:
* @browser: A #InfBrowser.
Expand Down
17 changes: 17 additions & 0 deletions libinfinity/common/inf-browser.h
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,11 @@ struct _InfBrowserIface {
const InfBrowserIter* iter,
InfRequest* request);

void (*node_renamed)(InfBrowser* browser,
const InfBrowserIter* iter,
InfRequest* request,
const gchar* new_name);

void (*node_removed)(InfBrowser* browser,
const InfBrowserIter* iter,
InfRequest* request);
Expand Down Expand Up @@ -208,6 +213,11 @@ struct _InfBrowserIface {
const InfAclSheetSet* acl,
InfRequestFunc func,
gpointer user_data);
InfRequest* (*rename_node)(InfBrowser* browser,
const InfBrowserIter* iter,
const char* new_name,
InfRequestFunc func,
gpointer user_data);
InfRequest* (*remove_node)(InfBrowser* browser,
const InfBrowserIter* iter,
InfRequestFunc func,
Expand Down Expand Up @@ -336,6 +346,13 @@ inf_browser_add_subdirectory(InfBrowser* browser,
InfRequestFunc func,
gpointer user_data);

InfRequest*
inf_browser_rename_node(InfBrowser* browser,
const InfBrowserIter* iter,
const char* new_name,
InfRequestFunc func,
gpointer user_data);

InfRequest*
inf_browser_remove_node(InfBrowser* browser,
const InfBrowserIter* iter,
Expand Down
Loading