123 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			123 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Created by WolverinDEV on 20/04/2021.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#pragma once
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <files/FileServer.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace ts::server::file {
							 | 
						||
| 
								 | 
							
								    namespace filesystem {
							 | 
						||
| 
								 | 
							
								        class RustFileSystem : public filesystem::AbstractProvider {
							 | 
						||
| 
								 | 
							
								                using FileModifyError = filesystem::FileModifyError;
							 | 
						||
| 
								 | 
							
								                using DirectoryModifyError = filesystem::DirectoryModifyError;
							 | 
						||
| 
								 | 
							
								            public:
							 | 
						||
| 
								 | 
							
								                virtual ~RustFileSystem();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<ExecuteResponse<ServerCommandError>> initialize_server(const std::shared_ptr<VirtualFileServer> & /* server */) override;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<ExecuteResponse<FileInfoError, FileInfoResponse>>
							 | 
						||
| 
								 | 
							
								                query_channel_info(const std::shared_ptr<VirtualFileServer> & /* server */,  const std::vector<std::tuple<ChannelId, std::string>>& /* names */) override;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<directory_query_response_t>
							 | 
						||
| 
								 | 
							
								                query_channel_directory(const std::shared_ptr<VirtualFileServer> & id, ChannelId channelId, const std::string &string) override;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<ExecuteResponse<DirectoryModifyError>>
							 | 
						||
| 
								 | 
							
								                create_channel_directory(const std::shared_ptr<VirtualFileServer> & id, ChannelId channelId, const std::string &string) override;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<ExecuteResponse<FileDeleteError, FileDeleteResponse>>
							 | 
						||
| 
								 | 
							
								                delete_channel_files(const std::shared_ptr<VirtualFileServer> & id, ChannelId channelId, const std::vector<std::string> &string) override;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<ExecuteResponse<FileModifyError>>
							 | 
						||
| 
								 | 
							
								                rename_channel_file(const std::shared_ptr<VirtualFileServer> & id, ChannelId channelId, const std::string &, ChannelId, const std::string &) override;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<ExecuteResponse<FileInfoError, FileInfoResponse>>
							 | 
						||
| 
								 | 
							
								                query_icon_info(const std::shared_ptr<VirtualFileServer> & /* server */, const std::vector<std::string>& /* names */) override;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<directory_query_response_t> query_icon_directory(const std::shared_ptr<VirtualFileServer> & id) override;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<ExecuteResponse<FileDeleteError, FileDeleteResponse>>
							 | 
						||
| 
								 | 
							
								                delete_icons(const std::shared_ptr<VirtualFileServer> & id, const std::vector<std::string> &string) override;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<ExecuteResponse<FileInfoError, FileInfoResponse>>
							 | 
						||
| 
								 | 
							
								                query_avatar_info(const std::shared_ptr<VirtualFileServer> & /* server */, const std::vector<std::string>& /* names */) override;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<directory_query_response_t> query_avatar_directory(const std::shared_ptr<VirtualFileServer> & id) override;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<ExecuteResponse<FileDeleteError, FileDeleteResponse>>
							 | 
						||
| 
								 | 
							
								                delete_avatars(const std::shared_ptr<VirtualFileServer> & id, const std::vector<std::string> &string) override;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            private:
							 | 
						||
| 
								 | 
							
								                template <typename error_t, typename result_t = EmptyExecuteResponse>
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<ExecuteResponse<error_t, result_t>> create_execute_response() {
							 | 
						||
| 
								 | 
							
								                    return std::make_shared<ExecuteResponse<error_t, result_t>>(this->result_notify_mutex, this->result_notify_cv);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<ExecuteResponse<FileInfoError, FileInfoResponse>> execute_info(const char* /* server unique id */, void* /* query */, size_t /* query count */);
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<directory_query_response_t> execute_query(const char* /* server unique id */, void* /* directory */);
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<ExecuteResponse<FileDeleteError, FileDeleteResponse>> execute_delete(const char* /* server unique id */, void* /* files */, size_t /* file count */);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::mutex result_notify_mutex{};
							 | 
						||
| 
								 | 
							
								                std::condition_variable result_notify_cv{};
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace transfer {
							 | 
						||
| 
								 | 
							
								        class RustFileTransfer : public AbstractProvider {
							 | 
						||
| 
								 | 
							
								            public:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<ExecuteResponse<TransferInitError, std::shared_ptr<Transfer>>>
							 | 
						||
| 
								 | 
							
								                initialize_channel_transfer(Transfer::Direction direction,
							 | 
						||
| 
								 | 
							
								                                            const std::shared_ptr<VirtualFileServer> &ptr, ChannelId id,
							 | 
						||
| 
								 | 
							
								                                            const TransferInfo &info) override;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<ExecuteResponse<TransferInitError, std::shared_ptr<Transfer>>>
							 | 
						||
| 
								 | 
							
								                initialize_icon_transfer(Transfer::Direction direction, const std::shared_ptr<VirtualFileServer> &ptr,
							 | 
						||
| 
								 | 
							
								                                         const TransferInfo &info) override;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<ExecuteResponse<TransferInitError, std::shared_ptr<Transfer>>>
							 | 
						||
| 
								 | 
							
								                initialize_avatar_transfer(Transfer::Direction direction, const std::shared_ptr<VirtualFileServer> &ptr,
							 | 
						||
| 
								 | 
							
								                                           const TransferInfo &info) override;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<ExecuteResponse<TransferListError, std::vector<ActiveFileTransfer>>>
							 | 
						||
| 
								 | 
							
								                list_transfer() override;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<ExecuteResponse<TransferActionError>>
							 | 
						||
| 
								 | 
							
								                stop_transfer(const std::shared_ptr<VirtualFileServer> &ptr, transfer_id id, bool b) override;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            private:
							 | 
						||
| 
								 | 
							
								                template <typename error_t, typename result_t = EmptyExecuteResponse>
							 | 
						||
| 
								 | 
							
								                std::shared_ptr<ExecuteResponse<error_t, result_t>> create_execute_response() {
							 | 
						||
| 
								 | 
							
								                    return std::make_shared<ExecuteResponse<error_t, result_t>>(this->result_notify_mutex, this->result_notify_cv);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                std::mutex result_notify_mutex{};
							 | 
						||
| 
								 | 
							
								                std::condition_variable result_notify_cv{};
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    class RustVirtualFileServer : public VirtualFileServer {
							 | 
						||
| 
								 | 
							
								        public:
							 | 
						||
| 
								 | 
							
								            explicit RustVirtualFileServer(ServerId server_id, std::string unique_id) : VirtualFileServer{server_id, std::move(unique_id)} {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            void max_networking_upload_bandwidth(int64_t value) override;
							 | 
						||
| 
								 | 
							
								            void max_networking_download_bandwidth(int64_t value) override;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    class RustFileProvider : public AbstractFileServer {
							 | 
						||
| 
								 | 
							
								        public:
							 | 
						||
| 
								 | 
							
								            RustFileProvider();
							 | 
						||
| 
								 | 
							
								            virtual ~RustFileProvider();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            [[nodiscard]] std::string file_base_path() const override;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            filesystem::AbstractProvider &file_system() override;
							 | 
						||
| 
								 | 
							
								            transfer::AbstractProvider &file_transfer() override;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            std::shared_ptr<VirtualFileServer> register_server(ServerId /* server id */) override;
							 | 
						||
| 
								 | 
							
								            void unregister_server(ServerId /* server id */, bool /* delete files */) override;
							 | 
						||
| 
								 | 
							
								        private:
							 | 
						||
| 
								 | 
							
								            filesystem::RustFileSystem* file_system_;
							 | 
						||
| 
								 | 
							
								            transfer::RustFileTransfer* file_transfer_;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								}
							 |