Beispiel #1
0
int _export PASCAL FAR FtpRelease (void)
{
LPProcData pProcData;

   pProcData = ToolsLocateProcData ();
   if (pProcData == NULL)  return FTPERR_NOACTIVESESSION;

   if (Tcp4uCleanup ()!=TCP4U_SUCCESS)  return FTPERR_STILLCONNECTED;
   

   /* si une seule appli est enregistre detruire la fenetre */
#ifdef UNE_FENETRE
   if (pProcData==pFirstProcData  && pProcData->Next==NULL)
   {
	 DestroyWindow (pProcData->hFtpWnd);  /* Avant le UnregisterClass */
     UnregisterClass (FTP4W_CLASS_NAME, pProcData->hInstance);
   }
#else   
   DestroyWindow (pProcData->hFtpWnd);  /* Avant le UnregisterClass */
   if (pProcData==pFirstProcData  && pProcData->Next==NULL)
	     UnregisterClass (FTP4W_CLASS_NAME, pProcData->hInstance);
#endif	 
   if (pProcData->Next != NULL)  pProcData->Next->Prev = pProcData->Prev;
   if (pProcData->Prev != NULL)  pProcData->Prev->Next = pProcData->Next;
   else                          pFirstProcData = pProcData->Next;
   Free (pProcData);
return FTPERR_OK;
} /* FtpRelease */
Beispiel #2
0
/* ------------------------------------------------------------ */
int _export PASCAL FAR FtpPWD (LPSTR szBuf, UINT uBufSize)
{
LPProcData pProcData;
int        Rc; 
LPSTR      p;

  Rc = FtpAutomate (_S_PWD, NULL);
  if (Rc==FTPERR_OK)
    {
      pProcData = ToolsLocateProcData ();
      /* en principe pas la peine */
      /* Réponse standard de PWD : 257 "full dir name" .... */
      /* si reponse OK, on renvoie FTPERR_OK, si 257 mais   */
      /* format different, on renvoie FTPERR_PWDBADFMT      */
      
      if (    pProcData->ftp.szInBuf[4]=='"' 
          &&  (p=strchr (& pProcData->ftp.szInBuf[5], '"'))!=NULL )
               {
                 *p=0;  /* on remplace le " par un fin de chaine */
                 lstrcpyn (szBuf, & pProcData->ftp.szInBuf[5], uBufSize);
                 return FTPERR_OK;
               }
      else  
               {
                 lstrcpyn (szBuf, & pProcData->ftp.szInBuf[4], uBufSize);
                 return FTPERR_PWDBADFMT;
              }
     }
return Rc;
} /* FtpPWD */
Beispiel #3
0
/* ------------------------------------------------------------ */
int _export PASCAL FAR FtpAutomate (int nIdx, LPCSTR szParam)
{
LPProcData pProcData;
int        Rc=TN_SUCCESS;
char       szBuf [FTP_REPSTRLENGTH];
int        Ark;
  
  /* ------- retrouve la bonne session */
  pProcData = ToolsLocateProcData ();
  if (pProcData == NULL)  return FTPERR_NOTINITIALIZED;
  if (pProcData->ftp.ctrl_socket==INVALID_SOCKET)   return FTPERR_NOTCONNECTED;
  /* ------- Nécessite d'envoyer un ordre */
  if (sOrdre [nIdx].szOrdre != NULL) 
    {
      /* ------- traite un parametre */
      if (szParam!=NULL)   wsprintf (szBuf, sOrdre [nIdx].szOrdre, szParam);
      else                 lstrcpy ( szBuf, sOrdre [nIdx].szOrdre );
     /* ------- Envoie la commande */
      Rc = IntTnSend ( pProcData->ftp.ctrl_socket, szBuf, FALSE, pProcData->ftp.hLogFile);
      if (Rc != TN_SUCCESS)       return FTPERR_SENDREFUSED;
    }
  /* ------- Recupere la reponse */
  Rc = IntFtpGetAnswerCode (& pProcData->ftp);
  /* ------- Translation de la reponse */
  for (Ark=0 ;  sOrdre [nIdx].s[Ark].nFtpAns != _S_END ;  Ark++ )
    {
      if (Rc==sOrdre [nIdx].s[Ark].nFtpAns)  return sOrdre [nIdx].s[Ark].n4wAns;
    }  /* code de  retour */
return FTPERR_UNEXPECTEDANSWER;
}   /* FtpAutomate */
Beispiel #4
0
/* ------------------------------------------------------------- */
int _export PASCAL FAR FtpFlush (void)
{
LPProcData pProcData;
   pProcData = ToolsLocateProcData ();
   if (pProcData == NULL)  return FTPERR_NOTINITIALIZED;
   TcpFlush (pProcData->ftp.ctrl_socket);
return FTPERR_OK;
} /* FtpFlush () */
Beispiel #5
0
/* ------------------------------------------------------------ */
int _export PASCAL FAR FtpLocalClose (void)
{
LPProcData pProcData;
   pProcData = ToolsLocateProcData ();
   if (pProcData == NULL)  return FTPERR_NOTINITIALIZED;
   FtpCloseFileTransfer (pProcData, FALSE);
   TcpClose (& pProcData->ftp.ctrl_socket);
return    pProcData->ftp.ctrl_socket==INVALID_SOCKET 
       && pProcData->ftp.data_socket==INVALID_SOCKET ? 
          FTPERR_OK : FTPERR_CANTCLOSE;
} /* FtpLocalClose */
Beispiel #6
0
/* et déclaration en DWORD dans le .H                           */
int _export PASCAL FAR FtpMtInit ( HWND hParentWnd, THREADID (CALLBACK *f)(void) )
{
LPProcData pProcData;

  /* Init comme d'habitude */
  int Rc=FtpInit (hParentWnd);
  if (Rc==FTPERR_OK) 
    {
	  /* et ecrasement des identifiants de thread */
      pProcData = ToolsLocateProcData ();
      pProcData->fIdentifyThread = f;
      pProcData->nThreadIdent = (*f) ();
    }
return Rc;  
} /* FtpMtInit */
Beispiel #7
0
/* ------------------------------------------------------------    */
int _export PASCAL FAR FtpQuote (LPCSTR szCmd, LPSTR szReplyBuf, UINT uBufSize)
{
LPProcData pProcData;
int        Rc;

  pProcData = ToolsLocateProcData ();
  if (pProcData==NULL  ||  szCmd==NULL)  return FTPERR_NOTINITIALIZED;
  if (pProcData->ftp.ctrl_socket==INVALID_SOCKET)   return FTPERR_NOTCONNECTED;

  Rc = TnSend ( pProcData->ftp.ctrl_socket, szCmd, FALSE, pProcData->ftp.hLogFile);
  if (Rc != TN_SUCCESS)          return FTPERR_SENDREFUSED;
  Rc = IntFtpGetAnswerCode ( & pProcData->ftp );
  if (Rc==-1)     return FTPERR_NOREPLY;
  if (szReplyBuf!=NULL) 
     lstrcpyn ( szReplyBuf, pProcData->ftp.szInBuf, uBufSize );
return Rc;
} /* FtpQuote */
Beispiel #8
0
/* ------------------------------------------------------------ */
int _export PASCAL FAR FtpHelp (LPCSTR szArg, LPSTR szBuf, UINT uBufSize)
{
int Rc;
LPSTR p;
LPProcData pProcData; 

  Rc = FtpAutomate (szArg==NULL ?   _S_HELP : _S_HELPCMD, szArg);
  if (Rc==FTPERR_OK)
    {
       pProcData = ToolsLocateProcData ();
      /* on élimine la dernière ligne (code de retour) */
       p = strrchr (pProcData->ftp.szInBuf, '\r');
       if (p!=NULL) *p= 0;
       lstrcpyn (szBuf, & pProcData->ftp.szInBuf[4], uBufSize);
     }
return Rc;     
} /* FtpHELP */
Beispiel #9
0
/* ------------------------------------------------------------    */
int _export PASCAL FAR FtpSyst (LPCSTR FAR * szSystStr)
{
LPProcData pProcData;
int        Rc;
char       szBuffer[128];  /* chaine retournee par le serveur */

  Rc= FtpAutomate (_S_SYST, NULL);
  if (Rc!=FTPERR_OK)  return Rc;
  pProcData = ToolsLocateProcData ();
  AnsiUpper (pProcData->ftp.szInBuf);
  for ( Rc=0 ; szSystStr[Rc]!=NULL ; Rc++)
   {
     /* copier la chaine pour la comparaison en majuscules */
     lstrcpyn (szBuffer, szSystStr[Rc], sizeof szBuffer);
     AnsiUpper (szBuffer);
     if (strstr (pProcData->ftp.szInBuf, szBuffer)!=NULL) return Rc;
   }
return FTPERR_SYSTUNKNOWN;  /* chaine non trouvee */
} /* FtpSyst */
Beispiel #10
0
/* ------------------------------------------------------------    */
int _export PASCAL FAR FtpSetType (char cType)
{
char       szTmp [5];
LPProcData pProcData;
int        Rc;

  pProcData = ToolsLocateProcData ();
  if (pProcData==NULL)   return FTPERR_NOTINITIALIZED;
  if ( pProcData->ftp.cType == cType )  Rc = FTPERR_OK;
  else
    {
       szTmp[0] = cType;   
       if (cType!=TYPE_L8)   szTmp[1] = 0;  /* transfo en chaine */
       else                { szTmp[1] = ' ', szTmp[2] = '8', szTmp[3]=0; }
       Rc =FtpAutomate (_S_TYPE, szTmp);
       if (Rc==FTPERR_OK)    pProcData->ftp.cType = cType;
     } /* if not the current type */
return Rc;
} /* FtpSetType */
Beispiel #11
0
/* ------------------------------------------------------------ */
int _export PASCAL FAR FtpLogin (LPCSTR szHost, LPCSTR szUser, LPCSTR szPasswd, 
                                 HWND hParentWnd, UINT wMsg)
{
int Rc;
LPProcData pProcData;
   pProcData = ToolsLocateProcData ();
   if (pProcData == NULL)  return FTPERR_NOTINITIALIZED;
   
   /* enregistre le message à envoyer */
   pProcData->Msg.nCompletedMessage = wMsg;
   pProcData->Msg.hParentWnd = hParentWnd;
   /* demande d'ouverture de la connexion */
   if (szHost==NULL)    return FTPERR_INVALIDPARAMETER;
   Rc = FtpOpenConnection (szHost);
   if (Rc==FTPERR_OK  &&  szUser!=NULL)    Rc = FtpSendUserName (szUser);
   if (Rc==FTPERR_ENTERPASSWORD  &&  szPasswd!=NULL)  
            Rc = FtpSendPasswd (szPasswd);
   RETURN (pProcData, Rc); 
} /* FtpLogin */
Beispiel #12
0
/* ------------------------------------------------------------ */
int _export PASCAL FAR FtpMKD (LPCSTR szPath, LPSTR szFullDir, UINT uBufSize)
{
int        Rc;
LPSTR      p;
LPProcData pProcData; 

  Rc = FtpAutomate (_S_MKD, szPath);
  if (Rc==FTPERR_OK)
    {
      /* Voir explications RFC 959 appendix II et fonction FtpPWD */
      if (szFullDir==NULL || uBufSize==0)  return FTPERR_OK;
     /* sinon on tente de rendre dans szFullDir le nom du */
     /* repertoire qu'on vient de créer                   */
      pProcData = ToolsLocateProcData ();
      if (    pProcData->ftp.szInBuf[4]=='"' 
            &&  (p=strchr (& pProcData->ftp.szInBuf[5], '"'))!=NULL )
          {
            *p=0;  /* on remplace le 2ème " par un fin de chaine */
             lstrcpyn (szFullDir, & pProcData->ftp.szInBuf[5], uBufSize);
          }
       else  szFullDir [0] =0;  /* illisible -> on rend une chaine vide */
   }
return Rc;
} /* FtpMKD */
Beispiel #13
0
/* ----------------------------------------------------------- */
int _export PASCAL FAR FtpOpenConnection (LPCSTR szHost)
{
LPProcData             pProcData;
int                    Rc;

  pProcData = ToolsLocateProcData ();
  if (pProcData == NULL)  return FTPERR_NOTINITIALIZED;

  Rc=TcpConnect(& pProcData->ftp.ctrl_socket, 
                  szHost, 
                pProcData->ftp.nPort==FTP_DEFCTRLPORT?(LPSTR)"ftp":(LPSTR) NULL,
                & pProcData->ftp.nPort);
  switch (Rc)
    {
       case TCP4U_SUCCESS :       pProcData->ftp.cType       = TYPE_A;
                               return FtpAutomate (_S_CONNECT, NULL);
       case TCP4U_HOSTUNKNOWN :   return FTPERR_UNKNOWNHOST;
       case TCP4U_TIMEOUT :       return FTPERR_TIMEOUT;
       case TCP4U_CONNECTFAILED : return FTPERR_CONNECTREJECTED;
       case TCP4U_NOMORESOCKET :  return FTPERR_CANTCREATESOCKET;
       case TCP4U_CANCELLED    :  return FTPERR_CANCELBYUSER;
       default              :  return FTPERR_CANTCONNECT;
    } /* return FTP4W error codes */              
} /* FtpOpenConnection */
Beispiel #14
0
/* ------------------------------------------------------------- */
int _export PASCAL FAR FtpInit (HWND hParentWnd)
{
LPProcData         pProcData, pLast;
HWND               hFtpWnd;
int                Rc;
    
   if (ToolsLocateProcData () != NULL)  return FTPERR_SESSIONUSED;

   Rc=Tcp4uInit ();
   if (Rc!=TCP4U_SUCCESS)      return FTPERR_WINSOCKNOTUSABLE;  

   if (pFirstProcData==NULL || IsBadWritePtr(pFirstProcData, sizeof *pFirstProcData))
     {                  
       pProcData = pFirstProcData = Calloc (1, sizeof *pProcData);
       if (pProcData==NULL)  return FTPERR_INSMEMORY;
       pProcData->Next = pProcData->Prev = NULL;
     }
   else 
     {
       for ( pLast=pFirstProcData ; pLast->Next!=NULL ; pLast= pLast->Next );
       pLast->Next = pProcData = Calloc (1, sizeof *pProcData);
       if (pProcData==NULL)  return FTPERR_INSMEMORY;
       pProcData->Prev = pLast;
       pProcData->Next = NULL;
     }

   /* Get task information */      
   pProcData->hInstance       = GetTaskInstance (hParentWnd); /* port32.c */
   /* fIdentifyThread callback sur l'appelant, nThread sa valeur */
   pProcData->fIdentifyThread = GetCurrentThreadId;
   pProcData->nThreadIdent    = GetCurrentThreadId();


   /* est-ce que la fenetre interne a deja ete creee */
   if (pProcData==pFirstProcData)
   {WNDCLASS           wndClass;
	  /* lstrcpy (szFTPDLL_CLASSNAME, FTP4W_CLASS_NAME); */
	  /* EnregistreClasse : Enregistre la classe de notre fenêtre     */
	  memset (& wndClass, 0, sizeof wndClass); 
	  wndClass.lpszClassName = FTP4W_CLASS_NAME;
	  wndClass.hInstance     = pProcData->hInstance;
	  wndClass.lpfnWndProc   = (WNDPROC) DLLWndProc;
      Rc = RegisterClass (&wndClass);
	  if (! Rc)   { FtpRelease();   return FTPERR_CANTCREATEWINDOW; } 
	}
#ifdef UNE_FENETRE   
   if (pProcData==pFirstProcData)
   {
#endif   
     /* création de la fenêtre */    
      hFtpWnd=CreateWindow (FTP4W_CLASS_NAME,/* window class name        */
                          "", 0,             /* window title, style      */
                          0, 0, 0, 0,        /* x, y, cx, xy             */
                          hParentWnd,        /* a parent for this window */
                          NULL,              /* use the class menu       */
                          pProcData->hInstance, /* who created this wndw */
                          NULL  );           /* no parms to pass on      */
	  if (hFtpWnd==NULL)   
      {  
         FtpRelease ();
         return FTPERR_CANTCREATEWINDOW;
      }
	  pProcData->hFtpWnd         = hFtpWnd;          
#ifdef UNE_FENETRE   
   } /* pas d'instance deja cree -> creation de la fenetre interne */
	   /* si la fenetre interne existe, on la reutilise simplement */ 
   else
	   pProcData->hFtpWnd = pFirstProcData->hFtpWnd;
#endif

   /* On remplit les infos relatives à la tâche */  
   pProcData->hParentWnd      = hParentWnd;
   /* renseignements FTP : Pas de session existante */
   pProcData->ftp.ctrl_socket     = INVALID_SOCKET;
   pProcData->ftp.data_socket     = INVALID_SOCKET;
   /* juste pour noyer l'appel */
   pProcData->ftp.bVerbose        = Protection (); /* Protection rend FALSE */
   pProcData->ftp.nTimeOut        = FTP_DEFTIMEOUT;
   pProcData->ftp.hLogFile        = HFILE_ERROR;
   pProcData->ftp.bPassif         = FALSE;
   pProcData->ftp.nPort           = FTP_DEFCTRLPORT;
   /* renseignement fichier */
   pProcData->File.bAborted   = FALSE;
   pProcData->File.bNotify    = FALSE;
   pProcData->File.bAsyncMode = TRUE;
   pProcData->File.hf         = HFILE_ERROR;
   pProcData->File.nAsyncAlone= FTP_DEFASYNCALONE;
   pProcData->File.nAsyncMulti= FTP_DEFASYNCMULTI;
   pProcData->File.nDelay     = FTP_DEFDELAY;
return FTPERR_OK;
};  /* FtpInit */