void FileTransfer::CreateFileTransferDialog() { m_hwndFileTransfer = CreateDialog(m_pApp->m_instance, MAKEINTRESOURCE(IDD_FILETRANSFER_DLG), NULL, (DLGPROC)FileTransferDlgProc); VNCviewerApp32 *pApp = (VNCviewerApp32 *)(m_clientconn->m_pApp); pApp->AddModelessDialog(m_hwndFileTransfer); ShowWindow(m_hwndFileTransfer, SW_SHOW); UpdateWindow(m_hwndFileTransfer); SetWindowLongPtr(m_hwndFileTransfer, GWLP_USERDATA, (LONG_PTR) this); m_hwndFTProgress = GetDlgItem(m_hwndFileTransfer, IDC_FTPROGRESS); m_hwndFTClientList = GetDlgItem(m_hwndFileTransfer, IDC_FTCLIENTLIST); m_hwndFTServerList = GetDlgItem(m_hwndFileTransfer, IDC_FTSERVERLIST); m_hwndFTClientPath = GetDlgItem(m_hwndFileTransfer, IDC_CLIENTPATH); m_hwndFTServerPath = GetDlgItem(m_hwndFileTransfer, IDC_SERVERPATH); m_hwndFTStatus = GetDlgItem(m_hwndFileTransfer, IDC_FTSTATUS); ListView_SetExtendedListViewStyleEx(m_hwndFTClientList, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT); ListView_SetExtendedListViewStyleEx(m_hwndFTServerList, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT); HANDLE hIcon = LoadImage(m_pApp->m_instance, MAKEINTRESOURCE(IDI_FILEUP), IMAGE_ICON, 16, 16, LR_SHARED); SendMessage(GetDlgItem(m_hwndFileTransfer, IDC_CLIENTUP), BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hIcon); SendMessage(GetDlgItem(m_hwndFileTransfer, IDC_SERVERUP), BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hIcon); DestroyIcon((HICON)hIcon); hIcon = LoadImage(m_pApp->m_instance, MAKEINTRESOURCE(IDI_FILERELOAD), IMAGE_ICON, 16, 16, LR_SHARED); SendMessage(GetDlgItem(m_hwndFileTransfer, IDC_CLIENTRELOAD), BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hIcon); SendMessage(GetDlgItem(m_hwndFileTransfer, IDC_SERVERRELOAD), BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hIcon); DestroyIcon((HICON)hIcon); RECT Rect; GetClientRect(m_hwndFTClientList, &Rect); int xwidth = (int)(0.7 * Rect.right); int xwidth_ = (int)(0.25 * Rect.right); FTInsertColumn(m_hwndFTClientList, "Name", 0, xwidth); FTInsertColumn(m_hwndFTClientList, "Size", 1, xwidth_); FTInsertColumn(m_hwndFTServerList, "Name", 0, xwidth); FTInsertColumn(m_hwndFTServerList, "Size", 1, xwidth_); ShowClientItems(m_ClientPathTmp); SendFileListRequestMessage(m_ServerPathTmp, 0); }
void FileTransfer::ProcessListViewDBLCLK(HWND hwnd, char *Path, char *PathTmp, int iItem) { SendMessage(m_hwndFTProgress, PBM_SETPOS, 0, 0); SetWindowText(m_hwndFTStatus, ""); strcpy(PathTmp, Path); char buffer[rfbMAX_PATH]; char buffer_tmp[16]; ListView_GetItemText(hwnd, iItem, 0, buffer, rfbMAX_PATH); ListView_GetItemText(hwnd, iItem, 1, buffer_tmp, 16); if (strcmp(buffer_tmp, m_FTClientItemInfo.folderText) == 0) { BlockingFileTransferDialog(FALSE); if (strlen(PathTmp) >= 2) strcat(PathTmp, "\\"); strcat(PathTmp, buffer); if (hwnd == m_hwndFTClientList) ShowClientItems(PathTmp); if (hwnd == m_hwndFTServerList) SendFileListRequestMessage(PathTmp, 0); } }
void FileTransfer::FileTransferUpload() { int numOfFilesToUpload = 0, currentUploadIndex = -1; DWORD sz_rfbFileSize; DWORD sz_rfbBlockSize= 8192; DWORD dwNumberOfBytesRead = 0; unsigned int mTime = 0; char path[rfbMAX_PATH + rfbMAX_PATH + 2]; BOOL bResult; numOfFilesToUpload = ListView_GetSelectedCount(m_hwndFTClientList); if (numOfFilesToUpload < 0) { SetWindowText(m_hwndFTStatus, "No file selected, nothing to upload."); BlockingFileTransferDialog(TRUE); EnableWindow(GetDlgItem(m_hwndFileTransfer, IDC_FTCANCEL), FALSE); return; } for (int i = 0; i < numOfFilesToUpload; i++) { BlockingFileTransferDialog(FALSE); EnableWindow(GetDlgItem(m_hwndFileTransfer, IDC_FTCANCEL), TRUE); int index = ListView_GetNextItem(m_hwndFTClientList, currentUploadIndex, LVNI_SELECTED); if (index < 0) { SetWindowText(m_hwndFTStatus, "No file is selected, nothing to download."); return; } currentUploadIndex = index; ListView_GetItemText(m_hwndFTClientList, currentUploadIndex, 0, m_ClientFilename, rfbMAX_PATH); sprintf(path, "%s\\%s", m_ClientPath, m_ClientFilename); strcpy(m_UploadFilename, path); WIN32_FIND_DATA FindFileData; SetErrorMode(SEM_FAILCRITICALERRORS); HANDLE hFile = FindFirstFile(path, &FindFileData); SetErrorMode(0); if (hFile == INVALID_HANDLE_VALUE) { SetWindowText(m_hwndFTStatus, "Could not find selected file, can't upload"); // Continue with upload of other files. continue; } else if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) { SetWindowText(m_hwndFTStatus, "Cannot upload a directory"); // Continue with upload of other files. continue; } else { sz_rfbFileSize = FindFileData.nFileSizeLow; mTime = FiletimeToTime70(FindFileData.ftLastWriteTime); strcpy(m_ServerFilename, FindFileData.cFileName); } FindClose(hFile); if ((sz_rfbFileSize != 0) && (sz_rfbFileSize <= sz_rfbBlockSize)) sz_rfbBlockSize = sz_rfbFileSize; m_hFiletoRead = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (m_hFiletoRead == INVALID_HANDLE_VALUE) { SetWindowText(m_hwndFTStatus, "Upload failed: could not open selected file"); BlockingFileTransferDialog(TRUE); EnableWindow(GetDlgItem(m_hwndFileTransfer, IDC_FTCANCEL), FALSE); return; } char buffer[rfbMAX_PATH + rfbMAX_PATH + rfbMAX_PATH + rfbMAX_PATH + 20]; sprintf(buffer, "Uploading: %s\\%s -> %s\\%s ...", m_ClientPath, m_ClientFilename, m_ServerPath, m_ServerFilename); SetWindowText(m_hwndFTStatus, buffer); sprintf(path, "%s\\%s", m_ServerPath, m_ClientFilename); ConvertPath(path); int pathLen = strlen(path); char *pAllFURMessage = new char[sz_rfbFileUploadRequestMsg + pathLen]; rfbFileUploadRequestMsg *pFUR = (rfbFileUploadRequestMsg *) pAllFURMessage; char *pFollowMsg = &pAllFURMessage[sz_rfbFileUploadRequestMsg]; pFUR->type = rfbFileUploadRequest; pFUR->compressedLevel = 0; pFUR->fNameSize = Swap16IfLE(pathLen); pFUR->position = Swap32IfLE(0); memcpy(pFollowMsg, path, pathLen); m_clientconn->WriteExact(pAllFURMessage, sz_rfbFileUploadRequestMsg + pathLen); delete [] pAllFURMessage; if (sz_rfbFileSize == 0) { SendFileUploadDataMessage(mTime); } else { int amount = sz_rfbFileSize / (sz_rfbBlockSize * 10); InitProgressBar(0, 0, amount, 1); DWORD dwPortionRead = 0; char *pBuff = new char [sz_rfbBlockSize]; m_bUploadStarted = TRUE; while(m_bUploadStarted) { ProcessDlgMessage(m_hwndFileTransfer); if (m_bTransferEnable == FALSE) { SetWindowText(m_hwndFTStatus, "File transfer canceled"); EnableWindow(GetDlgItem(m_hwndFileTransfer, IDC_FTCANCEL), FALSE); BlockingFileTransferDialog(TRUE); char reason[] = "File transfer canceled by user"; int reasonLen = strlen(reason); char *pFUFMessage = new char[sz_rfbFileUploadFailedMsg + reasonLen]; rfbFileUploadFailedMsg *pFUF = (rfbFileUploadFailedMsg *) pFUFMessage; char *pReason = &pFUFMessage[sz_rfbFileUploadFailedMsg]; pFUF->type = rfbFileUploadFailed; pFUF->reasonLen = Swap16IfLE(reasonLen); memcpy(pReason, reason, reasonLen); m_clientconn->WriteExact(pFUFMessage, sz_rfbFileUploadFailedMsg + reasonLen); delete [] pFUFMessage; break; } bResult = ReadFile(m_hFiletoRead, pBuff, sz_rfbBlockSize, &dwNumberOfBytesRead, NULL); if (bResult && dwNumberOfBytesRead == 0) { /* This is the end of the file. */ SendFileUploadDataMessage(mTime); break; } SendFileUploadDataMessage((unsigned short)dwNumberOfBytesRead, pBuff); dwPortionRead += dwNumberOfBytesRead; if (dwPortionRead >= (10 * sz_rfbBlockSize)) { dwPortionRead = 0; SendMessage(m_hwndFTProgress, PBM_STEPIT, 0, 0); } } if (m_bTransferEnable == FALSE) break; m_bUploadStarted = FALSE; delete [] pBuff; } SendMessage(m_hwndFTProgress, PBM_SETPOS, 0, 0); SetWindowText(m_hwndFTStatus, ""); CloseHandle(m_hFiletoRead); } EnableWindow(GetDlgItem(m_hwndFileTransfer, IDC_FTCANCEL), FALSE); BlockingFileTransferDialog(TRUE); SendFileListRequestMessage(m_ServerPath, 0); }