static void test_deletefile(HINTERNET hFtp, HINTERNET hConnect) { BOOL bRet; /* Invalid internet handle, the other is a valid parameter */ SetLastError(0xdeadbeef); bRet = FtpDeleteFileA(NULL, "non_existent_file_deadbeef"); ok ( bRet == FALSE, "Expected FtpDeleteFileA to fail\n"); ok ( GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); /* No filename */ SetLastError(0xdeadbeef); bRet = FtpDeleteFileA(hFtp, NULL); ok ( bRet == FALSE, "Expected FtpDeleteFileA to fail\n"); ok ( GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); /* Parameters are OK but remote file should not be there */ SetLastError(0xdeadbeef); bRet = FtpDeleteFileA(hFtp, "non_existent_file_deadbeef"); ok ( bRet == FALSE, "Expected FtpDeleteFileA to fail\n"); ok ( GetLastError() == ERROR_INTERNET_EXTENDED_ERROR, "Expected ERROR_INTERNET_EXTENDED_ERROR, got %d\n", GetLastError()); /* One small test to show that handle type is checked before parameters */ SetLastError(0xdeadbeef); bRet = FtpDeleteFileA(hConnect, NULL); ok ( bRet == FALSE, "Expected FtpDeleteFileA to fail\n"); ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE, "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError()); SetLastError(0xdeadbeef); bRet = FtpDeleteFileA(hConnect, "non_existent_file_deadbeef"); ok ( bRet == FALSE, "Expected FtpCreateDirectoryA to fail\n"); ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE, "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError()); }
static void test_openfile(HINTERNET hFtp, HINTERNET hConnect) { HINTERNET hOpenFile; /* Invalid internet handle, the rest are valid parameters */ SetLastError(0xdeadbeef); hOpenFile = FtpOpenFileA(NULL, "welcome.msg", GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0); ok ( !hOpenFile, "Expected FtpOpenFileA to fail\n"); ok ( GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); InternetCloseHandle(hOpenFile); /* Just in case */ /* No filename */ SetLastError(0xdeadbeef); hOpenFile = FtpOpenFileA(hFtp, NULL, GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0); ok ( !hOpenFile, "Expected FtpOpenFileA to fail\n"); ok ( GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); InternetCloseHandle(hOpenFile); /* Just in case */ /* Illegal access flags */ SetLastError(0xdeadbeef); hOpenFile = FtpOpenFileA(hFtp, "welcome.msg", 0, FTP_TRANSFER_TYPE_ASCII, 0); ok ( !hOpenFile, "Expected FtpOpenFileA to fail\n"); ok ( GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); InternetCloseHandle(hOpenFile); /* Just in case */ /* Illegal combination of access flags */ SetLastError(0xdeadbeef); hOpenFile = FtpOpenFileA(hFtp, "welcome.msg", GENERIC_READ|GENERIC_WRITE, FTP_TRANSFER_TYPE_ASCII, 0); ok ( !hOpenFile, "Expected FtpOpenFileA to fail\n"); ok ( GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); InternetCloseHandle(hOpenFile); /* Just in case */ /* Illegal condition flags */ SetLastError(0xdeadbeef); hOpenFile = FtpOpenFileA(hFtp, "welcome.msg", GENERIC_READ, 0xffffffff, 0); ok ( !hOpenFile, "Expected FtpOpenFileA to fail\n"); ok ( GetLastError() == ERROR_INTERNET_EXTENDED_ERROR || GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INTERNET_EXTENDED_ERROR or ERROR_INVALID_PARAMETER (win98), got %d\n", GetLastError()); InternetCloseHandle(hOpenFile); /* Just in case */ SetLastError(0xdeadbeef); hOpenFile = FtpOpenFileA(hFtp, "welcome.msg", GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0); ok ( hOpenFile != NULL, "Expected FtpOpenFileA to succeed\n"); ok ( GetLastError() == ERROR_SUCCESS || broken(GetLastError() == ERROR_FILE_NOT_FOUND), /* Win98 */ "Expected ERROR_SUCCESS, got %u\n", GetLastError()); if (hOpenFile) { BOOL bRet; DWORD error; HINTERNET hOpenFile2; HANDLE hFile; /* We have a handle so all ftp calls should fail (TODO: Put all ftp-calls in here) */ SetLastError(0xdeadbeef); bRet = FtpCreateDirectoryA(hFtp, "new_directory_deadbeef"); error = GetLastError(); ok ( bRet == FALSE, "Expected FtpCreateDirectoryA to fail\n"); ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_INTERNET_EXTENDED_ERROR), "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); trace_extended_error(error); SetLastError(0xdeadbeef); bRet = FtpDeleteFileA(hFtp, "non_existent_file_deadbeef"); error = GetLastError(); ok ( bRet == FALSE, "Expected FtpDeleteFileA to fail\n"); ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_INTERNET_EXTENDED_ERROR), "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); trace_extended_error(error); SetLastError(0xdeadbeef); bRet = FtpGetFileA(hFtp, "welcome.msg", "should_be_non_existing_deadbeef", FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_UNKNOWN, 0); error = GetLastError(); ok ( bRet == FALSE || broken(bRet == TRUE), "Expected FtpGetFileA to fail\n"); ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_SUCCESS), "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); DeleteFileA("should_be_non_existing_deadbeef"); /* Just in case */ SetLastError(0xdeadbeef); hOpenFile2 = FtpOpenFileA(hFtp, "welcome.msg", GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0); error = GetLastError(); ok ( bRet == FALSE || broken(bRet == TRUE), "Expected FtpOpenFileA to fail\n"); ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_SUCCESS), "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); InternetCloseHandle(hOpenFile2); /* Just in case */ /* Create a temporary local file */ SetLastError(0xdeadbeef); hFile = CreateFileA("now_existing_local", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); ok ( hFile != NULL, "Error creating a local file : %d\n", GetLastError()); CloseHandle(hFile); SetLastError(0xdeadbeef); bRet = FtpPutFileA(hFtp, "now_existing_local", "non_existing_remote", FTP_TRANSFER_TYPE_UNKNOWN, 0); error = GetLastError(); ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n"); ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_INTERNET_EXTENDED_ERROR), "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); DeleteFileA("now_existing_local"); SetLastError(0xdeadbeef); bRet = FtpRemoveDirectoryA(hFtp, "should_be_non_existing_deadbeef_dir"); error = GetLastError(); ok ( bRet == FALSE, "Expected FtpRemoveDirectoryA to fail\n"); ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_INTERNET_EXTENDED_ERROR), "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); SetLastError(0xdeadbeef); bRet = FtpRenameFileA(hFtp , "should_be_non_existing_deadbeef", "new"); error = GetLastError(); ok ( bRet == FALSE, "Expected FtpRenameFileA to fail\n"); ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_INTERNET_EXTENDED_ERROR), "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); } InternetCloseHandle(hOpenFile); /* One small test to show that handle type is checked before parameters */ SetLastError(0xdeadbeef); hOpenFile = FtpOpenFileA(hConnect, "welcome.msg", GENERIC_READ, 5, 0); ok ( !hOpenFile, "Expected FtpOpenFileA to fail\n"); ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE, "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError()); InternetCloseHandle(hOpenFile); /* Just in case */ SetLastError(0xdeadbeef); hOpenFile = FtpOpenFileA(hConnect, "welcome.msg", GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0); ok ( hOpenFile == NULL, "Expected FtpOpenFileA to fail\n"); ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE, "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError()); InternetCloseHandle(hOpenFile); /* Just in case */ }
// Upload file bool FtpClient::upload(const string & source, const string & destination) { // Check connection if (mFtpHnd == NULL) { // Report error and break OutputDebugStringA("Not connected to FTP server:\n"); showError(); return false; } // Check if file exists if (!boost::filesystem::exists(boost::filesystem::path(source))) { // Report error and break OutputDebugStringA((string() + "\"" + source + "\" does not exist").c_str()); return false; } // Split destination to vector vector<string> mPath; boost::split(mPath, destination, boost::is_any_of("/")); // Iterate through directories LPCSTR mFilename; for (vector<string>::const_iterator mDirectory = mPath.cbegin(); mDirectory != mPath.cend(); ++mDirectory) { // End of the line if (mDirectory == mPath.end() - 1) { // Convert to character array mFilename = (LPCSTR)mDirectory->c_str(); } else { // Convert to character array LPCSTR nDirectory = (LPCSTR)mDirectory->c_str(); // Open directory if (!FtpSetCurrentDirectoryA(mFtpHnd, nDirectory)) { // Create directory if (!FtpCreateDirectoryA(mFtpHnd, nDirectory)) { // Report error and break OutputDebugStringA("Unable to create directory:\n"); showError(); return false; } else { // Open new directory if (!FtpSetCurrentDirectoryA(mFtpHnd, nDirectory)) { // Report error and break OutputDebugStringA("Unable to open new directory:\n"); showError(); return false; } } } } } // Check for existing file LPWIN32_FIND_DATAA mInfo = LPWIN32_FIND_DATAA(); HINTERNET mRemoteFileHnd = FtpFindFirstFileA(mFtpHnd, mFilename, mInfo, INTERNET_FLAG_RELOAD, 0); // Clean up memory LocalFree(mInfo); delete mInfo; // File exists if (mRemoteFileHnd != NULL) { // Warn OutputDebugStringA("File already exists. Overwriting.\n"); // Close remote file InternetCloseHandle(mRemoteFileHnd); // Delete file if (!FtpDeleteFileA(mFtpHnd, mFilename)) { // Report error and break OutputDebugStringA("Unable to delete file from server:\n"); showError(); mPath.clear(); return false; } } // Open remote file for upload HINTERNET mFileHnd = FtpOpenFileA(mFtpHnd, mFilename, GENERIC_WRITE, FTP_TRANSFER_TYPE_BINARY, 0); if (mFileHnd == NULL) { // Report error and break OutputDebugStringA("Unable to open remote file:\n"); showError(); return false; } // Open local file mFileIO.open(source.c_str(), ios::in|ios::binary|ios::ate); mFileSize = (DWORD)mFileIO.tellg(); mFileIO.seekg(0, ios::beg); // Return flag bool mUploadSuccess = false; // Check file size if (mFileSize > 0) { // Allocate memory for buffer and read file mBuffer = new int_fast8_t[mFileSize]; mFileIO.read(mBuffer, mFileSize); // Write buffer to remote file mBytesWritten = 0; mUploadSuccess = InternetWriteFile(mFileHnd, mBuffer, mFileSize, &mBytesWritten) == TRUE; if (!mUploadSuccess) showError(); // Clean up delete [] mBuffer; } // Close file, clean up mFileIO.close(); InternetCloseHandle(mFileHnd); mFileHnd = NULL; mPath.clear(); // Write result OutputDebugStringA(mUploadSuccess ? "File uploaded.\n" : "Upload did not complete.\n"); // Return flag return mUploadSuccess; }
bool WebIO::DeleteFile(std::string file) { return (FtpDeleteFileA(WebIO::m_hConnect, file.c_str()) == TRUE); }