mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Add a service to announce multiplayer rooms to web service; Add the abiltiy to receive a list of all announced rooms from web service
This commit is contained in:
		
							parent
							
								
									4b8a7eb1ca
								
							
						
					
					
						commit
						0432fc17eb
					
				
					 14 changed files with 554 additions and 18 deletions
				
			
		|  | @ -26,6 +26,7 @@ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/scm_rev.cpp.in" "${CMAKE_CURRENT_SOU | |||
| 
 | ||||
| add_library(common STATIC | ||||
|     alignment.h | ||||
|     announce_multiplayer_room.h | ||||
|     assert.h | ||||
|     bit_field.h | ||||
|     bit_set.h | ||||
|  |  | |||
							
								
								
									
										105
									
								
								src/common/announce_multiplayer_room.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								src/common/announce_multiplayer_room.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,105 @@ | |||
| // Copyright 2017 Citra Emulator Project
 | ||||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <array> | ||||
| #include <functional> | ||||
| #include <future> | ||||
| #include <string> | ||||
| #include <vector> | ||||
| #include "common/common_types.h" | ||||
| 
 | ||||
| namespace Common { | ||||
| struct WebResult { | ||||
|     enum Code : u32 { | ||||
|         Success, | ||||
|         InvalidURL, | ||||
|         CredentialsMissing, | ||||
|         CprError, | ||||
|         HttpError, | ||||
|         WrongContent, | ||||
|         NoWebservice, | ||||
|     }; | ||||
|     Code result_code; | ||||
|     std::string result_string; | ||||
| }; | ||||
| } // namespace Common
 | ||||
| 
 | ||||
| namespace AnnounceMultiplayerRoom { | ||||
| 
 | ||||
| using MacAddress = std::array<u8, 6>; | ||||
| 
 | ||||
| struct Room { | ||||
|     struct Member { | ||||
|         std::string name; | ||||
|         MacAddress mac_address; | ||||
|         std::string game_name; | ||||
|         u64 game_id; | ||||
|     }; | ||||
|     std::string name; | ||||
|     std::string GUID; | ||||
|     std::string owner; | ||||
|     std::string ip; | ||||
|     u16 port; | ||||
|     u32 max_player; | ||||
|     u32 net_version; | ||||
|     bool has_password; | ||||
|     std::string preferred_game; | ||||
|     u64 preferred_game_id; | ||||
| 
 | ||||
|     std::vector<Member> members; | ||||
| }; | ||||
| using RoomList = std::vector<Room>; | ||||
| 
 | ||||
| /**
 | ||||
|  * A AnnounceMultiplayerRoom interface class. A backend to submit/get to/from a web service should | ||||
|  * implement this interface. | ||||
|  */ | ||||
| class Backend : NonCopyable { | ||||
| public: | ||||
|     virtual ~Backend() = default; | ||||
|     virtual void SetRoomInformation(const std::string& guid, const std::string& name, | ||||
|                                     const u16 port, const u32 max_player, const u32 net_version, | ||||
|                                     const bool has_password, const std::string& preferred_game, | ||||
|                                     const u64 preferred_game_id) = 0; | ||||
|     virtual void AddPlayer(const std::string& nickname, const MacAddress& mac_address, | ||||
|                            const u64 game_id, const std::string& game_name) = 0; | ||||
|     virtual std::future<Common::WebResult> Announce() = 0; | ||||
|     virtual void ClearPlayers() = 0; | ||||
|     virtual std::future<RoomList> GetRoomList(std::function<void()> func) = 0; | ||||
|     virtual void Delete() = 0; | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Empty implementation of AnnounceMultiplayerRoom interface that drops all data. Used when a | ||||
|  * functional backend implementation is not available. | ||||
|  */ | ||||
| class NullBackend : public Backend { | ||||
| public: | ||||
|     ~NullBackend() = default; | ||||
|     void SetRoomInformation(const std::string& /*guid*/, const std::string& /*name*/, | ||||
|                             const u16 /*port*/, const u32 /*max_player*/, const u32 /*net_version*/, | ||||
|                             const bool /*has_password*/, const std::string& /*preferred_game*/, | ||||
|                             const u64 /*preferred_game_id*/) override {} | ||||
|     void AddPlayer(const std::string& /*nickname*/, const MacAddress& /*mac_address*/, | ||||
|                    const u64 /*game_id*/, const std::string& /*game_name*/) override {} | ||||
|     std::future<Common::WebResult> Announce() override { | ||||
|         return std::async(std::launch::async, []() { | ||||
|             return Common::WebResult{Common::WebResult::Code::NoWebservice, | ||||
|                                      "WebService is missing"}; | ||||
|         }); | ||||
|     } | ||||
|     void ClearPlayers() override {} | ||||
|     std::future<RoomList> GetRoomList(std::function<void()> func) override { | ||||
|         return std::async(std::launch::async, [func]() { | ||||
|             func(); | ||||
|             return RoomList{}; | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     void Delete() override {} | ||||
| }; | ||||
| 
 | ||||
| } // namespace AnnounceMultiplayerRoom
 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue