Example #1
0
// 正确的关闭客户端
void client_shutdown(int sig)
{
  // 设置全局停止变量以停止连接到其他peer, 以及允许其他peer的连接. Set global stop variable so that we stop trying to connect to peers and
  // 这控制了其他peer连接的套接字和连接到其他peer的线程.
	exit_window();
	g_done=1;
    int sockfd = connect_to_host(g_tracker_ip, g_tracker_port);
	
    int request_len = 0;
    char *request = make_tracker_request(BT_STOPPED, &request_len);
    send(sockfd, request, request_len, 0);
    free(request);
    close(sockfd);
    close(g_peerport);
    close(listenfd);
    int i;
    for (i = 0; i <g_torrentmeta->filenum; i++){
		if (g_torrentmeta->flist[i].fp!=NULL)
        	fclose(g_torrentmeta->flist[i].fp);
    }
    sleep(1);
    exit(0);
}
Example #2
0
void save_config (GtkButton *button, gpointer user_data)
{
	GtkTreeIter f_iter, h_iter;
	GValue f_value = {0};
	GValue h_value = {0};
	gchar *f_src, *f_dst, *h_val;
	gboolean delete_cond = FALSE, valid = TRUE; 
	gint i, j;
	GtkWidget *dialog;
	Widgets *widgets = (Widgets*)user_data;

	if(gtk_tree_model_get_iter_first (widgets->store, &f_iter) && gtk_tree_model_get_iter_first (widgets->store_hidden, &h_iter))
	{
		gtk_tree_model_get_iter_first (widgets->store_hidden, &h_iter);
		do
		{
			gtk_tree_model_get_value (widgets->store_hidden, &h_iter, 0, &h_value);
			gtk_tree_model_get_iter_first (widgets->store, &f_iter);
			do
			{
				gtk_tree_model_get_value (widgets->store, &f_iter, 0, &f_value);
				if(strcmp(g_value_get_string (&f_value), g_value_get_string (&h_value)) == 0)
				{
					if(!gtk_tree_store_remove (widgets->store_hidden, &h_iter))
					{
						valid = FALSE;
					}
					delete_cond = TRUE;
					g_value_unset(&f_value);
					break;
				}
				g_value_unset(&f_value);
				
				gtk_tree_model_get_value (widgets->store, &f_iter, 1, &f_value);
				if(strcmp(g_value_get_string (&f_value), g_value_get_string (&h_value)) == 0)
				{
					if(!gtk_tree_store_remove (widgets->store_hidden, &h_iter))
					{
						valid = FALSE;
					}
					delete_cond = TRUE;
					g_value_unset(&f_value);
					break;
				}
				g_value_unset(&f_value);
			}
			while (gtk_tree_model_iter_next (widgets->store, &f_iter));
			g_value_unset(&h_value);
			if(delete_cond)
			{
				delete_cond = FALSE;
			}
			else
			{
				if(!gtk_tree_model_iter_next (widgets->store_hidden, &h_iter))
				{
					valid = FALSE;
				}
			}
		}
		while (valid);
	}
	
	if(gtk_tree_model_get_iter_first (widgets->store, &f_iter))
	{
		j=0;
		do
		{
			gtk_tree_model_get_value (widgets->store, &f_iter, 0, &f_value);
			f_src = g_value_get_string (&f_value);
			for(i=0; i<size_lang; i++)
			{
				if(strcmp(f_src, dicts[i].name) == 0)
				{
					favorite[j].src_code = i;
					break;
				}
			}
			g_value_unset(&f_value);
			gtk_tree_model_get_value (widgets->store, &f_iter, 1, &f_value);
			f_dst = g_value_get_string (&f_value);
			for(i=0; i<size_lang; i++)
			{
				if(strcmp(f_dst, dicts[i].name) == 0)
				{
					favorite[j].dst_code = i;
					break;
				}
			}
			g_value_unset(&f_value);
			//g_print ("\n%s -> %s", *f_src, *f_dst);
			j++;
		}
		while(gtk_tree_model_iter_next (widgets->store, &f_iter));
	}

	for(i=0; i<sizeof(favorite)/sizeof(favorite[0]); i++)
	{
		if(favorite[i].src_code == -1)
		{
			break;
		}
		g_print("\n%d %d", favorite[i].src_code, favorite[i].dst_code);
	}

	if(gtk_tree_model_get_iter_first (widgets->store_hidden, &h_iter))
	{
		j=0;
		do
		{
			gtk_tree_model_get_value (widgets->store_hidden, &h_iter, 0, &h_value);
			h_val = g_value_get_string (&h_value);
			for(i=0; i<size_lang; i++)
			{
				if(strcmp(h_val, dicts[i].name) == 0)
				{
					h_dict[j].code = i;
					break;
				}
			}
			g_value_unset(&h_value);
			j++;
		}
		while(gtk_tree_model_iter_next (widgets->store_hidden, &h_iter));
	}

	for(i=0; i<sizeof(h_dict)/sizeof(h_dict[0]); i++)
	{
		if(h_dict[i].code == -1)
		{
			break;
		}
		g_print("\n%d", h_dict[i].code);
	}

	strcpy (shortcut[0].name, gtk_entry_get_text (widgets->entry_sn));
	strcpy (shortcut[1].name, gtk_entry_get_text (widgets->entry_wn));
	strcpy (shortcut[2].name, gtk_entry_get_text (widgets->entry_sf));
	strcpy (shortcut[3].name, gtk_entry_get_text (widgets->entry_sb));
	strcpy (shortcut[4].name, gtk_entry_get_text (widgets->log_file_entry));
	strcpy (shortcut[5].name, gtk_entry_get_text (widgets->save_freq_entry));
	

	save_config_file (conf_file, &shortcut, &favorite, &h_dict);
	exit_window (NULL, user_data);
	exit_code = 1;
}