📄 transfer.cpp
字号:
else{ ((Chftp_transfer *)data)->progress=0; ((Chftp_transfer *)data)->donesize=0; ((Chftp_transfer *)data)->create_transfer (((Chftp_transfer *)data)->filename_text,((Chftp_transfer *)data)->fulldir,0);} } } else if(GDK_BUTTON_PRESS==event->type && 1==event->button){ if(0==(((Chftp_transfer *)data)->mutex)) return; gtk_clist_get_selection_info(GTK_CLIST(widget),(int)event->x,(int)event->y,&row,&column); ((Chftp_transfer *)data)->is_dir=3; if(0==gtk_clist_get_text(GTK_CLIST(widget),row,1,&(((Chftp_transfer *)data)->filename_text))){ ((Chftp_transfer *)data)->mutex=1; return;} if(0==strcmp(((Chftp_transfer *)data)->filename_text,"目录")){ gtk_clist_get_pixtext(GTK_CLIST(widget),row,0,&(((Chftp_transfer *)data)->filename_text),&for_pix,NULL,NULL); ((Chftp_transfer *)data)->tag=0; ((Chftp_transfer *)data)->is_dir=1; } if(0==strcmp(((Chftp_transfer *)data)->filename_text,"文件")){ ((Chftp_transfer *)data)->tag=0; //当前工作方式为下载. ((Chftp_transfer *)data)->is_dir=0; gtk_clist_get_pixtext(GTK_CLIST(widget),row,0, &(((Chftp_transfer *)data)->filename_text),&for_pix,NULL,NULL); //获取文件名。 } } else if(GDK_BUTTON_PRESS==event->type && 3==event->button){ if(0==(((Chftp_transfer *)data)->mutex)) return; gtk_clist_get_selection_info(GTK_CLIST(widget),(int)event->x,(int)event->y,&row,&column); if(0==gtk_clist_get_text(GTK_CLIST(widget),row,1,&(((Chftp_transfer *)data)->filename_text))){ if(((Chftp_transfer *)data)->Remote_pop_menu_1){ delete ((Chftp_transfer *)data)->Remote_pop_menu_1; ((Chftp_transfer *)data)->Remote_pop_menu_1=NULL; } ((Chftp_transfer *)data)->Remote_pop_menu_1=new Chftp_Remote_menu_1(data); } else{ strcpy(filetype,((Chftp_transfer *)data)->filename_text); gtk_clist_get_pixtext(GTK_CLIST(widget),row,0,&(((Chftp_transfer *)data)->filename_text),&for_pix,NULL,NULL); if(((Chftp_transfer *)data)->Remote_pop_menu_2){ delete ((Chftp_transfer *)data)->Remote_pop_menu_2; ((Chftp_transfer *)data)->Remote_pop_menu_2=NULL; } ((Chftp_transfer *)data)->Remote_pop_menu_2=new Chftp_Remote_menu_2(data,filetype); } }}void Chftp_transfer::Remotelistbox_drag(GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data,guint info,guint32 clk_time, gpointer data){ if(0==(((Chftp_transfer *)data)->mutex)) return; if(3==(((Chftp_transfer *)data)->is_dir)) return; ((Chftp_transfer *)data)->mutex=0; if(0==((Chftp_transfer *)data)->is_dir){ ((Chftp_transfer *)data)->position=-1; strcpy(((Chftp_transfer *)data)->fulldir,((Chftp_transfer *)data)->Localdata->hftp_GetCurrent_dir()); strcat(((Chftp_transfer *)data)->fulldir,"/"); strcat(((Chftp_transfer *)data)->fulldir,((Chftp_transfer *)data)->filename_text); if(-2!=(((Chftp_transfer *)data)->donesize=((Chftp_transfer *)data)-> //存在同名文件. Localdata->hftp_Getfilesize(((Chftp_transfer *)data)->fulldir))){ if(((Chftp_transfer *)data)->conflict) delete ((Chftp_transfer *)data)->conflict; ((Chftp_transfer *)data)->conflict=new Chftp_conflict_dialog(data);} else{ ((Chftp_transfer *)data)->progress=0; ((Chftp_transfer *)data)->donesize=0; ((Chftp_transfer *)data)->create_transfer (((Chftp_transfer *)data)->filename_text,((Chftp_transfer *)data)->fulldir,0);} } else if(1==((Chftp_transfer *)data)->is_dir){ ((Chftp_transfer *)data)->uploaddir=new char[300]; //用于记录目录下文件的绝对路径. strcpy(((Chftp_transfer *)data)->uploaddir,((Chftp_transfer *)data)->Localdata->hftp_GetCurrent_dir()); ((Chftp_transfer *)data)->mutitrans=1; //用于一个目录中各个文件之间的互斥量. ((Chftp_transfer *)data)->position=-1; ((Chftp_transfer *)data)->Rfc959->downnow=1; ((Chftp_transfer *)data)->filestree=new Ctransfer_files; //整个目录树结构. ((Chftp_transfer *)data)->get_download_dir (&(((Chftp_transfer *)data)->filestree),//获取要上传的整个目录树. ((Chftp_transfer *)data)->filename_text); ((Chftp_transfer *)data)->currentfile=((Chftp_transfer *)data)->filestree;//遍历指针. ((Chftp_transfer *)data)->search_a_function(); }}void Chftp_transfer::search_a_function(){ switch(pageindex){ case 0: timeout3[0]=gtk_timeout_add(400,call_timeout_func1,(gpointer)this); break; case 1: timeout3[1]=gtk_timeout_add(400,call_timeout_func2,(gpointer)this); break; case 2: timeout3[2]=gtk_timeout_add(400,call_timeout_func3,(gpointer)this); break; case 3: timeout3[3]=gtk_timeout_add(400,call_timeout_func4,(gpointer)this); break; case 4: timeout3[4]=gtk_timeout_add(400,call_timeout_func5,(gpointer)this); break; } return;} gint Chftp_transfer::call_timeout_func1(gpointer data){ return ((Chftp_transfer *)data)->check_waitfiles();}gint Chftp_transfer::call_timeout_func2(gpointer data){ return ((Chftp_transfer *)data)->check_waitfiles();}gint Chftp_transfer::call_timeout_func3(gpointer data){ return ((Chftp_transfer *)data)->check_waitfiles();}gint Chftp_transfer::call_timeout_func4(gpointer data){ return ((Chftp_transfer *)data)->check_waitfiles();}gint Chftp_transfer::call_timeout_func5(gpointer data){ return ((Chftp_transfer *)data)->check_waitfiles();}/***************************************************************** ** 当传输多个文件时,定时调用这个函数获取下一个文件 ****************************************************************/gint Chftp_transfer::check_waitfiles(){ if(1!=mutitrans) return 1;//检测内部互斥量. if(NULL!=Rfc959->Connect_data->datafd) return 1; mutitrans=0; if(1==currentfile->filetype){ //检测到链表上当前结点为一个目录. if(0==strcmp(currentfile->filename,"..")){ strcpy(Rfc959->Connect_data->directory,"./.."); gint i=strlen(uploaddir); while(*(uploaddir+i)!='/') i--; *(uploaddir+i)='\0'; } else{ strcpy(Rfc959->Connect_data->directory,"./"); strcat(Rfc959->Connect_data->directory,currentfile->filename); strcat(uploaddir,"/"); strcat(uploaddir,currentfile->filename); if(1==tag){ if(-2==Rfc959->rfc959_mkdir(currentfile->filename)){ gint i=strlen(currentfile->filename); strcpy(currentfile->filename,currentfile->filename+i/2); if(-2==Rfc959->rfc959_mkdir(currentfile->filename)){ end_dir_transfer();return 0;}} } else if(0==tag){ if(!opendir(uploaddir)) mkdir(uploaddir,S_IRUSR|S_IWUSR|S_IXUSR); } } if(-2!=(Rfc959->rfc959_chdir())){ if(-2!=(Rfc959->rfc959_list_files())) hftp_read_files(NULL,0); } mutitrans=1; } else if(0==currentfile->filetype){ //当前链表结点为一个文件. progress=0; strcpy(fulldir,uploaddir); strcat(fulldir,"/"); strcat(fulldir,currentfile->filename); //本地文件的绝对路径. donesize=0; if(0==tag){ if(-2!=(donesize=Localdata->hftp_Getfilesize(fulldir))){ if(conflict){ delete conflict; conflict=NULL; } filename_text=new gchar[200]; strcpy(filename_text,currentfile->filename); conflict=new Chftp_conflict_dialog((gpointer)this);} else{ create_transfer(currentfile->filename,fulldir,0); } } else if(1==tag){ create_transfer(currentfile->filename,fulldir,0); } } currentfile=currentfile->brother; if(!currentfile){//目录树传输完毕. end_dir_transfer(); return 0; } else return 1;}/************************************************************** **要下载一个文件夹,则先通过空上函数把整个文件夹内的结构得到 **************************************************************/Ctransfer_files *Chftp_transfer::get_download_dir(Ctransfer_files **tree,char *dirname){ Ctransfer_files *temp=NULL; Ctransfer_files *temp2=NULL,*temp3=NULL; strcpy((*tree)->filename,dirname); (*tree)->filesize=0; (*tree)->filetype=1; (*tree)->brother=NULL; temp=(*tree); strcpy(Rfc959->Connect_data->directory,"./"); strcat(Rfc959->Connect_data->directory,dirname); if(-2!=Rfc959->rfc959_chdir()){ if(-2!=Rfc959->rfc959_list_files()) hftp_read_files(&temp2,1); } while(temp2){ if(0==strcmp("..",temp2->filename) || 0==strcmp(".",temp->filename)){ temp2=temp2->brother; continue;} temp->brother=new Ctransfer_files; temp=temp->brother; if(1==temp2->filetype) temp=get_download_dir(&temp,temp2->filename); else{ strcpy(temp->filename,temp2->filename); temp->filesize=0; temp->brother=NULL; temp->filetype=0; } temp2=temp2->brother; } temp->brother=new Ctransfer_files; temp=temp->brother; strcpy(temp->filename,".."); temp->filesize=0; temp->brother=NULL; temp->filetype=1; strcpy(Rfc959->Connect_data->directory,".."); if(-2!=Rfc959->rfc959_chdir()){ if(-2!=(Rfc959->rfc959_list_files())) hftp_read_files(NULL,0);} while(temp2){ temp3=temp2; temp2=temp2->brother; delete temp3; } return temp;}/************************************************ ** 传输完毕,删除目录树结构.相关变量清零 **********************************************/ void Chftp_transfer::end_dir_transfer(){ Ctransfer_files *temp; mutitrans=-1; mutex=1; Rfc959->downnow=0; if(uploaddir){ delete uploaddir; uploaddir=NULL; } if(conflict){ delete conflict; conflict=NULL; } while(filestree){ temp=filestree->brother; delete filestree; filestree=temp; } filestree=NULL; currentfile=NULL;}/******************************************************* 建立一个传输,开始传输文件。******************************************************/glong Chftp_transfer::create_transfer(const gchar *filename, const gchar *localfilename,off_t startsize){ gchar *command, resp; gint ret, flags; pthread_t a_thread; if(0==tag){ filesize=Rfc959->rfc959_get_file_size(filename); //获取文件长度. if(-2==filesize){ if(-1==mutitrans) mutex=1; else mutitrans=1; return -2;} } else if(1==tag){ if(currentfile) filesize=currentfile->filesize; else filesize=Localdata->hftp_Getfilesize(localfilename); //获取本地文件长度时只传递文件名. if(-2==filesize){ if(-1==mutitrans) mutex=1; else mutitrans=1; return -2;} } if(0==tag){ if(startsize==0){ if(!(myfile=fopen(localfilename,"w"))){ if(-1==mutitrans) mutex=1; else mutitrans=1; return -4;} } else{ if(!(myfile=fopen(localfilename,"a+"))){ if(-1==mutitrans) mutex=1; else mutitrans=1; return -4;} //续传,则文件以追加方式打开. } } else if(1==tag) if(!(myfile=fopen(localfilename,"r"))){ if(-1==mutitrans) mutex=1; else mutitrans=1; return -4;} Rfc959->rfc959_send_command("SYST\r\n"); //获取服务器类型。 if(0!=strncmp(Rfc959->Connect_data->last_ftp_response,"200",3)) Rfc959->rfc959_read_response(); if((ret=Rfc959->rfc959_data_connection_new())<0){ //为传输建立一条数据连接. if(-1==mutitrans) mutex=1; else mutitrans=1; return -2; } if(!Rfc959->Connect_data->datafd){ if(-1==mutitrans) mutex=1; else mutitrans=1; return -2;} if((flags=fcntl(fileno(Rfc959->Connect_data->datafd),F_GETFL,0))<0){ if(-1==mutitrans) mutex=1; else mutitrans=1; fclose(Rfc959->Connect_data->datafd); Rfc959->Connect_data->datafd=NULL; return -4;} if(fcntl(fileno(Rfc959->Connect_data->datafd),F_SETFL,flags|O_NONBLOCK)<0){ if(-1==mutitrans) mutex=1; else mutitrans=1; fclose(Rfc959->Connect_data->datafd); Rfc959->Connect_data->datafd=NULL; return (-2);} //数据连接IO为无阻塞方式。 if(startsize>0){ command=g_strdup_printf("REST %ld\r\n",startsize); resp=Rfc959->rfc959_send_command(command); g_free(command); if(resp != '3'){ if(-1==mutitrans) mutex=1; else mutitrans=1; fclose(Rfc959->Connect_data->datafd); Rfc959->Connect_data->datafd = NULL; return (-2);} } if(0==tag) command=g_strconcat("RETR ", filename, "\r\n", NULL); else if(1==tag)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -