Author: suokko
Date: Wed Sep  3 04:11:19 2008
New Revision: 29232

URL: http://svn.gna.org/viewcvs/wesnoth?rev=29232&view=rev
Log:
Added automatic detection of packet types for server

Modified:
    trunk/src/server/game.cpp
    trunk/src/server/game.hpp
    trunk/src/server/server.cpp

Modified: trunk/src/server/game.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/server/game.cpp?rev=29232&r1=29231&r2=29232&view=diff
==============================================================================
--- trunk/src/server/game.cpp (original)
+++ trunk/src/server/game.cpp Wed Sep  3 04:11:19 2008
@@ -188,7 +188,7 @@
                // When the host advances tell everyone that the next scenario 
data is
                // available.
                static simple_wml::document 
notify_next_scenario("[notify_next_scenario]\n[/notify_next_scenario]\n", 
simple_wml::INIT_COMPRESSED);
-               send_data(notify_next_scenario, starter->first, "game control");
+               send_data(notify_next_scenario, starter->first);
        }
        // Send [observer] tags for all observers that are already in the game.
        send_observerjoins();
@@ -231,7 +231,7 @@
                        // Tell the host which side the new player should take.
                        
                        simple_wml::string_span data = cfg.output_compressed();
-                       network::send_raw_data(data.begin(), data.size(), 
owner_, "game");
+                       network::send_raw_data(data.begin(), data.size(), 
owner_, cfg.root().first_child().to_string());
                        DBG_GAME << "take_side: took side " << side_num << " 
because the name matched\n";
                        DBG_GAME << debug_player_info();
                        return true;
@@ -253,7 +253,7 @@
                        cfg.root().set_attr_dup("side", (**side)["side"]);
                        // Tell the host which side the new player should take.
                        simple_wml::string_span data = cfg.output_compressed();
-                       network::send_raw_data(data.begin(), data.size(), 
owner_, "game");
+                       network::send_raw_data(data.begin(), data.size(), 
owner_, cfg.root().first_child().to_string());
                        DBG_GAME << "take_side: took the first free network 
side which was " << side_num << "\n";
                        DBG_GAME << debug_player_info();
                        return true;
@@ -430,7 +430,7 @@
                // Update the client side observer list for everyone except old 
player.
                simple_wml::document observer_join;
                observer_join.root().add_child("observer").set_attr_dup("name", 
old_player_name.c_str());
-               send_data(observer_join, old_player, "game control");
+               send_data(observer_join, old_player);
                // If the old player was the host of the game, choose another 
player.
                /*if (old_player == owner_) {
                        host_leave = true;
@@ -497,7 +497,7 @@
 
        // Tell everyone but the new player that this side is network 
controlled now.
        change.set_attr("controller", controller.c_str());
-       send_data(response, sock, "game control");
+       send_data(response, sock);
 
        // Tell the new player that he controls this side now.
        // Just don't send it when the player left the game. (The host gets the
@@ -505,7 +505,7 @@
        if (!player_left) {
                // make copy so original text aren't going to modified
                change.set_attr("controller", 
std::string(controller).replace(0,strlen("network"),"human").c_str());
-               send_to_one(response, sock, "game control");
+               send_to_one(response, sock);
        }
 
        // Update the level so observers who join get the new name.
@@ -533,7 +533,7 @@
                drop.root().set_attr("side_drop", side_drop.c_str());
                drop.root().set_attr("controller", "ai");
                const simple_wml::string_span data = drop.output_compressed();
-               network::send_raw_data(data.begin(), data.size(), owner_, 
"game");
+               network::send_raw_data(data.begin(), data.size(), owner_, 
drop.root().first_child().to_string());
                sides_[side] = owner_;
        }
        if (ai_transfer) {
@@ -552,7 +552,7 @@
        cfg_host_transfer.set_attr("name", owner_name.c_str());
        cfg_host_transfer.set_attr("value", "1");
        const simple_wml::string_span data = cfg.output_compressed();
-       network::send_raw_data(data.begin(), data.size(), owner_,"game");
+       network::send_raw_data(data.begin(), data.size(), 
owner_,cfg.root().first_child().to_string());
        send_and_record_server_message((owner_name
                        + " has been chosen as the new host.").c_str());
 }
@@ -676,7 +676,7 @@
        // Tell the user to leave the game.
        static simple_wml::document leave_game("[leave_game]\n[/leave_game]\n", 
simple_wml::INIT_COMPRESSED);
        static const simple_wml::string_span leave_game_data = 
leave_game.output_compressed();
-       network::send_raw_data(leave_game_data.begin(), leave_game_data.size(), 
user->first,"game");
+       network::send_raw_data(leave_game_data.begin(), leave_game_data.size(), 
user->first,leave_game.root().first_child().to_string());
        remove_player(user->first);
        return user->first;
 }
@@ -717,7 +717,7 @@
                //tell the user to leave the game.
                static simple_wml::document 
leave_game("[leave_game]\n[/leave_game]\n", simple_wml::INIT_COMPRESSED);
                static const simple_wml::string_span leave_game_data = 
leave_game.output_compressed();
-               network::send_raw_data(leave_game_data.begin(), 
leave_game_data.size(), user->first,"game");
+               network::send_raw_data(leave_game_data.begin(), 
leave_game_data.size(), 
user->first,leave_game.root().first_child().to_string());
                remove_player(user->first);
                return user->first;
        }
@@ -960,18 +960,18 @@
                observer_join.root().add_child("observer").set_attr_dup("name", 
user->second.name().c_str());
 
                // Send observer join to everyone except the new observer.
-               send_data(observer_join, player, "game control");
+               send_data(observer_join, player);
        }
        DBG_GAME << debug_player_info();
        // Send the user the game data.
        //std::cerr << "SENDING LEVEL {{{" << level_.output() << "}}}\n";
        simple_wml::string_span level_data = level_.output_compressed();
-       network::send_raw_data(level_data.begin(), level_data.size(), 
player,"game");
+       network::send_raw_data(level_data.begin(), level_data.size(), 
player,"game_level");
        if(started_) {
                //tell this player that the game has started
                static simple_wml::document 
start_game_doc("[start_game]\n[/start_game]\n", simple_wml::INIT_COMPRESSED);
                static const simple_wml::string_span start_game = 
start_game_doc.output_compressed();
-               network::send_raw_data(start_game.begin(), start_game.size(), 
player,"game");
+               network::send_raw_data(start_game.begin(), start_game.size(), 
player,start_game_doc.root().first_child().to_string());
                // Send observer join of all the observers in the game to the 
new player
                // only once the game started. The client forgets about it 
anyway
                // otherwise.
@@ -1075,7 +1075,7 @@
                drop.root().set_attr("side_drop", side_drop_buf);
                drop.root().set_attr("controller", 
side_controllers_[side_num].c_str());
 
-               send_to_one(drop, owner_, "game control");
+               send_to_one(drop, owner_);
        }
        if (host) transfer_ai_sides();
        DBG_GAME << debug_player_info();
@@ -1100,7 +1100,7 @@
                        cfg.root().add_child("user").set_attr("name", 
pl->second.name().c_str());
                }
        }
-       send_data(cfg, exclude, "user_list");
+       send_data(cfg, exclude);
 }
 
 //! A member asks for the next scenario to advance to.
@@ -1109,15 +1109,17 @@
        simple_wml::document cfg_scenario;
        level_.root().copy_into(cfg_scenario.root().add_child("next_scenario"));
        simple_wml::string_span data = cfg_scenario.output_compressed();
-       network::send_raw_data(data.begin(), data.size(), user->first, "game");
+       network::send_raw_data(data.begin(), data.size(), user->first, 
cfg_scenario.root().first_child().to_string());
        // Send the player the history of the game to-date.
        send_history(user->first);
        // Send observer join of all the observers in the game to the user.
        send_observerjoins(user->first);
 }
 
-void game::send_data(simple_wml::document& data, const network::connection 
exclude, const std::string packet_type) const
+void game::send_data(simple_wml::document& data, const network::connection 
exclude, std::string packet_type) const
 {
+       if (packet_type.empty())
+               packet_type = data.root().first_child().to_string();
        simple_wml::string_span s = data.output_compressed();
        const user_vector& users = all_game_users();
        for(user_vector::const_iterator i = users.begin(); i != users.end(); 
++i) {
@@ -1127,8 +1129,10 @@
        }
 }
 
-void game::send_to_one(simple_wml::document& data, const network::connection 
sock, const std::string packet_type) const
+void game::send_to_one(simple_wml::document& data, const network::connection 
sock, std::string packet_type) const
 {
+       if (packet_type.empty())
+               packet_type = data.root().first_child().to_string();
        simple_wml::string_span s = data.output_compressed();
        network::send_raw_data(s.begin(), s.size(), sock, packet_type);
 }
@@ -1136,8 +1140,10 @@
 void game::send_data_team(simple_wml::document& data,
                           const simple_wml::string_span& team,
                           const network::connection exclude, 
-                                                 const std::string 
packet_type) const
+                                                 std::string packet_type) const
 {
+       if (packet_type.empty())
+               packet_type = data.root().first_child().to_string();
        simple_wml::string_span s = data.output_compressed();
        for(user_vector::const_iterator i = players_.begin(); i != 
players_.end(); ++i) {
                if(*i != exclude && is_on_team(team,*i)) {
@@ -1146,7 +1152,9 @@
        }
 }
 
-void game::send_data_observers(simple_wml::document& data, const 
network::connection exclude, const std::string packet_type) const {
+void game::send_data_observers(simple_wml::document& data, const 
network::connection exclude, std::string packet_type) const {
+       if (packet_type.empty())
+               packet_type = data.root().first_child().to_string();
        simple_wml::string_span s = data.output_compressed();
        for(user_vector::const_iterator i = observers_.begin(); i != 
observers_.end(); ++i) {
                if (*i != exclude) {
@@ -1190,11 +1198,11 @@
                cfg.root().add_child("observer").set_attr_dup("name", 
obs->second.name().c_str());
                if (sock == 0) {
                        // Send to everyone except the observer in question.
-                       send_data(cfg, *ob, "game control");
+                       send_data(cfg, *ob);
                } else {
                        // Send to the (new) user.
                        const simple_wml::string_span& data = 
cfg.output_compressed();
-                       network::send_raw_data(data.begin(), data.size(), 
sock,"game control");
+                       network::send_raw_data(data.begin(), data.size(), sock);
                }
        }
 }
@@ -1208,7 +1216,7 @@
        //don't need to dup the attribute because this document is
        //short-lived.
        observer_quit.root().add_child("observer_quit").set_attr("name", 
observer->second.name().c_str());
-       send_data(observer_quit, observer->first,"game control");
+       send_data(observer_quit, observer->first);
 }
 
 void game::send_history(const network::connection sock) const

Modified: trunk/src/server/game.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/server/game.hpp?rev=29232&r1=29231&r2=29232&view=diff
==============================================================================
--- trunk/src/server/game.hpp (original)
+++ trunk/src/server/game.hpp Wed Sep  3 04:11:19 2008
@@ -95,8 +95,8 @@
        //! Send data to all players in this game except 'exclude'.
        void send_and_record_server_message(const char* message,
                        const network::connection exclude=0);
-       void send_data(simple_wml::document& data, const network::connection 
exclude=0, const std::string packet_type = "unknown") const;
-       void send_to_one(simple_wml::document& data, const network::connection 
sock, const std::string packet_type = "unknown") const;
+       void send_data(simple_wml::document& data, const network::connection 
exclude=0, std::string packet_type = "") const;
+       void send_to_one(simple_wml::document& data, const network::connection 
sock, std::string packet_type = "") const;
 
        void record_data(simple_wml::document* data);
 
@@ -142,8 +142,8 @@
                        const bool player_left=true);
        void transfer_ai_sides();
        void send_data_team(simple_wml::document& data, const 
simple_wml::string_span& team,
-                       const network::connection exclude=0, const std::string 
packet_type = "unknown") const;
-       void send_data_observers(simple_wml::document& data, const 
network::connection exclude=0, const std::string packet_type = "unknown") const;
+                       const network::connection exclude=0, std::string 
packet_type = "") const;
+       void send_data_observers(simple_wml::document& data, const 
network::connection exclude=0, std::string packet_type = "") const;
        //! Send [observer] tags of all the observers in the game to the user or
        //! everyone if none given.
        void send_observerjoins(const network::connection sock=0) const;

Modified: trunk/src/server/server.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/server/server.cpp?rev=29232&r1=29231&r2=29232&view=diff
==============================================================================
--- trunk/src/server/server.cpp (original)
+++ trunk/src/server/server.cpp Wed Sep  3 04:11:19 2008
@@ -126,8 +126,10 @@
 // we take profiling info on every n requests
 int request_sample_frequency = 1;
 
-void send_doc(simple_wml::document& doc, network::connection connection, 
std::string type = "unknown")
+void send_doc(simple_wml::document& doc, network::connection connection, 
std::string type = "")
 {
+       if (type.empty())
+               type = doc.root().first_child().to_string();
        simple_wml::string_span s = doc.output_compressed();
        network::send_raw_data(s.begin(), s.size(), connection, type);
 }
@@ -686,7 +688,7 @@
                                } else {
                                        DBG_SERVER << ip << "\tnew connection 
accepted. (socket: "
                                                << sock << ")\n";
-                                       send_doc(version_query_response_, 
sock,"command");
+                                       send_doc(version_query_response_, sock);
                                        not_logged_in_.add_player(sock, true);
                                }
                        }
@@ -731,7 +733,7 @@
 
                                process_data(sock, data);
 
-                               bandwidth_type->set_type("command");
+                               
bandwidth_type->set_type(data.root().first_child().to_string());
                                if(sample) {
                                        const clock_t after_processing = 
get_cpu_time(sample);
                                        
metrics_.record_sample(data.root().first_child(),
@@ -889,7 +891,7 @@
                        LOG_SERVER << network::ip_address(sock)
                                << "\tplayer joined using accepted version " << 
version_str
                                << ":\ttelling them to log in.\n";
-                       send_doc(login_response_, sock, "command");
+                       send_doc(login_response_, sock);
                        return;
                }
                std::map<std::string,config>::const_iterator config_it;
@@ -1053,7 +1055,7 @@
          DBG_SERVER << "selective ping is DISABLED for  " << sock << "\n" ;
        }
 
-       send_doc(join_lobby_response_, sock, "join_lobby");
+       send_doc(join_lobby_response_, sock);
 
        simple_wml::node& player_cfg = 
games_and_users_list_.root().add_child("user");
        const player new_player(username, player_cfg, registered, 
default_max_messages_,
@@ -1071,7 +1073,7 @@
        lobby_.add_player(sock, true);
 
        // Send the new player the entire list of games and players
-       send_doc(games_and_users_list_, sock, "lobby_list");
+       send_doc(games_and_users_list_, sock);
 
        if (motd_ != "") {
                lobby_.send_server_message(motd_.c_str(), sock);
@@ -1504,7 +1506,7 @@
                  "message=\"Invalid number of arguments\"\n"
                  "sender=\"server\"\n"
                  "[/message]\n", simple_wml::INIT_COMPRESSED);
-               send_doc(data, sock, "error");
+               send_doc(data, sock);
                return;
        }
        const wesnothd::player_map::const_iterator pl = players_.find(sock);
@@ -1534,7 +1536,7 @@
 
                simple_wml::document cwhisper;
                whisper.copy_into(cwhisper.root().add_child("whisper"));
-               send_doc(cwhisper, i->first, "command");
+               send_doc(cwhisper, i->first);
                return;
        }
 
@@ -1548,7 +1550,7 @@
        }
 
        msg.set_attr("sender", "server");
-       send_doc(data, sock, "error");
+       send_doc(data, sock);
 }
 
 void server::process_data_lobby(const network::connection sock,
@@ -1565,9 +1567,9 @@
        if (data.root().child("create_game")) {
                if (graceful_restart) {
                        static simple_wml::document 
leave_game_doc("[leave_game]\n[/leave_game]\n", simple_wml::INIT_COMPRESSED);
-                       send_doc(leave_game_doc, sock,"command");
+                       send_doc(leave_game_doc, sock);
                        lobby_.send_server_message("This server is shutting 
down. You aren't allowed to make new games. Please reconnect to the new 
server.", sock);
-                       send_doc(games_and_users_list_, sock, "lobby_list");
+                       send_doc(games_and_users_list_, sock);
                        return;
                }
                const std::string game_name = 
(*data.root().child("create_game"))["name"].to_string();
@@ -1605,41 +1607,41 @@
                if (g == games_.end()) {
                        WRN_SERVER << network::ip_address(sock) << "\t" << 
pl->second.name()
                                << "\tattempted to join unknown game:\t" << 
game_id << ".\n";
-                       send_doc(leave_game_doc, sock, "command");
+                       send_doc(leave_game_doc, sock);
                        lobby_.send_server_message("Attempt to join unknown 
game.", sock);
-                       send_doc(games_and_users_list_, sock, "lobby_list");
+                       send_doc(games_and_users_list_, sock);
                        return;
                } else if ((*g)->player_is_banned(sock)) {
                        DBG_SERVER << network::ip_address(sock) << "\tReject 
banned player: "
                                << pl->second.name() << "\tfrom game:\t\"" << 
(*g)->name()
                                << "\" (" << game_id << ").\n";
-                       send_doc(leave_game_doc, sock, "command");
+                       send_doc(leave_game_doc, sock);
                        lobby_.send_server_message("You are banned from this 
game.", sock);
-                       send_doc(games_and_users_list_, sock, "lobby_list");
+                       send_doc(games_and_users_list_, sock);
                        return;
                } else if(!observer && !(*g)->password_matches(password)) {
                        WRN_SERVER << network::ip_address(sock) << "\t" << 
pl->second.name()
                                << "\tattempted to join game:\t\"" << 
(*g)->name() << "\" ("
                                << game_id << ") with bad password\n";
-                       send_doc(leave_game_doc, sock, "command");
+                       send_doc(leave_game_doc, sock);
                        lobby_.send_server_message("Incorrect password.", sock);
-                       send_doc(games_and_users_list_, sock, "lobby_list");
+                       send_doc(games_and_users_list_, sock);
                        return;
                } else if (observer && !(*g)->allow_observers()) {
                        WRN_SERVER << network::ip_address(sock) << "\t" << 
pl->second.name()
                                << "\tattempted to observe game:\t\"" << 
(*g)->name() << "\" ("
                                << game_id << ") which doesn't allow 
observers.\n";
-                       send_doc(leave_game_doc, sock, "command");
+                       send_doc(leave_game_doc, sock);
                        lobby_.send_server_message("Attempt to observe a game 
that doesn't allow observers.", sock);
-                       send_doc(games_and_users_list_, sock, "lobby_list");
+                       send_doc(games_and_users_list_, sock);
                        return;
                } else if (!(*g)->level_init()) {
                        WRN_SERVER << network::ip_address(sock) << "\t" << 
pl->second.name()
                                << "\tattempted to join uninitialized 
game:\t\"" << (*g)->name()
                                << "\" (" << game_id << ").\n";
-                       send_doc(leave_game_doc, sock, "command");
+                       send_doc(leave_game_doc, sock);
                        lobby_.send_server_message("Attempt to observe a game 
that doesn't allow observers.", sock);
-                       send_doc(games_and_users_list_, sock, "lobby_list");
+                       send_doc(games_and_users_list_, sock);
                        return;
                }
                LOG_SERVER << network::ip_address(sock) << "\t" << 
pl->second.name()
@@ -1669,7 +1671,7 @@
        // Player requests update of lobby content,
        // for example when cancelling the create game dialog
        if (data.child("refresh_lobby")) {
-               send_doc(games_and_users_list_, sock, "lobby_list");
+               send_doc(games_and_users_list_, sock);
        }
 }
 
@@ -1930,7 +1932,7 @@
                        }
 
                        // Send the player who has quit the gamelist.
-                       send_doc(games_and_users_list_, sock, "lobby_list");
+                       send_doc(games_and_users_list_, sock);
                }
                return;
        // If this is data describing side changes by the host.
@@ -1983,7 +1985,7 @@
                                update_game_in_lobby(g, user);
                        }
                        // Send the removed user the lobby game list.
-                       send_doc(games_and_users_list_, user, "lobby_list");
+                       send_doc(games_and_users_list_, user);
                        // FIXME: should also send a user diff to the lobby
                        //        to mark this player as available for others
                }


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to