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 */
/* ------------------------------------------------------------ */ 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 */
/* ------------------------------------------------------------ */ 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 */
/* ------------------------------------------------------------- */ 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 () */
/* ------------------------------------------------------------ */ 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 */
/* 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 */
/* ------------------------------------------------------------ */ 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 */
/* ------------------------------------------------------------ */ 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 */
/* ------------------------------------------------------------ */ 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 */
/* ------------------------------------------------------------ */ 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 */
/* ------------------------------------------------------------ */ 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 */
/* ------------------------------------------------------------ */ 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 */
/* ----------------------------------------------------------- */ 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 */
/* ------------------------------------------------------------- */ 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 */