//////////////////////////////////////////////////////////// // Headers //////////////////////////////////////////////////////////// #include #include #include //////////////////////////////////////////////////////////// /// Print a FTP response into a standard output stream /// //////////////////////////////////////////////////////////// std::ostream& operator <<(std::ostream& stream, const sf::Ftp::Response& response) { return stream << response.getStatus() << response.getMessage(); } //////////////////////////////////////////////////////////// /// Entry point of application /// /// \return Application exit code /// //////////////////////////////////////////////////////////// int main() { // Choose the server address sf::IpAddress address; do { std::cout << "Enter the FTP server address: "; std::cin >> address; } while (address == sf::IpAddress::None); // Connect to the server sf::Ftp server; sf::Ftp::Response connectResponse = server.connect(address); std::cout << connectResponse << std::endl; if (!connectResponse.isOk()) return EXIT_FAILURE; // Ask for user name and password std::string user, password; std::cout << "User name: "; std::cin >> user; std::cout << "Password: "; std::cin >> password; // Login to the server sf::Ftp::Response loginResponse = server.login(user, password); std::cout << loginResponse << std::endl; if (!loginResponse.isOk()) return EXIT_FAILURE; // Main menu int choice = 0; do { // Main FTP menu std::cout << std::endl; std::cout << "Choose an action:" << std::endl; std::cout << "1. Print working directory" << std::endl; std::cout << "2. Print contents of working directory" << std::endl; std::cout << "3. Change directory" << std::endl; std::cout << "4. Create directory" << std::endl; std::cout << "5. Delete directory" << std::endl; std::cout << "6. Rename file" << std::endl; std::cout << "7. Remove file" << std::endl; std::cout << "8. Download file" << std::endl; std::cout << "9. Upload file" << std::endl; std::cout << "0. Disconnect" << std::endl; std::cout << std::endl; std::cout << "Your choice: "; std::cin >> choice; std::cout << std::endl; switch (choice) { default: { // Wrong choice std::cout << "Invalid choice!" << std::endl; std::cin.clear(); std::cin.ignore(10000, '\n'); break; } case 1: { // Print the current server directory sf::Ftp::DirectoryResponse response = server.getWorkingDirectory(); std::cout << response << std::endl; std::cout << "Current directory is " << response.getDirectory() << std::endl; break; } case 2: { // Print the contents of the current server directory sf::Ftp::ListingResponse response = server.getDirectoryListing(); std::cout << response << std::endl; const std::vector& names = response.getListing(); for (std::vector::const_iterator it = names.begin(); it != names.end(); ++it) std::cout << *it << std::endl; break; } case 3: { // Change the current directory std::string directory; std::cout << "Choose a directory: "; std::cin >> directory; std::cout << server.changeDirectory(directory) << std::endl; break; } case 4: { // Create a new directory std::string directory; std::cout << "Name of the directory to create: "; std::cin >> directory; std::cout << server.createDirectory(directory) << std::endl; break; } case 5: { // Remove an existing directory std::string directory; std::cout << "Name of the directory to remove: "; std::cin >> directory; std::cout << server.deleteDirectory(directory) << std::endl; break; } case 6: { // Rename a file std::string source, destination; std::cout << "Name of the file to rename: "; std::cin >> source; std::cout << "New name: "; std::cin >> destination; std::cout << server.renameFile(source, destination) << std::endl; break; } case 7: { // Remove an existing directory std::string filename; std::cout << "Name of the file to remove: "; std::cin >> filename; std::cout << server.deleteFile(filename) << std::endl; break; } case 8: { // Download a file from server std::string filename, directory; std::cout << "Filename of the file to download (relative to current directory): "; std::cin >> filename; std::cout << "Directory to download the file to: "; std::cin >> directory; std::cout << server.download(filename, directory) << std::endl; break; } case 9: { // Upload a file to server std::string filename, directory; std::cout << "Path of the file to upload (absolute or relative to working directory): "; std::cin >> filename; std::cout << "Directory to upload the file to (relative to current directory): "; std::cin >> directory; std::cout << server.upload(filename, directory) << std::endl; break; } case 0: { // Disconnect break; } } } while (choice != 0); // Disconnect from the server std::cout << "Disconnecting from server..." << std::endl; std::cout << server.disconnect() << std::endl; // Wait until the user presses 'enter' key std::cout << "Press enter to exit..." << std::endl; std::cin.ignore(10000, '\n'); std::cin.ignore(10000, '\n'); return EXIT_SUCCESS; }