⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 callbacks.c

📁 unix/linux下支持各种压缩算法的软件
💻 C
📖 第 1 页 / 共 4 页
字号:
	{		gtk_file_filter_add_pattern (filter, Suffix->data);		Suffix = g_list_next ( Suffix );	}	gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (File_Selector), filter);			Suffix = g_list_first ( ArchiveSuffix );			while ( Suffix != NULL )	{		if ( Suffix->data != "" )	//To avoid double filtering when opening the archive		{			filter = gtk_file_filter_new ();			gtk_file_filter_set_name (filter, Suffix->data );			gtk_file_filter_add_pattern (filter, Suffix->data );			gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (File_Selector), filter);			}				Suffix = g_list_next ( Suffix );	}		if ( mode == "new" )	{		hbox = gtk_hbox_new (FALSE, 12);		gtk_box_pack_start (GTK_BOX (hbox),gtk_label_new (_("Archive type:")),FALSE, FALSE, 0);		combo_box = gtk_combo_box_new_text ();		FilterToolTip = gtk_tooltips_new();		gtk_tooltips_set_tip (FilterToolTip,combo_box, _("Choose the archive type to create") , NULL);		Name = g_list_first ( ArchiveType );		while ( Name != NULL )		{			if (Name->data != ".tgz" && Name->data != ".rpm" ) gtk_combo_box_append_text (GTK_COMBO_BOX (combo_box), Name->data );			Name = g_list_next ( Name );		}		gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), 0);		gtk_box_pack_start (GTK_BOX (hbox), combo_box, TRUE, TRUE, 0);		check_button = gtk_check_button_new_with_label (_("Add the archive extension to the filename"));		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(check_button),TRUE);		gtk_box_pack_start (GTK_BOX (hbox), check_button, TRUE, TRUE, 0);		gtk_widget_show_all (hbox);		gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (File_Selector), hbox);	}		gtk_window_set_modal (GTK_WINDOW (File_Selector),TRUE);	response = gtk_dialog_run (GTK_DIALOG (File_Selector));	CurrentFolder = gtk_file_chooser_get_current_folder ( GTK_FILE_CHOOSER (File_Selector) ); 	if (response == GTK_RESPONSE_ACCEPT)	{		path = gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER (File_Selector) );		if ( mode == "new")		{			ComboArchiveType = gtk_combo_box_get_active_text (GTK_COMBO_BOX (combo_box));                        if (strcmp ( ComboArchiveType,".arj") == 0) CurrentArchiveType = 10;                else if (strcmp ( ComboArchiveType,".bz2") == 0) CurrentArchiveType = 0;                else if (strcmp ( ComboArchiveType,".gz") == 0) CurrentArchiveType = 1;                else if (strcmp ( ComboArchiveType,".rar") == 0) CurrentArchiveType = 2;                else if (strcmp ( ComboArchiveType,".tar") == 0) CurrentArchiveType = 3;                else if (strcmp ( ComboArchiveType,".tar.bz2") == 0) CurrentArchiveType = 4;                else if (strcmp ( ComboArchiveType,".tar.gz") == 0) CurrentArchiveType = 5;                else if (strcmp ( ComboArchiveType,".jar") == 0) CurrentArchiveType = 6;                else if (strcmp ( ComboArchiveType,".zip") == 0) CurrentArchiveType = 7;                else if (strcmp ( ComboArchiveType,".rpm") == 0) CurrentArchiveType = 8;                else if (strcmp ( ComboArchiveType,".7z") == 0) CurrentArchiveType = 9;			if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(check_button) ) )			{				if ( ! g_str_has_suffix ( path , ComboArchiveType ) )				{					gtk_widget_destroy (File_Selector);					return g_strconcat ( path, ComboArchiveType , NULL);				}							}		}		gtk_widget_destroy (File_Selector);		return ( path );	}	else if ( (response == GTK_RESPONSE_CANCEL) || (response == GTK_RESPONSE_DELETE_EVENT) )	{		gtk_widget_destroy (File_Selector);		return NULL;	}}gboolean isTar ( FILE *ptr ){	unsigned char magic[7];	fseek ( ptr, 0 , SEEK_SET );    if ( fseek ( ptr , 257 , SEEK_CUR) < 0 ) return FALSE;	if ( fread ( magic, 1, 7, ptr ) == 0 ) return FALSE;	if ( memcmp ( magic,"\x75\x73\x74\x61\x72\x00\x30",7 ) == 0 || memcmp (magic,"\x75\x73\x74\x61\x72\x20\x20",7 ) == 0) return TRUE;		else return FALSE;}int DetectArchiveType ( gchar *path ){	FILE *dummy_ptr = NULL;    int xx = -1;	unsigned char magic[6];	dummy_ptr = fopen ( path , "r" );	if (dummy_ptr == NULL)	{		gchar *msg = g_strdup_printf (_("Can't open archive %s:\n%s") , path , strerror (errno) ); 		response = ShowGtkMessageDialog (GTK_WINDOW (MainWindow) , GTK_DIALOG_MODAL,GTK_MESSAGE_ERROR,GTK_BUTTONS_OK,		msg);		g_free (msg);		return xx;	 }	if ( fread ( magic, 1, 6, dummy_ptr ) == 0 )	{		fclose ( dummy_ptr);		response = ShowGtkMessageDialog (GTK_WINDOW (MainWindow),GTK_DIALOG_MODAL,GTK_MESSAGE_ERROR,GTK_BUTTONS_OK,strerror(errno));		return xx;	}    if ( memcmp ( magic,"\x50\x4b\x03\x04",4 ) == 0 || memcmp ( magic,"\x50\x4b\x05\x06",4 ) == 0 )    {        PasswordProtectedArchive = DetectPasswordProtectedArchive ( 7 , dummy_ptr , magic );        xx = 7; // zip    }	else if ( memcmp ( magic,"\x60\xea",2 ) == 0 )    {        PasswordProtectedArchive = DetectPasswordProtectedArchive ( 10 , dummy_ptr , magic );        xx = 10;    // arj    }	else if ( memcmp ( magic,"\x52\x61\x72\x21",4 ) == 0 ) xx = 2;	// rar    else if ( memcmp ( magic,"\x42\x5a\x68",3 ) == 0 ) xx = 0;	// bzip2	else if ( memcmp ( magic,"\x1f\x8b\x08",3 ) == 0) xx = 1;		// gz    else if ( memcmp ( magic,"\xed\xab\xee\xdb",4 ) == 0) xx = 8;	// rpm    else if ( memcmp ( magic,"\x37\x7a\xbc\xaf\x27\x1c",6 ) == 0 ) xx = 9;	// 7zip    else if ( isTar ( dummy_ptr ) ) xx = 3;	else	{		gtk_window_set_title ( GTK_WINDOW (MainWindow) , "Xarchiver " VERSION );		response = ShowGtkMessageDialog (GTK_WINDOW (MainWindow),GTK_DIALOG_MODAL,GTK_MESSAGE_ERROR,GTK_BUTTONS_OK,		_("The format of this archive is not recognized !") );	}	fclose ( dummy_ptr );	return xx;}gboolean DetectPasswordProtectedArchive ( int type , FILE *stream , unsigned char magic[6] ){    //ZIP    unsigned int fseek_offset;    unsigned short int password_flag;    unsigned int compressed_size;    unsigned int uncompressed_size;    unsigned short int file_length;    unsigned short int extra_length;        //ARJ    unsigned char sig[2];    unsigned short int basic_header_flag;    unsigned short int basic_header_size;    unsigned short int extended_header_size;    unsigned int basic_header_CRC;    unsigned int extended_header_CRC;    unsigned char arj_flag;    if ( type == 7 )    {        while ( memcmp ( magic,"\x50\x4b\x03\x04",4 ) == 0  || memcmp ( magic,"\x50\x4b\x05\x06",4 ) == 0 )        {            fread ( &password_flag, 1, 2, stream );            if (( password_flag & ( 1<<0) ) > 0) return TRUE;            fseek (stream,10,SEEK_CUR);            fread (&compressed_size,1,4,stream);            fread (&uncompressed_size,1,4,stream);            fread (&file_length,1,2,stream);            fread (&extra_length,1,2,stream);            fseek_offset = compressed_size + file_length + extra_length;            fseek (stream , fseek_offset , SEEK_CUR);            fread (magic , 1 , 4 , stream);            fseek ( stream , 2 , SEEK_CUR);        }    }    else if ( type == 10)    {           fseek (stream , magic[2]+magic[3] , SEEK_CUR);        fseek (stream , 2 , SEEK_CUR);        fread (&extended_header_size,1,2,stream);        if (extended_header_size != 0) fread (&extended_header_CRC,1,4,stream);        fread (&sig,1,2,stream);        while ( memcmp (sig,"\x60\xea",2) == 0)        {            fread ( &basic_header_size , 1 , 2 , stream );            if ( basic_header_size == 0 ) break;            fseek ( stream , 4 , SEEK_CUR);            fread (&arj_flag,1,1,stream);            if ((arj_flag & ( 1<<0) ) > 0) return TRUE;            fseek ( stream , 7 , SEEK_CUR);            fread (&compressed_size,1,4,stream);            fseek ( stream , basic_header_size - 16 , SEEK_CUR);            fread (&basic_header_CRC,1,4,stream);            fread (&extended_header_size,1,2,stream);            if (extended_header_size != 0) fread (&extended_header_CRC,1,4,stream);            fseek ( stream , compressed_size , SEEK_CUR);            fread (&sig,1,2,stream);        }    }    return FALSE;}gulong SpawnAsyncProcess (const gchar *command , gboolean ExitStatusFlag , gboolean input){	GError *error = NULL;	gchar **argv;	int argcp;	g_shell_parse_argv ( command , &argcp , &argv , NULL);	if ( ! g_spawn_async_with_pipes (		NULL,		argv,		NULL,		G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,		NULL,		NULL,		&child_pid,		input ? &input_fd : NULL,		&output_fd,		&error_fd,		&error) )	{		response = ShowGtkMessageDialog (GTK_WINDOW (MainWindow),GTK_DIALOG_MODAL,GTK_MESSAGE_ERROR,GTK_BUTTONS_OK, error->message);		g_error_free (error);		g_strfreev ( argv );        return FALSE;	}	g_strfreev ( argv );    return (gulong) child_pid;}GIOChannel *SetIOChannel (gint fd, GIOCondition cond, GIOFunc func, gpointer data){	GIOChannel *ioc;	ioc = g_io_channel_unix_new ( fd );	g_io_add_watch (ioc, cond, func, data);	g_io_channel_set_encoding (ioc, "ISO8859-1" , NULL);	g_io_channel_set_flags ( ioc , G_IO_FLAG_NONBLOCK , NULL );	return ioc;}GIOChannel *SetIOChannelEncondingNULL (gint fd, GIOCondition cond, GIOFunc func, gpointer data){	GIOChannel *ioc;	ioc = g_io_channel_unix_new ( fd );	g_io_add_watch (ioc, cond, func, data);	g_io_channel_set_encoding (ioc, NULL , NULL);	return ioc;}/* These three functions are from File-Roller code */char *eat_spaces (char *line){	if (line == NULL)		return NULL;	while ((*line == ' ') && (*line != 0))		line++;	return line;}char *get_last_field (char *line,int last_field){	char *field;	int i;	if (line == NULL)		return NULL;	last_field--;	field = eat_spaces (line);	for (i = 0; i < last_field; i++) {		if (field == NULL)			return NULL;		field = strchr (field, ' ');		field = eat_spaces (field);	}	//The following line is mine, I replace the \n with the null terminated    if (field != NULL) field [ strlen(field) -1 ] = '\000';	return field;}char **split_line (char *line,int n_fields){	char **fields;	char *scan, *field_end;	int i;	fields = g_new0 (char *, n_fields + 1);	fields[n_fields] = NULL;	scan = eat_spaces (line);	for (i = 0; i < n_fields; i++)	{		if (scan == NULL)		{			fields[i] = NULL;			continue;		}		field_end = strchr (scan, ' ');		//The following line is mine, I added the case when the last field ends with a newline		if (field_end == NULL) field_end = strchr (scan, '\n');		if (field_end != NULL)		{			fields[i] = g_strndup (scan, field_end - scan);			scan = eat_spaces (field_end);		}	}	return fields;}/* End code from File-Roller */void RemoveColumnsListStore(){    SetButtonState (1,1,0,0,0);	gtk_window_set_title ( GTK_WINDOW (MainWindow) , "Xarchiver " VERSION );	GList *columns = gtk_tree_view_get_columns ( GTK_TREE_VIEW (treeview1) );	while (columns != NULL)	{		gtk_tree_view_remove_column (GTK_TREE_VIEW (treeview1) , columns->data);		columns = columns->next;	}	g_list_free (columns);}void EmptyTextBuffer (){	if (textbuf != NULL)	{		gtk_text_buffer_get_start_iter (textbuf,&start);		gtk_text_buffer_get_end_iter (textbuf,&end);		gtk_text_buffer_delete (textbuf,&start,&end);		gtk_text_buffer_get_start_iter(textbuf, &enditer);	}}void CreateListStore ( int nc, gchar *columns_names[] , GType columns_types[]){	liststore = gtk_list_store_newv ( nc , (GType *)columns_types);	gtk_tree_view_set_model ( GTK_TREE_VIEW (treeview1), GTK_TREE_MODEL (liststore) );	gtk_tree_view_set_rules_hint ( GTK_TREE_VIEW (treeview1) , TRUE );	GtkTreeSelection *sel = gtk_tree_view_get_selection( GTK_TREE_VIEW (treeview1) );	gtk_tree_selection_set_mode(sel, GTK_SELECTION_MULTIPLE);	g_signal_connect ((gpointer) sel, "changed", G_CALLBACK (Activate_buttons), NULL);    model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview1));    g_object_ref(model);    gtk_tree_view_set_model(GTK_TREE_VIEW(treeview1), NULL);	for (x = 0; x <= nc-1; x++)	{		renderer = gtk_cell_renderer_text_new ();		column = gtk_tree_view_column_new_with_attributes ( columns_names[x],renderer,"text",x,NULL);		gtk_tree_view_column_set_resizable (column, TRUE);		gtk_tree_view_column_set_sort_column_id (column, x);		gtk_tree_view_append_column (GTK_TREE_VIEW (treeview1), column);	}}void ShowShellOutput (){    if (OutputWindow != NULL)    {        gtk_window_present ( GTK_WINDOW (OutputWindow) );         return;    }	OutputWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);	gtk_widget_set_name (OutputWindow, "OutputWindow");    gtk_window_set_title (GTK_WINDOW (OutputWindow), _("Shell output") );	gtk_window_set_position (GTK_WINDOW (OutputWindow), GTK_WIN_POS_CENTER);	gtk_window_set_default_size(GTK_WINDOW(OutputWindow), 450, 300);	gtk_window_set_destroy_with_parent (GTK_WINDOW (OutputWindow), TRUE);	g_signal_connect (G_OBJECT (OutputWindow), "delete-event",  G_CALLBACK (gtk_widget_hide), &OutputWindow);	vbox = gtk_vbox_new ( FALSE, 2 );	scrollwin = gtk_scrolled_window_new ( NULL,NULL );	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW( scrollwin ), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -