📄 filetransfer.cpp
字号:
pItem2.iSubItem = 0;
pItem2.lParam = 0;
ListView_GetItem(pSort->hWndLV,&pItem2);
//check if the first item (that is in front of second item in list)
//is a file and the second one is a directory
//so we switch them
//Do the check only if we are in the first (file) colum
if (((pItem1.lParam & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)
&& ((pItem2.lParam & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
&& (pSort->nColumn == 0))
{
//let us see if the first file is a device
//in that case the device must be placed in front of the directory
if ((pItem1.lParam & FILE_ATTRIBUTE_DEVICE) == FILE_ATTRIBUTE_DEVICE)
nRet = -1;
else
nRet = 1;
}
//check for directory and device in this order
//if it does not have the correct order we must exchange them
else if (((pItem1.lParam & FILE_ATTRIBUTE_DEVICE) != FILE_ATTRIBUTE_DEVICE)
&& ((pItem2.lParam & FILE_ATTRIBUTE_DEVICE) == FILE_ATTRIBUTE_DEVICE))
{
nRet = 1;
}
//we do not check for dir <-> file or device <-> file directly because this case should never happen (but never say never!)
else
{
//does not support unicode!
TCHAR sz1[MAX_PATH], sz2[MAX_PATH];
ListView_GetItemText(pSort->hWndLV, lParam1, pSort->nColumn, sz1, MAX_PATH-1);
ListView_GetItemText(pSort->hWndLV, lParam2, pSort->nColumn, sz2, MAX_PATH-1);
//compare case insensitive
nRet = lstrcmpi(sz1, sz2);
}
//switch sort mode
if(!pSort->bAscending)
nRet = -nRet;
return(nRet);
}
//
// Populate the local machine listbox with files located in szPath
//
void FileTransfer::PopulateLocalListBox(HWND hWnd, LPSTR szPath)
{
// vnclog.Print(0, VNCLOG(_T("PopulateLocalListBox")));
char ofDir[MAX_PATH];
char ofDirT[MAX_PATH];
int nSelected = -1;
int nCount = 0;
int nFileCount = 0;
char szLocalStatus[128];
HWND hWndLocalList = GetDlgItem(hWnd, IDC_LOCAL_FILELIST);
HWND hWndRemoteList = GetDlgItem(hWnd, IDC_REMOTE_FILELIST);
ofDir[0] = '\0';
ofDirT[0] = '\0';
BOOL personateState = vncService::BeginImpersonation();
if (lstrlen(szPath) == 0)
{
nCount = ListView_GetItemCount(hWndLocalList);
for (nSelected = 0; nSelected < nCount; nSelected++)
{
if(ListView_GetItemState(hWndLocalList, nSelected, LVIS_SELECTED) & LVIS_SELECTED)
{
LVITEM Item;
Item.mask = LVIF_TEXT;
Item.iItem = nSelected;
Item.iSubItem = 0;
Item.pszText = ofDirT;
Item.cchTextMax = MAX_PATH;
ListView_GetItem(hWndLocalList, &Item);
break;
}
}
if (ResolvePossibleShortcutFolder(hWnd, ofDirT))
ofDirT[0] = '\0';
}
else
{
// Usual shortcuts case
if (ResolvePossibleShortcutFolder(hWnd, szPath))
{
}
else
{
// General case
szPath[6] = '\0';
// szPath always contains a drive letter (X:) or (..)
strcpy(ofDirT, szPath);
// In the case of (..) we keep the current path intact
char szUpDirMask[16];
sprintf(szUpDirMask, "%s..%s", rfbDirPrefix, rfbDirSuffix);
if (strcmp(ofDirT, szUpDirMask))
SetDlgItemText(hWnd, IDC_CURR_LOCAL, "");
}
}
if (personateState)
vncService::EndImpersonation();
if (nSelected == nCount || lstrlen(ofDirT) == 0)
{
GetDlgItemText(hWnd, IDC_CURR_LOCAL, ofDirT, sizeof(ofDirT));
if (strlen(ofDirT) == 0) return;
}
else
{
if (ofDirT[0] == rfbDirPrefix[0] && ofDirT[1] == rfbDirPrefix[1])
{
strncpy(ofDir, ofDirT + 2, strlen(ofDirT) - 3);
ofDir[strlen(ofDirT) - 4] = '\0';
}
else
return;
GetDlgItemText(hWnd, IDC_CURR_LOCAL, ofDirT, sizeof(ofDirT));
if (!stricmp(ofDir, ".."))
{
char* p;
ofDirT[strlen(ofDirT) - 1] = '\0';
p = strrchr(ofDirT, '\\');
if (p == NULL) return;
*p = '\0';
}
else
strcat(ofDirT, ofDir);
strcat(ofDirT, "\\");
SetDlgItemText(hWnd, IDC_CURR_LOCAL, ofDirT);
}
strcpy(ofDir, ofDirT);
strcat(ofDir, "*");
// Select the good drive in the drives combo box (the first time only)
int nIndex = SendDlgItemMessage(hWnd, IDC_LOCAL_DRIVECB, CB_GETCURSEL, 0, 0L);
if (nIndex == LB_ERR)
{
char szDrive[5];
strcpy(szDrive, rfbDirPrefix);
strncat(szDrive, ofDir, 2);
nIndex = SendDlgItemMessage(hWnd, IDC_LOCAL_DRIVECB, CB_FINDSTRING, -1, (LPARAM)(LPSTR)szDrive);
SendDlgItemMessage(hWnd, IDC_LOCAL_DRIVECB, CB_SETCURSEL, nIndex, 0L);
}
sprintf(szLocalStatus, sz_H8);
SetDlgItemText(hWnd, IDC_LOCAL_STATUS, szLocalStatus);
ListView_DeleteAllItems(hWndLocalList);
personateState = vncService::BeginImpersonation();
WIN32_FIND_DATA fd;
HANDLE ff;
int bRet = 1;
SetErrorMode(SEM_FAILCRITICALERRORS); // No popup please !
ff = FindFirstFile(ofDir, &fd);
SetErrorMode( 0 );
if (ff == INVALID_HANDLE_VALUE)
{
sprintf(szLocalStatus, sz_H9);
SetDlgItemText(hWnd, IDC_LOCAL_STATUS, szLocalStatus);
if (personateState)
vncService::EndImpersonation();
return;
}
while (bRet != 0)
{
AddFileToFileList(hWnd, IDC_LOCAL_FILELIST, fd, true);
nFileCount++;
if (!PseudoYield(GetParent(hWnd)))
{
if (personateState)
vncService::EndImpersonation();
return;
}
bRet = FindNextFile(ff, &fd);
}
FindClose(ff);
if (personateState)
vncService::EndImpersonation();
//sort files with a better sort algorithm (leading zero point problem)
static LISTVIEWSORTPARAMS sort;
sort.hWndLV = GetDlgItem(hWnd, IDC_LOCAL_FILELIST);
sort.nColumn = 0;
sort.bAscending = true;
ListView_SortItemsEx(GetDlgItem(hWnd, IDC_LOCAL_FILELIST), ListViewFileCompareFunc, (LPARAM)&sort);
sprintf(szLocalStatus, " > %d %s", nFileCount, sz_H58);
SetDlgItemText(hWnd, IDC_LOCAL_STATUS, szLocalStatus);
// If some files have been received
HighlightTransferedFiles( hWndRemoteList, hWndLocalList);
}
//
// Request the contents of a remote directory
//
void FileTransfer::RequestRemoteDirectoryContent(HWND hWnd, LPSTR szPath)
{
// vnclog.Print(0, VNCLOG(_T("RequestRemoteDirectoryContent")));
if (!m_fFTAllowed)
{
m_fFileCommandPending = false;
return;
}
char ofDir[MAX_PATH];
char ofDirT[MAX_PATH];
int nSelected = -1;
int nCount = 0;
HWND hWndRemoteList = GetDlgItem(hWnd, IDC_REMOTE_FILELIST);
ofDir[0] = '\0';
ofDirT[0] = '\0';
if (lstrlen(szPath) == 0)
{
nCount = ListView_GetItemCount(hWndRemoteList);
for (nSelected = 0; nSelected < nCount; nSelected++)
{
if(ListView_GetItemState(hWndRemoteList, nSelected, LVIS_SELECTED) & LVIS_SELECTED)
{
LVITEM Item;
Item.mask = LVIF_TEXT;
Item.iItem = nSelected;
Item.iSubItem = 0;
Item.pszText = ofDirT;
Item.cchTextMax = MAX_PATH;
ListView_GetItem(hWndRemoteList, &Item);
break;
}
}
}
else
{
if (!IsShortcutFolder(szPath))
szPath[6] = '\0';
// szPath always contains a drive letter (X:) or (..)
strcpy(ofDirT, szPath);
// In the case of (..) we keep the current path intact
char szUpDirMask[16];
sprintf(szUpDirMask, "%s..%s", rfbDirPrefix, rfbDirSuffix);
if (strcmp(ofDirT, szUpDirMask))
SetDlgItemText(hWnd, IDC_CURR_REMOTE, "");
}
if (nSelected == nCount || lstrlen(ofDirT) == 0)
{
GetDlgItemText(hWnd, IDC_CURR_REMOTE, ofDirT, sizeof(ofDirT));
if (strlen(ofDirT) == 0)
{
m_fFileCommandPending = false;
return;
}
}
else
{
if (ofDirT[0] == rfbDirPrefix[0] && ofDirT[1] == rfbDirPrefix[1])
{
strncpy(ofDir, ofDirT + 2, strlen(ofDirT) - 3);
ofDir[strlen(ofDirT) - 4] = '\0';
}
else
{
m_fFileCommandPending = false;
return;
}
GetDlgItemText(hWnd, IDC_CURR_REMOTE, ofDirT, sizeof(ofDirT));
if (!stricmp(ofDir, ".."))
{
char* p;
ofDirT[strlen(ofDirT) - 1] = '\0';
p = strrchr(ofDirT, '\\');
if (p == NULL)
{
m_fFileCommandPending = false;
return;
}
*p = '\0';
}
else
strcat(ofDirT, ofDir);
strcat(ofDirT, "\\");
SetDlgItemText(hWnd, IDC_CURR_REMOTE, ofDirT);
}
strcpy(ofDir, ofDirT);
// Todo: In case of shortcuts dir, do a translation here !
// Select the good drive in the drives combo box (the first time only)
int nIndex = SendDlgItemMessage(hWnd, IDC_REMOTE_DRIVECB, CB_GETCURSEL, 0, 0L);
if (nIndex == LB_ERR)
{
char szDrive[5];
strcpy(szDrive, rfbDirPrefix);
strncat(szDrive, ofDir, 2);
nIndex = SendDlgItemMessage(hWnd, IDC_REMOTE_DRIVECB, CB_FINDSTRING, -1, (LPARAM)(LPSTR)szDrive);
SendDlgItemMessage(hWnd, IDC_REMOTE_DRIVECB, CB_SETCURSEL, nIndex, 0L);
}
ListView_DeleteAllItems(hWndRemoteList);
rfbFileTransferMsg ft;
ft.type = rfbFileTransfer;
ft.contentType = rfbDirContentRequest;
ft.contentParam = rfbRDirContent; // Directory content please
ft.length = Swap32IfLE(strlen(ofDir));
m_pCC->WriteExact((char *)&ft, sz_rfbFileTransferMsg, rfbFileTransfer);
m_pCC->WriteExact((char *)ofDir, strlen(ofDir));
return;
}
//
// Populate the remote machine listbox with files received from server
//
void FileTransfer::PopulateRemoteListBox(HWND hWnd, int nLen)
{
// vnclog.Print(0, VNCLOG(_T("PopulateRemoteListBox")));
char szRemoteStatus[128];
// If the distant media is not browsable for some reason
if (nLen == 0)
{
sprintf(szRemoteStatus, sz_H10);
SetDlgItemText(hWnd, IDC_REMOTE_STATUS, szRemoteStatus);
return;
}
// sf@2004 - Read the returned Directory full path
if (nLen > 1 && !m_fOldFTProtocole)
{
TCHAR szPath[MAX_PATH];
if (nLen > sizeof(szPath)) return;
m_pCC->ReadString((char *)szPath, nLen);
SetDlgItemText(hWnd, IDC_CURR_REMOTE, szPath);
}
sprintf(szRemoteStatus, sz_H11);
SetDlgItemText(hWnd, IDC_REMOTE_STATUS, szRemoteStatus);
// The dir in the current packet
memset(&m_fd, '\0', sizeof(WIN32_FIND_DATA));
m_nFileCount = 0;
m_fDirectoryReceptionRunning = true;
// FT Backward compatibility DIRTY hack for DSMPlugin mode...
if (m_fOldFTProtocole && m_pCC->m_fUsePlugin)
{
m_pCC->m_nTO = 0;
ProcessFileTransferMsg();
}
/*
This line supresses the bugfix where remote items are displayed twice
cw@2007
*/
ListView_DeleteAllItems(GetDlgItem(hWnd, IDC_REMOTE_FILELIST));
}
//
//
//
void FileTransfer::ReceiveDirectoryItem(HWND hWnd, int nLen)
{
// vnclog.Print(0, VNCLOG(_T("ReceiveDirectoryItem")));
if (!m_fDirectoryReceptionRunning) return;
if (nLen > sizeof(m_szFileSpec)) return;
// Read the File/Directory full info
m_pCC->ReadString((char *)m_szFileSpec, nLen);
memset(&m_fd, '\0', sizeof(WIN32_FIND_DATA));
memcpy(&m_fd, m_szFileSpec, nLen);
AddFileToFileList(hWnd, IDC_REMOTE_FILELIST, m_fd, false);
m_nFileCount++;
// PseudoYield(pFileTransfer->hWnd);
if (!PseudoYield(GetParent(hWnd))) return;
// FT Backward compatibility DIRTY hack for DSMPlugin mode...
if (m_fOldFTProtocole && m_pCC->m_fUsePlugin)
{
m_pCC->m_nTO = 0;
ProcessFileTransferMsg();
}
}
//
//
//
void FileTransfer::FinishDirectoryReception()
{
// vnclog.Print(0, VNCLOG(_T("FinishDirectoryReception")));
if (!m_fDirectoryReceptionRunning) return;
HWND hWndLocalList = GetDlgItem(hWnd, IDC_LOCAL_FILELIST);
HWND hWndRemoteList = GetDlgItem(hWnd, IDC_REMOTE_FILELIST);
char szRemoteStatus[128];
sprintf(szRemoteStatus, " > %d %s", m_nFileCount, sz_H58);
SetDlgItemText(hWnd, IDC_REMOTE_STATUS, szRemoteStatus);
// If some files have been sent to remote side highlight them
HighlightTransferedFiles(hWndLocalList, hWndRemoteList);
// UpdateWindow(hWnd);
m_fDirectoryReceptionRunning = false;
//sort files with a better sort algorithm (leading zero point problem)
static LISTVIEWSORTPARAMS sort;
sort.hWndLV = GetDlgItem(hWnd, IDC_REMOTE_FILELIST);
sort.nColumn = 0;
sort.bAscending = true;
ListView_SortItemsEx(GetDlgItem(hWnd, IDC_REMOTE_FILELIST), ListViewFileCompareFunc, (LPARAM)&sort);
}
//
// request the list of remote drives
//
void FileTransfer::RequestRemoteDrives()
{
// vnclog.Print(0, VNCLOG(_T("RequestRemoteDrives")));
if (!m_fFTAllowed) return;
// TODO : hook error !
rfbFileTransferMsg ft;
ft.type = rfbFileTransfer;
ft.contentType = rfbDirContentRequest;
ft.contentParam = rfbRDrivesList; // List of Remote Drives please
ft.length = 0;
m_pCC->WriteExact((char *)&ft, sz_rfbFileTransferMsg, rfbFileTransfer);
return;
}
//
// Fill the Remote FilesList and remote drives combo box
//
void FileTransfer::ListRemoteDrives(HWND hWnd, int nLen)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -