1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-12 09:18:10 +03:00

Improve the sample GTK+ client program to make it a bit more functional.

(This used to be commit 3e8366c58c)
This commit is contained in:
Richard Sharpe 2001-02-19 02:19:03 +00:00
parent 8a3d6ee07e
commit 0ea6c2473b

View File

@ -37,6 +37,31 @@ struct tree_data {
};
void error_message(gchar *message) {
GtkWidget *dialog, *label, *okay_button;
/* Create the widgets */
dialog = gtk_dialog_new();
gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
label = gtk_label_new (message);
okay_button = gtk_button_new_with_label("Okay");
/* Ensure that the dialog box is destroyed when the user clicks ok. */
gtk_signal_connect_object (GTK_OBJECT (okay_button), "clicked",
GTK_SIGNAL_FUNC (gtk_widget_destroy), dialog);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->action_area),
okay_button);
/* Add the label, and show everything we've added to the dialog. */
gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox),
label);
gtk_widget_show_all (dialog);
}
/*
* We are given a widget, and we want to retrieve its URL so we
* can do a directory listing.
@ -88,7 +113,7 @@ char *get_path(GtkWidget *item)
* Now, build the path
*/
slprintf(path_string, sizeof(path_string)-1, "smb:/");
snprintf(path_string, sizeof(path_string), "smb:/");
for (j = i - 1; j >= 0; j--) {
@ -118,130 +143,6 @@ struct tree_data *make_tree_data(guint32 type, const char *name)
}
/* for all the GtkItem:: and GtkTreeItem:: signals */
static void cb_itemsignal( GtkWidget *item,
gchar *signame )
{
GtkWidget *real_tree, *aitem, *subtree;
gchar *name;
GtkLabel *label;
gint dh, err, dirlen, level;
char dirbuf[512];
struct smbc_dirent *dirp;
label = GTK_LABEL (GTK_BIN (item)->child);
/* Get the text of the label */
gtk_label_get (label, &name);
level = GTK_TREE(item->parent)->level;
/* Get the level of the tree which the item is in */
g_print ("%s called for item %s->%p, level %d\n", signame, name,
item, GTK_TREE (item->parent)->level);
if (strncmp(signame, "expand", 6) == 0) { /* Expand called */
char server[128];
if ((dh = smbc_opendir(get_path(item))) < 0) { /* Handle error */
g_print("cb_wholenet: Could not open dir %s, %s\n", get_path(item),
strerror(errno));
gtk_main_quit();
return;
}
real_tree = GTK_TREE_ITEM_SUBTREE(item); /* Get the subtree */
while ((err = smbc_getdents(dh, (struct smbc_dirent *)dirbuf,
sizeof(dirbuf))) != 0) {
if (err < 0) { /* An error, report it */
g_print("cb_wholenet: Could not read dir smbc://, %s\n",
strerror(errno));
gtk_main_quit();
return;
}
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) {
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);
/* Connect all GtkItem:: and GtkTreeItem:: signals */
gtk_signal_connect (GTK_OBJECT(aitem), "select",
GTK_SIGNAL_FUNC(cb_itemsignal), "select");
gtk_signal_connect (GTK_OBJECT(aitem), "deselect",
GTK_SIGNAL_FUNC(cb_itemsignal), "deselect");
gtk_signal_connect (GTK_OBJECT(aitem), "toggle",
GTK_SIGNAL_FUNC(cb_itemsignal), "toggle");
gtk_signal_connect (GTK_OBJECT(aitem), "expand",
GTK_SIGNAL_FUNC(cb_itemsignal), "expand");
gtk_signal_connect (GTK_OBJECT(aitem), "collapse",
GTK_SIGNAL_FUNC(cb_itemsignal), "collapse");
/* Add it to the parent tree */
gtk_tree_append (GTK_TREE(real_tree), aitem);
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);
if (dirp->smbc_type != SMBC_FILE &&
dirp->smbc_type != SMBC_IPC_SHARE &&
(strcmp(dirp->name, ".") != 0) &&
(strcmp(dirp->name, "..") !=0)){
subtree = gtk_tree_new();
gtk_tree_item_set_subtree(GTK_TREE_ITEM(aitem), subtree);
}
(char *)dirp += dirlen;
err -= dirlen;
}
}
smbc_closedir(dh);
}
}
/* Note that this is never called */
static void cb_unselect_child( GtkWidget *root_tree,
GtkWidget *child,
GtkWidget *subtree )
{
g_print ("unselect_child called for root tree %p, subtree %p, child %p\n",
root_tree, subtree, child);
}
/* Note that this is called every time the user clicks on an item,
whether it is already selected or not. */
static void cb_select_child (GtkWidget *root_tree, GtkWidget *child,
@ -367,16 +268,19 @@ static void cb_select_child (GtkWidget *root_tree, GtkWidget *child,
else {
/* Now format each of the relevant things ... */
slprintf(col2, sizeof(col2)-1, "%s%s%s%s%s%s(%0X)",
(st1.st_mode&0x20?"A":""),
(st1.st_mode&0x10?"D":""),
(st1.st_mode&0x08?"V":""),
(st1.st_mode&0x04?"S":""),
(st1.st_mode&0x02?"H":""),
(st1.st_mode&0x01?"R":""),
snprintf(col2, sizeof(col2), "%c%c%c%c%c%c%c%c%c(%0X)",
(st1.st_mode&S_IRUSR?'r':'-'),
(st1.st_mode&S_IWUSR?'w':'-'),
(st1.st_mode&S_IXUSR?'x':'-'),
(st1.st_mode&S_IRGRP?'r':'-'),
(st1.st_mode&S_IWGRP?'w':'-'),
(st1.st_mode&S_IXGRP?'x':'-'),
(st1.st_mode&S_IROTH?'r':'-'),
(st1.st_mode&S_IWOTH?'w':'-'),
(st1.st_mode&S_IXOTH?'x':'-'),
st1.st_mode);
slprintf(col3, sizeof(col3)-1, "%u", st1.st_size);
slprintf(col4, sizeof(col4)-1, "%s", ctime(&st1.st_ctime));
snprintf(col3, sizeof(col3), "%u", st1.st_size);
snprintf(col4, sizeof(col4), "%s", ctime(&st1.st_ctime));
}
}
@ -398,6 +302,158 @@ static void cb_select_child (GtkWidget *root_tree, GtkWidget *child,
}
/* Note that this is never called */
static void cb_unselect_child( GtkWidget *root_tree,
GtkWidget *child,
GtkWidget *subtree )
{
g_print ("unselect_child called for root tree %p, subtree %p, child %p\n",
root_tree, subtree, child);
}
/* for all the GtkItem:: and GtkTreeItem:: signals */
static void cb_itemsignal( GtkWidget *item,
gchar *signame )
{
GtkWidget *real_tree, *aitem, *subtree;
gchar *name;
GtkLabel *label;
gint dh, err, dirlen, level;
char dirbuf[512];
struct smbc_dirent *dirp;
label = GTK_LABEL (GTK_BIN (item)->child);
/* Get the text of the label */
gtk_label_get (label, &name);
level = GTK_TREE(item->parent)->level;
/* Get the level of the tree which the item is in */
g_print ("%s called for item %s->%p, level %d\n", signame, name,
item, GTK_TREE (item->parent)->level);
real_tree = GTK_TREE_ITEM_SUBTREE(item); /* Get the subtree */
if (strncmp(signame, "expand", 6) == 0) { /* Expand called */
char server[128];
if ((dh = smbc_opendir(get_path(item))) < 0) { /* Handle error */
gchar errmsg[256];
g_print("cb_itemsignal: Could not open dir %s, %s\n", get_path(item),
strerror(errno));
slprintf(errmsg, sizeof(errmsg), "cb_itemsignal: Could not open dir %s, %s\n", get_path(item), strerror(errno));
error_message(errmsg);
/* gtk_main_quit();*/
return;
}
while ((err = smbc_getdents(dh, (struct smbc_dirent *)dirbuf,
sizeof(dirbuf))) != 0) {
if (err < 0) { /* An error, report it */
gchar errmsg[256];
g_print("cb_itemsignal: Could not read dir smbc://, %s\n",
strerror(errno));
slprintf(errmsg, sizeof(errmsg), "cb_itemsignal: Could not read dir smbc://, %s\n", strerror(errno));
error_message(errmsg);
/* gtk_main_quit();*/
return;
}
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) {
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);
/* Connect all GtkItem:: and GtkTreeItem:: signals */
gtk_signal_connect (GTK_OBJECT(aitem), "select",
GTK_SIGNAL_FUNC(cb_itemsignal), "select");
gtk_signal_connect (GTK_OBJECT(aitem), "deselect",
GTK_SIGNAL_FUNC(cb_itemsignal), "deselect");
gtk_signal_connect (GTK_OBJECT(aitem), "toggle",
GTK_SIGNAL_FUNC(cb_itemsignal), "toggle");
gtk_signal_connect (GTK_OBJECT(aitem), "expand",
GTK_SIGNAL_FUNC(cb_itemsignal), "expand");
gtk_signal_connect (GTK_OBJECT(aitem), "collapse",
GTK_SIGNAL_FUNC(cb_itemsignal), "collapse");
/* Add it to the parent tree */
gtk_tree_append (GTK_TREE(real_tree), aitem);
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);
if (dirp->smbc_type != SMBC_FILE &&
dirp->smbc_type != SMBC_IPC_SHARE &&
(strcmp(dirp->name, ".") != 0) &&
(strcmp(dirp->name, "..") !=0)){
subtree = gtk_tree_new();
gtk_tree_item_set_subtree(GTK_TREE_ITEM(aitem), subtree);
gtk_signal_connect(GTK_OBJECT(subtree), "select_child",
GTK_SIGNAL_FUNC(cb_select_child), real_tree);
gtk_signal_connect(GTK_OBJECT(subtree), "unselect_child",
GTK_SIGNAL_FUNC(cb_unselect_child), real_tree);
}
(char *)dirp += dirlen;
err -= dirlen;
}
}
smbc_closedir(dh);
}
else if (strncmp(signame, "collapse", 8) == 0) {
GtkWidget *subtree = gtk_tree_new();
gtk_tree_remove_items(GTK_TREE(real_tree), GTK_TREE(real_tree)->children);
gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), subtree);
gtk_signal_connect (GTK_OBJECT(subtree), "select_child",
GTK_SIGNAL_FUNC(cb_select_child), real_tree);
gtk_signal_connect (GTK_OBJECT(subtree), "unselect_child",
GTK_SIGNAL_FUNC(cb_unselect_child), real_tree);
}
}
static void cb_selection_changed( GtkWidget *tree )
{
GList *i;
@ -438,6 +494,8 @@ static void cb_wholenet(GtkWidget *item, gchar *signame)
g_print ("%s called for item %s->%p, level %d\n", signame, name,
item, GTK_TREE (item->parent)->level);
real_tree = GTK_TREE_ITEM_SUBTREE(item); /* Get the subtree */
if (strncmp(signame, "expand", 6) == 0) { /* Expand called */
if ((dh = smbc_opendir("smb://")) < 0) { /* Handle error */
@ -451,8 +509,6 @@ static void cb_wholenet(GtkWidget *item, gchar *signame)
}
real_tree = GTK_TREE_ITEM_SUBTREE(item); /* Get the subtree */
while ((err = smbc_getdents(dh, (struct smbc_dirent *)dirbuf,
sizeof(dirbuf))) != 0) {
@ -502,6 +558,11 @@ static void cb_wholenet(GtkWidget *item, gchar *signame)
gtk_tree_item_set_subtree(GTK_TREE_ITEM(aitem), subtree);
gtk_signal_connect(GTK_OBJECT(subtree), "select_child",
GTK_SIGNAL_FUNC(cb_select_child), real_tree);
gtk_signal_connect(GTK_OBJECT(subtree), "unselect_child",
GTK_SIGNAL_FUNC(cb_unselect_child), real_tree);
(char *)dirp += dirlen;
err -= dirlen;
@ -512,6 +573,20 @@ static void cb_wholenet(GtkWidget *item, gchar *signame)
smbc_closedir(dh);
}
else { /* Must be collapse ... FIXME ... */
GtkWidget *subtree = gtk_tree_new();
gtk_tree_remove_items(GTK_TREE(real_tree), GTK_TREE(real_tree)->children);
gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), subtree);
gtk_signal_connect (GTK_OBJECT(subtree), "select_child",
GTK_SIGNAL_FUNC(cb_select_child), real_tree);
gtk_signal_connect (GTK_OBJECT(subtree), "unselect_child",
GTK_SIGNAL_FUNC(cb_unselect_child), real_tree);
}
}
@ -548,6 +623,15 @@ int main( int argc,
err = smbc_init(auth_fn, 10);
/* Print an error response ... */
if (err < 0) {
fprintf(stderr, "smbc_init returned %s (%i)\nDo you have a ~/.smb/smb.conf file?\n", strerror(errno), errno);
exit(1);
}
/* a generic toplevel window */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_name(window, "main browser window");
@ -573,9 +657,6 @@ int main( int argc,
gtk_paned_gutter_size(GTK_PANED(r_pane), (GTK_PANED(r_pane))->handle_size);
gtk_container_add(GTK_CONTAINER(main_hbox), l_pane);
gtk_widget_show(l_pane);
/*gtk_container_add(GTK_CONTAINER(main_hbox), r_pane);
gtk_widget_show(r_pane); */
/* A generic scrolled window */
scrolled_win = gtk_scrolled_window_new (NULL, NULL);