diff options
-rw-r--r-- | source3/client/tree.c | 198 |
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(); |