text: ﻿#include <all_far.h>
  #pragma hdrstop
  
  #include "Int.h"
  
  BOOL FTP::DoFtpConnect(int blocked)
  {
  	char  hst[FAR_MAX_NAME],
  	   usr[FAR_MAX_NAME],
  	   pwd[FAR_MAX_NAME];
  	const char *m;
  	BOOL  askPwd = Host.AskLogin;
  	hConnect = NULL;
  	SetLastError(ERROR_SUCCESS);
  
  	if(!Host.Host[0])
  		return FALSE;
  
  	CurrentState = fcsConnecting;
  	//Create`n`Init connection
  	hConnect = new Connection;
  
  	if(!hConnect)
  	{
  		CurrentState = fcsNormal;
  		return FALSE;
  	}
  
  	hConnect->InitData(&Host,blocked);
  	hConnect->InitCmdBuff();
  	hConnect->InitIOBuff();
  
  	do
  	{
  		hConnect->Host.ExtCmdView = Host.ExtCmdView;
  		StrCpy(hst, Host.Host,     ARRAYSIZE(hst));
  		StrCpy(usr, Host.User,     ARRAYSIZE(usr));
  		StrCpy(pwd, Host.Password, ARRAYSIZE(pwd));
  
  		if(!hConnect->LoginComplete)
  			if(!GetLoginData(usr, pwd, Host.AskLogin || askPwd))
  				break;
  
  		//Firewall
  		if(Host.UseFirewall && *Opt.Firewall)
  		{
  			strcat(usr,"@");
  			StrCat(usr,hst,ARRAYSIZE(usr));
  			StrCpy(hst,Opt.Firewall,ARRAYSIZE(hst));
  		}
  
  		// Find port
  		m = strrchr(hst,':');
  
  		if(m)
  		{
  			*(char *)m = 0;
  			m++;
  		}
  		else
  			m = "0";
  
  		//Connect
  		Log(("Connecting"));
  
  		if(hConnect->Init(hst,m,usr,pwd))
  		{
  			Log(("Connecting succ %d",hConnect->GetResultCode()));
  
  			if(hConnect->GetResultCode() > 420)
  			{
  				Log(("Connect error from server [%d]",hConnect->GetResultCode()));
  				return FALSE;
  			}
  
  			FtpSystemInfo(hConnect,NULL,-1);
  
  			if(!FtpGetFtpDirectory(hConnect))
  			{
  				Log(("!Connect - get dir"));
  				return FALSE;
  			}
  
  			hConnect->CheckResume();
  			CurrentState = fcsFTP;
  			return TRUE;
  		}
  
  		Log(("!Init"));
  
  		if(!hConnect->LoginComplete &&
  		        Opt.AskLoginFail && hConnect->GetResultCode() == 530)
  		{
  			Log(("Reask password"));
  			hConnect->Host.ExtCmdView = TRUE;
  			hConnect->ConnectMessage(MNone__,hst,MNone__);
  			askPwd = TRUE;
  			continue;
  		}
  
  		//!Connected
  		SetLastError(hConnect->ErrorCode);
  
  		//!Init
  		if((UINT)hConnect->SocketError != INVALID_SOCKET)
  			hConnect->ConnectMessage(MWSANotInit,GetSocketErrorSTR(hConnect->SocketError),-MOk);
  		else
  
  			//!Cancel, but error
  			if(hConnect->ErrorCode != ERROR_CANCELLED)
  				hConnect->ConnectMessage(MCannotConnectTo,Host.Host,-MOk);
  
  		break;
  	}
  	while(true);
  
  	CurrentState = fcsNormal;
  	delete hConnect;
  	hConnect = NULL;
  	return FALSE;
  }
  
  int FTP::Connect()
  {
  	PROC(("FTP::Connect",NULL))
  	ConnectionState  cst;
  	FP_Screen        _scr;
  	LogCmd("-------- CONNECTING (plugin: " __DATE__ ", " __TIME__ ") --------",ldInt);
  
  	do
  	{
  //Close old
  		if(hConnect)
  		{
  			Log(("old connection %p",hConnect));
  			hConnect->GetState(&cst);
  			Log(("del connection %p",hConnect));
  			delete hConnect;
  			hConnect = NULL;
  			Log(("del connection done"));
  		}
  
  //Connect
  		if(Opt.ShowIdle && IS_SILENT(FP_LastOpMode))
  		{
  			Log(("Say connecting"));
  			SetLastError(ERROR_SUCCESS);
  			IdleMessage(FP_GetMsg(MConnecting),Opt.ProcessColor);
  		}
  
  		if(!DoFtpConnect(cst.Inited ? cst.Blocked : (-1)) ||
  		        !hConnect)
  		{
  			Log(("!Connected"));
  			break;
  		}
  
  		if(cst.Inited)
  		{
  			//Restore old connection values or set defaults
  			Log(("Restore connection datas"));
  			hConnect->SetState(&cst);
  		}
  		else
  		{
  			//Init new caonnection values
  			Log(("Set connection defaults"));
  			hConnect->SetTable(TableNameToValue((*Host.HostTable) ? Host.HostTable : Opt.Table));
  			hConnect->Host.PassiveMode = Host.PassiveMode;
  		}
  
  //Set start FTP mode
  		ShowHosts       = FALSE;
  		SwitchingToFTP  = TRUE;
  		SelectFile      = "";
  		FP_Info->Control(this,FCTL_REDRAWANOTHERPANEL,NULL);
  
  //Set base directory
  		if(hConnect && *Host.Home)
  		{
  			if(Host.Home[0]=='/'&&Host.Home[1]=='\'')
  				memmove(Host.Home,Host.Home+1,sizeof(Host.Home)-1);
  
  			Log(("HomeDir [%s]",Host.Home));
  			FtpSetCurrentDirectory(hConnect,Host.Home);
  		}
  
  		IdleMessage(NULL,0);
  		return TRUE;
  	}
  	while(0);
  
  	if(hConnect)
  	{
  		hConnect->ConnectMessage(MCannotConnectTo, Host.Host, -MOk);
  		delete hConnect;
  		hConnect = NULL;
  	}
  
  	Host.Init();
  	IdleMessage(NULL,0);
  	return FALSE;
  }
  
  BOOL FTP::FullConnect()
  {
  	if(Connect())
  	{
  		if(!ShowHosts)
  		{
  			BOOL isSaved = FP_Screen::isSaved() != 0;
  			FP_Screen::FullRestore();
  			FP_Info->Control(this,FCTL_SETVIEWMODE,&StartViewMode);
  			FP_Info->Control(this,FCTL_UPDATEPANEL,NULL);
  			PanelRedrawInfo ri;
  			ri.CurrentItem = ri.TopPanelItem = 0;
  			FP_Info->Control(this,FCTL_REDRAWPANEL,&ri);
  
  			if(isSaved)
  				FP_Screen::Save();
  
  			SwitchingToFTP = FALSE;
  			return TRUE;
  		}
  	}
  
  	return FALSE;
  }
  