root/_FtpPanel/BF_GUI_FtpPanel_Tasks.cpp

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. Put_File
  2. Put_List
  3. Run
  4. Get_File
  5. Get_List
  6. Run
  7. Delete_File
  8. Delete_List
  9. Run

   1 #include "Directory.h"
   2 
   3 #include "BF_Dict.h"
   4 #include "BF_Roster.h"
   5 
   6 #include "BF_GUI_FtpPanel.h"
   7 #include "BF_GUI_KeysMenu.h"
   8 #include "BF_GUI_WinMain.h"
   9 #include "BF_GUI_FtpPanel_Tasks.h"
  10 
  11 
  12 BF_GUI_FtpPanel_UploadTask::BF_GUI_FtpPanel_UploadTask(
  13         BL_String & s_PathSrc,
  14         BF_GUI_FtpPanel *po_Panel,
  15         BF_NodeCollection & lo_Node,
  16         bool b_FilesMove
  17 ):BF_GUI_OperTask("upload to ftp",BF_GUI_OPERTASK_STYLE_DEFAULT)
  18 {                       
  19         iOperIndex = 0;
  20         iOperCount = 0;
  21         bFilesMove = b_FilesMove;
  22 
  23         ASSERT(po_Panel);
  24         poPanel = po_Panel;
  25         poFtp = po_Panel->poClient;;
  26         poBookmark  =  po_Panel->poBookmark;
  27         ASSERT(poFtp && poBookmark);    
  28         
  29         oPathSrc.SetTo(s_PathSrc.String());
  30         lo_Node.CopyTo(loNode,false);
  31         loNode.SetSelfPath(&oPathSrc);
  32 }
  33 
  34 void                                                            
  35 BF_GUI_FtpPanel_UploadTask::Put_File(BF_Node *po_Node)    /* [previous][next][first][last][top][bottom][index][help] */
  36 {
  37         ASSERT(po_Node);
  38 
  39         bool rc = false;
  40         string cmd, replystr;
  41         int code, codetype, i;
  42         ssize_t rlen, slen;
  43         
  44         BL_String s;
  45         
  46         s=oPathSrc.Path();
  47         s<<"/";
  48         s<<po_Node->Name();
  49         BFile oFileSrc(s.String(), B_READ_ONLY);                
  50 
  51         if(oFileSrc.InitCheck() != B_NO_ERROR){         
  52                 // !!!!!!!!!!!!!!
  53                 return;
  54         }
  55 
  56         char buf[8192], sbuf[16384], *stmp;
  57                 
  58         if(!poBookmark->bAscii_Mode)
  59                 cmd = "TYPE I";
  60         else
  61                 cmd = "TYPE A";
  62 
  63         if(poFtp->p_sendRequest(cmd))
  64                 poFtp->p_getReply(replystr, code, codetype);
  65 
  66         try
  67         {
  68                 cmd = "STOR ";
  69                 cmd += po_Node->Name();
  70                 if(     poFtp->p_openDataConnection() && 
  71                         poFtp->p_sendRequest(cmd)       && 
  72                         poFtp->p_getReply(replystr, code, codetype) &&
  73                         codetype <= 2 && 
  74                         poFtp->p_acceptDataConnection()) {
  75                         rlen = 1;
  76                         while(rlen > 0)
  77                         {
  78                                 memset(buf, 0, sizeof(buf));
  79                                 memset(sbuf, 0, sizeof(sbuf));
  80                                 rlen = oFileSrc.Read((void *) buf, sizeof(buf));
  81                                 slen = rlen;
  82                                 stmp = buf;
  83                                 if(poBookmark->bAscii_Mode)
  84                                 {
  85                                         stmp = sbuf;
  86                                         slen = 0;
  87                                         for(i=0;i<rlen;i++)
  88                                         {
  89                                                 if(buf[i] == '\n')
  90                                                 {
  91                                                         *stmp = '\r';
  92                                                         stmp++;
  93                                                         slen++;
  94                                                 }
  95                                                 *stmp = buf[i];
  96                                                 stmp++;
  97                                                 slen++;
  98                                         }
  99                                         stmp = sbuf;
 100                                 }
 101                                 if(slen > 0)
 102                                 {
 103                                         size_t amount = poFtp->m_data->Send(stmp, (size_t) slen);
 104                                         if(amount < 0)  throw "bail";
 105                                         if(amount > 0){
 106                                                 iOperIndex += amount;
 107                                                 SetProgress(iOperIndex,iOperCount);
 108                                         }               
 109                                 }
 110                         }
 111 
 112                         rc = true;
 113                 }
 114         }
 115 
 116         catch(const char *errstr)
 117         {
 118 
 119         }
 120 
 121         DELETE(poFtp->m_data);
 122         poFtp->m_data = 0;
 123 
 124         if(rc == true)
 125         {
 126                 poFtp->p_getReply(replystr, code, codetype);
 127                 rc = (bool) codetype <= 2;
 128         }
 129         
 130         ///     
 131         
 132         return;
 133 }
 134 
 135 void                                                            
 136 BF_GUI_FtpPanel_UploadTask::Put_List(BF_NodeCollection *plo_Node)    /* [previous][next][first][last][top][bottom][index][help] */
 137 {
 138         ASSERT(plo_Node);
 139         
 140         BF_Node *poNode;
 141         for(int i=0;i<plo_Node->CountItems();i++){
 142                 poNode = plo_Node->NodeAt(i);
 143                 Put_File(poNode);               
 144         }
 145 }
 146 
 147 void                                                            
 148 BF_GUI_FtpPanel_UploadTask::Run()    /* [previous][next][first][last][top][bottom][index][help] */
 149 {
 150         iOperIndex  = 0;
 151         iOperCount = loNode.SizeAll(true);      
 152         SetProgress(iOperIndex,iOperCount);
 153         Put_List(&loNode);      
 154         
 155         // reload panel_nodes 
 156         BMessenger      oMessenger(poPanel);
 157         BMessage        oMessage(BF_FTP_MSG_DIR_RELOAD_START);
 158         oMessenger.SendMessage(&oMessage);
 159 }
 160 
 161 ////////////////////////////////////////////////////////////////////////////////////////////////
 162 
 163 BF_GUI_FtpPanel_DownloadTask::BF_GUI_FtpPanel_DownloadTask(
 164         BL_String & s_PathDest,
 165         BF_GUI_FtpPanel *po_Panel,
 166         BF_NodeCollection & lo_Node,
 167         bool b_FilesMove
 168 ):BF_GUI_OperTask(BF_DictAt(BF_DICT_FTP_TASKDOWNLOAD),BF_GUI_OPERTASK_STYLE_DEFAULT)
 169 {                       
 170         iOperIndex = 0;
 171         iOperCount = 0;
 172         bFilesMove = b_FilesMove;
 173 
 174         ASSERT(po_Panel);
 175         poPanel = po_Panel;
 176         poFtp = po_Panel->poClient;;
 177         poBookmark  =  po_Panel->poBookmark;
 178         ASSERT(poFtp && poBookmark);    
 179         
 180         oPathDest.SetTo(s_PathDest.String());
 181         lo_Node.CopyTo(loNode,false);
 182 }
 183 
 184 void                                                            
 185 BF_GUI_FtpPanel_DownloadTask::Get_File(BF_Node *po_Node)    /* [previous][next][first][last][top][bottom][index][help] */
 186 {
 187         ASSERT(po_Node);
 188         
 189         bool    rc = false;
 190         string  cmd, replystr;
 191         int     code, codetype, i;
 192         ssize_t rlen, slen;
 193         
 194         BL_String sFileDest(oPathDest.Path());
 195         sFileDest << "/";
 196         sFileDest << po_Node->Name();
 197                 
 198         BFile oDestFile(sFileDest.String(), B_READ_WRITE | B_CREATE_FILE);
 199         
 200         char buf[8192], sbuf[16384], *stmp;
 201         bool writeerr = false;
 202         
 203         if(oDestFile.InitCheck() != B_NO_ERROR){
 204                 // !!!!!!!!!!!!!!
 205                 return ;
 206         }
 207 
 208         if(!poBookmark->bAscii_Mode)
 209                 cmd = "TYPE I";
 210         else
 211                 cmd = "TYPE A";
 212 
 213         if(poFtp->p_sendRequest(cmd))   poFtp->p_getReply(replystr, code, codetype);
 214 
 215 
 216         cmd = "RETR ";
 217         cmd += po_Node->Name();
 218         if(     poFtp->p_openDataConnection() &&
 219                 poFtp->p_sendRequest(cmd) && 
 220                 poFtp->p_getReply(replystr, code, codetype)     && 
 221                 codetype <= 2 && 
 222                 poFtp->p_acceptDataConnection())
 223         {
 224                 rlen = 1;
 225                 rc = true;
 226                 while(rlen > 0)
 227                 {
 228                         memset(buf, 0, sizeof(buf));
 229                         memset(sbuf, 0, sizeof(sbuf));
 230                         rlen = poFtp->m_data->Receive(buf, sizeof(buf));
 231 
 232                         if(rlen > 0)
 233                         {
 234 
 235                                 slen = rlen;
 236                                 stmp = buf;
 237                                 if(poBookmark->bAscii_Mode)
 238                                 {
 239                                         stmp = sbuf;
 240                                         slen = 0;
 241                                         for(i=0;i<rlen;i++)
 242                                         {
 243                                                 if(buf[i] == '\r')
 244                                                 {
 245                                                         i++;
 246                                                 }
 247                                                 *stmp = buf[i];
 248                                                 stmp++;
 249                                                 slen++;
 250                                         }
 251                                         stmp = sbuf;
 252                                 }
 253 
 254                                 if(slen > 0)
 255                                 {
 256                                         slen = oDestFile.Write(stmp, (size_t) slen);
 257                                         if(slen<0){
 258                                                 writeerr = true;
 259                                         }else{
 260                                                 iOperIndex += slen;
 261                                                 SetProgress(iOperIndex,iOperCount);
 262                                         }
 263                                 }
 264                         }
 265                 }
 266         }
 267 
 268         DELETE(poFtp->m_data);
 269         poFtp->m_data = 0;
 270 
 271         if(rc == true)
 272         {
 273                 poFtp->p_getReply(replystr, code, codetype);
 274                 rc = (bool) ((codetype <= 2) && (writeerr == false));
 275         }
 276         
 277 
 278 }
 279 
 280 void                                                            
 281 BF_GUI_FtpPanel_DownloadTask::Get_List(BF_NodeCollection *plo_Node)    /* [previous][next][first][last][top][bottom][index][help] */
 282 {
 283         ASSERT(plo_Node);
 284         
 285         BF_Node *poNode;
 286         for(int i=0;i<plo_Node->CountItems();i++){
 287                 poNode = plo_Node->NodeAt(i);
 288                 Get_File(poNode);               
 289         }
 290 }
 291 
 292 void                                                            
 293 BF_GUI_FtpPanel_DownloadTask::Run()    /* [previous][next][first][last][top][bottom][index][help] */
 294 {
 295         iOperIndex  = 0;
 296         iOperCount = loNode.SizeAll(true);      
 297         SetProgress(iOperIndex,iOperCount);
 298         Get_List(&loNode);      
 299         
 300         // reload panel_nodes 
 301         BMessenger      oMessenger(poPanel);
 302         BMessage        oMessage(BF_FTP_MSG_DIR_RELOAD_START);
 303         oMessenger.SendMessage(&oMessage);
 304 }
 305 ////////////////////////////////////////////////////////////////////////////////////////////////
 306 
 307 BF_GUI_FtpPanel_DeleteTask::BF_GUI_FtpPanel_DeleteTask(
 308         BF_GUI_FtpPanel *po_Panel,
 309         BF_NodeCollection & lo_Node
 310 ):BF_GUI_OperTask(BF_DictAt(BF_DICT_FTP_TASKDEL),BF_GUI_OPERTASK_STYLE_DEFAULT)
 311 {                       
 312         iOperIndex = 0;
 313         iOperCount = 0;
 314 
 315         ASSERT(po_Panel);
 316         poPanel = po_Panel;
 317         poFtp = po_Panel->poClient;;
 318         poBookmark  =  po_Panel->poBookmark;
 319         ASSERT(poFtp && poBookmark);    
 320         
 321         lo_Node.CopyTo(loNode,false);
 322 }
 323 
 324 void                                                            
 325 BF_GUI_FtpPanel_DeleteTask::Delete_File(BF_Node *po_Node)    /* [previous][next][first][last][top][bottom][index][help] */
 326 {
 327         ASSERT(po_Node);
 328         
 329         bool rc = false;
 330         string request = "DELE ";
 331         string  replystr;
 332         int code, codetype;
 333 
 334         request += po_Node->Name();
 335         //request += "\"";
 336 
 337         if(poFtp->p_sendRequest(request)&& poFtp->p_getReply(replystr, code, codetype)&& codetype == 2) rc = true;
 338         
 339         return;
 340 }
 341 
 342 void                                                            
 343 BF_GUI_FtpPanel_DeleteTask::Delete_List(BF_NodeCollection *plo_Node)    /* [previous][next][first][last][top][bottom][index][help] */
 344 {
 345         ASSERT(plo_Node);
 346         
 347         BF_Node *poNode;
 348         for(int i=0;i<plo_Node->CountItems();i++){
 349                 poNode = plo_Node->NodeAt(i);
 350                 switch(poNode->iType){
 351                 case BF_NODE_TYPE_FILE:
 352                         Delete_File(poNode);
 353                         break;
 354                 }
 355                 SetProgress(++iOperIndex,iOperCount);           
 356         }
 357 }
 358 
 359 void                                                            
 360 BF_GUI_FtpPanel_DeleteTask::Run()    /* [previous][next][first][last][top][bottom][index][help] */
 361 {
 362         iOperIndex  = 0;
 363         iOperCount = loNode.CountAll(true);     
 364         SetProgress(iOperIndex,iOperCount);
 365         Delete_List(&loNode);   
 366         
 367         // reload panel_nodes 
 368         BMessenger      oMessenger(poPanel);
 369         BMessage        oMessage(BF_FTP_MSG_DIR_RELOAD_START);
 370         oMessenger.SendMessage(&oMessage);

/* [previous][next][first][last][top][bottom][index][help] */