summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/client/tree.c198
1 files changed, 122 insertions, 76 deletions
diff --git a/source3/client/tree.c b/source3/client/tree.c
index 77f882f193..e2c7fb70d8 100644
--- a/source3/client/tree.c
+++ b/source3/client/tree.c
@@ -28,6 +28,94 @@
#include <gtk/gtk.h>
#include "libsmbclient.h"
+struct tree_data {
+
+ guint32 type; /* Type of tree item, an SMBC_TYPE */
+ char name[256]; /* May need to change this later */
+
+};
+
+/*
+ * We are given a widget, and we want to retrieve its URL so we
+ * can do a directory listing.
+ *
+ * We walk back up the tree, picking up pieces until we hit a server or
+ * workgroup type and return a path from there
+ */
+
+static char path_string[1024];
+
+char *get_path(GtkWidget *item)
+{
+ GtkWidget *p = item;
+ struct tree_data *pd;
+ char *comps[1024]; /* We keep pointers to the components here */
+ int i = 0, j, level,type;
+
+ /* Walk back up the tree, getting the private data */
+
+ level = GTK_TREE(item->parent)->level;
+
+ /* Pick up this item's component info */
+
+ pd = (struct tree_data *)gtk_object_get_user_data(GTK_OBJECT(item));
+
+ comps[i++] = pd->name;
+ type = pd->type;
+
+ while (level > 0 && type != SMBC_SERVER && type != SMBC_WORKGROUP) {
+
+ /* Find the parent and extract the data etc ... */
+
+ p = GTK_WIDGET(p->parent);
+ p = GTK_WIDGET(GTK_TREE(p)->tree_owner);
+
+ pd = (struct tree_data *)gtk_object_get_user_data(GTK_OBJECT(p));
+
+ level = GTK_TREE(item->parent)->level;
+
+ comps[i++] = pd->name;
+ type = pd->type;
+
+ }
+
+ /*
+ * Got a list of comps now, should check that we did not hit a workgroup
+ * when we got other things as well ... Later
+ *
+ * Now, build the path
+ */
+
+ snprintf(path_string, sizeof(path_string), "smb:/");
+
+ for (j = i - 1; j >= 0; j--) {
+
+ strncat(path_string, "/", sizeof(path_string) - strlen(path_string));
+ strncat(path_string, comps[j], sizeof(path_string) - strlen(path_string));
+
+ }
+
+ fprintf(stdout, "Path string = %s\n", path_string);
+
+ return path_string;
+
+}
+
+struct tree_data *make_tree_data(guint32 type, const char *name)
+{
+ struct tree_data *p = (struct tree_data *)malloc(sizeof(struct tree_data));
+
+ if (p) {
+
+ p->type = type;
+ strncpy(p->name, name, sizeof(p->name));
+
+ }
+
+ return p;
+
+}
+
/* for all the GtkItem:: and GtkTreeItem:: signals */
static void cb_itemsignal( GtkWidget *item,
gchar *signame )
@@ -39,8 +127,6 @@ static void cb_itemsignal( GtkWidget *item,
char dirbuf[512];
struct smbc_dirent *dirp;
- /* It's a Bin, so it has one child, which we know to be a
- label, so get that */
label = GTK_LABEL (GTK_BIN (item)->child);
/* Get the text of the label */
gtk_label_get (label, &name);
@@ -54,23 +140,7 @@ static void cb_itemsignal( GtkWidget *item,
if (strncmp(signame, "expand", 6) == 0) { /* Expand called */
char server[128];
- if (level>0) {
- gchar *sname;
- GtkLabel *l2;
- GtkWidget *p = GTK_WIDGET(item->parent);
-
- p = GTK_TREE(p)->tree_owner;
-
- l2 = GTK_LABEL(GTK_BIN(p)->child);
-
- gtk_label_get(l2, &sname);
- slprintf(server, 128, "smb://%s/%s", sname, name);
-
- }
- else
- slprintf(server, 128, "smb://%s", name);
-
- if ((dh = smbc_opendir(server)) < 0) { /* Handle error */
+ if ((dh = smbc_opendir(get_path(item))) < 0) { /* Handle error */
g_print("cb_wholenet: Could not open dir %s, %s\n", server,
strerror(errno));
@@ -100,9 +170,21 @@ static void cb_itemsignal( GtkWidget *item,
dirp = (struct smbc_dirent *)dirbuf;
while (err > 0) {
+ struct tree_data *my_data;
+
+ dirlen = dirp->dirlen;
+
+ my_data = make_tree_data(dirp->smbc_type, dirp->name);
+
+ if (!my_data) {
- dirlen = sizeof(struct smbc_dirent) + dirp->namelen +
- dirp->commentlen + 1;
+ g_print("Could not allocate space for tree_data: %s\n",
+ dirp->name);
+
+ gtk_main_quit();
+ return;
+
+ }
aitem = gtk_tree_item_new_with_label(dirp->name);
@@ -119,14 +201,19 @@ static void cb_itemsignal( GtkWidget *item,
GTK_SIGNAL_FUNC(cb_itemsignal), "collapse");
/* Add it to the parent tree */
gtk_tree_append (GTK_TREE(real_tree), aitem);
- /* Show it - this can be done at any time */
+
gtk_widget_show (aitem);
+ gtk_object_set_user_data(GTK_OBJECT(aitem), (gpointer)my_data);
+
fprintf(stdout, "Added: %s, len: %u\n", dirp->name, dirlen);
- subtree = gtk_tree_new();
+ if (dirp->smbc_type != SMBC_FILE && dirp->smbc_type != SMBC_IPC_SHARE){
+
+ subtree = gtk_tree_new();
+ gtk_tree_item_set_subtree(GTK_TREE_ITEM(aitem), subtree);
- gtk_tree_item_set_subtree(GTK_TREE_ITEM(aitem), subtree);
+ }
(char *)dirp += dirlen;
err -= dirlen;
@@ -231,9 +318,11 @@ static void cb_wholenet(GtkWidget *item, gchar *signame)
dirp = (struct smbc_dirent *)dirbuf;
while (err > 0) {
+ struct tree_data *my_data;
- dirlen = sizeof(struct smbc_dirent) + dirp->namelen +
- dirp->commentlen + 1;
+ dirlen = dirp->dirlen;
+
+ my_data = make_tree_data(dirp->smbc_type, dirp->name);
aitem = gtk_tree_item_new_with_label(dirp->name);
@@ -253,6 +342,8 @@ static void cb_wholenet(GtkWidget *item, gchar *signame)
/* Show it - this can be done at any time */
gtk_widget_show (aitem);
+ gtk_object_set_user_data(GTK_OBJECT(aitem), (gpointer)my_data);
+
fprintf(stdout, "Added: %s, len: %u\n", dirp->name, dirlen);
subtree = gtk_tree_new();
@@ -270,54 +361,6 @@ static void cb_wholenet(GtkWidget *item, gchar *signame)
}
- /* Create this item's subtree */
- /* subtree = gtk_tree_new();
- g_print ("-> item %s->%p, subtree %p\n", "Whole Network", item,
- subtree);
-
- /* This is still necessary if you want these signals to be called
- for the subtree's children. Note that selection_change will be
- signalled for the root tree regardless. */
- /* gtk_signal_connect (GTK_OBJECT(subtree), "select_child",
- GTK_SIGNAL_FUNC(cb_select_child), subtree);
- gtk_signal_connect (GTK_OBJECT(subtree), "unselect_child",
- GTK_SIGNAL_FUNC(cb_unselect_child), subtree);
- /* This has absolutely no effect, because it is completely ignored
- in subtrees */
- /* gtk_tree_set_selection_mode (GTK_TREE(subtree),
- GTK_SELECTION_SINGLE);
- /* Neither does this, but for a rather different reason - the
- view_mode and view_line values of a tree are propagated to
- subtrees when they are mapped. So, setting it later on would
- actually have a (somewhat unpredictable) effect */
- /* gtk_tree_set_view_mode (GTK_TREE(subtree), GTK_TREE_VIEW_ITEM);
- /* Set this item's subtree - note that you cannot do this until
- AFTER the item has been added to its parent tree! */
- /* gtk_tree_item_set_subtree (GTK_TREE_ITEM(item), subtree);
-
- for (j = 0; j < 5; j++){
- GtkWidget *subitem;
-
- /* Create a subtree item, in much the same way */
- /* subitem = gtk_tree_item_new_with_label (itemnames[j]);
- /* Connect all GtkItem:: and GtkTreeItem:: signals */
- /* gtk_signal_connect (GTK_OBJECT(subitem), "select",
- GTK_SIGNAL_FUNC(cb_itemsignal), "select");
- gtk_signal_connect (GTK_OBJECT(subitem), "deselect",
- GTK_SIGNAL_FUNC(cb_itemsignal), "deselect");
- gtk_signal_connect (GTK_OBJECT(subitem), "toggle",
- GTK_SIGNAL_FUNC(cb_itemsignal), "toggle");
- gtk_signal_connect (GTK_OBJECT(subitem), "expand",
- GTK_SIGNAL_FUNC(cb_itemsignal), "expand");
- gtk_signal_connect (GTK_OBJECT(subitem), "collapse",
- GTK_SIGNAL_FUNC(cb_itemsignal), "collapse");
- g_print ("-> -> item %s->%p\n", itemnames[j], subitem);
- /* Add it to its parent tree */
- /* gtk_tree_append (GTK_TREE(subtree), subitem);
- /* Show it */
- /* gtk_widget_show (subitem);
- }
- */
}
static void
@@ -434,9 +477,10 @@ int main( int argc,
fprintf(stdout, "Dir len: %u\n", err);
while (err > 0) { /* Extract each entry and make a sub-tree */
+ struct tree_data *my_data;
+ int dirlen = dirp->dirlen;
- int dirlen = sizeof(struct smbc_dirent) + dirp->namelen +
- dirp->commentlen + 1;
+ my_data = make_tree_data(dirp->smbc_type, dirp->name);
item = gtk_tree_item_new_with_label(dirp->name);
/* Connect all GtkItem:: and GtkTreeItem:: signals */
@@ -455,6 +499,8 @@ int main( int argc,
/* Show it - this can be done at any time */
gtk_widget_show (item);
+ gtk_object_set_user_data(GTK_OBJECT(item), (gpointer)my_data);
+
fprintf(stdout, "Added: %s, len: %u\n", dirp->name, dirlen);
subtree = gtk_tree_new();