Пример #1
0
int FTP::GetFindData(PluginPanelItem **pPanelItem, int *pItemsNumber, int OpMode)
{
	PROC(("FTP::GetFindData",NULL))
	DWORD        b,e;
	char            *Data[3];
	*pPanelItem   = NULL;
	*pItemsNumber = 0;

//Hosts
	if(ShowHosts)
	{
		EnumHost        Enum(HostsPath);
		FP_SizeItemList il(FALSE);
		PluginPanelItem tmp;
		FTPHost         h;

		if(!IS_SILENT(OpMode))
		{
			memset(&tmp, 0, sizeof(tmp));
			strcpy(tmp.FindData.cFileName,"..");
			tmp.FindData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;

			if(!IS_SILENT(OpMode))
			{
				tmp.Description               = (char *)"..";
				tmp.CustomColumnNumber        = 3;
				tmp.CustomColumnData          = Data;
				tmp.CustomColumnData[0]       = (char *)"..";
				tmp.CustomColumnData[1]       = (char *)"..";
				tmp.CustomColumnData[2]       = (char *)"..";
			}

			if(!il.Add(&tmp))
				return FALSE;
		}

		while(true)
		{
			if(!Enum.GetNextHost(&h))
				break;

			if(!h.Read(NULL))
				continue;

			memset(&tmp, 0, sizeof(tmp));
			/* Panel item MUST have name the save as file saved to disk
			   in case you want to copy between panels work.
			*/
			h.MkINIFile(tmp.FindData.cFileName,NULL,"");
			tmp.FindData.ftLastWriteTime  = h.LastWrite;
			tmp.FindData.dwFileAttributes = h.Folder ? FILE_ATTRIBUTE_DIRECTORY : 0;
			tmp.Flags                     = PPIF_USERDATA;
			tmp.PackSizeHigh              = FTP_HOSTID;
			tmp.UserData                  = (DWORD_PTR)&h;

			if(!IS_SILENT(OpMode))
			{
				tmp.Description               = h.HostDescr;
				tmp.CustomColumnNumber        = 3;
				tmp.CustomColumnData          = Data;
				tmp.CustomColumnData[0]       = h.Host;  //C0
				tmp.CustomColumnData[1]       = h.Home;  //C1
				tmp.CustomColumnData[2]       = h.User;  //C2
			}

			if(!il.Add(&tmp))
				return FALSE;

			Log(("Item[%d]=[%s] attr=%08X",
			     il.Count()-1, FTP_FILENAME(il.Item(il.Count()-1)),
			     il.Item(il.Count()-1)->FindData.dwFileAttributes));
		}

		*pPanelItem   = il.Items();
		*pItemsNumber = il.Count();
		return TRUE;
	}

//FTP
	FP_Screen _scr;
	FTPFileInfo FileInfo;

	if(!hConnect)
	{
		goto AskConnect;
	}

Restart:

	if(!FtpFindFirstFile(hConnect, "*", &FileInfo, &ResetCache))
	{
		if(GetLastError() == ERROR_NO_MORE_FILES)
		{
			*pItemsNumber = 0;
			return TRUE;
		}

		if(SwitchingToFTP && GetLastError() == ERROR_CANCELLED)
		{
			;
		}
		else
		{
			if(CurrentState == fcsExpandList)
			{
				FreeFindData(*pPanelItem,*pItemsNumber);
				*pPanelItem   = NULL;
				*pItemsNumber = 0;
				return FALSE;
			}

//Query reconnect
			do
			{
				if(!hConnect)
					break;

				if(GetLastError() == ERROR_CANCELLED)
					break;

				if(!hConnect->ConnectMessageTimeout(MConnectionLost,Host.HostName,-MRestore))
				{
					Log(("WaitMessage cancelled"));
					break;
				}

				if(FtpCmdLineAlive(hConnect) &&
				        FtpKeepAlive(hConnect))
					goto Restart;

				if(SelectFile.Length() && CurrentState != fcsExpandList)
					SaveUsedDirNFile();

AskConnect:

				if(Connect())
					goto Restart;
				else
					break;
			}
			while(true);
		}

		if(!ShowHosts)
			BackToHosts();

		FreeFindData(*pPanelItem, *pItemsNumber);
		return GetFindData(pPanelItem,pItemsNumber,OpMode);
	}

	GET_TIME(b);

	do
	{
		if(Opt.ShowIdle)
		{
			char str[ 200 ];
			GET_TIME(e);

			if(CMP_TIME(e,b) > 0.5)
			{
				_snprintf(str,ARRAYSIZE(str),"%s%d", FP_GetMsg(MReaded), *pItemsNumber);
				SetLastError(ERROR_SUCCESS);
				IdleMessage(str,Opt.ProcessColor);
				b = e;

				if(CheckForEsc(FALSE))
				{
					SetLastError(ERROR_CANCELLED);
					return FALSE;
				}
			}
		}

		PluginPanelItem *NewPanelItem=*pPanelItem;

		if((*pItemsNumber % 1024) == 0)
		{
			if(!NewPanelItem)
				NewPanelItem = (PluginPanelItem *)malloc((1024+1)*sizeof(PluginPanelItem));
			else
				NewPanelItem = (PluginPanelItem *)realloc(NewPanelItem,(*pItemsNumber+1024+1)*sizeof(PluginPanelItem));

			if(NewPanelItem == NULL)
			{
				/*-*/Log(("GetFindData(file)::!reallocate plugin panels items %d -> %d",*pItemsNumber,*pItemsNumber+1024+1));
				return FALSE;
			}

			*pPanelItem=NewPanelItem;
		}

		PluginPanelItem *CurItem = &NewPanelItem[*pItemsNumber];
		memset(CurItem, 0, sizeof(PluginPanelItem));
		CurItem->FindData = FileInfo.FindData;

		if(!IS_SILENT(OpMode))
		{
			CurItem->CustomColumnNumber             = FTP_COL_MAX;
			CurItem->Owner                          = FileInfo.FTPOwner[0] ? strdup(FileInfo.FTPOwner) : NULL;
			CurItem->CustomColumnData               = (LPSTR*)malloc(sizeof(LPSTR*)*FTP_COL_MAX);
			CurItem->CustomColumnData[FTP_COL_MODE] = strdup(FileInfo.UnixMode);
			CurItem->CustomColumnData[FTP_COL_LINK] = strdup(FileInfo.Link);
			hConnect->ToOEM(CurItem->CustomColumnData[FTP_COL_LINK]);
		}

		(*pItemsNumber)++;
	}
	while(FtpFindNextFile(hConnect,&FileInfo));

	return TRUE;
}
Пример #2
0
int FTP::ProcessEvent(int Event,void *Param)
{
#if defined(__FILELOG__)
	static LPCSTR states[] = { "fcsNormal", "fcsExpandList", "fcsClose", "fcsConnecting","fcsFTP" };
	PROC(("ProcessEvent","%d (%s),%08X",Event,states[CurrentState],Param))
#endif
	PanelInfo pi;
	int       n;
	FTPHost*  p;
	pi.PanelItems = NULL;

	if(Event == FE_BREAK ||
	        CurrentState == fcsClose ||
	        CurrentState == fcsConnecting)
	{
		Log(("Skip event"));
		return FALSE;
	}

//Close notify
	if(Event == FE_CLOSE)
	{
		Log(("Close notify"));
		CurrentState = fcsClose;

		if(ShowHosts)
		{
			if(!pi.PanelItems)
				FP_Info->Control(this, FCTL_GETPANELINFO, &pi);

			FP_SetRegKey("LastHostsMode",pi.ViewMode);
			Log(("Write HostsMode: %d",pi.ViewMode));
		}

		return FALSE;
	}

//Position cursor to added|corrected item on panel
	if(Event == FE_REDRAW)
	{
		if(SelectFile.Length())
		{
			Log(("PositionItem: [%s]",SelectFile.c_str()));

			if(!pi.PanelItems)
				FP_Info->Control(this, FCTL_GETPANELINFO, &pi);

			for(n = 0; n < pi.ItemsNumber; n++)
			{
				if(ShowHosts)
				{
					if((p=FTPHost::Convert(&pi.PanelItems[n])) == NULL ||
					        !SelectFile.Cmp(PointToName(p->RegKey)))
						continue;
				}
				else
				{
					if(!SelectFile.Cmp(FTP_FILENAME(&pi.PanelItems[n])))
						continue;
				}

				Log(("PosItem[%d] [%s]", n, FTP_FILENAME(&pi.PanelItems[n])));
				PanelRedrawInfo pri;
				pri.CurrentItem  = n;
				pri.TopPanelItem = pi.TopPanelItem;
				SelectFile       = "";
				FP_Info->Control(this,FCTL_REDRAWPANEL,&pri);
				break;
			}

			SelectFile = "";
		}
	}/*REDRAW*/

//Correct saved hosts mode on change
	if(ShowHosts && Event == FE_CHANGEVIEWMODE)
	{
		if(!pi.PanelItems)
			FP_Info->Control(this, FCTL_GETPANELINFO, &pi);

		Log(("New ColumnMode %d",pi.ViewMode));
		FP_SetRegKey("LastHostsMode",pi.ViewMode);
	}

//Set start hosts panel mode
	if(Event == FE_REDRAW)
	{
		if(ShowHosts && !PluginColumnModeSet)
		{
			if(Opt.PluginColumnMode != -1)
				FP_Info->Control(this,FCTL_SETVIEWMODE,&Opt.PluginColumnMode);
			else
			{
				int num = FP_GetRegKey("LastHostsMode",2);
				FP_Info->Control(this,FCTL_SETVIEWMODE,&num);
			}

			PluginColumnModeSet = TRUE;
		}
		else if(isBackup() && NeedToSetActiveMode)
		{
			FP_Info->Control(this,FCTL_SETVIEWMODE,&ActiveColumnMode);
			NeedToSetActiveMode = FALSE;
		}
	}

//Keep alive
	if(Event == FE_IDLE          &&
	        !ShowHosts                &&
	        FtpCmdLineAlive(hConnect) &&
	        KeepAlivePeriod           &&
	        FP_PeriodEnd(KeepAlivePeriod))
	{
		Log(("Keep alive"));
		FTPCmdBlock blocked(this,TRUE);

		if(Opt.ShowIdle)
		{
			SetLastError(ERROR_SUCCESS);
			IdleMessage(FP_GetMsg(MKeepAliveExec),Opt.ProcessColor);
		}

		FtpKeepAlive(hConnect);
		Log(("end Keep alive"));
	}

//CMD line
	if(Event == FE_COMMAND)
	{
		Log(("CMD line"));
		return ExecCmdLine((LPCSTR)Param,FALSE);
	}

	return FALSE;
}