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

📄 transfer.cpp

📁 这个是LINUX下的HFTP测试版本
💻 CPP
📖 第 1 页 / 共 3 页
字号:
      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 + -